当前位置: 首页 > 知识库问答 >
问题:

从Java应用程序(We3j)与智能合约交互

魏健柏
2023-03-14

我对与来自Java应用程序的智能合约交互的工作流(序列)有很多问题,因此我将首先解释我所做的,然后提出我的问题,如果我的理解有问题,请告诉我。

1-我写了智能合约2-使用truffle获取智能合约java包装器。(contract.java)3-使用testrpc测试合约

我有两个类:使用testrpc帐户(凭据)与智能合约交互并调用其函数

每个类(node1.java,node1.java)调用智能契约中一个名为(send)的函数来将它们的数据发送到链中。

我添加了一个事件,如果2个节点向那里发送了数据,就会触发该事件

我不明白的是,我怎么能让java代码(比如说主程序.class)总是检查那个事件。因为我需要检查两个节点是否都发送它们的数据,所以我将调用另一个函数来分析这些数据。

我如何管理,控制和检查哪些事务已经完成或未完成,我的意思是如何使用Java代码中的事件,让代码永远运行并检查此事件是否发生,执行操作。

希望我能解释清楚我需要什么

提前谢谢你。

共有1个答案

冷翼
2023-03-14

我对你前面一个问题的回答适用于这里。是的,您可能需要设置一个专用进程来侦听事件。但是,你不需要一个账户,甚至不需要成为智能合约的所有者或客户来监听公共区块链上的事件(这就是为什么它被认为是“公共的”)。

要侦听事件,您只需要合约 ABI 和合约地址。两者都应该很容易获得。您可以为此协定发出的所有事件设置侦听器。从 web3j 文档中:

您可以使用EthFilter类型来指定希望应用于过滤器的主题。这可以包括您希望应用筛选器的智能合同的地址。您还可以提供特定的主题进行筛选。其中,单个主题表示智能合约上的索引参数:

EthFilter filter = new EthFilter(DefaultBlockParameterName.EARLIEST,
        DefaultBlockParameterName.LATEST, <contract-address>)
             [.addSingleTopic(...) | .addOptionalTopics(..., ...) | ...];

然后可以使用与上述块和事务过滤器类似的语法创建此过滤器:

web3j.ethLogObservable(filter).subscribe(log -> {
    ...
});

指定块参数可让您决定要从历史上多早开始处理事件。请记住,在以太坊中,事件实际上是区块链上的日志。当您侦听事件时,您实际上是在日志中寻找活动,因为区块被添加到链中。因此,您可以随心所欲地追溯历史,并查看旧块以处理旧事件。

要收听合同中的所有事件,您只需:

EthFilter filter = new EthFilter(DefaultBlockParameterName.EARLIEST, DefaultBlockParameterName.LATEST, <CONTRACT_ADDRESS>);

web3.ethLogObservable(filter).subscribe(log -> System.out.println(log.toString());

关于带有ETHFILTER的约定地址的重要说明Web3j中对于< code>EthFilter中的约定地址有一个bug。API不喜欢协定地址中的前导“0x”。要解决这个问题,如果您正在使用契约对象,请使用< code > contract . getcontractaddress()发送契约地址。子串(2);

如果您对特定事件感兴趣,则需要向过滤器添加主题。下面的示例将侦听抛出的所有 MyEvent 事件,其中包含一个索引地址参数和两个非索引 uint256 参数:

Web3j web3j = Web3j.build(new HttpService());

Event event = new Event("MyEvent",
                        Arrays.<TypeReference<?>>asList(new TypeReference<Address>() {}),
                        Arrays.<TypeReference<?>>asList(new TypeReference<Uint256>() {}, new TypeReference<Uint256>() {}));

EthFilter filter = new EthFilter(DefaultBlockParameterName.EARLIEST, DefaultBlockParameterName.LATEST, <CONTRACT_ADDRESS>);

filter.addSingleTopic(EventEncoder.encode(event));

web3j.ethLogObservable(filter).subscribe(log -> System.out.println(log.toString()));

以上可以在任何服务器进程中运行。在服务器进程中,您可以通过本地节点(使用< code>new HttpService()时的默认localhost)连接到网络。或者,您可以注册Infura,创建一个API密钥,并使用它们的节点集群(示例Ropsten URL:< code > new HttpService(" https://Ropsten . in fura . io/

 类似资料:
  • 部署智能合约及与智能合约交互 如果你想避免使用智能合约的底层实现细节,web3j提供solidity的智能合约的封装包,使你能够通过web3j生成的包装对象直接与智能合约的所有方法进行交互。 另外,如果你希望发送常规交易或希望在与智能合约的交互中有更多的控制权,请参阅web3j教程:java使用web3j开发以太坊智能合约交易,这里讲到了创建智能合约,与智能合约进行交易,查询智能合约的状态等内容。

  • 与智能合约交易 要与现有的智能合约进行交易,需要提供以下属性: to:智能合同地址 value:在智能合约中你希望存放的以太币Ether量(如果智能合约接受以太币Ether的话) data: 已编码的函数选择器和自变量参数 web3j负责函数编码,有关实现的进一步细节,请参阅应用程序二进制接口部分Application Binary Interface。 Function function = n

  • 指导编写一个EOSIO的智能合约 模块 Account API 查询账户数据的API. Chain API 查询链内部状态的API. Database API 存储和检索EOS.IO区块链的数据API根据以下广泛结构来组织数据. Math API 定义常用的数学函数. Action API 定义用于查询操作属性的API. Memory API 定义常用的记忆功能. Console API 使应用程

  • 编程语言 使用golang作为编程语言(对部分关键字限制,以保证处理的有序性),而不是重新创造编程语言。 golang是一个简单、易用的编程语言,它有完善的帮助文档和开发工具。 它是强类型校验,编译阶段就能够校验发现很多bug。 它是模块化的,本系统能够简单屏蔽外部功能,使智能合约处在简单可预期的环境中。 已经有大量的golang开发人员,他们如果要开发智能合约,非常容易上手。 智能合约的分类 公

  • 我正在尝试使用去以太坊库通过移动设备(android)与智能合约进行交互。 Android系统 合同 预期行为 在林克比区块链号上与部署的智能合同成功互动。 实际行为 对于 setter(在合同上):'abi:不能使用切片作为类型字符串作为参数' 对于 getter(在合约上):'abi:无法在 []接口 {}中取消使用字符串 复制行为的步骤 1.)通过手机连接到Rinkeby测试网 2.)通过手

  • 介绍 EOSIO 智能合约 编写智能合约需要的必备技能 C / C++ 相关 基于 EOSIO 的块链使用的是 WebAssembly(http://webassembly.org/) (WASM) 来执行用户编写的智能合约。WASM 是一种新兴的 Web 标准,广泛支持于谷歌、微软、苹果等。对编写 WASM 标准的智能合约来说使用 clang/llvm(https://clang.llvm.or