2 回答
TA贡献1809条经验 获得超8个赞
我没有找到任何方法来订阅事务的特定状态更改,但有一个解决方法:
该go-ethereum
包提供了 2 个函数SubscribeFilterLogs
和SubscribeNewHead
. 我们可以使用第一个来获取日志(如果相关),第二个来获取块信息:
SubscribeNewHead 订阅有关给定通道上当前区块链头的通知。
当开采区块时,可以验证或拒绝/恢复交易,因此我们可以使用这个“技巧”
func checkTransactionReceipt(_txHash string) int {
client, _ := getClient("https://ropsten.infura.io/v3/XXXXXX")
txHash := common.HexToHash(_txHash)
tx, err := client.TransactionReceipt(context.Background(), txHash)
if (Error.HasError(err)) {
return (-1)
}
return (int(tx.Status))
}
func WaitForBlockCompletation(data EthData, hashToRead string) int {
soc := make(chan *types.Header)
sub, err := data.WssClient.SubscribeNewHead(context.Background(), soc)
if (err != nil) {
return -1
}
for {
select {
case err := <-sub.Err():
_ = err
return -1
case header := <-soc:
logs.Info(header.TxHash.Hex())
transactionStatus := checkTransactionReceipt(hashToRead)
if (transactionStatus == 0) {
//FAILURE
sub.Unsubscribe()
return 0
} else if (transactionStatus == 1) {
//SUCCESS
sub.Unsubscribe()
return 1
}
}
}
}
基本上我们正在等待区块被开采,然后如果交易尚未验证/拒绝,我们会检查TransactionReceipt失败并出现错误( )。not found然后,如果有交易,我们可以取消订阅并返回交易状态(0失败,1成功)。
不确定这是否是最差、最好、唯一的方法,但它确实有效!请随意改进此解决方案!
TA贡献1802条经验 获得超6个赞
更简单/更新的解决方案:
我认为waitMined函数就是您正在寻找的函数。
bind.WaitMined(context.Background(), client, signedTx)
- 2 回答
- 0 关注
- 131 浏览
添加回答
举报