EOS技术白皮书学习笔记(三)---应用程序的确定性并执行

在看本文前,最好先了解区块链相关概念:比特币,以太坊,钱包,智能合约,秘钥等

应用程序的确定性并行执行

相信你和我一样,刚开始看这个标题的时候有点懵逼,这讲的啥意思呀?后来我查阅了许多资料以及他人的分析,这才有点理解其中的意思,下面我来说说我是怎么理解的。首先,我把这个标题分解成3个:应用程序、确定性、并行执行,分解后就明了了,我知道应用程序是什么,但是不知道它说的确定性和并行执行是什么意思。于是,就需要查询确定性和并行执行,得出的结果是:

并行执行:同时独立地安装和使用程序集的多个版本的能力。并行执行可以应用于应用程序和组件以及 .NET Framework。允许多个程序集在同一台计算机上共存和同时执行,对于支持公共语言运行库中可靠的版本控制至关重要。--百度百科

简单的说就是,多个程序可以同时执行。

确定性并行执行: 由于执行个体之间的同步、竞争和干扰,并行程序的执行存在着不确定性问题,即程序在相同输入下多次执行可能得到不同的结果。不确定性给并行程序在开发、调试、测试、容错和安全等方面都带来了挑战,严重降低了并行程序的可靠性,阻碍了并行程序的发展。确定性并行技术通过控制并行程序执行个体间的同步、竞争和干扰,使程序的执行结果仅依赖于输入。确定性并行技术能够从根本上解决了目前并行程序存在的诸多问题,提升了并行程序的可靠性,给并行程序的发展带来了新的机遇。

结合并行执行可以这样理解,要使多个程序同时执行,并且能更稳更安全的执行,就需要用到确定性并行技术,理解了吗?

EOS中也运用了这样的技术,在白皮书中是这样说的:

  • 区块链共识取决于确定性(可重现)的行为。 1.意味着所有的并行程序都不能是“不确定”的,例如互斥或加锁是不确定的,就不能用。 2.没有锁,就需要一些方法来保证所有账户只能读写自己的私有数据库 3.所以每个账户都必须按照顺序处理消息,EOS的并行性在账户级别。
  • EOS将消息传递到独立的线程中 1.判断并行的可能性 2.每个账户的状态只取决于传递给它们的消息 3.进度表,我这里理解成消息的执行顺序,这个顺序在区块产生后是确定的,而在产生过程中是不确定的,是由区块生产者按照并行算法决定。
  • 当脚本生成新消息时,他不会立即发送,而是被安排在下一个周期。因为接收方可能会在另一个线程中主动修改自己的状态。

通信延迟优化

通常一个账户方一条消息到另外一个账户,并不是立即就能收到的,其中需要一定的时间,这个时间就叫做延迟时间。EOS不希望有这个延迟时间存在,他希望能够在一个区块内来回交换消息。他是怎么做的呢? EOS将区块分成了几个循环,循环又分成了多个线程,每个线程包含一个交易列表,每个交易包含一组要传递的消息。这个结构可以看成为一棵树,在这个树中交替的层被顺序的并行的处理,我们看下面这张图

执行流程

在一个循环中生成的交易可以在后续的任何一个循环或者区块中被发送。 区块生产者会持续不断的向区块中添加循环直到最大的墙上时间到了或者没有更多的新交易要发送。

可以对一个区块使用静态分析来验证同一个循环内不存在两个线程包含同一帐户下对交易的变更。 只要保持不变一个区块就可以并行的运行所有的线程。

有点绕,其实可以这样理解,以上做法都是为了让账户和账户之间通信更快更及时。

只读消息处理

只读消息的处理,EOS对于无需更新状态的消息处理是可以并行的,只要特定的只读消息处理程序被包含在特定的循环内的一个或多个线程中就可以。

多账户原子交易

有时我们需要确保消息自动的被多个账户传递和接收(原子性操作)。 在这种情况下,消息会被放在同一个交易内,账户会被分配到同一个线程,并且消息被顺序的添加。 这种情况对性能是不理想的,当用户使用涉及到“账单”时,他们将在交易内以账户唯一索引被列入其中(为了确保交易成功)。

但是,基于性能和成本原因最好减少涉及两个或多个重度帐户的原子性操作。

部分区块链状态的评估(组件化,模块化的判断)

1.大规模的区块链技术组件应该是模块化的

  • 每个人都不应该运行所有的东西,特别是他们只需要运行一个小应用时
  • 例如,一个交易所的应用,只需要向用户展示交易状态,而不需要与其他应用程序(社交媒体或其他)有状态关联。

2.EOS允许完整节点选择要运行的任何程序子集

  • 传递给其他应用的消息可以被安全的忽略掉,因为应用程序的状态完全由传递给它的消息派生。
  • 这与其他帐户的沟通有一些重要的影响。 最重要的是,不能假定其他帐户的状态可以在同一台机器上访问。 这也意味着,虽然很容易启用“锁”来允许一个帐户同步调用另一个帐户,如果其他帐户不驻留在内存中,这种设计模式就会出现问题。
  • 所有账户帐户间的状态通信必须通过包含在区块链中的消息进行。

自主最优任务安排

1.EOS系统不能强制阻止区块生成这向其他账户发送的任何消息 2.每个区块生产者都可以根据处理交易所需的计算复杂性和时间做出自己的主观预测。 3.在网络层面上,所有的交易都会收取一个固定的计算带宽成本,区块生产者也可以使用自己的算法来测量资源的使用。 4.一般来说,只要一个区块生产者认为一个交易是有效的,并且所消耗的资源是可控的,那么所有的其他区块生产者也会接受,但是交易可能需要最长1分钟才能找到生产者。为什么是一分钟,因为一分钟内交易可以在21个区块生产者之间流转一遍,如果还没有找到,那么这个交易就不会被打包了。 5.这种对计算、资源成本的主观评估将使区块链不必精确地去度量运行一个任务需要多长时间。有了这个设计,就不需要精确地数指令,这将极大地增加优化的机会,而不会打破“共识”。

配合学习笔记系列文章一起读会更好理解哦

林明潭blog
请先登录后发表评论
  • latest comments
  • 总共0条评论