java wrapper怎么运行_如何从智能合约中生成Java Wrapper

在本文中,我们将了解如何直接从智能合约生成Java Wrapper类以与Java中的智能合约进行交互。

从智能合约生成Java Wrapper类有不同的方法:

1. Web3j命令行工具和solc

2. Web3j命令行工具和Truffle构建生成的工件

3. web3j-maven-plugin

4. web3j-gradle-plugin

为了演示如何使用上述方法,本教程使用以下智能合约将文档公证到以太坊区块链上的注册表中。

DocumentRegistry.sol

pragma solidity ^0.5.6;

/**

* @dev Smart Contract responsible to notarize documents on the Ethereum Blockchain

*/

contract DocumentRegistry {

struct Document {

address signer; // Notary

uint date; // Date of notarization

bytes32 hash; // Document Hash

}

/**

* @dev Storage space used to record all documents notarized with metadata

*/

mapping(bytes32 =》 Document) registry;

/**

* @dev Notarize a document identified by its 32 bytes hash by recording the hash, the sender and date in the registry

* @dev Emit an event Notarized in case of success

* @param _documentHash Document hash

*/

funcTIon notarizeDocument(bytes32 _documentHash) external returns (bool) {

registry[_documentHash].signer = msg.sender;

registry[_documentHash].date = now;

registry[_documentHash].hash = _documentHash;

emit Notarized(msg.sender, _documentHash);

return true;

}

/**

* @dev Verify a document idenTIfied by its hash was noterized in the registry.

* @param _documentHash Document hash

* @return bool if document was noterized previsouly in the registry

*/

funcTIon isNotarized(bytes32 _documentHash) external view returns (bool) {

return registry[_documentHash].hash == _documentHash;

}

/**

* @dev DefiniTIon of the event triggered when a document is successfully notarized in the registry

*/

event Notarized(address indexed _signer, bytes32 _documentHash);

}

web3j命令行工具和solc

第一种方法使用solc生成Smart合约ABI和bytecode,并将这两个文件作为输入提供给web3j-cli以生成Wrapper。

1、安装solc并验证版本

安装solc并运行以下命令以确保solc版本大于或等于0.5.6(智能合约中指定的版本)。

$ solc --version

solc, the solidity compiler commandline interface

Version: 0.5.9+commit.c68bc34e.Linux.g++

2、安装Web3J CLI

要安装web3j cli,请从项目存储库的“发布”页面的“下载”部分下下载zipfile/tarball,或通过homebrew为MacOS用户或通过aur为Arch Linux用户下载zipfile/tarball。

brew tap web3j/web3j

brew install web3j

web3j

要通过zipfile运行,解压缩并运行二进制文件,您可能还需要将二进制文件添加到PATH中:

$ unzip web3j-4.3.0.zip

creating: web3j-4.3.0/lib/

inflating: web3j-4.3.0/lib/core-1.0.2-all.jar

creating: web3j-4.3.0/bin/

inflating: web3j-4.3.0/bin/web3j

inflating: web3j-4.3.0/bin/web3j.bat

$ 。/web3j-《version》/bin/web3j

_ _____ _ _

| | |____ (_) (_)

__ _____| |__ / /_ _ ___

\ \ /\ / / _ \ ‘_ \ \ \ | | | / _ \

\ V V / __/ |_) |.___/ / | _ | || (_) |

\_/\_/ \___|_.__/ \____/| |(_)|_| \___/

_/ |

|__/

Usage: web3j version|wallet|solidity 。..

3、使用solc编译智能合约

给定我们的Solidity文件DocumentRegistry.sol,solc 《sol》 --bin --abi --optimize -o 《output》命令编译智能合约并在同一目录中生成两个新文件:

$ solc DocumentRegistry.sol --bin --abi --optimize -o 。/

Compiler run successful. Artifact(s) can be found in directory 。/.

$ ls -l

total 12

-rw-rw-r-- 1 gjeanmart gjeanmart 565 Jun 24 13:42 DocumentRegistry.abi

-rw-rw-r-- 1 gjeanmart gjeanmart 676 Jun 24 13:42 DocumentRegistry.bin

-rw-rw-r-- 1 gjeanmart gjeanmart 1488 Jun 24 13:40 DocumentRegistry.sol

DocumentRegistry.bin:二进制文件,智能合约的字节码

