主页 > 苹果怎么下载imtoken > 区块链-NFT的实现原理

区块链-NFT的实现原理

苹果怎么下载imtoken 2023-01-16 23:39:46

掘金:juejin.im/user/178526…

博客:

GitHub:github.com/af913337456…

出版的书籍:

目录第二步:通证化第三步:展示和修改所有权共识的第三方平台

NFT(Non-Fungible Token),近两年又火了起来,早在2018年就开始流行了。

本文仅从编写代码实现NFT的技术方案层面介绍NFT,而不是从其财务意义、案例等方面介绍NFT,因为这种内容在浏览器中很容易搜索到,我会讲到什么next 内容,浅搜下,不多。

第 1 步:创建 ID

制作 id,这是将物质制作成 NFT 的第一步。有哪些物质?一段文字、一张图片、一件衣服等等,夸张地说,现实世界的物质,无论是虚拟的(游戏设备)还是物理的物质,都可以被代币化。

它是如何工作的?

通过第三方技术手段获得的唯一标志性物质中间产品。

因此,制作NFT的第一步可以推广到如下等式:

最简单的例子就是哈希函数,它可以根据不同的内容输出不同的哈希值而不管哈希冲突。这里的思考不仅限于散列函数。

获取图片的唯一id

这里用图片来表示一系列文件数据。

我们可以将图像转换为 []byte 字节数组,然后计算其哈希值。虽然这个操作比较简单,但是图片不能被别人访问或看到;如果我们想将图片的读取权限提供给外面的任何人,在计算出id之后,有两种方式:上传图片到文件服务器,任何人都可以这样做。它可以通过 url 链接访问。这里的服务器是中心化的;添加区块链属性。上传文件到IPFS(什么是ipfs,自己搜索),这样文件就可以被别人访问,同时还具有区块链去中心化的属性。其中,IPFS在上传文件后会使用它的算法帮你计算hash值并返回,可以直接作为id使用。获取衣服的唯一id

衣服在这里用来代表一系列物理物质。获取他们的唯一 ID 怎么样?练习可以解放思想,例如:

第 2 步:标记化

在第一步中获得了物质的id,现在要对其进行标记。记住一件事:目前公认的 NFT 都是基于区块链公链的,那么未来会一直如此吗?不一定,新的共识可能不会出来。

基于不同公链的流程

token化的过程如下:

选择一个公共区块链。这里的选择将决定智能合约等以下系统组件的技术栈,这是非常核心的;在选定的公链上开发智能合约;开发出来的智能合约需要遵循一些基本的约定,比如至少要保证substance的id可以是什么意思,实现校验和去重?意思是如果A今天上传id=1到链上,B明天上传同样的id=1到链上,合约必须能够告诉B你不能上传,id已经存在;将智能合约部署到链上,此时它就变成了一个 DApp;通过发送交易,调用智能合约的方法,将id等相关数据存储在链上。 NFT 的智能合约

NFT智能合约可以基于不同的公链进行开发,并不局限于任何一条公链。不同公链的智能合约解决方案的实现也不同。下面以以太坊公链为例。

在以太坊上,已经有很多开发NFT智能合约的标准,比如ERC-721\1155\998,各有特点,但他们的特点是从基本属性延伸出来的。 (所有标准文档:eips.ethereum.org/EIPS/eip-72…)

如果选择ERC-721标准开发NFT智能合约,在元数据存储部分,有tokenUrl,相当于物质的唯一id。如下图,_tokenURIs存储了token当前的count id及其对应的tokenUrl,其中tokenUrl为字符串格式,一般是文件url,指向存储在IPFS或其他服务中的文件的链接,但不限于链接,也可以是其他内容。

