【问题标题】:How to read information from ethereum transaction using transactionHash in web3?如何在 web3 中使用 transactionHash 从以太坊交易中读取信息?
【发布时间】:2020-07-23 02:29:20
【问题描述】:

假设我在智能合约中更新了一个变量 x as(x=10)。我存储了事务哈希。然后我再次更改了 x=20 的值,然后我将获得一个新的事务哈希。那么有什么方法可以使用之前更新的 transactionHash(x=10) 来查看 x 的值是多少?

【问题讨论】:

    标签: blockchain ethereum smartcontracts web3 web3js


    【解决方案1】:

    有点晚了,但也许我的回答会帮助其他人在这个问题上挣扎。

    当您通过智能合约函数调用进行交易时,输入参数与function selector(函数签名哈希的前 4 个字节)一起被 ABI.encoded 编码到交易数据中。

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

    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);
    });
    

    Abi-decoder 示例:

    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);
    });
    

    【讨论】:

      【解决方案2】:

      有两种方法可以从智能合约中获取输出

      • 你直接使用智能合约ABI读取状态并调用

      • 事务包含Solidity events,您可以从事务日志中解析它

      对于这两种情况,都必须将支持写入智能合约,而在这个问题中,智能合约代码本身缺失,因此无法准确说明如何执行。

      一般情况下,节点不支持读取历史状态。不过它们支持读取历史事件日志,因此如果您需要访问时间序列中的数据,那么您需要编写智能合约以便它发出事件。

      【讨论】:

        【解决方案3】:

        有两种方法可以从智能合约中获取输出

        • 你直接使用智能合约ABI读取状态并调用

        • 事务包含Solidity events,您可以从事务日志中解析它

        对于这两种情况,都必须将支持写入智能合约,而在这个问题中,智能合约代码本身缺失,因此无法准确说明如何进行。

        【讨论】:

          猜你喜欢
          • 2021-10-02
          • 2022-07-19
          • 2022-11-11
          • 2018-10-22
          • 2020-11-01
          • 2018-11-04
          • 1970-01-01
          • 1970-01-01
          • 2021-09-29
          相关资源
          最近更新 更多