栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

Java与智能合约交互(Web3j)- read函数

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Java与智能合约交互(Web3j)- read函数

说在前头

Web3是一种新兴的网络概念,由于某些原因导致我们能够接触到的相关技术知识实在有限,每当我遇见技术瓶颈总是不能找到充足的资料,这也让我萌生了填补这片空白知识的冲动。“Hello Web3” 这个专栏会尽力将我掌握的web3 知识分享给大家。如果分享的知识能帮助到大家,希望能够 关注、点赞 支持作者!

Java与智能合约交互(Web3j)

之所以选择利用java与智能合约进行交互,完全是因为本人只会Java,并且Java是世界上最好的语言。

能干什么

  • 监控合约状态,读取合约的关键参数,可作为后台数据源。
  • 转账、授权等基础交互。
  • 实现例如抢购、提挖买等复杂交互。

代码分享

引入依赖

    
        org.web3j
        core
        5.0.0
    

新建Web3j对象

Web3j web3 = Web3j.build(new HttpService(rpcUrl));
  • rpcUrl变量是区块链网络节点的url链接,这些节点会提供很多标准的api方法通过该url进行调用,web3j模块就是在此api上进行封装。
  • 不同网络的rpcUrl可以在对应的区块链浏览器api文档上找到,百度关键字也很容易获取。

调用智能合约的只读函数

    
    public List readContract(String contractAddress, String functionName, List input, List> output) throws Exception {
        // 生成需要调用函数的data
        Function function = new Function(functionName, input, output);
        String data = FunctionEncoder.encode(function);
        // 组建请求的参数
        EthCall response = web3.ethCall(
                Transaction.createEthCallTransaction(ownerAddress, contractAddress, data),
                DefaultBlockParameterName.LATEST)
                .send();
        // 解析返回结果
        return FunctionReturnDecoder.decode(
                response.getValue(), function.getOutputParameters());
    }
  • contractAddress参数代表智能合约的地址,如"0x123456789…"
  • functionName参数代表需要调用合约中写函数的函数名,比如查询代币余额,该参数传"balanceOf"
  • input参数表示合约函数需要传入的参数,参数类型需要与solidity函数参数类型保持一致
    • 例子:Arrays.asList(new Address(“0x6dF655480F465DC36347a5616E875D155804F0c5”), new Uint256(10000000));
    • solidity的各类变量类型在web3j库中均有封装
  • output参数表示合约函数返回的参数类型,参数类型需要与solidity函数返回类型保持一致
    • 例子:Arrays.asList(new TypeReference(){});
    • solidity函数可能会返回多个不同类型的返回值

查询代币余额的代码示例

    
    public String balanceOf(String contractAddress, String address) throws Exception {
        List input = Arrays.asList(new Address(address));
        List output = Arrays.asList(new TypeReference() {
        });
        List result = readContract(contractAddress, "balanceOf", input, output);
        Uint256 balance = (Uint256) result.get(0);
        return Convert.fromWei(balance.getValue().toString(), Convert.Unit.ETHER).toString();
    }

  • output数组传入的长度决定readContract方法返回值数组的长度
  • 1 ether = 1^18 wei,由于链上大部分的代币精度都是18位小数,这里直接做通用处理

掌握这些知识点最好的方法是自己将代码跑起来,去链上获取你想获取的信息

欢迎关注本专栏,作者知无不言~

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/860240.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号