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

虾说区块链-73-以太坊九

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

区块链-以太坊九:

以太坊:

以太坊中交易执行模式:

参考:以太坊工作原理

https://baijiahao.baidu.com/s?id=1581231980661527205&wfr=spider&for=pc

以太坊中交易从开始到结束需要经过一系列的步骤,在EVM中执行。之前解释过EVM是一个图灵完备的虚拟机,和其他的虚拟机稍有不同,在EVM中执行过程中通过gas来控制,防止恶意和错误的执行操作。简而言之,执行需要成本,gas就是总量约束整个执行过程。所以一直有人说在以太坊上操作存储是需要一定成本,本身也是相对来说比较昂贵。下图表示比较明了:

EVM是基于堆栈的架构,学过计算机数据结构的应该清楚,堆栈是后进先出的模式,来保存临时值。在EVM中每个堆栈顶大小为256位,最大的大小为1024位。EVM中的内存,按照可寻址字节数来存储,内存不是硬盘,在内存中数据是易丢失的,不持久。当然EVM中肯定也存在一个存储器,类似硬盘,是不易丢失的,作为系统状态的一部分来进行维护。

EVM分开保存程序代码,在虚拟的ROM中通过特殊指令来访问。

EVM有自己的EVM字节码,就是常听到的Solidity,来编写代码。

执行过程:

首先是一个系统的状态确认:用于计算的gas量,执行代码的账户地址,触发执行的发起者的地址,触发代码执行的账户地址,触发交易的gas价格,执行的数据,value转账,执行的机器码,当前区块的区块头,当前消息通信或者合约创建堆栈的深度,初始化时候内存和堆栈都是空,计数器为0.

EVM开始递归的执行交易,同时循环计算系统和机器的状态。

系统状态:以太坊的全局状态,global state。

机器状态:可获取的gas,程序计数器,内存中的内容,内存中字节的活跃数,堆栈内容,堆栈中内容从左开始被删除或者是添加,每次循环剩余的gas减少,程序计数器增加。

在循环结束时候,三种状态:

1.gas不足,指令无效,堆栈顶不足、溢出1024,无效的目的地等,导致机器状态异常,即停止,丢弃之前的任何修改。

2.机器达到执行过程终点,没有发生异常,那么就计算执行后的剩余gas,产生的子状态,组合输出。

3.进入下一个循环处理。

块的生成:

块中包含交易,是记录数据的最重要组成部分。在以太坊中块的生成验证有下述4个要求:

1.验证ommers,在区块头中的每个ommer必须是有效的头且必须在当前块的6个之内。

2.验证交易,区块中gasused总量必须和交易中使用的gas量相等,通过跟踪区块的gas计数器,来确定gas的总量。

3.申请奖励,和bitcoin一样,区块的生成会有区块奖励,以太坊中挖矿获得5ether的奖励,对于另外ommer获得当前的1/32的奖励。

4.校验状态和nonce,确保最终的交易和状态应用后,在区块奖励应用于最终交易结果验证定义一个新块的状态,那么检查最终状态和头中的状态树来验证。

以太坊白皮书中对EVM代码的解释:

EVM代码的正式执行模型令人惊讶地简单。当以太坊虚拟机运行时,它的完整的计算状态可以由元组(block_state, transaction, message, code, memory, stack, pc, gas)来定义,这里block_state是包含所有账户余额和存储的全局状态。每轮执行时,通过调出代码的第pc(程序计数器)个字节,当前指令被找到,每个指令都有定义自己如何影响元组。例如,ADD将两个元素出栈并将它们的和入栈,将gas(瓦斯)减一并将pc加一,SSTORE将顶部的两个元素出栈并将第二个元素插入到由第一个元素定义的合约存储位置,同样减少最多200的gas值并将pc加一,虽然有许多方法通过即时编译去优化以太坊,但以太坊的基础性的实施可以用几百行代码实现。

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

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

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

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券