web3实战课05:从理论把掘金头像铸造成NFT

发布于:2024-04-29 ⋅ 阅读:(24) ⋅ 点赞:(0)

一、传奇铸造师的困境

是我,布鲁诺·战锤,冰风谷的矮人族之王,我在虚拟世界开了一间武器铺,我的标语是:

每一把武器都拥有独一无二的属性、特性,它们甚至有不同的性格。 主打的就是一个 举世无双

好兄弟,你是知道我的,我向来言出必践,说独一无二就独一无二,说天下无双就天下无双。

但很快,我就遇到了问题:人们不相信我。

他们不相信我,就像他们不相信每一个贪婪的商人那样,它们对我提出了诘问:

  • 你怎么证明它的独一无二?
  • 给每一个武器一个编号?鬼知道你会不会搞两把编号一样、属性一样的武器?到时候我们消费者找谁说理去?
  • 哦?你说找尊敬的城主大人来见证?万一城主大人被你收买了,或者城主大人自己也想获取我拥有的那把武器,陪你一起造假,怎么办?
    ...

如何证明 独一无二 是真的 独一无二

这成了我最头疼的问题。

直到有一天,一位来自地底的名为【崔斯特·杜垩登】黑暗精灵找到我,他给了我一个完美的解决方案,叫:

非同质化代币NFT

二、什么是 NFT

官方释义:“非同质化代币”(Non-Fungible Token)。

要理解 NFT,对 web3区块链 的基本了解是必不可少的,可以先看我这篇文章:

简单来说,通过一系列密码学技术和共识机制,区块链的程序和数据存储在世界各地的节点上,可以有效避免被任何一个人或机构轻易篡改。

为了鼓励大家存储数据和计算区块,于是有了一种名为 代币 的东西,它因为具备获得难度和流通性,因此具备了一定的 金融属性

早期的代币,比如 比特币以太坊 等,都是以 同质化 的方式存在,即每一个代币都具有相同的属性。

你手里的 1.23 枚比特币,和我的 1.23 枚比特币,在属性和价值上,是完全相同的。

后来,人们渐渐有了一种新的想法:

既然链上的 代币 可以交易,并且不能被轻易篡改,那我我们能不能让它指向某个 真实世界 的资源呢?

2013 年前后,市面上出现了一种名为 Colored Coins 的代币,人们通过在 比特币 上附加一些 元数据,来标识它对应着某个 真实世界 的资源。(比如一栋房子、一幅油画)。

但它还不算真正意义上的 NTF,只能算 NTF 的雏形。

2014年5月 ,一款名为 Quantum 的图像被记录在一个名为 Namecoin 的区块链上,代表着 NTF 时代的开启。

Namecoin 是基于 比特币 改进而来的一条分支链,主要用于实现去中心化的域名管理。

2017 年,一款名为 CryptoKitties 的游戏诞生,它通过 以太坊 区块链上的智能合约,实现了 NFT 的概念。

游戏中的猫咪通过智能合约生成,每只猫咪都具有独特的数字基因,这些基因决定了其外观和特征。玩家可以通过两只猫咪的繁殖产生新的猫咪,这些新生猫咪继承了父母的基因特征,从而增加了收集和繁殖的复杂性和乐趣。

这款游戏在海外取得了巨大的关注,甚至一度引发以太坊链的交易拥堵。

通过这款游戏,NFT的概念得以普及,并且逐渐发展成一个多样化和庞大的生态系统,涉及艺术、娱乐、游戏等多个行业。《CryptoKitties》因此被视为是NFT历史上的一个关键里程碑。

三、NFT 现状

