2 回答

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

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