如何在 web3 中使用 transactionHash 从以太坊交易中读取信息?
How to read information from ethereum transaction using transactionHash in web3?
假设我在智能合约中更新了一个变量 x as(x=10)。我存储了 transactionHash。然后我再次更改 x=20 的值,然后我将获得一个新的交易哈希。那么有什么方法可以使用较早更新的 transactionHash(x=10) 我可以通过它看到 x 的值是多少?
有两种方法可以从智能合约中获取输出
您直接使用智能合约 ABI 读取状态并调用
交易包含Solidity events,您可以从交易日志中解析
对于这两种情况,都必须将支持写入智能合约,而在这个问题中,智能合约代码本身丢失了,因此无法确切地说出该怎么做。
有两种方法可以从智能合约中获取输出
您直接使用智能合约ABI读取状态并调用
交易包含Solidity events,您可以从交易日志中解析
对于这两种情况,都必须将支持写入智能合约,而在这个问题中,智能合约代码本身丢失了,因此无法确切地说出该怎么做。
节点一般不支持读取历史状态。不过,它们支持读取历史事件日志,因此如果您需要随时间序列访问数据,则需要编写智能合约以使其发出事件。
有点晚了,但也许我的回答能帮助其他人解决这个问题。
当您通过智能合约函数调用进行交易时,输入参数 ABI.encoded 进入交易数据,连同 function selector,这是哈希的前 4 个字节函数签名。
例如,用str = 'hello'
调用function set(string memory str)
将产生以下交易数据:
0x4ed3885e0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000568656c6c6f000000000000000000000000000000000000000000000000000000
其中4ed3885e
为函数选择器,其余为编码后的输入参数
据我所知,有两种方法可以从交易数据中解码输入参数。
- 使用 web3 的 decode parameter for one input parameter, or decode parameters 更多
- 使用 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);
});
假设我在智能合约中更新了一个变量 x as(x=10)。我存储了 transactionHash。然后我再次更改 x=20 的值,然后我将获得一个新的交易哈希。那么有什么方法可以使用较早更新的 transactionHash(x=10) 我可以通过它看到 x 的值是多少?
有两种方法可以从智能合约中获取输出
您直接使用智能合约 ABI 读取状态并调用
交易包含Solidity events,您可以从交易日志中解析
对于这两种情况,都必须将支持写入智能合约,而在这个问题中,智能合约代码本身丢失了,因此无法确切地说出该怎么做。
有两种方法可以从智能合约中获取输出
您直接使用智能合约ABI读取状态并调用
交易包含Solidity events,您可以从交易日志中解析
对于这两种情况,都必须将支持写入智能合约,而在这个问题中,智能合约代码本身丢失了,因此无法确切地说出该怎么做。
节点一般不支持读取历史状态。不过,它们支持读取历史事件日志,因此如果您需要随时间序列访问数据,则需要编写智能合约以使其发出事件。
有点晚了,但也许我的回答能帮助其他人解决这个问题。
当您通过智能合约函数调用进行交易时,输入参数 ABI.encoded 进入交易数据,连同 function selector,这是哈希的前 4 个字节函数签名。
例如,用str = 'hello'
调用function set(string memory str)
将产生以下交易数据:
0x4ed3885e0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000568656c6c6f000000000000000000000000000000000000000000000000000000
其中4ed3885e
为函数选择器,其余为编码后的输入参数
据我所知,有两种方法可以从交易数据中解码输入参数。
- 使用 web3 的 decode parameter for one input parameter, or decode parameters 更多
- 使用 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);
});