8 Anchor copy

- 2 mins
1. 什么是 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?

  1. Anchor 框架的主要优势是什么?
    • 答案: Anchor 框架的主要优势是简化、加速和增强 Solana 程序的构建过程,通过抽象掉样板代码、提供安全检查和账户验证等功能。
  2. Anchor 框架中的 declare_id 宏的作用是什么?
    • 答案: declare_id 宏用于指定程序的链上地址(即 programId),在构建 Anchor 程序时生成一个新的密钥对,并将其作为默认用于部署程序的密钥对。
  3. Anchor 框架如何帮助用户构建安全的程序?
    • 答案: Anchor 框架通过执行安全检查、要求账户验证,并提供简单的方法来实现额外的检查,帮助用户构建安全的程序。

章节:Anchor 程序结构

  1. Anchor 框架中的主要高级宏和属性有哪些?请列举并简要描述每个。
    • 答案: 主要高级宏和属性包括 declare_id#[program]Accounts#[account]declare_id 用于声明程序的链上地址,#[program] 用于表示包含程序指令逻辑的模块,Accounts 用于表示指令所需账户列表的结构体,#[account] 用于定义自定义账户类型。
  2. 什么是 InstructionAccounts 结构体,它的作用是什么?
    • 答案: InstructionAccounts 结构体用于列出每个指令中所需的账户,并在调用指令时执行账户验证和安全检查,确保账户类型匹配并满足额外约束条件。
  3. Anchor 框架如何帮助用户更容易理解和组织他们的代码?
    • 答案: Anchor 框架使用宏和特征生成样板 Rust 代码,为用户提供清晰的结构,使他们更容易理解和组织他们的代码。

章节:账户验证

  1. Anchor 提供了哪些常见的账户类型?请列举并简要描述每种类型的账户验证。
    • 答案: Anchor 提供了许多账户类型,包括 AccountAccount 类型实现了账户验证,通过检查传入指令的数据更新账户上的数据字段。
  2. #[account] 属性在 Anchor 中的作用是什么?
    • 答案: #[account] 属性用于定义自定义账户类型,初始化账户的所有者为 declare_id 中的 programId,并为账户设置鉴别器和所有者。
  3. 在 Anchor 中,如何确保账户验证和安全检查通过后才执行程序逻辑?
    • 答案: 在 Anchor 中,通过定义正确的账户类型和使用 #[account] 属性,确保传递给指令的账户与指定的账户类型匹配,并满足额外约束条件,以确保账户验证和安全检查通过。

Accounts特征

问题 1: Accounts 特征的作用是什么?

答案: Accounts 特征定义了一个经过验证的账户数据结构,用于表示指令所需的账户列表。结构体通过实现 Accounts 特征,可以将给定指令所需的账户列表暴露给指令的 Context,从而避免手动迭代和反序列化账户。

划重点:

  1. 省去了迭代账户的步骤,
  2. 省去了反序列化

问题 3: 在 Anchor 中,什么是 Signer 类型的账户用于验证?

答案: Signer 类型的账户用于验证给定的账户是否对交易进行了签名。在指令中,Signer 类型的账户必须是指令的签名者,用于验证交易的合法性。

#[account]

  1. 什么是 #[account(..)] 属性宏用于的目的?

答:#[account(..)] 属性宏用于对账户应用约束,指定账户的初始化方式、付款人、空间分配等信息。

  1. 在 Anchor 中,为什么需要使用 #[account(..)] 属性来指定账户的可变性?

答:在 Anchor 中,需要使用 #[account(..)] 属性来指定账户的可变性,因为一些操作需要修改账户的状态,例如从账户中扣除 lamports 以支付初始化费用。

  1. 在 Anchor 中,为什么对于 account_name 账户施加的 init 约束自动包含了一个 mut 约束?

答:对于 account_name 账户施加的 init 约束自动包含了一个 mut 约束,是因为初始化账户需要修改账户的状态,因此账户必须是可变的。