web3.js调用链上的方法操作NFT区块链MetaMask详解

 更新时间:2022年08月24日 09:32:13   作者:何明暄  
这篇文章主要为大家介绍了web3.js调用链上的方法操作NFT区块链MetaMask详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

实例化链上方法

公司的项目全是区块链项目,最近这个项目是要构建一个链上的游戏社区,目前这个功能是用户可以质押NFT到游戏的链上,然后游戏那边就可以有人去参加竞赛,然后质押人可以赎回NFT。

MetaMask

web3.js

MetaMask

浏览器插件用的是小狐狸MetaMask


网络用的是测试网络Rinkeby,记得切换网络,把设置 > 高级 > 显示测试网络 打开

let hexChainId = window.web3.utils.toHex(4) // 4就是Rinkeby测试网络
await window.ethereum.request({
    method: 'wallet_switchEthereumChain',
    params: [{ chainId: hexChainId }],
})

首先要初始化web3

yarn add web3

import Web3 from 'web3'
export const web3Init = () => {
    // web3初始化
    let web3 = window.web3
    if (typeof web3 !== 'undefined') {
        // web3.currentProvider
        web3 = new Web3(window.ethereum) // 取小狐狸的地址
    } else {
        web3 = new Web3(
            new Web3.providers.HttpProvider(‘项目链接')
        )
    }
    window.web3 = web3 // web3链接
}

现在就把web3挂载到window上了 链接小狐狸 await ethereum.request({ method: 'eth_requestAccounts' })这一句代码就可以,返回的是钱包地址组成的字符串

实例化链

之后就是实例化链了,我是存在vuex里进项目第一步是初始化游戏链,游戏链是固定的

const texasPokerContract = new window.web3.eth.Contract(
    texasPokerJson,
    import.meta.env.VITE_TEXASPOKER_ADDRESS
)

第一个参数就是链的ABI

第二个参数就是项目链上地址

还需要实例一个NFT,但是NFT是不固定的,我们操作哪个NFT就用哪个NFT的链上链接调用这个方法实例,把这两个都存在store里。

调用链上方法授权

export function approve(tokenId) {
    // 授权德州扑克链
    return new Promise((resolve, reject) => {
        const texasPokerContract = store.state.texasPokerContract // 获取德州扑克合约
        const nftContract = store.state.nftContract // 获取当前操作nft的合约
        let optionsData = nftContract.methods.approve(texasPokerContract.options.address, tokenId).encodeABI()
        callContractMethod(optionsData, nftContract, 0, (res) => {
            resolve(res)
        })
    })
}
async function callContractMethod(optionsData, contractExample, values = 0, callback) {
    // 调用合约上的方法
    /**
     * @param optionsData 发送方法的对象
     * @param contractExample 要操作的合约实例
     * @param values value值默认是0
     * @param callback 回调函数
     */
    const account = store.state.persistence.assets // 当前钱包地址
    if (!account) {
        return
    }
    const gasPrice = await window.web3.eth.getGasPrice() // 获取gas费
    let options = {
        from: account,
        to: contractExample.options.address,
        value: values,
        data: optionsData,
        gasPrice: gasPrice,
    }
    window.web3.eth
        .sendTransaction(options)
        .on('error', function (error) {
            console.error('error', error)
            callback && callback(false)
        })
        .then(function () {
            callback && callback(true)
        })
}

这段代码业务性很强,但是根本上也就是调用了window.web3.eth .sendTransaction(options)这个方法

let options = {
    from: account, // 你的当前地址
    to: contractExample.options.address, // 你要操作的链上地址
    value: values, // 方法要带的参数,默认填0
    data: optionsData, // *关键 要调用的方法nftContract.methods.approve(要带的参数).encodeABI()
    gasPrice: gasPrice, // 此次操作的gas费也就是手续费
}

不出意外就可以调起小狐狸进行授权了

调用游戏链上方法质押NFT

这一步跟上一步类似只是之前调用的是NFT链上的方法,现在调用的是我们自己游戏链上的方法

export function pledgeNFT(tokenId, amountp, timer) {
    // 质押NFT
    /**
     * @param tokenId tokenId
     * @param amountp 质押价格
     * @param timer 质押天数的时间戳
     */
    return new Promise(async (resolve, reject) => {
        const texasPokerContract = store.state.texasPokerContract // 获取德州扑克合约
        const getBlockTimes = await texasPokerContract.methods.getBlockTime().call() // 获取区块链时间
        const nftContract = store.state.nftContract // 获取当前操作nft的合约
        const token = nftContract.options.address
        const amount = window.web3.utils.toWei(amountp.toString(), 'ether')
        const unlockTime = Number(getBlockTimes) + Number(timer)
        let optionsData = texasPokerContract.methods.pledgeNFT(token, tokenId, amount, unlockTime).encodeABI()
        callContractMethod(optionsData, texasPokerContract, 0, (res) => {
            resolve(res)
        })
    })
}

最后发送的时候记得把to改成对应的地址

在授权之前我们还需要判断这个NFT是否已经授权给了我们,不然用户将支付多份手续费

export async function getApproved(tokenId) {
    // 查询该NFT tokenId 是否已授权给Game合约
    const nftContract = store.state.nftContract // 获取当前操作nft的合约
    return await nftContract.methods.getApproved(tokenId).call()
}

这次调用的是call方法,这个就相当于前端的get,是直接回调的,会返回这个NFT已经授权的链地址,我们直接进行判断就好

现在从查询,到授权,到质押NFT这一套流程就走完了,以上就是web3.js调用链上的方法操作NFT区块链MetaMask详解的详细内容,更多关于web3.js操作NFT区块链MetaMask的资料请关注脚本之家其它相关文章!

相关文章

  • TypeScript接口介绍

    TypeScript接口介绍

    这篇文章主要介绍了TypeScript接口,接口的作用就是为这些类型命名和为你的代码或第三方代码定义契约。下面我们一起进入文章看看TypeScript接口得具体定义吧,需要的朋友也可以参考一下
    2021-12-12
  • JavaScript HTML DOM元素 节点操作汇总

    JavaScript HTML DOM元素 节点操作汇总

    这篇文章主要介绍了JavaScript HTML DOM元素 节点操作汇总,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-07-07
  • js回调函数仿360开机

    js回调函数仿360开机

    这篇文章主要为大家详细介绍了js回调函数仿360开机,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-12-12
  • JavaScript中极易出错的操作符运算总结

    JavaScript中极易出错的操作符运算总结

    这篇文章主要给大家介绍了关于JavaScript中极易出错的操作符运算的相关资料,包括了算术运算符、比较运算符、逻辑运算符、赋值运算符、一元运算符以及运算优先级等问题,需要的朋友可以参考下
    2021-08-08
  • JS简单实现多级Select联动菜单效果代码

    JS简单实现多级Select联动菜单效果代码

    这篇文章主要介绍了JS简单实现多级Select联动菜单效果代码,涉及JavaScript数组元素的遍历及动态设置select的实现技巧,需要的朋友可以参考下
    2015-09-09
  • JavaScript中字符串的常用方法总结

    JavaScript中字符串的常用方法总结

    这篇文章主要为大家总结了一些JavaScript中字符串的常用方法,文中的示例代码讲解详细,对我们学习JavaScript有一定的帮助,需要的可以参考一下
    2022-12-12
  • js实现简单的拖拽效果

    js实现简单的拖拽效果

    这篇文章主要为大家详细介绍了js实现简单的拖拽效果,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-09-09
  • js设置和获取自定义属性的方法

    js设置和获取自定义属性的方法

    下面小编就为大家带来一篇js设置和获取自定义属性的方法。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-10-10
  • ES6知识点整理之数组解构和字符串解构的应用示例

    ES6知识点整理之数组解构和字符串解构的应用示例

    这篇文章主要介绍了ES6知识点整理之数组解构和字符串解构的应用,结合实例形式分析了ES6数组解构和字符串解构的实现方法及相关操作注意事项,需要的朋友可以参考下
    2019-04-04
  • 模拟javascript中的sort排序(简单实例)

    模拟javascript中的sort排序(简单实例)

    下面小编就为大家带来一篇模拟javascript中的sort排序(简单实例)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-08-08

最新评论