在Solana里,“owner”至少有两种界面含义。账户头部的owner字段是一个程序ID,决定哪个程序能修改账户data;钱包或Token界面里的authority通常是data内部记录的公钥,由程序按业务规则检查。混淆两者会把权限审计做错层。
运行时owner是一道硬边界
每个账户都带owner字段。执行指令时,运行时阻止非owner程序任意写入data或扣减该账户lamports。System Program拥有普通系统账户,Token Program或Token-2022拥有对应Mint和Token账户,用户公钥即使签名也不能直接改这些账户字节。
authority由owner程序解释
Token账户data中可以记录转账authority、delegate或close authority;Mint可以记录mint authority和freeze authority。它们不是运行时owner,而是Token程序读取后决定是否允许某项指令的业务字段。不同程序可定义单一公钥、多签、角色表或时间锁,名称相同也不保证语义相同。
| 示例 | owner字段 | 业务authority |
|---|---|---|
| 普通SOL账户 | System Program | 私钥签名者控制系统指令 |
| SPL Token账户 | Token Program | owner/delegate/close authority |
| Mint账户 | Token Program | mint/freeze authority |
| 应用PDA账户 | 应用程序ID | data中可另存管理员或用户 |
PDA没有私钥,为什么能签名
PDA被设计为离曲线地址,没有对应Ed25519私钥。所属程序在CPI中提供正确seeds与bump,运行时可把该PDA视为签名者。这种签名能力只在程序调用上下文中成立,不意味着任何人知道PDA私钥,也不等于PDA自动拥有它控制的账户。
PDA账户本身还可能由System Program创建后分配给应用,或作为Token账户由Token Program拥有、把PDA设为业务authority。审计时必须分别读取账户owner和data中的authority。
权限转移怎样核验
先从RPC取得账户原始owner;按owner程序的正式布局解码data;列出所有authority、delegate和多签阈值;查询最近的权限变更交易;最后验证新authority是否能签名或由哪个程序代表签名。只看区块浏览器顶部的Owner标签不够。
撤销权限时还要确认是否把字段设为None、转给新地址,或只是移除某个delegate。Token-2022扩展可能增加更多权限,旧解码器会漏读。
PDA派生和invoke_signed可看Solana PDA,Token-2022费用权限见转账费扩展,账户空间与关闭流程见rent与realloc。
发表评论
还没有评论,来说两句吧。
评论区为展示样式,提交不会被处理。