跳到正文
← 使用教程

MagicBlock:commit后账户为何仍锁定,怎样核解除委托与费用

链小知 · 进阶 · 核验 · 依官方文档整理

按已有开发和回执材料,核选定PDA委托、ER提交、Magic Action认证、提交限额与押金退款,区分状态同步和基础层owner恢复。

开始前准备

  • 准备已有项目的依赖版本、网络/程序/PDA、validator、委托和提交回执、付款方与rent_payer记录。
  • 准备Action账户及错误、提交序号、押金/实时收费和基础层最终材料;缺项保留未知,不用示例数字替代实际配置。

1. 固定程序、账户、环境与版本

从已有项目和回执材料记录Solana网络、程序ID、目标PDA、原owner程序和所选ER validator。不要把用户钱包、程序owner、委托费用付款方与validator当同一个主体,也不要把Mainnet、Devnet和Localnet地址混用。

当前Quickstart的示例使用MagicIntentBundleBuilder,并将commit_accounts及commit_and_undelegate_accounts标deprecated;记录实际依赖版本后再比对方法,不直接复制旧帮助函数。v1.0.0仍有experimental分支,发布日不是本人安装版本的证明。若是Private ER,还要单列TEE与显式访问规则,默认账户仍公开。

检查结果:网络、程序/PDA、原owner、validator与实际版本有对应材料;隐私与普通执行分支分开。

2. 核委托的是选定状态账户

文档中Delegate发生在基础层,将所选PDA的owner改为Delegation Program(DELeGGvXpWV2fqJUhqcF5ZSYMS4JTLjteaAMARRSaeSh),同时指定validator及相关配置。核已有记录中的账户集合与配置,不将一次委托理解成整个钱包或全部程序迁移。

首笔ER交易会从基础层克隆已委托账户。程序还需具备解除委托回调处理器;Quickstart说明#[ephemeral]会注入对应回调。没有委托成功、正确validator或回调材料时,后续只标待确认,不把普通Solana账户直接视为可在任意ER写入。

检查结果:目标账户、基础层委托和ER初始状态相互对应,必要回调或validator缺项已标明。

3. 区分ER执行、安排commit与基础层最终状态

已有记录若使用MagicIntentBundleBuilder,分别核.commit(&[...])与.commit_and_undelegate(&[...])的目标账户集合;前者同步状态,后者还请求恢复基础层owner。示例中build_and_invoke会发起调用,不能当成纯查询。

Quickstart的increment_and_commit例子先对修改过的Anchor账户执行exit,再交给CPI读取;不能笼统假设所有内存修改都会被提交。普通Commit完成finalization后PDA仍锁在基础层,可继续在ER执行;请求已安排、ER状态变化与基础层最终状态须有各自材料。

检查结果:执行环境、提交账户集合、状态序列化和基础层最终结果分列,commit未误记为解除委托。

4. 有Magic Action时另核认证与失败范围

Magic Actions使用刚提交的状态在Solana基础层执行。若handler不执行,先对照已有材料中的instruction discriminator、请求compute_units、ShortAccountMeta账户列表及is_writable;不要把任意失败都归为ER网络问题。

#[action]让处理器可被提交后分发,并不阻止直接调用。当前故障文档要求escrow为signer且地址匹配派生;处理器使用程序自有PDA权限时,还要将escrow_auth绑定到该PDA。用户付款的路径没有固定程序PDA可硬套,仍需签名与派生检查。Action失败会回退同一commit交易,不把这种原子性扩大到整个应用的所有历史ER操作。

检查结果:Action账户、计算预算、escrow认证及适用权限分支已核;失败未冒充基础层提交成功。

5. 按提交次数定位失败与两套收费

不带delegated fee payer的普通commit只接受前10次,第11次为0xA0000000;最终commit-and-undelegate仍可运行以解除委托,但不恢复更多普通commit额度。带付款方时需该validator对应的magic_fee_vault:无或错误为MissingAccount,不满足writable/delegated为IllegalOwner;付款方不足全额为InsufficientFunds,不作部分扣款。

费用页的两套账要同时保留:解除委托结算3,000,000加首个commit以后每次1,000,000 lamports,最多扣Solana押金;带付款方的第26次起,另即时收每个提交账户100,000 lamports。两个账户各到第26次,实时部分为200,000,不能当两套账互相替代或前25次全免费。数值是该页标注8月20日的说明,当前配置缺材料就保留未知。

Base Action另按请求CU计算,callback另5,000 lamports;充值helper的300,000设置费、转入本金、Solana网络费及可退款存储资金也分别记录。付款方可以不同于提交账户;使用共用付款方时不能由委托权限推定无限支出权限。

检查结果:提交序号、具体错误、押金结算与实时付款分开,费用数值的文档时点及当前未知项明确。

6. 以owner恢复和退款对象完成核对

解除委托会提交状态并触发finalization;核已有基础层记录中目标PDA的owner已从Delegation Program回到原程序,且状态对应。只有ER中调用undelegate或看见commit请求,还不足以证明账户已在基础层解锁。

费用文档写未用押金退给当初记录的rent_payer;押金少于计算费用时最多拿走押金,不另生债务或仅因此使解除委托失败。将押金、扣款、退款对象、实际退款和网络费分列,别把validator结算时的lamport对账都算固定服务费。缺owner恢复、基础层结果或退款材料时,对应层保留未确认。

检查结果:基础层账户owner及状态已恢复或明确待确认;费用和rent_payer实收有独立证据。

怎样确认完成

  • 已得到按委托、ER状态、基础层结果、owner和退款分列的核对记录。
  • 未取得的当前配置、实际部署/权限、隐私与费用回执仍明确待确认。

常见错误与边界

  • 普通commit后账户仍可能委托,ER调用完成不代表基础层解锁。
  • 实时无额外费用的commit仍可能在解除委托时扣押金,普通ER交易0费也不包括其他费用。
  • 仅有#[action]、地址/owner约束或escrow的任意签名,不等于完整提交路径认证。

本教程根据官方资料整理,尚未完成逐步操作验收。界面、支持范围及费用变化时,先核对官方说明。 纯文本版 · 提交纠错依据