轨迹解析器
轨迹解析器(trace parser)的作用是将EVM程序的执行轨迹(trace)转换成零知识证明电路可以处理的数据结构。以下是对其工作过程的详细描述:
输入格式
我们选择了trace的JSON输出格式,以便于程序处理。trace文件的格式是.jsonl,每一行代表执行的一步,包含一个json格式的trace。每一步的格式如下:
- pc: 程序计数器(Program Counter)
- op: 操作码(Opcode)
- gas: 剩余的gas量
- gasCost: 本步骤的gas消耗
- depth: 调用深度
- stack: 当前的堆栈状态
- memory: 当前的内存状态
- storage: 当前的存储状态
解析过程
轨迹解析器逐行读取轨迹文件中的每一步,解析其JSON数据,然后转化为电路的输入——证据Witness。以下是解析过程的详细步骤:
-
读取轨迹文件:
- 轨迹解析器读取.jsonl格式的轨迹文件。
- 每一行都是一个JSON格式的trace,表示EVM程序执行过程中的一步。
-
解析JSON数据:
- 轨迹解析器解析每一行的JSON数据。
- 提取其中的字段:pc、op、gas、gasCost、depth、stack、memory、storage。
-
转化为Witness表格:
- 根据解析的JSON数据,依照我们的witness设计,将其转化为witness表格中的相应数据。
- 将每一步的数据映射到零知识证明电路可以处理的格式中。
示例
假设我们有以下一行JSON格式的trace:
{
"pc": 0,
"op": "PUSH1",
"gas": 1000000,
"gasCost": 3,
"depth": 1,
"stack": [],
"memory": [],
"storage": {}
}
轨迹解析器的处理步骤如下:
-
读取轨迹文件:
- 读取到上述JSON数据行。
-
解析JSON数据:
- 提取字段:
-
pc
: 0 -
op
: "PUSH1" -
gas
: 1000000 -
gasCost
: 3 -
depth
: 1 -
stack
: [] -
memory
: [] -
storage
: {}
-
- 提取字段:
-
转化为Witness表格:
- 将提取的数据映射到witness表格中。
- 例如,将
pc
映射到 witness 表格的pc
列,将op
映射到opcode
列,依次类推。
总之,轨迹解析器通过解析EVM执行轨迹的JSON数据,将其转化为零知识证明电路可以处理的witness数据结构。这个过程包括读取轨迹文件、解析JSON数据、并将数据映射到witness表格中,从而使得零知识证明电路能够利用这些数据进行证明。