截至2024年,NFT的生态系统已经经历了迅速的扩张和多元化,尽管经历了市场的起伏,整体上显示出了持续的成长和创新。以下是NFT生态系统的几个主要方面:

  1. 艺术和收藏品:艺术仍然是NFT市场的核心业务。数字艺术家通过NFT获得了一种新的展示和销售作品的方式,这不仅使艺术家能够直接从他们的作品中获利,还增强了艺术品的真实性和溯源性。此外,随着知名艺术家和拍卖行的加入,NFT艺术市场得到了进一步的推广和认可。

  2. 游戏:NFT为游戏行业带来了“可玩性资产”的概念,玩家可以拥有、买卖游戏内的物品,如装备、地块、角色等。这种模式增加了玩家的参与感和游戏的经济互动性,开发者和玩家都能从中获益。

  3. 音乐和娱乐:音乐家和创作者开始使用NFT来分发独家内容、音乐作品和粉丝体验,提供了一种新的粉丝互动和收益模式。这包括限量发行的专辑、独家音乐视频,甚至是音乐会门票。

  4. 实体资产和元宇宙:NFT正被用来代表实体资产的所有权,如房地产和珍品。同时,在虚拟世界或称为元宇宙的环境中,NFT用于购买、销售和交易虚拟土地、建筑和其他资产,这些资产在虚拟空间中具有实际的应用价值。

  5. 社交和身份验证:NFT在社交身份和个人品牌建设中的应用也在增加。例如,个人可以创建代表自己在线身份的NFT,并用它来访问特定的社区或服务。

  6. 门票和票务:NFT可以用于销售门票、电影票和其他形式的票证,只要验证 “拥有 NFT” 就被视为拥有入场券。

还是我,布鲁诺·战锤,冰风谷的矮人族之王,现在,我明白了,NFT 正是我苦苦追寻的方案。

那么,NFT 到底的技术实现到底是怎么一回事呢?

四、NFT 的实现技术

NFT 存在区块链上,那么它究竟是以什么形态存在的呢?

此次,我们不再以 ETH 为例,而是以 SOL 链作为例子。

SOL 链是 Solana 的缩写,它是由 Rust 语言开发的区块链。它通过 历史凭证 的特性异军突起,一跃成为可以和 ETH 比肩的区块链。

4.1 ERC-721 规范

ERC-721 规范,原文地址:

ERC-721 是以太坊发布的一个标准,用于创建和管理非同质化代币(NFT)。

它和 ERC-20 规范最大的区别,就在于它支持 非同质化代币

开篇明义, ERC-721 开篇就写下了这样一句话:

In general, all houses are distinct and no two kittens are alike. NFTs are distinguishable and you must track the ownership of each one separately.

(正常情况下,所有的房子都是不同的,没有两只小猫是一样的。NFT 是可区分的,您必须单独跟踪每个 NFT 的所有权。)

另外,我们需要明白,ERC-721 规范是提供给【智能合约】的规范,因此,只要一个合约实现了 ERC-721 规范,那么我们就可以通过相同的客户端来完成 NFT 的操作。

ERC-721 规定,一个 NFT 合约,必须实现以下接口:

  • balanceOf: 返回指定地址拥有的代币数量。
  • ownerOf: 返回拥有指定代币的地址。
  • safeTransferFrom: 安全地将代币从一个地址转移到另一个地址,同时确保接收者能够处理接收的代币。
  • transferFrom: 使代币从一个地址转移到另一个地址,不进行安全检查。
  • approve: 允许另一个地址转移特定的代币。
  • setApprovalForAll: 允许或禁止另一个地址管理所有的代币。
  • getApproved: 查询指定代币的授权地址。
  • isApprovedForAll: 查询一个地址是否被另一个地址授权管理所有代币。

以上这些接口,意味着一个智能合约可以满足客户端对 NFT 所有权的查询、代币转移、安全检查等操作。

同时,它也规定了 NFTMetadata (元数据) 规范,其 JsonSchema 长这样:

