以太坊区块链搭建与使用(六)-基于Java调用以太坊

1,269 阅读1分钟

一、基于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。