#aleph #solana #message #contract #cpi #emit #events

aleph-solana-contract

Aleph Solana 消息处理程序

2 个版本

0.1.1 2023年6月23日
0.1.0 2023年4月12日

#12 in #aleph

MIT/Apache

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