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

By [CryptoNerdCN](https://paragraph.com/@cryptonerdtokyo-2) · 2023-02-25

---

![](https://storage.googleapis.com/papyrus_images/dafd3930c2f8877cdd8bb9d23f61004cd1c96c7d3be1343f81e5341b20d6c7c8.jpg)

_此文为向_ [_@StarknetAstroCN_](https://twitter.com/StarknetAstroCN) _的投稿。_

Starkware于2月21日公布了[Cairo 1.0-alpha.3](https://github.com/starkware-libs/cairo/releases/tag/v1.0.0-alpha.3)，离Cairo 1.0正式上线测试网（等两周后的Starknet 0.11.0公开）越来越快了，让我们来看看这次有什么新增特性吧。

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

这个类型的主要用处是给该对象产生一个引用，即使该对象是不可复制的（注：Cairo的复制，即copy这个trait是参考了rust的概念，和广义上的copy并不太一样，[参见此处](https://rustwiki.org/zh-CN/std/marker/trait.Copy.html)）。其中， @ 是snap操作，而 \* 是desnap，也就是将快照对象取出的操作。

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

![](https://storage.googleapis.com/papyrus_images/0bf8e3e0ede2c7d69a6b6eed4189e00099b2e199877d9114c7b433c6e738de2a.png)

这里的第一句其实是写在Cairo的[数组源码中](https://github.com/starkware-libs/cairo/blob/main/corelib/src/array.cairo)。

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

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

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

    Run completed successfully, returning [10]
    

这样的结果。

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

    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;
    }
    

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

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

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

增加了ec\_point\_zero, ec\_point\_is\_zero, ec\_state\_finalize.

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

[Into, TryInto, Neg, Not](https://github.com/starkware-libs/cairo/blob/e53053e787fb5585d09d2012335613db5407eda6/corelib/src/traits.cairo#L81) 操作符。

其中Into负责类型转换。TryInto同样负责类型转换，但允许转换失败，会返回一个Option(如[这里的实现](https://github.com/starkware-libs/cairo/blob/e53053e787fb5585d09d2012335613db5407eda6/corelib/src/integer.cairo#L891))。

Neg为Negative的简写，为取负（如[这里的实现](https://github.com/starkware-libs/cairo/blob/6901b07db71feb46ba562daaa5db0181eae9a5ce/corelib/src/lib.cairo#L134)）或者取逆操作。Not为取非操作。

[https://github.com/starkware-libs/cairo/blob/e53053e787fb5585d09d2012335613db5407eda6/corelib/src/integer.cairo](https://github.com/starkware-libs/cairo/blob/e53053e787fb5585d09d2012335613db5407eda6/corelib/src/integer.cairo)

My Twitter：

![](https://storage.googleapis.com/papyrus_images/d009beeb28e04940aa558cb558540b9114fcf58a7092b998d87c904a58fae873.jpg)

[https://twitter.com/cryptonerdcn](https://twitter.com/cryptonerdcn)

---

*Originally published on [CryptoNerdCN](https://paragraph.com/@cryptonerdtokyo-2/cairo-1-0-alpha-3)*
