Рассмотрим следующую функцию из Solidity Contract:
function createProduct(uint _price, string memory _desc) public payable{
emit UserLedgerUpdated(_desc, -1*int(msg.value));
}
Я хочу, чтобы мое Dapp показывало простую бухгалтерскую книгу, подобную следующей:
Created Shoes priced at 100 Wei for a Total Cost of 2345 Wei
У меня есть два варианта:
Поймай UserLedgerUpdated
событие в Dapp
Используйте API etherscan для получения сведений о txn.
Мои вопросы:
а) Если я выберу вариант 2 (т.е. чтение сведений о txn), то я смогу избежать генерации событий. Поскольку события регистрируются и занимают место, они будут стоить газа и, следовательно, будут дороже, чем бесплатное чтение сведений о txn. Правильно ли я понимаю?
б) При чтении API ethscan я получаю входные данные для функции в шестнадцатеричном формате. Я могу использовать web3.toAscii
его для преобразования в строку, но обратите внимание, что первый аргумент функции на самом деле является числом. Следовательно, когда я конвертирую входные данные в Sample Transaction , я получаю {@Shoes
вместо 123Shoes
. Есть ли способ правильно преобразовать шестнадцатеричные данные, которые мы получаем из API ethrscan?
price
переменной, которая является числом, а не строкой, а 0x7B оказывается { в ascii. Что вы можете сделать, так это передать abi функции и данные tx в функцию web3.eth.abi.decodeParameters
после удаления сигнатуры функции (первые 4 байта после 0x). Это вернет декодированные данные.
Амарш
Лики Крус