跳转到主要内容

Permission Program

链上权限管理(即将推出)

Ephemeral Rollups SDK

用于 Private Ephemeral Rollups 的 SDK

概述

Private Ephemeral Rollups 是 Ephemeral Rollups 的一种形式,它在以合规为核心的 Trusted Execution Environment 中,为受权限控制的账户提供细粒度权限管理。每个权限账户都会维护一份成员列表,并通过特定标志来决定这些成员可以执行哪些操作。

核心概念

  • Permission Account:用于存储特定账户访问控制规则的 PDA
  • Members:通过标志授予特定权限的地址
  • Flags:用于定义成员可执行操作的位掩码(authority、查看日志、查看余额等)
  • Public Permissions:当成员被设置为 None 时,受权限控制的账户会暂时变为可见

成员标志

成员标志为每位成员定义细粒度权限。你可以通过按位 OR 组合多个标志,以授予多个权限。 标志说明:
  • AUTHORITY:允许成员更新和委托权限设置、添加或移除其他成员,以及更新成员标志。
  • TX_LOGS:允许成员查看交易执行日志。
  • TX_BALANCES:允许成员查看账户余额变更。
  • TX_MESSAGE:允许成员查看交易消息数据。
  • ACCOUNT_SIGNATURES:允许成员查看账户签名
use ephemeral_rollups_sdk::access_control::structs::{
    Member,
    AUTHORITY_FLAG,
    TX_LOGS_FLAG,
    TX_BALANCES_FLAG,
    TX_MESSAGE_FLAG,
    ACCOUNT_SIGNATURES_FLAG,
};

// Set flags by combining them with bitwise OR
let flags = AUTHORITY_FLAG | TX_LOGS_FLAG;

// Create a member with combined flags
let mut member = Member {
    flags,
    pubkey: user_pubkey,
};

// Check if member has a specific flag using bitwise AND
let is_authority = (member.flags & AUTHORITY_FLAG) != 0;
let can_see_logs = (member.flags & TX_LOGS_FLAG) != 0;

// Use helper methods to set/remove flags
member.set_flags(TX_BALANCES_FLAG); // Add a flag
member.remove_flags(TX_LOGS_FLAG);  // Remove a flag

Ephemeral Permission

EphemeralPermission 账户完全运行在 Ephemeral Rollup 上,由已委托的 PDA 承担租金——无需在 Base Layer 上创建、委托或 commit-and-undelegate 任何权限账户。三个 CPI 操作即可覆盖完整生命周期:CreateUpdateClose, 全部由 ER 上的数据账户作为 PDA 签名,通过 MagicBlock 的 Permission Program ACLseoPoyC3cBqoUtkbjZ4aDrkurZW86v19pXz2XQnp1 调用。
前置条件 —— 委托数据 PDA。 只有数据账户会被委托给 TEE 验证器(在 Base Layer 上,通过 MagicBlock 的 Delegation Program DELeGGvXpWV2fqJUhqcF5ZSYMS4JTLjteaAMARRSaeSh)。委托完成后,PDA 会使用其程序种子 在 ER 上签署全部三个权限操作,并支付 ephemeral permission 的租金——因此必须在 initialize 时预先充值。完整流程请参阅 快速开始

这些公共验证器可用于开发环境。请确保在你的委托指令中添加对应的 ER 验证器:

主网
  • 亚洲 (as.magicblock.app): MAS1Dt9qreoRMQ14YQuhg8UTZMMzDdKhmkZMECCzk57
  • 欧盟 (eu.magicblock.app): MEUGGrYPxKk17hCr7wpT6s8dtNokZj5U2L57vjYMS8e
  • 美国 (us.magicblock.app): MUS3hc9TCw4cGC12vHNoYcCGzJG1txjgQLZWVoeNHNd
  • TEE (mainnet-tee.magicblock.app): MTEWGuqxUpYZGFJQcp8tLN7x5v9BSeoFHYWQQ3n3xzo
