java类库web3j开发以太坊智能合约快速入门
web3j简介
web3j是一个轻量级、高度模块化、响应式、类型安全的Java和Android类库提供丰富API,用于处理以太坊智能合约及与以太坊网络上的客户端(节点)进行集成。
可以通过它进行以太坊区块链的开发,而无需为你的java应用平台编写集成代码。
快速启动
想要快速启动的话,有一个Web3j demo示例项目可用,演示了通过Web3j开发以太坊的许多核心特征,其中包括:
- 连接到以太网网络上的节点
- 加载一个以太坊钱包文件
- 将以太币从一个地址发送到另一个地址
- 向网络部署智能合约
- 从部署的智能合约中读取值
- 更新部署的智能合约中的值
- 查看由智能合约记录的事件
web3j入门
首先将最新版本的web3j安装到项目中。
Maven
Java 8:
<dependency> <groupId>org.web3j</groupId> <artifactId>core</artifactId> <version>3.4.0</version> </dependency>
Android:
<dependency> <groupId>org.web3j</groupId> <artifactId>core</artifactId> <version>3.3.1-android</version> </dependency>
Gradle
Java 8:
compile ('org.web3j:core:3.4.0')
Android:
compile ('org.web3j:core:3.3.1-android')
启动客户端
需要启动一个以太坊客户端,当然如果你已经启动了就不需要再次启动。
如果是geth的话这么启动:
$ geth --rpcapi personal,db,eth,net,web3 --rpc --rinkeby
如果是Parity启动:
$ parity --chain testnet
如果使用Infura客户端提供的免费的云端服务,这么启动:
Web3j web3 = Web3j.build(new HttpService("https://morden.infura.io/your-token"));
如果想进一步的了解infura,请参阅Using Infura with web3j。
在网络上如何获得以太币的相关文档可以看这个:testnet section of the docs。
当不需要Web3j实例时,需要调用shutdown
方法来释放它所使用的资源。
web3.shutdown()
发送请求
发送同步请求
Web3j web3 = Web3j.build(new HttpService()); // defaults to http://localhost:8545/ Web3ClientVersion web3ClientVersion = web3.web3ClientVersion().send(); String clientVersion = web3ClientVersion.getWeb3ClientVersion();
* 使用CompletableFuture (Future on Android) 发送异步请求*
Web3j web3 = Web3j.build(new HttpService()); // defaults to http://localhost:8545/ Web3ClientVersion web3ClientVersion = web3.web3ClientVersion().sendAsync().get(); String clientVersion = web3ClientVersion.getWeb3ClientVersion();
*使用RxJava的Observable
Web3j web3 = Web3j.build(new HttpService()); // defaults to http://localhost:8545/ web3.web3ClientVersion().observable().subscribe(x -> { String clientVersion = x.getWeb3ClientVersion(); ... });
注意Android使用方式
Web3j web3 = Web3jFactory.build(new HttpService()); // defaults to http://localhost:8545/ ...
IPC
Web3j还支持通过文件套接字快速运行进程间通信(IPC),支持客户端在相同的主机上同时运行Web3j。在创建服务时,使用相关的IPCService
就可以实现而不需要通过HTTPService
。
// OS X/Linux/Unix: Web3j web3 = Web3j.build(new UnixIpcService("/path/to/socketfile")); ... // Windows Web3j web3 = Web3j.build(new WindowsIpcService("/path/to/namedpipefile")); ...
需要注意:IPC通信在web3j-android中不可用。
通过java打包以太坊智能合约
Web3j可以自动打包智能合同代码,以便在不脱离JVM的情况下进行以太坊智能合同部署和交互。
要打包代码,需要先编译智能合同:
$ solc <contract>.sol --bin --abi --optimize -o <output-dir>/
然后用web3j的命令行工具打包代码:
web3j solidity generate /path/to/<smart-contract>.bin /path/to/<smart-contract>.abi -o /path/to/src/main/java -p com.your.organisation.name
接下来就可以新建和部署智能合约了:
Web3j web3 = Web3j.build(new HttpService()); // defaults to http://localhost:8545/ Credentials credentials = WalletUtils.loadCredentials("password", "/path/to/walletfile"); YourSmartContract contract = YourSmartContract.deploy( <web3j>, <credentials>, GAS_PRICE, GAS_LIMIT, <param1>, ..., <paramN>).send(); // constructor params
或者使用一个现有的智能合约:
YourSmartContract contract = YourSmartContract.load( "0x<address>|<ensName>", <web3j>, <credentials>, GAS_PRICE, GAS_LIMIT);
然后就可以进行智能合约的交互了:
TransactionReceipt transactionReceipt = contract.someMethod( <param1>, ...).send();
调用智能合约:
Type result = contract.someMethod(<param1>, ...).send();
更多关于打包的资料可以看这里:Solidity smart contract wrappers
Filters
web3j的响应式函数可以使观察者通过事件去通知消息订阅者变得很简单,并能够记录在区块链中。接收所有新的区块并把它们添加到区块链中:
Subscription subscription = web3j.blockObservable(false).subscribe(block -> { ... });
接收所有新的交易并把它们添加到区块链中:
Subscription subscription = web3j.transactionObservable().subscribe(tx -> { ... });
接收所有已经提交到网络中等待处理的交易。(他们被统一的分配到一个区块之前。)
Subscription subscription = web3j.pendingTransactionObservable().subscribe(tx -> { ... });
或者你重置所有的区块到最新的位置,那么当有新建区块的时候会通知你。
Subscription subscription = catchUpToLatestAndSubscribeToNewBlocksObservable( <startBlockNumber>, <fullTxObjects>) .subscribe(block -> { ... });
主题过滤也被支持:
EthFilter filter = new EthFilter(DefaultBlockParameterName.EARLIEST, DefaultBlockParameterName.LATEST, <contract-address>) .addSingleTopic(...)|.addOptionalTopics(..., ...)|...; web3j.ethLogObservable(filter).subscribe(log -> { ... });
当不再需要时,订阅也应该被取消:
subscription.unsubscribe();
注意:Infura中不支持filters。
需要了解更多有关过滤器和事件的信息可以查看Filters and Events和Web3jRx的接口。
交易
Web3j支持使用以太坊钱包文件(推荐的)和用于发送事务的以太坊客户端管理命令。
使用以太钱包文件发送以太币给其他人:
Web3j web3 = Web3j.build(new HttpService()); // defaults to http://localhost:8545/ Credentials credentials = WalletUtils.loadCredentials("password", "/path/to/walletfile"); TransactionReceipt transactionReceipt = Transfer.sendFunds( web3, credentials, "0x<address>|<ensName>", BigDecimal.valueOf(1.0), Convert.Unit.ETHER) .send();
或者你希望建立你自己定制的交易:
Web3j web3 = Web3j.build(new HttpService()); // defaults to http://localhost:8545/ Credentials credentials = WalletUtils.loadCredentials("password", "/path/to/walletfile"); // get the next available nonce EthGetTransactionCount ethGetTransactionCount = web3j.ethGetTransactionCount( address, DefaultBlockParameterName.LATEST).send(); BigInteger nonce = ethGetTransactionCount.getTransactionCount(); // create our transaction RawTransaction rawTransaction = RawTransaction.createEtherTransaction( nonce, <gas price>, <gas limit>, <toAddress>, <value>); // sign & send our transaction byte[] signedMessage = TransactionEncoder.signMessage(rawTransaction, credentials); String hexValue = Numeric.toHexString(signedMessage); EthSendTransaction ethSendTransaction = web3j.ethSendRawTransaction(hexValue).send(); // ...
使用Web3j的Transfer进行以太币交易要简单得多。
使用以太坊客户端的管理命令(如果你的钱包密钥已经在客户端存储):
Admin web3j = Admin.build(new HttpService()); // defaults to http://localhost:8545/ PersonalUnlockAccount personalUnlockAccount = web3j.personalUnlockAccount("0x000...", "a password").sendAsync().get(); if (personalUnlockAccount.accountUnlocked()) { // send a transaction }
如果你想使用 Parity’s Personal 或者 Trace 功能, 或者 Geth’s Personal 客户端 APIs,可以使用org.web3j:parity
和org.web3j:geth
模块。
命令行工具
web3j的jar包为每一个版本都提供命令行工具。命令行工具允许你直接通过一些命令使用web3j的一些功能:
- 钱包创建
- 钱包密码管理
- 资金从钱包转移到另一个
- solidity编写的智能合同功能打包
请参阅文档以获得命令行相关的进一步的信息。
其他的细节
java8 bulid:
- Web3j提供对所有响应类型的安全访问。可选的或null响应java 8都支持。
- 异步请求包在一个java 8的CompletableFutures。Web3j提供了围绕所有异步请求的打包工具,以确保在执行期间可以捕获任何异常,而不只是丢弃。由于在完全检查中会有很多缺少支持的异常情况,这些异常通常被确定为未检测到的异常,导致检测过程出现问题。有关详细信息,请参见 Async.run()及其关联 test。
在java 8的Android版本:
- 包数量作为 BigIntegers返回。对于简单的结果,可以通过
Response.getResult()
获取字符串类型的数量结果。 - 还可以通过在 HttpService和IpcService类中存在的
includeRawResponse
参数将原生的JSON包放置在响应中。
原文请访问:web3js开发以太坊智能合约快速入门
安利两个教程:
1.web3j教程,java和android app开发以太坊区块链类库web3j开发详解。
2.以太坊dapp,主要介绍智能合约与dapp应用开发,适合入门。
3.以太坊开发,主要是介绍使用node.js、mongodb、区块链、ipfs实现去中心化电商DApp实战,适合进阶。

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
Javascript异步机制
Javascript作为一种单线程语言,是如何实现异步编程的呢? 相信不少人对Javascript单线程表示怀疑:为何单线程可以实现异步操作呢?其实Javascript确实是单线程的(我们不妨把这个线程称作主线程),但它实现异步操作的方式确实借助了浏览器的其他线程的帮助。那其他线程是怎么帮助Javascript主线程来实现异步的呢?答案就是任务队列(task queue)和事件循环(event loop)。 一、任务队列 首先,作为单线程语言,在Javascript中定义的任务都会在主线程中执行。但是并不是每个任务都会立刻执行,而这种不立刻执行的任务我们称作异步任务。相反,那些立刻执行的任务我们把它们称作同步任务。而这些异步任务都会交给浏览器的其他线程去执行,但是主线程需要了解这些异步任务执行的状态,才方便进行下一步操作。 打个比方,主线程准备做饭,所以下达一个异步任务去买菜,异步任务买完菜之后得告诉主线程:“我买完菜啦”,这个时候主线程才好开始做饭。 而我们知道因为Javascript是单线程,所以上述的“下一步操作”没法直接定义在主函数里(不然就被当做同步任务直接执行了),那这些应...
- 下一篇
前端 优化反应: 虚拟dom解释
了解反应的虚拟dom,并使用此知识加快应用程序。在这个全面入门的框架内部入门中,我们将揭开JSX的神秘化,让您展示如何做出反应,解释如何找到瓶颈,并分享一些避免常见错误的提示。 反应的原因之一一直动摇着前端世界,并没有下降的迹象,它平易近人的学习曲线:在你绕着头后,学习曲线。n.JSX还有整个“国家vs.道具“概念,你可以走了。 如果你已经熟悉了反应工作的方式,你可以直接跳到“修理东西”. 但是要真正掌握自己的反应,你需要思考反应。这篇文章是想帮你解决这个问题。看看所做的反应表我们的项目之一: 一个巨大的反应表ebay业务. 使用数百条动态的、多层的行,理解框架的细点对于保证用户体验的顺利进行至关重要。 当事情发生的时候你肯定会感觉到。输入字段会得到laggy,复选框会先检查一下,情态动词会出现困难的时候。 为了解决这些问题,我们需要覆盖整个旅程,一个反应组件从定义到您定义(然后更新)页面上。系好安全带! 在JSX后面 过程中已知的前端圈为“transpiling”,即使“编译”将是一个更正确的术语。 反应开发人员敦促您在编写组件时使用名为JSX的html和javascript组合。然...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- CentOS8,CentOS7,CentOS6编译安装Redis5.0.7
- SpringBoot2整合Redis,开启缓存,提高访问速度
- CentOS7,8上快速安装Gitea,搭建Git服务器
- SpringBoot2配置默认Tomcat设置,开启更多高级功能
- Eclipse初始化配置,告别卡顿、闪退、编译时间过长
- Jdk安装(Linux,MacOS,Windows),包含三大操作系统的最全安装
- CentOS7编译安装Cmake3.16.3,解决mysql等软件编译问题
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- Docker快速安装Oracle11G,搭建oracle11g学习环境
- CentOS7设置SWAP分区,小内存服务器的救世主