DocumentRegistry.abi:智能合约的ABI(应用程序二进制接口),它以JSON格式定义接口。

4、使用web3j-cli生成包装器

使用ABI和bytecode(在步骤3中生成)和web3j-cli(在步骤2中安装),我们现在可以使用以下命令生成我们的智能合约的Java Wrapper:

web3j solidity generate -a=《abiFile》 -b=《binFile》 -o=《destinationFileDir》 -p=《packageName》

示例:

$ web3j solidity generate -a DocumentRegistry.abi

-b DocumentRegistry.bin -o 。

-p me.gjeanmart.tutorials.javaethereum.wrapper

_ _____ _ _

| | |____ (_) (_)

__ _____| |__ / /_ _ ___

\ \ /\ / / _ \ ’_ \ \ \ | | | / _ \

\ V V / __/ |_) |.___/ / | _ | || (_) |

\_/\_/ \___|_.__/ \____/| |(_)|_| \___/

_/ |

|__/

Generating me.gjeanmart.tutorials.javaethereum.wrapper.DocumentRegistry 。.. File written to 。

因此,您应该看到生成到文件夹/.java中的Java Wrapper文件,您可以将其复制到项目的src / main / java /文件夹中。

。/me/gjeanmart/tutorials/javaethereum/wrapper/DocumentRegistry.java

Web3j命令行工具和Truffle artefacts

Truffle是最著名的框架之一,可帮助您使用以太坊开发、测试和部署。 我们可以使用Truffle使用Web3j命令行工具生成的artefacts来创建wrapper类。

1、安装Truffle

Truffle可作为npm wrapper提供。

$ npm install truffle -g

- Fetching solc version list from solc-bin. Attempt #1

+ truffle@5.0.24

added 27 packages from 439 contributors in 11.636s

$ truffle version

Truffle v5.0.24 (core: 5.0.24)

Solidity v0.5.0 (solc-js)

Node v10.15.3

Web3.js v1.0.0-beta.37

2、初始化新的Truffle项目

要初始化Truffle项目,请在新文件夹中使用truffle init命令。该命令创建文件夹contract /,migration /和test /,以及文件truffle-config.js。

$ mkdir truffle

$ cd truffle

$ truffle init

? Preparing to download

? Downloading

? Cleaning up temporary files

? Setting up box

Unbox successful. Sweet!

Commands:

Compile: truffle compile

Migrate: truffle migrate

Test contracts: truffle test

$ ls -l

total 20

drwxrwxr-x 2 gjeanmart gjeanmart 4096 Jun 24 14:25 contracts

drwxrwxr-x 2 gjeanmart gjeanmart 4096 Jun 24 14:25 migrations

drwxrwxr-x 2 gjeanmart gjeanmart 4096 Jun 24 14:25 test

-rw-rw-r-- 1 gjeanmart gjeanmart 4233 Jun 24 14:25 truffle-config.js

3、将合同添加到文件夹合约中

将智能合约源documentregistry.sol复制到文件夹contracts中。

4、编译合约

使用命令truffle compile编译智能合约,此命令生成一个新的文件夹build/contracts/,其中包含每个编译的智能合约的truffle artefact。

$ truffle compile

Compiling your contracts.。.

===========================

》 Compiling 。/contracts/DocumentRegistry.sol

》 Compiling 。/contracts/Migrations.sol

》 Artifacts written to /home/gjeanmart/workspace/tutorials/java-ethereum-wrapper/truffle/build/contracts

》 Compiled successfully using:

- solc: 0.5.8+commit.23d335f2.Emscripten.clang

$ ls -l build/contracts/

total 136

-rw-rw-r-- 1 gjeanmart gjeanmart 79721 Jun 24 14:33 DocumentRegistry.json

-rw-rw-r-- 1 gjeanmart gjeanmart 54043 Jun 24 14:33 Migrations.json

5、从Truffle Artefact生成智能合约Java Wrapper

最后,web3j-cli提供了一种方法,可以使用以下命令直接从truffle编译的Truffle artefact结果生成Wrapper:

$ web3j truffle generate 。/build/contracts/DocumentRegistry.json -o 。 -p me.gjeanmart.tutorials.javaethereum.wrapper

_ _____ _ _

| | |____ (_) (_)

__ _____| |__ / /_ _ ___

