web3j发送异步交易时不能解析方法`executeTransactionAsync`?
我正试图用web3j库发送一个交易到以太坊区块链,得到一个错误,我必须用异步发送它。当用异步发送它时,会得到一个函数不存在的错误。我使用的是Android Studio、Java和web3j库。
当我调用web3.abi.datatypes.Function
的executeTransactionAsync
方法时,我得到以一个错误提示说web3j库中没有这个方法executeTransactionAsync
。但是官方文件又说可以使用这个方法,我看的web3j文档是3.1.1版的。
如果删掉异步的方式使用executeTransaction
发送的话,又会提示我交易需要异步发送。
我有什么办法把这个交易发送出去吗?也许我的web3j代码写错了:
public TransactionReceipt approve() throws IOException, TransactionException { Function function = new Function("approve", Arrays.<Type>asList(), Collections.<TypeReference<?>>emptyList()); return executeTransactionAsync (function); }
问题的解决
你需要使用executeTransaction
封装包中的RemoteCall
:
Function function = new Function(...); RemoteCall<TransactionReceipt> remoteCall = new RemoteCall(() -> { //call to executeTransaction }); TransactionReceipt receipt = remoteCall.send();
你可以通过使用web3j的代码生成工具为你的以太坊智能合约创建简单的封装包,从而使你的开发更轻松。有关如何生成代码的Web3J文档的这一部分。通过生成的类处理远程调用(以及对constant
函数的本地调用)。你的客户端代码变得类似:
Web3j web3j = Web3j.build(new HttpService()); Credentials credentials = Credentials.create(<YOUR_PRIVATE_KEY>); SimpleContract contract = SimpleContract.load(<CONTRACT_ADDRESS>, web3j, credentials, BigInteger.valueOf(<GAS_PRICE>), BigInteger.valueOf(<GAS_LIMIT)); RemoteCall<TransactionReceipt> remoteCall = contract.setValue(BigInteger.valueOf(5)); // Call to smart contract setValue(5) TransactionReceipt receipt = remoteCall.send();
添加代码生成的示例
$ solc --version solc, the solidity compiler commandline interface Version: 0.4.19+commit.c4cbbb05.Windows.msvc $ java -version java version "1.8.0_144" Java(TM) SE Runtime Environment (build 1.8.0_144-b01) Java HotSpot(TM) 64-Bit Server VM (build 25.144-b01, mixed mode) $ solc contracts/SimpleContract.sol --bin --abi --optimize -o build/ $ web3j.bat solidity generate build/SimpleContract.bin build/SimpleContract.abi -o ./src -p mypackage _ _____ _ _ | | |____ (_) (_) __ _____| |__ / /_ _ ___ \ \ /\ / / _ \ '_ \ \ \ | | | / _ \ \ V V / __/ |_) |.___/ / | _ | || (_) | \_/\_/ \___|_.__/ \____/| |(_)|_| \___/ _/ | |__/ Generating mypackage.SimpleContract ... File written to .\src
原文《以太坊常见问题和错误》中的:
http://cw.hubwiz.com/card/c/ethereum-FAQ/1/2/8/
另外推荐几个很受欢迎全网稀缺的互动教程:
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
如何升级或者更新智能合约?
如果合约发送方想要有一种方法来升级智能合约代码,以便账户数据和其他东西接通,可以有什么办法吗?可以在不改变合约地址的情况下进行,还是总是需要新的地址? 是否存在annex机制,在不需要重写的情况下向智能合约中添加一些新的功能? 问题解答 一旦合约已经部署在区块链中,它就是最终版了并不能再被改变。当然,可以通过允许原始代码改变某些参数,来做些改变。 更新合约的一种方法是使用版本控制系统。例如,你可以有一个入口通道合约,它将所有调用转发到合同的最新版本,由可更新的地址参数定义。你还可以使用名称注册表,并将其更新为指向最近的合约版本。 另一种方法是将逻辑代码放在库中,然后使用CALLCODE特性,通过Solidity中的库调用位于指定的、可更新的地址的代码。这样,用户数据在版本之间仍然存在。但这也就限制了逻辑合约的ABI必须保持不变。 官方说法: 从Homestead release发布开始,有一个DELEGATECALL操作码。这基本上允许你向前调用一个单独的合约,同时保持msg.sender和所有存储。 例如,你可以拥有一个保持相同地址和存储的合同,但将所有调用转发到存储在变量中的地址:...
- 下一篇
MySQL 高可用:mysql+mycat实现数据库分片(分库分表)
MySQL 高可用:mysql+mycat实现数据库分片(分库分表) 什么是MYCAT: 一个彻底开源的,面向企业应用开发的大数据库集群 支持事务、ACID、可以替代MySQL的加强版数据库 一个可以视为MySQL集群的企业级数据库,用来替代昂贵的Oracle集群 一个融合内存缓存技术、NoSQL技术、HDFS大数据的新型SQL Server 结合传统数据库和新型分布式数据仓库的新一代企业级数据库产品 一个新颖的数据库中间件产品 Mycat关键特性 : 支持SQL92标准 遵守Mysql原生协议,跨语言,跨平台,跨数据库的通用中间件代理。 基于心跳的自动故障切换,支持读写分离,支持MySQL主从,以及galera cluster集群。 支持Galera for MySQL集群,Percona Cluster或者MariaDB cluster 基于Nio实现,有效管理线程,高并发问题。 支持数据的多片自动路由与聚合,支持sum,count,max等常用的聚合函数,支持跨库分页。 支持单库内部任意join,支持跨库2表join,甚至基于caltlet的多表join。 支持通过全局表,ER关...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- SpringBoot2整合Redis,开启缓存,提高访问速度
- SpringBoot2配置默认Tomcat设置,开启更多高级功能
- CentOS7,8上快速安装Gitea,搭建Git服务器
- CentOS关闭SELinux安全模块
- CentOS8安装Docker,最新的服务器搭配容器使用
- Eclipse初始化配置,告别卡顿、闪退、编译时间过长
- Jdk安装(Linux,MacOS,Windows),包含三大操作系统的最全安装
- CentOS6,CentOS7官方镜像安装Oracle11G
- CentOS8,CentOS7,CentOS6编译安装Redis5.0.7
- CentOS6,7,8上安装Nginx,支持https2.0的开启