`

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 EventsWeb3jRx的接口。

交易

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:parityorg.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开发以太坊智能合约快速入门

0
0
分享到:
评论

相关推荐

    基于java的开发源码-FTP客户端Java类库 ftp4j.zip

    基于java的开发源码-FTP客户端Java类库 ftp4j.zip 基于java的开发源码-FTP客户端Java类库 ftp4j.zip 基于java的开发源码-FTP客户端Java类库 ftp4j.zip 基于java的开发源码-FTP客户端Java类库 ftp4j.zip 基于java的...

    java类库java类库.doc

    本文档主要介绍 Java 类库的结构和使用方法,涵盖了 Java 中一些常用的包和类,例如 java.lang、java.awt、java.io 等。同时,也介绍了 String 类和 StringBuffer 类的使用方法。 Java 类库是 Java API 的一部分,...

    Java类库下载Q

    Java类库下载Q指的是一个包含多种常用Java类库的集合,提供了丰富的功能,使得Java开发者可以快速地集成到自己的项目中,提升开发速度。"Q"可能代表这个集合的特定版本或者特性。 在Java编程中,类库通常分为以下几...

    Java类库中文手册

    Java类库中文手册是针对Java开发者的一份重要参考资料,它以CHM(Compiled Help Manual)格式提供,便于离线查阅和快速检索。这份手册详细介绍了Java标准类库中的各种类、接口、方法和异常,是Java学习者和开发者的...

    Java类库参考手册

    《JavaTM 2 Platform Standard Edition 5.0 API 规范》,类库详查,是初学者和初始级、中级Java程序员必备的参考手册。内容包括: 接口(斜体) 类 枚举 异常 错误 注释类型

    JAVA类库转换成C#类库工具

    标题"JAVA类库转换成C#类库工具"以及描述中提到的"C#引用JAVA类库"、"C#调用JAVA类库"和"C#解析JAVA类库"都涉及到一个关键的技术:IKVM。 IKVM是“Java to .NET”的一个开源实现,它允许C#或其他.NET语言直接引用和...

    Java类库大全.docx

    这些只是众多Java类库中的一小部分,实际上还有许多其他框架,如Apache HttpClient用于网络请求,Jackson或Gson用于JSON序列化和反序列化,Log4j或SLF4J用于日志记录等。开发者可以根据项目需求选择合适的类库,以...

    echarts java 类库封装 手册

    echarts java 类库封装 手册 echarts java 类库封装 手册 echarts java 类库封装 手册 echarts java 类库封装 手册

    Java实训教程 Java软件开发实战 Java类库 全部PPT课件 共7个章节.rar

    Java软件开发实战 Java类库 第3章 包装器类等 共40页.pptx Java软件开发实战 Java类库 第4章 集合操作 共31页.pptx Java软件开发实战 Java类库 第5章 io操作 共35页.pptx Java软件开发实战 Java类库 第6章 其它综合 ...

    JAVA源码FTP客户端Java类库ftp4j

    JAVA源码FTP客户端Java类库ftp4j

    Java类库大全

    Java类库大全是一个集合了众多Java...通过这个"Java类库大全",开发者可以根据项目需求快速找到合适的类库,提高开发效率,同时也能学习到各种类库的设计理念和最佳实践。这个资源包无疑是对Java开发者的一份宝贵财富。

    手机鸿蒙OS的Java类库.zip

    本压缩包“手机鸿蒙OS的Java类库.zip”包含了HarmonyOS中与Java相关的类库,这些类库为开发者提供了在Android和Java开发经验基础上构建鸿蒙OS应用的能力。Java类库在鸿蒙OS中扮演着核心组件的角色,它们提供了系统...

    Java类库查询辞典1.0

    然而,理解`java.applet`包对于研究Java的历史和Web开发的演变仍然是有价值的,同时对于维护旧代码或者学习Java历史的开发者来说,这是一个不可或缺的知识点。通过《Java类库查询辞典1.0》这样的资源,我们可以更...

    android和java以太坊开发区块链应用使用web3j类库

    例如账户管理包括账户的创建、钱包创建、交易转账,交易与状态、智能合约开发与交互、过滤器和事件等,同时也详细说明如何使用web3j提供的API开发接口与以太坊进行交互,是java工程师学习以太坊应用开发的不二选择。...

    java资源FTP客户端Java类库ftp4j

    java资源FTP客户端Java类库 ftp4j提取方式是百度网盘分享地址

    基于java的开发源码-五线谱处理类库 abc4j.zip

    基于java的开发源码-五线谱处理类库 abc4j.zip 基于java的开发源码-五线谱处理类库 abc4j.zip 基于java的开发源码-五线谱处理类库 abc4j.zip 基于java的开发源码-五线谱处理类库 abc4j.zip 基于java的开发源码-五线...

    java类库说明文件

    Java类库的简单结构介绍及常用类别的说明文件

    java类库详解(PDF版)

    Java类库是Java编程语言的核心组成部分,它提供了一系列预先定义的类和接口,开发者可以使用这些类和接口来实现各种功能,从而简化编程工作。在Java 1.2版本中,类库已经相当成熟,虽然相比最新的Java版本,它可能...

    java web开发常用类库

    在Java Web开发中,使用合适的类库可以极大地提高开发效率和代码质量。下面将详细讲解标题和描述中提及的一些关键知识点: 1. **JDBC连接池**:JDBC(Java Database Connectivity)是Java中用于与数据库交互的标准...

    FTP客户端Java类库 ftp4j.7z

    FTP客户端Java类库 ftp4j.7z

Global site tag (gtag.js) - Google Analytics