知世金融网专注于股票行情,期货开户,外汇储备等最新相关资讯信息提供投资者参考学习!

当前位置:网站首页 > 区块链 > 正文

从您的智能合同生成Java封装器

原创
文章作者
知世-金融领域资深作者
知名金融领域作者,从事金融超过十余年,在行业内有一定影响力。
金融风险管理师认证证书 常识职业资格认证 特许金融分析师 国际金融理财师认证证书
发布时间:2020-02-16 12:57:13 发布来源:区块链研究实验室 文章点击:177

在本文中,我们将了解如何直接从智能合约生成Java Wrapper类以与Java中的智能合约进行交互。 从智能合约生成Java Wrapper类有不同的方法: 1. Web3j命令行工具和solc 2. Web3j命令行工具和Truf...

目录

    本文标题从您的智能合同生成Java封装器,作者:知世,本文有3680个文字,大小约为13KB,预计阅读时间10分钟,请您欣赏。知世金融网众多优秀文章,如果想要浏览更多相关文章,请使用网站导航的搜索进行搜索。本站虽然不乏优秀之作,但仅作为投资者学习参考。

    在本文中,我们将了解如何直接从智能合约生成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
    + [email protected]
    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并自动添加到类路径中。

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

    本文相关推荐: 如何使用Hyperledger Caliper在谷歌云上测试您的区块链

    以上便是知世金融网给大家分享的关于从您的智能合同生成Java封装器/qkl/26923.html的相关信息了,希望能帮助到大家,更多金融相关信息,敬请关注知世金融网!

    网站内容均来自互联网,如侵害您的利益联系客服进行删除!

    关键词:您的
    (0)
    (0)

    上一篇:区块链影响电子商务行业的5种方式

    下一篇:Proof of Life:为什么说biteb是一种生命体?

    本文标题:从您的智能合同生成Java封装器

    本文地址:/index.php?s=article&c=search&keyword=%E6%82%A8%E7%9A%84

    金融知名领域

    南方财富网 | 金融界 | 金融界 |

    更多推荐

    • 茅台吃饱,经销商哭倒
      茅台吃饱,经销商哭倒
    • 汇金的五次增持从短期看具有一定的“稳定器“作用,但从市场表现看效果逐次递减
      汇金的五次增持从短期看具有一定的“稳定器“作用,但从市场表现看效果逐次递减
    • 158亿元!比亚迪收购!
      158亿元!比亚迪收购!
    • 9月价格回落近五成 “冷静期”酒店业备战“十一”市场
      9月价格回落近五成 “冷静期”酒店业备战“十一”市场
    • 2023哈马博览会哈尔滨银行展区精彩纷呈
      2023哈马博览会哈尔滨银行展区精彩纷呈
    • 大额解禁撂倒股价 医疗影像龙头跌出千亿俱乐部 葛兰二季度大幅减仓
      大额解禁撂倒股价 医疗影像龙头跌出千亿俱乐部 葛兰二季度大幅减仓
    • A股,又上了热搜!数字要素概念走高多股涨停,锂电池板块走低恩捷股份大举跌停
      A股,又上了热搜!数字要素概念走高多股涨停,锂电池板块走低恩捷股份大举跌停
    • 最新!巨头出手,加仓宁王51%
      最新!巨头出手,加仓宁王51%
    • 600亿巨头暴雷
      600亿巨头暴雷
    • 一天32家!科创板回购潮涌来
      一天32家!科创板回购潮涌来
    • 提振信心实招来了!30余家上市公司密集出手 最高要买10亿
      提振信心实招来了!30余家上市公司密集出手 最高要买10亿
    • 高盛再发50年后预测:2075年印度股市全球市值占比将升4倍 中国升3成
      高盛再发50年后预测:2075年印度股市全球市值占比将升4倍 中国升3成

    新闻资讯栏目

    站长QQ: 2397470084