首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >当调用Ethereum合同函数时,在“罩下”发生什么顺序?

当调用Ethereum合同函数时,在“罩下”发生什么顺序?
EN

Ethereum用户
提问于 2018-08-29 05:32:24
回答 1查看 519关注 0票数 4

似乎当一个函数被调用时,Ethereum虚拟机:

  1. 对异常/错误进行“呼叫前检查”。
  2. 计算所需气体的数量,检查所涉及的帐户是否存在。
  3. 获取函数参数。
  4. 在内存中创建调用数据缓冲区&返回数据缓冲区,如py-evm代码中巧妙描述的那样:
  1. 使用Gas并通过堆栈操作和操作代码执行计算。(SideQuestion:堆栈操作和操作代码都存储在Virtual代码中吗?)
  2. 看起来,evm执行“第一遍”操作,将值和指针添加到堆栈到堆栈的内存中,根据需要使用便签中。(不确定这个^过程?)
  3. 然后,一旦函数完成/返回,EVM就会丢弃内存(包括2个缓冲区)&堆栈帧数据。

主要来源:evm‘s py-evm,即https://github.com/ethereum/py-evm/blob/0ff7bc0f820250d7f15e804bc09870776ea34eb5/eth/vm/logic/call.py

我在这里错过了什么?

当我在Remix上看到堆栈时,EVM似乎是“第一次”将函数所需的内容加载到函数的堆栈+内存中,这是正确的吗?这是否被称为函数的调用堆栈/调用帧?

似乎许多开发人员,包括我自己,都不清楚这“在幕后”的顺序。谢谢。

EN

回答 1

Ethereum用户

发布于 2018-09-09 22:49:37

EVM实现在如何完成任务方面会有差异,但是如果它们符合黄纸,那么它们都应该产生相同的结果。我看了一下EthereumJS - runCode.js的VM代码,我在下面概述了这些代码。您还可以使用这些资源来了解如何实现VM:

下面是我对EthereumJS的核心VM代码流的理解,这是一种可以对Ethereum进行编码的方法。您正在查看的python代码可能有相似之处。

  1. 给定以下输入,执行VM:
    • 要运行的代码
    • 正在执行此代码的帐户的地址。
    • 发出电话的地址。
    • 运行此代码的地址
    • 正在执行的代码所属的帐户
    • 事务所包含的块。
    • the gasLimit
    • 输入数据
    • 价值-被转移的金额

  2. 对于当前运行状态,预处理有效跳转并将它们放入数组(这可能是一种优化)。
  3. 迭代操作码,直到我们遇到错误或我们点击停止。
  4. 对于每次迭代,维护状态为:
    • programCounter,
    • 气体残留,
    • 当前操作码,
    • 堆叠,
    • 深度,
    • 地址,
    • 账户,
    • stateManager.cache,
    • 内存

  5. 查找当前操作码并获取操作码信息:
    • 名字
    • 操作码
    • 费用(煤气费用)
    • 在……里面
    • 输出
    • 动态
    • 异步

  6. 验证以下内容,如果无效则返回:
    • 有效操作码
    • 进出导致堆栈溢出或下溢
    • 剩下的汽油足够支付操作码费了

  7. 先进programCounter
  8. 在堆栈上推送运行状态
  9. 运行操作码函数(在opFns.js中找到)
  10. 如果没有错误:将结果保存到堆栈
  11. 如果错误或还原:消耗气体
  12. 解析VM结果并返回:
    • 日志(如果没有错误)
    • 煤气左转及汽油退款
    • 任何错误
    • 任何返回值
票数 3
EN
页面原文内容由Ethereum提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://ethereum.stackexchange.com/questions/57654

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档