{
    "title": "Asset Metadata",
    "type": "object",
    "properties": {
        "name": {
            "type": "string",
            "description": "Identifies the asset to which this NFT represents"
        },
        "description": {
            "type": "string",
            "description": "Describes the asset to which this NFT represents"
        },
        "image": {
            "type": "string",
            "description": "A URI pointing to a resource with mime type image/* representing the asset to which this NFT represents. Consider making any images at a width between 320 and 1080 pixels and aspect ratio between 1.91:1 and 4:5 inclusive."
        }
    }
}

众所周知,JsonSchema 是用来描述 JSON 格式的 JSON

因此,实际的 NFTMetadata 应该长这样:

{
  "name": "NFT 名称",
  "description": "NFT 描述",
  "image": "NFT 图片地址"
}

例如,你可以尝试打开这个链接:,它指向了一个被创建的 NFT 元数据。

元数据有一个重要特性:

  • 一旦 NFT 铸造完成,它将无法被更改

如果你觉得以上 json 不足以表达你的 NFT 的所有属性,你完全可以在此基础上进行增设或修改。

如图所示,在 NFT 铸造过程中,有两个重要的系统:

  • 区块链
  • 永久文件存储

其整体结构如下:

  1. 某个区块铸币交易的元数据里,有个 url 属性指向 NFT 真正的元数据 url

  2. NFT 元数据 url 指向一个文件永久存储地址,在里面描述了 NFT 的基本信息,这个 JSON 串里有个 image 属性,指向了 NFT 媒体地址。

  3. NFT 媒体地址指向另一个永久存储地址。

配合上元数据和区块链的不可篡改性,NTF 就具备了在区块链上 mint(铸造) 和 transaction(交易) 的技术基础。

基于 ERC721,衍生出了一大批优秀的 NFT DAPP:

  • CryptoKitties: 前面介绍过,区块链养猫
  • Decentraland: 区块链元宇宙卖地
  • Axie Infinity: 区块链养宝可梦
  • Art Blocks: 卖艺术品 等等

这也让以太坊在 NFT 领域,成为了无可厚非的先驱者和早期霸主。

4.3 SolanaMetaplex

虽然以太坊走在了区块链生态的最前沿,但 web3 大班级里,还有许多其他的区块链竞争者。

以下是目前影响力比较大的几个:

  • Solana
  • Flow
  • Tezos
  • Binance Smart Chain (BSC)
  • Polygon
  • Algorand

眼睛都看花了?

没关系,我们只需要了解竞争者中的最强者就行,目前(202404)来看,最强竞争者毫无疑问是:Solana

Solana 基于独特的时间戳系统,实现了 Proof of History (PoH)(历史证明),这使得区块链这一分布式系统具备了更高的性能和吞吐。(这里不展开介绍了,总之作为挑战者,它比 EVM 更快更强,因此迅速占据了一片属于自己的生态)

由于底层语言、技术架构与 EVM 存在显著差别,Solana 无法完全照搬 ERC-721,因此它推出了自己的 NFT 标准:Metaplex。(事实上,它是标准和实现的结合体)

不得不吐槽一下,Metaplex 的官方文档,简直烂到爆炸。

你可以在这里 找到 MetaplexToken Standard 规范。

在这个文档中,MetaplexSolana 上的 NFT 代币进行了如下归类:

  1. NonFungible: 非同质化代币增强版。
  2. FungibleAsset: 半同质化代币。(具备元数据+属性)
  3. Fungible: 只有简单元数据的 NFT
  4. ProgrammableNonFungible: 一种特殊 NonFungible 令牌,随时被冻结以执行自定义授权规则。

以上4类 NFT 不是声明而得的,而是通过令牌的元数据进行归类得出的。

4.4 NFT 初见

尝试打开以下链接:

这是一个 NFT 的 “浏览地址”。

在这里,我们可以看到关于这个 NFT 的一些信息,比如:

  • 它的名字叫:Solana Workshop NFT
  • 它本身的 Address 是: 77amBjRCbknFM71YdzhzxhGz9hJWgzXpYXmzkgNquovt
  • 它的 Symbol 是: SHOP
  • 它的 Creater 地址是:AfC9WmA2c5HuGLApKXSo8RqwwVawdKUCiwpkaNiVKoPc

