blockchain - 如何在 web3 中使用 transactionHash 从以太坊交易中读取信息?
问题描述
假设我在智能合约中更新了一个变量 x as(x=10)。我存储了事务哈希。然后我再次更改了 x=20 的值,然后我将获得一个新的事务哈希。那么有什么方法可以使用较早更新(x = 10)的transactionHash,我可以看到它的x值是多少?
解决方案
有点晚了,但也许我的回答会帮助其他人在这个问题上挣扎。
当您通过智能合约函数调用进行交易时,输入参数与函数选择器一起被 ABI.encoded 编码到交易数据中,该函数选择器是函数签名哈希的前 4 个字节。
例如,调用function set(string memory str)
withstr = 'hello'
将产生以下交易数据:
0x4ed3885e0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000568656c6c6f000000000000000000000000000000000000000000000000000000
函数选择器在哪里4ed3885e
,其余的是编码的输入参数。
据我所知,有两种方法可以从交易数据中解码输入参数。
- 一个输入参数使用 web3 的decode 参数,或者多个decode 参数
- 使用ConsenSys 的外部库abi-decoder,使工作更容易。
我将粘贴一个使用这两种方法解码 4 个输入参数的示例。
Web3 示例:
var Web3 = require('web3');
var web3 = new Web3(new Web3.providers.HttpProvider('https...')); // your web3 provider
var transaction = '0xe7ad9ce53fd1d1559dc6ca57e67ed5c8cd612b6264ddc4f78b0736ad24a5bc29';
web3.eth.getTransaction(transaction, function(err, tx){
let tx_data = tx.input;
let input_data = '0x' + tx_data.slice(10); // get only data without function selector
let params = web3.eth.abi.decodeParameters(['bytes32', 'string', 'string', 'string'], input_data);
console.log(params);
});
Abi 解码器示例:
var Web3 = require('web3');
var web3 = new Web3(new Web3.providers.HttpProvider('https...')); // your web3 provider
var abiDecoder = require('abi-decoder');
var ABI = ... ; // abi of your contract
var transaction = '0xe7ad9ce53fd1d1559dc6ca57e67ed5c8cd612b6264ddc4f78b0736ad24a5bc29';
web3.eth.getTransaction(transaction, function(err, tx){
abiDecoder.addABI(ABI);
let tx_data = tx.input;
let decoded_data = abiDecoder.decodeMethod(tx_data);
let params = decoded_data.params;
let param_values = [];
for(i in params){ // loop to print parameters without unnecessary info
param_values.push(params[i].name + " : " + params[i].value);
}
console.log(param_values);
});
推荐阅读
- reactjs - 如何在 React 中使用 onClick 将值从一个组件传递到另一个组件
- jhipster - 在 JHipster JDL 中使用 Vuejs 蓝图
- python - 比较列表python中的每个元素
- python - 单元测试 apache 梁作业
- kotlin - 无法反序列化 `java.util.ArrayList 的实例
` 超出 START_OBJECT 令牌 Vert.x - c - 主/函数中的指针有区别吗
- javascript - 如何在 JavaScript 文件中允许空格?
- java - java旋转问题中的手动鼠标光线拾取光线计算
- python - 创建尊重不同规则的结构字段
- javascript - 从父组件的 for 循环传递数据时,Watcher 不起作用