首页 > 其他分享 >NFT 的创建和转移功能实现

NFT 的创建和转移功能实现

时间:2024-11-04 16:08:15浏览次数:1  
标签:tokenId 创建 ethers NFT 合约 transferNFT 转移

如何实现 NFT 合约

1. 什么是 NFT 和 NFT 合约

NFT(Non-Fungible Token,非同质化代币)是一种具有唯一性、不可互换的数字资产,通常用于区块链上实现资产的认证与交易。NFT 合约通过智能合约来管理资产的所有权、交易和访问权限,广泛应用于艺术品、游戏道具和虚拟地产等领域。

2. 选择开发平台

选择合适的区块链平台是 NFT 开发的第一步。主流平台包括:

  • 以太坊:最广泛接受的 NFT 平台,支持 ERC-721 和 ERC-1155 标准。
  • PolygonSolana:提供更低的交易费用和更快的交易速度。

3. 编写基础的 NFT 合约

使用 Solidity 编写 NFT 合约,通常会选择 ERC-721 标准。以下是一个基础的 NFT 合约示例:

solidity
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

import "@openzeppelin/contracts/token/ERC721/ERC721.sol";
import "@openzeppelin/contracts/access/Ownable.sol";

contract MyNFT is ERC721, Ownable {
    uint256 private _tokenIdCounter;

    constructor() ERC721("MyNFT", "MNFT") {}

    // 创建NFT
    function mint(address to) public onlyOwner {
        _safeMint(to, _tokenIdCounter);
        _tokenIdCounter++;
    }

    // 转移NFT
    function transferNFT(address from, address to, uint256 tokenId) public {
        require(_isApprovedOrOwner(msg.sender, tokenId), "Caller is not owner nor approved");
        _safeTransfer(from, to, tokenId, "");
    }
}

4. NFT 转移的基本逻辑

NFT 转移指的是将代币从一个用户地址转移到另一个用户地址。通过 ERC-721 标准中的 transferFromsafeTransferFrom 方法实现:

  • transferFrom:用于非托管交易,不会自动检查接收方地址是否能够处理 NFT。
  • safeTransferFrom:带有安全检查,确保接收方能够处理 NFT。

在上述合约中,transferNFT 方法用于安全地将 NFT 从 from 地址转移到 to 地址,并确保调用者是 NFT 的所有者或被批准的地址。

5. 部署和测试

建议在测试网上(如 Rinkeby 或 Polygon 测试网)部署合约,使用工具如 Remix 或 Hardhat 进行快速迭代和调试。部署后,可以使用 Web3.js 或 ethers.js 与合约交互。

6. 调用转移函数

以下是使用 ethers.js 调用 transferNFT 函数的示例代码:

javascript
// 使用 ethers.js 进行转移
const provider = new ethers.providers.Web3Provider(window.ethereum);
const signer = provider.getSigner();
const nftContract = new ethers.Contract(contractAddress, contractABI, signer);

async function transferNFT(from, to, tokenId) {
    const tx = await nftContract.transferNFT(from, to, tokenId);
    await tx.wait();
    console.log("NFT transferred!");
}

// 调用 transferNFT 函数
transferNFT("0xFromAddress", "0xToAddress", 1);

7. 安全提示

  • 在调用转移函数时,建议使用 safeTransferFrom 以避免 NFT 丢失,特别是在接收方是合约的情况下。
  • 设定严格的访问权限,确保只有授权人才能执行转移。

8. 展示 NFT 合约的应用场景

NFT 合约可以用于多种实际应用,如数字艺术展示、虚拟物品交易等,让读者理解 NFT 合约的潜力与未来发展方向。

9. 总结和展望

通过以上实现,用户可以轻松创建和转移 NFT。这一功能在市场交易和数字收藏品的所有权转让中具有重要作用。未来,NFT 合约可以继续拓展更多功能,如链上存储优化、跨链兼容性和 Gas 费用控制等。

