Starknet 训练营-课程笔记4
Starknet 上的智能合约本质上是什么?
Starknet 上的智能合约本质上是用 Cairo 语言编写的程序,它们部署在 Starknet 链上,能够访问和修改持久化状态。虽然执行过程发生在链下(由排序器处理),但合约代码和状态都存储在 Starknet 上,并通过 STARK 证明在以太坊主网上进行验证。因此,选项 C 最为准确。
答案:C
A. 运行在 EVM 上的 Solidity 程序
B. 链下执行、链上验证的脚本
C. 运行在链上的 Cairo 程序,能够访问和修改持久状态
D. 仅用于验证交易有效性的代码
一份 Cairo 智能合约在部署前,必须先经历哪一步?
A. 编译为 EVM bytecode
B. 直接部署生成地址
C. 编译并在链上 deploy 为合约实例
D. 编译并在链上 declare 为合约类
在 Starknet 上部署 Cairo 智能合约,有一个区别于传统 EVM 链的关键前置步骤。
正确答案是:D. 编译并在链上 declare 为合约类
原因如下:
Starknet 采用“合约类(Contract Class)”和“合约实例(Contract Instance)”分离的架构。这种设计提高了安全性和可组合性,并支持合约的不可变声明和可升级实例。
- 编译:首先,你需要将用 Cairo 语言编写的源代码编译成 Sierra(一个中间表示)和最终的 CASM(Cairo 汇编)。这是链下操作。
- 声明(Declare):接下来,你必须将编译好的合约类(包含 Sierra 代码等)声明到链上。这一步会在链上注册这个合约的代码“蓝图”,并为其生成一个唯一的
class_hash。此时,合约的逻辑代码已经存在于链上,但还没有可交互的运行实例(即没有存储空间,也没有合约地址)。 - 部署(Deploy):最后,你才能通过调用一个系统合约,使用已声明的
class_hash来部署一个合约实例。这一步会为实例分配一个合约地址和独立的存储空间。
因此,在部署合约实例之前,声明合约类是一个强制性的先决步骤。
其他选项分析:
- A. 编译为 EVM bytecode:错误。Starknet 不运行在 EVM 上,它使用 Cairo 虚拟机。
- B. 直接部署生成地址:错误。缺少了关键的编译和声明步骤。
- C. 编译并在链上 deploy 为合约实例:错误。它忽略了
declare这一核心步骤,将编译和部署混为一谈。在 Starknet 上,没有先声明类,就无法部署实例。
必填, 在 Cairo 中,一个智能合约在代码层面本质上是?, 单选
A. 一个函数

B. 一个 Trait

C. 一个 Cairo 模块

D. 一个结构体
在 Cairo 中,一个智能合约在代码层面上本质上是 一个模块(module),该模块使用 #[starknet::contract] 属性进行标注,其中定义了存储结构和合约函数。合约通过实现特定的 trait 来定义外部接口,但其核心组织形式是一个 Cairo 模块。
答案:C
constructor 函数的正确描述是?
A. 可以被多次调用
B. 可以定义多个
C. 只在合约部署时调用一次
D. 只能读取状态,不能修改
构造函数(constructor)是智能合约中的一个特殊函数,它只在合约部署时被自动调用一次,用于初始化合约的状态。在Starknet的Cairo合约中,构造函数使用#[constructor]属性标记,且一个合约只能有一个构造函数。
正确答案是:C. 只在合约部署时调用一次
Dispatcher 的主要用途是?
A. 部署合约
B. 声明合约类
C. 实现跨合约调用
D. 管理合约存储
在 Starknet 中,Dispatcher 的主要用途是实现跨合约调用。
Dispatcher 的作用:
Dispatcher 是一个自动生成的工具,它封装了目标合约的外部函数接口。通过它,一个合约可以安全、方便地调用另一个合约中标记为 #[external] 的函数。
详细解释:
- 跨合约调用:当合约 A 需要调用合约 B 的外部函数时,合约 A 会使用合约 B 的 Dispatcher。Dispatcher 知道合约 B 的外部函数签名,并负责将调用请求发送到指定的合约地址。
- 类型安全:由于 Dispatcher 是根据合约的接口自动生成的,因此调用是类型安全的,减少了手动编码错误。
- 不涉及部署、声明或存储管理:Dispatcher 本身不参与合约部署(deploy)、声明(declare)或直接管理存储,它的核心功能是调用。
因此,正确答案是 C. 实现跨合约调用。