0xTrustTryEP

Just do it, deeply...

Follow me on GitHub

打包以太坊智能合约工具

write by donaldhan, 2020-05-19 10:01

引言

以太坊的合约大多是使用solidity语言进行开发,部署起来比较繁琐;好在是以太坊社区提供各种语言的合约转换工具,比如java,go,python。针对服务器开发人员, 在solidity开发调试完的基础,如何将合约部署到区块链,我们可以使用设计提供的web3j相关的工具和插件,将合约打包成Java合约,解放我们服务人员部署合约的成本。 今天我们就来看一下打包solidity合约的相关工具。

目录

web3j命令行模式

安装solidity编译器

solidity

下载并配置环境变量

使用如下命令,生成bin和abi文件

solc Ballot.sol --bin --abi --optimize -o bin
F:\github\boot_test\src\main\resources\contract>solc Ballot.sol --bin --abi --optimize -o bin
Refusing to overwrite existing file "bin\Ballot.bin" (use --overwrite to force).
Refusing to overwrite existing file "bin\Ballot.abi" (use --overwrite to force).

安装web3j命令行

web3j commod

下载并配置环境变量 使用如下命令生成JAVA CONTRACT

web3j solidity generate bin/Ballot.bin bin/Ballot.abi -o F:\github\boot_test\src\main\java -p org.home.contract
F:\github\boot_test\src\main\resources\contract>web3j solidity generate bin/Ballot.bin bin/Ballot.abi -o F:\github\boot_test\src\main\java -p org.home.contract

              _      _____ _     _
             | |    |____ (_)   (_)
__      _____| |__      / /_     _   ___
\ \ /\ / / _ \ '_ \     \ \ |   | | / _ \
 \ V  V /  __/ |_) |.___/ / | _ | || (_) |
  \_/\_/ \___|_.__/ \____/| |(_)|_| \___/
                         _/ |
                        |__/

Generating org.home.contract.Ballot ... File written to F:\github\boot_test\src\main\java

另外我们可以使用VS solidit编译合约生成bin和abi文件, 见附篇。

当前我们可以使用web3j-maven-plugin去生成合约

web3j-maven-plugin

web3j-maven-plugin

具体配置如下:

<plugin>
    <groupId>org.web3j</groupId>
    <artifactId>web3j-maven-plugin</artifactId>
    <version>4.5.11</version>
    <configuration>
        <packageName>org.home.contract</packageName>
        <sourceDestination>src/main/java</sourceDestination>
        <nativeJavaType>true</nativeJavaType>
        <outputFormat>java,bin,abi</outputFormat>
        <soliditySourceFiles>
            <directory>src/main/resources/contract</directory>
            <includes>
                <include>**/*.sol</include>
            </includes>
        </soliditySourceFiles>
        <outputDirectory>
            <java>src/main/java</java>
            <bin>src/main/resources/bin</bin>
            <abi>src/main/resources/abi</abi>
        </outputDirectory>
        <contract>
            <includes>
                <include>MetaCoin</include>
            </includes>
            <excludes>
                <exclude>Ballot</exclude>
            </excludes>
        </contract>
        <pathPrefixes>
            <pathPrefix>dep=../dependencies</pathPrefix>
        </pathPrefixes>
    </configuration>
</plugin>

web3j codegen

使用web3j的codegen模块,我们基于SolidityFunctionWrapperGenerator生成Java版本的合约。除此之外,还可以根据tuffle编译的JSON生成,使用TruffleJsonFunctionWrapperGenerator生成JAVA合约。

首先引入相应的JAR

<dependency>
            <groupId>org.web3j</groupId>
            <artifactId>codegen</artifactId>
            <version>4.5.5</version>
</dependency>

SolidityFunctionWrapperGenerator example

tuffle 生成生成JAVA合约

首先使用tuffle编译合约,根据编译后的json文件,包装成JAVA合约 命令如下

web3j  truffle generate ./build/contracts/MetaCoin.json -o . -p org.home.contract

IntelliJ solidity

IntelliJ solidity插件, 编译合约

总结

建议使用web3j-maven-plugin这种方式。

VS solidity插件

首选我们需要安装solidity插件 Solidity is the language used in Ethereum to create smart contracts, this extension provides:

我们可以使用F5直接编译,我们可以使用指定的版本,去编译合约;

我们也可以指定solidity版本去编译合约, 选型如下:

Solidity:change workspace/global compiler version(remote)

建议改变workspace即可;

solc-bin

Windows下程序启动时出现0xc000007b错误的解决方案

solc 无法执行的0xc000007b错误, 主要由于exe依赖的C的运行时环境缺失导致,可以下面的官方连接下载Microsoft C 和 C++ (MSVC) 运行时库Visual C++ 可再发行程序包

Microsoft Visual C++ 可再发行程序包最新支持的下载

Windows下程序启动时出现0xc000007b错误的解决方案

引用文献

How to interact with Smart contract using JAVA
Not able to generate java wrapper class from solidity smart contract using truffle
通过java打包以太坊智能合约
web3j用于solidity智能合约maven插件
vscode开发solidity配置及注意事项

问题集

Solidity Compiler not installed web3j-maven-plugin

问题原因: 系统中已经安装,idea终端无法找到,主要是路径不对,修改路径后也没有, 主要是idea会在开机首次打开时加载path并序列化到自己的配置文件中,即使重启IDEA也只是重新加载自己的配置文件。我们可以在命令行,手动设置path;

set PATH=D:\Python\Scripts\;D:\Python\;C:\ProgramData\Oracle\Java\javapath;C:\WINDOWS\system32;C:\WINDOWS;C:\WINDOWS\System32\Wbem;C:\WINDOWS\System32\WindowsPowerShell\v1.0\;D:\gi
tbash\Git\cmd;D:\apache-maven-3.5.3\bin;D:\jdk-8u162\bin;E:\Zookeeper\zookeeper-3.4.12\bin;C:\WINDOWS\System32\OpenSSH\;D:\groovy-2.4.15\bin;D:\gradle-4.8\bin;D:\graphviz-2.38\release\bin;D:\nodejs\;D
:\nodejs\;D:\geth;%SOLIDITY_HOME%;%WEB3J_HOME%\bin;C:\Users\hanshaoqing\AppData\Local\Microsoft\WindowsApps;C:\Users\hanshaoqing\AppData\Local\atom\bin;D:\Fiddler;C:\Users\hanshaoqing\AppData\Local\Mi
crosoft\WindowsApps;C:\Users\hanshaoqing\AppData\Roaming\npm;D:\VSCode\Microsoft VS Code\bin;D:\Pycharm\PyCharm Community Edition 2019.1.3\bin;