去年,许多备受瞩目的ICO在一窝蜂的批评声中推出。整个社区都在寻找一种方法,以更公平和安全的方式在以太坊上进行代币销售。为了实现这些目标。
和
撰写了互动代币销售协议的技术文件,得到了很多人的关注。这终于是一种ICO模式,有可能给参与者提供估值和参与的保证。这里有几篇不同的文章,提供了它的工作原理的概要。
在这篇文章中,我想告诉你我们Modular是如何在TrueBit的伟大团队和社区中其他一些了不起的开发者和思想家的帮助下,建立和优化该协议的第一个实现。我还将探讨我们在此过程中面临的挑战。
先决条件
过去的代币销售面临许多问题,最明显的是有上限和无上限销售之间的权衡。在有上限的销售中,有些买家有可能没有及时赶到销售现场而被排除在外。在无上限销售中,买家不知道总估值将是多少,因此无法保证他们将购买总代币的百分比。
互动式代币发行协议旨在解决这两个问题,它允许市场通过一系列允许每个人参与的竞价来自由和公开地决定估价。
交互式首次代币发行协议(IICO)允许参与者在常规的ETH代币支付之外,提交一个所谓的个人估值上限的投标。这些出价确保用户根据他们对销售估值的期望,获得公平的代币购买或退款。用户还可以在整个销售的第一阶段撤回他们的出价,以获得部分退款。
通过这些机制,市场将销售的估值缩小到一个所有感兴趣的买家都能接受的价值。这个值将对代币购买价格或代币的总供应量产生影响,这取决于实施者如何配置销售。如果实施者在销售中设置一个固定的可用代币总数,那么由此产生的估值决定了代币的价格。如果实施者选择一个固定的代币价格,那么产生的估价决定了代币的总供应量。
销售结束后,销售合同会自动部署代币,以确保无信任的执行。代币购买者根据销售的结果分配他们的代币份额。
ETH贡献。参与者向销售发送的以太币,期望获得代币作为回报。这些ETH款项在整个销售过程中被加总,等于总的销售估值。
销售总估价。销售中所有有效出价的总和或筹集的ETH总量,不要与代币或项目本身的总估值相混淆,因为销售只处理总代币的一个百分比。这将在整个销售过程中波动,直到结束,届时将达到由参与者决定的平衡点。
个人估价上限。一个价值,如果超过总销售估价,将从销售中删除参与者的投标。它允许参与者表明他们可以接受的总销售估值。如果在销售的任何时候,总的销售估价高于参与者的个人估价上限,参与者的投标将被取消。这一点很重要,因为参与者可以根据这个公式,确保他们在销售中至少拥有总代币的一定比例。
最低百分比=(ETH支付)/(个人估值上限)。
第一阶段
在第一阶段,允许参与者随意提交和撤回出价。在这个阶段,总的销售估价将随着投标的提交和撤回而波动。
代币的价格开始时很低,然后线性增长,直到第一阶段结束,在剩下的销售过程中达到稳定的价格。
在第一阶段,人工提款会受到提款罚款,罚款从0%开始,在第一阶段结束时线性增加到100%。这是为了防止大买家试图虚假地发出大额出价的信号,撤回,并操纵估价。这笔退款中被扣留的ETH仍然用于为该参与者购买代币。
手动提款也会放弃从剩余的、永久承诺的代币的较低购买价格中获得的一定比例的奖励代币。
由于总的销售估价在第一阶段会因存款和提款而上下浮动,即使超过了个人估价上限,每个投标仍然是 "活跃 "的,这意味着它仍然对销售有影响或可能有影响。
第二阶段
第一阶段和第二阶段之间的过渡被称为"退出锁定"。 在第二阶段,仍然允许提交,但所有活跃的出价在销售期间都被承诺。只有当参与者的出价最低时,才允许撤回ETH退款,这意味着他们的个人上限低于总销售估值--换句话说,被排除在销售之外。
售后。
销售结束后,代币智能合约会自动部署,并根据销售结果分配代币。任何参与者都可以提取他们购买的代币或退还的乙醚。在销售过程中不能提取代币,因为估值波动,购买的代币有可能会被退回。提取的代币和/或乙醚会被发送到参与者的地址。
手动取款详情
现在我们知道了这两个阶段是什么,让我们看看手动提款的过程。在第一阶段,参与者可以手动撤回他们提交的投标,并收到他们的ETH的线性递减比例的回报。这是为了防止大买家试图发出虚假的信号和操纵估值。这笔退款中被扣留的ETH仍然用于为该参与者购买代币,其余的则被退还。
此外,手动提款会丧失剩余的、永久承诺的代币上的一定比例的早期贡献奖金。关于这两项惩罚措施的原因,见技术文件的第5.3节。被扣留的ETH仍然以代币购买的形式用于众筹--这部分被惩罚的ETH已经不能被提取了。
在第二阶段,就像上面提到的那样,只有当参与者的上限超过了总估值时,才允许手动提款。这些退出者会得到完全的退款,因为他们的缴款对销售没有影响。提款锁定后,销售总估值将单调地增加,这意味着它只能保持不变或增加。
回顾一下。
这只是一个基本的解释,提供一些关于互动式代币销售的背景信息。在这篇文章中,我假设读者知道销售工作的一般基础知识。你可以在技术文件之外,阅读我上面链接的一些文章,以更好地掌握该协议的一些复杂情况。
在这里写了一个很好的总结。
交互式代币发行--一种协议的解释
迄今为止,大多数的代币销售都受到了某种形式的批评。这表明还没有出现一个...
媒介网
模块化图书馆
如果你读过我的任何作品或
如果你看过我们的帖子或者查看了我们的资料库或网站,你就会知道我们正在创建安全的标准库,这些库很容易理解并立即使用。本着这一精神,我们决定将互动式代币销售的实现建立在我们的基础众筹库之上,该库包含了几乎所有众筹模式所共有的成熟功能和存储结构,因此任何人都可以将其作为库函数来利用。你可以在我的第一篇文章中阅读更多关于这个库的信息。
在独特的代币销售模式中寻找共同点
关于公共代币销售模式的系列文章中的第一篇
媒介网
链接列表库
为了存储排序后的个人估值上限,我们需要一个可以按递增顺序排序的数据结构,同时允许轻松插入和删除。听起来像是对链接列表的描述我们有一个基于伟大工作的库,也是为这个库做的
在他的实现中,创建了一个使用uint256 => bool映射的链接列表。你可以在我的上一篇文章中阅读更多关于如何工作的信息。
Solidity中的循环链接列表!
映射不是很好吗?
媒介网
初稿详情
当我们第一次建立交互式代币销售的实现时,我们把技术文件中的内容直接翻译成智能合约的形式。
明显的问题
在代码中实施理论工作,会有一些权衡和问题,而这些问题在理论上不一定适用。另外,智能合约编程是一个新的范式,它产生了普通代码不一定有的问题,最明显的是围绕执行成本,即气体使用。
从销售中删除标书要花费太多的汽油。
在技术文件中规定,当总的销售估价超过投标人的个人估价上限时,他们的投标应从销售中删除。这似乎相当简单,我们在submitBid函数中实现了这一功能,作为一个循环,遍历已提交的竞标,删除任何个人估值上限低于总销售估值的竞标,并发送退款,直到总销售估值恢复到小于所有已提交的竞标。如果你有兴趣看到这段代码,请在这里查看实现。
正如你可能看到的,这带来了一个潜在的问题,即未经检查的气体使用。如果一个用户提交了一个大的投标,可能会有许多投标需要被删除,可能会给投标人带来大量的气体费用,甚至超过了块状气体的限制
当务之急是,IICO协议的所有参与者都得到平等对待。参与者不应该因为其他用户的行为而受到高额用气的惩罚。因此,我们需要完全重新设计销售如何跟踪出价。
重新设计
重新设计后,不断计算参与销售的截止日期,并记录哪些出价有效,哪些无效,不会自动退款。销售结束后,如果他们的上限没有超过总价值,参与者可以撤回他们的代币。如果他们的估值上限被超过,他们基本上被从销售中移除,因此他们为销售贡献的ETH总量被退还,可供提取。这避免了在整个销售过程中,当投标被分类和删除/部分删除时,在以前的版本中需要昂贵的循环和计算,削减了气体价格。发送ETH是一个昂贵的交易,所以删除所有不必要的ETH转移是非常重要的。两个版本都执行了技术文件第5.2节中讨论的单调增长的估值变量,但这个版本大大削减了气体成本。
这个版本还强制规定,个人估值上限只能以均匀间隔的估值方式提交。这些间隔是由每个个人估值上限的3个最重要的数字组成的。这使得持有个人估值的链接列表结构中存在均匀的间隔,这意味着投标的间隔更有效,进一步节省搜索链接列表的气体。
估值截止点
为了达到这个目的,图书馆在整个销售过程中使用了一个指针,指示链接列表中的个人估价上限是允许参加销售的截止点。它只计算那些个人估价上限大于总销售估价的投标,以计入总销售估价。这个指针将与销售总额相关联,但由于它总是指向已提交的个人估值上限,它往往不会完全等于销售总额,但会相对接近。
在销售开始时,指针被设置为0,表明销售的估价为0,并且没有提交或从销售中 "丢弃 "的出价。
投标过程。
(这个过程取自InteractiveCrowdsaleLib.sol中的submitBid函数)。
每次提交新的投标,其个人估值上限都会被添加到个人估值上限的排序链接列表中。然后,合约将其投标添加到所有以该个人估值上限提交的投标的总和中。之后,它记录该投标中提交的ETH数量和提交投标时的代币价格奖金。
然后,如果个人估价上限小于当前的总销售估价,该出价仍由销售登记,但不计入总销售估价。如果个人估价上限大于当前的总销售估价,那么该出价将被加入当前的估价中,并且截断指针可能会增加,以显示哪些出价已经被 "踢出 "了销售。被指针超越的出价将从总的销售估价中减去,但仍保留记录,以防指针下降。
这个估价截止的指针机制在整个销售过程中都是活跃的,但在销售的第一阶段会增加和减少。提款锁定后,该指针和总销售估值一样,是单调增加的,也就是说,它不能减少,只能增加或保持不变,因为在这个阶段不可能进行人工提款。
如果你参考技术文件,你会在第4节第3步第3部分看到,等于当前估值指针的出价会被退还部分出价,而不是被踢出,以保持估值随着出价的移除而单调地增加。现在只需要做一次,在拍卖的最后阶段。个人估值上限等于估值指针的投标将被部分退还ETH,并以代币形式获得其余的购买量。这仍然满足了5.2节的要求。
估值指针机制演练
我将做一个快速的演练,用一些图来显示正确的指针运动。我们将从销售中的第一次出价开始,Josh发送了9ETH,个人估值上限为186ETH。下面是第一次出价后的状态。
正如你所看到的,Josh贡献了9个ETH,所以销售总估值增加到9。他的个人估值上限被添加到排序的上限列表中,但由于总的销售估值仍然小于他的上限,指针仍然指向零,显示所有的出价仍然留在销售中。
你可能会感到困惑,指针不等于当前的估值。其原因是,指针需要始终指向个人估值上限之一,表明哪个上限是留在销售中的截止点。这与技术文件第4节的规定略有不同,但对于指针机制的正常功能和确保销售估值的单调增长是必要的。
当第二份投标书的个人估值上限较高时,也会出现类似的状态。
到目前为止进行得很顺利!现在让我们看看,当提交的竞标书的个人估价上限低于总销售估价时会发生什么。
正如你所看到的,罗比的个人估价上限小于总销售估价的出价仍然被记录在列表和存储中,但完全不影响总销售估价或指针。当另一个出价出现时,指针被移到12,以显示个人估值上限为12和更低的出售不涉及。
现在让我们看看,当竞标者超过上限时会发生什么。
从接下来的两个出价可以看出,总的销售估价会增加到超过格斯的上限38,但取消他的出价会使总的销售估价下降到38以下。这就产生了一个决定他是否应该留在销售中的问题。拍卖会考虑到这一点,将指针移到38,即他的上限,并将总的销售估价设置为相同的数字。这表明,当他在销售结束时提取他的代币时,他将得到部分购买的代币。
在销售的第一阶段提取资金
在某些时候,一些参与者可能想手动撤回他们的投标。为了防止停电攻击(详见技术文件第5.3节),手动退出的贡献者将放弃他们的早期贡献奖金的一部分,他们的一部分贡献将被锁定在销售中。当贡献者退出时,他们将获得部分退款,其余的将被转换为代币,减去部分早期贡献奖金。你可以在文件的第5.3节中读到关于这个选择的理由。请记住,这只适用于 "提款锁定 "之前的手动提款。由于个人上限低于总估值的自动提款将不会受到惩罚。
让我们看看它将如何影响我们的销售实例。
在这个例子中,JG想从销售中提取他的5ETH贡献。图中显示了提取后的销售状态。
在整个销售的第一阶段,罚金呈线性增长。为简单起见,我们假设此时的惩罚是40%。JG得到了3个ETH的回报,剩下的2个仍然致力于销售。这使得总的销售估价下降到35,而指针保持在38。如果有一个个人估值上限为35的出价,那么指针就会指向这个值,但由于没有,所以它保持在38。
你可能可以想象,人工提款会导致总估价的减少,因此,以前被排除在外的投标可以再次被包括在内。
为澄清起见,在退出锁定之前,已经被估值指针通过的投标仍需接受退出处罚,但在退出锁定之后则不需要。你可以在技术文件的第5.3节中了解这方面的理由。
大多数跟踪投标的算法只需要改变几个值,并在链接列表中的少量节点上进行迭代。这大大降低了潜在的气体成本,相比之下,在列表中进行循环,删除节点,在每次循环后给出价最低的投标人部分退款,以及重设投标人存储的投标历史所需的昂贵的操作。
潜在的改进措施
买方目前没有办法执行最低估价。
技术文件的目的是让参与者尽可能多地控制和舒适地以他们所期望的估值参与销售。如果估值不超过某个值,一些参与者可能会对参与销售感到不舒服。对此,有人提出了一个解决方案,作为核心协议的可能补充。与个人估价上限类似,用户也可以包括个人估价最低值,如果总的销售估价没有达到他们的最低值,出价就被踢出销售。
我们为此设计了一种算法,但最终得出的结论是,我们将暂不把它纳入目前的实现中。个人最低限额和个人估值上限之间的互动的复杂性,在这一点上,合理地建立和测试是太有挑战性了。Modular关心的是建立安全的系统,所以确保交互式代币销售的基本功能是实用和安全的,是我们的首要任务。
相反,我们包括一个最低估值,由运行众筹的团队设定。如果没有达到这个最低估值,销售将被取消,所有的投标将被退还。这样做的目的是为了让项目确定他们成功建立协议的最低金额是多少。参与者在提交竞标前可以利用这一点来决定他们是否可以接受最低估值。
我们希望在未来的实施版本中加入个人的最低标准。
目前状况
我们已经完成了第一稿,正在进行审核!我们正在努力编写尽可能多的测试,扩大覆盖面,并尽可能多地打击可能的销售配置和测试案例。我们目前正在努力编写尽可能多的测试,扩大我们的覆盖面,并尽可能多地打到可能的销售配置和测试案例。
你可以参与到这个协议的开发中来!合同的开发是开源的,我们一直在寻找贡献者,特别是为合同编写测试,以考虑到所有可能的配置和测试案例。如果你想参与进来,你可以进入repo,对当前的问题进行评论,或者打开一个问题。
目前需要解决的问题是。
- 100%的代码覆盖率(触发所有可能的抛出、条件等)。
- 测试各种不同的销售配置和参与者的行为,以确保在每个场景中行为保持一致。
- 更新文档,增加常见问题,并增加更多的图表以更准确地描述合同的行为。
Discord:https://discord.gg/sMu6Des
这些合同很快就会被用于生产环境中!
了解更多!
这是一种众筹模式,有可能使ICO的运行方式和项目的估值发生巨大变化。如果你想了解如何参与其中,或者想在你的代币销售中使用互动式ICO,请通过注册通讯和填写我们的调查表与我们联系。你将能够得到关于协议状态和为其创造良好用户体验的工作的更新。
链接到IICO网站。
IICO协议 - 互动式硬币发行
IICO协议的目的是建立一个众筹购买金额的均衡,其总和对所有的人都是满意的。
www.iicoprotocol.com
巨大的感谢
,
,
,以及
感谢他们在构建和测试实现方面所做的工作,以及阅读并对本帖提出建议。并特别感谢
和
我感谢你设计了这个令人敬畏的协议,并与我们合作改进协议,建立实施方案,并撰写了这篇帖子
您还可以通过查看我们的网站 https://modular.network,了解我们在Modular的其他工作 。我们有一些伟大的项目正在进行中,并迫不及待地要与大家分享它们