然后稍微往下翻一点,可以看到更多信息:

  • 它的历史中目前只存在一条记录,也就是它的 【铸造交易】,交易 ID 是:2uwSa3eSGP16qmYAHwJNYEFVoYZmdjvAyCUb9sis7QGni9GzCk6wZc64D5owrcsmQjBpXvcnteyEvYB8hBZrszRu

  • 存储在 Solana 开发链的第 289562940 个区块上。

接下来,是最最关键的内容:

区块链的元数据(Metadata):

{
  "key": 4,
  "updateAuthority": "AfC9WmA2c5HuGLApKXSo8RqwwVawdKUCiwpkaNiVKoPc",
  "mint": "77amBjRCbknFM71YdzhzxhGz9hJWgzXpYXmzkgNquovt",
  "data": {
    "name": "Solana Workshop NFT",
    "symbol": "SHOP",
    "uri": "https://arweave.net/rrZV8cllyfk9nQYCv_hiUk22JY0RaBrJ9IbNd1G44bc",
    "sellerFeeBasisPoints": 0,
    "creators": [
      {
        "address": "AfC9WmA2c5HuGLApKXSo8RqwwVawdKUCiwpkaNiVKoPc",
        "verified": 1,
        "share": 100
      }
    ]
  },
  "primarySaleHappened": 0,
  "isMutable": 1,
  "editionNonce": 255,
  "tokenStandard": 0,
  "collection": {
    "verified": 0,
    "key": "CPpyd2Uq1XkCkd9KHswjttdQXTvZ4mmrnif3tXg9i8sk"
  }
}

理解元数据,最重要的三个属性是:

  • data.uri: 指向 NFT 的元数据地址,这一点我们在 4.1 小节有详细描述。
  • data.name: NFT 的名称。
  • data.creator: NFT 的铸造者。

还是我,布鲁诺·战锤,冰风谷的矮人族之王。

现在,我生成了一个新的 NFT,并把它指向了一个不可被篡改的武器的 URL。得到这个 NFT的勇士,就可以向世界宣告它是这件武器的主人。

等等?

刚才我是不是提到了 一个不可被篡改的URL ?

噢~老天爷,我刚刚利用区块链的特性,让 NTF 不可被篡改,现在我需要面对另外一个问题,武器的 URL 如何才能做到不被篡改?

五. NFT 的存储

NFT 的存储问题一定需要慎重考虑。

假设我们在链上铸造了一个 NFT,它的 metaData.url 指向了一个url: https://pic.zhangshichun.top/pic/20230719-07.gif

然后因为该作品内容特别,被我卖出了 10000 块钱的价格。

买家也准备囤积居奇,转手一个高价。

就在此时,我因为域名到期未续费,这个 uri 无法访问了。

请问:此时买家如何才能保障自己的权益?

答案是: 无法保障。

因此,作为 NFT 的存储载体,它的存储容器一定要具备以下特性:

  • 稳定,稳定,还特么是稳定。不然一旦出现服务不可用,买家买到的数字资产就等于白给了。
  • 抗审查性。如果存储服务商因为政治原因、法律原因,无法提供服务,买家就白给了。
  • 永久存储。

以下为目前主流的 NFT 存储选择:

  • Arweave
  • AWS S3
  • IPFS
  • NFT.Storage
  • Shadow Drive

其中:ArweaveNTF.StorageShadow Drive 都是去中心化的永久存储方案,比较适合作为 NFT的存储方案被选择。

AWS S3 因为中心化问题,天然不具备抗审查性,因此不推荐。

IPFS 因为支持文件删除,并不属于永久化存储,因此也不推荐。

以这张图为例:

https://lch7lx727mkz6ssxalntzhykvypvotptxozch347bhcr2bbh6vta.arweave.net/WI_13_r7FZ9KVwLbPJ8Krh9XTfO7siPvnwnFHQQn9WY