\ \ /\ / / _ \ ‘_ \ \ \ | | | / _ \

\ V V / __/ |_) |.___/ / | _ | || (_) |

\_/\_/ \___|_.__/ \____/| |(_)|_| \___/

_/ |

|__/

Generating me.gjeanmart.tutorials.javaethereum.wrapper.DocumentRegistry 。.. File written to 。

因此,您应该看到生成到《packagefolders》 /。java_文件夹中的Java Wrapper文件,您可以将其复制到项目的src / main / java /文件夹中。

。/me/gjeanmart/tutorials/javaethereum/wrapper/DocumentRegistry.java

注意:使用Truffle,您可以做的比本文中显示的更多,例如部署脚本(迁移)、多网络配置、测试、调试。

web3j-maven-plugin

下一个解决方案比前两个解决方案更优雅,因为我们不必安装webj-cli并将文件复制到源文件夹。我们可以使用Maven和web3j-maven-plugin直接在Java项目中使用此方法。以下步骤假定您已创建Maven项目。

1、先决条件

安装solc并运行以下命令以确保solc版本大于或等于0.5.6(智能合约中指定的版本)。

$ solc --version

solc, the solidity compiler commandline interface

Version: 0.5.9+commit.c68bc34e.Linux.g++

2、将智能合约复制到文件夹src / main / resources中

将Smart Contract源DocumentRegistry.sol复制到Maven项目的src / main / resources文件夹中。

3、配置Maven以在generate-sources阶段生成Wrapper

在此步骤中,我们配置两个Maven插件:

web3j - Maven的插件

第一个插件与前两个方法相同,但与Maven集成。首先,我们将插件配置为在进入项目的generate-sources阶段时自动执行。

其次我们配置插件参数:

· packageName:要应用于生成的Wrapper类的包名称

· sourceDestination:目标文件夹,用于移动生成的Wrapper类

· soliditySourceFiles:在何处查找Smart Contract源文件

建立辅助性Maven的插件

第二个插件将sourceDestination文件夹添加到类路径中,以便我们可以导入生成的Wrapper类

pom.xml

《build》

《plugins》

《plugin》

《groupId》org.web3j《/groupId》

《artifactId》web3j-maven-plugin《/artifactId》

《version》4.2.0《/version》

《executions》

《execution》

《id》generate-sources-web3j《/id》

《phase》generate-sources《/phase》

《goals》

《goal》generate-sources《/goal》

《/goals》

《configuration》

《packageName》me.gjeanmart.tutorials.javaethereum.contracts.generated《/packageName》

《sourceDestination》${basedir}/target/generated-sources/contracts《/sourceDestination》

《soliditySourceFiles》

《directory》${basedir}/src/main/resources《/directory》

《includes》

《include》**/*.sol《/include》

《/includes》

《/soliditySourceFiles》

《/configuration》

《/execution》

《/executions》

《/plugin》

《plugin》

《groupId》org.codehaus.mojo《/groupId》

《artifactId》build-helper-maven-plugin《/artifactId》

《executions》

《execution》

《id》add-source《/id》

《phase》generate-sources《/phase》

《goals》

《goal》add-source《/goal》

《/goals》

《configuration》

《sources》

《source》${basedir}/target/generated-sources/contracts《/source》

《/sources》

《/configuration》

《/execution》

《/executions》

《/plugin》

《/plugins》

《/build》

4、运行Maven生成源

最后,使用mvn clean package(包括generate-sources阶段)构建Maven项目。因此,我们可以看到Java Wrapper已生成到/target/generated-sources/contracts/me/gjeanmart/tutorials/javaethereum/contracts/generated/DocumentRegistry.java并自动添加到类路径中。

037dd34e0d83abbce833340b0e26291b.png

Web3J Gradle插件

最后一个方法与之前使用Maven的方法类似,但使用的是Gradle。

1、先决条件

安装solc并运行以下命令以确保solc版本大于或等于0.5.6(智能合约中指定的版本)。

$ solc --version

solc, the solidity compiler commandline interface

Version: 0.5.9+commit.c68bc34e.Linux.g++

2、将智能合约放入文件夹src / main / solidity

将Smart Contract源DocumentRegistry.sol复制到Gradle项目的src / main / solidity文件夹中。

3、配置Gradle以在构建期间生成Wrapper首先将web3j-gradle插件导入build.gradle文件。

plugins {

id ’org.web3j‘ version ’4.3.0‘

}

然后我们可以配置插件来为生成的wrapper类指定包名称和目标文件夹:

web3j {

generatedPackageName = ’me.gjeanmart.tutorials.javaethereum.contracts.generated‘

generatedFilesBaseDir = “$buildDir/contracts”

}

要使用系统安装的solc版本而不是与插件捆绑的版本,请将以下行添加到build.gradle:

solidity {

executable = “solc”

}

build.gradle

/*

* This file was generated by the Gradle ’init‘ task.

*

* This generated file contains a sample Java Library project to get you started.

* For more details take a look at the Java Libraries chapter in the Gradle

* user guide available at https://docs.gradle.org/5.0/userguide/java_library_plugin.html

*/

