Generate Receipt in Smart Contract
Характеристика
Receipt(квитанция) используется в качестве докательства или напоминания о возникновении определенных операций, типичное применение это запись о переводе от A к B с дополнительной записью.
Смарт-контракт может генерировать receipt(квитанцию) вызывая системную функцию blockchain.receipt
, предлагаемую инфраструктурой блокчейна.
Receipt(квитанция) хранится в данных блока, связанных с транзакцией, которая, конечно, будет подтверждена всеми узлами в сети блокчейна.
Помните, что receipt(квитанция) не может быть запрошена в рамках смарт-контракта, receipt (квитанцию) можно запросить только анализирую данные блока или
запрашивая receipt(квитанцию) по хешу транзакции через интерфейсы rpc(Remote Procedure Call - протокол удалённого вызова процедур).
Receipt(квитанция) намного дешевле, чем storage(хранилище) контракта. На нее затрачивается только газ, в отличии от storage(хранилища) контракта, на которое затрачивается и газ и ram(оперативная память).
Сгенерировать квитанцию
Смарт-контракт генерирует квитанцию, вызывая системную функцию blockchain.receipt
.
Ниже пример, где будут сгенерированы три квитанции при вызове функции receiptf данного контракта.
class Contract {
init() {
}
receiptf() {
blockchain.receipt(JSON.stringify(["from", "to", "100.01"]));
blockchain.receipt('{"name": "Cindy", "amount": 1000}');
blockchain.receipt("transfer accepted");
}
}
module.exports = Contract;
blockchain.receipt
принимает строковый параметр, который ссылается на содержимое квитанции и не имеет возвращаемых значений.
Ошибка выполнения будет выдана, если функция не выполнена успешно, что не должно происходить при нормальных обстоятельствах.
Мы настоятельно рекомендуем разработчикам использовать в качестве содержимого строку формата json, что удобно для последующего анализа.
Сгенерированная квитанция также содержит название контракта и название действия, указывающие, какой метод отвечает за квитанцию. Три квитанции, сгенерированные выше, будут выглядеть так:
# first
{"funcName":"ContractFhx828oUPYHRtkp9ABaBFHwm6S94eeeai1TD3FkTgLMz/receiptf", "content":"[\"from\",\"to\",\"100.01\"]"}
# second
{"funcName":"ContractFhx828oUPYHRtkp9ABaBFHwm6S94eeeai1TD3FkTgLMz/receiptf", "content":"{\"name\": \"Cindy\", \"amount\": 1000}"}
# third
{"funcName":"ContractFhx828oUPYHRtkp9ABaBFHwm6S94eeeai1TD3FkTgLMz/receiptf", "content":"transfer accepted"}
ContractFhx828oUPYHRtkp9ABaBFHwm6S94eeeai1TD3FkTgLM
это ID этого контракта.
Запрос квитанции
Запрос квитанции по хешу транзакции
Квитанция, сгенерированная конкретной транзакцией, может быть запрошена с помощью хеша этой транзакции через интерфейсы rpc.
Пожалуйста, обратитесь к /getTxReceiptByHash
Запрос квитанции по данным блока
Полные данные блока содержат все транзакции и соответствующие им квитанции, можно загрузить данные блока и проанализировать, чтобы получить все квитанции, сгенерированные в этом блоке.
Пожалуйста, обратитесь к /getBlockByHash и /getBlockByNumber
и установите complete
в параметрах запроса как true