关于eth.getTransactionReceipt中root字段的一些疑问
发布于 3 个月前 作者 sky 553 次浏览 来自 以太坊

最近在尝试做一些以太坊的数据分析,但是发现trace交易的时候非常的慢,其实是把智能合约再运行一遍的过程,效率非常低下。 而且最后out of gas的交易也trace一遍就是完全浪费时间了,并且这些交易往往非常费时,想设定跳过失败的交易。 本来是想通过gasused=gaslimit的条件来筛选交易是否失败的,结果发现有些交易的gas付的刚刚好。。。OTL 然后看到eth.getTransactionReceipt的返回字段有status,0是失败1是成功,很高兴,结果发现了一个问题就是在大概四百万左右的区块高度之前的交易,没有这个字段,取而代之的是root字段 文档里写的有些模糊: 返回的结果对象中还包括下面二者之一 : root : DATA 32字节,后交易状态根(pre Byzantium) status: QUANTITY ,1 (成功) 或 0 (失败) 我想知道怎么样通过这个root后交易状态根来判断这笔交易是成功还是失败啊? 比如说这个交易

eth.getTransactionReceipt(“0x6afbe0f0ea3613edd6b84b71260836c03bddce81604f05c81a070cd671d3d765”) { blockHash: “0xb8a3f7f5cfc1748f91a684f20fe89031202cbadcd15078c49b85ec2a57f43853”, blockNumber: 4000000, contractAddress: null, cumulativeGasUsed: 4421928, from: “0x52bc44d5378309ee2abf1539bf71de1b7d7be3b5”, gasUsed: 39512, logs: [{ address: “0x209c4784ab1e8183cf58ca33cb740efbf3fc18ef”, blockHash: “0xb8a3f7f5cfc1748f91a684f20fe89031202cbadcd15078c49b85ec2a57f43853”, blockNumber: 4000000, data: “0x00000000000000000000000032be343b94f860124dc4fee278fdcbd38c102d88”, logIndex: 59, removed: false, topics: [“0x23919512b2162ddc59b67a65e3b03c419d4105366f7d4a632f5d3c3bee9b1cff”], transactionHash: “0x6afbe0f0ea3613edd6b84b71260836c03bddce81604f05c81a070cd671d3d765”, transactionIndex: 68 }, { address: “0x11b1f00bccf07754e6f1996864531fa162145cde”, blockHash: “0xb8a3f7f5cfc1748f91a684f20fe89031202cbadcd15078c49b85ec2a57f43853”, blockNumber: 4000000, data: “0x000000000000000000000000209c4784ab1e8183cf58ca33cb740efbf3fc18ef”, logIndex: 60, removed: false, topics: [“0x23919512b2162ddc59b67a65e3b03c419d4105366f7d4a632f5d3c3bee9b1cff”], transactionHash: “0x6afbe0f0ea3613edd6b84b71260836c03bddce81604f05c81a070cd671d3d765”, transactionIndex: 68 }], logsBloom: “0x00000000000000000000000000000002000000001000000000100000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000100000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000”, root: “0x0e39a8d429083c89f612d53e7961d99744805fbbf1c798bc5d2dcb9c89fcafce”, to: “0x11b1f00bccf07754e6f1996864531fa162145cde”, transactionHash: “0x6afbe0f0ea3613edd6b84b71260836c03bddce81604f05c81a070cd671d3d765”, transactionIndex: 68 }

通过这个root: "0x0e39a8d429083c89f612d53e7961d99744805fbbf1c798bc5d2dcb9c89fcafce"完全不知道从何下手啊

或者说除了debug.traceTransaction、还有整个traceBlock之外,有没有更加高效的获取链上历史数据情况的接口方法可以调用的? 求大神赐教(抱拳

2 回复

我翻了好久终于看到了相关的东西。。。https://github.com/ethereum/EIPs/pull/658/commits/378af99430be9fb57de201ec485c337f9d4d4dc3 status这个字段是拜占庭分叉加进去的,按照这个EIP的说法,root似乎只是之前一次升级迭代淘汰掉的字段TAT 现在重点是最后这个问题了,除了debug.traceTransaction、还有整个traceBlock之外,有没有更加高效的获取链上历史数据情况的接口方法可以调用的? 主要是eth的交易信息都还好直接能拉得到,token的交易信息全都在智能合约里,不debug.trace完全拿不到啊。。。

@sky 对于拜占庭分叉前的交易,好像没有什么特别好的办法判断交易是否成功。如果你是想追踪erc20的交易的话,建议你可以参考一些erc20的浏览器,有部分是开源的,比如

回到顶部