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

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問(wèn)題,去搜搜看,總會(huì)有你想問(wèn)的

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

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

Go
慕田峪4524236 2023-07-31 17:08:18
我正在嘗試使用以太坊區(qū)塊鏈和 Solidity 合約。我目前正在部署合約并對(duì)其執(zhí)行一些操作,但我想知道如何獲取特定交易的一些“反饋/回調(diào)/返回”。例如,有沒(méi)有辦法將事務(wù)的狀態(tài)設(shè)置為 0(錯(cuò)誤)并仍然獲取事件?if (id.length <= 0) {    emit Result("KO", "1");    revert();} 這不起作用(無(wú)事件),因?yàn)槲一謴?fù)了所有內(nèi)容,但狀態(tài)將設(shè)置為 0if (id.length <= 0) {    emit Result("KO", "1");    return;} 我會(huì)收到一些事件,但狀態(tài)將保持 1if (id.length <= 0) {    revert("KO_1");} 狀態(tài)將為0,但我不會(huì)有任何事件這是我執(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,我沒(méi)有來(lái)自該subscribeToContract函數(shù)的回調(diào)。有沒(méi)有辦法直接獲得結(jié)果狀態(tài),或者應(yīng)該循環(huán)tx, err := client.TransactionReceipt(context.Background(), txHash)直到獲得狀態(tài)?
查看完整描述

2 回答

?
海綿寶寶撒

TA貢獻(xiàn)1809條經(jīng)驗(yàn) 獲得超8個(gè)贊

我沒(méi)有找到任何方法來(lái)訂閱事務(wù)的特定狀態(tài)更改,但有一個(gè)解決方法:
go-ethereum包提供了 2 個(gè)函數(shù)SubscribeFilterLogsSubscribeNewHead. 我們可以使用第一個(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)此解決方案!


查看完整回答
反對(duì) 回復(fù) 2023-07-31
?
呼啦一陣風(fēng)

TA貢獻(xiàn)1802條經(jīng)驗(yàn) 獲得超6個(gè)贊

更簡(jiǎn)單/更新的解決方案:

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

bind.WaitMined(context.Background(),?client,?signedTx)
查看完整回答
反對(duì) 回復(fù) 2023-07-31
  • 2 回答
  • 0 關(guān)注
  • 191 瀏覽
慕課專(zhuān)欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)