2 回答

TA貢獻1809條經(jīng)驗 獲得超8個贊
我沒有找到任何方法來訂閱事務的特定狀態(tài)更改,但有一個解決方法:
該go-ethereum
包提供了 2 個函數(shù)SubscribeFilterLogs
和SubscribeNewHead
. 我們可以使用第一個來獲取日志(如果相關),第二個來獲取塊信息:
SubscribeNewHead 訂閱有關給定通道上當前區(qū)塊鏈頭的通知。
當開采區(qū)塊時,可以驗證或拒絕/恢復交易,因此我們可以使用這個“技巧”
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
}
}
}
}
基本上我們正在等待區(qū)塊被開采,然后如果交易尚未驗證/拒絕,我們會檢查TransactionReceipt失敗并出現(xiàn)錯誤( )。not found然后,如果有交易,我們可以取消訂閱并返回交易狀態(tài)(0失敗,1成功)。
不確定這是否是最差、最好、唯一的方法,但它確實有效!請隨意改進此解決方案!

TA貢獻1802條經(jīng)驗 獲得超6個贊
更簡單/更新的解決方案:
我認為waitMined函數(shù)就是您正在尋找的函數(shù)。
bind.WaitMined(context.Background(),?client,?signedTx)
- 2 回答
- 0 關注
- 173 瀏覽
添加回答
舉報