eth_debugTransaction 官方文档(中文翻译)

2024-04-18 12:18

本文主要是介绍eth_debugTransaction 官方文档(中文翻译),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

debug namespance

文章目录

  • debug namespance
    • eth_debugTransaction
        • 客户端方法调用
        • JavaScript-based tracing
          • Step

eth_debugTransaction

traceTransaction 调试方法将尝试以与在网络上执行的完全相同的方式运行事务。在最终尝试执行与给定散列对应的事务之前,它将重放在此事务之前可能已执行的任何事务。

除了交易的哈希值之外,您还可以给它一个次要的可选参数,用于指定此特定调用的选项。可能的选项是:

  • disableStorage: BOOL. 将此设置为 true 将禁用存储捕获 (default = false).
  • disableMemory: BOOL. 将此设置为 true 将禁用内存捕获 (default = false).
  • disableStack: BOOL. 将此设置为 true 将禁用堆栈捕获 (default = false).
  • tracer: STRING. 设置此项将启用基于 JavaScript 的事务跟踪,如下所述。如果设置,前四个参数将被忽略。
  • timeout: STRING. 覆盖基于 JavaScript 的跟踪调用的默认超时 5 秒。 此处 描述了有效值。
客户端方法调用
版本
Godebug.TraceTransaction(txHash common.Hash, logger *vm.LogConfig) (*ExecutionResurt, error)
Consoledebug.traceTransaction(txHash, [options])
RPC{"method": "debug_traceTransaction", "params": [txHash, {}]}
JavaScript-based tracing

在第二个参数中指定 tracer 选项将启用基于 JavaScript 的跟踪。 在这种模式下,跟踪器被解释为一个 JavaScript 表达式,该表达式预期评估为必须公开结果和错误方法的对象。存在 3 种额外的方法,namely: step, enter and exit.您必须提供任一步骤,或输入 AND 退出。(即这两个必须一起暴露)。如果您选择这样做,您可以公开所有三个。

Step

step 是一个函数,它接受两个参数 log 和 db,并在 EVM 的每个步骤或发生错误时调用,用于跟踪指定的事务。

log 具有以下字段:

  • op: Object,表示当前操作码的 OpCode 对象
  • stack: array[big.Int],EVM 执行栈
  • memory: 对象,表示合约内存空间的结构
  • contract: Object,代表执行当前操作的账户的对象

以及以下方法::

  • getPC() - 返回一个带有当前程序计数器的数字
  • getGas() - 返回一个带有剩余气体量的数字
  • getCost() - 以数字形式返回操作码的成本
  • getDepth() - 以数字形式返回执行深度
  • getRefund() - 以数字形式返回要退还的金额
  • getError() - 如果发生错误,则返回有关错误的信息,否则返回 undefined
    如果 error 非空,则应忽略所有其他字段。

为提高效率,在每个执行步骤中重复使用相同的日志对象,并使用当前值进行更新;确保复制要在当前调用之外保留的值。例如,这个 step 函数将不起作用:

function(log) {this.logs.append(log);
}

But this step function will:

function(log) {this.logs.append({gas: log.getGas(), pc: log.getPC(), ...});
}

log.op 有以下方法:

  • isPush() - 如果操作码是 PUSHn,则返回 true
  • toString() - 返回操作码的字符串表示
  • toNumber() - 返回操作码的编号

log.memory 有以下方法:

  • slice(start, stop) - 将指定的内存段作为字节切片返回
  • getUint(offset) - 返回给定偏移量处的 32 个字节

log.stack has the following methods:

  • peek(idx) - 返回栈顶的第 idx 个元素(0 是最顶层的元素)作为 big.Int
  • length() - 返回堆栈中元素的数量

log.contract has the following methods:

  • getCaller() - 返回调用者的地址
  • getAddress() - 返回当前合约的地址
  • getValue() - 返回从调用者发送到合约的价值量作为 big.Int
  • getInput() - 返回传递给合约的输入数据

db has the following methods:

  • getBalance(address) - 返回一个带有指定账户余额的 big.Int
  • getNonce(address) - 返回一个带有指定账户随机数的数字
  • getCode(address) - 返回带有指定帐户代码的字节切片
  • getState(address, hash) - 返回指定帐户和指定哈希的状态值
  • exists(address) - 如果指定的地址存在,则返回 true

如果 step 函数在任何时候抛出异常或执行非法操作,则不会在任何进一步的 VM 步骤上调用它,并将错误返回给调用者。

Result
result 是一个函数,它接受两个参数 ctx 和 db,并期望返回一个 JSON 可序列化的值以返回给 RPC 调用者。

ctx 是事务执行的上下文,具有以下字段:

  • type - 字符串,CALL 和 CREATE 两个值之一
  • from - 地址,交易发送方
  • to - 地址、交易目标
  • input - 缓冲区,输入交易数据
  • gas - 数量,交易的gas预算
  • value - big.Int,要转入wei的金额
  • block - 编号,块编号
  • output - 缓冲区,从 EVM 返回的值
  • gasUsed - 数量,执行交易时使用的 gas 数量(不包括 txdata 成本)
  • time - 字符串,执行运行时

Fault
fault 是一个带有两个参数 log 和 db 的函数,就像 step 一样,当在 step 中未报告的操作码执行期间发生错误时调用它。方法 log.getError() 包含有关错误的信息。

Enter & Exit
enter 和 exit 分别在进入和退出内部调用时被调用。更具体地说,它们在 CALL 变体、CREATE 变体以及 SELFDESTRUCT 隐含的传输上被调用。

