| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 区块链 -> 揭秘:NFT智能合约到底都干了什么? -> 正文阅读 |
|
[区块链]揭秘:NFT智能合约到底都干了什么? |
NFT智能合约是什么东西? 就是能实现NFT基本功能的在区块链上的代码。 一个NFT智能合约,应该怎么写,应该实现什么功能? 如果你正在学习这方面知识,而且一知半解的样子,本文能让你醍醐灌顶。
一、智能合约是个啥智能合约是区块链上的代码。 人们把代码部署到区块链上,执行它,并把执行结果记录在区块链上。 区块链的安全性保证了代码不可被任何人篡改,代码正确执行(有bug的另说),执行结果不可篡改,并可以予以公开透明的展示。 以上4点的结合,是人类历史上从来没有过的。 二、搞NFT为什么要弄合约因为这样玩更高级。 如果你直接在OpenSea网站上做NFT,也不是不可以,但明显不高级,因为你没有自己的智能合约。 OpenSea的智能合约是它的,不是你的,规则都得听它的。 如果你有自己的合约,NFT的玩法就是按你的来了。 所以,如果要来真的,就自己写代码吧。 三、写NFT合约要实现哪些功能比如你要发行一套“虎虎生威”NFT,你要怎么写合约呢? 这个“虎虎生威”NFT,是一套老虎头像,有10000个,每个都是一个token。 这个合约要实现至少以下几个功能: 1、“铸造”(mint)功能。NFT是非同质化代币,也就是一种“币”(token)了,既然是“币”(说是币,其实只是png图片而已),就要mint(铸造)了。执行一次mint,就会产生一个铸造好的token。 根据我前面的NFT科普文章,所谓铸造,就是在区块链上记载了一个token的ID和其拥有者的地址。 在计算机世界的术语里,有很多这种莫名其妙的说法,说铸造吧,也没有炉子,也没有高温,也没有金属,也没有模具,其实就单纯是个比喻,一开始会让人不习惯,时间长了就好了。
2、转移功能。要能让拥有者把一个token转移给另外一个人。 3、查询功能。要能查询某个token在谁手里,一个人有多少token,等等这种类似功能。 4、元数据功能。元数据这个术语,在老百姓那里说出来有点装。其实就是描述某事物各种属性的信息,比如一个人的元数据,就是他的姓名、性别、年龄、肤色、身份证号码、职业、民族、照片等信息。 一个NFT的元数据,其实是说每个token的元数据,比如在虎虎生威NFT中,有10000个token,每个token都有其元数据,记录老虎头像各种属性的信息,诸如一个老虎的发型、肤色、性别、年龄、姿态、编号,以及存储这个老虎图像的链接。
合约有了元数据功能,提供了 OpenSea之所以可以展示你的NFT token,就是因为它调用你合约的tokenURI,获得元数据中的image项,然后读取图像的。 5、合约元数据功能。如果你想把你的NFT放在OpenSea上作为一个Collection(收藏集)出现,就要让OpenSea能获取关于你Collection的一些基本设置。 合约元数据就是干这事的。 6、其他功能比如你还想实现团队分账功能(团队成员按一定的比例获取收益)、白名单预售功能(只有白名单里的人才能在预售阶段mint)等等。 四、怎么写合约自己要写的并不多,一般200~300行就差不多了。 共性的那些内容,尤其是ERC721的实现,可以使用现成的别人写好的代码,比如OpenZeppelin1(以下简称OZ)就提供了很多实用的功能。 用的时候,继承OZ的合约即可,比如:
1、mint功能实现虽然可以直接调用OZ的ERC721.sol的_safeMint函数来实现mint,但最好外面再封装一层,写自己的mint函数,对于虎虎生威而言,你可以写一个huhu_mint,里面调用OZ的_safeMint即可。 自己写mint的好处是:至少可以控制铸造NFT的价格,以及每个地址可以mint的数量。
2、转移功能实现不用自己写,直接用OZ的ERC721.sol。 3、查询功能实现不用自己写,用OZ的ERC721.sol及ERC721Enumerable.sol(枚举)即可。 ERC721主要提供的查询是:
ERC721Enumerable提供了如下3个功能:
4、元数据功能实现OZ提供了IERC721Metadata接口,但功能是在ERC721.sol中实现的。? 主要是实现了name、symbol和tokenURI函数,调用后分别返回NFT名、NFT的缩写符号、token元数据的链接。 尤其注意tokenURI函数,给它一个 你还需要自己实现一个外部可见的函数,用来设置baseURI(注意使用onlyOwner)。这样,如果原先的存储不可用了,就可以换一个地方存。 然后,重写_baseURI这个ERC721.sol中的内部函数,使之可以返回正确的根目录URI。
比如对于BAYC这个NFT,他的baseURI在: ipfs://QmeSjSinHpPnmXmspMjwiXyN6zS4E9zccariGR3jxcaWtq/ 然后,第23号猿猴的tokenURI就在: ?ipfs://QmeSjSinHpPnmXmspMjwiXyN6zS4E9zccariGR3jxcaWtq/23 读取其中的内容,就是:
5、合约元数据功能实现实现一个contractURI函数2,告诉OpenSea你的NFT collection(收藏集)的元数据,比如收藏集的名字、描述、背景图、外部链接等。 比如可以写成这样:
6、其他功能实现分账功能可以使用OZ提供的PaymentSplitter.sol。 白名单功能可以自己写,比较简单。 7、细节注意a、每个符合ERC721的智能合约必须同时符合ERC721和ERC165,ERC165告诉外部自己支持哪些接口,外界通过调用supportsInterface 函数获悉一个合约是否支持ERC721。 b、如果你的合约被设计能够接受NFT转账,则需要实现ERC721TokenReceiver接口。 五、其他1、安全考虑最主要是防止重入攻击,所以要加上非重入保护,实现很简单,就是加锁。 OZ有个nonReentrant修饰符专门解决这个问题,对于涉及资金交易的函数,加上此修饰符即可。 这个修饰符是在ReentrancyGuard.sol中实现的,直接使用即可。
2、铸造入口如前所述,OpenSea上展现的NFT都是铸造好的。 对于一个有自己智能合约的NFT,铸造过程并不是在OpenSea上完成的,而是通过自有途径完成。 通常,你需要自己做一个网页,通过web3.js,让用户自己来mint(花用户的gas费)。 当然,你也可以自己mint所有的token,这就不用做网页了,调用合约接口就可以。不过,这需要花自己的gas费,现在的人,都舍不得花gas费,千方百计让用户来花,挺有意思的。 六、更底层的细节这里简单说一下ERC721,给有一定基础的同学观看,详细的内容可以自行搜索。
上面就是ERC721的接口函数,当然,发行一个NFT,只有上面这些是不够的。 还需要实现我上面说的那些功能。 七、结束语差不多就这些内容,如果你想做一个,还是要动手试一试。 如果仅仅就是想了解原理,这就够了。 中国人民银行发行的2022年虎年金币
|
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年12日历 | -2024/12/28 19:25:10- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |
数据统计 |