cryptonerdcn

cryptonerdcn

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

image

此文为向 @StarknetAstroCN 的投稿。

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

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

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

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

image

这里的第一句其实是写在 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 为取非操作。

https://github.com/starkware-libs/cairo/blob/e53053e787fb5585d09d2012335613db5407eda6/corelib/src/integer.cairo

My Twitter:

image

https://twitter.com/cryptonerdcn

加载中...
此文章数据所有权由区块链加密技术和智能合约保障仅归创作者所有。