Cairo 1.0-Alpha.3 新增特性解读

此文为向 @StarknetAstroCN 的投稿。

Starkware 于 2 月 21 日公布了Cairo 1.0-alpha.3，离 Cairo 1.0 正式上线测试网（等两周后的 Starknet 0.11.0 公开）越来越快了，让我们来看看这次有什么新增特性吧。

快照是一种新增的类型（但其实在该版本之前就大量使用了），它创建了对在某个时间点的对象的引用，创建的 snapshot 不能被进一步更改。

这个类型的主要用处是给该对象产生一个引用，即使该对象是不可复制的（注：Cairo 的复制，即 copy 这个 trait 是参考了 rust 的概念，和广义上的 copy 并不太一样，参见此处）。其中， @ 是 snap 操作，而 * 是 desnap，也就是将快照对象取出的操作。

官方给出的代码有点令人混淆，我来解释一下：

这里的第一句其实是写在 Cairo 的数组源码中。

实际测试时只需要测试以下代码即可：

Copy
use array::ArrayTrait;

fn main() -> felt {
let mut arr = ArrayTrait::new();
arr.append(10);
let x = *arr.at(0_usize);
return x;
}

这将会在你的终端里输出类似于

Copy
Run completed successfully, returning [10]

这样的结果。

对于还不太明白的同学，运行如下代码：

Copy
use array::ArrayTrait;

extern fn print(message: Array::<felt>) nopanic;

fn main() -> felt {
let mut arr = ArrayTrait::new();
arr.append(10);
let xx = arr.at(0_usize);
let d = arr.pop_front();
drop(d);
arr.append(11);
print(arr);
let x = *xx;
return x;
}

你将可以看到这样的输出：

Copy
'
' (raw: 11),
Run completed successfully, returning [10]

可以看出，虽然数组变成了 [11]，但输出仍然是 10。

增加了 ec_point_zero, ec_point_is_zero, ec_state_finalize.

+=, -=, *=, /=, %=

Into, TryInto, Neg, Not 操作符。

其中 Into 负责类型转换。TryInto 同样负责类型转换，但允许转换失败，会返回一个 Option (如这里的实现)。

Neg 为 Negative 的简写，为取负（如这里的实现）或者取逆操作。Not 为取非操作。