第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何獲取交易結果和狀態(tài)

如何獲取交易結果和狀態(tài)

Go
慕田峪4524236 2023-07-31 17:08:18
我正在嘗試使用以太坊區(qū)塊鏈和 Solidity 合約。我目前正在部署合約并對其執(zhí)行一些操作,但我想知道如何獲取特定交易的一些“反饋/回調/返回”。例如,有沒有辦法將事務的狀態(tài)設置為 0(錯誤)并仍然獲取事件?if (id.length <= 0) {    emit Result("KO", "1");    revert();} 這不起作用(無事件),因為我恢復了所有內容,但狀態(tài)將設置為 0if (id.length <= 0) {    emit Result("KO", "1");    return;} 我會收到一些事件,但狀態(tài)將保持 1if (id.length <= 0) {    revert("KO_1");} 狀態(tài)將為0,但我不會有任何事件這是我執(zhí)行該操作的代碼:func    testFunction(id []byte) {    //...    //...    tx, err := instance.Action(opt, id)    if (errors.HasError(err)) {        return    }    callbackValue := subscribeToContract(tx.Hash().Hex())    logs.Pretty(tx, callbackValue)    //...    //...}func    subscribeToContract(hashToRead string) myStruct {    query := ethereum.FilterQuery{        Addresses: []common.Address{address},    }    soc := make(chan types.Log)    sub, err := WssClient.SubscribeFilterLogs(context.Background(), query, soc)    if err != nil {        logs.Error(err)    }    for {        select {        case err := <-sub.Err():            logs.Info(`SOMETHING ERROR`)            logs.Error(err)        case vLog := <-soc:        logs.Info(`SOMETHING`)        contractAbi, _ := abi.JSON(strings.NewReader(string(SignABI)))          event := myStruct{}    contractAbi.Unpack(&event, "Result", vLog.Data)    logs.Info(`New Event from [` + vLog.TxHash.Hex() + `] : ` + event.Message)        }    }}如果id.length > 0,一切都好。但如果id.length <= 0,我沒有來自該subscribeToContract函數(shù)的回調。有沒有辦法直接獲得結果狀態(tài),或者應該循環(huán)tx, err := client.TransactionReceipt(context.Background(), txHash)直到獲得狀態(tài)?
查看完整描述

2 回答

?
海綿寶寶撒

TA貢獻1809條經(jīng)驗 獲得超8個贊

我沒有找到任何方法來訂閱事務的特定狀態(tài)更改,但有一個解決方法:
go-ethereum包提供了 2 個函數(shù)SubscribeFilterLogsSubscribeNewHead. 我們可以使用第一個來獲取日志(如果相關),第二個來獲取塊信息:

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成功)。


不確定這是否是最差、最好、唯一的方法,但它確實有效!請隨意改進此解決方案!


查看完整回答
反對 回復 2023-07-31
?
呼啦一陣風

TA貢獻1802條經(jīng)驗 獲得超6個贊

更簡單/更新的解決方案:

我認為waitMined函數(shù)就是您正在尋找的函數(shù)。

bind.WaitMined(context.Background(),?client,?signedTx)
查看完整回答
反對 回復 2023-07-31
  • 2 回答
  • 0 關注
  • 173 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網(wǎng)微信公眾號