4月6日,BM在medium上发布了EOS Dawn 3.0的介绍文章(https://medium.com/eosio/eosio-dawn-3-0-now-available-49a3b99242d7)。
因为看了几个中文翻译版本,都觉得有所疏漏,所以想求人不如求己,不如自己动手丰衣足食。(笑)不过真的着手开始行动起来,才知道多么的困难,好歹最后坚持下来了。希望各位对此文给予批评和指正,一起来为EOS的生态圈添砖加瓦。
Block.one激动地宣布,第一个功能完备的预备版本EOSIO,DAWN 3.0发布了。这个预备版本代表着目标在2018年6月发布正式版EOSIO 1.0的奋斗途中一个重要的里程碑。我们的开发者全球团队为了使EOSIO成为构建区块链应用最强大的平台日以继夜的工作。自从我们发布EOSIO DAWN 2.0以来,已经有四个多月,我们有很多想要展示给大家的东西。
创建艺术的区块链架构是一个边学习边改善设计的过程。有许多我们在DAWN 3.0里面完成的特点,甚至在EOS的白皮书里面也不曾提到过,而是在开发过程中发现了它们。这将会使EOS这个平台变得性能更强、更为灵活并且便于开发。
可扩展性
可扩展意味着为满足市场需求进行扩展的能力。尽管EOS团队在计划中的每一步都考虑到未来的扩展性需求,但DAWN 3.0也只是利用了一小部分的潜在性能优化来允许EOSIO进行扩展。而设计EOSIO是为了未来的应用能够在没有硬分叉的情况下,使用并行计算来加速吞吐量。
跨链通信
跨链通信就是终极可扩展性。多少业内都在寻找这座“圣杯”,他们提出了诸如侧链、Plasma以及分片技术等方案想要解决该问题。跨链通信使得一条区块链能够通过一种可证明安全性的方式来确认另一条区块链上发生事件的真实性,而目标就是跨链通信能够像链内智能合约之间的通信一样安全,我们认为我们已经达到这一目标。
按照我们的观点,跨链通信不再具有应用轻型客户端作为智能合约的能力。因为轻型客户端是能够在不需处理整个区块链的情况下确认区块链事务(Transaction)的,这就意味着只需要有效且安全的轻型客户端确认,就能建立一个POS区块链。而轻型客户端确认必须涉及到协议的设计,因此它几乎不可能被应用到。
稀疏头验证
传统的轻型客户端会处理每个区块头并且验证区块头关联证明的有效性。而EOSIO每秒钟生成两个区块,则一个区块链至少需要每秒钟两次事务来处理区块头。这与相对不频发的跨链通信场景相比并不少见,为了解决该问题,我们创建了首条拥有拜占庭容错稀疏头验证的区块链。为了试图欺骗一个轻客户端,需要腐化超过2/3的节点数(即21个里面的15个以上)。此外,轻型客户端只需要在活动节点组变化时处理区块头及其相关联的跨链信息。这样就极大地降低了维持一个拜占庭容错轻客户端的费用,并且大大增加了跨链通信的效率。
与上下文无关的行为
与上下文无关的行为是使得跨链通信变得有效率的一个关键性的特点。他们是包含在事务当中但是不受区块链状态影响的特殊行为,因此被称为“与上下文无关”。比如确认一个MERKLE proof请求或者签名。因为这些计算“与上下文无关”,他们可以很容易地并行确认,计算也可以从重放当中精简掉。
每个与上下文无关的行为也可以参考一次事务的特殊删除数据部分,这意味着大型的MERKLE proof请求可以被删减掉而他们花费昂贵的计算也能在区块链重放期间被跳过。
与上下文无关的行为使得我们可以并行计算有关于跨链通信的大部分开销,它还能让我们并行计算和削减隐私技术(诸如保密交易、bullet proof, 和zkSNARK)计算上的高价费用。
为了能够鼓励使用与上下文无关的行为,区块生产者将在计算作为与上下文无关行为的一部分而非传统事务的一部分进行时,仅仅收取用户一小部分CPU的使用费。
与上下文无关的内嵌行为作为事件
EOSIO Dawn 2.0开发者在寻求的一个特点是以一种有效的方式来生成通过外部来源处理的事件。在以太坊上这些事件是用来报告有关一个合约内部操作的结构化信息。在加入与上下文无关行为后,我们还能有机会实现与上下文无关的内嵌行为。一个内嵌行为由一个合约代码生成,并作为当前事务的一部分执行。一个与上下文无关的内嵌行为可以被低价且并行地处理。因为所有的内嵌行为是包含在MERKLE树根里的,这些行为可能被用来作为对外部服务和其他区块链的可证明通知。
事务压缩
有许多拥有大量可压缩数据的事务。最不可避免的例子其中之一就是合约WebAssembly代码本身,其他例子包括ABI(Application Binary Interface)规范和一个账户和合约相关的李嘉图合约。某些应用,比如社交媒体,也想要压缩用户在区块链上生成的内容。
通过使用压缩事务,区块链能够更有效地存储和传输大量数据,而向被压缩数据事务的用户收取的费用也是少于未被压缩数据事务的。
解释器和即时编译器
自DAWN2.0以来一个最大的变化就是对我们的WebAssembly运行环境的抽象。Dawn 3.0现在默认使用Binaryen WebAssembly解释器,而不是更快的Just-in-Time (JIT) 编译器。这个决定降低了性能但是增加了稳定性和标准符合性,并在需要时允许我们从更高性能的JIT环境中轻易地切换过来。这个解释器也解决了我们在DAWN2.0中面临的最大挑战:编译一个合约而导致的延迟。将来当我们想要在后台编译和优化一个新部署合约时,我们能够使用解释器执行一个更缓慢但是更低延迟的合约。这个双重应用意味着我们所有的单元测试对编译和解释代码都进行了测试,因此我们可以在部署混合算法之前,发现潜在的非确定性和与标准不符的行为。
限制资源计量速率
在Dawn 3.0上我们拥有了一个全新的资源速率限制系统。最大的变化或许是引入了一种客观的指令数算法。当我们开始建立EOSIO的时候,我们的目标是使用完全主观的速率限制并强制执行它。而我们发现主观强制执行的成本几乎和客观途径一样。我们现在使用一种混合的解决方法,用户为了客观使用而支付费用,而节点仍在合约中采用主观壁钟时间限制(wall-clock time)。这种主观限制可以避免客观计费有差异而被滥用。
我们采用这种方法最主要的一个原因是允许单独事务比以前的上限进行更多的运算。现在一个区块理论上可以包含一个运行100ms的事务,而在旧模式下每个事务都必须运行在1ms以下。
另外一个速率限制的变化是把限制和定义为TOKEN的需求分开,这样一来,就允许EOSIO在没有使用任何TOKEN的情况下,应用在私有的和经过许可的区块链上。公有链可以采用系统合约通过铸币(Staking,相对应于POW的挖矿 mining)来实行限制,社区也可以动态升级成资源如何分配,而与分配如何进行无关。
500 ms出块间隔和BFT DPOS
随着Dawn 3.0出现后,我们已经从3s出块间隔缩短到0.5秒。这极大地缩短了等待确认的延迟。当与BFT DPOS组合起来,交易能够在1秒之内不可逆转的被确认。不可逆转前的延迟时间对于跨链通信而言有重要的影响,因为另一个区块链在吸收一个外部链的证明前必须等待到不可逆转。两个基于EOSIO的区块链在3秒钟以内应该能够进行一次来回的通信,而在以太坊上一次类似的通信需要9分钟,在比特币上需要3小时以上。
BFT DPOS由于是非硬分叉的优化,所以还没有实行。我们将在发布EOSIO 1.0前实施它。
BIOS架构
BIOS架构是自从Dawn 2.0以来最大的架构变化之一。在Dawn 3.0下,大部分区块链商业逻辑已趋向于智能合约,不需要硬分叉就可以通过社区进行动态更新。一个准EOS-IO区块链是一个没有任何Tokens、投票或者被授予的权益证明(DPOS)的单节点。在一个核心区块链代码上能做到的只能是包含创建账户、部署合约、执行资源配额的权限系统。使得区块链DPOS化(包括Tokens、投票、铸币和资源分配)的所有事项现在由基于智能合约的Web Assembly来定义。
通过这一架构,我们就可以把注意力集中于区块链静态的非WebAssembly部分的发展。这部分对于稳定性来说是最为关键的,但也是最难于改善的。在DAWN3.0到发布正式版1.0之间这段时间,我们将完成系统合约、铸币和投票的最终细节。
安全特点
安全对于任何计算系统而言都是尤为关键,而我们已经将EOSIO设计成市场上最安全的的区块链。安全是一个多维问题,必须考虑到黑客、硬件故障、硬件丢失及密码丢失等风险情况。硬件钱包对于防范黑客非常有效,然而如果硬件有故障你可能就登录不了,而硬件钱包(密钥)的纸备份可能丢失或被窃。
安全延迟交易
Dawn 3.0一个非常有意义的特质就是加入了用户对于不同行为可配置的延迟。通过延迟,一个交易在应用之前必须在几个小时或者几天里面才广播到区块链上。在延迟期间用户可以采取措施用高权限来重置他们的账户,并且取消交易。这相对于其他区块链来说是很有意义的改进,尤其当你知道你被黑了,一切为时已晚的时候。
丢失密码的恢复
每个账户都至少有两个级别的权限:“owner” and “active”。
Owner权限级别应当是一个N of M模式的多重签名机制,其中的N是包含了owner的私钥的个数。Owner权限可以在active私钥丢失或被窃取的任何时间重置active的权限。
如果你丢失了owner私钥或者你的多重签名伙伴不合作,那么active权限账户能够在owner权限非激活状态30天后请求重置owner权限。而owner权限拥有者则有7天时间通过更新active权限来反对该请求。
在这种模式下,通过一个或者多个硬件钱包来控制owner权限的账户,将可以安全地防范黑客和硬件故障。如果该设备是一个带有硬件和指纹/面部识别ID保护私钥的IPHONE,那么攻击者即使物理上偷取了你的手机、指纹或面部信息,他还需要危害你的多重签名伙伴。而理想情况下你的多重签名伙伴也是使用生物识别防护硬件设备的。
交易提议系统
当用户可以自由自在地独立添加和删除他们的许可,而不是在传统交易的时间窗口到期前收集所有的签名,那么多重签名就变得更加容易。通过提议系统,任何人都能提出一个交易,而交易涉及的各方可以方便地批准它。在添加你的许可之后到达获批门槛之前,你的赞同意见是可以被删除的。
为了实行这样的系统,我们添加了新API来允许合约可以评估是否这一批账户的权限是能够批准该交易的。这让我们可以通过部署新的WebAssembly来提升多重签名的过程,而不需通过硬分叉。
简化合约开发
我们的目标之一是通过EOSIO使得合约开发变得简单且尽可能的轻松。如果开发者知道如何写一个带有方法的C++类,那么他们就应该会写尽可能低样板复杂度(boilerplate complexity)的智能合约。
我们很开心已简化了我们的“Hello World”合约到几行简单的代码。我们的工具链已经自动化生成合约ABI的过程,并调用用户的Actions到你的类当中定义的方法。开发合约从未如此简单。
浮点数支持
简化智能合约开发的一部分是让开发者能够更便捷地实施所需的数学算法。开发区块链最困难的方面之一就是缺乏浮点运算以及相关的幂函数、根函数和三角函数。许多算法,比如Bancor, 利用浮点数更容易实现,而不是将所有计算强制转换为容易出错且内存密集型的定点数。
我们通过WebAssembly合约整合了一个公开的软件浮点数库,从而解决了硬件浮点数不确定性的问题。通过软件浮点数,我们能够在复杂的情况下,以不高于定点数的代价获得确定性及易于开发的好处。在许多情况下,定点数比浮点计数法更容易出错,也对内存更加敏感。
C++ 标准模板库支持
对于Dawn 3.0,我们为了加入对大部分C++标准模板库的支持,作出了巨大的努力。这意味着在消除那些算法因非标准性实现而导致错误的可能性时,开发者可以使用他们熟悉的工具、库和算法。
计划事务
通过计划事务,只要合约拥有足够的资源带宽,开发者能够永久运行合约。其他平台需要在适当的时间用链下交易(off-chain)的解决方法来唤醒一个合约。通过计划事务,我们获得了效率和易用性,不需要开发者租用一个自己的服务器用来保持合约持续的运行。
自动范围检测
在Dawn 2.0里面,每件事务都是需要宣称它将访问的数据范围,对于开发者而言,这易于出错又冗长繁琐。在Dawn 3.0中,区块生产者负有决定访问数据范围及化解它们冲突的责任。这使得所有事务更为精简,并且把调度开销转移给区块生产者,而不是把它推给用户、开发者或者所有节点。
多重索引数据库API
Dawn 3.0加入了一个新的数据库API,它镜像了boost::multi_index_container(译者注:boost 中十分实用的多重索引容器)
通过这个API,它能很轻松支持多重键排序的数据库表、搜索项、使用upper_bound和lower_bound函数、向前向后迭代数据库。这个新的API使用了能够显著地改善扫描整表性能的迭代器接口。
现在也可在64位、128位、256位、512位整数和64位双浮点数上建立索引,对字符串索引的支持将在正式版1.0公布之前被加入。这是一个对于开放灵活性和便捷度非常有意义的改进措施,在同一张表里如今可以有近乎无限的索引字段。
性能
实际性能一直是我们团队关注的东西,我们非常满意这次的结果。我们以几种不同的配置来测试我们的软件,来获知性能的上下限以便于将来的优化。所有的这些测试都假定Token传输与比特币或以太坊ERC20 Token在计算复杂度方面是相当的。
最差情况(1000TPS):这是我们不进行任何优化的基准性能。我们能够使用一个多节点网络运行带有单线程签名确认的解释器支持超过1000TPS。
平均情况(3000TPS):一旦我们打开JIT编译器,我们就能使用一个多节点网络运行带有单线程签名确认的解释器支持超过3000TPS。
最佳情况(6000TPS):一旦我们实施了并行签名确认,我们就可以在并行级别和签名数量增加时,假设每次签名的壁钟时间接近于0。我们可以通过取消签名确认的方式来模拟出该环境。在该模式下,我们在一条附带JIT编译器的多节点网络上能够达到6000TPS。
理论情况(8000TPS):如果我们从影响因素中移除网络代码,并把注意力集中在关闭签名确认且使用JIT编译器之时CPU的作用,那么我们就能达到单线程8000TPS,在单个链上要超越这一极限,需要实现WebAssembly的并发执行以及更高级的调度。而在同样场景下,使用解释器而不是JIT,我们只能达到2700TPS。这表明仅是启用JIT这种相对简单的改变,就能给予我们大约3倍左右传输性能的增强。这些测试都是在MacBook 2.8Ghz i7上进行的。
无限制TPS
“每秒事务数”(TPS)的定义通常是一个不相关的比较,通过跨链通信,我们能够把工作负载分配到我们选择的区块链当中。Token能够在不同的链之间安全可靠的传输。通过相同或者不同的节点生产者对1000条链的并行操作,我们能实现每秒钟百万笔事务。这代表着其他区块链理论上的扩展方案实际已经被实现。
我们强烈鼓励基于公开网络的EOSIO节点生产者运行尽可能多的链来满足用户的需求。所有的链都使用同样的Token作为铸币和资源分配的基础。这样将围绕单一Token创造出最大可能性的网络效应,并且能利用高度的市场资本化Token创造出经济激励的信任与安全性。
像交易所、货币、社交媒体这样的应用能很轻松地平衡他们在并行链上的工作负载。
未来之路
在Dawn 3.0上,焦点集中在核心平台的稳定性。在下面一个月里,我们将着手准备实现所有关于铸币、投票及治理机制的最终版系统合约。我们还将最终完善我们的Token规范。
一旦系统合约达到我们满意的成熟度,我们将发起一个新的公开测试网络。在这之前,我们会大大简化启动你自身的测试网络和开发你自身的应用程序的过程。我们将在接下去的几周里面关闭现在的测试网络,同时我们准备好新的测试网络使开发者不被混淆。
总结
Dawn 3.0是一个设计成带有稳定API“功能完备”的开发者版本。我们相信该平台对于开始构建自己应用的认真的开发人员来说,已经足够稳定了。EOSIO相对于我们一年前的构想,已经变得更为强大及易于开发。
我们的团队正在以创纪录的速度成长和发展。在过去的一个月里,我们在github上的版本库已经成为十大最活跃的C++版本库之一。所有一切都在为了六月发布一个高质量的公开正式版EOSIO 1.0按部就班的进行!