广告管理-1170PX*80PX
当前位置:主页 > 技术交流 >

技术分享专区:区块链-NFT的实现原理解说

广告管理-720PX*80PX

NFT (Non-Fungible Token),这2年又火了起来,早在18年已经火过一波。本文只从写代码完成NFT的技能方案层面去介绍 NFT,不从其金融含义、案例,等层面去谈,由于这类内容能够随便在浏览器查找到,而我接下来要谈的内容,浅层查找下,数量不多。​

第一步: 制作id

制作id,这是把物质制作成 NFT 的第一步。物质有哪些?一段文字、一张图片,一件衣服等,夸张的说,现实世界的物质,无论是虚拟的(游戏装备)或本质物质,都可以被通证化。

如何操作?通过第三方技术手段获取物质的仅有标志性中间产品。因此制作 NFT 第一步,广义于下面等式:

  • id = F(I)
  • I = 输入的物质
  • F = 处理函数,代表一种办法
  • id 仅有标志性的中间产品

最简单的比如便是哈希函数,不考虑哈希碰撞,它就能够依据不同的内容输出不同的哈希值。思想在这里不要局限于哈希函数。获取图片的仅有id,这儿用图片代表一系列的文件类数据。我们能够将图片转换成 []byte 字节数组,然后核算其哈希值。这种操作虽然比较简单,可是图片他人却不能拜访,看不到;

假如我们想向外部任何人供给图片的读权限,在核算完 id 后,有两种做法:
1、上传图片到文件服务器,任何人能够经过 url 链接拜访。这儿的服务器是中心化的;
2、添加区块链特点。上传文件到 IPFS (ipfs是什么,自行搜索),如此一来,文件他人能拜访,同时还具备了区块链的去中心化等特点。其间 IPFS 会在上传完文件后,会使用它的算法,帮你核算好哈希值返回,能够直接用它的作为id。

获取衣服的仅有id:这儿用衣服来代表一系列的实践物质。假定获取它们的仅有id呢?做法能够放飞思想去考虑,比如能够:衣服的出厂信息、扫描内容、相片,等系列关于它的信息,数据化,然后用这些数据制造成文件,毕竟参阅图片的做法。

第二步:通证化

第一步中获取了物质的id,现在要把它们通证化。牢记一点:目前公认的 NFT 都是依据区块链公链的,那么以后是不是会一直这样呢?不一定,说不准出来了新的共识。 依据不同公链的流程如下:

1 挑选一条区块链公链。这里的挑选会决定后边智能合约等体系组件的技术栈,这一点很中心;
2 在所选的公链上开发智能合约;
3 所开发的智能合约需求遵循一些基础约好,比方至少能确保物质的id能达到验证去重,什么意思呢?意思是,假如 A 在今日上传了 id=1 到链上,明天 B 也上传同个 id=1 到链上,合约要能告知 B,你不能上传了,id 现已存在;
4 部署智能合约到链上,此刻它变成 DApp;
5 经过发交易的方式,调用该智能合约的方法,将id等相关数据存储到链上。

NFT 智能合约可以根据不同的公链开发,它不局限于任何一条公链。不同公链的智能合约方案完成也不同,下面以以太坊公链举例说明。

在以太坊上面,开发 NFT 智能合约,已经有许多规范,比方 ERC-721 M5 998,各有各的特色,但它们的特色是在根底特色上拓展而来的。

假如选择 ERC-721 规范开发 NFT 智能合约,在元数据存储部分,就有 tokenUrl 这项,它相当于物质的仅有id,像下面的姿势, _tokenURIs 存储的就是通证当时计数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 是规范要求的存储数据项。整个合约具有下面束缚功能:
1、NFT 持有者,即 msg.sender(owner) 和 tokenId 一对多联系,代表一个人能够拥有多个 NFT;
2、tokenId 和 tokenUrl 1对1联系,代表每份数据一个链上的仅有id,同时 tokenUrl 没要求是仅有,但在调用方,一般会把 tokenUrl 设置仅有,即便不仅有也没联系,抵触的时候,tokenId 越小的,其最初被设置的时刻就越早;
3、NFT 持有者在将数据写入链上后,能够获取 NFT 的链上仅有 id,后续能够根据 id 进行系列的读写操作。

一般来说,咱们惯例的 NFT 有一个和数据建立联系的项就足够了,但并不限制于此,合约在实现了规范要求的接口后,完全能够自己增加自定义数据项及其读写函数。
 

第三步:展现与修正

所谓展现,就是对 NFT 的数据进行读取再展现。一般的流程如下:

  1. 根据最初设置 NFT 数据到链上时取得的 id 去智能合约读取信息;
  2. 将取得的信息通过某介质使用复原出原始的 NFT 数据。

比方将图片 NFT 展现出。(凭借上面的 721 合约规范和 IPFS 结合为例)

  1. 假设调用合约存储数据时候得到的 tokenId 是 3,那么运用这个 tokenId 去调用合约的读数据方法;
  2. 执行完 1 过程,可以得到 tokenUrl,即文件存储在 IPFS 中所得到的链接;
  3. 直接将 tokenUrl 链接在浏览器打开,看到图片。

修正 NFT 内容

修正是一项 NFT 智能合约的拓宽功用,可有可无,详细是怎样的方法,完全看需求的完成。比方:

  1. 允许重置 tokenId 所对应的内容;
  2. 在 NFT 原数据中添加其他字段内容,再允许修正这些字段;
  3. 转让 NFT,可以把某 tokenId 对应的 NFT 信息转让给其他 owner,达到转让目的;
  4. 出售 NFT、拍卖 NFT 等操作....

所有权共识

现在 NFT,非同质化通证。本质是想凭借区块链的属性来标示一种资产的所有权证明。

比方曾拍卖出6000多万美金的数字著作(图片)《Everydays: The First 5000 Days》,中标者能取得原图 和 该图的 NFT。这两样东西,一样是本质的著作,一样是它的所有权者的证明。

咱们假设下,假如持有某著作的人,是一位匿名者A,过了多年后,该著作本身不小心被盗并被找回。那么怎么证明 A 是真实的具有者,此刻 A 只需求展现他对该著作的 NFT 具有权,就可以证明。

那么 NFT 是不是类似于咱们现实中的证书?不全是,分两点:

  1. NFT 和证书都能证明某资产的所有权;
  2. 对比的存储介质 与 永恒时效:
    1. 证书可能要找个保险柜保养放着,但它终究占有一方土地,仅受一方土地包容的保险柜保证安全,在时过境迁的影响下,持续性存储下去的时刻会较短;
    2. NFT 存储在区块链上,受整个互联网的链节点所保护。它可以存活到整个链网络垮掉那天,关于节点数量众多的公链来说,这个概率简直等同于互联网完结那天。

第三方渠道

现在已经有许多的第三方的 NFT 制造与发布渠道。比方 opensea、rarible 等,这些渠道自己完成了 NFT 的智能合约 和 NFT 展现使用(介质使用---网站),方便群众 0 代码根底体会 NFT。但也有一些门槛,需求具有钱包和发交易的油费。

本文摘自www.cnblogs.com/linguanh/p/15163809.html 作者:林冠宏 如有冒犯不适请联系平台站长删除!

广告管理-720PX*80PX

  • 关注微信
上一篇:没有了
下一篇:没有了

猜你喜欢

客服微信