# Vitalik Buterin's website博客解读


By [leaf](https://paragraph.com/@leaf-6) · 2022-12-10

---

2016年12月29日_这是《邮报》的一面镜子_[_https://medium.com/@ VitalikButerin/a-proof-stage-design-philosophy-506585978 d51_](https://medium.com/@VitalikButerin/a-proof-of-stake-design-philosophy-506585978d51)

以太坊(以及比特币、NXT和Bitshares等)等系统是一种全新的加密经济有机体——完全存在于网络空间的去中心化、无管辖权的实体，由密码学、经济学和社会共识的结合来维持。它们有点像BitTorrent，但它们也不像BitTorrent，因为BitTorrent没有状态的概念——这一区别变得至关重要。他们有时被描述为[分权自治公司](https://letstalkbitcoin.com/is-bitcoin-overpaying-for-false-security)但是他们也不完全是公司——你不能硬把微软叉开。它们有点像开源软件项目，但也不完全是这样——你可以派生一个区块链，但不像你派生OpenOffice那么容易。

这些加密经济网络有多种风格——基于ASIC的PoW、基于GPU的PoW、naive PoS、delegated PoS，有望很快成为Casper PoS——每种风格都不可避免地有自己的基本理念。一个众所周知的例子是工作证明的最大主义观点，其中“正确的”区块链，单数，被定义为矿工燃烧最大量的经济资本创造的链条。这个机制最初只是一个协议内的分支选择规则，在很多情况下已经被提升到一个神圣的原则——参见[我和克里斯·德罗斯在推特上的讨论](https://twitter.com/vitalikbuterin/status/687050458301657088)举个例子，有人认真地试图以一种纯粹的形式捍卫这个想法，即使面对哈希算法改变协议的硬分叉。' Bitshares '[委托股权证明](https://bitshares.org/technology/delegated-proof-of-stake-consensus/)提出了另一种连贯的哲学，在这种哲学中，一切都源于一个单一的原则，但这个原则可以更简单地描述:[股东投票](http://docs.bitshares.org/bitshares/dpos.html).

每一种哲学；中本聪共识、社会共识、股东投票共识，会得出自己的一套结论，并形成一套价值体系，从自身角度来看，这套价值体系颇有道理——尽管在相互比较时，它们肯定会受到批评。卡斯帕共识也有一个哲学基础，尽管到目前为止还没有简洁地表达出来。

我自己、Vlad、Dominic、Jae和其他人都有自己的观点，关于为什么存在stake协议证明以及如何设计它们，但是在这里我打算解释一下我个人的观点。

我将直接列出观察结果和结论。

*   密码学在21世纪确实很特别，因为**密码学是极少数敌对冲突继续严重有利于防御者的领域之一**。城堡远比建造容易摧毁，岛屿可以防御，但仍然可以被攻击，但一个普通人的ECC密钥足够安全，甚至可以抵御国家级的行为者。Cypherpunk哲学从根本上讲是利用这种宝贵的不对称来创造一个更好地保护个人自主权的世界，而密码经济学在某种程度上是这种哲学的延伸，只是这次保护的是复杂的协调和合作系统的安全性和活性，而不仅仅是私人信息的完整性和保密性。**认为自己是赛博朋克精神的意识形态继承者的系统应该保持这一基本属性，摧毁或破坏它们比使用和维护它们要昂贵得多。**
    
*   “赛博朋克精神”不仅仅是关于理想主义；制造防御比攻击更容易的系统也是简单的合理工程。
    
*   **在中长期尺度上，人类非常擅长一致**。即使对手拥有无限的哈希能力，并对任何主要的区块链发动了51%的攻击，甚至恢复了上个月的历史，说服社区这个链是合法的也比仅仅超越主链的哈希能力要困难得多。他们需要颠覆block explorers、社区中每个受信任的成员、纽约时报、archive.org和互联网上的许多其他来源；总而言之，让世界相信新的攻击链是在信息技术密集的21世纪首先出现的，就像让世界相信美国登月从未发生一样困难。**从长远来看，这些社会因素最终会保护任何区块链**，不管区块链社区是否承认这一点([注意到](https://www.reddit.com/r/bitcoinxt/comments/41pbmf/maxwell_considers_changing_the_pow_algorithm_in/)比特币核心[确实承认](https://www.reddit.com/r/Bitcoin/comments/3fg0jw/could_a_cartel_of_pool_operators_collude_to/ctoat0d/)社会层的这种首要地位)。
    
*   然而，仅靠社会共识保护的区块链效率太低，速度太慢，而且很容易让分歧无休止地持续下去(尽管困难重重，[它已经发生了](http://www.npr.org/sections/money/2011/02/15/131934618/the-island-of-stone-money));因此，**经济共识在短期内保护活性和安全属性方面起着极其重要的作用。**
    
*   因为工作保障的证明只能来自集体奖励(用多米尼克·威廉姆斯的话来说，它[缺少三个e中的两个](https://twitter.com/dominic_w/status/648330685963370496))，而对矿工的激励只能来自他们失去未来大宗奖励的风险，**工作的证明必然基于一种逻辑，即在巨额报酬的激励下，巨大的权力得以存在**。从PoW攻击中恢复是非常困难的:第一次发生时，你可以硬分叉来改变PoW，从而使攻击者的ASICs无用，但第二次你就不再有这种选择，因此攻击者可以一次又一次地攻击。因此，采矿网络的规模必须非常大，以至于攻击是不可想象的。通过让网络每天持续花费X来阻止规模小于X的攻击者出现。**我拒绝这种逻辑，因为它**[**杀死树木**](http://digiconomist.net/beci)**，以及(ii)它未能实现赛博朋克精神——攻击成本和防御成本是1:1的比率，因此没有防守方的优势**.
    
*   **利害关系的证明打破了这种对称，因为它不依赖于安全奖励，而是依赖于惩罚**。验证者将资金(“存款”)置于危险之中，并因锁定他们的资本和维护节点以及采取额外的预防措施以确保他们的私钥安全而获得轻微的回报，但恢复交易的大部分成本来自于比他们同时获得的回报大几百倍或几千倍的罚款。**因此，证明利害关系的“一句话哲学”不是“安全来自燃烧的能源”，而是“安全来自提出经济损失价值”**。如果您可以证明，除非恶意节点共谋试图使交换机支付价值$X的协议内损失，否则无法实现任何冲突块或状态的同等终结级别，则给定块或状态具有$X安全性。
    
*   理论上，多数验证者的共谋可能接管一个利益链的证明，并开始恶意地行动。然而，(I)通过巧妙的协议设计，他们通过这种操纵赚取额外利润的能力可以被尽可能地限制，更重要的是(ii)如果他们试图阻止新的验证者加入，或者执行51%攻击，那么社区可以简单地协调一个硬分叉，删除违规验证者的存款。**一次成功的攻击可能会花费5000万美元，但清理后果的过程不会_那_更繁重的比**[**2016.11.25的geth/parity共识失败**](https://blog.ethereum.org/2016/11/25/security-alert-11242016-consensus-bug-geth-v1-4-19-v1-5-2/)。两天后，区块链和社区又回到了正轨，攻击者损失了5000万美元，而社区的其他人可能会更富有，因为攻击会导致令牌的价值下降_向上_由于随之而来的供应短缺。_那是_对你来说攻击/防御不对称。
    
*   上述内容不应被理解为计划外的硬分叉将成为经常发生的事情；如果需要，一个_单一的_51%的攻击对股权证明肯定可以设置为高达成本的一_永久的_51%的攻击，并且攻击的纯粹成本和无效性应该确保它在实践中几乎从未被尝试过。
    
*   **经济学不是一切**。个别演员可能会受到协议外动机的激励，他们可能会被黑客攻击，他们可能会被绑架，或者他们可能只是喝醉了，决定有一天破坏区块链，让成本见鬼去吧。此外，从好的方面来看，**个人的道德克制和沟通效率低下通常会将攻击的成本提高到比协议规定的名义损失值高得多的水平**。这是一个我们不能依赖的优势，但同时也是一个我们不应该不必要地抛弃的优势。
    
*   **因此，最好的协议是在各种模型和假设下工作良好的协议**—协调选择的经济合理性、个人选择的经济合理性、简单容错、拜占庭容错(理想情况下，适应性和非适应性对手变体)，[受Ariely/Kahneman启发的行为经济学模型](https://www.amazon.ca/Honest-Truth-About-Dishonesty-Everyone-Especially/dp/0062183613)(“我们都有一点欺骗”)理想情况下，任何其他模型都是现实可行的。**重要的是要有两层防御:经济激励阻止集中的卡特尔采取反社会的行动，反集中激励从一开始就阻止卡特尔的形成。**
    
*   **尽可能快地工作的共识协议有风险，如果要处理的话，应该非常小心**，因为如果_可能性_非常快与…有关_激励_要做到这一点，这种组合将奖励非常高的、引发系统性风险的水平**网络级集中化**(例如，所有验证器都从同一个主机提供商运行)。共识协议不太关心验证器发送消息的速度，只要它们在某个可接受的长时间间隔内(例如4-8秒，因为我们凭经验知道以太坊中的延迟通常为~ 500毫秒-1秒)发送消息，就没有这些顾虑。一个可能的中间立场是创建可以非常快速工作的协议，但类似于以太坊的叔叔机制的机制确保节点增加其网络连接度超过某个容易达到的点的边际回报相当低。
    

从这里开始，当然有许多细节和许多方法可以在细节上产生分歧，但以上是至少我的Casper版本所基于的核心原则。从这里，我们当然可以讨论相互竞争的价值观之间的权衡。我们是给ETH 1%的年发行利率，并获得5000万美元的强制补救硬分叉成本，还是给ETH零年发行利率，并获得500万美元的强制补救硬分叉成本？在经济模型下，我们什么时候增加一个协议的安全性来换取在容错模型下降低它的安全性？我们更关心可预测的安全级别还是可预测的发行级别？这些都是另一个帖子的问题，以及_执行_这些价值之间的不同权衡是更多帖子的问题。不过我们会说到。

硬分叉、软分叉、默认和强制
=============

中文翻译如下：

当新共识规则发布后，没有升级的节点会因为不知道新共识规则下，而生产不合法的区块，从而产生的临时性分叉。

所以，简单的理解就是软分叉其实是临时性的，它有可能恢复到最新链的状态，只要未升级的节点重新升级最新状态，那就能回到已更新的链道来。 软分叉发生的链中，未升级的节点可以验证已经升级的节点产生的区块，而已升级的节点也可以验证未升级节点产生的区块。我们那个图片来说明。

![](https://storage.googleapis.com/papyrus_images/88a6366ab67148683b70fdbc95a43a8db5691a373da960ec965425f272b44007.png)

软分叉的特点：

1.较好的兼容性，可以不升级用之前版本的功能。

2.区块链中没分叉的链条，如上图中的那样一条链，只有新区块和就区块之分。

3.长时间允许不升级，新旧区块并存。

2）硬分叉

这里同样引用比特币官网的英文描述：

A permanent divergence in the the block chain, commonly occurs when non-upgraded nodes can’t validate blocks created by upgraded nodes that follow newer consensus rules.

中文翻译如下：

区块链发生永久性分歧，在新共识规则发布后，部分没有升级的节点无法验证已经升级的节点生产的区块，通常硬分叉就会发生。

就是说硬分叉是永久的分叉，一旦分叉了就回不去原来的分叉。区块链版本更新，未升级的节点拒绝验证已经升级的节点生成的区块，已经升级的节点可以验证未升级节点产生区块，新旧节点各自延续生成自己版本的区块，从而形成了两条不同的链。正所谓：道不同不相为谋。咱俩既然意见不合，我旧结点不接受你新节点，那我们各自为政，谁犯不着谁。同样我们再用图片。

的特点：

1.无兼容性，不兼容之前版本，强调升级。

2.区块链中分了两条链，如上图所示。

3.需在一定时间全部同意升级，不同意的进入旧链。

二、为什么会产生硬分叉 产生软分叉或硬分叉的原因个人的理解是主要是因为某些问题而提出各种各样的方案，但因为各自觉得自己的方案好而产生的意见不一，大家都互不相让，导致各自干自己的方案，这分叉就来了。例如针对扩容问题，提供了各种的方案。

在原始的比特币系统中规定了一个区块的容量为1M，一个区块确认的时间是10分钟，即每个区块每秒能处理大概7个的交易数。这样的处理能力实在有点低下，很容易造成堵塞，最后就崩溃了。所以有人就提出了区块的扩容。说改成2M的，说改成20M的，说改成无限容量的。这听谁的呢，没人决定得了，那就只能自己干自己的版本啰。

比较广为人知的硬分叉是ETC和ETH。这是在2016年7月，以太坊开发团队通过修改以太坊软件代码在第192000区块，强行把The DAO（分布式自治组织）及其子DAO所有资金全部转到一个特定的退款合约地址从而夺回黑客所控制的DAO合约的以太币。然后形成了两条链，一条ETC（原链），一条ETH（分叉链）。

区块链领域的一个重要争论是硬分叉还是软分叉是首选的协议升级机制。两者之间的基本区别在于，软分叉通过以下方式改变协议的规则_严格还原_有效的事务集，因此遵循旧规则的节点仍将进入新链(假设大多数挖掘器/验证器实现了分叉)，而硬分叉允许先前无效的事务和块变得有效，因此客户端必须升级它们的客户端以便留在硬分叉链上。硬分叉还有两个子类型:_严格扩张_硬分叉，它严格扩展了有效的交易集，因此相对于新规则，旧规则实际上是一个软分叉，并且_双边的_硬分叉，这两个规则集是双向不兼容的。

这里有一个文氏图来说明分叉类型:

这两者的好处通常列举如下。

*   硬分叉允许开发人员在进行协议升级时有更大的灵活性，因为他们不必注意确保新规则“适合”旧规则
    
*   软分叉对用户来说更方便，因为用户不需要升级就可以留在链上
    
*   软叉不太可能导致链条断裂
    
*   软分叉实际上只需要来自挖掘器/验证器的同意(因为即使用户仍然使用旧规则，如果构成链的节点使用新规则，那么在任何情况下只有在新规则下有效的东西才会进入链)；硬叉子需要_选择加入_用户同意
    

除此之外，对硬分叉的一个主要批评是硬分叉是“强制性的”。这里隐含的那种强制不是肉体上的强制；相反，这是_通过网络效应进行强制_。也就是说，如果网络将规则从A更改为B，那么即使你个人喜欢A，如果大多数其他用户喜欢B并切换到B，那么你必须切换到B，尽管你个人不赞成这种更改，以便与其他人在同一网络上。

硬分叉的支持者经常被嘲笑为试图“恶意接管”网络，并“强迫”用户跟随他们。此外，链条断裂的风险通常用于将硬货叉视为“不安全”。

我个人的观点是，这些批评是错误的，而且在许多情况下是完全倒退的。这一观点并不是以太坊、比特币或任何其他区块链所特有的；它产生于这些系统的一般性质，并适用于任何系统。此外，下面的论点仅适用于有争议的变更，其中至少有一个群体(矿工/验证者和用户)的大部分不赞成这些变更；如果一个改变是无争议的，那么不管fork的格式是什么，它通常都可以安全地完成。

首先，让我们讨论强制的问题。硬分叉和软分叉都以一些用户可能不喜欢的方式改变协议；_任何的_如果协议更改不完全得到100%的支持，它就会这样做。此外，几乎不可避免的是至少_一些_在任何情况下，持不同意见的人都更看重坚持大群体的网络效应，而不是他们自己对协议规则的偏好。因此，从网络效应的角度来看，这两种分叉都是强制性的。

但是，硬分叉和软分叉有一个本质的区别:_硬分支是选择加入的，而软分支不允许用户“选择”_。为了让一个用户加入一个硬分叉链，他们必须亲自安装实现分叉规则的软件包，并且那些不同意规则改变甚至比他们重视网络效应更强烈的用户群理论上可以简单地停留在旧链上——并且，实际上来说，这样一个事件[已经发生了](https://ethereumclassic.github.io/).

无论是严格扩张硬分叉还是双边硬分叉都是如此。然而，在软叉的情况下，_如果fork成功，则不存在未伪造的链_。因此，**软分叉显然在制度上更倾向于强迫而不是分裂，而硬分叉则有相反的倾向**。我自己的道德观点使我更倾向于脱离而不是强迫，尽管其他人可能不同意(最常见的论点是网络效应真的真的很重要，而且至关重要的是”[一枚硬币统治所有人](https://blog.ethereum.org/2014/11/20/bitcoin-maximalism-currency-platform-network-effects/)”，尽管也存在更温和的版本)。

如果我不得不猜测为什么，尽管有这些争论，软分叉经常被宣传为比硬分叉“更不强制”，我会说，这是因为它感觉像是硬分叉“强迫”用户安装软件更新，而使用软分叉用户根本不“必须”做任何事情。然而，这种直觉是错误的:重要的不是个人用户是否必须执行点击“下载”按钮这一简单的官僚步骤，而是用户是否必须这样做_被迫接受协议规则的改变_他们宁愿不接受。根据这个标准，如上所述，两种分叉最终都是强制性的，硬分叉在保护用户自由方面表现得更好。

* * *

现在，让我们看看极具争议的分叉，特别是挖掘器/验证器首选项和用户首选项冲突的分叉。这里有三种情况:(一)双边硬分叉，(二)严格扩展硬分叉，(三)所谓的“用户激活软分叉”(UASF)。第四类是矿工激活软叉_未经用户同意_；我们稍后会谈到这一点。

第一，双边硬叉。在最好的情况下，情况很简单。这两种硬币在市场上交易，交易者决定两者的相对价值。从ETC/ETH的案例中，我们有压倒性的证据表明，无论他们自己的意识形态观点如何，矿工们都极有可能简单地根据价格比率将他们的哈希值分配给硬币，以使他们的利润最大化。

![](https://storage.googleapis.com/papyrus_images/e0d27be92d7f73d74ae4d2455c8cf84562eeffeb45f7fb1b30ed385b58893a5b.png)

即使一些矿商承认在意识形态上倾向于某一方，也极有可能会有足够多的矿商愿意对价格比率和购买力比率之间的任何不匹配进行套利，并使两者保持一致。如果一个矿工卡特尔试图形成不在一个链上开采，就有过度的动机叛逃。

这里有两种极端情况。第一种可能性是，由于低效率的难度调整算法，开采硬币的价值下降，因为价格下降，但难度没有下降来补偿，使得采矿非常无利可图，没有矿工愿意亏本开采，以继续推动链条前进，直到难度恢复平衡。以太坊不是这样的，但是很可能[比特币就是如此](https://www.reddit.com/r/Bitcoin/comments/3axspf/doesnt_the_lag_in_difficulty_adjustment_mean_any/)。因此，少数民族链很可能永远不会起飞，因此它会死亡。请注意，规范性问题_这到底是不是一件好事_取决于你对强制和分裂的看法；正如你从我上面写的可以想象的，我个人认为这种少数民族链敌对难度调整算法是不好的。

第二种边缘情况是，如果差距非常大，大链可以51%攻击较小的链。即使在ETH/ETC以10:1的比例拆分的情况下，这种情况也没有发生；所以这肯定不是必然的。然而，如果主导链上的矿工更喜欢强迫而不是允许分离，并按照这些价值观行事，这总是有可能的。

* * *

接下来，我们来看看严格扩展的硬分叉。在SEHF中，有一个属性，即在分叉规则下，非分叉链是有效的，因此，如果分叉链的价格低于非分叉链，那么它的哈希功率将低于非分叉链，因此，非分叉链最终将被接受为最长的链_通过原始客户端和分叉客户端规则_——所以分叉的链条”[会被歼灭](https://twitter.com/SatoshiLite/status/839673905627353088)".

有一种观点认为，这样的分叉成功存在一种强烈的内在偏见，因为分叉链被湮灭的可能性将被纳入价格，推低价格，使其更有可能被湮灭...这个论点对我来说似乎很有力，所以这是一个很好的理由_任何的_有争议的硬分叉双边而不是严格扩大。

比特币无限开发者建议通过以下方式解决这个问题[手动制作双侧硬叉](https://medium.com/@g.andrew.stone/what-if-3a48100a6c18#.882uzyyvs)但更好的选择是将双边性内化；例如，在比特币的情况下，可以添加一个规则来禁止一些未使用的操作码，然后在非分叉链上进行包含该操作码的事务，这样在分叉规则下，非分叉链将从此被视为永远无效。在以太坊的例子中，由于关于状态计算如何工作的各种细节，几乎所有的硬分叉几乎都是自动双向的。其他链根据其结构可能具有不同的属性。

* * *

上面提到的最后一种分叉是用户激活的软分叉。在UASF，用户打开软叉规则，而不用费心从矿工那里获得共识；出于经济利益的考虑，矿商们可能会加入进来。如果许多用户不同意UASF，那么将会有一个硬币分裂，这将导致一个与严格扩展硬分叉相同的场景，除了——这是这个概念真正聪明和迂回的部分——_同样的“毁灭的风险”压力强烈地不利于严格扩展的硬分叉中的分叉链，而强烈地有利于UASF中的分叉链_。即使UASF选择加入，它也利用经济不对称来偏向成功(虽然这种偏向不是绝对的；如果UASF绝对不受欢迎，那么它将不会成功，只会导致连锁分裂)。

然而，UASFs是一个危险的游戏。例如，让我们假设一个项目的开发人员想要制作一个UASF补丁，将一个以前接受所有事务的未使用的操作码转换成一个只接受符合一些很酷的新功能的规则的事务的操作码，尽管这在政治上或技术上是有争议的，并且是矿工不喜欢的。矿工们有一个聪明而狡猾的反击方式:_他们可以单方面实现一个miner激活的软fork，使得所有使用该软fork创建的特性的事务总是失败_.

现在，我们有三个规则集:

1.  操作码X总是有效的原始规则。
    
2.  操作码X仅在事务的其余部分符合新规则时有效的规则
    
3.  操作码X总是无效的规则。
    

注意

(2)是相对于(1)的软分叉，而(3)是相对于(2)的软分叉。

现在，有强大的经济压力支持(3)，因此软分叉未能实现其目标。

结论是这样的。软叉子是一个危险的游戏，如果它们有争议，矿商开始反击，它们会变得更加危险。严格扩张硬叉也是一个危险的游戏。矿工激活的软叉是强制性的；用户激活的软叉不那么强制，尽管由于经济压力仍然相当强制，并且它们也有它们的危险。如果你真的想做一个有争议的改变，并且已经决定这样做的高昂社会成本是值得的，那么就做一个干净的双边硬分叉，花一些时间添加一些适当的重放保护，让市场来解决它。

2017年3月14日

**确定问题**

所以好的代币销售机制是怎样的呢？一种开始的方法是观察目前销售模式遭到的批评，找到受欢迎的特征列表。

让我们一起来做这个。一些固有特性包括：

![](https://storage.googleapis.com/papyrus_images/4c76bc665a63428605ff859db1f1a03bf92eaf310be5376b604af75cb2beadef.png)

１、\*\*估值的确定性：\*\*如果你参加了一个销售项目，你至少必须确定估值的上限是多少（或者说，你可以获得的代币的最高比例）。

２、\*\*参与度的确定性：\*\*如果你想要参加此类销售项目，你必须有获得成功的打算。

３、\*\*融资额上限：\*\*为了避免贪婪的批评（或者为了消除监管关注的风险），销售必须限制融资额。

４、**没有央行**：代币销售的发起者不能持有数量过大的代币，避免控制市场。

５、\*\*效率：\*\*销售不能导致经济低效益或者无谓损失。

**听起来是合理的？**

好吧，以下是不那么有趣的内容。

１、（1）和（2）不能同时满足。

２、至少如果不能采取任何巧计，（3）、（4）和（5）是不可以同时满足的。

这些可以称为“第一个代币销售两难困境”和“第二个代币销售三难困境”。

第一个两难困境的证明很简单：假设你在销售中向用户提供确定的1亿美元估值。现在假设用户想要投入1.01亿美元。至少部分人会失败。简单的供求关系就可以证明第二个三难困境。如果你满足条目（4），你就必须出售所有或者固定份额的总代币，因此你出售的估值与你出售的价格成正比。如你你满足条目（3），你就给价格设置一个上限。然而可能你所售出的数量对应的均衡价格超出了你设置的价格上限，那么你就会出现供不应求的情形，从而无法避免：（i）在生意火爆的餐厅排队4小时的数字化对等物；（ii）倒票的数字化对等物，大量的无谓损失，并且与（5）冲突。

第一个两难困境不可能克服；估值和参与度确定性是不可以避免的，尽管在可能的情况下，选择参与度确定性要好过选择估值确定性。我们可以得出的最接近的结果是，牺牲全面参与，保证部分参与。这可以通过按比例退款来实现（比如以1亿美元的估值买进1.01亿美元的代币，每个人获得1%退款）。我们还可以认为这个机制是没有上限的销售，其中部分支付呈现锁定资金的形式，而不是消费它；然而从这个角度看，可以确定锁定资金的要求是损失效率的，因此该机制无法满足（5）。如果以太币股份没有分配好，那么可能会偏向有钱的持股人，而损害公正性。

第二个两难困境很难克服。很多克服它的尝试可能导致失败或者难以预料的坏结果。比如Bancor代币销售考虑将购买交易的汽油价格限制在50个熵值（大约常规汽油价的12倍）。然而这意味着买家的最优战略是设置大量账户，从每个账户发送一笔交易，触发合约，然后买进（迂回地防止买家意外地高出自己预期的买进，减少资金要求）。买家设置的账户越多，他们买进的可能越高。因此，在均衡状态下，这可能加重[以太坊](https://price.btcfans.com/coin/ethereum)[区块链](https://www.btcfans.com/tag/1199/)的拥堵，甚至高出BAT类型的销售；此类销售的单笔交易费用至少是6600美元，而不是网络受到的拒绝服务攻击。而且，任何类型的链上交易竞争都严重伤害公平性，因为参与竞争的成本是不变的，而奖励却与你的资金量有关，因此结果将不成比例的有利于有钱的持股人。

**下一步**

有三件明智的事是你可以做的。首先，你可以像Gnosis一样进行逆向荷兰式拍卖，但是要进行一个调整：不持有未出售的代币，而是用于公共利益。简单的例子有：（i）空投（重新分配给以太币持有者）；（ii）捐给以太坊基金会（Ethereum Foundation）；（iii）捐给Parity、Brainbot、Smartpool或其他为以太坊领域独立搭建基础设施的公司和个人；（iv）结合前三者，可能按照代币买家票选的比率。

第二，你可以保留未出售的代币，但是通过全自动决定代币花费方式，来解决“央行”问题。这里的推理类似于大量经济学家对基于规则的货币政策感兴趣的原因：即使中心化机构可以大幅度控制强大资源，并且可以通过该机构遵循一定的使用规则来消除由此而生的政治不确定性。比如，未出售的代币可以给做市商，让他维持代币价格的稳定性。

第三，你可以进行有上限的销售。限制每个人可以买入的金额。有效地这样做需要KYC流程，但是好在KYC机构可以一次性完成这个任务，在确认地址代表特定个人之后，可以制定用户地址白名单，并且这个名单可以重复应用于每次代币销售，以及其他可能受益于该模式的应用，比如Akasha游戏的投票。这里还是有无谓损失（效率），这会导致对代币不感兴趣的个人参与销售，因为他们知道他们很快可以以此在市场上获利。然而这可能不是那么糟糕：它创造了一种加密货币全民基本收入，并且如果“禀赋效应”这样的行为经济学假设有哪怕一点点准确性，它都将实现保证代币分配普及性的目标。

![](https://storage.googleapis.com/papyrus_images/d115dc08121fce965e64b183926de4df25ea4d199a7097b7f83fe7125cdd6cde.png)

**单轮销售好吗？**

回到“贪婪”的话题。我想说，原则上并没有很多人反对可以花费5亿美元的开发团队去创建获得5亿美元的伟大项目。人们反对的是：（i）全新的未经测试的开发团队一次性获得5000万美元；（ii）更重要的是，开发者奖励和代币买家利息之间的时间差。在单轮销售中，开发者只有获得项目创建资金的一次机会，也就是接近开发流程开始的时间段。这里没有这种反馈机制：团队首先获得少量资金来证明自己，然后在证明自己可靠，并能获得成功之后，随着时间推移，获得更多资金。在销售期间，用于购率优秀与糟糕开发团队的信息相对较少，一旦销售完成，开发者继续工作的积极性相对于传统公司要低。“贪婪”不是指获得很多钱，而是没有努力证明自己可以明智的花费这笔钱，就想获得大笔资金。

![](https://storage.googleapis.com/papyrus_images/940935abab1ad7be506332c135678624003da6791597fb70fd0ba41aeb88175a.png)

如你你想直击问题要害，我们又该如何解决呢？我会说，答案很简单：专注于机制，而不是单轮销售。

我可以提出几个例子以供参考：

**Angelshares**，这个项目销售在2014年，每天出售固定比例的AGS，为期数月。每天人们可以向众筹项目提供不限量的资金，当日AGS分配将在几个出资人之间划分。基本上，这就像维持将近一年时间的数百笔不设销售上限的“小轮交易”；我会说，这个销售的持续时间还可以拉的更长。

**Mysterium**，在大规模销售前进行了六个月的小额销售，几乎没人注意到。

**Bancor**，最近同意将所有融资额交给做市商，由他们维持币价稳定，同时将最底下限制在0.01个以太币。两年内不可以将这些资金提取出来。

似乎很难看出Bancor战略与解决这个时间差之间的关联，但是这里有该解决方案的一个元素。为了理解，需要考虑两个场景。第一个案例，假设一次销售筹集了3000万美元，其上限是1000万美元，但是一年后每个人同意该项目是失败的。那么币价可能会跌到0.01个以太币以下，做市商可能因为要维持最低价而损失所有资金，因此该团队将只剩下1000万美元的运营资金。第二个案例中，假设销售筹集了3000万美元，上限是1000万美元，两年后每个人对项目满意。这个案例中，做市商就不会被触发，该团队也可以获得全部3000万美元资金。

一个相关提议来自Vlad Zamfir的“安全代币销售机制”。这个概念很宽泛，可以用多种方法来参数化，但是其中一个方式是以最高价出售代币，然后获得稍低于最高价的最低价，然后让两个价格随着时间慢慢拉大距离，如果价格可以自行维持，就逐渐释放开发资金。

以上三个可能都不充分。我们想要延续时间更长的销售项目，让我们在提供大量资金前，有更多的时间了解哪个开发团队是最可信的。然而这似乎是可以探究的最具成效的方向。

**走出两难困境**

总结以上分析，可以清晰得出，尽管无法直接克服以上两难困境和三难困境，却可以通过创新思维和克服不那么严重相似问题，来一点点从边缘突破。我们可以就参与度达成一致，以时间为第三维，来消除影响：如果你没有参与第N轮销售，你可以等到一周之后的第N+1轮，那时的价格也许没有什么大不同。

我们可以进行没有上限的销售，但是必须包含不同的周期，没给周期内的销售设置上限；这样在没有证明可以驾驭小金额销售的情况下，该团队不会要求大量资金。我们可以一次性出售小部分代币，通过合同约定剩余供应量并按照预先设定的公式自动出售，来消除它带来的政治不确定性。

![](https://storage.googleapis.com/papyrus_images/aa845542c1ec3b83c1c0e23e5ae0fe7493055c34d64f26f01277a6f844e5a93d.png)

以下是遵循这些构思的一些可行机制：

进行类似Gnosis的逆向荷兰式拍卖，设定较低的上限（比如一百万美元）。如果拍卖出售的代币不足总供应量的100%，两个月后自动将剩余资金转入另一场拍卖，设定高出30%的上限。重复该流程，直到发行的全部代币出售完。

以X美元价格不限量出售代币，将90%的收益存入智能合约，五年内保证其最低价为X的0.9倍，最高价则无限增大，最低价可以无限接近零。

模仿AngelShares做法，不过要把时间延长到五年，而不是数月。

进行类似Gnosis的逆向荷兰式拍卖，如果拍卖售出代币不到总供应量的100%，把剩余资金转入自动的做市商，让他们维持币价的稳定性（如果价格继续上涨，做市商可以出售代币，其中部分收益给开发团队）。

立即把所有代币转移给做市商，设置参数及X变量（X为最低价）、s（以售出的代币的份额）、t（销售已经进行的时间）、T（预计销售持续时间，比如五年），以k / (t/T - s)价格出售代币（这有点怪，也许需要经济分析）。

注意，解决代币销售问题的其他机制也必须进行尝试，比如收益交给多个托管人，只有达到某个阈值，才交出资金，这个构思很有意思，可以深入尝试。然而设计领域是多维的，可以尝试的方式还有很多。

翻译：Annie\_Xu

尽管两年来，当前以太坊协议背后的思想基本上是稳定的，但以太坊并没有以其当前的概念突然出现并完全成型。在区块链推出之前，该协议经历了许多重大的发展和设计决策。本文的目的将是介绍该协议从开始到发布所经历的各种演变；在协议实现方面所做的无数工作，例如Geth、cppethereum、pyethereum和EthereumJ，以及以太坊生态系统中应用程序和业务的历史，都故意超出了范围。

卡斯帕和分片研究的历史也不在范围之内。虽然我们当然可以发表更多的博客文章，讨论弗拉德、加文、我自己和其他人提出并放弃的各种想法，包括“工作证明”、轴辐式链等[超立方体](https://blog.ethereum.org/2014/10/21/scalability-part-2-hypercubes)", [阴影链](https://blog.ethereum.org/2014/09/17/scalability-part-1-building-top/)(可以说是……[血浆](http://plasma.io/)), [链状纤维](https://github.com/ethereum/wiki/wiki/Chain-Fibers-Redux)，以及[Casper的各种迭代](https://blog.ethereum.org/2016/12/06/history-casper-chapter-1/)，以及Vlad关于共识协议中行动者的激励及其属性的推理的快速发展的思想，这也将是一个过于复杂的故事，无法在一篇文章中讲述，所以我们现在将省略它。

让我们首先从最终成为以太坊的最早版本开始，那时它甚至还不叫以太坊。当我在2013年10月访问以色列时，我花了相当多的时间与Mastercoin团队在一起，甚至为他们建议了一些功能。在花了几次时间思考他们正在做的事情之后，我向团队提交了一份提案，让他们的协议更加通用，支持更多类型的合同，而不增加同样庞大和复杂的功能集:

[https://web . archive . org/web/20150627031414/http://vbuterin . com/ultimate scripting . html](https://web.archive.org/web/20150627031414/http://vbuterin.com/ultimatescripting.html)

![](https://storage.googleapis.com/papyrus_images/392ea0dfedba2d59cbd31113cd799c93d679820e9c25a9f304f73ace9fe972f0.png)

请注意，这与后来更广泛的以太坊愿景相去甚远:它纯粹专注于Mastercoin已经试图专注的领域，即双方合同，其中A方和B方都将投入资金，然后他们将根据合同中指定的一些公式获得资金(例如，打赌会说“如果X发生，则将所有资金交给A，否则将所有资金交给B”)。脚本语言不是图灵完全的。

Mastercoin团队印象深刻，但他们没有兴趣放弃他们正在做的一切，朝着这个方向前进，我越来越相信这是正确的选择。第二版出现了，大约在12月:

[https://web . archive . org/web/20131219030753/http://vitalik . ca/ether eum . html](https://lh6.googleusercontent.com/soPo_aa2YSpV8DvGGZbGjAkZehtiqJEa8dPzOM4ZSZxAvZcAfNbnVqErQL1JlG8lcmgpQyXmb3cO9m21asJQKZZmTXGQsLOtvTgBTp_5LOxfdWRZpgh3pys7Os3GK5dFGCL6aIpd)

![](https://storage.googleapis.com/papyrus_images/e22419868ffb9cd1199b0faf080a19b56204097ddc991443b98b148df2654a81.png)

在这里，你可以看到一次大规模重组的结果，这主要是我在11月份去旧金山徒步旅行的结果，当时我意识到智能合约有可能被完全推广。脚本语言不仅仅是描述双方关系条款的一种方式，合同本身是完全成熟的账户，能够持有、发送和接收资产，甚至维护永久存储(当时，永久存储被称为“内存”，唯一的临时“内存”是256个寄存器)。这种语言根据我自己的意愿从基于堆栈的机器转变为基于寄存器的机器；我对此没有什么异议，只是觉得这似乎更复杂。

此外，请注意，现在有一个内置收费机制:

![](https://storage.googleapis.com/papyrus_images/f32f0c42957c59bbc76633fd10ec63712e1517610384506927a5f45aff1bb0f3.png)

在这一点上，以太实际上是气体；在每一个计算步骤之后，交易调用的合同余额会下降一点，如果合同资金用完，执行就会停止。注意，这种“接收者付费”机制意味着合同本身必须要求发送者向合同支付一笔费用，如果这笔费用不存在，则立即退出；该协议规定了16个自由执行步骤，允许合同拒绝非付费交易。

![](https://storage.googleapis.com/papyrus_images/637a147b099356e91717f5f365b7b573b3ec333d47213130b50c0ef57dca3a52.png)

* * *

这是以太坊协议完全是我自己创造的时候。然而，从这里开始，新的参与者开始加入这个圈子。到目前为止，礼仪方面最突出的是加文·伍德，他在2013年12月的一条关于我的消息中联系了我

![](https://storage.googleapis.com/papyrus_images/80bb0d6d43ddedf23d4ce7206c0d4602950b1b8bbdee696ca5025f5275d254d7.png)

_“嘿杰里米，很高兴看到你对以太坊感兴趣……”_

加文最初的贡献是双重的。首先，您可能会注意到，最初设计中的契约调用模型是异步的:尽管契约A可以创建一个“内部事务”给契约B(“内部事务”是Etherscan的行话；最初它们只是被称为“事务”，后来被称为“消息调用”或“调用”)，直到第一个事务完全执行完，内部事务才会开始执行。这意味着交易不能使用内部交易作为从其他合同获取信息的方式；做到这一点的唯一方法是EXTRO操作码(有点像SLOAD，可以用来读取其他契约的存储)，后来在Gavin和其他人的支持下也删除了这个操作。

当实现我的初始规范时，Gavin自然地同步实现了内部事务，甚至没有意识到意图是不同的——也就是说，在Gavin的实现中，当一个契约调用另一个契约时，内部事务立即得到执行，一旦执行完成，VM返回到创建内部事务的契约，并继续下一个操作码。这种方法对我们双方来说似乎都更优越，所以我们决定把它作为规范的一部分。

第二，我和他之间的一次讨论(在旧金山散步期间，因此确切的细节将永远消失在历史的风中，可能会在NSA的深层档案中有一两份副本)导致了交易费模型的重新分解，从“合同支付”方法转移到“发送者支付”方法，并切换到“gas”架构。不是每个单独的交易步骤立即带走一点乙醚，而是交易发送者支付并被分配一些“汽油”(粗略地说，计算步骤的计数器)，并且计算步骤从该汽油的允许量中提取。如果一个事务用完了gas，gas仍然会被没收，但是整个执行会被恢复；这似乎是最安全的做法，因为它消除了合同以前必须担心的一整类“部分执行”攻击。当交易执行完成时，任何未使用的气体的费用被退还。

加文也可以在很大程度上归功于愿景的微妙变化，从将以太坊视为一个构建可编程货币的平台，其总部位于区块链的合同可以持有数字资产，并根据预先设定的规则转移它们，到一个通用计算平台。这开始于重点和术语的微妙变化，后来这种影响随着对“Web 3”整体的日益重视而变得更强，这种整体将以太坊视为一套去中心化技术中的一部分，另外两个是Whisper和Swarm。

![](https://storage.googleapis.com/papyrus_images/f71f6b27c3f4414316bd8f106f5265167e1d853a5c6e518aed42156b32f7fb16.png)

在2014年初，也有一些由其他人建议的变化。在Andrew Miller和其他人提出这个想法后，我们最终回到了基于堆栈的架构

![](https://storage.googleapis.com/papyrus_images/ebd2ac8772ff16b67adc53095949e13022953a5ea3086de8dfb0869330b16542.png)

查尔斯·霍金森建议从比特币的SHA256转换到更新的SHA3(或者更准确地说，keccak256)。虽然有一段时间有一些争议，但与Gavin、Andrew和其他人的讨论导致建立了堆栈上的值的大小应该被限制在32个字节；另一个正在考虑的选择，无限大小的整数，有一个问题，那就是很难计算出加法、乘法和其他运算要花多少钱。

* * *

早在2014年1月，我们脑海中最初的挖掘算法是一个名为Dagger的装置:

[https://github.com/ethereum/wiki/blob/master/Dagger.md](https://github.com/ethereum/wiki/blob/master/Dagger.md)

![](https://storage.googleapis.com/papyrus_images/0d5f7652951151ecd046d106ab5f38b74ce1c8fcd24dfb5cc5eba7c4121ebba6.png)

Dagger是以算法中使用的数学结构“有向无环图”(DAG)命名的。其思想是，每N个块，一个新的DAG将从种子中伪随机生成，并且DAG的底层将是需要几千兆字节来存储的节点的集合。然而，在DAG中生成任何单个值只需要计算几千个条目。“匕首计算”包括在底层数据集中的随机位置获取一些值，并将它们散列在一起。这意味着有一种快速的方法来进行DAG计算——内存中已经有数据，还有一种缓慢但不占用内存的方法——从DAG中重新生成您需要从头开始获取的每个值。

这种算法的目的是与当时流行的算法(如Scrypt)具有相同的“内存硬度”属性，但仍然是轻量级客户端友好的。矿工将使用快速方式，因此他们的挖掘将受到内存带宽的限制(理论上，消费级RAM已经进行了大量优化，因此很难用ASICs进一步优化)，但轻型客户端可以使用无内存但较慢的版本进行验证。快速的方法可能需要几微秒，而缓慢但无内存的方法可能需要几毫秒，所以对于轻量级客户机来说，这仍然是非常可行的。

从这里开始，在以太坊的发展过程中，算法会改变几次。我们经历的下一个想法是“工作的适应性证明”；在这里，工作证明将涉及执行随机选择的以太坊合同，并且有一个聪明的理由来解释为什么这将是抗ASIC的:如果ASIC被开发出来，竞争的矿工将有动机创建和发布许多ASIC不擅长执行的合同。故事是这样的，没有用于一般计算的ASIC，因为它只是一个CPU，所以我们可以使用这种对立的激励机制来证明本质上是执行一般计算的工作。

失败的原因很简单:[远程攻击](https://blog.ethereum.org/2014/05/15/long-range-attacks-the-serious-problem-with-adaptive-proof-of-work/)。攻击者可以从块1开始一个链，用他们可以为其创建专用硬件的简单合同来填充它，并迅速超越主链。因此...回到绘图板。

下一个算法叫做随机电路，在谷歌文档中有描述[这里](https://docs.google.com/document/d/19c0L7_1neWpTN-jYwW-87mzrTTmS2h3lAYxXpRAvPfo)，由我和Vlad Zamfir提出，和[由Matthew Wampler-Doty分析](https://nbviewer.jupyter.org/gist/anonymous/cb53d06b837be97ebe32)和其他人。这里的想法也是模拟挖掘算法中的通用计算，这次是通过执行随机生成的电路。没有确凿的证据证明基于这些原则的东西不能工作，但我们在2014年联系的计算机硬件专家对此相当悲观。Matthew Wampler-Doty自己提出了一个基于SAT解答的工作证明，但这也最终被否决了。

最后，我们带着一种叫做“匕首桥本”的算法兜了一圈。人们有时简称它为“Dashimoto ”,它借鉴了许多[桥本](https://pdfs.semanticscholar.org/3b23/7cc60c1b9650e260318d33bec471b8202d5e.pdf)Thaddeus Dryja的工作证明算法，它开创了“I/O绑定工作证明”的概念，其中挖掘速度的主要限制因素不是每秒哈希数，而是每秒RAM访问的兆字节数。然而，它结合了Dagger的轻量级客户端友好的DAG生成数据集的概念。经过我、马修、蒂姆和其他人的多轮调整，这些想法最终汇聚成了我们现在所说的算法[Ethash](https://github.com/ethereum/wiki/wiki/Ethash).

![](https://storage.googleapis.com/papyrus_images/1eee94e5cdde3abe61dae95aab8e23eecb1725548c35e89c8ca524a1c95a598b.png)

到2014年夏天，协议已经相当稳定，主要的例外是工作证明算法直到2015年初才达到Ethash阶段，半正式规范以Gavin的形式存在[黄色纸](http://gavwood.com/Paper.pdf).

![](https://storage.googleapis.com/papyrus_images/764b432e6eb8ffe488249e28802f7add00ec20427c940f32fff9f4f7b00cef96.png)

2014年8月，我开发并引入了[机制](https://blog.ethereum.org/2014/07/11/toward-a-12-second-block-time/)，这使得以太坊的区块链具有更短的阻塞时间和更高的容量，同时降低了集中化风险。这是作为PoC6的一部分引入的。

与Bitshares团队的讨论让我们考虑[添加堆](https://blog.ethereum.org/2014/08/27/state-ethereum-august-edition/)作为一个一流的数据结构，虽然由于时间不够，我们最终没有这样做，但后来的安全审计和DoS攻击将表明，安全地做到这一点实际上比我们当时想象的要困难得多。

九月，加文和我计划了协议设计的下两个主要变化。首先，除了状态树和事务树，每个块还包含一个“收据树”。收据树将包括由事务创建的日志的散列，以及中间状态根。日志将允许事务创建“输出”,这些输出保存在区块链中，并且可以被轻型客户端访问，但是不能被未来的状态计算访问。这可以用于允许分散的应用程序轻松地查询事件，例如令牌转移、购买、交易订单的创建和完成、拍卖的开始等等。

还考虑了其他一些想法，比如从一个事务的整个执行跟踪中制作一棵Merkle树，以允许证明任何事情；选择日志是因为它们是简单性和完整性的折衷。

第二个是“预编译”的想法，解决了允许复杂的加密计算在EVM中可用而不必处理EVM开销的问题。我们也经历了许多更有雄心的想法[本地合同](https://blog.ethereum.org/2014/08/27/state-ethereum-august-edition/)“如果矿商优化了某些合同的执行，他们可以“投票”降低这些合同的天然气价格，因此大多数矿商可以更快执行的合同自然会有更低的天然气价格；然而，所有这些想法都被拒绝了，因为我们无法想出一种加密经济安全的方法来实现这样的事情。攻击者总是可以创建一个执行一些陷门加密操作的合同，将陷门分发给他们自己和他们的朋友，以允许他们更快地执行该合同，然后投票否决gasprice，并使用它来拒绝网络。相反，我们选择了一种不那么雄心勃勃的方法，对于常见的操作，如哈希和签名方案，只需在协议中指定少量的预编译。

加文也是发展“”理念的主要倡导者[协议抽象](https://blog.ethereum.org/2015/07/05/on-abstraction/)"-将协议的许多部分(如以太余额、交易签名算法、随机数等)作为契约移入协议本身，理论上的最终目标是达到这样一种情况，即整个以太坊协议可以被描述为对具有某种预初始化状态的虚拟机进行函数调用。没有足够的时间让这些想法进入最初的Frontier版本，但这些原则有望通过君士坦丁堡的一些变化、Casper合同和分片规范开始慢慢整合。

这都在PoC7中实现；在PoC7之后，除了通过安全审计发现的一些微小但在某些情况下很重要的细节之外，该协议实际上没有太大变化...

* * *

2015年初，Jutta Steiner等人组织了预发布安全审计，其中包括软件代码审计和学术审计。软件审计主要针对C++和Go实现，分别由Gavin Wood和Jeffrey Wilcke负责，不过也有一个较小的审计针对我的pyethereum实现。在两次学术审计中，一次是由伊塔伊·埃亚尔(因“自私的采矿”而出名)进行的，另一次是由安德鲁·米勒和其他最不权威的人进行的。Eyal审计导致了一个小的协议变化:一个链的总难度将不包括叔叔。这[最低权限审计](https://leastauthority.com/blog/least_authority_performs_incentive_analysis_for_ethereum/)更侧重于智能合同和天然气经济学，以及帕特里夏树。该审核导致了几项协议变更。一个小的例子是使用sha3(addr)和sha3(key)作为trie键，而不是直接使用地址和键；这使得对trie进行最坏情况的攻击变得更加困难。

![](https://storage.googleapis.com/papyrus_images/121aee4769c7952f934c4fa613205bafa36cac6c00a9efa728ad6254ca4d805c.png)

_这是一个可能有点超前的警告..._

我们讨论的另一个重要问题是气体限制投票机制。当时，我们已经对比特币区块大小辩论缺乏进展感到担忧，并希望以太坊有一个更灵活的设计，可以根据需要随时调整。但挑战在于:最佳极限是什么？我最初的想法是做一个动态的限制，锁定目标1.5⋅实际用气量的长期指数移动平均值，因此从长期来看，平均数据块为23满了。然而，Andrew表明，这在某些方面是可以利用的——具体来说，想要提高限制的矿商只需在他们自己的区块中包括消耗大量天然气的交易，但只需很少的时间来处理，从而总是在不增加自己成本的情况下创建完整的区块。因此，安全模型，至少在向上的方向上，相当于简单地让矿工投票决定气体限制。

我们没有想出一个不太可能突破的气体限制策略，因此Andrew推荐的解决方案是简单地让矿工明确地对气体限制进行投票，并将投票的默认策略设为1.5⋅均线规则。理由是，我们还远远不知道设定最大气体限制的正确方法，任何具体方法失败的风险似乎都大于矿工滥用投票权的风险。因此，我们不妨简单地让矿工就气体限制进行投票，并接受限制过高或过低的风险，以换取灵活性的好处，以及矿工们根据需要合作快速上调或下调限制的能力。

![](https://storage.googleapis.com/papyrus_images/530eb4f5cc69c55d7c533241cfe90b0938399e46729999fc30ea3bbabb5f4413.png)

![](https://storage.googleapis.com/papyrus_images/e486c145c8f1ef637452d6b1a177d082fe88c747d94a07f3688c635de2f65cb3.png)

这导致市场操纵的机会增加，因为操纵者不仅会浪费他们的钱对抗单一的均衡，而且事实上可能成功地将一种给定的货币从一个均衡推到另一个均衡，并从成功的“预测”中获利。导致)这个转变。这也意味着存在大量的路径依赖，已建立的品牌非常重要；见证关于比特币区块链的哪个分支可以被称为比特币的史诗般的战斗，举一个特别引人注目的例子。

另一个或许更重要的结论是，appcoin的市值**关键取决于保持时间H**。如果有人创建了一个非常高效的交易所，允许用户实时购买appcoin，然后立即在应用程序中使用它，然后允许卖家立即套现，那么市值将急剧下降。如果一种货币稳定或前景乐观，那么这可能无关紧要，因为用户实际上认为持有代币而不是持有其他东西(即零“事实上的费用”)，但如果前景开始变坏，那么这样一个运转良好的交易所可能会加速其灭亡。

你可能会认为交易所天生效率低下，需要用户创建账户、登录、存入硬币、等待36次确认、交易和注销，但事实上超高效的交易所即将出现。[这里](https://www.reddit.com/r/ethereum/comments/55m04x/lets_run_onchain_decentralized_exchanges_the_way/)是一个讨论全自主同步链上事务设计的线程，它可以将令牌A转换为令牌B，甚至可能使用令牌B来做一些事情，_在单个交易中_。许多其他平台也正在开发中。

所有这些都表明，纯粹依靠交换媒介的论点来支持代币价值，虽然因为其似乎有能力凭空印钞而具有吸引力，但最终是非常脆弱的。由于非理性和持有令牌的隐含成本为零的临时均衡，使用这种模型的协议令牌可能会持续一段时间，但这是一种总是具有不可避免的随时崩溃的风险的模型。

* * *

那么还有什么选择呢？一个简单的替代方法是etherdelta方法，应用程序只需在接口中收费。一个常见的批评是:但是难道就不能有人叉接口把费用拿出来吗？一个反驳是:有人也可以用ETH、BTC、DOGE或其他用户更喜欢使用的东西来代替你的协议令牌。人们可以提出一个更复杂的论点，这很难，因为“盗版”版本必须与“官方”版本竞争网络效应，但人们也可以很容易地创建一个拒绝与非付费客户端交互的官方付费客户端；这种基于网络效应的执行方式类似于欧洲和其他地方典型的增值税执行方式。官方客户端买家不会与非官方客户端卖家互动，而官方客户端卖家也不会与非官方客户端买家互动，因此一大群用户需要同时转向“盗版”客户端才能成功规避费用。这并不十分健壮，但肯定和创建新协议令牌的方法一样好。

如果开发者希望前期收入来资助初始开发，那么他们可以出售代币，用所有支付的费用来回购部分代币并烧掉；这将使得令牌由在系统内花费的即将到来的费用的未来预期值支持。可以通过要求用户使用公用设施令牌来付费，并且如果用户还没有令牌，则让界面使用交换来自动购买令牌，从而将这种设计转变为更直接的公用设施令牌。

重要的是，对于具有稳定值的代币来说，代币供应具有以下特征是非常有益的**下沉**\-代币实际消失的地方，因此代币总量会随着时间的推移而减少。这样就有了用户支付的更透明、更明确的费用，而不是高度可变、难以计算的“事实上的费用”，也有了更透明、更明确的方法来计算出协议令牌的价值应该是多少。这导致市场操纵的机会增加，因为操纵者不仅会浪费他们的钱对抗单一的均衡，而且事实上可能成功地将一种给定的货币从一个均衡推到另一个均衡，并从成功的“预测”中获利。导致)这个转变。这也意味着存在大量的路径依赖，已建立的品牌非常重要；见证关于比特币区块链的哪个分支可以被称为比特币的史诗般的战斗，举一个特别引人注目的例子。

另一个或许更重要的结论是，appcoin的市值**关键取决于保持时间H**。如果有人创建了一个非常高效的交易所，允许用户实时购买appcoin，然后立即在应用程序中使用它，然后允许卖家立即套现，那么市值将急剧下降。如果一种货币稳定或前景乐观，那么这可能无关紧要，因为用户实际上认为持有代币而不是持有其他东西(即零“事实上的费用”)，但如果前景开始变坏，那么这样一个运转良好的交易所可能会加速其灭亡。

你可能会认为交易所天生效率低下，需要用户创建账户、登录、存入硬币、等待36次确认、交易和注销，但事实上超高效的交易所即将出现。[这里](https://www.reddit.com/r/ethereum/comments/55m04x/lets_run_onchain_decentralized_exchanges_the_way/)是一个讨论全自主同步链上事务设计的线程，它可以将令牌A转换为令牌B，甚至可能使用令牌B来做一些事情，_在单个交易中_。许多其他平台也正在开发中。

所有这些都表明，纯粹依靠交换媒介的论点来支持代币价值，虽然因为其似乎有能力凭空印钞而具有吸引力，但最终是非常脆弱的。由于非理性和持有令牌的隐含成本为零的临时均衡，使用这种模型的协议令牌可能会持续一段时间，但这是一种总是具有不可避免的随时崩溃的风险的模型。

那么还有什么选择呢？一个简单的替代方法是etherdelta方法，应用程序只需在接口中收费。一个常见的批评是:但是难道就不能有人叉接口把费用拿出来吗？一个反驳是:有人也可以用ETH、BTC、DOGE或其他用户更喜欢使用的东西来代替你的协议令牌。人们可以提出一个更复杂的论点，这很难，因为“盗版”版本必须与“官方”版本竞争网络效应，但人们也可以很容易地创建一个拒绝与非付费客户端交互的官方付费客户端；这种基于网络效应的执行方式类似于欧洲和其他地方典型的增值税执行方式。官方客户端买家不会与非官方客户端卖家互动，而官方客户端卖家也不会与非官方客户端买家互动，因此一大群用户需要同时转向“盗版”客户端才能成功规避费用。这并不十分健壮，但肯定和创建新协议令牌的方法一样好。

如果开发者希望前期收入来资助初始开发，那么他们可以出售代币，用所有支付的费用来回购部分代币并烧掉；这将使得令牌由在系统内花费的即将到来的费用的未来预期值支持。可以通过要求用户使用公用设施令牌来付费，并且如果用户还没有令牌，则让界面使用交换来自动购买令牌，从而将这种设计转变为更直接的公用设施令牌。

重要的是，对于具有稳定值的代币来说，代币供应具有以下特征是非常有益的**下沉**\-代币实际消失的地方，因此代币总量会随着时间的推移而减少。这样就有了用户支付的更透明、更明确的费用，而不是高度可变、难以计算的“事实上的费用”，也有了更透明、更明确的方法来计算出协议令牌的价值应该是多少。

2022年11月19日

交易所试图用密码证明他们没有欺骗用户的最早尝试可以追溯到很久以前。2011年，当时最大的比特币交易所MtGox证明他们有资金[一笔交易](https://www.blockchain.com/btc/tx/3a1b9e330d32fef1ee42f8e86420d2be978bbe0dc5862f17da9027cf9e11f8c4)那[搬到424242号](https://en.bitcoin.it/wiki/Mt._Gox#Trading_incidents)一个预先宣布的地址。2013年，[讨论开始了](https://web.archive.org/web/20170106070229/https://people.xiph.org/~greg/bitcoin-wizards-fraud-proof.log.txt)关于如何解决问题的另一面:证明客户存款的总规模。如果你证明客户存款等于X(“**负债证明**”)，并证明对X币私钥的所有权(“**资产证明**”)，那么你有一个**偿付能力证明**:你已经证明了交易所有资金偿还所有储户。

证明存款的最简单的方法是简单地公布一个清单`(username, balance)`成对。每个用户都可以检查他们的余额是否包含在列表中，任何人都可以检查完整的列表以查看(I)每个余额都是非负的，以及(ii)总和是要求的金额。当然，这侵犯了隐私，所以我们可以稍微改变一下方案:发布一个`(hash(username, salt), balance)`配对，并私下向每个用户发送他们的`salt`价值。但即使这样也泄露了平衡，泄露了平衡的变化模式。保护隐私的愿望[带给我们](https://bitcoin.stackexchange.com/questions/37060/is-there-a-generally-agreed-on-protocol-for-creating-proof-of-solvency)到[下一项发明](https://web.archive.org/web/20170114112433/https://iwilcox.me.uk/2014/proving-bitcoin-reserves#merkle_top): **Merkle树技术**.

![](https://storage.googleapis.com/papyrus_images/265f32f138585b37bd43a1ee08196e84b8182454a775fbfb68b594d1d8fcac8d.png)

Merkle树技术包括将客户余额表放入一个**Merkle和树**。在Merkle sum树中，每个节点是一个`(balance, hash)`一对。底层叶节点代表各个客户的余额和salted用户名散列。在每个更高层的节点中，余额是下面两个余额之和，哈希是下面两个节点的哈希。像Merkle证明一样，Merkle sum证明是树的“分支”,由沿着从叶子到根的路径的姐妹节点组成。

交易所将向每个用户发送一份他们余额的Merkle sum凭证。然后，用户将保证他们的余额被正确地包括在总数中。**可以找到一个简单的示例代码实现**[**这里**](https://github.com/ethereum/research/blob/master/proof_of_solvency/merkle_sum_tree.py).

    # The function for computing a parent node given two child nodes
    def combine_tree_nodes(L, R):
        L_hash, L_balance = L
        R_hash, R_balance = R
        assert L_balance >= 0 and R_balance >= 0
        new_node_hash = hash(
            L_hash + L_balance.to_bytes(32, 'big') +
            R_hash + R_balance.to_bytes(32, 'big')
        )
        return (new_node_hash, L_balance + R_balance)
    
    # Builds a full Merkle tree. Stored in flattened form where
    # node i is the parent of nodes 2i and 2i+1
    def build_merkle_sum_tree(user_table: "List[(username, salt, balance)]"):
        tree_size = get_next_power_of_2(len(user_table))
        tree = (
            [None] * tree_size +
            [userdata_to_leaf(*user) for user in user_table] +
            [EMPTY_LEAF for _ in range(tree_size - len(user_table))]
        )
        for i in range(tree_size - 1, 0, -1):
            tree[i] = combine_tree_nodes(tree[i*2], tree[i*2+1])
        return tree
    
    # Root of a tree is stored at index 1 in the flattened form
    def get_root(tree):
        return tree[1]
    
    # Gets a proof for a node at a particular index
    def get_proof(tree, index):
        branch_length = log2(len(tree)) - 1
        # ^ = bitwise xor, x ^ 1 = sister node of x
        index_in_tree = index + len(tree) // 2
        return [tree[(index_in_tree // 2**i) ^ 1] for i in range(branch_length)]
    
    # Verifies a proof (duh)
    def verify_proof(username, salt, balance, index, user_table_size, root, proof):
        leaf = userdata_to_leaf(username, salt, balance)
        branch_length = log2(get_next_power_of_2(user_table_size)) - 1
        for i in range(branch_length):
            if index & (2**i):
                leaf = combine_tree_nodes(proof[i], leaf)
            else:
                leaf = combine_tree_nodes(leaf, proof[i])
        return leaf == root
    

种设计中的隐私泄露比完全公开的列表要低得多，并且可以通过在每次发布根时调整分支来进一步减少，但是一些隐私泄露仍然存在:Charlie了解到这一点_有人_有164 ETH的余额，_一些_两个用户的余额合计为70 ETH，以此类推。控制许多账户的攻击者仍然有可能了解到大量关于交易所用户的信息。

该方案的一个重要的微妙之处是_否定的；消极的；负面的；负的_余额:如果一家拥有1390 ETH客户余额但只有890 ETH储备的交易所试图通过在树中的某个虚假账户下增加-500 ETH余额来弥补差额，该怎么办？事实证明，这种可能性不会破坏该方案，尽管这就是为什么我们特别需要一棵Merkle sum树而不是一棵常规的Merkle树。假设亨利是交易所控制的假账户，交易所把-500 ETH放在那里

![](https://storage.googleapis.com/papyrus_images/a08c6902d211b529e9e59f959b8ddc055a3838644fb018ba30f8f6ba8f5f2bc6.png)

Greta的证明验证将会失败:交换将不得不把Henry的-500 ETH节点给她，她会以无效拒绝。Eve和Fred的验证会_也_失败，因为Henry上面的中间节点总ETH为-230，所以也是无效的！为了逃脱盗窃，交易所将不得不希望在树的整个右半部分没有人检查他们的平衡证明。

如果交易所能够识别出500名用户，他们有信心要么懒得检查证据，要么当他们抱怨从未收到证据时不会被相信，他们就可以逃脱盗窃。但是，交换也可以将这些用户从树中排除，并产生相同的效果。因此，Merkle树技术基本上是一个债务证明方案所能达到的最好水平，如果仅仅实现债务证明是目标的话。但是它的隐私属性仍然不理想。你可以更进一步，以更聪明的方式使用Merkle树，比如[使每一个聪或卫成为一片独立的叶子](https://github.com/ethereum/research/blob/master/proof_of_solvency/crazy_merkle_tree.py)但是最终有了更现代的技术，有了更好的方法。

ZK-SNARKs是一项强大的技术。ZK-斯纳克可能对密码学有什么影响[变形金刚](https://en.wikipedia.org/wiki/Transformer_\(machine_learning_model\))是人工智能:一种通用技术，它如此强大，以至于它将彻底击败一系列特定于应用的技术，解决几十年前开发的一系列问题。因此，当然，我们可以使用ZK-斯纳克法来大大简化和改善责任证明协议中的隐私。

我们可以做的最简单的事情是将所有用户的存款放入一个Merkle树(或者更简单的，一个[KZG承诺](https://dankradfeist.de/ethereum/2020/06/16/kate-polynomial-commitments.html))，并使用ZK-斯纳克证明树中的所有余额都是非负的，并且加起来达到某个声称的值。如果我们为隐私增加一层散列，给每个用户的Merkle分支(或KZG证明)将显示_没有任何东西_其他用户的余额

![](https://storage.googleapis.com/papyrus_images/0357e090cb31d83ba48bdcaf5618474a1a86bea7a1187afd0ca96ad1646691e3.png)

![](https://storage.googleapis.com/papyrus_images/16c793767ed711838be0c0df12361e5a1026a235ee0c27d8e7194d12712c368e.png)

资产证明的最简单版本是我们在上面看到的协议:为了证明你持有X枚硬币，你只需在预先约定的时间或在数据字段包含“这些资金属于币安”字样的交易中移动X枚硬币。为了避免支付交易费用，你可以签署一个外链消息；两者[比特币](https://en.bitcoin.it/wiki/Message_signing)和[以太坊](https://w3c-ccg.github.io/ethereum-eip712-signature-2021-spec/)对...有标准[离链](https://github.com/bitcoin/bips/blob/master/bip-0322.mediawiki)签名[信息](https://eips.ethereum.org/EIPS/eip-1271).

这种简单的资产证明技术有两个实际问题:

*   **处理冷藏**
    
*   **并行双重用途**
    

出于安全原因，大多数交易所将绝大部分客户资金“冷藏”起来:在离线电脑上，交易需要人工签名并上传至互联网。字面上的空白是常见的:我过去用于个人资金的冷藏设置涉及一台永久离线的计算机，它生成一个包含签名交易的二维码，我会从我的手机上扫描这个二维码。由于涉及的价值很高，交易所使用的安全协议更加疯狂，通常涉及在几个设备之间使用多方计算，以进一步减少针对单个设备的黑客攻击泄露密钥的机会。考虑到这种设置，制作一条额外的消息来证明对一个地址的控制是一项昂贵的操作！

交换有几种途径:

*   **保留一些公共的长期使用的地址**。交换会生成几个地址，公布每个地址的证明_一次_证明所有权，然后重复使用这些地址。这是迄今为止最简单的选择，尽管它在如何保护安全性和隐私方面增加了一些限制。
    
*   **有很多地址，随机证明几个**。交易所将有许多地址，甚至可能每个地址只使用一次，并在一次交易后将其收回。在这种情况下，交换可能有一个协议，其中不时地随机选择几个地址，并且必须“打开”以证明所有权。一些交易所已经通过审计员做了类似的事情，但原则上这种技术可以变成完全自动化的程序。
    
*   **更复杂的ZKP选项**。例如，交换机可以将其所有地址设置为2选1的multisig，其中每个地址的一个密钥是不同的，而另一个是以某种复杂但非常高安全性的方式存储的某种“大”紧急备份密钥的隐蔽版本，例如16选12的multisig。为了保护隐私和避免暴露其整个地址集，交换甚至可以在区块链上运行零知识证明，其中它证明链上具有这种格式的所有地址的总平衡。
    

另一个主要问题是防止附带的双重用途。在彼此之间来回传递抵押品以证明储备是交易所的事情[很容易做到](https://twitter.com/cz_binance/status/1591690261029130240)，并允许它们假装有偿付能力，而实际上它们没有偿付能力。理想情况下，偿付能力证明将实时完成，并在每次冻结后更新证明。如果这不切实际，下一个最好的办法是在不同交易所之间协调一个固定的时间表，例如，在每周二1400 UTC时证明储量。

最后一个问题是:\*\*你能在菲亚特上做资产证明吗？\*\*交易所不仅持有加密货币，还持有银行系统内的法定货币。在这里，答案是:是的，但这样一个程序将不可避免地依赖于“法定”信任模型:银行本身可以证明余额，审计师可以证明资产负债表，等等。考虑到fiat不能用密码验证，这是在这个框架下能做的最好的事情，但是仍然值得一做。

另一种方法是彻底分离一个实体和另一个实体(USDC本身),前者运营交易所，处理USDC等资产支持的稳定账户，后者处理在加密和传统银行系统之间转移的现金流入和现金流出流程。因为USDC的“负债”只是链上的ERC20令牌，负债证明是“免费”的，只需要资产证明。

假设我们想更进一步:我们不想仅仅证明交换_有资金_来偿还它的用户。相反，我们想**彻底防止交易所盗取用户资金**.

对此的第一次重大尝试是**血浆**，2017、2018年以太坊研究圈流行的缩放方案。Plasma的工作原理是将余额分成一组独立的“硬币”，其中每个硬币都被分配了一个索引，并位于Plasma block的Merkle树中的特定位置。进行硬币的有效转移需要将交易放入树的正确位置，该树的根在链上发布

![](https://storage.googleapis.com/papyrus_images/d6d4cd40ed20557c764114b4b7635503d652515f85c19706dd1731159627909d.png)

_一种等离子体的简化图。硬币被保存在一个智能合同中，该合同在取款时执行血浆协议的规则。_

OmiseGo试图在此协议的基础上进行分散交换，但从那时起，他们转向了其他想法——就此而言，等离子体集团本身，现在是乐观的EVM汇总项目[乐观](https://www.optimism.io/).

不值得看2018年构想的等离子的技术限制(例如。[证明硬币碎片整理](https://ethresear.ch/t/plasma-cash-defragmentation/3410))作为某种关于整个概念的道德故事。自2018年等离子体话语的高峰以来，ZK-斯纳克对于规模相关的用例变得更加可行，正如我们在上文中所说，ZK-斯纳克改变了一切。

等离子体想法的更现代的版本是Starkware所谓的[井冈霉素](https://ethereum.org/en/developers/docs/scaling/validium/):基本上与ZK汇总相同，只是数据保存在链外。这种结构可以用于许多用例，可以想象，任何需要中央服务器运行一些代码并证明它正确执行代码的情况。**在有效期内，操作者有_不_窃取资金的方式，虽然根据实施的细节，一些用户资金的数量可以得到_刺_如果操作员消失了。**

这一切真的很好:远非CEX vs德克斯是一个二元，事实证明有一个完整的选择范围，包括各种形式的混合集中化，您可以获得一些好处，如效率，但仍然有许多加密护栏，防止集中运营商参与大多数形式的滥用。

但是有必要讨论一下这个设计空间右半边的基本问题:**处理用户错误**。到目前为止，最重要的错误类型是:如果用户忘记了密码，丢失了设备，被黑客攻击，或者无法访问他们的帐户，该怎么办？

Exchanges可以解决这个问题:首先是电子邮件恢复，如果连这都不行，就通过KYC进行更复杂的恢复。但是为了能够解决这样的问题，交易所需要实际控制硬币。为了有能力以正当的理由追回用户账户的资金，交易所需要有权力也可以被用来以不正当的理由窃取用户账户的资金。这是一个不可避免的权衡。

理想的长期解决方案是依靠自我监管，在未来，用户可以很容易地获得技术，如[multisig和社会康复钱包](https://vitalik.ca/general/2021/01/11/recovery.html)帮助处理紧急情况。但是_从短期来看_，有两种成本和收益截然不同的替代方案:

![](https://storage.googleapis.com/papyrus_images/93deec8e6762fe670f311a230604d39b24ef6896e4b2a704135c0910d6083f20.png)

---

*Originally published on [leaf](https://paragraph.com/@leaf-6/vitalik-buterin-s-website)*
