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的数组源码中

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

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 操作符。

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

Neg为Negative的简写,为取负(如这里的实现)或者取逆操作。Not为取非操作。

My Twitter:

Subscribe to CryptoNerdCN
Receive the latest updates directly to your inbox.
Mint this entry as an NFT to add it to your collection.
Verification
This entry has been permanently stored onchain and signed by its creator.