无依赖的组合性
学习如何使用 Anchor 的 declare_program 宏与程序交互 而无需额外的依赖。
declare_program!()
宏简化了与 Anchor 程序交互的过程,通过生成 Rust 模块(来自程序的 IDL),可用于链上和链下代码。你可以在 这里 找到示例程序。
以下模块由 declare_program!()
宏生成:
模块 | 描述 |
---|---|
cpi | 从其他链上程序入侵到该程序的跨程序调用(CPI)的辅助功能 |
client | 构建程序指令所需的账户和参数,以便添加到客户端交易中 |
account | 在程序中定义的账户数据类型(程序状态) |
program | 用于识别程序的程序 ID 常量 |
constants | 在程序中定义的程序常量 |
events | 在程序中定义的程序事件 |
types | 在程序中定义的程序类型 |
示例
以下示例展示了如何在两种情况下使用 declare_program!()
宏:
- 从一个程序到另一个程序进行跨程序调用(CPI)
- 构建客户端交易以调用程序的指令
这两个示例显示了 declare_program!()
宏生成的模块如何简化程序交互,同样适用于链上或链下代码。
链上 CPI
要使用 declare_program!()
宏,你需要目标程序的 IDL 文件。IDL 文件必须放置在项目中的一个名为 /idls
的目录中。/idls
目录可以在项目结构中的任何级别。例如,你的项目可以有以下布局:
以下是目标(被调用)程序的源代码 (lib.rs
),它生成上面显示的 example.json
IDL 文件。
使用程序的 IDL 文件,另一个程序可以使用 declare_program!()
宏生成 CPI 模块,使其能够进行此程序指令的 CPI。
以下是调用程序 (example-cpi) 的源代码 (lib.rs
),它使用 declare_program!()
宏生成一个 CPI 模块以调用上面被调用程序中定义的指令。
说明
declare_program!()
宏接受一个参数 - 程序的 IDL 文件名(例如 example.json
):
将生成的模块引入作用域:
在账户验证结构中使用导入的类型:
使用 CPI 模块来调用程序的指令:
链下客户端
要使用 declare_program!()
宏,你需要目标程序的 IDL 文件。IDL 文件必须放置在项目中的一个名为 /idls
的目录中。/idls
目录可以在项目结构中的任何级别。例如,你的项目可以有以下布局:
以下是目标程序的源代码 (lib.rs
),它生成上面显示的 example.json
IDL 文件。该程序的 IDL 接下来可以与 declare_program!()
宏在客户端脚本中一起使用,以生成客户端模块来构建程序的指令。
以下是使用 declare_program!()
宏生成客户端模块以构建程序指令的客户端脚本(main.rs)。
declare_program!()
宏接受一个参数 - 程序的 IDL 文件名(例如 example.json
):
将生成的模块引入作用域:
使用客户端模块构建程序的指令:
将程序指令添加到交易中并发送交易:
使用账户模块获取并反序列化程序的账户类型: