eos.io开发更新2018-1-13

译者:peter

原文地址:https://steemit.com/eosio/@dan/eos-io-development-update

声明:未经允许,在非用于商业和教育用途的前提下 (即,除了收取费用或商业目的),如果注明原始出处并使用声明的版权,任何人可以使用、复制或发布本文内的任何内容。

我们最近很忙,忙着把EOS.IO做成目前市场上最好的智能合约平台。我们的团队不断拓展区块链的边界,希望能在开发和性能中间取得最好的平衡。

在我们上一次的更新中,我们稍微描述了我们遇到的挑战,它们包括:

  • 支持苹果的touch ID/安全enclave
  • 延迟(异步)交易的错误处理
  • 并行执行

 

从上次更新之后,我们实现了我们讨论的内容的多数部分。这些内容包括在github上的eos-noon分支中,这样我们就能维护一个稳定的master分支,这样大家能用来做测试网络的工作。下面是我们最近的工作的一些细节。

延迟交易

延迟交易可以让不同的shard进行通信,只需要把同一时刻需要的数据库锁的数量最小化就行。同时我们还实现了安排一笔交易在未来进行分发的能力,以及取消安排好的交易的能力。

对交易进行安排(绑定了免费交易)的能力是的EOS.IO成为第一个“图灵完备的智能合约平台”。这意味着它将可以创建一个智能合约,该智能合约会在持续进行的基础上,每秒多次自动地执行一个操作,而不需要外部输入。只要该合约拥有足够的计算带宽,该合约就能永远执行下去。其它的智能合约平台都需要外部输入才能运行,因为它们受到手续费的限制,也不能安排一笔交易在未来的时间点执行。

这个功能限制已经完成了,将来会在EOS Dawn 3.0 测试网络发布时提供,我们希望能在2018年第一季度结束时发布EOS Dawn 3.0 测试网络。

授权延迟

时间对于安全来说是一项关键因素。我们正在升级EOS.IO的授权结构,以让用户能对每个授权级别配置延迟。比如,在社交网络上发文可以是实时的,而转移资金则需要24小时甚至更长时间的延迟。当一个用户使用配置的延迟来执行一项操作的时候,这笔交易将会被打包,延迟一段时间,同时可以在该延迟时间结束前取消。这就能让用户使用“恢复被黑的账号”流程在造成伤害之前重新获得对他的账号的控制权。

被黑账号恢复

每个账号都有三个特殊的权限:owner,active和recovery。owner权限应该使用多重签名进行配置,它能实时修改其它所有的权限。更新owner权限应该需要30天的延迟。理想情况下,owner权限应该需要一个恢复(recovery)伙伴的active权限。要想黑掉owner权限,需要同时获得这个账号的用户和他的恢复(recovery)伙伴的同意。如果恢复伙伴的active 私钥被黑了,那么恢复伙伴可以使用他的owner权限进行恢复。在实际情况中,这会在所有用户中形成一个信任网络,要想黑掉账号,必须一次性黑掉所有人。

如果恢复伙伴不配合,那么active权限可以单方面的升级owner权限(这需要30天的延迟)。这意味着你的账号不会被别人支配。

只有一种情况下,你的账号会被黑:你丢失了你的active 私钥而黑客拿到了你的active 私钥。可以通过充足的备份来减少这种情况发生的概率。

丢失密码恢复

人们会忘记密码,电脑会宕机,这些事情都是会发生的。墨菲定律告诉我们如果一件事可能会出错,那么它就一定会出错,即使是最完美的计划和加密学专家也不例外。使用EOS.IO你也不能指望运气。每个账号都能指定几个恢复伙伴 (recovery partners),这些恢复伙伴能更新active验证权限(有七天的延迟),不过这只有在你的账号已经超过30天处于不活跃状态(inactive)的时候才能进行。只要你指定几个你信任的朋友和家人作为你的恢复伙伴,如果你丢失了你的秘钥,他们就能把账号归还给你,这样你就不需要担心会丢失账号了。

每个账号都有宪法和法律上的义务来保存你账号上的财产权。如果恢复伙伴滥用他们的地位,想趁你在30天的昏迷期内夺走你账号的控制权,你依然可以对他们提起诉讼来夺回账号。因为你指定的是你熟悉的人来作你的恢复伙伴,所以,很容易就能知道应当由谁为此负责。

通过把社交网络,时间延迟,加密学联合起来构建一个能保护每个人的财产权的信任网络,这就能使丢失密码恢复成为可能。

更新资源使用算法

EOS黎明2.0实现了一些基础资源的限制,但是我们还有工作要做。过去的两个月我们完整的修改了我们的对带宽,算力,投票和存储的资源比率限制策略。

分离staking

我们添加的最主要的改变就是为不同的权利开发了不同的staking 池,由此识别带宽,内存和控制的不同供应/需求价格的经济现实。比如说,我们不希望人们分配他们不想使用的内存,这样他们就可以声明(claim)他们的投票权或带宽。我们还想对未staking的带宽施加一个三天的延迟,而未staking的未使用的存储没有延迟,未staking的投票有六个月的延迟。带宽和投票可以被代理,而存储不能。正如你所见,我们需要满足不同的需求。

带宽代理

任何账号都能把带宽代理给任何其他的账号,只要把代币发送到一个带宽staking账号。为了保持“对称”,一个用户可以把带宽代理给他们自己,就像把带宽代理给其他人一样。用户可以在3天的延迟后的任意时间点拿回他们的代币。

对一笔交易进行验证的所有账号,都要为带宽付费,在不活跃的三天后,使用(usage)将会线性衰减至0.

投票

现在我们有了带宽,内存的分离staking池,我们就能为那些希望在平台上行驶政治控制权的人提供更好的利益捆绑。为了能影响区块生产者的选择和协议的升级,用户必须在一份合约内,对代币进行stake,合约规定了一个六个月的线性取款期。如果他们的行为对平台有负面的影响,这将导致他们蒙受资本的损失。

内存

RAM很昂贵,而且对一台计算机能支持的硬件上是有限的。如果我们成比例的把所有1TB的RAM分配给1000亿美金,那么每个字节的存储的成本将超过10美金。这就会把平台变成无法使用的,因为这样99.99%的代币持有者都不需要RAM.

要解决这个问题,我们可以从班科借鉴一个想法,就是把内存当作一个有1%保留的智能货币。这种情况下,保留的是1TB的真实RAM,然后班科(Bancor)算法以动态价格把这个真实RAM卖掉,这样RAM就永远不会用完。当有人想保留RAM时,他们把代币发送到内存合约,然后基于一个流动代币和可用RAM的功能被保留。

区块链会对一个账号的真实使用情况进行追踪,如果它想消耗比之前分配的更多的RAM ,交易就会被拒绝。当一个账号使用完了分配的内容,不再需要RAM了,它就可以请求释放它的分配,然后就能收回它被锁定的代币。

低价的时候保留RAM,高价的时候释放掉,这样是不能转移或代理保留的存储的,也无法从资本增值中获利。这对于防止存储成为一种投机工具(这会把价格抬高到远离人们真实的需要)来说是十分重要的。

每个用户每天的分配只能增加一次,他们为所有分配支付的价格将基于分配后的可用RAM.这意味着一次分配很多的RAM的价格会很昂贵(由于市场滑动),最有效的策略是长期购买,个人在未来少量使用。

这个策略将让那些想保留大量RAM的人付出平均的成本,随着时间的推移,所有的竞争者的价格都会不相上下。

对内存使用收费

我们已经知道怎么把应用变的可用的了,很快我们就意识到一件事,很多情况下,如果合约拥有者能让用户自带存储,那合约拥有者将好过得多。不把成本摊到用户头上,这会让并行计算变的困难,同时也强迫合约开发者构建他们自己的记账模型。

每个合约都能选择要么对授权交易的用户的存储收费,要么对合约自己收费。多数情况下,每个用户保存他们自己的“账号信息”要比一个服务合约在内部存储要好得多。这给予了开发者最大的灵活性来设计用户体验。

这项修改还在进行中,将会包含在EOS黎明3.0中。

显式交易锁

我们把“读/写范围(scope)“改成了”读/写锁“,这样来传递它们的逻辑行为,同时增加锁的粒度,从而把并行执行的机会最大化。

测试EOS黎明2.0的开发者十分熟悉声明每笔交易需要的“范围”的需求。这使得交易在面对一些动态的环境时,难以进行组织,交易也十分脆弱。我们对这些环境进行了调查,决定区块生产者可以决定需要哪些读/写锁。这样就把指定每笔交易所需要的锁的需求消除了,这能节省空间,同时便于开发者开发。

这项修改已经在eos-noon分支中完成了。

核心功能的动态更新

通常对区块链的升级需要进行硬分叉。在有新功能要添加,要升级现有功能,或有bug需要修复时可以随时进行。硬分叉对整个网络来说是破坏性的,因此,尽可能通过WASM把区块链的行为定义为动态的。

我们正在把核心功能从原始c++迁移到WASM合约上。这些功能包括:

  • 核心代币(EOS)
  • 带宽,内存,投票的staking
  • 生产者投票
  • 多重签名合约
  • 社区利益合约/worker提案分配

 

不直接用WASM实现的内容包括:

  • 账号创建
  • 带宽/RAM使用度量
  • 权限更新

 

调度/延迟交易

有了这项修改,区块生产者将能不进行硬分叉就可以修复bug,升级协议。这样我们就能自食其力,保证我们的智能合约开发环境足够健壮,以实现我们想开发的每个合约。

合并代币标准

为了支持合约间的互操作,我们一直在开发一种合约的代币标准。这个标准将和ERC-20代币背后的概念相似,能让多个合约之间互相操作。

我们的代币标准比传统的ERC-20代币有多个优势:

  • 应用数据的转移可以包含备注
  • 发送者和接收者可以执行代码拒绝交易
  • 能享受IO授权系统的好处
  • 使用相同的代码实现本地代币
  • 一份合约能创建和管理多种代币。

 

我们正在开发一份标准c++库,有了这个库,创建自己的代币就像填写模版变量,部署合约一样简单。

专注于稳定性

我们的单线程代码能支持5000tps,区块间隔只有0.5秒,两秒内就能最终完成。这性能在业界都是领先的,因此我们相信如果我们能提高稳定性,增加功能,更好的架构的话,对市场更有利,而不是仅仅提高性能。因此我们选择改进交易的总体质量,之后再把tps的数量最大化。

在我们上次黎明2.0的更新中,我们说到我们并行执行的工作比预期的要早。由于我们增加了大量的新的开发者友好的功能,为了在6月发布EOS.IO,我们把稳定性的优先级拍在了性能的前面。我们觉得,达到最好的架构,比发布比市场能马上用上的更强劲性能来说更好一些。

有了跨链通信,我们认为EOS.IO很容易就能支持无线拓展。这个功能已经实现了大部分,我们希望能在2018年2季度之前能有一个跨链双向锚定通信的概念证明演示。

拜占庭容错(BFT)Dpos

有两种主要的pos系统:DPOS,和BFT系统,比如tenderment。它们各有优势。DPOS出块时间更快(0.5秒),即使只有1个区块生产者没事,其他的区块生产者都失败了,它依然能运行,甚至能恢复。传统DPOS的缺点是要达到绝对的完成状态需要45秒。在实际情况中,像steem和比特股这样的系统,它们能在两秒内达到99.9%的完成度,但是对于低延迟的跨链通信来说,我们希望能在两秒达到绝对的完成状态。

BFT系统每个块就能达到绝对的完成状态,但是她们的算法需要高带宽,耗时2-3秒,没有99.9%完成的中间状态。而且,如果33%的节点失败了,整个系统就完全中断。

BFT-DPOS将能结合两者的好处。区块能在0.5秒内生产出来,同时达到99.9%的完成度,每两秒就能确认,达到绝对的完成状态。通过让区块生产者每次它们拓展它们的本地链的时候,就发出一个区块确认来实现这一点。如果一个区块生产者在同一区块高度或区块时间戳发出了两个确认,就证明它是拜占庭错误的。随着生产者发送的确认,他们包含的序列号会增加。一个生产者如果发送了两个确认,这两个确认的序列号是一样的话,也被证明是拜占庭错误。

由于一个生产者只能一次生产一个区块,而且只有当发现一条更长的链的时候,生产者才会切换分叉,只有超过1/3的生产者提交了加密学上证明的拜占庭错误时,创建不同的不可逆区块的分叉才是可能的。在这种情况下,社区通过宪法可以采取行动,冻结该生产者的账号,自动排除有不良行为的生产者。DPOS链将会继续使用最长链的规则直到问题解决。

候补区块生产者的补偿

我们正在开发一个算法,把区块生产者支付分为两部分:

  • 每区块收益(per-block)
  • 每投票收益(per-vote)

 

所有有投票权的区块生产者,签署一笔交易后,每个小时都能claim他们的每投票收益(per-vote)一次。他们(至少)需要设置一个机器人来广播一笔交易才能如此。有了这个补偿系统,生产者就能有持续的动力来拉票。

我们还在实现一个投票-衰减(vote-decay)系统,新的投票的权重比久投票的权重高。这样,区块生产者的选择将部分取决于那些拥有最多活跃投票者(至少每个月刷新一次他们的投票)的人。陈旧的投票的影响力将在两年内衰减至最低。

团队

这周,我们很高兴,团队新增了8名成员。我们还在寻找更多的人才。如果你是一个优秀的开发者或设计师,请联系我们。

结论

EOS.IO软件正逐步成熟,2018年6月会有一个健壮的版本发布,具有比当初的白皮书中列出的还要多的功能。

请关注我的twitter,同时关注我们在韩国的meetup。