我想从事务哈希中检索以下信息:
我已经为这笔交易转了一些钱。现在我想从我的tx散列中检索上面的信息。
这就是我正在做的事情(使用ethers.js):
let blockchain = await Blockchain.findBy('network', 'xdai')
let defaultProvider = await Ethers.getDefaultProvider(blockchain)
let tx = await defaultProvider.getTransaction("0x5f1ac5db6c0c31025ac19f6de22eef665e57262f9953567438827b339828e1a8")
let txReceipt = await defaultProvider.getTransactionReceipt("0x5f1ac5db6c0c31025ac19f6de22eef665e57262f9953567438827b339828e1a8")结果:
{
"tx": {
"hash": "0x5f1ac5db6c0c31025ac19f6de22eef665e57262f9953567438827b339828e1a8",
"blockHash": "0x4023d17a5469c9dfb13bf50a63ce40d90b07a4b8e811fdba25b063ad535ba3f2",
"blockNumber": 21105871,
"transactionIndex": 4,
"confirmations": 151,
"from": "0x52eB606f94091A2BA4f985D98C62880a9BA591B6",
"gasPrice": {
"type": "BigNumber",
"hex": "0x59682f07"
},
"gasLimit": {
"type": "BigNumber",
"hex": "0x01630f"
},
"to": "0x6A023CCd1ff6F2045C3309768eAd9E68F978f6e1",
"value": {
"type": "BigNumber",
"hex": "0x00"
},
"nonce": 937,
"data": "0xa9059cbb000000000000000000000000fce3c3d51c7f3cc8c0f380be844e7cbad14c1c1d00000000000000000000000000000000000000000000000000027ca57357c000",
"r": "0xa3ff01c0dcc17cfccf595fefe23468b80727e58003f364f793f6c8ed38da63b4",
"s": "0x4a709844959b5858607b555a8ec66f90c76c00f10de44386ff80990737d126dd",
"v": 1,
"creates": null,
"chainId": 100
},
"txReceipt": {
"to": "0x6A023CCd1ff6F2045C3309768eAd9E68F978f6e1",
"from": "0x52eB606f94091A2BA4f985D98C62880a9BA591B6",
"contractAddress": null,
"transactionIndex": 4,
"gasUsed": {
"type": "BigNumber",
"hex": "0xead8"
},
"logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000800000000000000000008000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000008000000000000000000000000000000000008000000000000000000010000000000000000000000000000000000000000000000044000002000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
"blockHash": "0x4023d17a5469c9dfb13bf50a63ce40d90b07a4b8e811fdba25b063ad535ba3f2",
"transactionHash": "0x5f1ac5db6c0c31025ac19f6de22eef665e57262f9953567438827b339828e1a8",
"logs": [
{
"transactionIndex": 4,
"blockNumber": 21105871,
"transactionHash": "0x5f1ac5db6c0c31025ac19f6de22eef665e57262f9953567438827b339828e1a8",
"address": "0x6A023CCd1ff6F2045C3309768eAd9E68F978f6e1",
"topics": [
"0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef",
"0x00000000000000000000000052eb606f94091a2ba4f985d98c62880a9ba591b6",
"0x000000000000000000000000fce3c3d51c7f3cc8c0f380be844e7cbad14c1c1d"
],
"data": "0x00000000000000000000000000000000000000000000000000027ca57357c000",
"logIndex": 21,
"blockHash": "0x4023d17a5469c9dfb13bf50a63ce40d90b07a4b8e811fdba25b063ad535ba3f2"
}
],
"blockNumber": 21105871,
"confirmations": 151,
"cumulativeGasUsed": {
"type": "BigNumber",
"hex": "0x168b7f"
},
"status": 1,
"byzantium": true
}
}在交易收据中,我可以在这里看到以下数据:
"logs": [
{
"transactionIndex": 4,
"blockNumber": 21105871,
"transactionHash": "0x5f1ac5db6c0c31025ac19f6de22eef665e57262f9953567438827b339828e1a8",
"address": "0x6A023CCd1ff6F2045C3309768eAd9E68F978f6e1",
"topics": [
"0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef",
"0x00000000000000000000000052eb606f94091a2ba4f985d98c62880a9ba591b6",
"0x000000000000000000000000fce3c3d51c7f3cc8c0f380be844e7cbad14c1c1d"
],
"data": "0x00000000000000000000000000000000000000000000000000027ca57357c000",
"logIndex": 21,
"blockHash": "0x4023d17a5469c9dfb13bf50a63ce40d90b07a4b8e811fdba25b063ad535ba3f2"
}
],但是如何找到我需要的信息(这些信息也显示在浏览器上)。
我想知道哪种货币被转移了多少钱。
发布于 2022-03-14 15:04:04
你可以从日志里读到。
在这里可以找到一篇解释如何使用事件的好文章,https://betterprogramming.pub/learn-solidity-events-2801d6a99a92。
要知道“货币”或令牌,您可以阅读被调用的智能契约。交易的'to‘、'from’和'amount‘在日志中。活动的主题(请参考上面的文章),金额在数据中。
要检查已调用的函数,您可以从事务的数据中读取。它的前4个字节(a9059cbb)是函数的签名。例如,您可以检查签名是否是“transfer”的签名。
发布于 2022-03-14 15:11:09
您可以按主题过滤tx收据中的日志。有点像
const erc20TransferEventHash = keccak256("Transfer(address,uint256");
const erc20Transfers = [];
const logs = txReceipt.logs.filter((log) => {
if (log.topics[0] === erc20TranferEventHash) {
const trasferredFrom = log.topics[1];
const transferredTo = log.topics[2];
const amountTrasferred = log.data;
const token = log.address;
erc20Transfers.push({token, amount: amountTransferred, to: transferredTo, from: transferredFrom});
}
})然而,所有这些都要求您确切地知道事件签名是什么,什么是索引的,什么不是,等等,这样您就知道如何对它们进行解码,以及使用哪些主题来实现什么。
您也不能像前面的示例那样单独执行所有这些过滤操作,而是将etc_subscribe与相关筛选器一起使用,这样您就只能直接获得传输事件。查找更多关于日志和事件的信息。
https://ethereum.stackexchange.com/questions/123811
复制相似问题