# Paradigm: 高效发行 NFT 的设计指南

By [EthereumCN](https://paragraph.com/@ethereumcn-2) · 2021-11-05

---

来源 | [Paradigm.xyz](https://www.paradigm.xyz/2021/10/a-guide-to-designing-effective-nft-launches/)

作者 | [Hasu](https://www.paradigm.xyz/team/hasu/), [Anish Agnihotri](https://www.paradigm.xyz/team/anishagnihotri/)

区块链给开源软件的融资带来了革命性的变化，但并非所有东西在一开始就行得通。事实上，2016—2018年期间的 ICO 经常是严重有问题的机制，它们让创始人在交付任何产品前就能兑现。此后，我们吸取了许多教训，今天的项目在发行和分发代币之前都有一个工作产品，以激励使用和去中心化治理。

NFT 被证明是另一种明确适用于加密货币的产品市场匹配，但它们正在经历自己的成长之痛。每个 NFT 的生命都开始于一次 NFT 发行 (有时也称为铸造或空投)。一次 NFT 发行意味着有新的收藏品被首次创造、出售和分发给买家，他们随后会决定是持有还是在二级市场交易。

就像任何首次销售的商品一样，NFT 的发行面临着为从未有过价格的东西定价的挑战。但与大多数其他东西的销售不同的是，它们还有一个额外的困难，那就是在一个充满独特特性的高度对抗性环境中进行，这些特性已经使缺乏经验的用户难以接近，这个环境就是公共区块链。因此，开发者必须设计出高效而稳健的机制，以防止被破坏。

本文以在现实世界中那些已经伤害了用户利益的 NFT 发行案例开始，以找出好的发行应该满足哪些目标。接下来，我们把发行分解为一个个的步骤，探索每个步骤的设计空间。最后，我们提供一个我们认为是设计良好的发行机制的参考实现，供社区使用和在其基础上构建。

损害用户利益的示例
---------

随着时间的推移，我们已经注意到，NFT 发行的某些设计模式一直给用户带来不良结果。

### 可被破坏的公平性

当一个新的收藏品推出时，用户可以与其智能合约交互，铸造一个具有随机属性的 NFT。这些属性往往有不同的稀有度，使得有些组合比其他更稀缺和更有价值。例如，10,000 个 CryptoPunk 里只有 9 个有超稀有的“外星人”特性，其中现在在市场上最便宜的一个标价 35,000 个 ETH。

虽然不同人出于各种原因参与铸造，但其中很多人享受不知道他们将得到哪款以及稀有度如何的兴奋感。从这个意义上说，铸造 NFT 只不过是长时间以来在模拟经济 (如集换式卡牌游戏里的增强包) 和数字经济 (如电子游戏的战利品盒/箱) 中受欢迎的[扭蛋机制](https://en.wikipedia.org/wiki/Gacha_game)的延续。

参与扭蛋游戏的人往往会做出一个重要的假设：他们从物品的随机分布中抽取，且真的有机会 (尽管很小) 抽到非常稀有的那个。不幸的是，过去的 NFT 铸造经常无法满足这个假设，无法创造真正的随机性。在实践中，这使得熟悉技术和有动机的各方利用铸造为自己谋利，抢夺收藏品中最稀有的那些，使诚实的参与者无法获得。

我们分享这种模式的两个案例，其中 NFT 铸造正是以这种方式被破坏。这两个案例都依赖于相同的两步过程：

1.  抢夺者提取收藏品的元数据，使它们显示在一个单一稀有度分数中所有属性的相对频数。使用这个分数，他们然后可以确定一个收藏品集里最高价值的 NFT。
    
2.  然后，抢夺者打破铸造合约的随机性，以只铸造他们想要的稀有、最高价值的 NFT。
    

### Loot 衍生品以及用链上元数据抢夺 Loot

最近，一个名为 [Loot](https://twitter.com/dhof/status/1431316631934967815) 的项目席卷了 NFT 世界。看似简单，这个项目包含 8,000 个战利品包，由不同稀有度的胸部、足部、手部、头部、颈部、戒指、腰部和武器物品组成。

每个物品槽的所有属性都直接存储在合约里，铸造者获得一个伪随机的战利品包，以包 ID 作为哈希值。虽然只要以太坊存在它们就永久存在，但在链上存储元数据也将 Loot 的伪随机性暴露给抢夺者。他们通过在本地模拟随机化函数，快速抓取了所有 8,000 个包的元数据，获得了整个系列的图片 (也获得了稀有度)。有了这些信息，他们只需要利用合约最后剩下的弱点：能够准确地铸造他们想要的 ID，并只狙击最稀有的包。

但是，尽管破坏很简单，但有理由相信没有人会破坏原始的 Loot。

来源:

[https://github.com/Anish-Agnihotri/blog-effective-nft-launches-data/tree/master/01-exploitable-fairness/loot](https://github.com/Anish-Agnihotri/blog-effective-nft-launches-data/tree/master/01-exploitable-fairness/loot)

如果我们观察直到铸造最后战利品包的稀有度，稀有的物品在整个铸造过程的分布是良好的。这表明没有明显的抢夺案例。

关于为什么 Loot 没有被破坏，有两个可能的解释：

1.  这是一个全新的合约，因此人们还没准备好或缺乏时间发现漏洞
    
2.  铸造 Loot 的预期价值并不明确，因为收藏品的价值只会在接下来几天在二级市场爆发。收藏品大概需要 2.5 个小时售完，这一点进一步支持这个假设。
    

然而，随着 Loot 的价格不断上涨，一系列像 [More Loot](https://twitter.com/dhof/status/1434180216444923923) 和 [Extension Loot](https://twitter.com/colingplatt/status/1433404301515370496?s=20) 这样的衍生品开始出现，它们大多数只是原始 Loot 合约的小分叉。新的收藏品继承了 Loot 的弱点，但市场价值更高，且得到更多的关注。这对这些收藏品铸造的公平与否产生了很大的影响。

### More Loot

将稀有物品的分布与 More Loot 和原始 Loot 之间的铸造时间进行对比，抢夺的证据变得非常明显。仅仅几个区块之后，所有的稀有 NFT 已经被铸造完了，只剩下一些没有价值的给未来的铸造者，他们基本上不知道经验丰富的用户已经抢夺完了这次的发行。

来源 :

[https://github.com/Anish-Agnihotri/blog-effective-nft-launches-data/tree/master/01-exploitable-fairness/mLoot](https://github.com/Anish-Agnihotri/blog-effective-nft-launches-data/tree/master/01-exploitable-fairness/mLoot)

下图：红线指的是当 Anish [在推特上公开](https://twitter.com/_anishagnihotri/status/1434220175268749320)他的稀有度得分时，开始争夺稀有包的区块高度。

来源 :

[https://github.com/Anish-Agnihotri/blog-effective-nft-launches-data/tree/master/01-exploitable-fairness/mLoot](https://github.com/Anish-Agnihotri/blog-effective-nft-launches-data/tree/master/01-exploitable-fairness/mLoot)

此外，由于 More Loot 的供应量不断膨胀，因此可以预期抢夺者将对未来可得的包预先评分，并竞相铸造它们。

### Extension Loot

与 More Loot 类似，Extension Loot 具有一个单一地址，可以铸造最稀有的 10 个袋子里的 5 个 (所有铸造的 NFT 都以红色标示)。独特的地方在于，这些 NFT 被隐藏在显而易见的地方，因为抢夺者在连续瞄准稀有包之前，会慢慢把它们和可得包分发出去。

来源 :

[https://github.com/Anish-Agnihotri/blog-effective-nft-launches-data/tree/master/01-exploitable-fairness/xLoot](https://github.com/Anish-Agnihotri/blog-effective-nft-launches-data/tree/master/01-exploitable-fairness/xLoot)

### Meetbits 以及用链下元数据抢夺 Meebit

[Meebits](https://meebits.larvalabs.com/) 是由 CryptoPunks 的创造者 Larva Labs 推出的备受期待的 NFT ，拥有 20,000 个独一无二的 3D 人物。

Larva Labs 知道精明的用户可以利用收藏品的元数据来计算稀有度，然后抢夺稀有的 NFT。为了解决这个问题，他们以这样的方式设计他们的网站：他们允许买家看到每个 Meebit 的完整元数据，但仅在 NFT 被铸造完后。

尽管该网站明确隐藏了未铸造的 Meebits，但有人查看源代码，发现 Larva Labs 从 IPFS 上提取元数据。利用这个信息，他们还是搜刮了 IPFS ，提取了未铸造的 Meebits 的元数据，找出了最想要的那些。

然而，Larvalabs 仍然没有让抢夺者轻易实现：不同于 Loot，用户不能铸造特定 Meebit ID 的 NFT。相反，链上的随机性被用作哈希值 (理论上矿工仍然可以利用)，使这个特定用户更难以铸造一个稀有的 Meebit。

但是，掠夺者知道如何在糟糕情况下取得最好的结果。他们写了一个购买 Meebits 的[合约](https://www.notion.so/8a29099744230de56e7b41c8ced46ffb)，查看它们的 ID，然后再“打乱”它们。具体来说，Meebit 合约是一个有 mint() 函数的 ERC721，它会返回一个随机的 Meebit ID。抢夺者的合约可以调用 mint，将返回的 Meebit ID 与它们的稀有度列表进行对比，如果没有超过一定的稀有度分数，就回滚交易 ([示例代码](https://github.com/Anish-Agnihotri/blog-effective-nft-launches-data/tree/master/01-exploitable-fairness/meebits))。用这一招，他们只需支付大约 0.03 个 ETH 来查看每个 ID，而不用花大约 2.5 个 ETH 直接购买 Meebit。

尽管攻击者在这个过程中烧了很多失败的交易，因此也会烧掉很多 gas 费用，他们最后获得大约 400 个 ETH 的收益。今天，同样的掠夺者可以通过 Flashbots 的交易捆发送交易，如果得到他们想要的 ID，就给矿工支付费用——使回滚交易完全免费。

攻击者铸造并卖出 Meebit #16647，它具有极其稀有的“访问者”特征。

### Gas 竞拍

在 9 月，有 7 个特别时期以太坊每 gas 的基本费用超过了 1,250 gwei。令人震惊的是，这 7 次发生的情况都是因为备受关注的 NFT 发行扰乱了网络。

从左到右：G’EVOLS、The Sevens、Sipher、Galaxy Eggs、Omnimorphs + ArtBlocks Democracity、Galactic Apes 和 King Frogs

大多数这些发行采用的是固定价格、先到先得 (FCFS) 的机制。由于价格低、需求过大，获得这些 NFT 的竞争从合约出售变成了在交易池里的 gas 竞拍。

其中一个例子是 [The Sevens](https://thesevensofficial.com/) NFT 的空投，这是一个备受关注的收藏品集，有 7,000 张以反乌托邦人物为主题的收藏品作为个人头像。由于每张 NFT 的初始价格为 0.07 个 ETH，热心的参与者都赶紧到合约上去铸造。在短短 6 分钟内， gas 价格达到 12,246 gwei 的峰值，仅在合约铸造的 gas 费上面，参与者支付的中位数是每个 NFT 大约 1.49 个 ETH，而最高的 5 % 的人每个 NFT 支付了 2.44 个 ETH。

在 the Seven 铸造中，快速上涨的区块基本费用

gas 竞拍的问题不仅仅是它们在使用上更具挑战，而是通过以这种方式“滥用”公共交易池，它们为所有以太坊用户创造了负外部性。他们还迫使用户为同一个 NFT 支付不同的金额，导致成千上万出价不足的交易失败，伤害了用户利益。

### 高技术门槛

正如我们之前看到的，[以太坊是一个黑暗森林](https://www.paradigm.xyz/2020/08/ethereum-is-a-dark-forest/)，有很多高水平的、敌对的行动者总在寻求机会。NFT 铸造，特别是稀有的那些，买家期望在铸造后能在二级市场获得溢价，这为技术熟练的各方提供了比普通参与者更多有利可图的机会。

这些参与者通过机器人和自动化策略与铸造合约直接交互，往往绕过前端，甚至偶尔绕过交易池。

TIMEPieces NFT 空投是这方面的一个典型例子。高级机器人运行者在开始铸造前[查看](https://twitter.com/_anishagnihotri/status/1441072865764429825?s=20) [nft.time.com](https://nft.time.com/) 的前端源代码。这样，他们可以提前几个小时在主网找到部署了的铸造合约和建造好的机器人。因此，这些机器人在铸造中有一个显著的优势——三分钟内全部售出。在普通参与者连接钱包和提交交易时，已经太晚了。

此外，有些人使用 Flashbots 绕过交易池，直接提交交易给矿工。虽然 TIMEPieces 的合约限制了参与者每个地址最多铸造 10 个 NFT，机器人运行者 0x35…ce5 提前计划，把资金分到 5 个钱包，在一个 Flashbots 交易捆里抢夺了 50 个 NFT。

这个交易捆包含了 5 个来自不同地址的铸造交易，避开了对每个地址铸造数的限制。

另外，由于这个参与者使用了 Flashbots （使得回滚交易的成本为 0 )，他们并没有遭遇我们在上文例子中的失败交易情况。这不同于接近 10,962 名普通技术水平参与者在 100 个区块的 12,743 笔回滚交易里损失了累计 252.62 个 ETH (近 800,000 美元) 的交易费，因为他们的尝试是失败的。

### 低 Gas 效率

一个有效的 NFT 铸造机制应该对所有参与者来说都是易于使用的——最好是步骤少，实现简单。对于实现不同于先到先得分发模式的 NFT 铸造，一个常见的问题是会引入复杂性，增加用户必须在链上进行的交易数。

一个例子是 [Jay Pegs Auto Mart](https://jaypegsautomart.com/) 在 [Miso](https://miso.sushi.com/) 上的 $DONA 拍卖。尽管该铸造开创了批量竞拍 NFT 分发方式，并有效展示了元数据生成在实践中的公平性，但它是以牺牲 gas 和交易效率为代价的。

为了参与铸造过程，用户必须在 8 天内至少进行 4 次链上交易：

1.  首先，用户将 ETH 提交到一个 Miso 的批量拍卖中，而不知道他们会收到多少美元的 $DONA 代币作为交换 (取决于最终的结算价格)
    
2.  一旦拍卖结束，用户必须领取他们的 $DONA 代币
    
3.  此时，所有用户所处的情况有三种：不够代币铸造一个 NFT、刚好够和有太多代币。基于参与的 1,363 名铸造者的情况，我们发现有 273 名不够代币，0 名刚好够，和 1090 名代币太多 (超过一个代币的零头)。
    
    1.  拥有太少代币的用户将不得不交易，以从 Sushiswap 获得必要的剩余代币。
        
    2.  拥有太多代币的用户可以选择同意用 $DONA 代币做交易，然后通过 Sushiswap 进行交易，卖出他们的盈余。
        
4.  当用户有足够的 $DONA 来铸造一个 NFT 时，他们可以同意 NFT 合约花费他们的 $DONA ，然后烧毁他们的 $DONA 以铸造一个 NFT。
    
5.  最后，元数据会批量地被分给 NFT，不能披露某一个 NFT 的元数据。
    

虽然这种机制力求公平，它增加了用户参与的困难，且要消耗很多 gas。

### 排他的铸造

NFT 收藏者和爱好者评估收藏品价值的一个方法是通过其社区力量。通常情况下，这涉及衡量持有者的代币集中度。理想的收藏品往往集中度低，有利于个人参与者而不是很多巨鲸。

不过，在最近的铸造中，出现了引入批量铸造的新趋势，即参与者可以在单笔交易里铸造多于一个代币。通过这种机制，巨鲸铸造者会受激励，以较少的 gas 开销铸造许多 NFT。

在实践中的一个例子是 Stoner Cat 的空投，这是一个支持制作 Mila Kunis 和朋友们的动画短片的收藏品 NFT 铸造，允许一次铸造多达 20 个 NFT。考虑到这个功能，89% 的 NFT 都通过批量铸造功能铸造，且接近 31% 的 Stoner Cats 是以最多 20 个 NFT 的批量铸造的。

此外，所有以固定价格出售的 NFT 都隐含着防止个人参与低于结算价的活动。这减少了分发的公平性，使天平倾向于那些巨鲸，特别是考虑到制造的昂贵程度。

### 受信任的运营商

无论是执行中心化的抽奖方式来避免 gas 战，还是使用 Chainlink 来提供公平性，一个常见的权衡是引入对第三方的信任假设。如果 NFT 铸造必须依赖越多的链下基础设施，用户就必须对中心化的链下实体有更多的信任。

良好发行的目标
-------

通过观察这些发行并分析人们在实践中遇到的问题，我们现在可以得出我们所认为NFT 发行应有的六个理想特性。我们没有野心说这份清单是完整的，但它是一个开始。

**不可被破坏的公平性**：发行必须有真正的随机性，以确保抢夺性用户无法以牺牲没那么熟练的用户的利益来抢夺最稀有的物品。

**没有竞赛条件**：每当一个 NFT (或任何商品，真的) 以低于其公平的市场价格出售时，它就会变成 Vitalik Buterin 所说的[用其他方式竞拍](https://vitalik.ca/general/2021/08/22/prices.html)。实际上，买家竞相让他们的交易尽可能快地被挖出来，或附上一笔大的汇款给矿工。任何“用其他方式竞拍”都有利于那些对区块链有更深的认识、和能用到像机器人、如 Flashbots 或 Eden 这样的私人中继，或甚至是直接与矿工接触。

**不分时间段**：常见的情况是，先到先得模式的发行会公布在一个特定的区块高度，然后在短时间内售罄。无论选择什么样的区块高度，都总是会对目前正在睡觉或工作的其他时区的用户不利。因此，发行时间不应该太短，这样人们就可以在不改变日常生活的情况下参与。

**节省 gas** ：链上交易 (特别在以太坊上) 是很贵的，因此一个好的发行应该尽量最小化用户必须进行的交易数。

**包容性和抗女巫攻击**：通常情况下，确保 NFT 的发行对多元的持有者开放是符合 NFT 创建者的最佳利益的，即使这会导致市场最初的结算价格有点低。这是因为，一个充满活力的社区是收藏品在二级市场价值的最终驱动力。

**无需信任**：当然，说了这么多，发行机制应该致力于维护底层区块链的属性。这意味着它必须提供上述的好处，而不会变成需要托管或对运营商有过多的信任假设。

### 通过隐匿来实现安全是糟糕的设计

大多数发行在理论上都有一个或几个上述的问题，但在实践上，并没有足够多的需求使这些问题浮现。这就是通过隐匿来实现安全 (security by obscurity)。

例如，如果一个新收藏品被感知的市场价值很低，可能没有导致在交易池里出现竞价战的竞赛情况，不需要购买优先区块空间，且抢夺性用户也没有动机利用它。同样，如果一个新的收藏品的需求过大，那么这个收藏品可能很快就售罄了，以至于没有时间为它写定制软件或破坏其公平性。

虽然需求过少或过多引发的安全问题都值得重视，但我们认为，人们设计的发行应该始终在各种市场条件下都是稳健的，特别是不要依赖于收藏品的快速出售，以此作为保护它们免受抢夺的手段。

分解 NFT 发行
---------

尽管现在我们知道在一次良好的发行中我们想要什么，但我们仍然不知道如何达成。我们可以通过分解在底层实际发生的事来慢慢揭示这条路 (或者，正如我们将看到的，有很多条路)。

每一次的 NFT 发行，其核心都有四个步骤：

1.  **出价**：出售上线，用户向运营商提交他们的出价 (可以是一个智能合约)。
    
2.  **结算**：运营商将收集到的出价与剩余的供应量做匹配，确定结算价格，并选择中标的出价。
    
3.  **分发**：中标者可以认领他们新铸造的 NFT (或从运营商那里得到它们)。
    
4.  **揭示元数据**：运营商揭示 NFT 的属性。
    

例如，看看 Loot。Loot 在区块 13,108,877 以先到先得的方式出售。此收藏品的创作者 [dom](https://twitter.com/dhof) 在智能合约上把出售价格设置为 0，但用户仍然需要通过 gas 来竞价。在每个区块里，矿工根据剩余的供应量结算新的出价，决定谁赢谁输。当中标时，用户在同一笔交易里收到物品。

大多数用户在收到物品后才知道其特性。但是，在实践中，一个老练的用户可以在铸造前从智能合约读到他们物品的特性，从而使他们能够抢到最稀有的收藏品。这表明，无论其他步骤是否循序或连续发生，元数据必须在物品被购买并完成最终结算后才会被揭示。

接下来，我们将探讨 NFT 开发者在这四个步骤中每一步的选择。我们讨论每个选择对理想属性的影响，将好的设计选择从坏的中筛选出来。

### 阶段 1：出价

在这个阶段，运营商从其用户那里收集出价 (例如，购买请求)

### 连续结算 vs. 循序结算

在做其他事情之前，运营商必须决定他们希望出价和结算在相同的还是两个不重叠的阶段里进行。

任何先到先得的固定价格出售 (这是迄今为止大多数 NFT 发行的方式) 都是连续结算的例子。对于每个区块，矿工看着出价，根据剩余的供应量对它们进行结算。这个机制有几个问题：如果运营商高估了 NFT 的结算价格，该物品定价太高的话可能会卖不出。如果运营商低估了 NFT 的结算价格，该物品可能太便宜了，用户通过速度 (最能直接访问区块空间的人) 或 gas 价格 (能给矿工支付最多交易费的人) 来竞争。正如所讨论的那样，这导致了交易失败带来的净亏损，并很大程度上有利于技术纯熟的参与者。如果你必须这样做，前者可以通过将所有用户交易路由到 [Flashbots RPC](https://docs.flashbots.net/flashbots-protect/rpc/quick-start/) 来化解，并让竞拍在一个失败交易不消耗成本的环境下进行。

当采用第二种方案时，竞价和结算分在两个不重叠的阶段进行。在实践中，运营商首先收集所有的出价，然后将它们与可用的供应相匹配，以公平的价格做市场结算。这种方法包括批量竞拍或抽奖等机制。这种方法的一个例子是 [Jay Pegs Auto Mart](https://jaypegsautomart.com/)，它在市场结算前给用户一个星期的时间提交它们的出价。

循序法有几个好处是符合我们上述的目标的：

1.  没有竞赛情况：用户有充足的时间提交他们的出价，且结果是由用户愿意支付多少来决定的，而不是由他们的速度或技巧。
    
2.  不分时区：这个方法尊重在其他时区工作或生活的人
    

此外，因为不存在 gas 竞拍，也就没有对其他网络用户的负外部性。

但是，这种方法也是有缺点的，比如需要更多的链上交易 (取决于竞拍的设计) 或减少那些现在不得不等待更长时间的参与者的乐趣。我们建议不要让竞价期拉得太长，以减轻后一种忧虑，可能不超过 48 小时比较合适。

### 链上 vs.链下出价

在决定了是连续结算还是循序结算后，下一个选择是用户在链下还是链上提交他们的出价。

正如我们将看到的，今天的发行经常在链上收集出价，因为这是最简单的，能有效让矿工结算中标的出价，让其余的失败。如果我们假设网络本身是不受审查的，那么没有有效出价会在出售中被漏掉这种情况可以得到有力保证。

但是，在链下收集出价同样是可能的。在这个过程里，用户用他们的私钥对一条包含像他们的链上地址、令牌数或他们想购买的门票、他们的最高出价等的消息签名。他们发送这个消息给运营商而不是在链上执行，使用他们的签名来证明其有效性。

然后，运营商可以使用这些出价在链下市场做结算，或把中标的出价捆绑起来提交到链上的执行合约。无论采用哪种方法，都需要对运行商有一定程度的信任来执行正确的出价。

最后一种方法把链下出价收集和链上选择胜出者的方法结合起来，稳健、省 gas 且灵活。唯一用户需要信任的是运营商不会在链上提交出价时不会有遗漏的——这是一个相对较弱的假设。

### 谁可以出价

第三个要做的决定是谁可以出价，以及出多少钱。正如在目标包容性和抗女巫攻击中所讨论的，项目可能想确保不同的用户都可以购买他们的物品。为此，他们可能会限制具有特定特征的用户可购买的物品数量，或专门为现有 NFT 社区的持有人保留物品。

当出价发生在链下时，这样的 KYC 规则很容易执行——你只需要在让用户提交他们的签名到服务器之前让用户证明一定的信息。链上 KYC 则更复杂，但 Gitcoin 的隐私保护措施 [Proof of Personhood](https://proofofpersonhood.com/#) 正在取得进展。

即使一个项目不希望有任何形式的 KYC，他们仍然可以采取措施，确保一美元可以为大用户和小用户购买相同数量的代币。这个规则经常在合约允许用户在同一笔交易里购买或认领很多 NFT 时被违反，因为巨鲸可以在更多的令牌中摊销 gas 费，由此每个令牌比小型用户支付更少。为了减轻这种影响，为每个地址或每笔交易设置通证数量上限是一个不错的主意。

### 出价成本

此外，运营商必须决定用户何时为令牌付款——与出价一起，还是在市场结算之后？

在后面一种情况，用户只在出价阶段保留代币，市场结算，然后他们可以在一定的时间窗口内完成购买。[Parallel](https://parallel.life/) 这个项目就是使用这个方式的，加上链下出价。尽管它在一个比较安静的市场运作良好，当需求很高时，这个模型会进入竞赛状态，用户会想尽可能多地保留令牌，因为这样做没有成本。

为了缓解竞赛情况的问题，出价本身应该会涉及一项成本。这里最好的解决方法是让用户仅在同一地址的智能合约中锁定资金后才能提交出价。然后，运营商就可以决定如果出价不成功的话是要退还资金 (类似于交易所的限价订单) 还是保留出价 (类似于没有支付的抽奖券)。

### 出价的颗粒度

最后，运营商必须决定他们想要用户出价表达的颗粒度。当有失败的出价时 (因为供不应求)，人们必须进一步决定中标者和未中标者的定义。这里有三个可行的选项：

**“傻瓜式”批量竞拍**：人们提交一定数量的 ETH 后没有进一步的指示。在结算阶段，物品的数量除以提交的总 ETH，然后每个人获得以 ERC-20 形式的碎片化令牌，这些令牌之后可以兑换成 ERC-721 的 NFT。Jay Pegs Auto Mart 使用了这个方式，它的好处是没有失败的出价。但是，它的弊端是需要三笔额外的链上交易——两笔用于出售或购买通证以达到有用的数量 (例如，一个”完整的“ ERC-20)，一笔是用来赎回 NFT。最重要的是，这个方式不允许买家表达他们想要一定数量令牌的价格——这几乎是人们在每个市场上都期待的功能。

**”智能式“批量竞拍**：几年前，[SpankChain](https://twitter.com/ameensol/status/1437474410659651586?s=20) 在其 ICO 使用了类似的但可以说是更好的的方法。不同于 Jay Peg，SpankChain 收集允许指定令牌数和令牌单价的出价。在出价阶段后，他们计算了一个链下执行价，并与胜出的出价一起提到一个智能合约，如果胜出了，人们可以提出 SPANK，如果失败了，人们可以提取 ETH。这个方法的缺点是，匹配所有出价的计算非常复杂，以致它只能在链下进行，这需要对运营商有一定的信任。

**抽奖**：最后，运营商可以采用抽奖的方式，用户通过买票或预定进行出价。随后在所有票的池里随机抽出胜出者。这样，用户要么获得一个完整的令牌或什么都得不到，省去了 Jay Peg 的 $DONA 所需的三笔额外交易。那些难以支付一个完整 NFT 的小额钱包也可以参与。但是，它在出售中引入了随机性，有些用户喜欢，有些则不喜欢。

### 阶段2：结算

在这个阶段，运营商 (或他们的代表) 根据可得供应匹配出价，决定谁可以购买物品，谁不能。

### 链上 vs. 链下结算

最后一个主要节点是谁来从所有出价池里选出中标者。在先到先得的模式里，这由矿工完成，我们已经说明了这个方法有哪些问题。

在 Jay Peg 的结算机制里，它的计算复杂度低到足以在链上以完全去信任的方式进行。

在 SpankChain 的模式里，中标者完全在链下选出。尽管出价者无法以高于他们想要的价格成交 (智能合约确保了这一点)，他们还是必须信任运行商不会把他们推到最高成交价，类似于去中心化交易所里的三明治攻击的工作原理。

抽奖方式是最容易结算的，因为你只需要一个简单的随机数 (例如，Chainlink 的 VRF)。但是，需要随机性也引入另一个信任假设：无论谁生成这个随机性，都可能偏向于自己的出价而不是其他人。相反，胜出的出价就是最高出价这种情况是不可能的。

### 阶段3：分发

结算后，运营商必须铸造通证，把它们分发给用户，退回所有失败的出价，如果他们选择的是这种模式的话。这一步一般与 gas 效率和防止竞赛情况发生有关。

### 即时结算 vs. 间隔结算

如果运营商想要防止他们的用户同时领取 NFT，导致 gas 费激涨，他们可以再次使用结算过程的随机性，让人们分批领取。这解决集体行动问题，因为用户最好不要全部在同一个时间领取。尽管如此，对元数据的好奇和成为第一个在二级市场出售的想法可能最终还是会产生竞赛情况。也就是说，间隔结算的方式也会增加用户的等待时间。

### 领取 vs. 接收令牌

在分发方面唯一要提的是，用户是否必须自己领取通证，还是运营商可以简单地在一段时间内将令牌发给用户。后者是间隔结算的一个变体，但它还有用户什么都不用做这个额外的好处。在前文提到的 Parallel 发行使用了这种方式，收效不错，他们只要求用户在一开始支付 NFT 时添加一笔”交付费用 (delivery fee)"。

### 阶段4：揭示元数据

最后，当一个通证被分发出去时，它的元数据就会被揭示。在 NFT 发行的四个阶段里，这一步必须在最后。它也不能在最后与其他步骤一起进行 (例如，像 Meebit 那样把支付、分发和揭示捆绑在同一笔交易里)，因为通过回滚交易对有不良属性的物品进行重新打乱，公平性会被破坏。在支付和揭示之间必须有至少一个区块的间隔，使得重新打乱变得不可能，当然你可以选择增加这个间隔来防止重组。

### 什么时候揭示原数据

我们现在已经确定了，铸造 NFT 和揭示它的元数据不能再同一笔交易里发生，这就提出了应该什么时候揭示的问题。这不仅对公平性很重要，而且与用户体验和 gas 效率也有关。一般来说，有三种选择：

**揭示完整的收藏品**：在一个完整的收藏品揭示里，运营商等到收藏品集里所有的 NFT 都铸造完成后才揭示元数据。这个方法非常省 gas，只需要一个随机数，然后可以用来混洗票 ID 的元数据，而不需要用户进一步的操作。

但是，它有显著的缺点，即用户要等到所有的 NFT 都被铸造出来才能看到他们令牌的元数据。如果有人设置了什么时候揭示元数据的上限 (例如，24 小时)，有些用户可能没来得及铸造，导致整个收藏品集无法卖出。

**逐个 NFT 揭示**：为了改善揭示完整收藏品集的用户体验，运营商还可以允许用户逐个 NFT 揭示随机性。这样更有吸引力，因为用户购买后马上可以“打开”他们的物品。它还让“未打开的”物品在二级市场上交易 (这在 MTG 等交易卡游戏中很流行)。

然而，这种方法带来的负担是需要用户进行额外的链上交易，例如调用 Chainlink VRF 和对他们的 NFT 应用一个随机数。即使对于那些不觉得特别急于揭示或对交易未打开的物品没那么感兴趣的用户来说，这也是不可避免的。

**批量揭示**：作为一个潜在的中间地带，我们提出批量揭示这个概念。在这个方式里，用户有一段不确定的时间做铸造，但如果他们想的话也能在下一个区块揭示。每个请求的新随机数都会自动揭示所有铸造了的和等待分发的物品的元数据，揭示它们的成本几乎是相同和不变的。

因此，注重时间的用户可以选择支付额外的链上交易来揭示元数据，这对他们之前的所有用户都是有好处的。如果没有用户选择揭示，运营商也可以根据一定的时间表来揭示，例如每一个小时一次。

### 随机性的来源

在决定了何时揭示后，剩下的问题是在哪里获得随机性。我们建议的两个选项是使用 Chainlink VRF 或一个提交-揭示方案 ([commit-reveal scheme](https://en.wikipedia.org/wiki/Commitment_scheme))。

使用前者，你可以按访问链上可验证的随机性来源。使用任何一种揭示机制，你都可以调用 Chainlink 来请求随机性，一旦得到了满足，就使用随机生成的数字作为你的元数据计算的一项输入。这将确保它对每个 NFT 都是随机的。

对于后者，运营商可以在开售前创建一个随机数 (用于完整揭示) 或几个随机数 (用于逐个 NFT 或批量揭示)，然后提前提交他们的哈希值。当一个 NFT 被铸造了，运营商可以揭示这些数字，允许任何人通过哈希值验证它们的真实性。尽管如此，这个方式也需要对运营商有一定的信任，假设他们不会利用了解随机数的特权来铸造最好的那些 NFT。为了最小化对信任的需求，我们建议在铸造顺序上还是需要一定的独立随机化。

此外，对于链下元数据，运营商不是提交一个随机数，而是选择提交完成元数据的一个哈希值 (所有 NFT 的 id 到 特性)。这确保了元数据是预先确定的，且不会再铸造过程中或之后被修改。尽管如此，铸造顺序中的独立随机化是必要的，以防止运营商利用他们对顺序和特性的了解谋利。

我们给出的参考实现
---------

我们提供了一个[参考实现](https://github.com/Anish-Agnihotri/MultiRaffle)，我们认为它很好地平衡了所有的特性，而且易于理解和调整。

**出价**：在我们的实现里，用户可以通过购买抽奖券来出价。抽奖的时长由运营商决定 (我们建议 24-48 小时)。每张券的价格包含 gas 和每个 NFT 的价格，由运营商指定。后者作为“保证金”，在市场结算后对所有失败的券都会进行退还。抗女巫攻击有三个方式：每笔交易的 gas、锁定资金的资金成本，以及每个地址的券数上限。

**结算**：一旦出价期结束了，必须从所有券所在的池里抽出与 NFT 数量相等的胜出者。首先，任何人可以调用 `collectEntropy()`，以从 Chainlink VRF 获得一个随机数。这个随机性在 ‘shuffleEntries(),’ 使用，它执行 [Fisher-Yates Shuffle](https://en.wikipedia.org/wiki/Fisher%E2%80%93Yates_shuffle)。任何人都可以调用这个函数，保证活性和 gas 开销可社会化 (例如巨鲸们那样)。

**分发**：在所有中标者都被抽出后，用户有一个不定期限从他们胜出的券领取 NFT 和获得失败券的退款。这种情况都在同一笔交易发生。运营商现在可以开始提取胜券的收益。

**揭示元数据**：用户可以在领取后的一个区块揭示 NFT 的元数据。任何人都可以请求一个新的随机数，它会自动揭示所有物品的元数据，这些物品已经被铸造出来并等待分配。这允许注重时间的用户为立即揭示付款，但使所有用户受益。

总结
--

在这篇文章中，我们举了一些真实的例子来说明设计不良的 NFT 发行如何给用户带来次优的结果。但是，当有人清晰地定义他们的目标并花时间解构一个发行的实际步骤时，许多设计都变得可能——而且几乎所有的设计都比我们今天习惯的固定价格、先到先得和网络拥堵的出售来得好。

如果你从这篇文章没什么收获，可以看看以下三条规则：

*   **不可破坏的公平性是具有随机元数据的 NFT 发行的最关键特性**。使用强大的随机性，且在 NFT 被购买和结算前，永远不要揭示一个 NFT 的元数据。
    
*   **竞赛情况损害用户利益，无论有没有参与铸造**。使用循序出价和结算 (例如，抽奖或批量竞拍) 来解决这个问题。
    
*   **从第一分钟开始就考虑成本效益**。问问目前发生在链上的任何步骤是否也可以发生在链下，以为你的用户节省资金。链下步骤可以包括出价和市场结算，前提是用户可以对运营商建立一定程度的信任。可以考虑在揭示阶段分批进行。
    

我们希望看到 NFT 开发者开始试验其中的一些想法，从而发展出更多样的发行。最后，我们想感谢那些一直与 NFT 社区分享建议，帮助提高发行质量的人：

*   [Vitalik](https://vitalik.ca/general/2021/08/22/prices.html)——提供了它对先到先得固定价格出售的释义文章
    
*   [FairDrop](https://fairdrop.0xessential.com/)——分享了他们对公平抽线的概念证明设计
    
*   [dotta](https://twitter.com/dotta/status/1420372022790483979)——提供构建一个强大的前端的建议
    
*   [Jay Pegs Auto Mart](https://twitter.com/josephdelong/status/1437426536043454464?s=20) 和 [SpankChain](https://twitter.com/ameensol/status/1437474410659651586?s=20)——演示新颖的竞拍方式
    
*   [Parallel](https://twitter.com/Jeremystormsky/status/1421915852727885825?s=20)——演示了链下抽奖的最佳实践
    
*   [0xmons](https://twitter.com/0xmons/status/1409640045829447686?s=20)——提供关于设计公平发行的建议和工具
    

ECN的翻译工作旨在为中国以太坊社区传递优质资讯和学习资源，文章版权归原作者所有，转载须注明原文出处以及ethereum.cn，若需长期转载，请联系[eth@ecn.co](mailto:eth@ecn.co)进行授权。

---

*Originally published on [EthereumCN](https://paragraph.com/@ethereumcn-2/paradigm-nft)*
