Java Web3J概述_web3j是什么-程序员宅基地

技术标签: 区块链  

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

 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 -p com.your.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 = WalletUtils.generateNewWalletFile("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   创建智能合约

 

3.5.1 使用Raw Transaction

3.5.2  获取合约地址

如果智能合约包含构造函数,则相关的构造函数字段值必须编码并附加到编译后的智能合约代码中:

 

3.5.3  执行智能合约

web3j负责为您提供功能编码,进一步的详细信息可以在Ethereum维基百科的电子合同ABI节中找到。

等待响应就使用EthGetTransactionReceipt…

不管消息签名的返回类型是什么,都不可能从事务性函数调用返回值。但是,可以使用过滤器捕获函数返回的值

 

3.5.4  查询智能合约的状态

此功能由ethcall json-rpc调用实现, ethcall允许您在智能合约中调用一个方法来查询一个值。这个函数不存在交易成本,这是因为它不会改变任何智能合约方法的状态,它只是简单地返回它们的值:

注意:如果生成了一个无效的函数调用,或者获得了一个null结果,那么返回值将是一个集合。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/sunny2come/article/details/81330438

智能推荐

(附源码)ssm基于微信小程序的社区老人健康管理服务系统的设计与实现 毕业设计011513_基于微信小程序的社区管理系统设计论文-程序员宅基地

文章浏览阅读2k次,点赞7次,收藏30次。对于本社区老人健康管理服务系统的设计来说,通过科学的管理方式、便捷的服务提高了工作效率,减少了数据存储上的错误和遗漏。社区老人健康管理服务系统使用Java语言,采用基于MVVM模式的SSM技术进行开发,使用 Eclipse 2017 CI 10 编译器编写,数据方面主要采用的是微软的MySQL关系型数据库来作为数据存储媒介,配合前台HTML+CSS 技术完成系统的开发。具体根据社区老人健康管理服务系统的现状来进行开发的,具体根据用户需求实现社区老人健康管理服务系统网络化的管理,各类信息有序地进行存储...._基于微信小程序的社区管理系统设计论文

Java中的Action、Service和DAO层功能区分及示例解释-程序员宅基地

文章浏览阅读555次。Action/Service/DAO简介:Action是管理业务(Service)调度和管理跳转的。Service是管理具体的功能的。Action只负责管理,而Service负责实施。DAO只完成增删改查,虽然可以1-n,n-n,1-1关联,模糊、动态、子查询都可以。但是无论多么复杂的查询,dao只是封装增删改查。至于增删查改如何去实现一个功能,dao是不管的。总结这三者,通过例子来解释:Acti..._java中action

Servlet详解-程序员宅基地

文章浏览阅读321次。Servlet (Server Applet),全称Java Servlet。是用Java编写的服务器端程序,其,生成动态的Web内容。Servlet运行于支持Java的应用服务器中(如Tomcat等)。从实现上讲,Servlet可以响应任何类型的请求,但绝大多数情况下,servlet只用来扩展基于HTTP协议的服务器。

VMware与艾莫讯国产300编程电缆兼容性问题_虚拟机插入mpi电缆卡死-程序员宅基地

文章浏览阅读1.3k次。VMware-15.1.0 -VMware-15.5.5之间所有的版本都与国产艾莫讯0CB20电缆有兼容问题。 具体故障是只要连接到虚拟机并驱动就会造成虚拟机死机。西门子官方的0CB20电缆不会存在这个问题。说明国产电缆和官方电缆的实现方式还是有区别,这次蓝屏死机BUG主要是由VMware引起的,为了验证我还特意去咸鱼上整了一条官方电缆。 我为什么知道这么清楚呢,因为vmware每一次更新我都会去升级,然后去现场干活。接下来的事情你们应该能想到了,去现场都读程序,结果插上电缆就死机。急忙跟客户说.._虚拟机插入mpi电缆卡死

java找不到符号解决办法-程序员宅基地

文章浏览阅读1.6w次,点赞11次,收藏15次。一、java找不到符号如果你的代码里没有报错,明明是存在的。但是java报错找不到符号。像下面这样子。二、解决步骤1.清除编码工具缓存本人用的idea, eclipse清除缓存方式有需要的可以百度一下!2.如果是mavne项目的先clean 再package总结提示:一定要package本人刚开始就是知道clean了,没有package导致问题一直没有解决。在此记录一下!...

【Nginx】配置详解_nginx修改配置文件如何生效-程序员宅基地

文章浏览阅读1.3w次,点赞4次,收藏22次。访问到未定义的扩展名的时候,就默认为下载该文件。#服务器并发处理能力,值越大并发能力越强(受自身配置限制)一个http块可以包含多个server块,而一个server块就等于一个虚拟主机。nginx配置最频繁的部分,比如代理,日志,缓存、第三方模块等等。包括文件引入、MIME-TYPE定义,日志自定义、连接超时等等。需要注意的是http块可以包括http全局块和server块。server块又包含全局server块和location块。二、容器部署的项目,配置nginx。2.2,events块。..._nginx修改配置文件如何生效

随便推点

python输出系统时间到文件_Python获取并输出当前日期时间-程序员宅基地

文章浏览阅读1.1k次。取得当前时间戳import timeprint time.time()格式化时间戳为标准格式print time.strftime('%Y.%m.%d',time.localtime(time.time()))获取30天前的时间(通过加减秒数来获取现在或者未来某个时间点)print time.strftime('%Y.%m.%d',time.localtime(time.time()-259200..._python 输出时间到文档里

Buck电路 (PWM实现与闭环反馈) 电力系统仿真_buck电路带反馈控制-程序员宅基地

文章浏览阅读962次,点赞2次,收藏11次。Buck电路 (PWM实现与闭环反馈) 电力系统仿真_buck电路带反馈控制

jQuery实现轮播图代码_jquery轮播图代码-程序员宅基地

文章浏览阅读699次,点赞11次,收藏8次。一个简单的jQuery轮播图代码,首先,定义了一个slideshow-container的div容器,其中包含了所有轮播图幻灯片。每个幻灯片都包含一个mySlides的类名,并且使用CSS将其隐藏。在showSlides()函数中,遍历所有幻灯片并将它们隐藏,然后显示当前索引的幻灯片。最后,我们使用setTimeout()函数来每隔2秒钟调用showSlides()函数,从而实现了轮播效果。它使事情变得更简单,使用jQuery能够以最小的努力在Web上构建复杂的交互性。_jquery轮播图代码

android adb install apk的安装流程_full install must include a base packag-程序员宅基地

文章浏览阅读1.1w次,点赞6次,收藏23次。一、简介 1.Android上应用安装可以分为以下几种方式:通过adb命令安装:adb 命令包括adb push/install 用户下载的Apk,通过系统安装器packageinstaller安装该Apk。packageinstaller是系统内置的应用程序,用于安装和卸载应用程序。 系统开机时安装系统应用。 电脑或者手机上的应用商店自动安装第三种系统安装我们在上个章节P..._full install must include a base packag

漂亮的css透明样式菜单-程序员宅基地

文章浏览阅读74次。下载地址漂亮的css透明样式菜单,可以用作工具栏或者导航条,小图标可以自定义。dd:_漂亮的css透明样式菜单

牛人莫入 Silverlight DataGrid 分组技巧 -程序员宅基地

文章浏览阅读983次。牛人莫入 Silverlight DataGrid 分组技巧 最近在项目中很多的地方都用到了数据的展示---DataGrid控件,在园子里面也有很多的朋友也对这个DataGrid控件也写了很多的教程;我这里也与其它人也没有什么区别,这里只是告诉大家一个小的技巧;但是我相信这一个小的技巧对大家以后在项目中应该有一些帮助;一天,领导走过来看了我用户管理UI,我用了一