# Cairo 1.0-Alpha.3 新增特性解读 **Published by:** [CryptoNerdCN](https://paragraph.com/@cryptonerdtokyo-2/) **Published on:** 2023-02-25 **URL:** https://paragraph.com/@cryptonerdtokyo-2/cairo-1-0-alpha-3 ## Content 此文为向 @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为取非操作。 https://github.com/starkware-libs/cairo/blob/e53053e787fb5585d09d2012335613db5407eda6/corelib/src/integer.cairo My Twitter: https://twitter.com/cryptonerdcn ## Publication Information - [CryptoNerdCN](https://paragraph.com/@cryptonerdtokyo-2/): Publication homepage - [All Posts](https://paragraph.com/@cryptonerdtokyo-2/): More posts from this publication - [RSS Feed](https://api.paragraph.com/blogs/rss/@cryptonerdtokyo-2): Subscribe to updates - [Twitter](https://twitter.com/cryptonerdcn): Follow on Twitter