美文网首页区块链技术与金融区块链研习社白话区块链
以太坊Web3j命令行生成Java版本的智能合约

以太坊Web3j命令行生成Java版本的智能合约

作者: 唠嗑008 | 来源:发表于2018-10-11 15:16 被阅读16次

注意

以下内容为Mac环境下测试的,windows也是类似的。

准备工具

solc环境安装
web3j命令行工具安装

  • solc环境

npm install -g solc

  • web3j环境

brew tap web3j/web3j
brew install web3j

编写合约

我这里准备了一个例子:SimpleStorage.sol

pragma solidity ^0.4.0;

contract SimpleStorage {
    uint storedData;
    function set(uint num){
        storedData = num;
    }
    
    function get() constant returns (uint retVal){
        return storedData;
    }
}

编译合约(sol)

solc <contract>.sol --bin --abi --optimize -o <output-dir>
例如:
solc SimpleStorage.sol --bin --abi --optimize -o /Users/zx/Desktop

<contract>.sol:是sol合约文件所在的目录,我的sol在Mac桌面上。
<output-dir>:编译生成的bin、abi文件的输出目录

比如,我这里就在桌面上生成了2个文件SimpleStorage.binSimpleStorage.abi

生成 .java文件(web3j)

web3j solidity generate [--javaTypes|--solidityTypes] /path/to/<smart-contract>.bin /path/to/<smart-contract>.abi -o /path/to/src/main/java -p com.your.organisation.name
例如:
web3j solidity generate --javaTypes /Users/zx/Desktop/SimpleStorage.bin /Users/zx/Desktop/SimpleStorage.abi -o /Users/zx/Desktop -p com.example.zhouxu.ethwallet.contract

/path/to/<smart-contract>.bin:上一步生成的bin文件的目录
/path/to/<smart-contract>.abi:上一步生成的abi文件的目录
/path/to/src/main/java:生成的java文件的输出目录
com.your.organisation.name:生成的java文件的包名

生成的java文件

/**
 * <p>Auto generated code.
 * <p><strong>Do not modify!</strong>
 * <p>Please use the <a href="https://docs.web3j.io/command_line.html">web3j command line tools</a>,
 * or the org.web3j.codegen.SolidityFunctionWrapperGenerator in the 
 * <a href="https://github.com/web3j/web3j/tree/master/codegen">codegen module</a> to update.
 *
 * <p>Generated with web3j version 3.6.0.
 */
public class SimpleStorage extends Contract {
    private static final String BINARY = "608060405234801561001057600080fd5b5060bf8061001f6000396000f30060806040526004361060485763ffffffff7c010000000000000000000000000000000000000000000000000000000060003504166360fe47b18114604d5780636d4ce63c146064575b600080fd5b348015605857600080fd5b5060626004356088565b005b348015606f57600080fd5b506076608d565b60408051918252519081900360200190f35b600055565b600054905600a165627a7a7230582023172d55cc4cc6aeec159e78e69150d6a73cadc17eebbf2ddaaffcdf042ce3a50029";

    public static final String FUNC_SET = "set";

    public static final String FUNC_GET = "get";

    @Deprecated
    protected SimpleStorage(String contractAddress, Web3j web3j, Credentials credentials, BigInteger gasPrice, BigInteger gasLimit) {
        super(BINARY, contractAddress, web3j, credentials, gasPrice, gasLimit);
    }



    @Deprecated
    protected SimpleStorage(String contractAddress, Web3j web3j, TransactionManager transactionManager, BigInteger gasPrice, BigInteger gasLimit) {
        super(BINARY, contractAddress, web3j, transactionManager, gasPrice, gasLimit);
    }



    public RemoteCall<TransactionReceipt> set(BigInteger num) {
        final Function function = new Function(
                FUNC_SET, 
                Arrays.<Type>asList(new Uint256(num)),
                Collections.<TypeReference<?>>emptyList());
        return executeRemoteCallTransaction(function);
    }

    public RemoteCall<BigInteger> get() {
        final Function function = new Function(FUNC_GET, 
                Arrays.<Type>asList(), 
                Arrays.<TypeReference<?>>asList(new TypeReference<Uint256>() {}));
        return executeRemoteCallSingleValueReturn(function, BigInteger.class);
    }



    @Deprecated
    public static RemoteCall<SimpleStorage> deploy(Web3j web3j, Credentials credentials, BigInteger gasPrice, BigInteger gasLimit) {
        return deployRemoteCall(SimpleStorage.class, web3j, credentials, gasPrice, gasLimit, BINARY, "");
    }



    @Deprecated
    public static RemoteCall<SimpleStorage> deploy(Web3j web3j, TransactionManager transactionManager, BigInteger gasPrice, BigInteger gasLimit) {
        return deployRemoteCall(SimpleStorage.class, web3j, transactionManager, gasPrice, gasLimit, BINARY, "");
    }

    @Deprecated
    public static SimpleStorage load(String contractAddress, Web3j web3j, Credentials credentials, BigInteger gasPrice, BigInteger gasLimit) {
        return new SimpleStorage(contractAddress, web3j, credentials, gasPrice, gasLimit);
    }

    @Deprecated
    public static SimpleStorage load(String contractAddress, Web3j web3j, TransactionManager transactionManager, BigInteger gasPrice, BigInteger gasLimit) {
        return new SimpleStorage(contractAddress, web3j, transactionManager, gasPrice, gasLimit);
    }

}

合约交互

生成合约的java文件之后,就把它放入项目对应的包下面,然后可以利用Web3j和合约交互了。所谓的交互就是java/Android调用刚才生成的这个合约的一些方法,具体的细节,我们下一篇再讲解。

相关文章

网友评论

    本文标题:以太坊Web3j命令行生成Java版本的智能合约

    本文链接:https://www.haomeiwen.com/subject/ebjbaftx.html