plugins {

// Apply the java-library plugin to add support for Java Library

id ’java-library‘

id ’org.web3j‘ version ’4.3.0‘

}

repositories {

// Use jcenter for resolving your dependencies.

// You can declare any Maven/Ivy/file repository here.

jcenter()

}

dependencies {

// This dependency is exported to consumers, that is to say found on their compile classpath.

api ’org.apache.commons:commons-math3:3.6.1‘

// This dependency is used internally, and not exposed to consumers on their own compile classpath.

implementation ’com.google.guava:guava:26.0-jre‘

implementation ’org.web3j:core:4.3.0‘

// Use JUnit test framework

testImplementation ’junit:junit:4.12‘

}

web3j {

generatedPackageName = ’me.gjeanmart.tutorials.javaethereum.contracts.generated‘

generatedFilesBaseDir = “$buildDir/contracts”

}

solidity {

executable = “solc”

}

4、执行gradle构建

在最后一步中,我们使用。/gradlew tasks执行构建--all并验证我们生成的wrapper类是否已生成。

49ab59302608a4477cc817efae472e4c.png

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/459143.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Matlab与C/C++混合编程调用OpenCV

*************************************************** 更多精彩,欢迎进入:http://shop115376623.taobao.com http://item.taobao.com/item.htm?spma1z10.5-c.w4002-9510581626.24.ZO6sko&id43401674106 精通MATLAB混合编程视频讲解 MATLAB各类函数…

python 程序打包 vscode_使用VScode编写python程序并打包成.exe文件

听说Visual Studio Code(VS Code)的诸多好处,了解了一下果真很喜欢,我喜欢它的缘由主要有3个,一是VS Code开源且跨平台,二是由于其界面很是酷,三是能够知足个人大所属代码需求,除此以外固然还有强大的好奇心…

使用命名空间、头文件和实现文件

*************************************************** 更多精彩,欢迎进入:http://shop115376623.taobao.com *************************************************** 2.3 使用命名空间、头文件和实现文件 使新的throttle类满足程序的需求将是非常…

Permissions for id_rsa are too open

为什么80%的码农都做不了架构师?>>> Last week I was lucky enough to have my laptop upgraded (yay SSD) which meant I needed to configure a new install of OSX Lion. Most of my files are stored online (email, documents, code, etc) but I m…

java看图_看图吧,Java

