cocos简单入门web3

一文cocos简单入门web3

前置条件

下面的3.8源码工程

web3.zip (214.2 KB)

COCOS中连接钱包(不支持native)

先安装web3的库,推荐使用ethers,因为包小,函数易读。因为此包不支持cocos的npm安装,所以有两种方法

  • 注入使用:
    var head = document.getElementsByTagName('head')[0],
    script = document.createElement('script');
    script.src = "https://cdn.ethers.io/lib/ethers-5.2.umd.min.js";
    head.appendChild(script);

然后创场景,添加UI按钮事件,来连接钱包。其本质上就是使用metamask的插件来调用metamask的节点来进行web3相关的操作

    const ChainParams = {
        ChainId : 97,
        ChainName:"BSC Test",
        RpcUrl :"https://data-seed-prebsc-1-s3.binance.org:8545/",
        ExplorerUrl:"https://testnet.bscscan.com/"
    }
    async connectWallet(){
        var ethereum = window['ethereum']
        if (!ethereum) {
            console.log("未安装好metamask?")
            return null
        }
        await ethereum.enable()
        this.ethereum = ethereum;
        this.provider = new ethers.providers.Web3Provider(ethereum);
        this.signer = await this.provider && this.provider.getSigner();
        const { chainId } = await this.provider.getNetwork()
        if(parseInt(chainId) != ChainParams.ChainId){
            console.log("链不对")
            this.switchChainId()
            return null;
        } else {
            this.address = await this.signer.getAddress();
            console.log("链接成功:address:",this.address)
            return this.address
        }
    }

合约调用前序

本章涉及到金额问题,所以我们得获取一些测试的货币(token)。(每个币每个IP地址只能领取一次)

领取测试币地址: BNB Smart Chain: Faucet

领取教程: 4 种办法获得测试 BNB,你一定需要知道_区块链、_加密先生_InfoQ写作社区 ,这边建议需要领取0.1个BNB和10个BUSD

准备合约调用的三要素:

  • 1、合约地址: 我们就使用测试的BUSD地址: 0xeD24FC36d5Ee211Ea25A80239Fb8C4Cfd80f12Ee
  • 2、abi,这个类似于服务器提供的api的列表,BUSD的api地址:Binance USD (BUSD) Token Tracker | BscScan 拉到下面找到Contract ABI,点击右边的复制按钮:

    复制后,在creatro新建ABI.ts,做为常量保存起来,这里命名为TOKEN
  • 3、读合约使用provider(免费读),写合约使用signer(需要燃料费TBNB)

Creator调用合约

合约的函数来源请先了解ethers的官方文档: Signers

第一步我们先读取主币(tBNB)的余额,和代币(BUSD)的余额

新建按钮,加回调

async onClickReadBalance(){
    
    //主币
    var mainBal = await EthersUtils.signer.getBalance()
    this.myblanace.string = "tBNB主币余额: "+ethers.utils.formatUnits(mainBal,18);
    // 代币
    /**
    * new ethers.Contract 三个入参分别为
    * 1、合约地址,当前使用BUSD地址
    * 2、用前面复制下来的abi
    * 3、因为是读取所以直接使用公钥 provider
    */
    var contract = new ethers.Contract(EthersUtils.ChainParams.Token_BUSDAddress,ABI.Token,EthersUtils.provider);
    var bal = await contract.balanceOf(EthersUtils.address);
    this.myblanace.string += "\nBUSD: "+ ethers.utils.formatUnits(bal,18);
}

正常读取后的余额,我的BUSD是0.0,是没有去免费领取。

为什么是0.0而不是0?那是因为返回的都是bignumber,转过来是string,如果要显示number,需要parseFloat

BUSD转账

如果上一步走通了,那么转账就非常简单了,直接用私钥调用transfer即可

async onClickTransfer(){
    //跟上面不一样的是,要使用私钥 EthersUtils.signer
    var contract = new ethers.Contract(EthersUtils.ChainParams.Token_BUSDAddress,ABI.Token,EthersUtils.signer);
    //这里要特别注意单位,一般的代币小数位都是18位,所以我们得把0.1转为18位小数的bignumber
    var v1 = await contract.transfer(this.transferAddress.string,ethers.utils.parseUnits("0.1",18));
    //操作完成 等待服务器同步完成
    var result = await v1.wait(2);
    console.log("转账完成:",result)
}

触发函数时metamask会弹出一个确认框


这里因为我没有领取测试的BUSD,所以用的另外一个叫TUSD的币测试的。点击确认后约等10多秒即可完成转账。

  • 怎么查看这笔转账?
    成功后打开metamask这个界面


    点击这条转账,然后点击后续界面上的在"区块浏览器上查看"即可
2赞

的确不支持。如果能支持以下方式的使用,你觉得如何:

import ethers from 'https://cdn.ethers.io/lib/ethers-5.2.umd.min.js';