web3.eth.getTransaction与getTransactionReceipt方法的区别
两个方法的核心定位差异
二者的设计目标从根源上不同,不存在替代关系:
web3.eth.getTransaction:查询交易本身的原始构造数据,只要节点接收到交易广播(无论交易是在内存池待打包、还是已经上链确认),都可以通过交易哈希查到对应数据。它不关注这笔交易最终是否被执行、执行成功还是失败。
该方法返回的字段主要包含:交易发送方地址、接收方地址、转账金额、用户设置的gas上限、gas价格、交易携带的calldata、交易nonce值、交易本身的哈希。如果交易未被打包进区块,返回结果中的区块号、区块哈希、交易索引字段值为null。web3.eth.getTransactionReceipt:查询交易被打包执行后的最终结果数据,只有当交易被确认打包进区块、且节点完整执行完交易的所有逻辑后,才会生成对应的回执数据。如果交易还在内存池待打包,这个方法会直接返回null,无有效查询内容。
这个方法的返回字段除了通用的区块号、区块哈希、交易哈希外,还包含getTransaction完全无法查询到的执行侧信息:- 交易执行实际消耗的gas总量(不是用户发交易时预估的gas上限值)
- 交易最终执行状态:
0x1代表执行成功,0x0代表执行回滚失败 - 交易执行过程中触发的所有链上事件日志(logs)
- 如果是部署新合约的交易,会返回部署成功后的合约地址
实操场景的使用差异
- 仅需要校验交易基础参数(比如核对接收方、转账金额、gas设置是否正确)时,用
getTransaction即可,不需要等待区块确认 - 需要判断交易是否最终上链、执行是否成功、读取交易触发的链上事件时,必须使用
getTransactionReceipt。这也是业务开发中最常用的轮询对象:常见踩坑点是交易刚发出就立刻查询receipt,因为交易还未打包所以会一直返回空,等待区块产出后才能拿到有效数据
针对web3.js v1.2.0版本,上述两个方法的行为完全匹配官方文档定义,不存在版本特有的逻辑偏差。
内容的提问来源于stack exchange,提问作者Anh Dũng Lê
相关产品推荐
相关产品推荐

