如何获取交易结果和状态

2024-03-16

我正在尝试使用以太坊区块链和 Solidity 合约。 我目前正在部署合约并对其执行一些操作,但我想知道如何获取特定交易的一些“反馈/回调/返回”。

例如,有没有办法将事务的状态设置为 0(错误)并仍然获取事件?

if (id.length <= 0) {
    emit Result("KO", "1");
    revert();
} 

这不起作用(无事件),因为我恢复了所有内容,但状态将设置为 0

if (id.length <= 0) {
    emit Result("KO", "1");
    return;
} 

我会收到一些事件,但状态将保持 1

if (id.length <= 0) {
    revert("KO_1");
} 

状态将为 0,但我不会有任何事件

这是我执行该操作的代码:

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)
        }
    }
}

If id.length > 0, 都好。 但如果id.length <= 0,我没有收到来自subscribeToContract功能。

有没有办法直接获得结果状态,或者应该循环使用tx, err := client.TransactionReceipt(context.Background(), txHash)直到我获得状态?


我没有找到任何方法来订阅交易的特定状态更改,但有一个解决方法:
The go-ethereum包提供2个功能SubscribeFilterLogs and 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成功)。

不确定这是否是最差、最好、唯一的方法,但它确实有效!请随意改进此解决方案!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何获取交易结果和状态 的相关文章

随机推荐

  • brew 安装 libusb 链接失败

    我正在安装libusb with brew在我的 Mac 中 酿造安装libusb 链接步骤失败 如下所示 Error The brew link step did not complete successfully The formula
  • API 级别低于 9 的 android:filterTouchesWhenObscured 的类似物

    从 API 级别 9 开始 有android filterTouchesWhenObscured属性及对应setFilterTouchesWhenObscured方法上ViewGroup 例如 当视图有onClickListener设置并且
  • 从 XMLHttpRequest 中删除 HTTP 标头

    我正在开发一个 ajax 长轮询类型应用程序 我想最大限度地减少我使用的带宽量 目前最大的成本之一是客户端 HTTP 标头 一旦我建立了连接并在客户端上存储了会话 ID 我真的不想再浪费任何带宽来传输冗余的 http 信息 例如浏览器类型
  • 使用Java根据数据库中的最大ID生成下一个ID

    我正在开发一个网络应用程序 它将有多个用户 我使用mysql作为数据库 在我的应用程序中 我正在获取最新的id from the database using max id 然后为新注册生成下一个 id 这种方法是不正确的 因为 id 可能
  • Groupby 与 min 结合,同时保留整个数据帧[重复]

    这个问题在这里已经有答案了 我想结合 groupby 和 min 但保留整个数据框 如果我使用下面的方法 我最终只会得到 2 列 即 col1 和 col2 对于这个 df col1 col2 col3 1 1 A 1 0 B 2 2 C
  • 导入 BitTorrent Bencode 模块

    我使用的是 Mac OS X 10 6 Python 是 2 6 1 我已经安装了 Bencode 模块 sudo easy install BitTorrent bencode 它出现在站点包中 Library Python 2 6 si
  • 如何有效地将体素空间聚类成尽可能少的相似、连续的块?

    我正在研究使用体素来表示大型 256x256x256 体素 战场以及服务器托管的多人游戏的可破坏地形的可行性 任何游戏一次只存在一个战场 然而 为了能够广播房间及其地形的变化 我试图找到一种算法 可以将体素分组为尽可能少的矩形块 举一个简单
  • 拖动 UITableView

    我正在开发一个 iPhone 应用程序 我想将表格视图 而不是单元格 拖动到屏幕中的某个点 我的桌面视图位于屏幕的下半部分 图像位于屏幕的上半部分 当我滚动表格查看下面的行时 表格实际上应该向上移动到图像上方 y pos 减小 高度会增加
  • 如何编写一个仅解析标签之间具有特定文本的对象的 BeautifulSoup 过滤器?

    我正在使用 Django 和 Python 3 7 我想要更有效的解析 所以我正在阅读有关 SoupStrainer 对象的内容 我创建了一个自定义的来帮助我仅解析我需要的元素 def my custom strainer self ele
  • 网站单元测试

    我很好奇其他开发人员如何测试他们的网站 PHP 特别是在我的例子中 但这可能跨越多种语言 我已经在一个网站上工作了一年多了 我真的很想自动化我在版本之间所做的大量回归测试 这个特定站点位于 CodeIgniter 中 因此我对我的模型进行了
  • 当类未实现 IEnumerable 时,GetEnumerator 方法是否仍应具有幂等性

    这个问题是另一个问题的基础question https stackoverflow com questions 4189581 should an ienumerable iterator on a queue dequeue an ite
  • 带 onClick 的按钮在 React 中只能工作一次

    我需要在 React 应用程序中制作折叠菜单 但带有 onClick 的按钮只能工作一次 我创建了一个布尔变量 当我点击按钮时它应该会改变 但我只能点击按钮一次 此后 a 不起作用 它处于非活动状态 let isOpened false c
  • 将指针容器转换为智能指针?

    有没有一种简洁 通用的方法来转换std容器 例如vector 常规 哑指针 vector lt T gt 例如 boost shared ptr vector lt boost shared ptr
  • 清除向量或定义新向量,哪个更快

    哪种方法更快并且开销更少 方法一 void foo std vector lt int gt aVector for int i 0 i lt 1000000 i aVector clear aVector push back i 方法二
  • 使用iOS SDK在运行时创建plist?

    我是 iPhone 开发新手 我想知道是否有任何示例 Objective C 代码可以通过从网络服务器获取数据来在运行时创建 plist 并且我想知道数据的格式应该是什么 以便我可以在运行时轻松创建 plist 非常简单NS词典 http
  • 如何在 python 中使用 numba.jit 将计算值传递到列表排序?

    我正在尝试使用 Python 中的 numba jit 函数中的自定义键对列表进行排序 简单的自定义键可以工作 例如我知道我可以使用如下所示的绝对值进行排序 import numba numba jit nopython True def
  • 查找 Elixir/Erlang 内存文件的长度?

    在 Elixir 或 Erlang 中 如果我有一个内存文件 如何找到它的字节长度 ok fd file open ram read write file write fd hello 不确定是否有更好的方法 但这就是我所做的 def ge
  • 如何迭代命令行上传递的所有文件行?

    我通常在 Perl 中这样做 随便 pl while lt gt do whatever then cat foo txt whatever pl 现在 我想用 Python 来做这件事 我试过sys stdin但我不知道如何像我在 Per
  • iOS - Path 等应用程序如何优化每个单元格(几乎)不同的表格单元格?

    这就是我目前遇到的问题 我有一个应用程序 可以使用 UITableView 显示类似 Facebook Path 的提要 假设我的数据源有大约 200 个项目 并且并非所有单元格都具有相同的内容和单元格高度 有些有图像 有些没有 通过使用以
  • 如何获取交易结果和状态

    我正在尝试使用以太坊区块链和 Solidity 合约 我目前正在部署合约并对其执行一些操作 但我想知道如何获取特定交易的一些 反馈 回调 返回 例如 有没有办法将事务的状态设置为 0 错误 并仍然获取事件 if id length lt 0