8 Anchor copy
- 2 mins1. 什么是 Anchor?
A. Anchor 是一个开发框架,使编写 Solana 程序更加简单、快速和安全。
B. Anchor 是一个用于构建智能合约的编程语言。
C. Anchor 是一个用于创建数字资产的加密货币。
D. Anchor 是一个用于数据存储的分布式系统。
2. Anchor 使用哪种宏和特征为你生成样板 Rust 代码?
A. `declare_id` 和 `#[program]`
B. `Accounts` 和 `#[account]`
C. `Account` 和 `Signer`
D. `System` 和 `Context`
3. `Context` 类型向指令逻辑暴露了指令的什么内容?
A. 指令的元数据和账户
B. 指令的数据和指令逻辑
C. 指令的执行程序和账户验证
D. 指令的签名者和系统程序
4. `Account` 包装器执行哪些操作?
A. 反序列化账户数据和检查账户的程序所有者
B. 验证账户的签名和执行所有权检查
C. 检查账户的可写性和租金周期
D. 设置账户的数据字段和检查账户的可执行性
1. 什么是 Anchor?
A. Anchor 是一个开发框架,使编写 Solana 程序更加简单、快速和安全。
B. Anchor 是一个用于构建智能合约的编程语言。
C. Anchor 是一个用于创建数字资产的加密货币。
D. Anchor 是一个用于数据存储的分布式系统。
Answer: A
Citation: "Anchor 是一个开发框架,使编写 Solana 程序更加简单、快速和安全。"
2. Anchor 使用哪种宏和特征为你生成样板 Rust 代码?
A. `declare_id` 和 `#[program]`
B. `Accounts` 和 `#[account]`
C. `Account` 和 `Signer`
D. `System` 和 `Context`
Answer: B
Citation: "Anchor 使用宏和特征为你生成样板 Rust 代码。这些为你的程序提供了清晰的结构,使你更容易理解你的代码。"
3. `Context` 类型向指令逻辑暴露了指令的什么内容?
A. 指令的元数据和账户
B. 指令的数据和指令逻辑
C. 指令的执行程序和账户验证
D. 指令的签名者和系统程序
Answer: A
Citation: "`Context` 类型向你的指令逻辑暴露了指令的元数据和账户。"
4. `Account` 包装器执行哪些操作?
A. 反序列化账户数据和检查账户的程序所有者
B. 验证账户的签名和执行所有权检查
C. 检查账户的可写性和租金周期
D. 设置账户的数据字段和检查账户的可执行性
Answer: A
Citation: "`Account` 包装器执行以下操作:将账户 `data` 反序列化为类型 `AccountStruct` 的格式。检查账户的程序所有者是否与指定给 `AccountStruct` 类型的程序所有者匹配。"
q and a
章节:什么是 Anchor?
- Anchor 框架的主要优势是什么?
- 答案: Anchor 框架的主要优势是简化、加速和增强 Solana 程序的构建过程,通过抽象掉样板代码、提供安全检查和账户验证等功能。
- Anchor 框架中的
declare_id
宏的作用是什么?- 答案:
declare_id
宏用于指定程序的链上地址(即programId
),在构建 Anchor 程序时生成一个新的密钥对,并将其作为默认用于部署程序的密钥对。
- 答案:
- Anchor 框架如何帮助用户构建安全的程序?
- 答案: Anchor 框架通过执行安全检查、要求账户验证,并提供简单的方法来实现额外的检查,帮助用户构建安全的程序。
章节:Anchor 程序结构
- Anchor 框架中的主要高级宏和属性有哪些?请列举并简要描述每个。
- 答案: 主要高级宏和属性包括
declare_id
、#[program]
、Accounts
和#[account]
。declare_id
用于声明程序的链上地址,#[program]
用于表示包含程序指令逻辑的模块,Accounts
用于表示指令所需账户列表的结构体,#[account]
用于定义自定义账户类型。
- 答案: 主要高级宏和属性包括
- 什么是
InstructionAccounts
结构体,它的作用是什么?- 答案:
InstructionAccounts
结构体用于列出每个指令中所需的账户,并在调用指令时执行账户验证和安全检查,确保账户类型匹配并满足额外约束条件。
- 答案:
- Anchor 框架如何帮助用户更容易理解和组织他们的代码?
- 答案: Anchor 框架使用宏和特征生成样板 Rust 代码,为用户提供清晰的结构,使他们更容易理解和组织他们的代码。
章节:账户验证
- Anchor 提供了哪些常见的账户类型?请列举并简要描述每种类型的账户验证。
- 答案: Anchor 提供了许多账户类型,包括
Account
。Account
类型实现了账户验证,通过检查传入指令的数据更新账户上的数据字段。
- 答案: Anchor 提供了许多账户类型,包括
#[account]
属性在 Anchor 中的作用是什么?- 答案:
#[account]
属性用于定义自定义账户类型,初始化账户的所有者为declare_id
中的programId
,并为账户设置鉴别器和所有者。
- 答案:
- 在 Anchor 中,如何确保账户验证和安全检查通过后才执行程序逻辑?
- 答案: 在 Anchor 中,通过定义正确的账户类型和使用
#[account]
属性,确保传递给指令的账户与指定的账户类型匹配,并满足额外约束条件,以确保账户验证和安全检查通过。
- 答案: 在 Anchor 中,通过定义正确的账户类型和使用
Accounts特征
问题 1: Accounts
特征的作用是什么?
答案: Accounts
特征定义了一个经过验证的账户数据结构,用于表示指令所需的账户列表。结构体通过实现 Accounts
特征,可以将给定指令所需的账户列表暴露给指令的 Context
,从而避免手动迭代和反序列化账户。
划重点:
- 省去了迭代账户的步骤,
- 省去了反序列化
问题 3: 在 Anchor 中,什么是 Signer
类型的账户用于验证?
答案: Signer
类型的账户用于验证给定的账户是否对交易进行了签名。在指令中,Signer
类型的账户必须是指令的签名者,用于验证交易的合法性。
#[account]
- 什么是
#[account(..)]
属性宏用于的目的?
答:#[account(..)]
属性宏用于对账户应用约束,指定账户的初始化方式、付款人、空间分配等信息。
- 在 Anchor 中,为什么需要使用
#[account(..)]
属性来指定账户的可变性?
答:在 Anchor 中,需要使用 #[account(..)]
属性来指定账户的可变性,因为一些操作需要修改账户的状态,例如从账户中扣除 lamports 以支付初始化费用。
- 在 Anchor 中,为什么对于
account_name
账户施加的init
约束自动包含了一个mut
约束?
答:对于 account_name
账户施加的 init
约束自动包含了一个 mut
约束,是因为初始化账户需要修改账户的状态,因此账户必须是可变的。