Blockchain 如何在web3中使用transactionHash从以太坊事务读取信息?

Blockchain 如何在web3中使用transactionHash从以太坊事务读取信息?,blockchain,ethereum,smartcontracts,web3,web3js,Blockchain,Ethereum,Smartcontracts,Web3,Web3js,假设我在智能合约中更新了变量x asx=10。我存储了transactionHash。然后我再次更改了x=20的值,然后我将得到一个新的事务哈希。那么,是否有任何方法可以使用早期更新x=10的transactionHash来查看x的值?有两种方法可以从智能合约中获取输出 您可以使用智能合约ABI和调用直接读取状态 事务包含可以从事务日志中解析的内容 对于这两种情况,都必须将支持写入智能合约,在这个问题中,智能合约代码本身缺失,因此无法确切说明如何执行此操作。有两种方法可以从智能合约获取输出 您可

假设我在智能合约中更新了变量x asx=10。我存储了transactionHash。然后我再次更改了x=20的值,然后我将得到一个新的事务哈希。那么,是否有任何方法可以使用早期更新x=10的transactionHash来查看x的值?

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

您可以使用智能合约ABI和调用直接读取状态

事务包含可以从事务日志中解析的内容


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

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

您可以使用智能合约ABI和调用直接读取状态

事务包含可以从事务日志中解析的内容


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

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

您可以使用智能合约ABI和调用直接读取状态

事务包含可以从事务日志中解析的内容

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


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

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

您可以使用智能合约ABI和调用直接读取状态

事务包含可以从事务日志中解析的内容

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


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

虽然有点晚,但我的回答可能会帮助其他人解决这个问题

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

例如,使用str='hello'调用函数setstring memory str将产生以下事务数据:

0x4ED3885E0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000

其中4ed3885e为函数选择器,其余为编码的输入参数

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

对一个或多个输入参数使用web3 使用ConsenSys提供的外部库,使工作更轻松。 我将粘贴一个示例,使用这两种方法对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);
});

现在有点晚了,但也许我的回答会帮助其他人解决这个问题

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

例如,使用str='hello'调用函数setstring memory str将产生以下事务数据:

0x4ED3885E0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000

其中4ed3885e为函数选择器,其余为编码的输入参数

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

对一个或多个输入参数使用web3 使用ConsenSys提供的外部库,使工作更轻松。 我将粘贴一个示例,使用这两种方法对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);
});