区块链研究实验室|从您的智能合同生成Java封装器

  • 时间:
  • 浏览:57
  • 来源:区块链技术网

在本文中,我们将了解如何直接从智能合约生成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);
}

1

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

1

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,您可以做的比本文中显示的更多,例如部署脚本(迁移)、多网络配置、测试、调试。

1

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并自动添加到类路径中。

 

1

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类是否已生成。

相关阅读:

区块链研究实验室|在Java中监听以太坊智能合约事件

猜你喜欢

区块链红利吃饱后,这个巨头又想"征服"元宇宙?

据12月26日消息,百度与英伟达(NVIDIA)已达成协议,双方合作共建AI元宇宙。另外,在今日举行的百度AI开发者大会上,英伟达全球副总裁暨亚太区总裁 Raymond Teh将受邀出席,并发表主题演讲。

2021-12-27

2021年,区块链股权融资发生了怎么样的演变

过去一年,区块链行业融资井喷,在科技领域中独树一帜,A16z、红杉、老虎基金等等这些顶级机构在 2021 年的区块链行业肆意驰骋,在 DeFi、NFT、Metaverse 等领域扶持了一众创业项目。

2021-12-23

两个元宇宙的世界观,以及和区块链的关系

“元宇宙”这个名词音好听但义很难传达准确,想要更准确地理解义,取名为平行宇宙、竞争宇宙、山寨宇宙,更好。对应的,我们现在肉身所处的宇宙,我们称之为“肉身宇宙”。

2021-12-22

Alien Worlds(外星世界)区块链打金挖矿指南

Alien Worlds(外星世界)是一款4月就开始的游戏,10月27日又上线了全新的任务(Missions)游戏模式; 在WAX用户量排名中Alien Worlds(外星世界)一直排在前三,说明现在存量工作室还有很多;

2021-12-17

DeHorizon(地平线)区块链打金教程

今天我们就解析在一款社交主题游戏 — DeHorizon

2021-12-17