首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

虾说区块链-70-以太坊六

一直在说区块链是一系列技术结合后的新的技术架构,那么这里分别介绍下这些相关技术,也涉及到一些扩展开去的相关内容。

区块链-以太坊六:

以太坊:

以太坊理解为一套协议,那么这个协议建立了一个去中心化的平台,这个平台的核心为EVM。EVM是图灵完备,可以执行任意算法复杂度的代码,这就意味着类似python等变成语言可以创建并且运行在其上(solidity)。

当然现在听到更多是以太坊是一个“世界计算机”,这个说法一直很流行,那么理解世界计算机,以太坊是一个区块链系统,区块链系统在网络中每个节点通过P2P协议,执行本地数据库副本连接到多个节点进行更新维护。那么每个节点上都运行着EVM,并且所有的EVM都会执行相同的指令。这个也就理解了为什么说以太坊是一个世界计算机。网络中所有节点执行相同的并行计算。会有人提出来,这样不是导致了资源的浪费。区块链系统中每个节点的并行计算的目的是不是为了更高的系统执行效率,相反你在区块链上计算执行过程可能需要大量的时间,并且需要支付一定的成本。节点在运行EVM的目的为了保证一致性。一致性在分布式系统的就尤为关键。那么在区块链中一致性保证了系统的很高的一个容错性,众多副本一致性的冗余,理论上只要有正常运行的节点,那么就能实现永不宕机。

这里简单介绍下EVM:

以太坊虚拟机是执行交易代码的引擎。设计目标如下:

(参考以太坊设计原理:

简单(simplicity):以太坊中虚拟机操作码要求尽量少并且低级,数据类型尽可能少,虚拟机的结构尽可能少。

确定(determinism):在虚拟机规范语句中,没有任何可能产生歧义的空间,结果应该是完全确定的。此外,计算步骤应该是精确的,以便可以测量gas的消耗量。

空间节约:EVM组件应尽可能紧凑。

预期应用应具备专业化能力:在VM上构建的应用应能处理20字节的地址,以及32位的自定义加密值,拥有用于自定义加密的模数运算、读取区块和交易数据与状态交互等能力。

安全简单:为了让VM不被利用,应该能够容易地让建立一套gas消耗成本模型的操作。

易于优化:应该易于优化,以便即时编译(JIT)和VM的加速版本能够构建出来。

以太坊EVM内存分配:

EMV中三哥存储数据分别为:栈(stack)、临时存储和永久存储。

明确两个概念:

临时存储(temporary memory):存在于VM的每个实例中,并在VM执行结束后消失。永久存储(permanent memory):存在于区块链状态层。

假设执行下面的树(S代表永久存储,M代表临时存储):

1.A调用B;

2.B设置B.S[0]=5,B.M[0]=9 ;

3.B调用C;

4.C调用B。

此时,如果B试图读取B.S[0],它将得到B前面存入的数据,也就是5;但如果B试图读取B.M[0],它将得到0,因为B.M是临时存储,读取它的时候是虚拟机的一个新的实例。

在一个内部调用中,如果设置B.M[0] = 13和 B.S[0] = 17,然后内部调用和C的调用都终止,再执行B的外部调用,此时读取M,将会看到B.M[0]= 9(此值在上一次同一VM执行实例中设置的),B.S[0] = 17。如果B的外部调用结束,然后A再次调用B,将看到B.M[0]= 0,B.S[0]= 17。

这个区别的目的是:1.每个执行实例都分配有内存空间,不会因为循环调用而减损,这让安全编程更加容易。2.提供一个能够快速操作的内存形式:因为需要修改树,所以存储更新必然很慢。

栈/内存模式:

早期,计算状态有三种:栈(stack,一个32字节标准的LIFO),内存(memory,可无限扩展的临时字节数组),存储(storage,永久存储)。在临时存储端,栈和内存的替代方案是memory-only范式,或者是寄存器和内存的混合体(两者区别不大,寄存器本质上也是一种内存)。在这种情况下,每个指令都有三个参数,例如:ADD R1 R2 R3: M[R1] = M[R2] +M[R3]。选择栈范式的原因很明显,它使代码缩小了4倍。

单词大小32字节:

在大多数结构中,如比特币,单词大小是4或8字节。4或8字节对存储地址或加密计算来说局限性太大了。而太大的值又很难建立相应安全的gas模型。32字节是一个理想大小,因为它足够存储下许多加密算法的实现以及地址,又不会因为太大而导致效率低下

使用了可变、可扩展的内存大小:

固定内存的大小是不必要的限制,太小或太大都不合适。如果内存大小是固定的,每次访问内存都需要检查访问是否超出边界,显然这样的效率并不高。

1024调用深度限制:

许多编程语言在栈的深度过大时触发中断比在内存过载时触发中断的策略要快的多。所以区块中gas限制所隐含的限制是不够的。

无类型:

为了简单起见,可以使用DIV, SDIV, MOD, SMOD的有符号或无符号的操作码代替(事实证明,对于操作码ADD和MUL,有符号和无符号是对等的);转换成定点运算在所有情况下都很简单,例如,在32位深度下,a * b -> (a * b) / 2^32, a /b-> a * 2^32 / b ,+, - 和 * 在整数下不变

本文由币乎(bihu.com)优质内容计划支持。

之前写了点东西,随着对区块链的理解,发现有些理解的并不透彻,重新整理。如有理解不正确的地方,请及时指正,同时有兴趣一块交流的可以加笔者微信:

  • 发表于:
  • 原文链接http://kuaibao.qq.com/s/20180122B0B0BM00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券