Cairo 1.0-Alpha.3 新增特性解读
2023-2-25 19:31:24 Author: web3rover.substack.com(查看原文) 阅读量:8 收藏

此文为向 @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为取非操作。

u8, u16, u32, u64

My Twitter:

https://twitter.com/cryptonerdcn


文章来源: https://web3rover.substack.com/p/cairo-10-alpha3
如有侵权请联系:admin#unsafe.sh