代码走读(第一篇)---ethereumj之Repository快照功能

算法流光使
• 阅读 1118

这是《代码走读》的第一篇,这个系列用于记录阅读一些项目源码的过程。

ethereum有个replayBlock功能,就是将块放到指定的世界状态中,重新执行一次,获取执行结果。
这个功能依赖于能够获得指定块高时的世界状态,具体就是根据块hash获取块所在的Repository快照。

这个功能是依赖于世界状态的存储方式,具体来说就是账户的状态的存储方式。账户以叶子节点的形式存储在merklePatriciaTree(MPT)中,每个账户有个地址作为节点key,账户详情作为value,所有的账户节点构成一个MPT。MPT的root每笔交易执行完后,账户发生变化,重新构造一个节点。这个节点所在整条TreePath也将重新构造,这条TreePath(新)与原来的MPT连接,复用没有修改的数据,并生成新的stateRoot(这部分要根据参考中图理解)。

旧的所有状态保留,通过旧的stateRoot找到原来的MPT,因此可以实现开头所说的根据块hash找到对应的世界状态。

参考:

点赞
收藏
评论区
推荐文章
普通代码块 静态代码块 构造代码块......傻傻分不清
代码块的定义在Java中,使用括起来的代码被称为代码块。代码块的分类根据其位置和声明方式不同:面试题:构造块和静态块执行顺序在上面分类描述中,我们已经给出了答案;接下来我们跑一跑测试代码,根据代码执行结果来验证这些答案无继承关系javapackagecom.milo.java7.codeblock;/@authorMiloLee@d
Karen110 Karen110
3年前
一篇文章带你了解JavaScript While 循环
循环可以执行一个代码块,只要指定条件为真,循环就可以执行代码块。一、While循环while只要指定条件的值为真,循环就会执行指定语句。while循环的语法while(condition)statement//只要条件为真,就执行代码例:项目JavaScriptwhile语句只要n小于5,就遍历一段代码:varn0;while(n<
陈占占 陈占占
3年前
python if的选择结构与循环
语句块:可以执行一次或者多次的语句,以冒号为标记,缩进结束就是语句块结束的时候判断条件:以bool类型为标志的,当条件为真就执行,为假就跳过。if的基本结构:if条件:......else:......note:要用冒号来结束代码块,用缩进区分代码块。提示:i
Wesley13 Wesley13
3年前
Java并发编程:Lock
一.synchronized的缺陷synchronized是java中的一个关键字,也就是说是Java语言内置的特性。那么为什么会出现Lock呢?  在上面一篇文章中,我们了解到如果一个代码块被synchronized修饰了,当一个线程获取了对应的锁,并执行该代码块时,其他线程便只能一直等待,等待获取锁的线程释放锁
Wesley13 Wesley13
3年前
Unity中制作游戏的快照游戏支持玩家拍快照
Unity中制作游戏的快照游戏支持玩家拍快照有些游戏支持玩家“拍快照”,也就是将游戏的精彩瞬间以图片的形式记录下来的功能。这个功能比较有趣,而且以后的用途也会很广,为此本节打算介绍:截取矩形区域内游戏视图,并将其显示在视图其它区域的方法。具体的操作步骤如下本文选自Unity游戏开发技巧集锦:(1)在Pro
Wesley13 Wesley13
3年前
Java提高篇——静态代码块、构造代码块、构造函数以及Java类初始化顺序
静态代码块:用staitc声明,jvm加载类时执行,仅执行一次构造代码块:类中直接用{}定义,每一次创建对象时执行。执行顺序优先级:静态块,main(),构造块,构造方法。构造函数publicHelloA(){//构造函数}关于构造函数,以下几点要注意:1.对象一建立,就会调用与之相应的构造
小万哥 小万哥
1年前
深入解析 C 语言中的 for 循环、break 和 continue
C语言中的for循环当您确切地知道要循环执行代码块的次数时,可以使用for循环而不是while循环cfor(语句1;语句2;语句3)//要执行的代码块语句1在执行代码块之前执行(一次)。语句2定义执行代码块的条件。语句3在执行代码块后执行(每次)。下面的示
小万哥 小万哥
1年前
C# 循环与条件语句详解
CSwitch语句使用switch语句选择要执行的多个代码块中的一个。示例:csharpswitch(expression)casex://代码块break;casey://代码块break;default://代码块break;它的工作方式如下:1.评估
小万哥 小万哥
1年前
深入理解 Java 循环结构:while、do while、for 和 for-each 循环
Java循环循环可以执行一个代码块,只要达到指定的条件。循环很方便,因为它们节省时间,减少错误,并使代码更易读。JavaWhile循环while循环会循环执行一个代码块,只要指定的条件为真:语法javawhile(condition)//要执行的代码块在下
小万哥 小万哥
1年前
Python 异常处理:try、except、else 和 finally 的使用指南
异常处理当发生错误(或我们称之为异常)时,Python通常会停止执行并生成错误消息。try块用于测试一段代码是否存在错误。except块用于处理错误。else块用于在没有错误时执行代码。finally块用于无论try和except块的结果如何都要执行的代码
小万哥 小万哥
1年前
C 语言中的 switch 语句和 while 循环详解
C语言中的switch语句替代多重if..else语句,可以使用switch语句。switch语句用于选择多个代码块中的一个来执行cswitch(表达式)casex://代码块break;casey://代码块break;default://代码块工作原理