Neon 代理:跟踪 API

Duke
5 min readJun 8, 2022

--

Neon Labs 目前正在努力实现一个跟踪 API,以帮助开发人员更好地测试、调试和理解他们在 Neon EVM 上的智能合约。

该 API 将为开发人员提供对链上执行的任何交易的完整外部性跟踪。他们将能够重新运行历史交易,在历史状态上运行新交易,并在执行每条指令后分析区块链的状态。

跟踪 API 的组件

Tracing API 由三个主要组件组成:

  • 开发人员可以访问的 API 端点
  • 存储历史数据(交易、账户状态等)的数据库
  • 一个名为“Account Dumper”的 Solana 节点扩展

跟踪 API 为开发人员提供什么

Neon Labs 的 Tracing API 实现为用户提供了一组函数来获取交易执行的痕迹。这些功能允许用户在区块链的历史状态上执行交易(新的或旧的),或重新执行所需的历史交易。跟踪信息作为 JSON 对象返回,并包含在请求的事务期间执行的完整指令/操作集。(此响应主要与跟踪方法的 Geth 和 OpenEth 实现兼容。)这些指令/操作包括将数据放入堆栈、乘法、加法、除法等。此外,EVM 堆栈的状态和目标智能合约的存储在每个之后指令/操作被保存并作为跟踪的一部分提供。

跟踪 API 的底层

如上所述,Tracing API 由三个主要组件组成。除了这些主要组件之外,Tracing API 还包含一个名为 Account Storage 的接口的实现,以及一个扩展为生成跟踪的 Neon EVM 模拟器。Account Storage 是一个接口,允许 VM 访问 Solana 帐户中的数据。该接口也在 Neon EVM 内核和 Neon 代理中实现。

Tracing API 端点被实现为 Neon 代理节点提供的一组扩展函数,这与 OpenEthereum 的一组类似函数的实现相当。

为了捕获 Neon EVM 的历史信息,Tracing API 依赖于 Account Dumper 和 Database Storage 组件。Account Dumper 在名为“消息处理器”的 Solana 组件中运行,该组件在验证器节点中执行所有交易。Account Dumper 不断过滤交易流以搜索 Neon EVM 交易。当一个 Neon 交易被识别时,Account Dumper 会记录区块链执行前后的账户状态。然后,与每笔交易相关的账户状态和 Solana 指令将被写入收集历史信息的数据库中。该信息按块编号进行索引,并且可以通过 Tracing API 函数轻松访问。

当用户调用 Tracing API 函数时,会创建一个 Account Storage 实例来重建给定块号的帐户状态,或与所需交易先决条件相关联的帐户状态,具体取决于请求的类型。此操作中使用的信息是从历史信息数据库中提取的。然后将重建的帐户状态与要执行的所需交易一起传递给 Neon EVM 核心。事务可以通过两种方式传递到 EVM 核心:

  • 直接:用户将包含要执行的交易数据,通常用于在历史区块链状态上运行新交易。
  • 间接:用户将通过交易 ID 指定要运行的历史交易。

上述执行产生的跟踪信息作为 JSON 对象返回给用户。此信息未存储/持久。

跟踪 API 端点的描述

下面的 Trace 函数模拟两个不同的接口。以“debug_”开头的函数模拟 Gth 接口,以“trace_”开头的函数模拟 OpenEth 接口。

debug_traceCall 和 trace_rawTransaction:这些函数以 JSON 对象的形式返回新事务的跟踪。返回的 JSON 包括有关在请求的事务中指令执行的每个阶段 EVM 中的更改的信息。

trace_transaction 和 trace_replayTransaction:这些函数以 JSON 对象的形式返回链上已经发生的历史交易的跟踪。用户使用交易 ID 指定历史交易。返回的 JSON 包括有关在请求的事务中指令执行的每个阶段 EVM 中的更改的信息。

debug_traceBlockByNumber 和 trace_replayBlockTransactions:这些函数重播链上已经发生的整个块。对于这些功能,Tracing API 将在给定区块中的每笔交易之前恢复区块链账户状态,并按顺序重放每笔交易。返回的 JSON 包括有关在请求的事务中指令执行的每个阶段 EVM 中的更改的信息。

除了上述 Trace 功能外,Tracing API 还包括许多扩展,这些扩展模拟了通过 EIP-1898 引入以太坊的附加功能。这些功能也在给定的区块号上执行,允许用户获取历史区块链数据或调用过去的交易。

eth_call:在历史区块链状态上执行新交易。该函数仅返回执行的最终结果(已执行合约的值)。

eth_getStorageAt:从给定地址的帐户存储位置返回值(帐户存储状态)。

eth_getBalance:返回给定地址的账户余额。

eth_getCode:返回给定地址的帐户中的代码。此函数返回已编译字节码的字符串值。

eth_getTransactionCount:返回从给定地址发送的交易数量。

Neon 团队随时为您提供帮助

如果这篇文章让您还有其他问题,请通过Discord联系我们的团队。我们非常乐意帮助回答有关 Tracing API 的任何问题,并解释它如何帮助开发人员更好地了解 Neon EVM 上的智能合约操作。

--

--