package salary;import java.awt.*;import javax.swing.*;import java.awt.event.*;import java.text.NumberFormat;public class Salary extends JFrame{//声明标签private JLabel numl;private JLabel basel;private JLabel salel;//声明文本框private JTextField numf;priva…

【MPI学习3】MPI并行程序设计模式:不同通信模式MPI并行程序的设计

学习了MPI四种通信模式 及其函数用法: (1)标准通信模式:MPI_SEND (2)缓存通信模式:MPI_BSEND (3)同步通信模式:MPI_SSEND (4)就绪通信…

shiro使用jdbc_realm登录验证

2019独角兽企业重金招聘Python工程师标准>>> pom.xml <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://maven.apache.org/POM/4.0.0 http://maven…

Javascript 严格模式详解

一、概述 除了正常运行模式&#xff0c;ECMAscript 5添加了第二种运行模式&#xff1a;"严格模式"&#xff08;strict mode&#xff09;。顾名思义&#xff0c;这种模式使得Javascript在更严格的条件下运行。 设立"严格模式"的目的&#xff0c;主要有以下几…

使用tableView崩溃

2019独角兽企业重金招聘Python工程师标准>>> 1错误2 正确 转载于:https://my.oschina.net/u/2601834/blog/618892

Java实现连连看源代码文档_Java实现游戏连连看(有源代码)

Java实现游戏连连看(有源代码) JAVA语言实现连连看游戏 1.课程设计目的 Java语言是当今流行的网络编程语言&#xff0c;它具有面向对象、跨平台、分布应用等特点。面向对象的开发方法是当今世界最流行的开发方法&#xff0c;它不仅具有更贴近自然的语义&#xff0c;而且有利于软…

C语言中auto,register,extern,static【转】

*************************************************** 更多精彩&#xff0c;欢迎进入&#xff1a;http://shop115376623.taobao.com *************************************************** 语言中提供了存储说明符auto&#xff0c;register&#xff0c;extern&#xff0c;stat…

SEO的十种赚钱方式

我深深的想要通过的自己的SEO技术赚钱。其实&#xff0c;掌握一门技术是次要方面&#xff0c;学会把技术变现才是重中之重&#xff0c;所以你说学习SEO重要吗?挺重要&#xff0c;但绝不是最重要的。学SEO的赚钱方式才是最重要的。那么SEO都有哪些赚钱方式呢?我罗列了十种赚钱…

Compile a native C Android application

2019独角兽企业重金招聘Python工程师标准>>> http://www.cnblogs.com/GoAhead/p/4186707.html 通过上网搜索&#xff0c;你可以发现很多种编译Android native应用的方法&#xff0e;我想说的是&#xff0c;不同的控制台应用, 守护程序(daemon), C/C库&#xff0c;等…

J2SE核心实战开发—— 集合类框架

文档都是基于 实验楼 线上环境制作的&#xff0c;因此文档叙述和截图均与其有关。使用其他实验环境也没有太大影响&#xff0c;知识点的操作是类似的。该系列的课程是在 实验楼 实习所原创的第一个课程&#xff0c;欢迎大家多提意见。 一、实验简介 在Java基础语法中&#xff0…

猫和老鼠java下载安装_tomcat(Java服务器)

Tomcat(Java服务器工具)是一款十分优质的Java服务器软件。在中小型系统和并发访问用户不是很多的场合下被普遍使用&#xff0c;是开发和调试JSP 程序的首选。对于一个初学者来说&#xff0c;可以这样认为&#xff0c;当在一台机器上配置好Apache 服务器&#xff0c;可利用它响应…

管道通信

*************************************************** 更多精彩&#xff0c;欢迎进入&#xff1a;http://shop115376623.taobao.com *************************************************** 什么是管道&#xff1f; 管道是单向的、先进先出的&#xff0c;它把一个进程的输出和另…

Linux 终端下 dstat 监控工具

dstat 是一个可以取代vmstat&#xff0c;iostat&#xff0c;netstat和ifstat这些命令的多功能产品。dstat克服了这些命令的局限并增加了一些另外的功能&#xff0c;增加了监控项&#xff0c;也变得更灵活了。dstat可以很方便监控系统运行状况并用于基准测试和排除故障。dstat可…

运用HTML5+CSS3和CSS滤镜做的精美的登录界面

原始出处http://chenjinfei.blog.51cto.com/2965201/774865<!DOCTYPE HTML> <html> <head> <meta http-equiv"Content-Type" content"text/html; charsetgb2312"> <meta http-equiv"description" content"运用C…

MyEclipse使用总结——MyEclipse文件查找技巧 ctrl+shift+R ctrl+H

一、查找文件 使用快捷键【ctrlshiftR】弹出弹出文件查找框&#xff0c;如下图所示&#xff1a; 二、查找包含某个字符串的文件 使用快捷键【ctrlH】在弹出对话框中选File Search选项&#xff0c;然后在第一个文本框中粘贴&#xff08;我一般用粘贴&#xff09;或自已手动录入&…

java实现控件绑定数据源_控件(三)——TreeView控件以XmlDataSource控件为数据源实现简单的绑定...

TreeView控件功能非常强大&#xff0c;今天&#xff0c;我们只是窥其一角。我们实现的例子是&#xff1a;TreeView控件与XmlDataSource控件绑定&#xff0c;然后在网页显示选中项。首先我们添加一个xml&#xff0c;取名为tv.xml。在其中写上如下代码&#xff1a;这时我们在defa…