• 使用web3j工具生成java版本的智能合约


    这里需要使用的环境 web3j,nodejs

    • 安装编译sol工具
    $ npm install -g solc
    • 保存为hello.sol文件到本地
    pragma solidity 0.4.19;  
    contract hello {  
    function main(uint a) constant returns (uint b)   
        {  
            uint result = a * 8;  
            return result;  
        }  
    }  
    • 编译sol文件
    $ solcjs <sol文件目录>   --optimize  --bin --abi --output-dir <输出目录>
    
    //demo
    $ solcjs F:\hello.sol   --optimize  --bin --abi --output-dir F:\

    出现这种错误

    Failed to write F:F_hello_sol_hello.bin: Error: ENOENT: no such file or directory, open 'F:F_hello_sol_hello.bin'
    Failed to write F:F_hello_sol_hello.abi: Error: ENOENT: no such file or directory, open 'F:F_hello_sol_hello.abi'

    这里有个坑,就是使用solcjs 编译智能合约文件输出到目录会有一个文件夹,这个需要手动创建,我这里输出目录到F:\ 但是它还是要输出到F:\F_ 下,这里的F_文件夹需要我们创建!

    • 编译成功,记录下bin 和 abi后缀的文件
    • 使用web3j工具生成java版本的智能合约
    • web3j 命令行工具下载
    $ web3j solidity generate <编译的bin文件地址> <编译的abi文件地址> -o <输出目录> -p <java包名>
    //demo
    $ web3j solidity generate F:F_hello_sol_hello.bin F:F_hello_sol_hello.abi -o E:ethethsrcmainjava -p xyz.lihang.demo.eth.sol

     PS:使用web3j命令,需要进入https://github.com/web3j/web3j/releases/tag/v3.3.1网站,下载web3j-3.3.1.tar,并解压。

       进入目录bin下,在此目录命令行执行web3j,否则web3j bash命令不存在

    • 生成成功
    package xyz.lihang.demo.eth.sol;
    
    import java.math.BigInteger;
    import java.util.Arrays;
    import org.web3j.abi.TypeReference;
    import org.web3j.abi.datatypes.Function;
    import org.web3j.abi.datatypes.Type;
    import org.web3j.abi.datatypes.generated.Uint256;
    import org.web3j.crypto.Credentials;
    import org.web3j.protocol.Web3j;
    import org.web3j.protocol.core.RemoteCall;
    import org.web3j.tx.Contract;
    import org.web3j.tx.TransactionManager;
    
    /**
     * <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.2.0.
     */
    public class Hello_sol_hello extends Contract {
        private static final String BINARY = "60606040523415600e57600080fd5b609a8061001c6000396000f300606060405260043610603e5763ffffffff7c0100000000000000000000000000000000000000000000000000000000600035041663ab3ae25581146043575b600080fd5b3415604d57600080fd5b60566004356068565b60405190815260200160405180910390f35b600802905600a165627a7a723058200cc51f5dad45190b24189d9f8ff836d704bcebc9862cfd669e054b8c8f19f66c0029";
    
        protected Hello_sol_hello(String contractAddress, Web3j web3j, Credentials credentials, BigInteger gasPrice, BigInteger gasLimit) {
            super(BINARY, contractAddress, web3j, credentials, gasPrice, gasLimit);
        }
    
        protected Hello_sol_hello(String contractAddress, Web3j web3j, TransactionManager transactionManager, BigInteger gasPrice, BigInteger gasLimit) {
            super(BINARY, contractAddress, web3j, transactionManager, gasPrice, gasLimit);
        }
    
        public RemoteCall<BigInteger> main(BigInteger a) {
            Function function = new Function("main", 
                    Arrays.<Type>asList(new org.web3j.abi.datatypes.generated.Uint256(a)), 
                    Arrays.<TypeReference<?>>asList(new TypeReference<Uint256>() {}));
            return executeRemoteCallSingleValueReturn(function, BigInteger.class);
        }
    
        public static RemoteCall<Hello_sol_hello> deploy(Web3j web3j, Credentials credentials, BigInteger gasPrice, BigInteger gasLimit) {
            return deployRemoteCall(Hello_sol_hello.class, web3j, credentials, gasPrice, gasLimit, BINARY, "");
        }
    
        public static RemoteCall<Hello_sol_hello> deploy(Web3j web3j, TransactionManager transactionManager, BigInteger gasPrice, BigInteger gasLimit) {
            return deployRemoteCall(Hello_sol_hello.class, web3j, transactionManager, gasPrice, gasLimit, BINARY, "");
        }
    
        public static Hello_sol_hello load(String contractAddress, Web3j web3j, Credentials credentials, BigInteger gasPrice, BigInteger gasLimit) {
            return new Hello_sol_hello(contractAddress, web3j, credentials, gasPrice, gasLimit);
        }
    
        public static Hello_sol_hello load(String contractAddress, Web3j web3j, TransactionManager transactionManager, BigInteger gasPrice, BigInteger gasLimit) {
            return new Hello_sol_hello(contractAddress, web3j, transactionManager, gasPrice, gasLimit);
        }
    }

    一定要注意合约调用后进行挖矿,这样才能网络确认,才能使用合约

  • 相关阅读:
    js去java的变量
    android:layout_alignLeft=""和android:layout_toLeftOf=""
    c:foreach遍历list
    fragment的getActivity和activity的getapplication实现共享方法和变量
    java.lang.IllegalStateException: commit already called
    选择图片时调用手机拍摄和相册图片
    android:duplicateParentState属性
    java日期事件处理
    汉字字符串编码转换
    JAVA入门到精通-第5讲-类和对象
  • 原文地址:https://www.cnblogs.com/zhangmingcheng/p/8622217.html
Copyright © 2020-2023  润新知