enter 将 callFrame 对象作为参数,它具有以下方法:

  • getType() - 返回一个具有调用帧类型的字符串
  • getFrom() - 返回调用帧发送者的地址
  • getTo() - 返回调用帧目标的地址
  • getInput() - 将输入作为缓冲区返回
  • getGas() - 返回一个数字,其中包含为框架提供的气体量
  • getValue() - 仅在可用时返回一个 big.Int,其中包含要转移的金额,否则未定义

exit 接受一个 frameResult 对象,该对象具有以下方法:

  • getGasUsed() - 以数字形式返回整个框架中使用的气体量
  • getOutput() - 将输出作为缓冲区返回 -getError() - 如果在执行期间发生错误则返回错误,否则返回 undefined

Usage

请注意,有几个值是 Golang big.Int 对象,而不是 JavaScript 数字或 JS bigint。因此,它们具有与 godocs 中描述的相同的接口。它们默认的 JSON 序列化是一个 Javascript 数字;序列化大数字准确地调用 .String() 。为方便起见,提供了 big.NewInt(x),并将 uint 转换为 Go BigInt。

用法示例,仅在每个 CALL 操作码处返回堆栈的顶部元素:

debug.traceTransaction(txhash, {tracer: '{data: [], fault: function(log) {}, step: function(log) { if(log.op.toString() == "CALL") this.data.push(log.stack.peek(0)); }, result: function() { return this.data; }}'});

这篇关于eth_debugTransaction 官方文档(中文翻译)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!


原文地址:
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.chinasem.cn/article/914757

相关文章

C#实现将Office文档(Word/Excel/PDF/PPT)转为Markdown格式

《C#实现将Office文档(Word/Excel/PDF/PPT)转为Markdown格式》Markdown凭借简洁的语法、优良的可读性,以及对版本控制系统的高度兼容性,逐渐成为最受欢迎的文档格式... 目录为什么要将文档转换为 Markdown 格式使用工具将 Word 文档转换为 Markdown(.

详解如何使用Python构建从数据到文档的自动化工作流

《详解如何使用Python构建从数据到文档的自动化工作流》这篇文章将通过真实工作场景拆解,为大家展示如何用Python构建自动化工作流,让工具代替人力完成这些数字苦力活,感兴趣的小伙伴可以跟随小编一起... 目录一、Excel处理:从数据搬运工到智能分析师二、PDF处理:文档工厂的智能生产线三、邮件自动化:

Python实现自动化Word文档样式复制与内容生成

《Python实现自动化Word文档样式复制与内容生成》在办公自动化领域,高效处理Word文档的样式和内容复制是一个常见需求,本文将展示如何利用Python的python-docx库实现... 目录一、为什么需要自动化 Word 文档处理二、核心功能实现:样式与表格的深度复制1. 表格复制(含样式与内容)2

Maven项目中集成数据库文档生成工具的操作步骤

《Maven项目中集成数据库文档生成工具的操作步骤》在Maven项目中,可以通过集成数据库文档生成工具来自动生成数据库文档,本文为大家整理了使用screw-maven-plugin(推荐)的完... 目录1. 添加插件配置到 pom.XML2. 配置数据库信息3. 执行生成命令4. 高级配置选项5. 注意事

Python使用python-docx实现自动化处理Word文档

《Python使用python-docx实现自动化处理Word文档》这篇文章主要为大家展示了Python如何通过代码实现段落样式复制,HTML表格转Word表格以及动态生成可定制化模板的功能,感兴趣的... 目录一、引言二、核心功能模块解析1. 段落样式与图片复制2. html表格转Word表格3. 模板生

ubuntu系统使用官方操作命令升级Dify指南

《ubuntu系统使用官方操作命令升级Dify指南》Dify支持自动化执行、日志记录和结果管理,适用于数据处理、模型训练和部署等场景,今天我们就来看看ubuntu系统中使用官方操作命令升级Dify的方... Dify 是一个基于 docker 的工作流管理工具,旨在简化机器学习和数据科学领域的多步骤工作流。

浅谈Redis Key 命名规范文档

《浅谈RedisKey命名规范文档》本文介绍了Redis键名命名规范,包括命名格式、具体规范、数据类型扩展命名、时间敏感型键名、规范总结以及实际应用示例,感兴趣的可以了解一下... 目录1. 命名格式格式模板:示例:2. 具体规范2.1 小写命名2.2 使用冒号分隔层级2.3 标识符命名3. 数据类型扩展命

使用Python从PPT文档中提取图片和图片信息(如坐标、宽度和高度等)

《使用Python从PPT文档中提取图片和图片信息(如坐标、宽度和高度等)》PPT是一种高效的信息展示工具,广泛应用于教育、商务和设计等多个领域,PPT文档中常常包含丰富的图片内容,这些图片不仅提升了... 目录一、引言二、环境与工具三、python 提取PPT背景图片3.1 提取幻灯片背景图片3.2 提取

Android实现在线预览office文档的示例详解

《Android实现在线预览office文档的示例详解》在移动端展示在线Office文档(如Word、Excel、PPT)是一项常见需求,这篇文章为大家重点介绍了两种方案的实现方法,希望对大家有一定的... 目录一、项目概述二、相关技术知识三、实现思路3.1 方案一:WebView + Office Onl

Python实现word文档内容智能提取以及合成

《Python实现word文档内容智能提取以及合成》这篇文章主要为大家详细介绍了如何使用Python实现从10个左右的docx文档中抽取内容,再调整语言风格后生成新的文档,感兴趣的小伙伴可以了解一下... 目录核心思路技术路径实现步骤阶段一:准备工作阶段二:内容提取 (python 脚本)阶段三:语言风格调