作者:BlockPunk 社区:果壳宇宙(ID:DfinityFun) 前言 4000年前的东方大陆,萨满缓慢的从篝火的灰烬中扒出龟甲,龟甲上随机的裂纹会决定部落下一次狩猎的时机;3000年前的地中海,尊贵的雅典神官主持着抽签仪式,他们要随机选出五百位优秀公民,来参与城邦政务的讨论;2000年前的中东,行商围坐在一张赌桌旁,紧张的注视着桌面上转动的四面骰子,它的最终结果会决定一大笔财富的归属。 在上千年的人类历史里,我们一直不断地探寻着可靠的随机数,并将随机数用在生活的各个方面,民主与共和的抽签制度,战争时期的军情传递、生产上的模型计算,以及赌博娱乐时的可信参照。 对可靠随机数的追求,更是人类对公平的追求,对随机数的承认,可以说是人类最早的关于公正的共识。而在2000多年后的现代,人类发明了计算机,开始了崭新的数字纪元,随机数成为了整个虚拟世界的基础。 真随机数 我们祖先朴实的技术而言,人类创造了很多生成随机数的方法,但这些随机数的随机强度与不可预测程度,并不比烧龟甲来的更高。 这里就要讲到真随机数与伪随机数了。古代的人类观察物理世界时,会发现到处都存在着随机的波动,这种随机性在他们看来,是上天的旨意,你完全没法预测未来会怎么样。真正的随机性,只存在于物理世界,大气噪声、宇宙背景辐射、放射物的衰变期、量子塌缩现象,通过观测这些现象,得到的随机数是完全无规律可循的。 《百万乱数表》图片来自网络 上世纪40年代,兰德公司利用模拟电路制成的电脉冲发生器生成了100万个随机数,并将其出版为《百万乱数表》,一直销售到今天。现在看来这似乎是一个异想天开的行为艺术,但在当时却是非常重大的突破。 熔岩灯 有趣的是,在互联网时代的今天,仍有人在使用这种方法。一家名叫Cloudflare的云服务商,通过图像识别实时处理熔岩灯中蜡的形状,计算量化来获取真随机数,从而对数据进行高强度的加密。这听起来好像有些愚蠢,但其实它的随机强度,却远强于现在主流的随机数。 假随机数 我们可以从物理现象中得到神秘而无穷的随机性,但有些现象并不能精确量化。但同时我们需要巨量的随机数来加密数据、训练模型、公平仲裁,仅依靠自然界的随机数是远远不够的。 这也是计算机之父,冯诺依曼思考过的。在1946年, 冯诺依曼参与了美军氢弹的设计,他在一台名为ENIAC的计算机上,模拟计算核聚变的过程。而这个模型的训练,需要对随机数进行快速的存取,但ENIAC的内存不够大,无法保存长真随机数,因此冯诺依曼设计了一个算法,来模拟一个随机性的混乱状态。 ENIAC计算机 | 图片来自网络 这个算法是这样的:首先获得一个很短的随机值,比如操作时刻的毫秒数,作为这个算法的“种子”,然后将“种子”平方,输出平方结果的中间部分数字,再作为“种子”重复上述操作。重复足够的次数后,就获得了一个“随机数”。 这被称为平方取中法,这也只是无数假随机数算法中的一种,这个算法输出的序列,只取决于最初种子的随机性。由于机器的确定性,同样的种子,就可以计算出同样的随机数。 种子的位数决定了随机数的随机度,当你设定一个两位的种子生成一个10位随机数,在函数产生重复循环之前,最多只能得到100个可用的随机数;而在自然界中,10位随机数应该存在一百亿种可能。这两者之间巨大的数量级差别,就是随机数真与假的区别。 只要你使用基于“种子”的假随机数,必然会出现重复循环的过程,也就是说,只要知晓了你的随机数算法,另一台计算机迟早能暴力尝试出相同的随机数。这就是区块链钱包的密钥生成随机函数被攻破后,暴力盗取密钥的手段。 假随机数存在规律的周期,点集中表现为脉络 图片来自网络 当然这种随机数是足够使用的,我们必须引入计算机科学中非常重要的一个概念,时间边界,也就是在多长的时间里,这个随机数是安全不重复的。和我们使用密码车锁一样,我们知道正确的密码必在一万种的组合方式之中,但一个个尝试需要花费好几天时间,这个时间边界内都算是安全,假随机数也是如此。 我们闭眼敲键盘的随机字符串,其实也有规律可循,这就是QWER的键盘布局,通过分析后破解随机数的可能性就会很大 这依然无法满足区块链的使用要求,因为我们需要一个能在固定时间内,分布式的获取随机数的方法,而不能依赖于任何一个中心主体。 区块链为什么需要随机数 在传统互联网中,随机数是作为密码学与隐私安全的基础,通过共享随机的密钥,两个节点间就可以进行加密的私人通讯,而在区块链中,就是使用私钥密钥传输财产;同时随机数还广泛应用于有限带宽下的多节点通讯,可以利用随机数来决定数据发送的合理顺序,来协调多方节点,在区块链上,就是利用基于随机数的共识算法,协调交易确认者,保证一段时间内大家只对部分节点的消息进行反馈更新,从而在网络消息数有限的情况下获得一致。 而在区块链与加密的世界里,随机数上再次投射出了人类对公平的追求。我们的世界是随机的,过去无法更改,但未来不可预测,这是对生命最大的公平。区块链上一样,我们通过随机数的可信,脱离人性的干扰,获得链上的公正性,保证整个系统的去中心化程度与可信性。特别是权益证明PoS越来越火的现在,我们比以往任何时候都需要一个安全、稳定、可信的随机数,来保证密钥对的生成、链上数据的加密、出块权力的裁定、智能合约的运行。 总结 公平的决定出块权力,维持一致性共识。部分PoW与PoS机制下,依靠随机数选定出块者或者出块组的,包括DPoS机制下的循环出块的顺序,也是依靠随机数决定。 私钥的生成。目前私钥只要由各钱包自定随机数方法生成,存在较大安全隐患。 链上应用的随机数源。保证博彩、游戏、抽奖、分发、调查等应用的公平公正,此类容易被黑客攻击。 数据加密。链上数据因为是公开审查的,需要强度较高的加密,通过足够强的随机数确保链上数据的隐私与安全。 链上随机数的难点 虽然区块链还是基于过去的互联网技术,但是在随机数生成部分却有着非常大区别。 传统的随机数产生方式是中心化的,产出的随机数,与特定机器的状态值、物理状态相关,而同一个随机数算法,在不同的节点上得到的随机数是不同的,并且也没法针对每一个随机数进行验证,因此传统的方式无法产生一致性的随机性,这和区块链不兼容。 因此区块链上的随机数,需要重头开始设计机制,从而来获得满足分布式特点的结果。因此到目前为止,没有真正意义上完美的方案,区块链上的真随机数是缺失的,连假随机数都很难获得。 链上随机数的原则 1.不可预测 因为随机数决定着整个协议层包括所有以上层级的公正性,如果这个随机数是能提前预见的,那么就可以伺机发动攻击。当然这个不可预测性是存在时间边界的,一般以区块链时间为边界,通过控制计算难度,或设置等待,来增加预测的难度。简而言之,有两种方案: 保证随机数从区块时间上看是串行的(VRF/VDF) 保证随机数产生的难度,并按情况调节难度(哈希碰撞) 2.不可干扰 随机数决定着区块(非拜占庭容错系统中)的共识确认,因此如果能干扰到随机数的发生,无需掌握超越上限的节点/算力,就可以间接的控制区块链未来的走向,虽然干扰可能很微小,但多次干扰积累下来就会出现较严重的问题(“放大攻击”)。有两种解决方案: 保证随机数生成是非交互的(阀值签名方案),或完全根据节点本身状态计算(哈希碰撞) 设置随机数生成时延,需要等待长时间的复杂计算才能得出随机数,让干扰者无法预估自己施加的影响 3.可验证 应该详细表述为,可被简单验证,这表示随机数必须能够被任何节点快速进行验证其合法性,这样分布式的节点才能通过检验随机数,确认某一节点的出块资格,从而达成一致性。如果验证效率很低,需要很长时间,那么节点间共识的达成就会遥遥无期,区块链无法使用。 不符合上述原则的一些解决方案 为了解决区块链上的随机数难点,自发的产生了许多解决方案,以下简述以下不符合上述三个原则的方案,虽然他们各自都有自洽的逻辑与一定的安全性,但在现阶段还是存在问题的,在对安全需求不是那么高的地方仍可以使用。这不不针对某个项目,而是指出相似范式的问题 1.使用链下真随机数 不在链上计算随机数,而是使用从物理现象中获得的真随机数,比如大气噪声、电子脉冲,以及依赖包含热噪声电路的芯片组。但是对区块链来说,链下部分是不可见的,默认就是不可信的,链下获得随机数一定需要一个第三方上传至链上,这不仅违背了区块链的去中心化精神,完全无法验证,且存在篡改与提前预知的风险。就算使用预言机来去中心化的获取链下的真随机数,但仍存在物理上的人为干扰。因此这种方案非常不可取。 2.将当前块的数据作为随机源 很多的链上博彩类Dapp,都习惯直接引用最近区块的哈希根值等作为合约的随机种子,再来产生随机数。虽说简介的借助了链上算力的保证,如此产生的随机数看似足够有公信力,但需要考虑到多维度的安全性。首先,区块上的数据是透明的,所有节点都能获取,攻击者同样能用来攻击合约,唯一的障碍就是不开源的随机数算法。第二点,出块人获得出块资格后,可以尝试变更打包交易顺序、尝试打包不同交易,来产生最有利于他的哈希根值,从而扩大自己中奖的概率,这对其他参与者是不公平的。 3.借助分布式组织产生随机数 因为随机数的强度来源于种子的随机性,因此就有人提出由一个分布式组织来产生足够随机的种子,依赖与本地节点的特殊状态或控制者的“自由意志”,向链上上传秘密与验证,以特殊算法组合种子,再在链上产生随机数。先不论链下的合谋可能(有经济设计制约),这种方案还是存在“最后参与者攻击”的可能,也就是最后一个上传秘密的参与者,可以知道此前的全部秘密,他可以控制自己的秘密来干扰最终随机数的产生。且在掌握了函数算法后,可以预测影响的规律,如此可以多次施加干扰,进而不断扩大自己的影响,这就是“放大攻击”。 三类方案 虽然区块链上的随机数并不完美,但随这越来越多的项目认识到了随机数对效率和冗余度的巨大优化,随机数的可信与高效显得越来越重要。因此这里总结了三类相对成熟方案,并指出了相关项目与方案优缺点。 哈希碰撞 在PoW系统中,矿工的客户端有一个基于本节点状态的随机数发生器,可以输出随机数序列,然后再计算其哈希值,一但生成的哈希值在规定的大小范围内,就是为获得了出块资格,其他节点获取这个随机数值,计算一次哈希值即可进行验证,因此它的验证是十分简洁的。 因此这个随机数得经历数百兆亿次随机数发生后,才有机会获得一个符合要求的随机数,因此它的随机程度非常的高;同时由于得出随机数消耗的资源非常大,想要提前几个区块预测这个随机数几乎是不可能的;由于随机数完全根据节点本身状态输出随机数,因此这个随机数不会其他攻击者干扰;即时的难度调整(调整哈希值的大小范围),在安全时间边界内不会出现被攻破的情况。 PoW的共识特点,使得其天然具备随机性的(randomness for free)。 优点: 随机性最强,安全性号,非常适合驱动共识层; 产生随机数时不需要使用网络带宽。 缺点: 计算冗余度,计算消耗大,资源浪费; 难以在应用层使用; 不具备唯一性,可以同时存在多个满足要求的随机数,可能导致区块分叉; 无法抵抗并行加速破解,计算机持有多的人可以连续预测多个随机数。 可验证随机函数(VRF) VRF(Verifiable Random Function)算法于1999年由莫卡利教授提出,由于其较好的安全性与效率,被越来越多区块链项目拿来优化共识过程,让共识的随机数部分占用计算资源变少,让资源更多地被交易的确认与合约的运行所占用。 集合上图简述生成步骤: 0.生成随机数签名专用公私钥对; 1.获得一个足够随机的种子,可以直接使用上一轮结果,与区块高度、时间的变量等进行组合; 2.用随机数私钥对之进行签名(共同参与随机数生成),或是先签名再组合; 3.对签名后的值做哈希摘要,得出最新的随机数; 4.检查随机数是否在合法范围中,判断是否抽签成功进入出块组(部分项目不需要这个过程) 5.根据公钥与轮次等输入,计算证明,接受随机数后验证者使用函数进行验证。 因此这样产生的随机数,节点可以轻松验证其是否合乎算法,"Verifiable"就这样做到了;而经过足够复杂的算法,加上哈希摘要过程,获得足够随机分布的结果,“Random”得到了保证。 VRF主要结合PoS机制一起使用,来进行出块人(群)的随机选择,个别项目中直接决定区块的一致性选择。这个随机数的生成过程可以完全在一个节点的链下运行,同时也可以整个运行在链上。 需要注意的是签名随机的部分,VRF的这个签名随机算法应当具备唯一性,也就是说用同一把密钥,对同一个数据签名随机多次,只有唯一的一个随机数能被公钥验证,这就能防止产生随机数时,多次运行签名随机部分,来获得最有利于自己的随机数。 优点: 算力要求低,产出随机数效率高; 产生唯一性、确定性的随机数,不易出现分叉; 验证可滞后于随机数产生,适合进行秘密选举; 可设置为(输入为上轮结果)抗并行加速破解,矿机多者也无法连续预测随机数。 缺点: 验证步骤较多,秘密选举下需要多次验证; 随机数分布均匀性不好,因为是根据特点密钥计算的; 带宽占用高,延时长,是为让秘密选举的节点互相确认,BLS项目问题不大; Algorand 每一个节点都获取前一轮确认区块上的随机种子,集合轮次时间等,在链下单独运行VRF函数,然后对结果进行哈希摘要,节点将结果与网络中哈希值范围进行比较(比较类似于PoW哈希比对),范围内的成员便有资格参与验证与出块。…
0.区块链核心技术概览 运用之妙夺造化,存乎一心胜天工。 跨境商贸合作中签订的合同,怎么确保对方能严格遵守和及时执行? 酒店宣称刚打捞上来的三文鱼,怎么追踪捕捞和运输过程中的时间和卫生? 现代数字世界里,怎么证明你是谁?怎么证明某个资产属于你? 经典囚徒困境中的两个人,怎样才能达成利益的最大化? 宇宙不同文明之间的“黑暗森林”猜疑链,有没有可能被彻底打破? 这些看似很难解决的问题,在区块链的世界里已经有了初步的答案。 本文将带领大家探索区块链的核心技术,包括其定义与原理、关键的问题等,还将探讨区块链技术的演化,并对未来发展的趋势进行展望。最后,对一些常见的认识误区进行了澄清。 1.定义与原理 定义 区块链技术自身仍然在飞速发展中,目前相关规范和标准还在进一步成熟中。 公认的最早关于区块链的描述性文献是中本聪所撰写的 《比特币:一种点对点的电子现金系统》,但该文献重点在于讨论比特币系统,实际上并没有明确提出区块链的术语。在其中,区块和链被描述为用于记录比特币交易账目历史的数据结构。 另外,Wikipedia 上给出的定义中,将区块链类比为一种分布式数据库技术,通过维护数据块的链式结构,可以维持持续增长的、不可篡改的数据记录。 笔者认为,讨论区块链可以从狭义和广义两个层面来看待。 狭义上,区块链是一种以区块为基本单位的链式数据结构,区块中利用数字摘要对之前的交易历史进行校验,适合分布式记账场景下防篡改和可扩展性的需求。 广义上,区块链还指代基于区块链结构实现的分布式记账技术,还包括分布式共识、隐私与安全保护、点对点通信技术、网络协议、智能合约等。 区块链技术最早的应用出现在比特币项目中。作为比特币背后的分布式记账平台,在无集中式管理的情况下,比特币网络稳定运行了八年时间,支持了海量的交易记录,并且从未出现严重的漏洞,这些都与区块链结构的巧妙是分不开的。 基本原理 区块链的基本原理理解起来并不复杂。 首先包括三个基本概念: 交易(Transaction):一次对账本的操作,导致账本状态的一次改变,如添加一条转账记录; 区块(Block):记录一段时间内发生的所有交易和状态结果,是对当前账本状态的一次共识; 链(Chain):由区块按照发生顺序串联而成,是整个账本状态变化的日志记录。 如果把区块链作为一个状态机,则每次交易就是试图改变一次状态,而每次共识生成的区块,就是参与者对于区块中交易导致状态改变的结果进行确认。 在实现上,首先假设存在一个分布式的数据记录账本,这个账本只允许添加、不允许删除。账本底层的基本结构是一个线性的链表,这也是其名字“区块链”的来源。链表由一个个“区块”串联组成(如下图所示),后继区块记录前导区块的哈希(Hash)值。新的数据要加入,必须放到一个新的区块中。而这个块(以及块里的交易)是否合法,可以通过计算哈希值的方式快速检验出来。任意维护节点都可以提议一个新的合法区块,然而必须经过一定的共识机制来对最终选择的区块达成一致。 图 1.5.1.1 – 区块链结构示例 以比特币为例理解区块链工作过程 具体以比特币网络为例,来看其中如何使用了区块链技术。 首先,比特币客户端发起一项交易,广播到比特币网络中并等待确认。网络中的节点会将一些收到的等待确认的交易记录打包在一起(此外还要包括前一个区块头部的哈希值等信息),组成一个候选区块。然后,试图找到一个 nonce 串(随机串)放到区块里,使得候选区块的哈希结果满足一定条件(比如小于某个值)。这个nonce 串的查找需要一定的时间进行计算尝试。 一旦节点算出来满足条件的 nonce 串,这个区块在格式上就被认为是“合法”了,就可以尝试在网络中将它广播出去。其它节点收到候选区块,进行验证,发现确实符合约定条件了,就承认这个区块是一个合法的新区块,并添加到自己维护的区块链上。当大部分节点都将区块添加到自己维护的区块链结构上时,该区块被网络接受,区块中所包括的交易也就得到确认。 当然,在实现上还会有很多额外的细节。这里面比较关键的步骤有两个,一个是完成对一批交易的共识(创建区块结构);一个是新的区块添加到区块链结构上,被大家认可,确保未来无法被篡改。 比特币的这种基于算力寻找 nonce 串的共识机制被称为工作量证明(Proof of Work,PoW)。目前,要让哈希结果满足一定条件,并无已知的快速启发式算法,只能进行逐个尝试的暴力计算。尝试的次数越多(工作量越大),算出来的概率越大。 通过调节对哈希结果的限制,比特币网络控制平均约 10 分钟产生一个合法区块。算出区块的节点将得到区块中所有交易的管理费和协议固定发放的奖励费(目前是 12.5 比特币,每四年减半)。这个计算新区块的过程,即俗称的“挖矿”。 读者可能会关心,比特币网络是任何人都可以加入的,如果网络中存在恶意节点,能否进行恶意操作来对区块链中记录进行篡改,从而破坏整个比特币网络系统。比如最简单的,故意不承认收到的别人产生的合法候选区块,或者干脆拒绝来自其它节点的交易等。 实际上,因为比特币网络中存在大量(据估计数千个)的维护节点,而且大部分节点都是正常工作的,默认都只承认所看到的最长的链结构。只要网络中不存在超过一半的节点提前勾结一起采取恶意行动,则最长的链将很大概率上成为最终合法的链。而且随着时间增加,这个概率会越来越大。例如,经过 6 个区块生成后,即便有一半的节点联合起来想颠覆被确认的结果,其概率也仅为 (1/2)^6 ≈ 1.6%,即低于 1/60 的可能性。 当然,如果整个网络中大多数的节点都联合起来作恶,可以导致整个系统无法正常工作。要做到这一点,往往意味着付出很大的代价,跟通过作恶得到的收益相比,得不偿失。 注:区块链结构,与 Git 版本管理的有向无环图数据结构,在设计上有异曲同工之妙。 2.技术的演化与分类 区块链技术自比特币网络设计中被大家发掘关注,从最初服务数字货币系统,到今天在分布式账本场景下发挥着越来越大的技术潜力。 区块链的演化 比特币区块链已经支持了简单的脚本计算,但仅限于数字货币相关的处理。除了支持数字货币外,还可以将区块链上执行的处理过程进一步泛化,即提供智能合约(Smart Contract)。智能合约可以提供除了货币交易功能外更灵活的合约功能,执行更为复杂的操作。 这样扩展之后的区块链,已经超越了单纯数据记录的功能了,实际上带有点“智能计算”的意味了;更进一步地,还可以为区块链加入权限管理,高级编程语言支持等,实现更强大的、支持更多商用场景的分布式账本。 从计算特点上,可以看到现有区块链技术的三种典型演化场景: 场景 功能 智能合约 一致性 权限 类型 性能 编程语言 代表 公信的数字货币 记账功能 不带有或较弱 PoW 无 公有链 较低 简单脚本 比特币网络 公信的交易处理 智能合约 图灵完备 PoW、PoS 无 公有链 受限 特定语言 以太坊网络 带权限的分布式账本处理…
分布式系统 万法皆空,因果不空。 随着摩尔定律碰到瓶颈,越来越多的系统要依靠分布式集群架构来实现海量数据处理和可扩展计算能力。 区块链首先是一个分布式系统。 中央式结构改成分布式系统,碰到的第一个问题就是一致性的保障。 很显然,如果一个分布式集群无法保证处理结果一致的话,那任何建立于其上的业务系统都无法正常工作。 本文将介绍分布式系统中一些核心问题的来源以及相关的工作。 一致性问题 在分布式系统中,一致性(Consistency,早期也叫 Agreement)是指对于系统中的多个服务节点,给定一系列操作,在协议(往往通过某种共识算法)保障下,试图使得它们对处理结果达成某种程度的一致。 如果分布式系统能实现“一致”,对外就可以呈现为一个功能正常的,且性能和稳定性都要好很多的“虚处理节点”。 举个例子,某影视公司旗下有西单和中关村的两个电影院,都出售某电影票,票一共就一万张。那么,顾客到达某个电影院买票的时候,售票员该怎么决策是否该卖这张票,才能避免超售呢?当电影院个数更多的时候呢? 这个问题在人类世界中,看起来似乎没那么难,你看,英国人不是刚靠 投票 达成了“某种一致”吗? 注意:一致性并不代表结果正确与否,而是系统对外呈现的状态一致与否,例如,所有节点都达成失败状态也是一种一致。 挑战 在实际的计算机集群系统(看似强大的计算机系统,很多地方都比人类世界要脆弱的多)中,存在如下的问题: 节点之间的网络通讯是不可靠的,包括任意延迟和内容故障; 节点的处理可能是错误的,甚至节点自身随时可能宕机; 同步调用会让系统变得不具备可扩展性。 要解决这些挑战,愿意动脑筋的读者可能会很快想出一些不错的思路。 为了简化理解,仍然以两个电影院一起卖票的例子。可能有如下的解决思路: 每次要卖一张票前打电话给另外一家电影院,确认下当前票数并没超售; 两家电影院提前约好,奇数小时内一家可以卖票,偶数小时内另外一家可以卖; 成立一个第三方的存票机构,票都放到他那里,每次卖票找他询问; 更多…… 这些思路大致都是可行的。实际上,这些方法背后的思想,将可能引发不一致的并行操作进行串行化,就是现在计算机系统里处理分布式一致性问题的基础思路和唯一秘诀。只是因为计算机系统比较傻,需要考虑得更全面一些;而人们又希望计算机系统能工作的更快更稳定,所以算法需要设计得再精巧一些。 要求 规范的说,理想的分布式系统一致性应该满足: 可终止性(Termination):一致的结果在有限时间内能完成; 共识性(Consensus):不同节点最终完成决策的结果应该相同; 合法性(Validity):决策的结果必须是其它进程提出的提案。 第一点很容易理解,这是计算机系统可以被使用的前提。需要注意,在现实生活中这点并不是总能得到保障的,例如取款机有时候会是“服务中断”状态,电话有时候是“无法连通”的。 第二点看似容易,但是隐藏了一些潜在信息。算法考虑的是任意的情形,凡事一旦推广到任意情形,就往往有一些惊人的结果。例如现在就剩一张票了,中关村和西单的电影院也分别刚确认过这张票的存在,然后两个电影院同时来了一个顾客要买票,从各自“观察”看来,自己的顾客都是第一个到的……怎么能达成结果的共识呢?记住我们的唯一秘诀:核心在于需要把两件事情进行排序,而且这个顺序还得是大家都认可的。 第三点看似绕口,但是其实比较容易理解,即达成的结果必须是节点执行操作的结果。仍以卖票为例,如果两个影院各自卖出去一千张,那么达成的结果就是还剩八千张,决不能认为票售光了。 带约束的一致性 做过分布式系统的读者应该能意识到,绝对理想的强一致性(Strong Consistency)代价很大。除非不发生任何故障,所有节点之间的通信无需任何时间,这个时候其实就等价于一台机器了。实际上,越强的一致性要求往往意味着越弱的性能。 一般的,强一致性(Strong Consistency)主要包括下面两类: 顺序一致性(Sequential Consistency):Leslie Lamport 1979 年经典论文《How to Make a Multiprocessor Computer That Correctly Executes Multiprocess Programs》中提出,是一种比较强的约束,保证所有进程看到的 全局执行顺序(total order)一致,并且每个进程看自身的执行(local order)跟实际发生顺序一致。例如,某进程先执行 A,后执行 B,则实际得到的全局结果中就应该为 A 在 B 前面,而不能反过来。同时所有其它进程在全局上也应该看到这个顺序。顺序一致性实际上限制了各进程内指令的偏序关系,但不在进程间按照物理时间进行全局排序。 线性一致性(Linearizability Consistency):Maurice P. Herlihy 与 Jeannette M. Wing 在 1990 年经典论文《Linearizability: A Correctness Condition for Concurrent Objects》中共同提出,在顺序一致性前提下加强了进程间的操作排序,形成唯一的全局顺序(系统等价于是顺序执行,所有进程看到的所有操作的序列顺序都一致,并且跟实际发生顺序一致),是很强的原子性保证。但是比较难实现,目前基本上要么依赖于全局的时钟或锁,要么通过一些复杂算法实现,性能往往不高。 目前,高精度的石英钟的漂移率为,人类目前最准确的原子震荡时钟的漂移率为。Google 曾在其分布式数据库 Spanner 中采用基于原子时钟和 GPS 的“TrueTime”方案,能够将不同数据中心的时间偏差控制在 10ms 以内。方案简单粗暴而有效,但存在成本较高的问题。 强一致的系统往往比较难实现。很多时候,人们发现实际需求并没有那么强,可以适当放宽一致性要求,降低系统实现的难度。例如在一定约束下实现所谓最终一致性(Eventual Consistency),即总会存在一个时刻(而不是立刻),系统达到一致的状态,这对于大部分的 Web 系统来说已经足够了。这一类弱化的一致性,被笼统称为弱一致性(Weak Consistency)。 莫非分布式领域也有一个测不准原理?这个世界为何会有这么多的约束呢? 共识算法 实际上,要保障系统满足不同程度的一致性,往往需要通过共识算法来达成。 共识算法解决的是对某个提案(Proposal),大家达成一致意见的过程。提案的含义在分布式系统中十分宽泛,如多个事件发生的顺序、某个键对应的值、谁是领导……等等,可以认为任何需要达成一致的信息都是一个提案。 注:实践中,一致性的结果往往还需要客户端的特殊支持,典型地通过访问足够多个服务节点来验证确保获取共识后结果。…
0.比特币 —— 区块链思想诞生的摇篮 之所以看得更远,是因为站在了巨人的肩膀上。 作为区块链思想诞生的源头,比特币项目值得区块链技术爱好者们仔细研究。 比特币网络是首个得到大规模部署的区块链技术应用,并且是首个得到实践检验的数字货币实现,无论在信息技术历史还是在金融学历史上都具有十分重要的意义。比特币项目在诞生和发展过程中,借鉴了来自数字货币、密码学、博弈论、分布式系统、控制论等多个领域的技术成果,可谓博采众家之长于一身。 虽然后来的区块链技术应用已经远超越了数字货币的范畴,但探索比特币项目的发展历程和设计思路,对于深刻理解区块链技术的来龙去脉有着重要的价值。 本文将介绍比特币项目的来源、核心原理设计、相关的工具,以及关键的技术话题。 1.比特币项目简介 图 比特币项目 比特币(BitCoin,BTC)是基于区块链技术的一种数字货币实现;比特币网络是历史上首个经过大规模长时间检验的数字货币系统。 自 2009 年正式上线以来,比特币价格经历了数次的震荡,目前每枚比特币市场价格超过 2500 美金。比特币网络中总区块数接近 48 万个。 比特币网络在功能上具有如下特点: 去中心化:意味着没有任何独立个体可以对网络中交易进行破坏,任何交易请求都需要大多数参与者的共识; 匿名性:比特币网络中账户地址是匿名的,无法从交易信息关联到具体的个体,但这也意味着很难进行审计; 通胀预防:比特币的发行需要通过挖矿计算来进行,发行量每四年减半,总量上限为 2100 万枚,无法被超发。 下图来自 blockchain.info 网站,可以看到比特币字诞生以来的汇率(以美元为单位)变化历史。 图 1.9.1.2 – 比特币汇率历史 比特币大事记 2008 年 11 月 1 日 19:16:33,中本聪在 metzdowd 的加密技术邮件列表发布比特币白皮书:《Bitcoin: A Peer-to-Peer Electronic Cash System》(《比特币:一种点对点的电子现金系统》)。 2009 年 1 月 3 日 18:15:05,中本聪在位于芬兰赫尔辛基(Helsinki)的一个小型服务器上挖出了第一批 50 个比特币,并记录下当天泰晤士报的头版标题:“The Times 03/Jan/2009 Chancellor on brink of second bailout for banks(财政大臣考虑再次紧急援助银行危机)”。第一个区块被称为创世区块或初始区块(Genesis Block),可以通过 https://blockchain.info/block-index/14849 查看其详细内容。 2010 年 5 月 21 日,第一次比特币交易:佛罗里达程序员 Laszlo Hanyecz 用 1 万 BTC 购买了价值 25 美元的披萨优惠券。这是比特币的首个兑换汇率:1: 0.0025 美金。这些比特币在今日价值超过 8000 万美金。 2010 年 7 月 17 日,第一个比特币交易平台成立。 2011 年 4 月,首个有官方正式记载的版本 0.3.21 发布,支持普通用户参与到…
0.以太坊 —— 挣脱数字货币的枷锁 君子和而不同。 在区块链领域,以太坊项目同样是十分出名的开源项目。作为公有区块链平台,以太坊将比特币针对数字货币交易的功能进一步进行拓展,面向更为复杂和灵活的应用场景,支持了智能合约(Smart Contract)这一重要特性。 从此,区块链技术的应用场景,从单一基于 UTXO 的数字货币交易,延伸到图灵完备的通用计算领域。用户不再受限于仅能使用比特币脚本所支持的简单逻辑,而是可以自行设计任意复杂的合约逻辑。这就为构建各种多样化的上层应用开启了大门,可谓意义重大。 本文将参照比特币项目来介绍以太坊项目的核心概念和改进设计,以及如何安装客户端和使用智能合约等内容。 1.以太坊项目简介 图 以太坊项目 以太坊(Ethereum)项目的最初目标,是打造一个运行智能合约的平台(Platform for Smart Contract)。该平台支持图灵完备的应用,按照智能合约的约定逻辑自动执行,理想情况下将不存在故障停机、审查、欺诈,以及第三方干预等问题。 以太坊平台目前支持 Golang、C++、Python 等多种语言实现的客户端。由于核心实现上基于比特币网络的核心思想进行了拓展,因此在很多设计特性上都与比特币网络十分类似。 基于以太坊项目,以太坊团队目前运营了一条公开的区块链平台——以太坊网络。智能合约开发者使用官方提供的工具和以太坊专用应用开发语言 Solidity,可以很容易开发出运行在以太坊网络上的“去中心化”应用(Decentralized Application,DApp)。这些应用将运行在以太坊的虚拟机(Ethereum Virtual Machine,EVM)里。用户通过以太币(Ether)来购买燃料(Gas),维持所部署应用的运行。 以太坊项目的官网网站为 ethereum.org,代码托管在 github.com/ethereum。 以太坊项目简史 相对比特币网络自 2009 年上线的历史,以太坊项目要年轻的多。 2013 年底,比特币开发团队中有一些开发者开始探讨将比特币网络中的核心技术,主要是区块链技术,拓展到更多应用场景的可能性。以太坊的早期发明者 Vitalik Buterin 提出应该能运行任意形式(图灵完备)的应用程序,而不仅仅是比特币中受限制的简单脚本。该设计思想并未得到比特币社区的支持,后来作为以太坊白皮书发布。 2014 年 2 月,更多开发者(包括 Gavin Wood、Jeffrey Wilcke 等)加入以太坊项目,并计划在社区开始以众筹形式募集资金,以开发一个运行智能合约的信任平台。 2014 年 7 月,以太币预售,经过 42 天,总共筹集到价值超过 1800 万美金的比特币。随后在瑞士成立以太坊基金会,负责对募集到的资金进行管理和运营;并组建研发团队以开源社区形式进行平台开发。 2015 年 7 月底,以太坊第一阶段 Frontier 正式发布,标志着以太坊区块链网络的正式上线。这一阶段采用类似比特币网络的 PoW 共识机制,参与节点以矿工挖矿形式维护网络;支持上传智能合约。Frontier 版本实现了计划的基本功能,在运行中测试出了一些安全上的漏洞。这一阶段使用者以开发者居多。 2016 年 3 月,第二阶段 Homestead 开始运行(区块数 1150000),主要改善了安全性,同时开始提供图形界面的客户端,提升了易用性,更多用户加入进来。 2016 年 6 月,DAO 基于以太坊平台进行众筹,受到漏洞攻击,造成价值超过 5000 万美金的以太币被冻结。社区最后通过硬分叉(Hard Fork)进行解决。 2017 年 3 月,以太坊成立以太坊企业级联盟(Enterprise Ethereum Alliance,EEA),联盟成员主要来自摩根大通,微软,芝加哥大学和部分创业企业等。 2017 年 11 月,再次暴露多签名钱包漏洞,造成价值 2.8 亿美元的以太币被冻结。 目前,以太坊网络支持了接近比特币网络的交易量,成为广受关注的公有链项目。 后续按照计划将发布第三阶段 Metropolis 和第四阶段 Serenity,主要特性包括支持 PoS 股权证明的共识机制,以降低原先 PoW 机制造成的能耗浪费;以及图形界面的钱包,以提升易用性。 包括 DAO…
在这一篇文章中,我们将介绍去中心化的支付系统 Stellar,它被设计与实现的目的就是在区块链和传统中心化的金融机构之间构建一个桥梁;其目的并不是创建一套完整的金融模型,而是将区块链技术与现有的金融生态系统相结合,在支付和银行系统之间提供协调的功能。 在这篇文章中,我们将介绍两部分内容,一部分是 Stellar 网络中的架构以及设计方式,另一部分包括 Stellar 中的一些概念。 架构 我们可以使用 Stellar 网络构建移动端的手机钱包、在线的银行系统以及支付服务,整个网络其实由两个组件构成,一个是用于与 Stellar 网络交互的 API 服务 Horizon;另一个是网络的骨干,也就是 Stellar Core。 网络中的所有的 Horizon 服务都会连接到 Stellar Core 上,由它通过共识算法负责交易的验证和处理工作,当我们谈到 Stellar 网络时,往往说的都是 Stellar Core 的集合,我们可以将 Stellar Core 理解为 Bitcoin 中的节点,网络中相互连接的全部节点构成了整个网络,而 Horizon 就是用于与节点对话的 HTTP 服务了。 由于 Stellar 在设计的目的就是为了结合现有的金融系统和区块链技术,所以让第三方通过网络发行货币或者代币其实是 Stellar 中非常重要的功能,与 Ethereum 的设计目标『运行智能合约的分布式平台』不同,Stellar 为使用者提供了内置的发币功能,不需要类似 ERC20 等协议额外约束。 为了达到其设计的目的,Stellar 引入了包括账户、资产、分布式交易所、通货膨胀以及锚等概念,构建了一个比较丰富的金融体系。 锚(Anchor) 在 Stellar 中,锚(Anchor)是一个非常重要并且有意思的概念,它们是帮助用户保留存款并且向 Stellar 网络中发行信用的可信实体,你可以理解为全世界各国的中央银行。 所有网络中交易的资产都是 Anchor 发行的信用,例如:银行、储蓄机构、农业合作社、中央银行或者汇款公司。作为 Anchor,一般需要维护最少两个账户: 发行账户只能用于发行和销毁资产,而基础账户用来处理与其他 Stellar 账户的业务,其中保存了所有发行账户发行的资产。 为了履行作为 Anchor 职责,基础设施需要支持两个最为核心的功能,付款和收款,在 Stellar 官方文档 Architecture 中对这两个核心功能的数据流进行了详细的介绍,首先是付款的流程: 客户使用 Anchor 提供的客户端或者网页发出一笔付款; Anchor 的内部服务通过桥接服务(Bridge)发出一笔付款; 桥接服务决定是否需要进行合规检查并将交易的相关信息发给合规服务(Compliance); 合规服务通过查找联合地址决定收款的账户 ID; 合规服务调用 Anchor 的接口获取客户的相关信息并发送给接受付款组织的合规服务; 如果通过了相关组织的合规验证,那么桥接服务就会创建并签发一笔交易,发送到 Stellar 网络中; 当交易被网络确认时,桥接服务收到消息最终更新客户的账户余额; 当其他人向我们发送一笔转账时,整个数据流相比付款时就有一些不同了: 发送者通过查找 Stellar 账户 ID 根据客户的联合地址发送一笔付款; 发送者将付款信息与付款方的账户信息发送给收款方的合规服务; 合规服务联系三个不同的服务: 一个用于判断发送者是否允许的支付客户的制裁回调(Sanction Callback); 如果发送者想要得到客户的的信息,我们需要由回调来决定是否提供当前的客户信息; 如果决定了提供客户信息,通过回调的方式进行提供; 发送方将交易发送到 Stellar 网络中;…
这一次我们介绍的区块链项目就是 IOTA,它的团队将 IOTA 定义为『次时代的无许可』分布式账本,无论是次时代(Next-Generation)还是无许可(Permissionless)在作者看来都没有什么意义,我们还是先来看一下它解决了什么问题,再来讨论它的价值。 IOTA 使用了基于 有向无环图(DAG) 设计的 Tangle,有别于传统的区块链项目,在 IOTA 或者说 Tangle 中,没有区块和链的概念,同时也没有矿工和用户之间的转账并且交易也不收取手续费;IOTA 使用的 Tangle 是我们今天想要介绍的主要内容。 Tangle Tangle 本质上就是一个有向无环图,所有由节点发出的交易最后都会成为图的一部分,也就是用于存储交易的分布式账本。所有的交易在发送时,都需要确认两笔之前的交易,交易的确认是通过『边』来表示的。 也就是说每一笔交易都为整个网络中交易的确认做出了贡献,新的交易能够降低历史交易被篡改的几率,这也是 IOTA 与其他区块链之间的主要区别之一。 在 DAG 中,分叉是无时无刻不在出现的;然而在其他区块链网络中,例如 Bitcoin,分叉只是整个网络中的节点暂时没有达成共识,网络中的节点最终会确定一条唯一的主链,IOTA 的 DAG 却没有单一主链的限制,这能够在理论上增加网络的吞吐量并降低响应时间。 Tip Selection 为了将交易加入到 Tangle 中,新的交易必须选择同意两个之前的交易;在通常情况下,它都会选择两个最近没有被同意的交易,也就是 tips,选择 tips 的方法叫做 tip selection algorithm。 尖端的选择过程就是从创世交易向尖端的随机遍历,只是不同的交易会拥有不同的权重,拥有较多权重或者较多交易索引的 tips 会被优先选择,也就是说新创建的交易会比老的交易更容易被选择。 然而所有的节点不是一定需要遵循上述推荐的尖端选择算法,但是该算法的设计就是让绝大多数的节点都遵循的,在这个前提下,其他的节点也会被激励地使用这种方式选择需要同意的交易。 共识 到目前为止我们简单介绍了 Tangle 网络以及交易是如何发出的,但是对于交易的确认以及 共识 是我们还没有解决的;在 Bitcoin 中,由于所有的交易都是附着在 Block 上的,所以区块的确认就代表区块中交易的确认: 存在的最长链就是网络中的主链,某个区块到主链末尾之间区块的个数就是确认数,这钟实现方式非常容易理解,也很简单高效;但是 IOTA 由于使用了 DAG 作为数据结构并且没有区块的概念,整个网络中的情况就变得非常复杂。 Tangle 为我们提供了两种不同的共识策略,一种是中心化的,另一种是去中心的方式;前者是使用一个 IOTA 基金会控制的节点,也就是调节者(Coordinator),它每两分钟会发出一个不包含任何价值的交易,我们称之为里程碑(milestone),这种中心化的策略非常简单,所有被里程碑链接的交易都是被确认的,反之就是未被确认的交易: 另一种分布式的方式并没有一定确认或者未确认的状态,与 Bitcoin 一样,它会给出某个交易在某个时刻被确认的概率,我们经常说 Bitcoin 需要等待 6 个区块确认,这是因为在 6 个区块确认后,支出方想要进行双重支付(double-spend)必须控制非常强大的算力,这种攻击在理论上是有一定概率会发生的,只是概率非常小并且代价会比较大而已,所以攻击者出于收益小于支出的原因不会去做。 在 Tangle 中,如果我们想要确认一个交易被确认的概率,可以通过执行 100 次尖端选择算法,这 100 次执行的过程中,有多少次引用了该交易,当前交易就有百分之多少的概率被确认,这个概率会随着时间的增加和网络的运行不断提高,但是在作者看来这种方式听起来非常的不靠谱,还有点可笑,不过确实是一种在 DAG 中计算某交易被确认的『可行』方法。 交易 作为一个区块链项目,交易应该是不可或缺的一部分,但是 IOTA 中的『交易』有一些不一样,一个 Transaction 既可以表示一次交易的一次 Input,也可以表示 Output,其实 Transaction 比较像 Bitcoin 中的 UTXO,而真正的交易在 IOTA 中名字叫做 Bundle,我们可以得到如下的对应关系: 在这篇文章中我们会分别使用 IOTA 中的术语,Transaction…
摘要 公链平台主要定位为区块链操作系统,为各种应用开发提供基础技术支撑,是未来区块链技术落地应用的核心基础;本报告主要针对已经公开披露技术白皮书的33个项目进行研究,针对技术方案、开发进度、市场热度和代币分配方案五大维度展开对比分析,旨在综合立体的展示该类项目的设计方案和开发进展; 平台类项目赛道竞争主要体现在技术方案设计和开发进展两个维度,技术方案设计方面,已有方案基本覆盖了共识机制优化、交易处理速度提升、智能合约多样化、扩展性提升等领域,但具体项目侧重不同;开发进展方面,平台类项目主网上线周期平均为10.2个月,预计2019年Q1将是平台类项目主网上线集中器; 技术社区规模和活跃度对于项目开发效率发挥重大影响,代码更新方面,Nebulas近一月代码更新频率最高,其次分别是Lisk、Aion、EOS,项目代码更新频率和主网上线进度紧密相关; 除技术因素之外,用户社群规模和活跃度对公链平台项目生态建设意义重大,主网已上线项目中,ETH、Cardano、Stellar、NEO社群规模排名靠前;主网未上线项目中,EOS、AELF、ONT、IOST社群规模靠前; 截至2018年5月,主网已上线项目平均流通市值为353.57亿元,主网未上线项目平均流通市值为75.21亿元。 一、公链平台项目发展现状 1 区块链项目的发展阶段 根据目前区块链技术的发展阶段来看,区块链技术经历了几个的阶段: 区块链1.0阶段:区块链概念形成阶段 在该阶段,由于BTC最先进入视野,并引起大家关注背后的区块链技术,在这一阶段发行数字货币,使得基本的价值信息和数据进行P2P传输成为现实,为区块链世界打开大门,但此阶段仅限于简单的应用,并无实际价值。 区块链2.0阶段:区块链底层技术发展阶段 在区块链2.0阶段,出现了以ETH、NEO、QTUM和EOS为代表的区块链底层平台,旨在通过对共识机制、智能合约、开发组件、交易处理速度、开发语言进行升级革新,并辅助以分片、跨链、侧链、数字身份、评审和设计的技术进行创新,试图解决区块链商业应用的问题,但目前来讲诸多技术平台尚不完善或者正处于开发阶段,离真正进入商用阶段尚有距离。 在区块链2.0阶段,基于ETH、NEO和QTUM开发了诸多应用,但很多应用也仅是通过这些平台发币而已,离真正的应用尚有距离。 区块链3.0阶段:大规模应用阶段 在区块链3.0阶段,随着区块链技术的成熟,一些平台型项目将成为现实世界与区块链世界的连接器,并能接入其他区块链系统,形成通用的区块链技术平台并能支持大规模的交易处理要求,基于这些成熟的区块链系统,将会出现更多的区块链应用,区块链技术将真正走入现实生活中。 图表1: 区块链技术发展阶段 2 公链平台类项目 2.1 平台类项目介绍 平台类项目指与区块链底层技术开发相关联,且以该类平台使用权或参与权为支撑的一类资产,平台类项目建立技术平台,为各种应用开发提供基础技术支撑,是未来区块链技术落地应用的核心基础,只有区块链平台技术不断完善,才能支撑起未来的商业应用。 现有数量:超过50个品种。 功能:建立技术平台,为各种应用开发提供基础技术支撑。 市场:相当一部分平台处于开发状态,机构投资在该领域占据一定份额,市值最大的是以太坊。 典型产品:以太坊、NEO、EOS等 2.2 平台类项目汇总(部分) 图表2:平台类项基本概况 2.3 平台类项目研究的意义 区块链技术平台是一切未来区块链商业应用的基础设施,在已有的技术中,涉及到共识机制、智能合约、跨链技术、侧链技术、兼容性和扩展性等,在这些技术的组合影响下,直接决定着区块链平台的基本性能,包括维护技术平台正常运行的节点数量、交易处理速度及应用开发的难易程度等。区块链底层平台技术开发具有技术结构复杂、开发难度大、开发周期长及争议较大等特点。 围绕着区块链平台这些底层技术,又形成包括区块链钱包、区块链浏览器、节点竞选、矿机、矿池、开发组件、开发模块、技术社区及项目社群等一系列的生态系统,这些生态系统的完善程度直接决定着区块链底层平台的使用效率和效果。 图表3:区块链公链平台生态体系 目前市场上整体生态系统比较成熟的项目包括ETH、NEO、QTUM等,但这些项目尚不能支撑起高频的商业应用,所以市场一直在探索符合商用的区块链底层技术平台。 为了更好的让用户了解区块链技术的发展的进程,服务于实体经济,火币区块链研究院将持续关注区块链底层技术进展,分析平台类型项目的技术进展、生态系统和应用,为用户提供专业的跟踪报告。 3 平台类项目重点突破方向 区块链底层技术平台尚处于不断创新,逐渐完善的阶段,以目前的技术水平尚不足以对现实世界产生巨大影响并进入到实际的大规模商用阶段。在目前的区块链底层平台的研发过程中,对共识机制、中心化与去中心化、交易处理速度和安全等问题最为关注,讨论也最为激烈,但对于未来如何实现高效、安全和去中心化的平台大家还尚未形成共识。 3.1 公链平台项目的共识机制之争 图表4:区块链共识机制 工作量证明机制:Proof of Work(POW),是指获得多少代币,取决于主体挖矿贡献的工作量,一般来说,电脑性能越好,分给挖矿的矿就会越多。代表币种:BTC、LTC和现阶段的ETH。 权益证明:Proof of Stake(POS),类似于财产储存在银行,这种模式会根据你持有代币的量和时间,分配给你相应的利息。简单来说,就是指谁拥有的币多,谁就有发言权,所以POS就是根据持币比例来证明谁有发言权。 授权权益证明:Delegated Proof of Stake (DPoS),让每一个持有某种资产的人进行投票,由此产生一定数量的代表 ,再由选举产生的代表按照某种机制出块。从某种角度来看,DPOS有点像是议会制度,如果代表不能履行他们的职责(比如出现作弊等情况,他们会被除名,网络会选出新的节点来取代他们。代表币种:EOS。 实用拜占庭容错算法:PBFT Practical Byzantine Fault Tolerance(PBFT),PBFT是一种状态机副本复制算法,即服务作为状态机进行建模,状态机在分布式系统的不同节点进行副本复制。每个状态机的副本都保存了服务的状态,同时也实现了服务的操作。将所有的副本组成的集合使用大写字母R表示,使用0到|R|-1的整数表示每一个副本。为了描述方便,假设|R|=3f+1,这里f是有可能失效的副本的最大个数。尽管可以存在多于3f+1个副本,但是额外的副本除了降低性能之外不能提高可靠性。代表币种:NEO。 对于POW,共识机制,最终由于专业矿工和矿机的存在,算力过度集中让社区趋向中心化发展,此外,大量重复计算产生的高能耗也是POW被诟病的原因之一;POS和DPOS,这种不需要消耗太多算力即可达成共识的机制对POW的上述缺陷有所弥补,但依靠代币数量获得出块又形成了新的中心化趋势,在现实中,诸多项目已经或者准备采用POW+POS的共识机制模式来解决相应问题,但目前对于哪种共识机制优于哪种共识机制,尚无定论。 除了以上共识机制之外,还有各种改进型的共识机制,包括租用共识机制LPOS(通过这一机制,代币持有者可以将他们的代币借给有全网节点的矿工,并获得分红收益)、动态权益的共识协议(DSC,通过动态选举若干记账人,然后在所有记账人中采用PBFT方式进行交易共识)、FBA联邦拜占庭共识、OCE(基于DBFT共识协议和可验证随机函数VRF的增强版本共识引擎,实现了近乎无限的可扩展性,只需很少的计算量,生产几乎不会分叉的区块链网络,OCE支持可插拔验证者、在线协议修复/升级)等。 3.2 中心化与去中心化之争 在目前的区块链技术平台项目中,对中心化还是去中心化争论较大,过度的去中心化影响效率,而过度的中心化又违背区块链的设计原则并有可能影响区块链安全性。从目前主要区块链项目的节点数量来看,基于POW和POS容易导致中心化问题,虽然能提升效率,但有可能牺牲安全和去中心化初衷;而基于POW共识机制则有可能导致效率低下,存在被中心化的风险;目前已有一些项目采用POW+POS的共识机制进行综合,以达到去中心化的目标并提升效率,至于未来具体谁优谁劣,还得看未来的应用的适用性。 图表5: 主要公链平台节点数量与共识机制 3.3交易处理速度 根据目前传统商用应用的处理速度来看,现有的区块链平台项目的交易处理速度尚不能支撑起大规模的商用应用,虽然在不断探索和开发,但区块链要真正的进入的商用应用,还需要很长的路要走。 传统项目交易处理速度: 图表6:传统项目交易处理速度 区块链项目交易处理速度: 图表7: 区块链项目交易处理速度 二、技术开发进度 1 主网开发进度 截至到2018/5/18,Ethereum市值为668.75亿美元,市值最高。Ethereum作为当前最为成熟的平台,加载了大量应用,网络效应明显,在平台类项目现阶段竞争中,首先胜出。 在已上线主网项目中,Cardano、Stellar、NEO也颇受市场青睐,截止到2018年3月31日,市值分别是62.96亿美元、58.20亿美元、37.52亿美元,可见,市场评价较高。 2018年Q1-Q2为平台项目主网上线密集期,其中,未上线平台中,EOS市值最高,为106.76亿美元,是最受市场期待的平台项目之一。 图表8: 公链平台项目主网上线时间 注: 表示平台主网预计上线; 为平台主网已上线 2 主网上线项目开发周期 平台主网的平均开发周期为10.2个月,在主网已上线平台中,Waves的主网开发周期最长,根据GitHub Waves主网开发库显示,从2015/1/18第一个代码提交,到2017/3/6主网上线,共用时25.9个月,过去12个月代码提交量为2243次,在平台类项目中排行第五,可见Waves在主网上线后,仍需不断完善。 Ethereum的主网开发周期位居第二,根据GitHub Ethereum主网开发库显示,从2103/12/22第一个代码提交,到2015年7月29号主网上线,共用时19.5个月,是早期主网上线项目之一。 图表9: 公链平台项目主网上线周期 注:主网上线周期=(主网上线日期-主网repository第一个代码提交日期)/30 3 代码近期活跃度 截止到2018年3月18号,Nebulas近一月代码更新频率最高,代码提交量为547,代码主要由负责主网开发的repo go-nebulas贡献,近一月代码提交量为451;代码更新率其次分别是Lisk、Aion、EOS;其中Nebulas主网在3月30号上线,Aion4月16号测试网络上线,而EOS在6月份主网上线,可见项目方正在积极的推进项目进展。 图表10:…
在这篇文章中,我想聊一聊最近比较热门的 IPFS(InterPlanetary File System),一个点对点的分布式文件系统;从 HTTP 协议出现到今天已经过去了半个多世纪,很少有一些设计能够增强整个 HTTP 网络或者为它带来新的功能。 使用 HTTP 协议传递相对小的文件其实是非常廉价和方便的,但是随着计算资源和存储空间的指数增长,我们面临了需要随时获取大量数据的问题,而 IPFS 就是为了解决这一问题出现的。 架构设计 作为一个分布式的文件系统,IPFS 提供了一个支持部署和写入的平台,同时能够支持大文件的分发和版本管理;为了达到上述的目的,IPFS 协议被分成如下的几个子协议: 上述的七个子协议分别负责 IPFS 中的不同功能,我们将在接下来的章节中分别介绍各个协议分别做了哪些工作以及 IPFS 是如何实现的。 身份 在 IPFS 网络中,所有的节点都通过唯一的 NodeId 进行标识,与 Bitcoin 的地址有一些相似, 它其实是一个公钥的哈希,然而为了增加攻击者的成本,IPFS 使用 S/Kademlia 中提到的算法增加创建新身份的成本: difficulty = <integer parameter> n = Node{} do { n.PubKey, n.PrivKey = PKI.genKeyPair() n.NodeId = hash(n.PubKey) p = count_preceding_zero_bits(hash(n.NodeId)) } while (p < difficulty) 每一个节点在 IPFS 代码中都由 Node 结构体来表示,其中只包含 NodeId 以及一个公私钥对: type NodeId Multihash type Multihash []byte type PublicKey []byte type PrivateKey []byte type Node struct { NodeId NodeId PubKey PublicKey PriKey PrivateKey } 总之,身份系统的主要作用就是表示 IPFS 网络中的每一个节点,代表每一个使用 IPFS 的『用户』。 网络 作为一个分布式的存储系统,节点之间的通信和信息传递都需要通过网络进行,同时能够使用多种传输层协议并保证可靠性、连通性、信息的完整性以及真实性。 IPFS 可以使用任意的网络进行通信,它并没有假设自己一定运行在 IP 协议上,而是通过 multiaddr…