比特币只是一个更广泛的生态系统的一个组成部分(虽然是重要的一个),通常与之非常相似的货币称为代币。在本章中,我们将介绍altcoins(代币、山寨币)和加密货币的生态系统。
10.1 Altcoins:历史与动机
比特币于2009年1月推出。又过了两年,直到2011年年中才推出第一个比特币衍生系统Namecoin。2013年altcoin的发行比率开始爆发,数百个紧随其后。总共有多少altcoin?不可能提供一个确切的数字,因为不清楚哪些altcoin是值得统计的。例如,如果有人宣布推出一个altcoin,并且可能会发布一些源代码,但是没有人开始挖掘或使用它,这是否算在内?一些其他altcoins已经启动,被看到一些初步的使用,但后来发布后非常快地死亡了。
图10.1:每月推出的Altcoins(通过创世区块的创建来衡量的)。
还不太清楚一个altcoin相对于另一个简单的加密货币意味着什么。毕竟,比特币之前的各种各样的加密安全提议和系统,通常不称为altcoin。许多altcoin借用比特币的概念,通常直接分配其代码库或以其他方式采用比特币的一些代码。有些只对比特币进行非常小的修改,例如更改系统某些参数的值,并继续整合Bitcoin开发人员所做的更改。到目前为止,我们所知道的所有altcoins开始于一个新的创世区块和他们自己交易历史的替代观点,而不是在历史上某一点之后分叉比特币的区块链。对于我们而言,我们不需要一个精确定义的altcoin。相反,我们将松散地参考自Bitcoin作为一个altcoin启动后的任何加密机制。
我们将简要介绍如Ripple和Stellar这样的非altcoin系统:这些是我们在第2章中讨论的传统中的分布式共识协议。这些系统在一个节点具有标识且需要相互了解的模型中达成了共识。比特币当然是从这个模式中脱颖而出的。在Ripple和Stellar中,共识协议支持支付/结算网络,每个系统都有本地货币。尽管与altcoins有这些相似之处,但我们并不认为它们属于这本书的范围。
启动altcoins的原因。每个altcoin需要一些故事来讲述。如果一个altcoin不能声称一些与其他有所区别的特征,它就没有理由存在。在最简单的情况下,一个altcoin简单的变化只会将一些内置参数更改为Bitcoin的。这包括区块之间的平均时间,区块的大小限制,创建区块的奖励计划或者altcoin的通货膨胀率。
也可能有更复杂的技术差异,这是一个更有趣的情况。例如,可以添加脚本语言来表达不同类型的交易或安全属性。采矿可能会有所不同,共识算法也可能与比特币有显著差异。
有时候,altcoins还将发起一个主题或一种社区意识,即altcoin意图支持或与之相关联,通常会使这个社区的成员在altcoin中有特殊的角色或能力。我们将在本节后面的例子中看一下所有这些。
如何启动altcoin。让我们考虑一下推出altcoin的过程,以及altcoin发布之后会发生什么。正如我们所提到的,创建一个altcoin涉及创建一个新的参考客户端,通常是通过分派一些现有代码库,更加完善的altcoin或比特币本身。简单的部分是添加一些你认为会很好的技术功能或修改的参数。事实上,曾经有一个名为Coingen的网站以少量费用将这个过程自动化。它允许你指定各种参数,如平均区块创建时间和你想要的工作证明算法,以及altcoin的名称,3个字母的货币代码和徽标。然后点击一个按钮,你可以使用你选择的参数下载比特币分叉,而你(和其他人)可以立即开始运行它。
困难的部分是引导你采用你的altcoin。你可以分叉源代码,你可以公开发布,但在这一点上,没有人使用你的altcoin,所以它没有市场价值(因为没有人想要硬币),没有安全(因为还没有矿工)。在第七章中,我们看到比特币有一些利益相关者:开发商,矿工,投资者,商家,客户和支付服务。最终,你必须吸引所有这些类型的参与者到你的altcoin经济中才能起飞。
所有这些都是重要的和相关联的,类似于直面挑战启动任何其他平台并使之得到采纳。如果你想启动一个新的智能手机操作系统,那么你需要吸引用户,设备制造商,应用程序开发人员和其他利益相关者,而这些组织中的每一个都需要其他人。
吸引矿工对于加密货币特别重要,因为一个altcoin背后没有足够的哈希能力,如果双重支付和分叉可能导致安全性严重失败。事实上,你的altcoin可能会完全超越;我们将在本章后面看看“altcoin杀婴”。没有一个简单的配方来引导采用,但一般来说,矿工们会相信他们收到的硬币奖励值得付出努力。为了鼓励这一点,许多altcoins给早期的矿工更大的回报。比特币当然是开创了这种先例,但是一些altcoin已经采取了更积极的方法来回报早期的矿工。
让社区的人们相信的altcoin是有价值的是最困难的技巧。正如我们在第7章中讨论的那样,即使是比特币也不清楚这个过程是如何引导的,因为它依赖于叮叮当效应。这又回到了为什么altcoins需要一个很好的叙事:社区中脱离地面的人们需要相信新的altcoin在未来真正会有价值(并相信别人会相信它是有价值的,等等)。
给定一个人们有兴趣获得altcoin的社区,矿工通常会来(虽然如果价值上涨速度比矿工开始开采货币的速度更快,这可能是有风险的)。一旦有价值被感知,其他重要因素通常会反过来,就像在交易所上市,开发各种类型的配套基础设施是有用的,从基础鼓吹到探索区块链的工具。
泵和倾销的骗局。当一个代币的创始人成功地引导社区和真正的交易市场时,他们经常发现自己很富有。这是因为他们几乎肯定拥有大量的硬币——例如在哈希率增加之前作为早期的矿工,甚至是我们在下面讨论的“预采矿”。一旦代币的汇率上升,如果他们选择,创始人将能够卖掉他们的硬币。
富有的可能性吸引了创业人士和风险资本投资山寨币,勿庸置疑,它也吸引了骗子。事实上,两者之间的界线有时是模糊的。一个骗子可能会使用各种方法来夸大代币的潜力,鼓起大家的兴趣。他们可能会夸大其所谓的技术优势,假冒基层支持的外表,以高价购买市场上的代币等等。
事实上,这个骗局可以被一个不是代币的创始人拉下来。他们首先需要购买一些晦涩的代币的股票,然后说服公众这个硬币未被发现的潜力(即“泵”代币)。如果他们以这种方式成功地提高了价格,他们可以卸下他们的股票并获得利润(即“倾倒”他们的硬币)。在这一点上,投资者可能会对欺诈变得明智,价格会下降,许多人拿着无价值的硬币。长期以来,在主流金融领域,这种使用晦涩低价的股票的泵和倾销欺诈行为一直存在,而在早期的热情高涨的代币时代,这种情况特别普遍,投资者也在努力地将真正创新的代币与没有真正创新滑稽的市场系统“我也是”区别开来。结果,用户和投资者今天对代币有些厌倦。
初始配置。在比特币中,货币仅通过采矿分配给用户。但是由于种种原因,除了采矿之外,代币开发商还寻求其他初始货币分配方式。
开发商可以“预先挖掘”货币,即为自己或其他指定实体(如具有特许权的非营利基金组织开发货币)预留一部分货币供应。这个想法是,意外之财的可能性使开发人员更有动力花时间创建和引导新的加密机制。有时候他们会进一步做一个“预售”,他们把这些预先挖掘的单元卖给比特币或法定货币的其他投机者。这有点类似于投资一家创业公司:如果代币规模变大,投机者就可以变得富有。
寻求额外的初始分配方法的另一个动机是确保早期货币拥有者拥有一个多元化的社区,并对其成功有利害关系,因为今天的采矿是相当集中的,可能会导致资产的集中所有权。实现多样化所有权的一个聪明的方法是将代币单员分配给现有的Bitcoin所有者。
我们如何在技术上设计系统,以便拥有比特币的任何人都可以申请自己的份额,使得这种要求被自动执行。一个选项是烧伤证明,我们在第3章中讨论过:用户可以按照与他们可以销毁的比特币的数量成比例的方式来索赔新的代币单元。所有者将承诺燃烧证明中的一些数据,例如识别特定代币的特殊字符串,以表明他们正在燃烧比特币,以获得该特定代币的新单元。
通过燃烧证明分配代币也被称为“单向栓”或“价格上限”。将一个代币单元(比如说)关联一个比特币实际上并不值得一个比特币。它确保代币最多值得一个比特币,因为一个比特币总是可以兑换为一个代币,但反之不亦然。
图10.2:通过燃烧证明分配代币。代币支持GenCoin交易,将Bitcoin交易作为输入。GenCoin由签署燃烧证明(并使用相同签名方案)的相同私钥签署。这样可以确保同一位烧过比特币的用户也创建了GenCoin。如果栓比为1:1,则v'必须不大于v。
有一个不那么笨重的替代方案:要求证明比特币的所有权,但不会烧掉它们,要求代币。具体来说,代币将指定比特币区块的高度(可能与代币的发布日期一致),在此期间,任何人谁拥有一个未使用的比特币交易量作为这一区块能够申请一定比例数量的代币。在这个系统中,比特币的价格和代币的价格之间并不一定有固定的关系,因为比特币不是通过燃烧证明“转换”为代币。
图10.3:通过证明比特币的所有权分配代币。GenCoin的输入是指定区块高度处的一个或多个未使用的比特币交易输出。它是通过私钥进行签名的,这些私钥控制着这些未使用的输出,就像任何普通的比特币交易一样。这里所显示的比特币交易在指定的块高度处具有两个未使用的交易输出到地址B和C。地址B的所有者声称他们的代币,但地址C的所有者尚未这样做。如果栓比为1:1,则v'必须不大于。
当然,为了使所有这一切都发生,代币矿工也需要保持在比特币区块链上。代币也必须指定什么数量作为一个确信的比特币交易。一个选择是要求一些固定数量的确认,比如说6。另一种选择是指定每个代币区块中最新的比特币区块。这样,比特币交易立即可以在代币中使用。这类似于在比特币本身中的交易输出可以在下一个区块或甚至在相同的区块中花费的事实。合并采矿,我们将在下一节讨论,这是将代币区块与比特币区块结合在一起的一种方式。
最后,捐赠已经分配的硬币是增加货币所有者多样性的另一种方式。一种方法是小费:各种服务允许向电子邮件地址或社交媒体帐户发送小费,这部分是激励接受者了解和拥有货币利益的一种方式。小费服务将硬币保留在托管中,收件人收到一条消息,告诉他们,他们有可以收集的硬币。收件人可以通过他们的电子邮件地址或社交媒体帐户向服务器进行认证来索取硬币。他们还需要安装钱包软件或启用其他方式来接收硬币。另一种捐赠方式是一个水龙头:这些服务可以向访问某个网站或可能输入电子邮件地址的任何人发送少量硬币。
10.2几个Altcoins的细节
现在我们将专注于一些最古老的代币,并更详细地研究其功能。
Namecoin。我们已经看到比特币的区块链是一个安全的全球数据库。一旦数据被写入它,它是防篡改的,其包含的可以被永远证明。我们是否可以修改Bitcoin的设计,以支持其他安全的全局数据库应用程序,如命名系统?
我们需要一些基本规则,使此数据库对非货币应用程序更有用。首先,我们同意将数据条目视为名称/值对,其名称全局唯一。这允许每个人查找映射到名称的值,就像哈希表或具有主键字段的数据库。为了强制名称的全局唯一性,如果一个名称/值对与以前的数据库条目具有相同的名称,那么我们将其视为对该值而不是一个新条目的更新。
其次,我们同意只有最初创建特定名称的条目的用户才能更新该名称。我们可以通过将每个名称与比特币地址相关联并且要求更新事务由该地址的私钥进行签名来轻松实现。
我们可以在Bitcoin之上做到这一点,正如我们在第9章中所说的那样,我们可以使用Bitcoin作为仅追加日志来构建任何重叠式货币。但是在一个代币中做的更简单,因为我们可以把这个绅士的协议写成代币的规则。这些规则之后将是不可侵犯的并且由矿工执行,而不是要求每个用户(即,完整的节点)自己检查规则,并独立地决定如果违反了该做什么。完全正确,甚至可以允许SPV风格的证明:轻量级客户端能够向运行完整节点的服务器提交查询(即名称),并且服务器将返回该名称的值,以及证明返回值实际上是数据库中该名称的最新更新。
这就是Namecoin。 它是一个全球名称/价值商店,每个用户可以注册一个或多个名称(以一定的费用),然后发布其名称的值的更新。用户还可以将他们名字的控制权转让给他人。事实上,你可以进行将你的域名转让给某人的交易,同时将Namecoin货币的单元从他们转移给你。由于这是一个单一的原子交易,所以将你的域名销售给你从未遇到并不信任的人是一种安全的方式。截至2015年,Namecoin不支持安全轻量级客户端,但已经提出了支持这一点的扩展。
Namecoin的目标是提供分散版本的域名系统(DNS),数据库中的名称是域名,值是IP地址。默认情况下,你不能使用未经修改的浏览器,但你可以下载Firefox或Chrome浏览器外挂程式,以便允许你输入地址,例如example.bit——以.bit结尾的任意域名——并且它将查找Namecoin注册表中的位置,而不是传统的DNS。
Namecoin在技术上是有趣的,也是历史上有趣的——它实际上是第一个推出的代币,在2011年4月,比比特币推出晚两年多。它具有“合并挖掘”,我们将在本章后面讨论。
Namecoin从2015年开始就没有太多使用。绝大多数注册域名都是由“擅自占地者”采取的,希望(但是到目前为止还没有)出售他们的名字以获利。Namecoin的支持者倾向于认为,现有的DNS对互联网关键组件的控制权过多地掌握在单个实体的手中。这个观点在Bitcoin社区是受欢迎的,你可以想像,但是看起来主流用户并不喜欢DNS的替代品,抢劫杀手级应用程序的Namecoin需要看到明显的应用。
莱特币。Litecoin也在2011年推出,在Namecoin之后的一段时间。在过去几年中,Litecoin在整体人气和用户群方面一直是首屈一指的altcoin。它也是最广泛的代码库。事实上,它比比特币分叉的次数多得多。
Litecoin和Bitcoin的主要技术区别是,Litecoin具有第8章中讨论的记忆硬挖掘难题(基于scrypt)。当Litecoin推出时,Bitcoin采矿是在GPU时代,所以Litecoin使用记忆硬挖掘难题的目标是GPU阻力。当它启动时,你仍然可以用一个CPU挖掘Litecoin,很久以后,这变得对Bitcoin无用了。但从那时起,Litecoin并没有成功地抵制GPU挖掘过渡到ASICs。相比比特币,这些采矿转型在Litecoin上花了更长一点的时间,但不清楚这是因为Litecoin的谜题在硬件上更难实现,或者因为Litecoin的较低汇率提供了较少的激励。
无论如何,对于Litecoin,ASIC的性能改进相比CPU挖掘大致相似,一如他们对于比特币一样。在这个意义上,Litecoin的原始目标是通过维护一个CPU矿工社区来创建一个更加分散的系统。但是,重要的是,这个叙述仍然适用于引导Litecoin——它吸引了许多采用者停留,甚至在原来的前提失败之后。Litecoin已经明确地改变了叙述,指出它的初始配置比Bitcoin更公平,因为它比ASIC更耐久。
Litecoin也进行了一些次要的参数更改:例如Litecoin的区块诞生速度比比特币快4倍,每2.5分钟一个。否则,Litecoin尽可能地从比特币中借用。事实上,它的发展紧随比特币,所以随着比特币的补丁和改进,Litecoin也采用了这些。
Peercoin。Peercoin有时被称为PPCoin,于2012年底推出,是第一个采用矿产证据开采的代币。我们在第8章中讨论了权益证明采矿(Peercoin实施的),但是Peercoin有趣的是讨论另外一个完全不同的原因:它的管理员有一个值得信赖的公钥,经常用于分配“祝福”区块的检查点。这样做的目的是为了防止分叉攻击,但这是有争议的,因为管理员控制系统的能力意味着Peercoin并不是真正的分散的系统。检查点系统不是Peercoin固有的,可以在将来被删除;但它的存在意味着我们不能推断,权益证明已经导致了实际的安全系统。我们不知道如果这个保护措施被删除会发生什么。
图10.4:几个Dogecoin标志之一。卖点比技术创新更幽默。
多吉币。Dogecoin也许是迄今为止所有代币中最丰富多彩的。它于2013年底发布,其区别不在于技术性(它是Litecoin的近叉),而是一组社区价值观:倾诉,慷慨,而不是如此认真地对待密码。事实上,它是以Doge命名的,一个有趣的互联网模式,以语法挑战的柴犬狗为特色。社区已经进行了一些有趣和成功的营销活动,例如赞助NASCAR司机,并将Dogecoin标志全部放在车上。 他们还筹集了超过三万美元,以支持牙买加国家山猫队,以便他们可以在2014年冬季奥运中旅行和参加比赛。很明显,这与1990年代的“酷奔跑”电影密切相关。
社区的慷慨,公关活动和Doge固有的价值结合意味着Dogecoin在2014年变得非常受欢迎。在Dogecoin之前,似乎很多早期采用者不熟悉加密货币,这提供了一个新的社区来引导货币的价值,而不必在其他货币方面提供令人信服的故事。Dogecoin表明,引导可以成功地与非技术一起叙述。不幸的是,像许多互联网现象一样,受欢迎程度并没有持续下去,Dogecoin的汇率已经下滑了。
10.3比特币与altcoins之间的关系
要了解不同代币的相对大小或影响,我们可以使用各种指标。
代币比较:市值。市值是通过将股票价格乘以已发行股份总数的方式来估算公司的价值的简单方法。在代币的背景下,这个市值经常被类似地用于估计代币的所有价值,通过将一个单元代币的价格(可能是最受欢迎的第三方交易所测量)乘以被认为流通中所有代币的总数。按照这一指标,Bitcoin是迄今为止最大的——截至2015年,它占所有加密货币总体市值的90%以上。其他代币的相对排名往往有很大差异,但重要的是大多数代币在货币价值方面相对较小。
重要的是不要对市值进行太多解读。首先,人们不一定要花费多少钱来购买流通中的所有硬币。这个数字可能会更高或更低,因为大量订单会影响货币的价格。第二,即使计算只考虑当前流通的硬币,我们也应该期望市场参与者将汇率计算在一个新的硬币将来会流通的事实,这进一步使数字的解释复杂化。最后,我们甚至不能准确地估计当前正在流通的硬币的真实数量,因为,我们无从知道一些硬币的所有者可能已经丢失了他们的私钥。
代币比较:采矿权。如果两个代币使用相同的挖掘难题,我们可以直接比较他们所有代币的矿工有多少采矿权。由于基于哈希谜题的显著性,这通常被称为哈希率。例如,Zetacoin是一个使用SHA-256挖掘谜题的代币,就像Bitcoin一样,截至2015年12月,网络哈希率约为5 Terahash /秒(5 *哈希/秒)。这个数字是比特币矿业的十分之一。比较使用不同采矿谜题的硬币之间的采矿能力比较棘手,因为谜题可能需要不同的时间来计算。此外,专门用于其中一个硬币的矿业硬件不一定可用于采矿(包括攻击)另一枚硬币。
即使对于使用完全独特的挖掘谜题的代币,我们仍然可以从随着时间推移的采矿权相对变化中学到一些东西。采矿能力的增长表明,更多的参与者已经加入,或者已经升级到更强大的采矿设备。矿权的丧失通常意味着一些矿工抛弃了代币,这通常是一个不祥的迹象。
代币比较:其他指标。这里有几个我们可以看的其他指标。随着时间的推移,代币的汇率变化给了我们关于其健康状况的线索,并且往往与长时间的哈希率变化相关。各种第三方交易所的交易量是衡量交易所活动和兴趣的量度。 另一方面,在代币的区块链上进行的交易量并没有告诉我们,因为它可能只是用户在自己的钱包里摆放自己的硬币,甚至是自动的。最后,我们还可以看看有多少商家和支付处理商支持代币——只有最突出的代币往往被支付处理商支持。
Bitcoin-altcoin相互作用的经济观点。比特币与代币之间的关系很复杂。 在某种意义上,加密货币相互竞争,因为它们都提供了一种在线支付方式。如果有两个标准,协议或者竞争格局,在他们所提供的方面大致相当,那么其中一个通常会被统治起来,因为经济学家称之为“网络效应”。
例如,蓝光和HD-DVD在2000年代中后期的激烈竞争中成为DVD格式的继承者。渐渐地,蓝光开始变得越来越受欢迎,很大程度上是因为流行的PlayStation
3控制台用作蓝光播放器。这使得蓝光成为电影制片厂的更有吸引力的格式,并且这种受欢迎程度也在增加:随着更多的电影被蓝光发布,更多的消费者购买了独立的蓝光播放器,导致更多的电影发行等等。同样的,如果你的朋友都有蓝光播放器,你可以自己购买一台,而不是一台HD DVD播放器,因为你可以轻松地与他们交换电影。 大约两年后,HD DVD变成了一个历史脚注。
边栏:谁赢得比赛?早在HD DVD之前,已经有无数的技术标准的例子,这些技术标准迅速地从竞争对手名单中失败了,并且黯然失色,从Betamax模拟录像到俄罗斯标准轨道履带。如果你从未听说过这些,网络效应就是原因。有时,就像托马斯·爱迪生的直流电网与尼古拉·特斯拉的交流电网一样,赢家(AC)是由压倒性的技术优势决定的。然而,在许多其他情况下,如Betamax磁带丢失到VHS磁带,失败者实际上在技术上是优越的,网络效应足够强大以克服轻微的技术缺点。
这一推理方式表明,一个加密的货币将占主导地位——可能是比特币(Bitcoin),这是目前最流行的一个——即使一些后继系统可以被认为在技术上是优越的。但这是一个过渡简化。至少有两点原因,加密货币之间的竞争并不如光盘格式之间的竞争。
首先,用户将一个加密货币转换为另一个是相对容易的,供应商可以接受一个以上的加密货币,这意味着多个加密货币可以更容易地共存和繁荣。在经济学方面,加密货币显示相对较低的交换成本。与DVD播放器相比,大多数人真的不希望在家中使用两个庞大的机器,如果他们改变为播放另一个的机器,则不能转换他们现有的光盘库格式。加密货币的转换成本当然不为零。例如,用户可能会购买无法升级的硬件钱包。 但总的来说,可以轻松地切换加密币或同时使用多个。
第二,正如我们前面所说,许多代币具有独特的特征,这为现有提供了明显存在的理由。这些代币不应该被视为比特币的替代品;它们可能是正交的,或者甚至是互补的。以这种方式,互补的代币实际上增加了比特币的有用性,而不是与它竞争。如果Namecoin成功,比如比特币用户可以使用他们的比特币来做一些更有用的事情。
但这张快乐合作的画面也是过于简单。一些代币,如Litecoin,只是试图实现与Bitcoin相同的功能,但是以不同的,也许更有效的方式。即使提供了新的功能,通常这些用例实际上可以在比特币本身中实现,尽管这种方式不太优雅(在第11章中我们将更多地谈到这一点)。比特币模式的支持者认为,有许多代币可以划分可用的哈希能力,并使每种货币的安全性降低。
代币的支持者认为,代币允许市场力量确定哪些特征值得拥有,哪些系统在技术上是优越的,等等。他们进一步认为,有许多代币限制任何一个系统潜在的灾难性故障的损害。他们还指出,Bitcoin开发人员风险很大,通过软硬盘向Bitcoin添加新功能是一件很慢而且困难的事情。另一方面,很容易通过代币尝试一个新的想法;代币可以被看作是潜在的Bitcoin功能的研发测试平台。
实际的结果是,Bitcoin的支持者和代币的支持者之间有一些紧张关系,也是一种合作感。
10.4合并采矿
在这一节和下一节中,我们将放下文化,政治和经济学的问题。相反,我们将专注于比特币与代币之间的技术交互。
代币杀婴。从2015年起,比特币的哈希能力与其他任何代币相比都有所差异。事实上,有强大的矿工和采矿池控制比整个代币更多的采矿能力。这样一个矿工或实体可能很容易地对一个小型的代币进行攻击(如果它使用与Bitcoin相同的SHA-256挖掘难题),造成分叉和一般破坏,这往往足以杀死代币。我们称这种现象是杀死婴儿。
为什么有人会这样做,他们必须用宝贵的矿业来这样做,且不会获得大量的金钱奖励?以2012年的攻击为例,CoiledCoin是一个小型代币:Bitcoin采矿池运营商Eligius决定,CoiledCoin是一个骗局,是对隐私安全生态系统的侮辱。因此,Eligius将其矿业资源指向了CoiledCoin,采矿区块,扭转了日益增长的CoiledCoin交易历史,并以空区块开采长链,有效地导致拒绝服务攻击,从而阻止了CoiledCoin用户进行任何交易。经过相当短的围攻,用户放弃了CoiledCoin,它不再存在。在这个例子和其他的杀伤性杀戮恐怖袭击中,攻击者是由直接利润以外的东西所激发的。
合并采矿。默认情况下——如果说一个代币分叉比特币源代码,但没有其他变化——代币上的挖掘就是排他的。也就是说,你可以尝试解决挖掘谜题解决方案,为代币或Bitcoin找到一个有效的区块,但是你不能尝试一次解决两个谜题。当然,你可以划分你的矿业资源,把一些矿业用于代币矿山,另一些则是在比特币上采矿。你甚至可以在多个不同的代币之间划分,你可以随着时间的推移调整你的分配,但没有办法让你的矿业权力做双重责任。
采用独家开采技术,网络效应可能使得代币产品难以引导。如果你想推出一个代币,并说服今天的比特币矿工参与你的网络,他们将不得不停止采矿比特币(至少有一部分资源),这意味着立即损失比特币矿业奖励。这意味着你的代币在哈希能力上可能保持较小,并且易受Bitcoin矿工的杀婴型攻击。
我们能否设计一个代币,同时在代币和比特币上挖矿区块成为可能?为了做到这一点,我们需要创建包含比特币和代币交易的区块,使它们在两个区块链中都有效。很容易去设计这样的代币,以便它允许比特币交易在其区块上发生,因为我们可以写我们想要的任何代币规则。相反就比较困难。我们能把代币交易放在比特币区块中的哪里?在第3章和第9章的后面我们已经看到了如何将任意数据放入比特币区块,但这些方法的带宽是非常有限的。
有一个诀窍,虽然:即使我们不能把代币交易的内容放在比特币区块中,我们可以把代币交易的一个摘要放在比特币区块中,形式是哈希指向代币区块。找到一种将单个哈希指针放入每个比特币区块的方法很容易。具体来说,回想一下,每个比特币区块都有一个特殊的交易,称为“coinbase交易”,这是矿工创建新硬币作为区块奖励的地方。该交易的scriptSig字段没有任何意义,因此可用于存储任意数据(由于没有花费任何先前的交易输出,因此无需签署Coinbase交易)。所以在合并开采的代币中,挖掘任务是计算Bitcoin区块,其Coinbase scriptsig包含一个哈希指针到一个代币区块。
这个区块现在可以做双重任务:对于Bitcoin客户端,它看起来像任何其他Bitcoin区块,在coinbase交易中的哈希可以被忽略。代币客户端知道如何通过忽略Bitcoin交易来解读该区块,看看在coinbase交易中由哈希所承诺的代币交易。请注意,虽然这不需要对Bitcoin进行任何更改,但它确实要求代币专门了解Bitcoin并接受合并开采的区块。
如果我们的代币合并开采,我们希望许多比特币矿工能够在其上挖矿,因为这样做不需要额外的哈希力。它需要一些额外的计算资源来处理区块和交易,矿工们需要知道和足够关心我们的代币,甚至打扰开采它。让我们说25%的比特币矿工通过哈希力挖掘我们的代币。这意味着平均25%的比特币区块包含指向代币区块的指针。那么,似乎在我们的代币中,一个新区块将平均每40分钟开采一次。更糟糕的是,虽然代币矿仍在被引导下,比特币矿工采矿的比例非常小,区块之间的时间将是数小时或数天,这是不可接受的。
我们是否可以确保合并开采的代币的区块是按照我们想要的高或低的速度创建的,而不管比特币矿工挖掘的比例如何?答案是肯定的。诀窍在于,即使采矿任务与比特币相同,采矿目标也不是。代币网络独立于比特币网络计算其区块的目标和难度。正如比特币调整其采矿目标,以便平均每10分钟发现一个区块,这个代币会调整自己的目标,以便每10分钟发现一次代币的区块,或任何其他固定值。
图10.5:合并挖掘。
这意味着代币的目标通常会比Bitcoin的目标低得多,而有些(甚至大多数)代币模块不会被有效的比特币区块所指向。但是没关系!你应该将比特币区块链和代币区块链视为两条平行链,偶尔从比特币区块指向代币区块。如图10.5所示。在这个例子中,百分之六十的比特币矿工开采了代币,而代币的时间间隔是5分钟。这意味着代币的困难是比特币的60%* 5/10 = 30%。请注意,40%的比特币区块不包含哈希指针到代币区块。
相反,每个有效的代币区块都是从采矿比特币区块的尝试产生的,但只有30%的人实际上满足比特币的难度目标。对于其他70%的代币区块,代币网络需要能够验证挖掘难题解决方案。要做到这一点的简单方式是广播比特币临近区块另外的代币区块。但一个更聪明的方式是只广播比特币临近区块的头部,以及在比特币区块中包含Coinbase交易的Merkle证明。
这也是可能的(尽管很少见),因为这个代币实际上比Bitcoin有一个更难的谜题。这是不寻常的,因为大多数代币希望每10分钟发现一个区块或更经常,而且如果由于某种原因,你想要的速度更慢,这也很容易实现。在这种情况下,你会看到一些比特币区块,矿工希望也是一个代币区块,但将被代币网络拒绝,因为他们没有达到更难的难度目标。
最后,请注意,任意数量的代币都可以同时与Bitcoin进行合并,每个矿工都可以自由挑选一个代币的任意子集来组合我的矿物。在这种情况下,Coinbase scriptSig本身就是一个指向各种代币区块的哈希指针的Merkle树。请注意复杂程度:验证包含代币交易需要验证,其中包括:(1)代币区块中包含代币交易的Merkle证明(2)Coinbase scriptSig中包含代币区块哈希的Merkle证明和(3)比特币区块或接近区块中包括Coinbase scriptSig的Merkle证明。
合并采矿和安全。合并采矿是一种混合的祝福。正如我们所讨论的那样,它使引导更容易,并且由此导致你的代币的总哈希力增加了其抵御攻击的弹性。想要购买计算能力以摧毁你代币的对手将需要做出巨大的前期投资。
另一方面,人们可以认为这是一种虚假的安全感,因为这样的对手可能会通过采矿比特币来补偿他投资的成本,攻击你的代币的边际成本就是微不足道的了。如果我们考虑的对手已经是大比特币矿工,这就更容易理解了。事实上,前面描述的CoiledCoin是遭受杀害进行合并开采的代币。Eligius采矿池及其参与者不需要停止Bitcoin采矿来攻击它。事实上,池参与者甚至不知道他们的计算资源被用于攻击!
边栏:代币采矿谜题的趋势。截止2015年,几乎不存在与比特币相同的SHA-256采矿谜题,有或没有合并采矿,这表明它可能被认为是一种安全风险。Scrypt是一个更受欢迎的选择,这使得比特币ASICs对于采矿或攻击这种代币无用。当然,为Litecoin采矿制造的scrypt ASICs可以用来攻击他们。
当我们考虑一个合理的矿工决定是否合并采矿时,我们发现合并采矿安全性的更多问题。回想一下,大致来说,如果预期报酬等于或超过预期成本,采矿是有意义的。对于比特币采矿,成本主要是哈希计算的成本。但是对于已经是Bitcoin矿工的人来说,决定是否合并采矿一个代币,没有额外的哈希成本。相反,额外的成本来自以下两个因素:验证代币交易所需的计算,带宽和存储,并且需要使软件保持最新,并且如果代币正在进行硬叉或软叉,则可能做出明智的决定。
这个推理产生了两个见解。首先,合并采矿具有较强的规模经济性,因为所有的矿工无论其哈希能力如何,都会产生大致相同的成本。这与比特币形成鲜明对比,其中成本与哈希功率成比例,到第一个近似值。所以对于一个低价值的代币来说,一个小型的独立矿工会发现它并不利于合并采矿,因为它的成本超过了由于它们的低哈希能力所造成的微薄回报。请记住,截至2015年,采矿代币的潜在收入仍然是比特币矿业收入的一小部分。据预测,与比特币相比,合并开采的代币将更集中或集中采矿能力。
一个相关的预测是大多数矿工都会选择外包他们的交易验证。代币越小,外包的激励就越大。这样做的自然方式加入比特币矿池。这是因为池通常将这些计算从矿工手中拿走。池操作员在验证比特币区块中的交易以及所有这些代币区块之后,组装了一个比特币区块,其中合并来自(零个或多个)代币的块。矿工只是试图解决这个问题。这些预测在实践中得到证实。例如,GHash.IO,同一时间最大的比特币矿区,允许合并挖掘Namecoin,IXCoin和DevCoin。所以这些成为最受欢迎的合并开采的代币。
经济推论的第二个见解可能比集中采矿权更加令人担忧其安全性。当矿工的主要成本是工作证明时,通过设计,矿工无法“欺骗”。鉴于哈希函数的安全性,挖矿没有捷径,另外,其他矿工很容易就可以验证工作证明。当成本是交易验证成本时,这两个假设都会失败。矿工可以假设他们听到的交易是有效的,并希望摆脱它。此外,对于其他矿工来验证一个区块,其交易与发现它的矿工的工作一样多。由于这些原因,我们应该期望,至少对于小型矿业公司来说,有一种激励来甄别验证。存在不正确验证的矿工使得攻击更容易,因为一个恶意的矿工可以创建一个将导致其他矿工不同意最长有效分支的区块。
总而言之,合并采矿解决了一个安全问题,但创造了许多其他问题,部分原因是合并采矿的经济性与独家采矿的经济学有重要的不同。总的来说,并不清楚,合并采矿是一个关于新的代币关心采矿攻击的好主意。
10.5原子交链交换
在比特币中,创建一个由不同的人或实体控制的能交换货币或资产的单个交易是直截了当的。这是Coinjoin背后的直觉,我们在第6章中研究过。它也有助于交易智能财产,我们在第9章中简要介绍并将在第11章中回顾。同样的想法可以在Namecoin中销售域名,如本章前面所述。
但是在所有这些情况下,即使交易涉及到该区块链中的不同类型的资产,互换交易也只限于一个单一的区块链。一般来说,一个代币上的交易完全是独立的,也没有办法提及在某些其他代币交易历史上发生的交易。但这是一个根本的限制?还是有一些方式来交换一种类型的货币为其他的?也就是说,如果爱丽丝想要向鲍勃出售数量a的代币,以换取他数量为b的比特币,他们能否以原子的方式这样做,而不必相互信任或依赖中介,例如交换服务?首先看来这似乎是不可能的,因为没有办法强制两个不同的区块链交易同时发生。如果其中一个人,比如爱丽丝,在其他的之前执行转移,是什么阻止他背弃自己当初的合同?
解决方案是聪明的,涉及加密承诺和时间锁定存款,这两个都是我们以前看过的技术。协议如图10.6所示。此时,假设两个区块链中的区块在锁步骤中生成:每个单元生成一个区块。T表示协议开始时的时间。
1.Alice生成一个可退款的押金代币a,如下所示:
1.1 Alice生成一个随机字符串x,并计算哈希h=H(x)
1.2 Alice生成存款A,如下所示,但尚未发布
1.3 Alice生成退款A,并获得Bob的签名
1.4一旦Bob签名退款A后,她发行存款A(但不发行退款A)
2.Bob生成一个可退款的押金比特币b,如下所示:
2.1 Bob生成存款B,如下所示,但尚未发布
2.2 Bob生成退款A,并获得Alice的签名
2.3一旦Alice签署退款B后,他发行存款B(但不发行退款B)
3.案例1:Alice通过互换
3.1 Alice以时间T1声称比特币,在此过程中向Bob(和所有人)透露x
3.2 Bob以时间T2声称代币
案例2:Alice改变主意,不声称代币,不向Bob透露x
3.1 Bob在时间T1上声称他的代币退款
3.2 Alice在时间T2上声称她的比特币退款
图10.6:原子交链交换协议
在第1步中,爱丽丝存放价值为a的代币,以便可以用两种方式之一兑换(“存款”就是将这些硬币发送到指定两种可能的条件来支付的ScriptPubkey)。首先,如果爱丽丝和鲍勃相互同意,他们可以兑换它。事实上,只有在确保获得Bob签署的退款交易之后,Alice才会出具这笔存款————这允许她赎回她的存款,如果2个单位时间过后尚未被要求。
在任何时候要求爱丽丝存款的另一种方法是提供Bob的签名以及打开哈希承诺h的价值x。请注意,我们在存款A中写入以指示Alice将值h写入ScriptPubkey。 由于x只有爱丽丝才知道,所以在第一阶段结束时,双方都不能以这种方式要求存款。这个想法是,鲍勃会学习值x,使他能够声称自己的代币,当且仅当爱丽丝声称他的比特币,正如我们将看到的。
步骤2大致与步骤1相反:鲍勃存放值b的比特币,以便可以以两种方式之一兑换。主要区别在于他不选新秘密;相反,他使用相同的哈希值h(他只是将存款A交易中的值复制到存款B交易)。这是将两个区块链上的交易结合在一起的关键。
在这一点上,球在爱丽丝的法庭上。她可以改变交换的主意——如果在时间T1,爱丽丝还没有做任何事情来向Bob透露x,他只会要求他的存款并退出协议。爱丽丝的另一个选择是在时间T1之前要求鲍勃的比特币。但她只能通过创建和广播包含值x的ScriptSig来做到这一点;
Bob可以听到这个广播,并使用相同的值x来声明爱丽丝的代币,完成交换。
请注意,如果爱丽丝试图声称鲍勃的比特币太迟(在时间T1之后,但在时间T2之前),鲍勃可能会声称两个存款。同样,如果爱丽丝及时声称鲍勃的比特币,但鲍勃等待的时间太长,爱丽丝也许可以回到这两个存款。但这不是一个问题:只要没有玩家偏离协议来欺骗另一个玩家,我们就很高兴。
最后,Bitcoin或任何代币中的区块不以固定的时间脚步到达,这会引起一些混乱,特别是因为两条链可能不同步。假设两个区块链的区块之间的平均时间为10分钟。那么我们想选一个说1小时的“时间单位”。换句话说,我们希望T1至少为current_altcoin_block + 12,而T2至少为current_bitcoin_block + 6,可能有更大的安全余量。
不幸的是,有一个小但非零的机会,接下来的12个代币区块将在接下来的6个比特币区块的前面被发现。在这种情况下,爱丽丝可能会声称两个存款。这个概率可以通过增加时间单位而任意小,但是以牺牲速度为代价。
这是一个整齐的协议,但从2015年开始,没有人会使用它。相反,加密货币在传统的集中式交易所上交易。这件事情是由很多原因导致的。第一个是协议的复杂性、不便和缓慢。第二,虽然该协议防止盗用,但它不能防止拒绝服务。有人可能以惊人的汇率广告议案,只有在第1步或第2步之后退出,浪费其他人的时间。为了减轻这种情况,并且合计和匹配人们的报价,无论如何,你可能需要集中交换——虽然你不需要相信不窃取你的硬币——进一步降低了协议的有用性。
10.6比特币背景的代币,“侧链”
在本章的前面,我们谈到了两种方式,我们可以为现有的比特币所有者分配新的代币单元:要么可靠地燃烧比特币来获得代币,要么简单地将代币分配给基于未使用交易输出的比特币地址的比特币拥有者。正如我们所看到的,这两个都不允许将比特币的价格与代币的价格双边挂钩。没有这样的挂钩,在自举阶段期间,代币的价格可能会波动。侧链的动机是认为这种价格波动是有问题的:这是一种分心,使得代币难以在技术优势上进行竞争。
这就是我们所需要的技术特性,以便能够实际上将代币的价格以固定汇率真正钉在比特币上。首先,你应该可以把你所拥有的比特币放在某种托管和挖掘一个代币(或一个固定数量的代币)。你应该能够把这个代币合规地在代币区块链上使用。最后,你应该可以烧一个你拥有的代币并兑换以前被托管的比特币。这与Zerocoin类似,在那里我们代管basecoins来创建zerocoins,但不同之处在于,我们需要在两个不同的区块链中进行。
坏消息是,据我们所知,不修改比特币是没有办法实现这些的,因为比特币交易不能依赖于另一个区块链中发生的事件。比特币脚本根本不够强大,无法验证整个单独的区块链。好消息是,它可以通过比特币进行相对实用的软叉修改来实现,这就是侧链背后的想法。侧链的愿景是许多蓬勃发展的代币,快速创新和实验,使用比特币作为一种储备货币。到2015年,这只是一个提案,但正在积极努力种,并在比特币社区有严重的牵引力。该提案仍然存在,我们将自由地为教学目的简化一些细节。
扩展比特币允许将硬币从侧链转换为比特币的明显但不切实际的方法是:将所有侧链的规则编码为比特币,包括验证所有的侧链交易和检查侧链的工作证明。这个原因是不切实际的,因为比特币的脚本扩展将变得太复杂,而Bitcoin节点所需的验证工作将会令人望而却步。此外,复杂性和努力将随着固定边缘的数量而增加。
SPV技巧。避免这种复杂性的诀窍是使用“SPV证明”。回顾第3章,简化付款验证由轻量级客户端使用,如比特币的移动应用程序。SPV节点不验证他们不感兴趣的交易;他们只是验证区块头。SPV客户不担心最长的有效分支机构,而只是寻找证据证明他们关心的交易在最长的分支中是否有效,并且已经收到了一些确认。他们认为,创建这些区块的矿工不会在没有验证这些区块内的交易的情况下投入挖掘。
也许,我们可以通过一个指令来扩展比特币的脚本,以验证一个特定的交易(比如一个销毁硬币的事情)发生在侧链上的证据。在比特币的区块链方面,执行此验证的比特币节点仍将完全验证,但是它们将对侧链中的事件进行相对轻量级的SPV验证。
竞赛转会。这是更好的,但仍然不理想。为了进行简化验证,比特币节点仍然必须连接到侧链的对等网络(对于每个固定的侧链!),并跟踪所有的侧链区块头,以便它们可以确定最长的侧链分支。我们想要的是这样的:当交易尝试将侧链中的硬币转换为比特币时,它包含Bitcoin节点为验证其合法性所需的所有信息,即验证特定的侧链交易是否发生。 这是“SPV证明”的概念。
在这里,我们提出了一种可以工作的方法,同时请注意,Sidechains的这一组成部分仍然是一个研究领域。为了参考比特币的侧链交易,用户必须提供证明(1)将侧链交易包含在侧链区块中,以及(2)侧链区块头,表示该块已经接收到一定数量的确认,累计代表一定数量的工作证明。比特币节点将验证这些声明,但不会尝试验证所呈现的区块标题链是最长的。相反,他们会等待一段确定的时间,例如一两天,以允许其他用户提供证据表明上面步骤2中显示的区块头不在最长的分支上。如果在规定期限内提供此类证据,则比特币的侧链交易的接受将被无效。
理由是,如果呈现的SPV证明不被接受,因为交易不在最长的分支上,必须有一些侧链用户被接受这个证明伤害。该用户将有动机提供证据使证明无效。如果没有用户会受到伤害(可能是叉子或侧链的重组,但有问题的交易也存在于另一分支),那么接受证据就没有任何损害。
更一般来说,系统不会试图防止侧链中的问题,并且不会阻止你搬起石头砸自己的脚。如果你将比特币转移到已经加密破解的侧链,例如,其他人可能可以在侧链上窃取你的硬币并将其转换为比特币。或者侧链上的所有采矿都可能由于错误而崩溃,锁定的比特币永远丢失。但是提议需要确保侧链上的问题不能破坏比特币。特别是没有办法从侧链赎回相同的硬币两次,无论它可能是多么麻烦——也就是说,侧链不会让你打铸造比特币。
通过工作证明样本的紧凑SPV证明。最后还有一个困难。一些侧链可能具有较高的阻塞率,也许每隔几秒就有一个区块。在这种情况下,甚至验证SPV证明对于比特币节点来说可能都太繁重了。事实证明,我们可以使用一个聪明的统计技术来减少验证N区块确认从O(N)到一个比线性增长慢得多的数字所需的计算量。
直觉是这样的:当我们验证一块深埋在区块链的区块,我们正在验证其上构建的每个区块是否满足目标难度,即满足哈希<目标。现在,这些区块的哈希值将均匀分布在间隔(0,target)中,这意味着统计学上约25%的区块实际上将满足哈希
图10.7:工作证明跳过列表。区块包含指向前一个区块的指针和满足哈希
我们可以推多远?我们可以选择任意大的倍数吗?不是真的。这里的逻辑类似于集合挖矿,但相反。在集体采矿中,池运营商对股票进行验证,这是一个难度降低(即目标值较高)的区块。矿工找到比区块更多的份额,所以操作人员必须做额外的工作来验证它们。这样做的好处是能够更精确地估计矿工的哈希能力——估计的方差较低。
在这里我们看到相反的权衡。随着我们越来越少的工作来估计已经建立链条的总体工作量,我们的估计将会有更大更大的差异。这有一个例子。假设N = 4,所以没有skiplist解决方案,我们会检查是否有4个区块满足哈希
假设对手只做了一半的工作量。如果我们做数学,结果是这个对手有14%的几率找到满足哈希
10.7以太坊和智能合约
我们已经看到几种方法来使用比特币的脚本语言来支持有趣的应用程序,例如托管支付交易。我们还看到了比特币脚本有限,使用了一个不是图灵完备的小指令集。因此,一些新的代币建议添加应用程序的特定功能。Namecoin是第一个例子,但许多其他人提出了非常像比特币的加密货币,但支持赌博,股票发行,预测市场等。
要是不需要启动一个新系统来支持每个应用程序,我们是否可构建了一个支持我们未来可能梦想的任何应用程序的加密机制?这就是图灵完备性的全部内容:据我们所知,图灵完备编程语言允许你指定任何其他计算机可能指定的任何功能。在某种程度上,今天的情况回到了二十世纪四十年代电脑本身的早期阶段:第二次世界大战期间为各种具体应用而建造越来越复杂的机器(例如机械密码机使用的强制键或确定海军炮兵的射击轨迹),激励研究人员构建可以用于任何可想到的应用的第一个可重新编程的通用计算机。
图10.8:重建的Bombe机器位于Bletchley
Park博物馆。Bombe是由Alan Turing设计的专门用于打破德国谜密码的计算机。Ethereum对于特定应用程序的代币,会做通用计算机对于类似Bombe做的什么事?
Ethereum是一个雄心勃勃的代币,旨在提供一个图灵完备的编程语言来编写脚本或“合同”。虽然还有其他建议要做,但是最有意思的是:它引入了几个新颖的技术思想,举办了成功的群众筹资活动,几个月来筹集了2000万美元,并对阻止时间等参数采取积极的选择。在本节中,我们将简要介绍一下Ethereum——尽管系统非常复杂,我们可以轻松地用第二本教科书来描述全部的它!
智能合约编程模型。智能合约一词首先用于描述使用计算机系统(或其他自动化手段)来执行合同。例如,你可以将自动售货机视为机械智能合同,强制你和机器所有者之间达成协议,涉及购买糖果棒等。
在Ethereum,一个合同是一个生活在区块链上的程序。任何人都可以通过在特殊交易中上传其程序代码来创建一个费用低的Ethereum合同。该合同是用字节码编写的,并由一个专门的特殊虚拟机(通常称为EVM)执行。一旦上传,合同将生活在区块链上。它有自己的资金余额,其他用户可以通过程序公开的任何API进行程序调用,合同可以发送和接收资金。
一个简单的例子:在Ethereum中的Namecoin。我们声称可以使用Ethereum来实现特定应用的代币功能。作为一个简单的例子,我们可以在非常简单的Ethereum合同中展示如何实现Namecoin风格的功能。
一个实现示例如图10.8所示。它以Solidity,Ethereum的高级编程语言编码,用于定义合同。此合同实施了一个粗略的名称/存储值或注册表名称,其中名称一次和全部分配给值。合同定义了一个数据变量registryTable,它是从32字节字符串到公钥的映射。 最初,它将每个字符串映射到空地址0x0000000000
... 000。该合同还定义了一个名为“claimName”的单个入口点。 此入口点接受单个参数,名称。首先,合同确保来电者发送的值至少为10 wei,wei是Ethereum中最小的货币单位。如果资金不足,合同终止并出现错误(“抛出”声明),不采取任何行动。如果发送了足够的资金,并且该名称尚未被采用,则它永久分配调用此函数的任何地址的值。
图10.8:实现注册表名称的简单的Ethereum智能合同。
这就是这个合同可以在8行代码中做的。但是我们可以添加一些Namecoin的所有其他功能,和再多一点工作。例如,我们可以存储每个映射的更多数据,而不仅仅是声明它的实体的地址。我们可以要求姓名所有者通过存储“最后更新”时间来定期重新注册,并允许其他用户声明长时间未更新的名称。
我们可能还需要添加第二个功能来允许这些钱被撤销。按照目前的方案,这笔钱将永远在合同中累积,基本上远离流通。当然,在允许金钱撤回的功能中,我们最好确保检查主叫方是合约的所有者。任何人都可以通过Ethereum合约来调用任何功能,但是这些电话是签名的,所以我们可以安全地识别呼叫者是谁。
天然气(Gas),激励和安全。与比特币不同,Ethereum支持循环,尽管我们在第一个例子中不需要它们。这应该立即引起警钟。如果有循环,可以有无限循环。 总的来说,由于各种原因,Ethereum合约可能永远运行。计算机科学的著名成果(Halting Problem的不可判定性)指出,没有一种算法可以查看程序的源代码,并且始终正确地确定它是否会永久运行。 那么我们该如何才能防止合同永远运行?
更一般来说,我们需要一些方法来限制需要很长时间才能运行的合同,即使它是有限的。Ethereum采用一种称为气体的机制来实现。实质上,执行每个虚拟机指令需要的少量的钱,称为天然气(gas)。不同的操作,费用不同。基本操作如加法或比较费用1瓦斯,而计算SHA-3哈希(可作为内置指令)费用为20瓦斯,写入256位字且持续存储成本为100瓦斯。每一笔交易的费用也21000气吧。你可以想像Ethereum喜欢在超级优惠的航空公司上飞行:你付钱去上班,你从那里支付的一切都是额外的。以太网中可用的完整指令列表及其各自的天然气(gas)成本是固定的;改变这些将需要一个硬叉,就像改变比特币脚本语言的语义一样。
天然气是使用Ethereum的内置货币支付的,称为乙醚。 当用于支付合同执行时,这称为gas。每笔交易都可以指定“天然气价格”,即每单位消耗的天然气将支付多少乙醚。提供的天然气价格就像比特币的交易费用:矿工可以随意发布任何天然气价格的交易,每个矿工都可以独立决定其费用结构。这将导致反映供需气体的市场价格。 然而,截至2016年初,该网络仍然是实验性的,并且已经合并了每-8 -10单位气体的默认50吉加瓦。其中50吉加瓦是5⨉10以太网,或者约为3⨉10BTC,给予2016年1月的以太BTC汇率。
每次通话都必须说明自己愿意花多少天然气(“天然气限值”)。如果这个值被击中(耗尽气体),执行停止,对程序状态的所有更改都将被撤销,而矿工也会打包气体。所以非常重要的是不要用尽天然气。
天然气需求意味着非常昂贵的计算不适用于Ethereum。这个系统并不是设计成一个云计算服务,你可以付钱给其他人去做一个你无法自己做的困难的计算。像亚马逊的弹性计算云或微软的Azure这样的服务为你提供了数百万倍的回报。另一方面,Ethereum适用于实现安全协议逻辑。本质上,它提供了两个(或多个)匿名方可以依照指定行为行事的服务。
Ethereum的区块链的安全性并不像比特币那样完善。理论上讲,这个系统要复杂得多,因此在数学上更难理解。实际上,Ethereum并没有持续很长时间,并没有像比特币那样受到同样的审查。特别是,有人担心交易处理的成本会引起比特币风格的激励论点,与我们关于合并开采的讨论类似。当交易处理是矿工总成本的重要部分时,系统有利于较大的矿工,因为该成本与哈希功率无关。更重要的是,天然气支付仅限于区块中最初包含交易的矿工。但是,所有建在该区块上的矿工也必须验证交易,并且没有得到报酬。这意味着他们有动机去跳过验证。如前所述,这对于区块链的健康来说可能是危险的。
第二个例子:象棋在Ethereum。我仍然没有说太多关于什么你可以做的事情,这是新的,所以让我们看看第二个例子。假设爱丽丝想挑战鲍勃,一场线上的钱的棋局对抗。唯一的问题是,爱丽丝和鲍勃生活在不同的国家,如果他们输了,他们也不会互相信任。这是一个问题,Ethereum可以解决!
爱丽丝将写一个实施国际象棋规则的Ethereum程序,并将其上传到Ethereum。她将向合同发送一定数量的乙醚等于其要赌注金额的以太网。鲍勃可以看到这个合同,如果他决定接受这个挑战,他可以通过向合同发送自己的博彩权益来开始比赛。在这样做之前,鲍勃应该确保合同是正确的,它实现了象棋,并最终将所有的价值发送给获胜者。
一旦两名玩家都派出了他们的股份,合同应该检查股权是否相等,假设他们是平均下注。在这一点上,游戏正在进行,没有实际赢得比赛任何一个玩家都无法从合同中提取资金,或者任何人在任何情况下都可以提取资金。
爱丽丝和鲍勃将轮流发送交易到合同,表明他们愿意下一步行动。当然,合同必须确保每一举动都只能由转向玩家发送,而不是由其他玩家或完全由其他所有玩家发送。记住,每个交易(导致合同执行一个功能)都由调用者签名,所以合同可以确保这一点。合同还必须核对国际象棋的所有规则。如果玩家试图移动一个棋子三个空格,那就必须被拒绝。
最终,游戏将结束。每次移动后,合同必须检查双方是否配对,或者游戏是一场僵持的画面或国际象棋其他绘画条件之一。玩家也应该能够发出一个表示他们辞职的举动。当游戏结束时,合同可以自行终止,并将所有的钱发送给获胜玩家。或者在抽签的情况下分钱。
从概念上讲,这是一个简单的应用程序,但有一些微妙之处。如果失败的球员离开,怎么办? 如果玩家在指定的时间内没有提交有效的移动,那么合同将需要一种向对手奖励金钱的机制。
哪位玩家先移动?“白子”在国际象棋上有轻微的优势,所以两个球员都希望这个优势。这表明了许多Ethereum合同面临的困难:没有内在的随机来源。这是一个困难的问题,因为随机数发生器需要所有矿工验证(所以他们可以检查合同是否正确执行),但是不应该对任何一个玩家都是可以预测的(否则,如果他们知道他们将不得不进行第二次,他们可能会拒绝加入)。
这是随机信标的问题。 正如我们在第9.4节中讨论的那样,两个玩家加入之后,合约可能会在区块链中哈希下一个块的值。对于我们的具体应用,问题有点简单,因为只有爱丽丝和鲍勃才需要确信硬币翻转是随机的,而不是整个世界。所以他们可能会使用9.3节的方法:他们都提交一个随机值的哈希,然后都显示输入,并从输入中导出随机位。实践中已经看到了这两种方法。
其他应用。下棋可能很有趣,但是Ethereum的真正兴奋点是关于金融应用。迄今为止,我们在文中讨论的许多应用程序,包括预测市场,智能财产,托管支付,微支付渠道和混合服务,都可以在Ethereum实施。所有这些应用程序都有细微之处,但它们都是可能的,在大多数情况下,实现起来比使用Bitcoin看到的螺栓协议类型要简单得多。还有许多其他应用程序,如拍卖和订单,我们没有谈论过,但那些人热衷于使用Ethereum来实施它们。
状况和帐户余额在Ethereum。在第3章中,我们讨论了两种设计分类帐的方法:基于帐户和基于交易的分类帐。在像比特币这样的基于交易的分类帐中,区块链只存储交易(在区块头中加上少量的元数据)。为了更容易地验证交易,Bitcoin将硬币视为不可变的,并且交易输出必须全部使用,如果需要,要使用更改地址。实际上,交易是在一个UTXO列表的全球状态下进行的,但是Bitcoin协议中这个状态从来就不是明确的,只是矿工自己创造出来加快验证的。
另一方面,Ethereum采用基于帐户的模式。由于Ethereum已经存储了将合同地址映射到状态的数据结构,因此也可以在系统中存储每个常规地址(也称为拥有地址)的帐户余额。这意味着,除了使用非循环交易图表示付款,每个交易都花费一些投入并创建一些输出,Ethereum只是存储每个地址的余额,如传统银行可能存储每个帐号的余额一样。
数据结构在Ethereum。在第3章中,我们说基于帐户的分类帐需要花费数据结构进行记录保存。Ethereum只有这样的数据结构。具体来说,每个区块包含每个地址的当前状态(余额和交易次数)以及每个合同的状态(余额和存储)的摘要。每个合同的存储树将任意的256位地址映射到256位字,使高达字节的存储空间!当然,你永远不会填补所有这些存储空间,但这是理论空间。摘要可以很容易地证明给定的地址具有给定的平衡或存储状态。例如,爱丽丝可以向鲍伯证明她的平衡是没有的,鲍伯必须扫描整个区块链来验证证据。
Bitcoin中使用的简单二进制Merkle树将为此目的工作,因为它允许有效的包含证明(提供矿工确保没有树将包含相同地址的两个不同状态)。但是我们也希望快速查找和有效地更新地址值的能力。为了做到这一点,Ethereum使用一种稍微更复杂的树结构,称为Patricia树,也称为前缀树,特里或基数树。每个Ethereum块包括Merkle Patricia树的根,承诺到每个地址的状态,包括合同地址。反过来,每个合同的状态都包括一棵承诺整个储存状态的树。
基于帐户的分类帐的另一个棘手问题是防止重放攻击。在比特币中,由于每个交易都消耗其输入的UTXO,因此相同的签名交易永远不会有效两次。有了Ethereum的设计,我们需要确保,如果爱丽丝签署了一笔交易,称“向鲍勃付款1”,鲍勃不能一遍又一遍地广播该交易,直到爱丽丝的帐户枯竭。为了避免这种情况,Ethereum中的每个帐户都有一个交易计数器跟踪它发送了多少个交易。Alice真正签署的声明是“我授权我的第n个交易是向Bob付款1”。这个交易无法被重放,因为处理完成后,Alice的交易计数器将会增加并且是全局状态的一部分。
总而言之,Ethereum使用比Bitcoin更强大的数据结构作为其分类帐的一部分。虽然我们没有看到细节,但它可以有效地证明各种类型的关于账户,合同和交易的陈述。
Ethereme项目。Ethereum最初于2013年底被描述,并于2015年推出首个版本,被称为Frontier。Ethereum利用预售,在Bitcoin公司以固定价格公开了以太货币单位,其中所有收益都归于Ethereum基金会。
与许多altcoins相比,这是一个较慢的发展速度,但它反映出这样的事实,即Ethereum更加复杂。除了EVM、新的编程模型和新的数据结构之外,Ethereum还对Bitcoin的共识协议进行了重大改变。区块时间的目标是12秒而不是10分钟。为了减轻在Ethereum中比比特币更大部分区块的过时区块的影响,Ethereum使用称为GHOST的替代协议来计算共识分支。它还使用不同的工作证明。目前,它利用混合的哈希函数设计为内存难度,尽管未来,Ethereum计划将其转换为权益证明系统。
这是比特币在哲学上的另一个重大偏离。Ethereme项目由非营利性基金会管理,在规划和决策中相对集中。有一个宣布的协议的未来版本的日程安排,将根据早期的Ethereum经验介绍更改。这些将设计硬分叉,此外,每个Etherey合同将在两个版本之间销毁。所以,Ethereum依然是一个很大的实验系统,其中规划了重大的变化。 到2015年为止,投入太多以在Ethereum之上建立真正的应用程序为时尚早。但这是一个非常有前途的系统。 也许这本教科书的未来版本甚至可能被称为“Ethereum和Cryptocurrency技术”。
为了整理这一章,我们讨论了比特币是一个更大规模的加密货币和代币产品生态系统的重要组成部分。
他们以各种方式进行竞争,合作,相互影响,有一些合作的,有一些有害的。还有可能在将来会有一种技术方法来使一个区块链中的交易(事务)明确地引用另一个区块链中的交易(事务)。
还有几个公开的问题,代币生态系统是否会整合,使少数人占主导地位,还是保持多元化?特定应用程序的代币(altcoins)是否会增长,或者是通用平台的Etherey模型是否会主宰?比特币本身最终会被其他一些代币超越吗?鼓励比特币和代币相互作用是个好主意?还是应该将每个密码体制作为一个单独的系统,例如通过使用不兼容的采矿谜题而不是合并挖掘?我们现在无法回答这些问题,但是我们已经讨论了你需要了解并理解其重要性的所有概念。