这篇文章的内容主要围绕Java如何使用web3j调用智能合约进行讲述,文章内容清晰易懂,条理清晰,非常适合新手学习,值得大家去阅读。感兴趣的朋友可以跟随小编一起阅读吧。希望大家通过这篇文章有所收获!
1.Java程序引入相关依赖,后面用于调用智能合约中的函数
<!-- https://mvnrepository.com/artifact/org.web3j/core --> <dependency> <groupId>org.web3j</groupId> <artifactId>core</artifactId> <version>5.0.0</version> </dependency> <dependency> <groupId>org.web3j</groupId> <artifactId>codegen</artifactId> <version>5.0.0</version> </dependency> <!-- 由于ether-camp/solcJ不再维护,所以使用了FISCO-BCOS/solcj --> <dependency> <groupId>org.fisco-bcos</groupId> <artifactId>solcJ</artifactId> <version>0.5.2.0</version> </dependency> <!-- https://mvnrepository.com/artifact/commons-io/commons-io --> <dependency> <groupId>commons-io</groupId> <artifactId>commons-io</artifactId> <version>2.4</version> </dependency> <!-- https://mvnrepository.com/artifact/com.squareup.okhttp3/okhttp --> <dependency> <groupId>com.squareup.okhttp3</groupId> <artifactId>okhttp</artifactId> <version>4.4.0</version> </dependency> <!-- https://mvnrepository.com/artifact/com.squareup.okhttp3/okhttp-ws --> <dependency> <groupId>com.squareup.okhttp3</groupId> <artifactId>okhttp-ws</artifactId> <version>3.4.2</version> </dependency>
2.将合约使用remix进行编译
编译后,复制abi、Bytecode,放入指定位置,生成abi和bin文件
@Test void generateABIAndBIN() { String abi = "abi复制放这里"; String bin = "bin复制过来放这里"; String abiFileName = "abi文件名.abi"; String binFileName = "bin文件名.bin"; File abiFile = new File("E:\\solidity\\xx\\xx\\"+ abiFileName); File binFile = new File("E:\\solidity\\xx\\xx\\"+ binFileName); if (!abiFile.getParentFile().exists()) { boolean result = abiFile.getParentFile().mkdirs(); if (!result) { System.out.println("创建失败"); } } BufferedOutputStream abiBos = null; BufferedOutputStream binBos = null; try { FileOutputStream abiFos = new FileOutputStream(abiFile); FileOutputStream binFos = new FileOutputStream(binFile); abiBos = new BufferedOutputStream(abiFos); binBos = new BufferedOutputStream(binFos); abiBos.write(abi.getBytes()); abiBos.flush(); binBos.write(bin.getBytes()); binBos.flush(); }catch (Exception e) { throw new RuntimeException("写入过程出现错误"); }finally { if(abiBos != null) { try { abiBos.close(); } catch (IOException e) { e.printStackTrace(); } } if(binBos != null) { try { binBos.close(); } catch (IOException e) { e.printStackTrace(); } } } }
3.使用codegen生成Java代码(参考https://github.com/maohuihua123/solidity-wrapper-generator)
使用该方法原因(ABI in solidity 0.6.0 does not have constant property which is causing UI libraries to think it's a non-constant method)
@Test public void generateClass() throws IOException, ClassNotFoundException { String[] args = Arrays.asList( "-a", "D:/solidity/xx/xx.abi", "-b", "D:/solidity/xx/xx.bin", "-p", "top.rhynie.xx.contract", "-o", "D:/IDEA_Project/xx/src/main/java" ).toArray(new String[0]); Stream.of(args).forEach(System.out::println); SolidityFunctionWrapperGenerator.main(args); }
4.注册infura获取免费节点
5.java代码调用只能合约代码
@Test void deployContract() throws Exception { Web3j web3 = Web3j.build(new HttpService("https://ropsten.infura.io/v3/xxxx")); String ownAddress = "0x119Eb8E686423E56b7cfc6F211C8CD4a9F71E3Cc"; // Credentials c = WalletUtils.loadCredentials("密码","keystore文件地址"); Credentials credentials = Credentials.create("私钥"); AWToken awToken = AWToken.deploy(web3, credentials, web3.ethGasPrice().send().getGasPrice(), Contract.GAS_LIMIT).send(); System.out.println(awToken.getContractAddress()); // 调用合约的函数 awToken.transfer("0x0", value); }
Java是一门面向对象编程语言,可以编写桌面应用程序、Web应用程序、分布式系统和嵌入式系统应用程序。
感谢你的阅读,相信你对“Java如何使用web3j调用智能合约”这一问题有一定的了解,快去动手实践吧,如果想了解更多相关知识点,可以关注亿速云网站!小编会继续为大家带来更好的文章!
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。