我对以太坊中智能合约的版本有疑问。关于如何使逻辑和数据脱钩,在引用其他协定时如何使用接口,如何使用通用键值存储来存储数据以及如何以强类型的方式通过库函数进行检索的文章很多。
如何从旧版智能合约中查询交易和事件日志?事务和发出的事件无法迁移。他们是一成不变的。也许您需要在客户端应用程序中跟踪它们以获取历史记录。可以在不同的合同版本中添加,删除事件或更改其签名。您如何处理多个版本合同的交易输入和事件数据的查询和解码?
答案 0 :(得分:0)
Solidity中的每个事件在内部都由其签名的哈希表示。函数也由哈希表示。
let encodedFunctionSignature = web3.eth.abi.encodeFunctionSignature('sendMessage(string,address)');
console.log(encodedFunctionSignature);
// => 0xc48d6d5e
签名是函数签名字符串接管的keccak256哈希值的前32个字节,并删除了空格。
如果事件签名发生变化,则哈希值也会发生变化,您可以为事件区分不同的ABI。
然后,您只需要具有匹配版本的ABI文件,即可将事件解码为人类可读的符号形式。