java调用区块链智能合约
Posted smile2850
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java调用区块链智能合约相关的知识,希望对你有一定的参考价值。
背景:
笔者学习了一段时间区块链,打算做一个区块链去中心化应用(DAPP)。智能合约已经通过remix部署到了kovan测试链上,这篇文章介绍用Java版本的web3j框架与链上合约进行交互。
1.导入web3j相关插件和依赖
参考web3j官方教程
Quickstart - Web3j
pom.xml中添加web3j-maven-plugin插件
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
<plugin>
<groupId>org.web3j</groupId>
<artifactId>web3j-maven-plugin</artifactId>
<configuration>
<soliditySourceFiles/>
</configuration>
</plugin>
</plugins>
</build>
pom.xml中添加web3j的依赖
<dependency>
<groupId>org.web3j</groupId>
<artifactId>core</artifactId>
<version>4.8.7</version>
</dependency>
2.生成java包装类
将合约文件拷到src/main/resources下,终端执行如下命令:
mvn web3j:generate-sources
执行成功,能在src/java/org/web3j/model中看到生成的包装类
3.调用合约
下面用的是官方教程里的例子,需要改动的地方如下:
<your_node_url>填写区块链节点
HelloWorld改成自己生成的包装类的名称(一般和合约名称一致)
<your_contract_address>填写合约的地址(用区块链浏览器查询合约地址)
your_private_key填写自己以太坊钱币的私钥
greeting()改成想调用某个合约函数
Web3j web3j = Web3j.build(new HttpService("<your_node_url>"));
String greeting;
HelloWorld helloWorld = HelloWorld.load("your_contract_address", web3j, Credentials.create("your_private_key"), new DefaultGasProvider());
if (helloWorld.isValid())
greeting = helloWorld.greeting().send();
web3j.shutdown();
4.可能遇到的问题
(1)如果用的是Spring Boot,Spring Boot在包管理时,会把okhttp的包版本默认为3.xx版本。但是,较高版本的web3j(4.8.7),需要用到4版本的okhttp。
解决方案:
pom.xml中加入如下代码
<properties>
<okhttp3.version>4.9.0</okhttp3.version>
</properties>
(2) your_node_url应该填什么?
如果是私链,填本机的对应端口。
如果是公链,建议用Infura进行代理。
以上是关于java调用区块链智能合约的主要内容,如果未能解决你的问题,请参考以下文章
用Java为Hyperledger Fabric(超级账本)编写区块链智能合约链代码
Hyperledger Fabric 2.x Java区块链应用
手把手教你区块链java开发智能合约nft-第五篇(铸造第一个NFT)