// 伪代码
contract MyERC721 is IERC721Metadata, ... {
    ...
    mapping(uint256 => address) private _tokenOwner;
    mapping(uint256 => string) private _tokenURIs;
    
    uint256 public tokenCounter; // 计数,当前总的 NFT 的数量,累增
    
    constructor () public ERC721 ("name", "symbol"){
        tokenCounter = 0;
    }
    // 外部调用方,调用这个函数,传参数:tokenURI 即物质的id,tokenURI 唯一
    function createNFT(string memory tokenURI) public returns (uint256) {
        uint256 tokenId = tokenCounter;
        _mint(msg.sender, tokenId); // 将交易发送者和当前的 tokenId 绑定
        _setTokenURI(tokenId, tokenURI); // tokenId 映射到 tokenUrl
        tokenCounter = tokenCounter + 1; // 累加
        return tokenId;
    }
    // _exists 函数判断 tokenId 是否存在,_tokenOwner[tokenId]
    // 根据 id 读取对应的 url
    function tokenURI(uint256 tokenId) external view returns (string memory) {
        require(_exists(tokenId));
        return _tokenURIs[tokenId];
    }
    // 根据 tokenId 和 url 建立 map 数据关系
    function _setTokenURI(uint256 tokenId, string memory uri) internal {
        require(_exists(tokenId)); // _exists
        _tokenURIs[tokenId] = uri;
    }
    ... // 省略系列接口,包含读接口
}
复制代码

上面的tokenUrl是一个标准需要的存储数据项。整个合约有以下约束:

NFT持有者,即msg.sender(owner)和tokenId是一对多的关系,也就是说一个人可以拥有多个NFT; tokenId 和 tokenUrl 是一对一的关系,代表每条数据链上的唯一 id。同时,不要求tokenUrl是唯一的,但是调用者通常会设置tokenUrl是唯一的区块链的四大特征,即使不是唯一的也没关系。发生冲突时,tokenId越小,越早设置;数据写入链后,就可以得到NFT的链上唯一id,根据id进行后续的读写操作。

一般来说,我们常规的 NFT 有一个与数据建立关系的 item 就足够了,但不限于此。合约实现标准要求的接口后,可以添加自定义数据项和自己的数据项。读写函数。

第三步:显示和修改显示的NFT内容

所谓显示,就是读取并显示NFT数据。大致流程如下:

根据NFT数据最初上链时获取的id,去智能合约读取信息;通过媒体应用恢复原始 NFT 数据。

例如显示图像 NFT。 (以上721合约标准结合IPFS为例)

假设调用合约存储数据时获取的tokenId为3,则使用该tokenId调用合约的数据读取方法;执行步骤1后,可以得到tokenUrl,即IPFS中存储的文件获取的链接;直接把 tokenUrl 链接在浏览器中打开就可以看到图片了。修改 NFT 内容

修改是 NFT 智能合约的扩展功能。它是可选的。具体方法完全取决于实现的要求。例如:

允许重置tokenId对应的内容;将其他字段内容添加到原始 NFT 数据中,然后允许修改这些字段;转让NFT,您可以将一个tokenId对应的NFT信息转让给其他所有者,以达到转让的目的;出售 NFT、拍卖 NFT 等操作....所有权共识

目前是 NFT,不可替代的代币。本质是利用区块链的属性来标记资产的所有权证明。

例如数字作品(图)《Everydays: The First 5000 Days》,在拍卖中成交额超过6000万美元,中标者可以获得原图和图片的NFT。这两件事,同是实体作品,同是其主人的证明。

假设一件作品的拥有者是匿名人士A,多年后,作品本身被意外盗取并找回。那么如何证明 A 是真正的拥有者,此时 A 只需要出示他对该作品的 NFT 所有权即可证明。

那么 NFT 和我们的真实证书类似吗?不是全部,分两点:

NFT 和证书都可以证明资产的所有权;比较存储介质和永恒:证书可能需要保存在保险箱中,但它最终占据了土地的一侧,并且仅由包含在土地一侧的保险箱来保证。 ,受时间流逝的影响,连续存放时间会变短; NFT 存储在区块链上,受到整个互联网的链节点的保护。它可以存活到整个链网崩溃。对于拥有大量节点的公链来说,这个概率几乎等于互联网终结的那一天。第三方平台

现在有很多第三方 NFT 生产和发布平台。比如opensea、rarible等,这些平台都实现了NFT智能合约和NFT展示应用(媒体应用---网站)区块链的四大特征,方便大众体验基于0码的NFT。但也有一些门槛,发送交易需要有钱包和gas费。