它的 uri 为: https://lch7lx727mkz6ssxalntzhykvypvotptxozch347bhcr2bbh6vta.arweave.net/WI_13_r7FZ9KVwLbPJ8Krh9XTfO7siPvnwnFHQQn9WY

被存储在 Arweave 上的。

六. 手写步骤一:下载 Solana 脚手架

Solana 社区提供了一个 dapp 脚手架,供大家快速开发:

通过 clone 或者 fork 这个项目,你可以快速搭建一个基于 Solana 项目的 dapp 脚手架。

在执行一下代码后:

yarn && yarn dev

你可以看到这样一个项目:

这个项目集成了 Solana 最基础的 @solana/web3.js 库和一些基础的 adapter 库,已经实现了以下基本能力:

  • 选择 Solanadevnettestmain 链的能力。
  • 连接 Solana 钱包的能力。
  • 查询钱包余额的能力。
  • devnet 领取空投的能力。

因此,在此脚手架中开发 DApp 可以免去很多麻烦。

七. 手写步骤二:编写 NFT 的铸造逻辑

这里我们需要用到一个名为 @metaplex-foundation/jsjs 库。

这是 metaplex 官方团队提供的集成化 NFT 交易的各种基础能力,包括:

  • 常规的永久化存储能力
  • 铸造 NFT 的能力
  • 转移 NFT 的能力
  • 验证 NFT 的能力
    ...等等

NFT 已经完成存储的情况下,铸币的核心代码如下:

  // 上传nft元数据到永久存储系统
  const { uri } = await metaplex.nfts().uploadMetadata({
    name: ntfName,
    symbol: "The Symbol",
    description: "The Description",
    image: fileURL,
  });
  // 铸造nft代币到区块链
  const res = await metaplex.nfts().create({
    uri,
    name: ntfName,
    sellerFeeBasisPoints: 0.1,
    tokenOwner: wallet.publicKey,
  });

值得注意的是,这里使用了 永久存储系统

我们可以使用 irys 提供的能力来进行快速配置,在 @metaplex-foundation/js 里也内置了 irys 的适配能力。

import {
  Metaplex,
  walletAdapterIdentity,
  irysStorage,
} from "@metaplex-foundation/js";

metaplex.use(walletAdapterIdentity(wallet)).use(
  irysStorage({
    address: `https://${networkConfiguration}.irys.xyz`,
    providerUrl: `https://api.${networkConfiguration}.solana.com`,
    timeout: 60000,
  })
);

八. 使用 demo,铸造你的【掘金头像】

8.1 尝试访问 demo & 注册一个钱包

首先,你需要一些魔法,然后访问这个地址:

别害怕,这是我写的 demo,它是开源的,源码地址在这里:

另外,你需要自己注册一个支持 Solana 的钱包,最好是浏览器拓展,比如: Phantom

当你注册完成后,尝试按图开启测试网络。

8.2 铸造

第一步:按照网站指引,链接你的钱包到网站。

第二步:领取一些空投,用于后续交易

这是测试网络和开发网络独有的特性,可以免费领取 SOL

第三步:输入你的掘金头像URL和掘金昵称

第四步:开始铸造 点击 START MINT 之后,会弹出 Phantom 钱包的授权弹窗。

由于我们使用了 vercel.com 免费域名的原因,会提示不安全,没关系,反正你用的测试网,而且你的钱包没钱。

点击 仍然继续

交易成功后,你就可以看到属于你的 NFT 的基本信息了。

点击链接,你就可以去链上查看你的 NFT 交易的各种细节了。

帅不帅?

在你的钱包账户里,也可以看到你的 NFT 余额了。

九. 资源

demo:

源码:

关于我

我是春哥,一个前端工程师。
目前正在学习 web3 领域。
如果你有任何问题,欢迎留言。