区块链给开源软件的融资带来了革命性的变化,但并非所有东西在一开始就行得通。事实上,2016—2018年期间的ICO经常是严重有问题的机制,它们让创始人在交付任何产品前就能兑现。此后,我们吸取了许多教训,今天的项目在发行和分发代币之前都有一个工作产品,以激励使用和去中心化治理。
NFT被证明是另一种明确适用于加密货币的产品市场匹配,但它们正在经历自己的成长之痛。每个NFT的生命都开始于一次NFT发行(有时也称为铸造或空投)。一次NFT发行意味着有新的收藏品被首次创造、出售和分发给买家,他们随后会决定是持有还是在二级市场交易。
就像任何首次销售的商品一样,NFT的发行面临着为从未有过价格的东西定价的挑战。但与大多数其他东西的销售不同的是,它们还有一个额外的困难,那就是在一个充满独特特性的高度对抗性环境中进行,这些特性已经使缺乏经验的用户难以接近,这个环境就是公共区块链。因此,开发者必须设计出高效而稳健的机制,以防止被破坏。
本文以在现实世界中那些已经伤害了用户利益的NFT发行案例开始,以找出好的发行应该满足哪些目标。接下来,我们把发行分解为一个个的步骤,探索每个步骤的设计空间。最后,我们提供一个我们认为是设计良好的发行机制的参考实现,供社区使用和在其基础上构建。
损害用户利益的示例
随着时间的推移,我们已经注意到,NFT发行的某些设计模式一直给用户带来不良结果。
可被破坏的公平性
当一个新的收藏品推出时,用户可以与其智能合约交互,铸造一个具有随机属性的NFT。这些属性往往有不同的稀有度,使得有些组合比其他更稀缺和更有价值。例如,10,000个CryptoPunk里只有9个有超稀有的“外星人”特性,其中现在在市场上最便宜的一个标价35,000个ETH。
虽然不同人出于各种原因参与铸造,但其中很多人享受不知道他们将得到哪款以及稀有度如何的兴奋感。从这个意义上说,铸造NFT只不过是长时间以来在模拟经济(如集换式卡牌游戏里的增强包)和数字经济(如电子游戏的战利品盒/箱)中受欢迎的扭蛋机制的延续。
参与扭蛋游戏的人往往会做出一个重要的假设:他们从物品的随机分布中抽取,且真的有机会(尽管很小)抽到非常稀有的那个。不幸的是,过去的NFT铸造经常无法满足这个假设,无法创造真正的随机性。在实践中,这使得熟悉技术和有动机的各方利用铸造为自己谋利,抢夺收藏品中最稀有的那些,使诚实的参与者无法获得。
我们分享这种模式的两个案例,其中NFT铸造正是以这种方式被破坏。这两个案例都依赖于相同的两步过程:
1.抢夺者提取收藏品的元数据,使它们显示在一个单一稀有度分数中所有属性的相对频数。使用这个分数,他们然后可以确定一个收藏品集里最高价值的NFT。
2.然后,抢夺者打破铸造合约的随机性,以只铸造他们想要的稀有、最高价值的NFT。
Loot衍生品以及用链上元数据抢夺Loot
最近,一个名为Loot的项目席卷了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
如果我们观察直到铸造最后战利品包的稀有度,稀有的物品在整个铸造过程的分布是良好的。这表明没有明显的抢夺案例。
关于为什么Loot没有被破坏,有两个可能的解释:
1.这是一个全新的合约,因此人们还没准备好或缺乏时间发现漏洞
2.铸造Loot的预期价值并不明确,因为收藏品的价值只会在接下来几天在二级市场爆发。收藏品大概需要2.5个小时售完,这一点进一步支持这个假设。
然而,随着Loot的价格不断上涨,一系列像MoreLoot和ExtensionLoot这样的衍生品开始出现,它们大多数只是原始Loot合约的小分叉。新的收藏品继承了Loot的弱点,但市场价值更高,且得到更多的关注。这对这些收藏品铸造的公平与否产生了很大的影响。
MoreLoot
将稀有物品的分布与MoreLoot和原始Loot之间的铸造时间进行对比,抢夺的证据变得非常明显。仅仅几个区块之后,所有的稀有NFT已经被铸造完了,只剩下一些没有价值的给未来的铸造者,他们基本上不知道经验丰富的用户已经抢夺完了这次的发行。
来源:https://github.com/Anish-Agnihotri/blog-effective-nft-launches-data/tree/master/01-exploitable-fairness/mLoot
下图:红线指的是当Anish在推特上公开他的稀有度得分时,开始争夺稀有包的区块高度。
来源:https://github.com/Anish-Agnihotri/blog-effective-nft-launches-data/tree/master/01-exploitable-fairness/mLoot
此外,由于MoreLoot的供应量不断膨胀,因此可以预期抢夺者将对未来可得的包预先评分,并竞相铸造它们。
ExtensionLoot
与MoreLoot类似,ExtensionLoot具有一个单一地址,可以铸造最稀有的10个袋子里的5个(所有铸造的NFT都以红色标示)。独特的地方在于,这些NFT被隐藏在显而易见的地方,因为抢夺者在连续瞄准稀有包之前,会慢慢把它们和可得包分发出去。
Source来源:https://github.com/Anish-Agnihotri/blog-effective-nft-launches-data/tree/master/01-exploitable-fairness/xLoot
Meetbits以及用链下元数据抢夺Meebit
Meebits是由CryptoPunks的创造者LarvaLabs推出的备受期待的NFT,拥有20,000个独一无二的3D人物。
LarvaLabs知道精明的用户可以利用收藏品的元数据来计算稀有度,然后抢夺稀有的NFT。为了解决这个问题,他们以这样的方式设计他们的网站:他们允许买家看到每个Meebit的完整元数据,但仅在NFT被铸造完后。
尽管该网站明确隐藏了未铸造的Meebits,但有人查看源代码,发现LarvaLabs从IPFS上提取元数据。利用这个信息,他们还是搜刮了IPFS,提取了未铸造的Meebits的元数据,找出了最想要的那些。
然而,Larvalabs仍然没有让抢夺者轻易实现:不同于Loot,用户不能铸造特定MeebitID的NFT。相反,链上的随机性被用作哈希值(理论上矿工仍然可以利用),使这个特定用户更难以铸造一个稀有的Meebit。
但是,掠夺者知道如何在糟糕情况下取得最好的结果。他们写了一个购买Meebits的合约,查看它们的ID,然后再“打乱”它们。具体来说,Meebit合约是一个有mint()函数的ERC721,它会返回一个随机的MeebitID。抢夺者的合约可以调用mint,将返回的MeebitID与它们的稀有度列表进行对比,如果没有超过一定的稀有度分数,就回滚交易(示例代码)。用这一招,他们只需支付大约0.03个ETH来查看每个ID,而不用花大约2.5个ETH直接购买Meebit。
尽管攻击者在这个过程中烧了很多失败的交易,因此也会烧掉很多gas费用,他们最后获得大约400个ETH的收益。今天,同样的掠夺者可以通过Flashbots的交易捆发送交易,如果得到他们想要的ID,就给矿工支付费用——使回滚交易完全免费。
攻击者铸造并卖出Meebit#16647,它具有极其稀有的“访问者”特征。
Gas竞拍
在9月,有7个特别时期以太坊每gas的基本费用超过了1,250gwei。令人震惊的是,这7次发生的情况都是因为备受关注的NFT发行扰乱了网络。
从左到右:G’EVOLS、TheSevens、Sipher、GalaxyEggs、Omnimorphs+ArtBlocksDemocracity、GalacticApes和KingFrogs
大多数这些发行采用的是固定价格、先到先得(FCFS)的机制。由于价格低、需求过大,获得这些NFT的竞争从合约出售变成了在交易池里的gas竞拍。
其中一个例子是TheSevensNFT的空投,这是一个备受关注的收藏品集,有7,000张以反乌托邦人物为主题的收藏品作为个人头像。由于每张NFT的初始价格为0.07个ETH,热心的参与者都赶紧到合约上去铸造。在短短6分钟内,gas价格达到12,246gwei的峰值,仅在合约铸造的gas费上面,参与者支付的中位数是每个NFT大约1.49个ETH,而最高的5%的人每个NFT支付了2.44个ETH。
在theSeven铸造中,快速上涨的区块基本费用
gas竞拍的问题不仅仅是它们在使用上更具挑战,而是通过以这种方式“滥用”公共交易池,它们为所有以太坊用户创造了负外部性。他们还迫使用户为同一个NFT支付不同的金额,导致成千上万出价不足的交易失败,伤害了用户利益。
高技术门槛
正如我们之前看到的,以太坊是一个黑暗森林,有很多高水平的、敌对的行动者总在寻求机会。NFT铸造,特别是稀有的那些,买家期望在铸造后能在二级市场获得溢价,这为技术熟练的各方提供了比普通参与者更多有利可图的机会。
这些参与者通过机器人和自动化策略与铸造合约直接交互,往往绕过前端,甚至偶尔绕过交易池。
TIMEPiecesNFT空投是这方面的一个典型例子。高级机器人运行者在开始铸造前查看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铸造,一个常见的问题是会引入复杂性,增加用户必须在链上进行的交易数。
一个例子是JayPegsAutoMart在Miso上的$DONA拍卖。尽管该铸造开创了批量竞拍NFT分发方式,并有效展示了元数据生成在实践中的公平性,但它是以牺牲gas和交易效率为代价的。
为了参与铸造过程,用户必须在8天内至少进行4次链上交易:
1.首先,用户将ETH提交到一个Miso的批量拍卖中,而不知道他们会收到多少美元的$DONA代币作为交换(取决于最终的结算价格)
2.一旦拍卖结束,用户必须领取他们的$DONA代币
3.此时,所有用户所处的情况有三种:不够代币铸造一个NFT、刚好够和有太多代币。基于参与的1,363名铸造者的情况,我们发现有273名不够代币,0名刚好够,和1090名代币太多(超过一个代币的零头)。
拥有太少代币的用户将不得不交易,以从Sushiswap获得必要的剩余代币。
拥有太多代币的用户可以选择同意用$DONA代币做交易,然后通过Sushiswap进行交易,卖出他们的盈余。
4.当用户有足够的$DONA来铸造一个NFT时,他们可以同意NFT合约花费他们的$DONA,然后烧毁他们的$DONA以铸造一个NFT。
5.最后,元数据会批量地被分给NFT,不能披露某一个NFT的元数据。
虽然这种机制力求公平,它增加了用户参与的困难,且要消耗很多gas。
排他的铸造
NFT收藏者和爱好者评估收藏品价值的一个方法是通过其社区力量。通常情况下,这涉及衡量持有者的代币集中度。理想的收藏品往往集中度低,有利于个人参与者而不是很多巨鲸。
不过,在最近的铸造中,出现了引入批量铸造的新趋势,即参与者可以在单笔交易里铸造多于一个代币。通过这种机制,巨鲸铸造者会受激励,以较少的gas开销铸造许多NFT。
在实践中的一个例子是StonerCat的空投,这是一个支持制作MilaKunis和朋友们的动画短片的收藏品NFT铸造,允许一次铸造多达20个NFT。考虑到这个功能,89%的NFT都通过批量铸造功能铸造,且接近31%的StonerCats是以最多20个NFT的批量铸造的。
此外,所有以固定价格出售的NFT都隐含着防止个人参与低于结算价的活动。这减少了分发的公平性,使天平倾向于那些巨鲸,特别是考虑到制造的昂贵程度。
受信任的运营商
无论是执行中心化的抽奖方式来避免gas战,还是使用Chainlink来提供公平性,一个常见的权衡是引入对第三方的信任假设。如果NFT铸造必须依赖越多的链下基础设施,用户就必须对中心化的链下实体有更多的信任。
良好发行的目标
通过观察这些发行并分析人们在实践中遇到的问题,我们现在可以得出我们所认为NFT发行应有的六个理想特性。我们没有野心说这份清单是完整的,但它是一个开始。
不可被破坏的公平性:发行必须有真正的随机性,以确保抢夺性用户无法以牺牲没那么熟练的用户的利益来抢夺最稀有的物品。
没有竞赛条件:每当一个NFT(或任何商品,真的)以低于其公平的市场价格出售时,它就会变成VitalikButerin所说的用其他方式竞拍。实际上,买家竞相让他们的交易尽可能快地被挖出来,或附上一笔大的汇款给矿工。任何“用其他方式竞拍”都有利于那些对区块链有更深的认识、和能用到像机器人、如Flashbots或Eden这样的私人中继,或甚至是直接与矿工接触。
不分时间段:常见的情况是,先到先得模式的发行会公布在一个特定的区块高度,然后在短时间内售罄。无论选择什么样的区块高度,都总是会对目前正在睡觉或工作的其他时区的用户不利。因此,发行时间不应该太短,这样人们就可以在不改变日常生活的情况下参与。
节省gas:链上交易(特别在以太坊上)是很贵的,因此一个好的发行应该尽量最小化用户必须进行的交易数。
包容性和抗女巫攻击:通常情况下,确保NFT的发行对多元的持有者开放是符合NFT创建者的最佳利益的,即使这会导致市场最初的结算价格有点低。这是因为,一个充满活力的社区是收藏品在二级市场价值的最终驱动力。
无需信任:当然,说了这么多,发行机制应该致力于维护底层区块链的属性。这意味着它必须提供上述的好处,而不会变成需要托管或对运营商有过多的信任假设。
通过隐匿来实现安全是糟糕的设计
大多数发行在理论上都有一个或几个上述的问题,但在实践上,并没有足够多的需求使这些问题浮现。这就是通过隐匿来实现安全(securitybyobscurity)。
例如,如果一个新收藏品被感知的市场价值很低,可能没有导致在交易池里出现竞价战的竞赛情况,不需要购买优先区块空间,且抢夺性用户也没有动机利用它。同样,如果一个新的收藏品的需求过大,那么这个收藏品可能很快就售罄了,以至于没有时间为它写定制软件或破坏其公平性。
虽然需求过少或过多引发的安全问题都值得重视,但我们认为,人们设计的发行应该始终在各种市场条件下都是稳健的,特别是不要依赖于收藏品的快速出售,以此作为保护它们免受抢夺的手段。
分解NFT发行
尽管现在我们知道在一次良好的发行中我们想要什么,但我们仍然不知道如何达成。我们可以通过分解在底层实际发生的事来慢慢揭示这条路(或者,正如我们将看到的,有很多条路)。
每一次的NFT发行,其核心都有四个步骤:
1.出价:出售上线,用户向运营商提交他们的出价(可以是一个智能合约)。
2.结算:运营商将收集到的出价与剩余的供应量做匹配,确定结算价格,并选择中标的出价。
3.分发:中标者可以认领他们新铸造的NFT(或从运营商那里得到它们)。
4.揭示元数据:运营商揭示NFT的属性。
例如,看看Loot。Loot在区块13,108,877以先到先得的方式出售。此收藏品的创作者?dom在智能合约上把出售价格设置为0,但用户仍然需要通过gas来竞价。在每个区块里,矿工根据剩余的供应量结算新的出价,决定谁赢谁输。当中标时,用户在同一笔交易里收到物品。
大多数用户在收到物品后才知道其特性。但是,在实践中,一个老练的用户可以在铸造前从智能合约读到他们物品的特性,从而使他们能够抢到最稀有的收藏品。这表明,无论其他步骤是否循序或连续发生,元数据必须在物品被购买并完成最终结算后才会被揭示。
接下来,我们将探讨NFT开发者在这四个步骤中每一步的选择。我们讨论每个选择对理想属性的影响,将好的设计选择从坏的中筛选出来。
阶段1:出价
在这个阶段,运营商从其用户那里收集出价(例如,购买请求)
连续结算vs.循序结算
在做其他事情之前,运营商必须决定他们希望出价和结算在相同的还是两个不重叠的阶段里进行。
任何先到先得的固定价格出售(这是迄今为止大多数NFT发行的方式)都是连续结算的例子。对于每个区块,矿工看着出价,根据剩余的供应量对它们进行结算。这个机制有几个问题:如果运营商高估了NFT的结算价格,该物品定价太高的话可能会卖不出。如果运营商低估了NFT的结算价格,该物品可能太便宜了,用户通过速度(最能直接访问区块空间的人)或gas价格(能给矿工支付最多交易费的人)来竞争。正如所讨论的那样,这导致了交易失败带来的净亏损,并很大程度上有利于技术纯熟的参与者。如果你必须这样做,前者可以通过将所有用户交易路由到FlashbotsRPC来化解,并让竞拍在一个失败交易不消耗成本的环境下进行。
当采用第二种方案时,竞价和结算分在两个不重叠的阶段进行。在实践中,运营商首先收集所有的出价,然后将它们与可用的供应相匹配,以公平的价格做市场结算。这种方法包括批量竞拍或抽奖等机制。这种方法的一个例子是JayPegsAutoMart,它在市场结算前给用户一个星期的时间提交它们的出价。
循序法有几个好处是符合我们上述的目标的:
1.没有竞赛情况:用户有充足的时间提交他们的出价,且结果是由用户愿意支付多少来决定的,而不是由他们的速度或技巧。
2.不分时区:这个方法尊重在其他时区工作或生活的人
此外,因为不存在gas竞拍,也就没有对其他网络用户的负外部性。
但是,这种方法也是有缺点的,比如需要更多的链上交易(取决于竞拍的设计)或减少那些现在不得不等待更长时间的参与者的乐趣。我们建议不要让竞价期拉得太长,以减轻后一种忧虑,可能不超过48小时比较合适。
链上vs.链下出价
在决定了是连续结算还是循序结算后,下一个选择是用户在链下还是链上提交他们的出价。
正如我们将看到的,今天的发行经常在链上收集出价,因为这是最简单的,能有效让矿工结算中标的出价,让其余的失败。如果我们假设网络本身是不受审查的,那么没有有效出价会在出售中被漏掉这种情况可以得到有力保证。
但是,在链下收集出价同样是可能的。在这个过程里,用户用他们的私钥对一条包含像他们的链上地址、令牌数或他们想购买的门票、他们的最高出价等的消息签名。他们发送这个消息给运营商而不是在链上执行,使用他们的签名来证明其有效性。
然后,运营商可以使用这些出价在链下市场做结算,或把中标的出价捆绑起来提交到链上的执行合约。无论采用哪种方法,都需要对运行商有一定程度的信任来执行正确的出价。
最后一种方法把链下出价收集和链上选择胜出者的方法结合起来,稳健、省gas且灵活。唯一用户需要信任的是运营商不会在链上提交出价时不会有遗漏的——这是一个相对较弱的假设。
谁可以出价
第三个要做的决定是谁可以出价,以及出多少钱。正如在目标包容性和抗女巫攻击中所讨论的,项目可能想确保不同的用户都可以购买他们的物品。为此,他们可能会限制具有特定特征的用户可购买的物品数量,或专门为现有NFT社区的持有人保留物品。
当出价发生在链下时,这样的KYC规则很容易执行——你只需要在让用户提交他们的签名到服务器之前让用户证明一定的信息。链上KYC则更复杂,但Gitcoin的隐私保护措施ProofofPersonhood正在取得进展。
即使一个项目不希望有任何形式的KYC,他们仍然可以采取措施,确保一美元可以为大用户和小用户购买相同数量的代币。这个规则经常在合约允许用户在同一笔交易里购买或认领很多NFT时被违反,因为巨鲸可以在更多的令牌中摊销gas费,由此每个令牌比小型用户支付更少。为了减轻这种影响,为每个地址或每笔交易设置通证数量上限是一个不错的主意。
出价成本
此外,运营商必须决定用户何时为令牌付款——与出价一起,还是在市场结算之后?
在后面一种情况,用户只在出价阶段保留代币,市场结算,然后他们可以在一定的时间窗口内完成购买。Parallel这个项目就是使用这个方式的,加上链下出价。尽管它在一个比较安静的市场运作良好,当需求很高时,这个模型会进入竞赛状态,用户会想尽可能多地保留令牌,因为这样做没有成本。
为了缓解竞赛情况的问题,出价本身应该会涉及一项成本。这里最好的解决方法是让用户仅在同一地址的智能合约中锁定资金后才能提交出价。然后,运营商就可以决定如果出价不成功的话是要退还资金(类似于交易所的限价订单)还是保留出价(类似于没有支付的抽奖券)。
出价的颗粒度
最后,运营商必须决定他们想要用户出价表达的颗粒度。当有失败的出价时(因为供不应求),人们必须进一步决定中标者和未中标者的定义。这里有三个可行的选项:
“傻瓜式”批量竞拍:人们提交一定数量的ETH后没有进一步的指示。在结算阶段,物品的数量除以提交的总ETH,然后每个人获得以ERC-20形式的碎片化令牌,这些令牌之后可以兑换成ERC-721的NFT。JayPegsAutoMart使用了这个方式,它的好处是没有失败的出价。但是,它的弊端是需要三笔额外的链上交易——两笔用于出售或购买通证以达到有用的数量(例如,一个”完整的“ERC-20),一笔是用来赎回NFT。最重要的是,这个方式不允许买家表达他们想要一定数量令牌的价格——这几乎是人们在每个市场上都期待的功能。
”智能的“批量竞拍:几年前,SpankChain在其ICO使用了类似的但可以说是更好的的方法。不同于JayPeg,SpankChain收集允许指定令牌数和令牌单价的出价。在出价阶段后,他们计算了一个链下执行价,并与胜出的出价一起提到一个智能合约,如果胜出了,人们可以提出SPANK,如果失败了,人们可以提取ETH。这个方法的缺点是,匹配所有出价的计算非常复杂,以致它只能在链下进行,这需要对运营商有一定的信任。
抽奖:最后,运营商可以采用抽奖的方式,用户通过买票或预定进行出价。随后在所有票的池里随机抽出胜出者。这样,用户要么获得一个完整的令牌或什么都得不到,省去了JayPeg的$DONA所需的三笔额外交易。那些难以支付一个完整NFT的小额钱包也可以参与。但是,它在出售中引入了随机性,有些用户喜欢,有些则不喜欢。
阶段2:结算
在这个阶段,运营商(或他们的代表)根据可得供应匹配出价,决定谁可以购买物品,谁不能。
链上vs.链下结算
最后一个主要节点是谁来从所有出价池里选出中标者。在先到先得的模式里,这由矿工完成,我们已经说明了这个方法有哪些问题。
在?JayPeg的结算机制里,它的计算复杂度低到足以在链上以完全去信任的方式进行。
在SpankChain的模式里,中标者完全在链下选出。尽管出价者无法以高于他们想要的价格成交(智能合约确保了这一点),他们还是必须信任运行商不会把他们推到最高成交价,类似于去中心化交易所里的三明治攻击的工作原理。
抽奖方式是最容易结算的,因为你只需要一个简单的随机数(例如,Chainlink的VRF)。但是,需要随机性也引入另一个信任假设:无论谁生成这个随机性,都可能偏向于自己的出价而不是其他人。相反,胜出的出价就是最高出价这种情况是不可能的。
阶段3:分发
结算后,运营商必须铸造通证,把它们分发给用户,退回所有失败的出价,如果他们选择的是这种模式的话。这一步一般与gas效率和防止竞赛情况发生有关。
即时结算vs.间隔结算
如果运营商想要防止他们的用户同时领取NFT,导致gas费激涨,他们可以再次使用结算过程的随机性,让人们分批领取。这解决集体行动问题,因为用户最好不要全部在同一个时间领取。尽管如此,对元数据的好奇和成为第一个在二级市场出售的想法可能最终还是会产生竞赛情况。也就是说,间隔结算的方式也会增加用户的等待时间。
领取vs.接收令牌
在分发方面唯一要提的是,用户是否必须自己领取通证,还是运营商可以简单地在一段时间内将令牌发给用户。后者是间隔结算的一个变体,但它还有用户什么都不用做这个额外的好处。在前文提到的Parallel发行使用了这种方式,收效不错,他们只要求用户在一开始支付NFT时添加一笔”交付费用(deliveryfee)"。
阶段4:揭示元数据
最后,当一个通证被分发出去时,它的元数据就会被揭示。在NFT发行的四个阶段里,这一步必须在最后。它也不能在最后与其他步骤一起进行(例如,像Meebit那样把支付、分发和揭示捆绑在同一笔交易里),因为通过回滚交易对有不良属性的物品进行重新打乱,公平性会被破坏。在支付和揭示之间必须有至少一个区块的间隔,使得重新打乱变得不可能,当然你可以选择增加这个间隔来防止重组。
什么时候揭示原数据
我们现在已经确定了,铸造NFT和揭示它的元数据不能再同一笔交易里发生,这就提出了应该什么时候揭示的问题。这不仅对公平性很重要,而且与用户体验和gas效率也有关。一般来说,有三种选择:
揭示完整的收藏品:在一个完整的收藏品揭示里,运营商等到收藏品集里所有的NFT都铸造完成后才揭示元数据。这个方法非常省gas,只需要一个随机数,然后可以用来混洗票ID的元数据,而不需要用户进一步的操作。
但是,它有显著的缺点,即用户要等到所有的NFT都被铸造出来才能看到他们令牌的元数据。如果有人设置了什么时候揭示元数据的上限(例如,24小时),有些用户可能没来得及铸造,导致整个收藏品集无法卖出。
逐个NFT揭示:为了改善揭示完整收藏品集的用户体验,运营商还可以允许用户逐个NFT揭示随机性。这样更有吸引力,因为用户购买后马上可以“打开”他们的物品。它还让“未打开的”物品在二级市场上交易(这在MTG等交易卡游戏中很流行)。
然而,这种方法带来的负担是需要用户进行额外的链上交易,例如调用ChainlinkVRF和对他们的NFT应用一个随机数。即使对于那些不觉得特别急于揭示或对交易未打开的物品没那么感兴趣的用户来说,这也是不可避免的。
批量揭示:作为一个潜在的中间地带,我们提出批量揭示这个概念。在这个方式里,用户有一段不确定的时间做铸造,但如果他们想的话也能在下一个区块揭示。每个请求的新随机数都会自动揭示所有铸造了的和等待分发的物品的元数据,揭示它们的成本几乎是相同和不变的。
因此,注重时间的用户可以选择支付额外的链上交易来揭示元数据,这对他们之前的所有用户都是有好处的。如果没有用户选择揭示,运营商也可以根据一定的时间表来揭示,例如每一个小时一次。
随机性的来源
在决定了何时揭示后,剩下的问题是在哪里获得随机性。我们建议的两个选项是使用ChainlinkVRF或一个提交-揭示方案(commit-revealscheme)。
使用前者,你可以按访问链上可验证的随机性来源。使用任何一种揭示机制,你都可以调用Chainlink来请求随机性,一旦得到了满足,就使用随机生成的数字作为你的元数据计算的一项输入。这将确保它对每个NFT都是随机的。
对于后者,运营商可以在开售前创建一个随机数(用于完整揭示)或几个随机数(用于逐个NFT或批量揭示),然后提前提交他们的哈希值。当一个NFT被铸造了,运营商可以揭示这些数字,允许任何人通过哈希值验证它们的真实性。尽管如此,这个方式也需要对运营商有一定的信任,假设他们不会利用了解随机数的特权来铸造最好的那些NFT。为了最小化对信任的需求,我们建议在铸造顺序上还是需要一定的独立随机化。
此外,对于链下元数据,运营商不是提交一个随机数,而是选择提交完成元数据的一个哈希值(所有NFT的id到特性)。这确保了元数据是预先确定的,且不会再铸造过程中或之后被修改。尽管如此,铸造顺序中的独立随机化是必要的,以防止运营商利用他们对顺序和特性的了解谋利。
我们给出的参考实现
我们提供了一个参考实现,我们认为它很好地平衡了所有的特性,而且易于理解和调整。
出价:在我们的实现里,用户可以通过购买抽奖券来出价。抽奖的时长由运营商决定(我们建议24-48小时)。每张券的价格包含gas和每个NFT的价格,由运营商指定。后者作为“保证金”,在市场结算后对所有失败的券都会进行退还。抗女巫攻击有三个方式:每笔交易的gas、锁定资金的资金成本,以及每个地址的券数上限。
结算:一旦出价期结束了,必须从所有券所在的池里抽出与NFT数量相等的胜出者。首先,任何人可以调用collectEntropy(),以从ChainlinkVRF获得一个随机数。这个随机性在?‘shuffleEntries(),’使用,它执行Fisher-YatesShuffle。任何人都可以调用这个函数,保证活性和gas开销可社会化(例如巨鲸们那样)。
分发:在所有中标者都被抽出后,用户有一个不定期限从他们胜出的券领取NFT和获得失败券的退款。这种情况都在同一笔交易发生。运营商现在可以开始提取胜券的收益。
揭示元数据:用户可以在领取后的一个区块揭示NFT的元数据。任何人都可以请求一个新的随机数,它会自动揭示所有物品的元数据,这些物品已经被铸造出来并等待分配。这允许注重时间的用户为立即揭示付款,但使所有用户受益。
总结
在这篇文章中,我们举了一些真实的例子来说明设计不良的NFT发行如何给用户带来次优的结果。但是,当有人清晰地定义他们的目标并花时间解构一个发行的实际步骤时,许多设计都变得可能——而且几乎所有的设计都比我们今天习惯的固定价格、先到先得和网络拥堵的出售来得好。
如果你从这篇文章没什么收获,可以看看以下三条规则:
不可破坏的公平性是具有随机元数据的NFT发行的最关键特性。使用强大的随机性,且在NFT被购买和结算前,永远不要揭示一个NFT的元数据。
竞赛情况损害用户利益,无论有没有参与铸造。使用循序出价和结算(例如,抽奖或批量竞拍)来解决这个问题。
从第一分钟开始就考虑成本效益。问问目前发生在链上的任何步骤是否也可以发生在链下,以为你的用户节省资金。链下步骤可以包括出价和市场结算,前提是用户可以对运营商建立一定程度的信任。可以考虑在揭示阶段分批进行。
我们希望看到NFT开发者开始试验其中的一些想法,从而发展出更多样的发行。最后,我们想感谢那些一直与NFT社区分享建议,帮助提高发行质量的人:
Vitalik——提供了它对先到先得固定价格出售的释义文章
FairDrop——分享了他们对公平抽线的概念证明设计
dotta——提供构建一个强大的前端的建议
JayPegsAutoMart和SpankChain——演示新颖的竞拍方式
Parallel——演示了链下抽奖的最佳实践
0xmons——提供关于设计公平发行的建议和工具
来源|Paradigm
作者|Hasu&?AnishAgnihotri
郑重声明: 本文版权归原作者所有, 转载文章仅为传播更多信息之目的, 如作者信息标记有误, 请第一时间联系我们修改或删除, 多谢。