以太坊状态转换流程分析

以太坊的本质就是一个基于交易的状态机,从创世状态开始,每次执行block的交易后,状态被修改成最新的的最终状态,在任何时刻这个最终状态都代表着以太坊当前的最新状态。

状态转换示意如下图:

image
  • 状态数据实际上也是保存在block上的状态树中的。
  • 创世状态里面记录了创世文件初始化的账户数据及其他状态数据,每次生成一个block,执行其中的交易,修改状态数据,并以增量修改的方式记录在最新的block的状态树中。
  • 被最终确认后的block(包括状态)保证永久无法被篡改(符合拜占庭容错的条件下)。
  • 上图中最新的以太坊状态是执行blockN+1中的所有交易后的世界状态。
  • 此时如果本地矿工从交易池中挖到最新的候选block, 或者其他矿工挖到最新的block并在本矿工挖到之前通过该候选block过来,在验证block中的所有打包交易有效性之后,执行该后选block中所有交易。
  • 执行交易的过程就是虚拟机EVM执行交易中的合约代码的过程,全部执行完成后,将被修改的状态记录到候选block的状态树上,然后将该候选block进行上链,包括解决分叉,持久化block数据,更新才能的数据等。

和状态转换相关的最重要的2个接口是:

  • apply_block(state,block): block级的状态转换
  • apply_transaction(state,tx): 一个交易执行的状态转换

apply_block(state,block)

image
  1. 首先做好state的备份,方便后面转换过程中出现失败时进行回滚;
  2. 为了更加通用化处理,抽象出共识策略的接口,用户可以自定义共识策略,目前支持PoW,PoA共识策略;
  3. 共识策略的初始化的工作是。。。
  4. 验证block头数据的有效性;
  5. 验证共识相关的数据的有效性, 例如PoA共识中extra字段有相应的格式要求;
  6. 对叔块的一些验证,因为入股哦该block最终被确认的话, 叔块也是可以获得相应的奖励;
  7. 交易树是一个merkle树,交易最终生成一个nerkle根hash,如果和block中记录的hash‘值不一致,说明交易数据被篡改,该block是非法的;
  8. 执行block中的所有交易,也就是状态转换, 详见下面小节;
  9. 状态转换完成后,对旷工和叔块的旷工进行奖励;计算方法是:
  10. 验证交易的执行结果,bloom位图保存合约执行中产生的事件,收据树保存交易执行结果hash;
  11. block本身的数据也保存到state中;
  12. 至此完成整个block的状态转换工作;

apply_transaction(state,tx)

image
  1. 执行每个block中的交易时修改的状态是一个增量修改,因此state中的logs(交易产生的事件)和suicides(执行“自杀”代码的事件记录),refunds(eth退款)字段只记录本block执行后的结果;
  2. 验证交易的有效性,交易的sender(从前民中恢复出账户地址和from参数比较),交易的编号(每一笔sender发出的交易有一个唯一的数字,是连续自增的整数),交易的gas(sender是否有足够的资金支付本次交易的gas费用);
  3. 如果是一个创建合约的交易,还要扣除而外的gas费用;
  4. 后面是交易中合约的执行以及gas费用的计算和扣除的工作;

apply_msg(ext,msg)

其中apply_msg是执行该交易的过程:

这里特殊合约的执行和一般合约代码的执行都是在虚拟机中完成的,详见<虚拟机的实现分析>一文。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,332评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,508评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,812评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,607评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,728评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,919评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,071评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,802评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,256评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,576评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,712评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,389评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,032评论 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,798评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,026评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,473评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,606评论 2 350

推荐阅读更多精彩内容

  • 以太坊(Ethereum ):下一代智能合约和去中心化应用平台 翻译:巨蟹 、少平 译者注:中文读者可以到以太坊爱...
    车圣阅读 3,732评论 1 7
  • 以太坊白皮书地址:https://github.com/ethereum/wiki/wiki/White-Pape...
    rectinajh阅读 17,802评论 0 46
  • 【中文版】以太坊白皮书 翻译:少平、 Seven当中本聪在 2009 年 1 月启动比特币区块链时,他同时向世界引...
    __Seven__阅读 4,163评论 0 10
  • 简介 不管你们知不知道以太坊(Ethereum blockchain)是什么,但是你们大概都听说过以太坊。最近在新...
    Lilymoana阅读 3,889评论 1 22
  • 今天想约下同在花都的同学,她今年生了女儿,都还没去看过她,大家工作后在一起少之又少,连平时的联络也很少,都忙着各自...
    子茹阅读 211评论 0 0