前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >2018-03-22 以太坊EVM虚拟机代码阅读

2018-03-22 以太坊EVM虚拟机代码阅读

作者头像
oracle3
发布2022-05-13 15:15:37
3440
发布2022-05-13 15:15:37
举报

以太坊EVM虚拟机代码阅读

1、 类图

整体来说,整个以太坊evm的实现主要是依赖3个类,分别是VM,Program和ProgramInvokeImpl,这里VM是虚拟机的主调用类,VM中的执行功能依靠Program来实现,Program需要调用的外部接口依靠ProgramInvokeImpl;

2、 初始化

代码语言:javascript
复制
                ProgramInvoke programInvoke =
                        programInvokeFactory.createProgramInvoke(tx, currentBlock, cacheTrack, blockStore);
                this.vm = new VM(config);
                this.program = new Program(track.getCodeHash(targetAddress), code, programInvoke, tx, config).withCommonConfig(commonConfig);

第一句用来创建ProgramInvokeImpl,第二句创建VM,第三句创建Program

3、 VM实现

VM只有3个函数,VM构造函数,step单步执行功能,play全部执行功能,而play是循环调用step实现,step比较复杂,内部通过调用Program实现

这里实际上就是每执行一步就先收gas,然后才执行操作,我们把以太坊指令分类,可以得到下面的表格:

以太坊的全部指令集也就这么多种类,就这样全部实现了。

如果从play函数来看,解析指令使用的方法是译码分派(decode-and-dispatch)方式,它是围绕一个主循环来组织的,要解析一条指令,就将其分配到属于该指令类型的解析程序。

4、 Program的实现

Program如前所说实际是个大的集合,实现了对内对外的调用,自己独立要处理的其实只有合约代码数据,指针,以及各种操作的包装。对指针的操作就是指针的获取,设置,下一步等;对数据的操作就是读取操作码,复制数据了

5、 ProgramInvokeImpl的实现

ProgramInvokeImpl实现主要是创建的时候记录了交易信息,块信息,和记录了外部的两个接口类Repository和BlockStore;

BlockStore可以获取块信息或做一些操作,但是虚拟机里面只是调用了通过块号获取块hash的功能

Repository类可以创建或删除账户,获取或设置账户状态,设置账户合约,存储账户相关的数据等操作

如果移植evm关键地方就是外部环境要提供这两个接口类的功能。实际就是要求平台支持账户模型。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022-05-13,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 以太坊EVM虚拟机代码阅读
    • 1、 类图
      • 2、 初始化
        • 3、 VM实现
          • 4、 Program的实现
            • 5、 ProgramInvokeImpl的实现
            相关产品与服务
            对象存储
            对象存储(Cloud Object Storage,COS)是由腾讯云推出的无目录层次结构、无数据格式限制,可容纳海量数据且支持 HTTP/HTTPS 协议访问的分布式存储服务。腾讯云 COS 的存储桶空间无容量上限,无需分区管理,适用于 CDN 数据分发、数据万象处理或大数据计算与分析的数据湖等多种场景。
            领券
            问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档