一、基于Java代码如何调用智能合约
- 一般java是基于web3j工具包来调用以太坊中的智能合约,类似的一个web工具包。
- 示例代码参见:
[hanksandy/eth-web3j-samples
gitee.com
](link.zhihu.com/?target=htt…)
二、示例项目搭建
1. 安装nodejs(支持solc编译与安装)
2. 安装solc(solidity智能合约编译环境)
3. 安装web3j(web3j命令行工作,为自动生成java代码)
命令行工具下载地址:github.com/web3j/web3j… 注意下载编码好的zip
– 编码合约:solcjs ./FileHashContract.sol –optimize –bin –abi –output -dir ./
– 生成java调用类:web3j solidity generate FileHashContract.bin FileHashContract.abi -o ./ -p com.hanko.contract
具体可以参考:www.jianshu.com/p/734995ca4…
三、示例代码说明
-
此示例项目实现简单的文件hash存储功能
此测试类为调用的入口:com.hanko.contract.FileHashContractTest
/**
* 一、连接区块链并获取geth客户端版本号
* @throws IOException
*/
@Test
void getVersion() throws IOException {
String version = web3j.web3ClientVersion().send().getWeb3ClientVersion();
log.info(“>>>>>version is {}”,version);
Assert.assertThat(version,startsWith( “Geth/” ));
}/** * 二、部署合约,并返回合约地址。 * @throws IOException */ @Test void deploy() throws Exception { FileHashContract fileHashContract = FileHashContract.deploy(web3j, 复制代码
credentials,contractGasProvider).send();
System.out.println(“fileHashContract.getContractAddress() = ” +
fileHashContract.getContractAddress());} /** * 三、根据第二步返回的合约地址调用合约sethash方法 * @throws IOException */ @Test void setHash() throws Exception { FileHashContract fileHashContract = FileHashContract.load( 复制代码
web3jProperties.getContractAddress(), web3j, credentials, contractGasProvider);
fileHashContract.setHash(“12345678”).send();
}/** * 四、根据第二步返回的合约地址调用合约gethash方法 * @throws IOException */ @Test void getHash() throws Exception { FileHashContract fileHashContract = FileHashContract.load( 复制代码
web3jProperties.getContractAddress(), web3j, credentials, contractGasProvider);
String hash = fileHashContract.getHash().send();
Assert.assertEquals(hash,”12345678″);
log.info(“>>>>>hash is {}”,hash);
}
p.s. com.hanko.contract.FileHashContract是调用的核心类,通过web3j命令行工具直接生成。
//简单的文件hash存储合约
pragma solidity >= 0.4.0;
contract FileHashContract {
string fileHash;
function setHash(string memory hash) public {
fileHash = hash;
}
function getHash() public view returns(string memory){
return fileHash;
}
}
复制代码
p.s. 合约的开发可使用idea 插件_intellij_-solidity 当然编译就在idea配置个External Tools在Setting可以找到。当然你也可以选择remix-ide 等ide。