开发网
  • 亚洲 (devnet-as.magicblock.app): MAS1Dt9qreoRMQ14YQuhg8UTZMMzDdKhmkZMECCzk57
  • 欧盟 (devnet-eu.magicblock.app): MEUGGrYPxKk17hCr7wpT6s8dtNokZj5U2L57vjYMS8e
  • 美国 (devnet-us.magicblock.app): MUS3hc9TCw4cGC12vHNoYcCGzJG1txjgQLZWVoeNHNd
  • TEE (devnet-tee.magicblock.app): MTEWGuqxUpYZGFJQcp8tLN7x5v9BSeoFHYWQQ3n3xzo
本地网络
  • 本地 ER (localhost:7799): mAGicPQYBMvcYveUZA5F5UNNwyHvfYh5xkLS2Fr1mev
1

创建 Ephemeral Permission

在 ER 上初始化一个带有初始成员和隐私标志的 EphemeralPermission 账户。 幂等——如果已存在则跳过。
2

更新 Ephemeral Permission

切换隐私标志,或添加 / 移除 / 更新成员。更新会立即在 ER 上生效。
3

关闭 Ephemeral Permission

当不再需要权限时,关闭 ER 上的 EphemeralPermission 账户, 并将租金退还给数据 PDA。

Ephemeral Permission 操作

通过 CreateEphemeralPermissionCpi 在 ER 上初始化一个新的 EphemeralPermission 账户。Payer = 已委托的数据 PDA,它使用其程序种子签名,并使用 initialize 时预先充值的 lamports 来支付租金。
use ephemeral_rollups_sdk::access_control::{
    instructions::CreateEphemeralPermissionCpi,
    structs::{EphemeralMembersArgs, Member},
};

// Counter PDA pays for its own permission rent (it carries lamports onto the ER
// after delegation and signs as PDA via seeds).
let signers = [
    COUNTER_SEED,
    ctx.accounts.counter.authority.as_ref(),
    &[ctx.bumps.counter],
];

CreateEphemeralPermissionCpi {
    payer: ctx.accounts.counter.to_account_info(),                  // pays ephemeral rent
    permissioned_account: ctx.accounts.counter.to_account_info(),   // what the permission gates
    permission: ctx.accounts.permission.to_account_info(),
    vault: ctx.accounts.ephemeral_vault.to_account_info(),
    magic_program: ctx.accounts.magic_program.to_account_info(),
    permission_program: ctx.accounts.permission_program.to_account_info(),
    args: EphemeralMembersArgs {
        is_private: false,    // start public — flip via UpdateEphemeralPermission
        members: vec![],
    },
}
.invoke_signed(&[&signers])?;
使用场景:
  • 为 ER 上新委托的 PDA 启动访问控制
  • 以公开模式启动(is_private: false、成员为空),后续通过 Update 收紧
⬆️ 返回顶部
参考实现: private-counter (Anchor)和 pinocchio-private-counter

最佳实践

  1. Authority 管理:始终至少为一位可信成员分配 AUTHORITY_FLAG
  2. 最小权限原则:仅向每位成员授予必要的标志
  3. 实时更新:权限可以在不取消委托的情况下于 Private Ephemeral Rollup 上实时更新,从而实现动态访问控制调整
  4. 清理:取消委托并关闭未使用的权限账户,以释放 SOL

安全注意事项

  • 签名者验证:只有拥有 AUTHORITY_FLAG 的成员或带有受权限控制账户的程序才能授权变更
  • 公开账户:将成员设置为 None 会使账户对外公开可见
  • 默认 Authority:默认情况下,受权限控制账户的所有者会被添加为权限账户成员中的 permission authority
  • 空成员列表:如果 members 字段被设置为空列表,则受权限控制账户将完全受限且保持私密。只有该账户所有者才能修改权限
  • 访问审计:使用成员标志来审计和控制访问

访问控制

细粒度访问控制

链上隐私

隐私机制与核心概念

授权

授权框架

合规框架

合规标准与指南