JavaWeb3J概述
Web3j是⼀个轻量级,Reactive(响应式),类型安全的Java库,⽤于与Ethereum⽹络上的客户端(节点)集成,这允许您使⽤Ethereum 块链,⽽不需要为平台编写⾃⼰的集成代码的额外开销。
2.1 Web3J的提供的功能
1. 通过HTTP和IPC 完成Ethereum的JSON-RPC客户端API的实现
2. Ethereum钱包⽀持
3. 使⽤过滤器的函数式编程功能的API
4. ⾃动⽣成Java智能合约包装器,以创建、部署、处理和调⽤来⾃本地Java代码的智能合约
5. ⽀持Parity的 个⼈和Geth的 个⼈客户端API
6. ⽀持Infura,所以您不必⾃⼰运⾏⼀个Ethereum客户端
7. 综合整合测试展⽰了上述⼀些场景
8. 命令⾏⼯具
2.2 Web3J的依赖的库(中间件)
1. RxJava函数式编程的的API中间件
2. Apache HTTP Client中间件
3. Jackson Core ⽤于快速JSON序列化/反序列化中间件
4. Bouncy Castle加密解密和 Java Scrypt加密中间件
5. ⽣成智能合约java包装器类的java源代码(.java)的JavaPoet中间件
6. Java的UNIX域套接字的*nix系统进程间通信API中间件
2.3 启动Ethereum客户端
$ geth --fast --cache = 512 –networkid 2 - -rpcapi “personal,db,eth,net,web3” --rpc --dev
2.4 Web3J的进程间通信IPC
Web3j还⽀持通过⽂件套接字快速进⾏进程间通信(IPC)到在与web3j相同的主机上运⾏的客户端。在创建服务时,连接只需使⽤相关的IpcService实现⽽不是 HttpService:
2.5 Web3J的过滤器
Web3j的函数式编程的特性让我们设置观察者很容易,这样通知订阅者在区块链以便知道区块链上设置的事件。
2.5.1 区块过滤器
当所有新的块被添加到块链中的时候,接收到这些区块
如果您希望查看最近的当前的区块,以便于新的后续块的创建:
2.5.2 交易过滤器
当所有新的交易被添加到块链中的时候,接收到这些交易
2.5.3 待处理的交易过滤器
当所有待处理的交易被提交到⽹络时(也就是说,在它们被分组到⼀个块之前),接收这些交易
2.5.4 使⽤Web3J交易
Web3j⽀持使⽤Ethereum钱包⽂件(推荐)和⽤于发送交易的Ethereum客户端管理命令。使⽤您的Ethereum钱包⽂件将Ether发送到另⼀⽅:
如果想⾃定义交易
1. 获取可⽤的nonce
java源代码加密
2. 创建交易
3. 签名并发送交易
4. 使⽤web3j的智能合约包装器要简单得多
2.6 使⽤Web3J智能合约
使⽤Java智能合约包装器处理智能合约
web3j可以⾃动⽣成智能合约包装器代码,以便在不离开Java的情况下部署和与智能合约进⾏交互,⽣成包装代码
2.6.1 编译智能合约
$ solc <contract> .sol --bin --abi --optimize -o <output-dir>
2.6.2 然后使⽤Web3J的命令⾏⼯具⽣成包装器代码
Web3j solidity⽣成/path/to/<smart-contract>.bin /path/to/<smart-contract>.abi -o / path / to / src / main / java -ur.organisation.name
2.6.3 创建并部署智能合约
2.6.4 使⽤已存在的智能合约
3 以太坊的Web3J交易
3.1 Web3J交易类型
从⼴义上讲,以太坊有三种类型的交易
1.从以太坊的⼀⽅转移到另⼀⽅
2.创建智能合约
3.交易智能合约
3.2 在TestNet /私有块链上挖矿
在Ethereme测试⽹络(TestNet)中,采矿难度低于主⽹络(MainNet)。这意味着您可以使⽤常规CPU(如笔记本电脑)挖掘新的Ether,您需要做的就是运⾏⼀个Ethereum客户端
3.3 以太坊GAS
在使⽤Ethereum客户端时,这意味着有两个参数(GasPrice,GasLimit)⽤来决定你想花多少时间来完成⼀项任务:
3.3.1 Gas Price
这是你在每单位Gas中所准备的量。它的价格是9000 Wei (9 x 10 ^15 Ether)
这是你在交易执⾏过程中愿意花费的总⾦额。在以太坊中,⼀个交易的⼤⼩是有上限的,它限制了这个值,通常限制为1,500,000
3.3.2 Gas Limit
这些参数组合在⼀起,决定了您愿意花费在交易成本上的最⼤数量。也就是说,你不能再⽤Gas的价格限制了。GasPrice也会影响交易发⽣的速度,这取决于其他交易的价格,⽽这些交易对矿商来说更有利可图,您可能需要对这些参数进⾏调整,以确保交易能够及时地进⾏。
3.4 交易机制
当您使⽤某种Ether创建有效的帐户时,可以使⽤两种机制来与Ethereum进⾏交易,这两种机制都通过web3j来⽀持。
1. 通过Ethereum客户端进⾏交易签名
2. 离线交易签名
3.4.1 通过Ethereum客户端进⾏交易签名
为了通过Ethereum客户端进⾏交易,您⾸先需要确保您所交易的客户知道您的钱包地址。为了做到这⼀点,你最好运⾏⾃⼰的Ethereum 客户端,如Geth / Parity。⼀旦您有客户端运⾏,您可以通过以下⽅式创建⼀个钱包:
1. Geth Wiki包含了Geth⽀持的不同机制的良好运⾏,⽐如导⼊私钥⽂件,并通过它的控制台创建⼀个新帐户或者,您可以为客户端使⽤JSON-RPC管理命令,例如,⽤于Parity 或Geth的personal_newAccount
2. 在客户端使⽤json-rpc管理命令,对于 Parity or Geth使⽤personal_newAccount
创建您的钱包⽂件后,您可以通过web3j解锁帐户,⾸先创建⼀个⽀持Parity / Geth管理命令的web3j实例:
3.4.2 脱机交易签名
如果您不想管理⾃⼰的Ethereum客户端,或者不想向Ethereum客户端提供电⼦钱包详细信息(如密码),那么离线交易签名就是要⾛的路。
离线交易签名允许您使⽤您在Web3j中的Ethereum Ethereum钱包签署交易,从⽽可以完全控制您的私⼈凭据。离线创建的交易可以发送到⽹络上的任何Ethereum客户端,这将会将交易传播到其他节点,前提是它是⼀个有效的交易。
3.4.3 创建和使⽤钱包⽂件
为了离线签署交易,您需要使⽤您的Ethereum钱包⽂件或与Ethereum钱包/帐户相关的公钥和私钥,web3j能够为您⽣成⼀个新的安全Ethereum钱包⽂件,或者使⽤现有的钱包⽂件。
要创建⼀个新的钱包⽂件:
String fileName = ateNewWalletFile("your password",new File("/path/to/destination"));
3.4.4 脱机签名交易
如果具有达到脱机签名能⼒⽬的交易应该使⽤ RawTransaction类型。RawTransaction类似于之前提到的交易类型,但是它不需要from 地址,因为这可以从签名中推断出来。
为了创建和签名⼀个raw交易,顺序如下:
确定发件⼈帐户的下⼀个可⽤随机数
1. 创建RawTransaction对象
2. 编码RawTransaction对象
3. 签名RawTransaction对象
4. 将RawTransaction对象发送到节点进⾏处理
5. 获取下⼀个可⽤的随机数后,该值就可以⽤于创建交易对象:
6. 然后可以对交易进⾏签名和编码:
这些凭证是在创建和处理钱包⽂件时加载的。
7. 然后使⽤ethsendrawtransaction发送该交易:
3.4.5 交易 Nonce
Nonce是⼀个递增的数值,它⽤于惟⼀地标识交易。⼀个nonce只能被使⽤⼀次,直到⼀个交易被挖矿确认,它可以⽤同⼀个nonce发送多个版本的交易,然⽽,⼀旦被挖矿确认,任何后续的提交都将被拒绝,可以通过
3.4.6 Nonce使⽤规则
为了防⽌交易重播,ETH(ETC)节点要求每笔交易必须有⼀个nonce数值。每⼀个账户从同⼀个节点发起交易时,这个nonce值从0开始计数,发送⼀笔nonce对应加1。当前⾯的nonce处理完成之后才会处理后⾯的nonce。
注意这⾥的前提条件是相同的地址在相同的节点发送交易。
1. 当nonce太⼩(⼩于之前已经有交易使⽤的nonce值),交易会被直接拒绝。
2. 当nonce太⼤,交易会⼀直处于队列之中,这也就是导致我们上⾯描述的问题的原因;
3. 当发送⼀个⽐较⼤的nonce值,然后补齐开始nonce到那个值之间的nonce,那么交易依旧可以被执⾏。
4. 当交易处于queue中时停⽌geth客户端,那么交易queue中的交易会被清除掉。
3.5 创建智能合约
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论