如何在web3中使用transactionHash从以太坊交易中读取信息?

San*_*kar 3 blockchain ethereum smartcontracts web3js

假设我已将智能合约内的变量 x 更新为(x=10)。我存储了 transactionHash。然后我再次更改 x=20 的值,然后我将得到一个新的交易哈希。那么有没有什么方法可以使用之前更新的 transactionHash(x=10) 来查看 x 的值?

小智 7

虽然有点晚了,但也许我的回答会帮助其他为此苦苦挣扎的人。

当您通过智能合约函数调用进行交易时,输入参数以及函数选择器(函数签名哈希值的前 4 个字节)会被 ABI 编码到交易数据中。

例如,调用function set(string memory str)withstr = 'hello'将得到以下交易数据:

0x4ed3885e0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000568656c6c6f000000000000000000000000000000000000000000000000000000

其中4ed3885e是函数选择器,剩下的是编码后的输入参数。

据我所知,有两种方法可以从交易数据中解码输入参数。

我将粘贴一个使用这两种方法解码 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);
});
Run Code Online (Sandbox Code Playgroud)

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);
});
Run Code Online (Sandbox Code Playgroud)