2 个版本
0.1.1 | 2023年6月23日 |
---|---|
0.1.0 | 2023年4月12日 |
#12 in #aleph
6KB
程序指令可以通过两种方式调用
1- 通过CPI(在这种情况下,另一个程序调用 to_do_message 指令)。这是更有效的方式。为此,您需要
- 在 Cargo.toml 中将依赖项添加到您的 Solana 程序中
aleph-solana-contract = { version="0.1.0", features = [ "no-entrypoint" ] }
https://crates.io/crates/aleph-solana-contract
- 在您想发布消息的指令上下文中包含程序账户
/// CHECK: contraint added to force using actual aleph message program
#[account(address = aleph_solana_contract::ID, executable)]
pub messages_program: UncheckedAccount<'info>
- 在指令逻辑中构建 cpi
solana_program::program::invoke(
&Instruction {
program_id: ctx.accounts.messages_program.key(),
accounts: vec![
AccountMeta::new(ctx.accounts.signer.key(), true),
AccountMeta::new_readonly(ctx.accounts.messages_program.key(), false)
],
data: aleph_solana_contract::instruction::DoMessage {
msgtype: "aggregate".to_string(),
msgcontent: "content".to_string(),
}
.data(),
},
&[
ctx.accounts.signer.to_account_info().clone(),
ctx.accounts.messages_program.to_account_info().clone(),
],
)?;
-
您需要在指令中导入:anchor_lang::InstructionData(以便在构建指令时使用数据特性)
-
在本地,您应该在 Anchor.toml 中添加此内容
[test.validator]
url = "https://api.devnet.solana.com"
[[test.validator.clone]]
address = "ALepH1n9jxScbz45aZhBYVa35zxBNbKSvL6rWQpb4snc"
2- 在客户端的事务中包含 aleph 消息指令,这样就在事务中创建了一个特定的指令。
有关改进此功能的当前相关讨论在 anchor 仓库中:添加 emit_cpi 允许程序在 CPI 数据中存储日志
https://github.com/coral-xyz/anchor/pull/2438
https://github.com/coral-xyz/anchor/issues/2408
https://github.com/coral-xyz/anchor/pull/2438#discussion_r1155121788
Anchor(Solana 框架)事件通过日志发出。有两种选项
- 使用 emit! 宏:更高效,它序列化数据
- 使用 msg! 宏:创建一个不进行序列化的原始 JSON 日志
这些选项的基准测试:https://github.com/coral-xyz/anchor/issues/863#issuecomment-1101779506
依赖项
~18–27MB
~452K SLoC