实例化链上方法

公司的项目全是区块链项目,最近这个项目是要构建一个链上的游戏社区,目前这个功能是用户可以质押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的资料请关注Devmax其它相关文章!

web3.js调用链上的方法操作NFT区块链MetaMask详解的更多相关文章

  1. Swift正式选用超级账本Fabric技术,节约30%跨境支付成本

    全球安全金融信息服务提供商Swift已经正式选择在自己最突出的区块链项目中使用超级账本Fabric数据库。如果这个区块链概念验证获得成功,Swift全球支付创新倡议主管WimRaymaekers表示这可以节约高达30%与跨境支付相关的核账成本。值得注意的是,这次试验还将尝试利用Swift成员使用的现有标准。Swift的Fabric概念验证正在创建利用该银行信息平台的现有GPI资源。不过,Swift今年已经开放了自己的态度,愿意尝试将区块链技术与自己的业务模式进行可能的整合。

  2. python区块链实现简版网络

    这篇文章主要为大家介绍了python区块链实现简版网络的详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

  3. Python区块链创建Genesis Block教程

    这篇文章主要为大家介绍了Python区块链创建Genesis Block教程详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

  4. HashMap原理及手写实现部分区块链特征

    这篇文章主要为大家介绍了HashMap原理及手写实现部分区块链特征,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

  5. python区块链实现简版工作量证明

    这篇文章主要为大家介绍了python区块链实现简版工作量证明详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

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

    这篇文章主要为大家介绍了web3.js调用链上的方法操作NFT区块链MetaMask详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

  7. python区块链持久化和命令行接口实现简版

    这篇文章主要为大家介绍了python区块链持久化和命令行接口实现简版,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

  8. Python区块链创世块创建教程

    这篇文章主要为大家介绍了Python区块链创世块创建教程,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

  9. python区块链简易版交易实现示例

    这篇文章主要为大家介绍了python区块链简易版交易实现示例,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

  10. python区块链创建多个交易教程

    这篇文章主要为大家介绍了python区块链创建多个交易的实现示例教程,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

随机推荐

  1. js中‘!.’是什么意思

  2. Vue如何指定不编译的文件夹和favicon.ico

    这篇文章主要介绍了Vue如何指定不编译的文件夹和favicon.ico,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

  3. 基于JavaScript编写一个图片转PDF转换器

    本文为大家介绍了一个简单的 JavaScript 项目,可以将图片转换为 PDF 文件。你可以从本地选择任何一张图片,只需点击一下即可将其转换为 PDF 文件,感兴趣的可以动手尝试一下

  4. jquery点赞功能实现代码 点个赞吧!

    点赞功能很多地方都会出现,如何实现爱心点赞功能,这篇文章主要为大家详细介绍了jquery点赞功能实现代码,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

  5. AngularJs上传前预览图片的实例代码

    使用AngularJs进行开发,在项目中,经常会遇到上传图片后,需在一旁预览图片内容,怎么实现这样的功能呢?今天小编给大家分享AugularJs上传前预览图片的实现代码,需要的朋友参考下吧

  6. JavaScript面向对象编程入门教程

    这篇文章主要介绍了JavaScript面向对象编程的相关概念,例如类、对象、属性、方法等面向对象的术语,并以实例讲解各种术语的使用,非常好的一篇面向对象入门教程,其它语言也可以参考哦

  7. jQuery中的通配符选择器使用总结

    通配符在控制input标签时相当好用,这里简单进行了jQuery中的通配符选择器使用总结,需要的朋友可以参考下

  8. javascript 动态调整图片尺寸实现代码

    在自己的网站上更新文章时一个比较常见的问题是:文章插图太宽,使整个网页都变形了。如果对每个插图都先进行缩放再插入的话,太麻烦了。

  9. jquery ajaxfileupload异步上传插件

    这篇文章主要为大家详细介绍了jquery ajaxfileupload异步上传插件,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

  10. React学习之受控组件与数据共享实例分析

    这篇文章主要介绍了React学习之受控组件与数据共享,结合实例形式分析了React受控组件与组件间数据共享相关原理与使用技巧,需要的朋友可以参考下

返回
顶部