web3j的基础用法-5合约的调用(持续完善中...)

web3j调用智能合约是web3j使用的关键,当前区块链的核心

其实原理很简单

https://github.com/OpenZeppelin/openzeppelin-contracts
这是智能合约优秀的框架,经过了无数安全的效验,目前绝大多数项目引用此相关依赖。
有些函数是固定写法例如claim,deposit,approve等等。

目前web3j使用org.web3j.abi.datatypes.Function , org.web3j.abi.TypeReference,两个核心类将智能合约的方法和参数构造,再通过org.web3j.abi.FunctionEncoder,FunctionEncoder.encode()格式化后Transaction指令就可以了。

package com.we3j.demo.wallet;

import org.web3j.abi.FunctionEncoder;
import org.web3j.abi.FunctionReturnDecoder;
import org.web3j.abi.datatypes.generated.Uint256;
import org.web3j.protocol.Web3j;
import org.web3j.abi.TypeReference;
import org.web3j.abi.datatypes.*;
import org.web3j.protocol.core.DefaultBlockParameterName;
import org.web3j.protocol.core.methods.request.Transaction;
import org.web3j.protocol.core.methods.response.EthCall;

import java.math.BigInteger;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.concurrent.ExecutionException;

/**
 * @Author jambestwick
 * @create 2021/12/5 0005  21:04
 * @email jambestwick@126.com
 * <p>
 * ERC20的代币
 */
public class TokenClient {

    private static String emptyAddress = "0x0000000000000000000000000000000000000000";

    /**
     * 查询代币发行总量
     *
     * @param web3j
     * @param contractAddress
     * @return
     */
    public static BigInteger getTokenTotalSupply(Web3j web3j, String contractAddress) {
        if (web3j == null) return null;
        String methodName = "totalSupply";
        String fromAddr = emptyAddress;
        BigInteger totalSupply = BigInteger.ZERO;
        List<Type> inputParameters = new ArrayList<>();
        List<TypeReference<?>> outputParameters = new ArrayList<>();

        TypeReference<Uint256> typeReference = new TypeReference<Uint256>() {
        };
        outputParameters.add(typeReference);

        Function function = new Function(methodName, inputParameters, outputParameters);

        String data = FunctionEncoder.encode(function);
        Transaction transaction = Transaction.createEthCallTransaction(fromAddr, contractAddress, data);

        EthCall ethCall;
        try {
            ethCall = web3j.ethCall(transaction, DefaultBlockParameterName.LATEST).sendAsync().get();
            List<Type> results = FunctionReturnDecoder.decode(ethCall.getValue(), function.getOutputParameters());
            totalSupply = (BigInteger) results.get(0).getValue();
        } catch (InterruptedException | ExecutionException e) {
            e.printStackTrace();
        }
        return totalSupply;
    }


    /****
     * 调用claim方法抢NFT Token
     * ***/
    public static boolean claimNFT(Web3j web3j, String contractAddress, Integer tokenId) {
        if (web3j == null) return false;
        String methodName = "claim";
        String fromAddr = emptyAddress;
        Function function = new Function(
                methodName,
                Arrays.asList(new Uint256(tokenId)),
                Arrays.asList(new TypeReference<Type>() {
                }));

        String data = FunctionEncoder.encode(function);
        Transaction transaction = Transaction.createEthCallTransaction(fromAddr, contractAddress, data);

        EthCall ethCall;
        try {
            ethCall = web3j.ethCall(transaction, DefaultBlockParameterName.LATEST).sendAsync().get();
            //List<Type> results = FunctionReturnDecoder.decode(ethCall.getValue(), function.getOutputParameters());
        } catch (InterruptedException | ExecutionException e) {
            e.printStackTrace();
        }
        return true;
    }


}

我么以查看Loot的总供应量为例,演示一遍。Loot合约地址:0xff9c1b15b16263c61d017ee9f65c50e4ae0113d7
在这里插入图片描述
总数7779与ethscan一致,Ok。

在这里插入图片描述

项目github地址
https://github.com/jambestwick/we3jdemo

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
1. 引入web3.js库 需要先在HTML文件引入web3.js库,可以从官方网站下载或者使用CDN链接。 ```html <script src="https://cdn.jsdelivr.net/npm/web3@1.3.0/dist/web3.min.js"></script> ``` 2. 连接到以太坊网络 在JavaScript代码,创建一个`Web3`对象并连接到以太坊网络。 ```js // 连接到以太坊网络 const web3 = new Web3(Web3.givenProvider || "http://localhost:8545"); ``` 其,`Web3.givenProvider`是指网页已经连接了以太坊网络,可以直接使用当前提供商,否则指定一个本地的以太坊节点地址。 3. 加载智能合约ABI和地址 需要加载智能合约的ABI和地址,以便使用web3.js调用智能合约的方法。 ```js // 加载合约ABI和地址 const contractABI = [...]; const contractAddress = '0x...'; const myContract = new web3.eth.Contract(contractABI, contractAddress); ``` 4. 调用智能合约方法 调用智能合约的方法可以使用`myContract.methods`属性,该属性包含了智能合约的所有方法。以调用`get()`方法为例: ```js // 调用合约get()方法 myContract.methods.get().call((error, result) => { if (!error) { console.log(result); } else { console.error(error); } }); ``` 其,`call()`方法表示调用智能合约的读取方法(不改变区块链数据),如果是写入方法需要使用`send()`方法。回调函数返回结果或错误信息。 5. 监听智能合约事件 智能合约的事件可以通过`myContract.events`属性进行监听。以监听`Transfer`事件为例: ```js // 监听Transfer事件 const transferEvents = myContract.events.Transfer(); transferEvents.on('data', (event) => { console.log(event.returnValues); }); transferEvents.on('error', console.error); ``` 以上就是使用web3.js调用智能合约的基本流程。涉及到的概念比较复杂,需要深入学习区块链以太坊相关知识。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值