ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

Java调用智能合约

2021-11-19 19:04:28  阅读:221  来源: 互联网

标签:currentValue 调用 Java contract 智能 地址 address 合约


Web3j让Java开发者可以轻松地访问以太坊区块链并调用区块链上的智能合约的方法,本教程中,将介绍如何创建一个简单的命令行应用来访问区块链上的合约。

1、什么是web3j

现在的Web3j是一个开发包,你可以利用这个开发包快速实现对以太坊/Quorum节点的访问,同时也可以用它为某个智能合约文件生成对应的java封装类,以便在Java应用中调用。

2、节点安装与智能合约部署

首先我们需要搭建一个以太坊网络并部署智能合约,你可以参考这个repo,按照README说明搭建并部署智能合约。

要调用以太坊链上的合约,我们需要两个东西:

  • 钱包私钥
  • 合约地址

在区块链领域,账号通常称为钱包,不过这是一个比较混乱的词语,有时钱包指的是单一地址,有时又指的是包含多个地址的容器。在本文中,一个钱包指的是单一的以太坊地址,

ganache在启动时会列出10个钱包地址以及其对应的私钥。例如:

(0) 11af9e9f87c53beedfe7eb3f1e9b6e2592b382ab3ecd83a92a6c20cb0c885f63
(1) 7cb8f9f70eac9aca70b514a9a8ebd36a3c2c4a9d28dc9534d6042914ed814161
(…)

在这个教程中,我们将使用0#地址,即:

11af9e9f87c53beedfe7eb3f1e9b6e2592b382ab3ecd83a92a6c20cb0c885f63

部署好的合约也类似:

2_deploy_contracts.js
=====================

Deploying ‘SimpleStorage’
————————-

> transaction hash:   0x18f4dffba426a2cd63bddf5b8741f0708729515d178d59df0b2a43c5aa85e646
> Blocks: 0           Seconds: 0
> contract address:   0x3C4c39bd5a928bc19A981c85A00543EEB9f7C795
> account:             0x169C8C361e1CC394C3FFefa52FcaB91704cde2b2
> balance:             99.99147618
(…)

在上面的输出中,注意contract address部分,表示合约的部署地址,即:

contract-address: 0x3C4c39bd5a928bc19A981c85A00543EEB9f7C795

3、智能合约相关工具安装

我们首先需要安装solidity智能合约编译器:

$ npm install -g solc

然后从这里下载web3j命令行工具,解压并设置PATH环境变量,以便可以在任何目录调用。

4、合约的java封装类

首先编译合约并生成java封装类:

$ solc <smart-contract>.sol –bin –abi –optimize -o <output-dir>/

$ web3j solidity generate -b /path/to/<smart-contract>.bin \
        -a /path/to/<smart-contract>.abi \
        -o /path/to/src/main/java \
        -p com.your.organisation.name

5、在Java代码中调用合约

现在我们可以调用合约了:

public class App
{
   // change contract-address
   private static String contractAddress = contract-address;
   // main method
   public static void main(String[] args) {
       // instantiate web3j
       Web3j web3 = Web3j.build(new
          HttpService("http://localhost:9545/"));
       Credentials credentials = Credentials.create(wallet-address);
       // instantiate the contract
       SimpleStorage contract = SimpleStorage.load(
           contractAddress, web3, credentials, new DefaultGasProvider()
       );
       // say hello
       System.out.println("Welcome " + credentials.getAddress());
       // interact with the contract
       try {
           BigInteger currentValue;
           // get value
           currentValue = contract.get().send();
           System.out.println(currentValue.toString());
           // change value
           contract.set(new BigInteger("1")).send();
           // get value
           currentValue = contract.get().send();
           System.out.println(currentValue.toString());
       } catch (Exception e) {
           e.printStackTrace();
       }
   }
}

上面的代码首先用节点URL来初始化Web3j实例,然后使用钱包地址私钥创建一个账户身份凭证对象,并使用合约地址初始化合约,最后调用合约的方法。

标签:currentValue,调用,Java,contract,智能,地址,address,合约
来源: https://www.cnblogs.com/Soy-technology/p/15578717.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有