使用web3j工具生成java版本的智能合约
这里需要使用的环境 web3j,nodejs
- 安装编译sol工具
1 | $ npm install -g solc |
- 保存为hello.sol文件到本地
1 2 3 4 5 6 7 8 | pragma solidity 0.4 . 19 ; contract hello { function main(uint a) constant returns (uint b) { uint result = a * 8 ; return result; } } |
- 编译sol文件
1 2 3 4 | $ solcjs <sol文件目录> --optimize --bin --abi --output-dir <输出目录> //demo $ solcjs F:\\hello.sol --optimize --bin --abi --output-dir F:\\ |
出现这种错误
1 2 | 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 命令行工具下载
1 2 3 | $ 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:\etheth\src\main\java -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命令不存在
- 生成成功
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 | 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); } } |
一定要注意合约调用后进行挖矿,这样才能网络确认,才能使用合约
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
2017-03-22 centos 解决error: rpmdbNextIterator问题 (转)