标签:tokenId,创建,ethers,NFT,合约,transferNFT,转移
From: https://www.cnblogs.com/zhanchenjin/p/18525557

相关文章

  • GD32F1x模板工程的创建
    本文根据b站up主高博士_嵌入式的视频来写。视频链接:[2-3]05创建GD32F10x模板工程_哔哩哔哩_bilibili第一章:项目的创建首先创建一个文件夹,这个文件夹用来储存项目。  我们把项目的名字命名为test。  选择自己要使用的芯片,点击ok。 点击三个方块形状形成的按钮出......
  • python-17-包和模块-创建属于自己的python工具包
    python-17-包和模块一.说明python中的基础系列关于组织代码的基本单位就是包和模块,在真实项目中我们不可能将所有代码都写在一起,或者我们的一些工具类库等需要单独处理,方便各模块调用,怎么办?这时候包和模块就来了,可以很方便的帮我们组织代码。来开始我们今天的日拱一卒!。......
  • 如何轻松创建自己的知识竞赛答小序❓
    想要自己动手做一个知识竞赛答小......
  • k8s pod创建过程
    如果是单独的创建一个pod,则其创建过程是这样的:1、首先,驴通过kubectl或其他api客户端I具提交需要创建的pod信息给apiserver;2、apiserver验证客户端的用户权限信息,验证通过开始处理创建请求生成pod对象信息,并将信息存入etcd,然后.返回确认信息给客户端;3、apiserver开始反馈et......
  • Docker | 创建私有库并了解将项目放入和拉取到私有库的流程
    搭建私有库并推送镜像DockerRegistry1.下载Dockerregistry镜像2.运行私有库Registry,相当于本地有个私有Dockerhub3.ubuntu增加ifconfig命令并生成新镜像⭐4.curl验证私服库上有什么镜像什么是curl?5.将新镜像修改符合私服规范的Tag6.修改配置文件使之支持http7.......
  • 干货技巧 | 3分钟创建一个法律咨询AI帮助中心
    搭建一个高效的AI法律咨询帮助中心,不仅能够提升法律服务的效率与质量,还能为客户提供更加便捷、个性化的体验。一个安全性高且在线就能搭建AI帮助中心工具—HelpLook,在短短3分钟内就能创建一个法律咨询AI帮助中心。一、搭建AI法律咨询帮助中心的好处搭建AI法律咨询帮助中......
  • Linux创建用户的bug
    问题描述&解决方案问题今天在创建用户的时候出现了以下的问题:Couldnotchdirtohomedirectoryxxx:Permissiondenied-bash:/xxx/.bash_profile:Permissiondenied出现这个问题的主要原因是,我现在一个用户下创建另一个用户,但是通过的实验发现,Linux不允许这样操作。即......
  • Flink历史服务器History Server部署:创建hdfs存储目录、启动和停止
    运行Flinkjob的集群一旦停止,只能去yarn或本地磁盘上查看日志,不再可以查看作业挂掉之前的运行的WebUI,很难清楚知道作业在挂的那一刻到底发生了什么。如果我们还没有Metrics监控的话,那么完全就只能通过日志去分析和定位问题了,所以如果能还原之前的WebUI,我们可以通......
  • ElasticSearch7.6.x 模板及滚动索引创建及注意事项
    @目录声明:举例说明创建模板+设置滚动索引+读写判断模板是否存在创建模板应用模板创建索引设置滚动索引添加文档,使用“写”别名查询,使用“读”别名本人先关其他文章链接声明:注意点1:滚动索引是设置索引,而非创建索引,且设置一次结果返回"rolled_over":true,则会按照设定规则创建......
  • python openai 通过Function Call 创建自动化任务
    目录一、什么是FunctionCall(函数掉用)1. 功能概述2. 工作原理二、如何实现函数调用1、定义自己的get_weather函数2、给助手添加函数调用3、写好instrction,指导assistant去掉用你定义的方法。4、最后也是最重要的,捕获Assistant的FunctionCall三、常见问题四、......