Web3j是一个轻量级,Reactive(响应式),类型安全的Java库,用于与Ethereum网络上的客户端(节点)集成,这容许您使用Ethereum块链,而不须要为平台编写本身的集成代码的额外开销。javascript
经过HTTP和IPC 完成Ethereum的JSON-RPC客户端API的实现html
1.Ethereum钱包支持java
2.使用过滤器的函数式编程功能的APIgit
3.自动生成Java智能合约包装器,以建立、部署、处理和调用来自本地Java代码的智能合约github
4.支持Parity的 我的和Geth的 我的客户端APIweb
5.支持Infura,因此您没必要本身运行一个Ethereum客户端sql
6.综合整合测试展现了上述一些场景apache
7.命令行工具编程
1.RxJava函数式编程的的API中间件json
2.Apache HTTP Client中间件
3.Jackson Core 用于快速JSON序列化/反序列化中间件
4.Bouncy Castle加密解密和 Java Scrypt加密中间件
5.生成智能合约java包装器类的java源代码(.java)的JavaPoet中间件
6.Java的UNIX域套接字的*nix系统进程间通讯API中间件
1 |
$ geth --fast --cache = 512 –networkid 2 - -rpcapi “personal,db,eth,net,web3” --rpc --dev |
Web3j还支持经过文件套接字快速进行进程间通讯(IPC)到在与web3j相同的主机上运行的客户端。在建立服务时,链接只需使用相关的IpcService实现而不是 HttpService:
Web3j的函数式编程的特性让咱们设置观察者很容易,这样通知订阅者在区块链以便知道区块链上设置的事件。
当全部新的块被添加到块链中的时候,接收到这些区块
若是您但愿查看最近的当前的区块,以便于新的后续块的建立:
当全部新的交易被添加到块链中的时候,接收到这些交易
当全部待处理的交易被提交到网络时(也就是说,在它们被分组到一个块以前),接收这些交易
Web3j支持使用Ethereum钱包文件(推荐)和用于发送交易的Ethereum客户端管理命令。
使用您的Ethereum钱包文件将Ether发送到另外一方:
若是想自定义交易
获取可用的nonce
建立交易
签名并发送交易
使用web3j的智能合约包装器要简单得多
使用Java智能合约包装器处理智能合约
web3j能够自动生成智能合约包装器代码,以便在不离开Java的状况下部署和与智能合约进行交互,生成包装代码
$ solc .sol —bin —abi —optimize -o <output-dir>
Web3j solidity生成/path/to/<smart-contract>.bin /path/to/<smart-contract>.abi -o / path / to / src / main / java -p com.your.organisation.name
从广义上讲,以太坊有三种类型的交易
从以太坊的一方转移到另外一方
建立智能合约
交易智能合约
在Ethereme测试网络(TestNet)中,采矿难度低于主网络(MainNet)。这意味着您可使用常规CPU(如笔记本电脑)挖掘新的Ether,您须要作的就是运行一个Ethereum客户端
在使用Ethereum客户端时,这意味着有两个参数(GasPrice,GasLimit)用来决定你想花多少时间来完成一项任务:
这是你在每单位Gas中所准备的量。它的价格是9000 Wei (9 x 10 ^15 Ether)
这是你在交易执行过程当中愿意花费的总金额。在以太坊中,一个交易的大小是有上限的,它限制了这个值,一般限制为1,500,000
这些参数组合在一块儿,决定了您愿意花费在交易成本上的最大数量。也就是说,你不能再用Gas的价格限制了。GasPrice也会影响交易发生的速度,这取决于其余交易的价格,而这些交易对矿商来讲更有利可图,您可能须要对这些参数进行调整,以确保交易可以及时地进行。
当您使用某种Ether建立有效的账户时,可使用两种机制来与Ethereum进行交易,这两种机制都经过web3j来支持。
[经过Ethereum客户端进行交易签名](https://docs.web3j.io/transactions.html#signing-via-client)
[离线交易签名](https://docs.web3j.io/transactions.html#offline-signing)
为了经过Ethereum客户端进行交易,您首先须要确保您所交易的客户知道您的钱包地址。为了作到这一点,你最好运行本身的Ethereum客户端,如Geth / Parity。一旦您有客户端运行,您能够经过如下方式建立一个钱包:
Geth Wiki包含了Geth支持的不一样机制的良好运行,好比导入私钥文件,并经过它的控制台建立一个新账户或者,您能够为客户端使用JSON-RPC管理命令,例如,用于[Parity](https://github.com/paritytech/parity/wiki/JSONRPC-personal-module#personal_newaccount) 或[Geth的personal_newAccount](https://github.com/ethereum/go-ethereum/wiki/Management-APIs#personal_newaccount)
在客户端使用json-rpc管理命令,对于 [Parity](https://github.com/paritytech/parity/wiki/JSONRPC-personal-module#personal_newaccount) or [Geth](https://github.com/ethereum/go-ethereum/wiki/Management-APIs#personal_newaccount)使用personal_newAccount
建立您的钱包文件后,您能够经过web3j解锁账户,首先建立一个支持Parity / Geth管理命令的web3j实例
若是您不想管理本身的Ethereum客户端,或者不想向Ethereum客户端提供电子钱包详细信息(如密码),那么离线交易签名就是要走的路。
离线交易签名容许您使用您在Web3j中的Ethereum Ethereum钱包签署交易,从而能够彻底控制您的私人凭据。离线建立的交易能够发送到网络上的任何Ethereum客户端,这将会将交易传播到其余节点,前提是它是一个有效的交易。
为了离线签署交易,您须要使用您的Ethereum钱包文件或与Ethereum钱包/账户相关的公钥和私钥,web3j可以为您生成一个新的安全Ethereum钱包文件,或者使用现有的钱包文件。
要建立一个新的钱包文件:
String fileName = WalletUtils.generateNewWalletFile(“your password”,new File(“/path/to/destination”));
若是具备达到脱机签名能力目的交易应该使用 RawTransaction类型。RawTransaction相似于以前提到的交易类型,可是它不须要from地址,由于这能够从签名中推断出来。
为了建立和签名一个raw交易,顺序以下:
肯定发件人账户的下一个可用随机数
建立RawTransaction对象
编码RawTransaction对象
签名RawTransaction对象
将RawTransaction对象发送到节点进行处理
获取下一个可用的[随机数后](https://docs.web3j.io/transactions.html#nonce),该值就能够用于建立交易对象:
而后能够对交易进行签名和编码:
这些凭证是在建立和处理钱包文件时加载的。
而后使用ethsendrawtransaction发送该交易:
Nonce是一个递增的数值,它用于唯一地标识交易。一个nonce只能被使用一次,直到一个交易被挖矿确认,它能够用同一个nonce发送多个版本的交易,然而,一旦被挖矿确认,任何后续的提交都将被拒绝,能够经过
为了防止交易重播,ETH(ETC)节点要求每笔交易必须有一个nonce数值。每个帐户从同一个节点发起交易时,这个nonce值从0开始计数,发送一笔nonce对应加1。当前面的nonce处理完成以后才会处理后面的nonce。
注意这里的前提条件是相同的地址在相同的节点发送交易。
当nonce过小(小于以前已经有交易使用的nonce值),交易会被直接拒绝。
当nonce太大,交易会一直处于队列之中,这也就是致使咱们上面描述的问题的缘由;
当发送一个比较大的nonce值,而后补齐开始nonce到那个值之间的nonce,那么交易依旧能够被执行。
当交易处于queue中时中止geth客户端,那么交易queue中的交易会被清除掉。
若是智能合约包含构造函数,则相关的构造函数字段值必须编码并附加到编译后的智能合约代码中.
web3j负责为您提供功能编码,进一步的详细信息能够在Ethereum维基百科的电子合同ABI节中找到。
等待响应就使用EthGetTransactionReceipt…
无论消息签名的返回类型是什么,都不可能从事务性函数调用返回值。可是,可使用过滤器捕获函数返回的值.
此功能由ethcall json-rpc调用实现, ethcall容许您在智能合约中调用一个方法来查询一个值。这个函数不存在交易成本,这是由于它不会改变任何智能合约方法的状态,它只是简单地返回它们的值:
注意:若是生成了一个无效的函数调用,或者得到了一个null结果,那么返回值将是一个集合。emptylist的实例.
原文连接:http://wangxiaoming.com/blog/2018/02/28/HPB-43-ETH-Web3j-function/