Stark 1011. 计算轨迹

计算轨迹是 Stark 的第一步,也是最简单的一步,但是最为重要的一步。
但是在章节开始之前,你需要必须 🚨掌握以下前置知识:

以上内容均为超级精简版,强烈推荐看一遍。

计算轨迹(Trace)

💡

什么是Trace? Trace,实际为execution trace,是程序在执行过程中生成的中间值,我们在计算的过程中,难免会有很多中间值,比如临时变量,函数返回值,等等。 Trace则是计算过程中所有的中间值,以及最终的执行结果。

我们用一个简单的例子来解释一个 Trace。
首先,我们模拟计算机中两个寄存器:r0,r1.

你可以理解寄存器为一个用于存放数据的空间

右侧是一个关于斐波那契数列的计算Trace表,他的计算过程实际上可以由一个简单的程序表示:

let r0 = 0;
let r1 = 1;
let trace = [[r0, r1]];
for (let i = 1; i < 12; i++) {
  r0 = r0 + r1;
  r1 = r0 + r1;
  trace.push([r0, r1]);
}
console.table(trace);
r0r1
01
12
35
813
2134
5589
144233

计算斐波那契数列的方式并不只有一个,你也可以使用只用一个寄存器的方式计算,只不过每次可能需要重新计算前一个的值。这部分会有些复杂,我们这里不展开。

小结

  • Trace 是计算过程中所有的中间值,以及最终的执行结果。
  • Trace 是构造多项式的重要数据。

浓缩

在Stark中,Trace是用于构造多项式的重要数据,ZK技术大部分都基于将计算结果转换成多项式,然后通过对多项式的验证来证明计算的正确性。
这一章节是Stark的第一步,不过这一步并没有体现零知识的性质,随着后续的一些章节,我们会逐步打开Stark的神秘面纱。