Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

PAS 概述与方案对比

如何引入 PAS 库

依赖配置

在发行方包的 Move.toml 中声明对 pas 和(若需注册 Command)ptb 的依赖:

[package]
name = "your_coin"
edition = "2024.beta"

[dependencies]
pas = { local = "../pas" }   # 或 git = "https://github.com/MystenLabs/pas" }
ptb = { local = "../ptb" }   # 仅当需要 set_template_command 时
sui = { git = "https://github.com/MystenLabs/sui", rev = "..." }

常用 use 语句

发行方模块中通常需要:

use pas::namespace::Namespace;
use pas::policy::{Self, Policy, PolicyCap};
use pas::chest::{Self, Chest, Auth};
use pas::request::Request;
use pas::send_funds::{Self, SendFunds};
use pas::unlock_funds::{Self, UnlockFunds};
use pas::clawback_funds::{Self, ClawbackFunds};
use pas::templates::Templates;
use ptb::ptb;  // 用于 move_call、ext_input、object_by_id 等

解析函数里会用到 request.data()request.approve(...),以及 send_funds::sender/recipient/funds 等访问器。

什么是 PAS

Permissioned Assets Standard(PAS) 是 Sui 上用于发行和管理许可型资产的框架,面向需要合规约束、转移限制和监管控制的同质化代币场景(如证券型代币、稳定币、合规稳定币等)。资产只能存放在 Chest 中,转账通过 Request(SendFunds / UnlockFunds / Clawback) 发起,并由发行方定义的解析逻辑(含 KYC、白名单、限额等)批准后才会完成。

参考:MystenLabs/pasPR #25 KYC-compliant coin example

设计目标

  • 许可转移:所有转账必须经过 Chest,并由与 Policy 绑定的自定义规则批准。
  • Chest 架构:代币只能存在于 Chest 中,每个地址(或对象)对应一个派生 Chest,便于发现与 RPC 查询。
  • 灵活策略:每种代币类型对应一个 Policy,可配置不同动作(send_funds、unlock_funds、clawback_funds)所需的审批类型。
  • 可选 Clawback:在注册时选择是否允许监管收回(clawback),满足合规需求。

核心概念一览

概念说明
Namespace全局单例,用于派生 Chest、Policy、Templates 的地址,并管理版本阻断。
Chest每个地址(或对象)一个,由 Namespace 派生;余额只能从 Chest 到 Chest 或通过 Unlock 流出。
Policy<T>与代币类型 T 绑定,规定各动作(send_funds 等)需要哪些「审批类型」才能 resolve。
Request转账/解锁/收回时产生的「热土豆」,须在 PTB 中调用发行方包里的 resolve 逻辑并凑齐所需审批后 resolve。
Templates存储每种审批类型对应的 PTB Command,供 SDK 自动构造解析交易。

与既有方案的详细对比

下表对比 PAS 与本书前面介绍的几种「受限/合规」方案,便于按场景选型。

维度PAS(许可资产标准)DenyList 受监管代币(13.4)闭环 Token(Closed-Loop)(13.5)Kiosk TransferPolicy(14.4)
适用资产同质化、许可型(如合规稳定币、证券型代币)同质化 Coin,链上原生同质化 Token(sui::token)NFT / 可交易对象
存储形态余额在 Chest(每地址一个派生对象)普通 Coin<T> 在钱包地址Token<T>,转移受 Policy 约束对象在 Kiosk 或钱包
限制方式每笔转账生成 Request,须发行方包内 resolve(任意逻辑:KYC、白名单、限额等)黑名单:被列地址不能收/发该 Coin;可选全局暂停TokenPolicy:按动作(transfer/spend 等)配置 Rule,须 prove 后 confirmTransferPolicy:按 Rule 收版税、锁定 Kiosk 等,满足后 confirm_request
谁做校验发行方自己的 Move 模块(approve_transfer 等),可读链上/链下 KYC 等链上 DenyList 系统对象,DenyCap 持有者维护名单链上 TokenPolicy,Rule 的 prove 在合约内链上 TransferPolicy,Rule 的 add_receipt 在合约内
发现与索引Chest/Policy 地址可推导,无需事件即可查余额普通对象,按类型与 owner 查询普通对象,按类型与 owner 查询需 Policy 与 Kiosk 对象 ID
Clawback支持(Policy 注册时可选,由发行方发起 clawback 请求并 resolve)不支持(仅禁止转移)一般不支持不适用
解锁到链上通用余额通过 UnlockFunds 请求,由 Policy 决定是否允许「流出 PAS 体系」无「解锁」概念,仅黑名单解除无「解锁」概念不涉及
典型场景合规稳定币、证券型代币、需 KYC/AML 的资产制裁名单、简单黑名单合规游戏积分、忠诚度、仅限应用内使用NFT 版税、NFT 锁定在 Kiosk

选型建议

  • 只需黑/白名单、无需每笔自定义逻辑:DenyList 受监管代币即可。
  • 同质化 + 每笔转账都要做 KYC/限额/白名单等自定义检查:用 PAS,在 resolve 里实现你的规则。
  • 同质化 + 仅限在自家应用内 transfer/spend:闭环 Token + TokenPolicy 更轻。
  • NFT 版税、Kiosk 内交易与锁定:用 Kiosk + TransferPolicy

Coin、受监管 Coin、闭环 Token 与 PAS 详解

下面从「存储与转移模型」「谁做校验」「能表达什么规则」「典型用途」四方面,把 标准 CoinDenyList 受监管 Coin闭环 TokenPAS 说清,并说明为什么要 PAS

1. 标准 Coin(普通代币)

项目说明
创建方式coin_registry::new_currency_with_otw + finalize,得到 TreasuryCap<T>MetadataCap<T>
存储形态Coin<T>Balance<T> 在用户地址下,和任意 Sui 对象一样可自由持有、转移
转移方式任意人可 coin::transferbalance::send_funds,无需发行方或第三方参与
谁做校验无。链上不对「谁可以转、转给谁、转多少」做额外校验
能表达什么规则无链上合规规则,仅依赖应用层或链下约束
Clawback / 收回不支持。发行方无法从用户地址收回已转出的代币
典型用途通用支付、DeFi、无合规要求的同质化代币

小结:Coin 是「完全开放」的同质化资产,适合不需要合规或转移限制的场景。


2. DenyList 受监管 Coin(黑名单代币)

项目说明
创建方式在 Coin 创建流程上多加一步 coin_registry::make_regulated,得到 DenyCapV2<T>;代币仍为链上标准 Coin
存储形态仍是 Coin<T> 在用户地址,和普通 Coin 一致
转移方式仍是标准 coin::transfer,但链上在转移时检查 DenyList:若发送方或接收方在黑名单中,转移被拒绝
谁做校验DenyList 系统对象 + DenyCapV2 维护的黑名单;校验逻辑固定为「地址是否在名单中」
能表达什么规则仅黑名单:禁止某些地址收/发;可选全局暂停(暂停该代币所有转移)
Clawback / 收回不支持。只能「禁止转移」,不能把已持有的代币从地址中收回
典型用途制裁名单、简单合规黑名单、需要「一键暂停」的稳定币

小结:受监管 Coin 在「标准 Coin + 黑名单 + 可选全局暂停」范围内做合规,不能做按笔的 KYC、白名单、限额、自定义逻辑。


3. 闭环 Token(Closed-Loop Token)

项目说明
创建方式coin_registry::new_currency_with_otw + finalize 得到货币元数据,再用 token::new_policy 创建 TokenPolicy<T>,并为各动作(transfer、spend、to_coin 等)绑定 Rule
存储形态Token<T>(无 store),不能随意转手;只能通过 ActionRequest 发起操作,满足 Policy 的 Rule 并 confirm 后才完成
转移方式token::transfer 生成 ActionRequest;用户(或应用)调用各 Rule 的 prove 往 request 上「盖章」,再 token::confirm_request 完成转移
谁做校验TokenPolicy 上挂的 Rule(如 CrownCouncilRule);每个 Rule 在 prove 里实现自己的逻辑(成员集合、时间锁等)
能表达什么规则动作(transfer / spend / to_coin)配置不同 Rule;可做白名单、成员校验、时间锁等,但规则是「满足 Rule 即放行」,不能由发行方在链上做「每笔审批」或读链下 KYC
Clawback / 收回一般不提供;若要收回应由发行方通过自有 Cap 或 Rule 设计实现
典型用途游戏内货币、忠诚度积分、仅限应用内使用的代币、需要「满足规则才可转」的同质化 Token

小结:闭环 Token 是「同质化但非自由流通」的 Token,规则由 Rule + prove 表达,适合应用内闭环;不是「每笔都经发行方或链下 KYC 审批」的模型。


4. PAS(许可资产标准)

项目说明
创建方式依赖 PAS 包(Namespace、Templates 等);发行方用 coin_registry 等创建货币后,用 policy::new_for_currency 在 PAS 里注册 Policy<Balance<C>>,并可选配置 Clawback
存储形态余额只能在 Chest 中(每地址或每对象一个派生 Chest);没有「裸 Coin 在钱包」的形态,所有转入必须先进入 Chest
转移方式chest::send_balance 生成 Request<SendFunds>(热土豆);同一 PTB 内必须调用发行方包里的解析函数(如 approve_transfer),做任意校验后 request.approve(…),再 send_funds::resolve_balance 才完成 Chest→Chest 转账
谁做校验发行方自己的 Move 模块(解析函数);可读链上状态(KYC 表、白名单)、也可依赖链下输入(通过参数或预言机),每笔都可做不同逻辑
能表达什么规则任意链上/链下逻辑:KYC、白名单、黑名单、单笔限额、冷却期、监管审批等;还可区分 send_funds / unlock_funds / clawback_funds 配置不同审批
Clawback / 收回支持。Policy 注册时可选 clawback_allowed;发行方发起 clawback_balance 请求并满足 Policy 审批后 resolve,即可从某 Chest 收回余额
解锁到链上UnlockFunds 请求:经 Policy 审批后可将余额从 PAS 体系解锁为链上通用 Balance/Coin,用于赎回或退出
典型用途合规稳定币、证券型代币、需 KYC/AML 的资产、需要监管收回或解锁控制的场景

小结:PAS 是「每笔转移都可被发行方自定义逻辑约束」的同质化资产框架,且支持 Clawback 与可控解锁。


为什么要 PAS:三种方案覆盖不了的场景

  • Coin:不限制谁转、转给谁、转多少,无法做合规或每笔审批。
  • Deny Coin:只能「禁止名单内地址」,不能做「仅允许 KYC 用户」「单笔限额」「每笔经发行方逻辑放行」。
  • 闭环 Token:规则是「满足 Rule 即放行」,规则在链上固定(如成员集、时间锁),不能做「每笔由发行方或链下 KYC 审批」;且一般无 Clawback、无「解锁到链上」的标准路径。

PAS 要解决的问题恰恰是:

  1. 每笔转移都可执行自定义合规逻辑(KYC、限额、白名单、黑名单、监管审批等),且逻辑在发行方自己的 Move 模块里,可演进、可升级。
  2. 需要 Clawback:监管或司法要求时,发行方能从指定 Chest 收回资产。
  3. 需要可控「解锁」:在合规允许时,将资产从 PAS 体系解锁为链上通用余额(如赎回为稳定币或法币通道)。
  4. 钱包/SDK 友好:通过 Templates + Command,链下可以按「审批类型」自动拼出解析 PTB,而不必手写每家的解析逻辑。

因此:当你要做「同质化 + 每笔可审批 + 可选 Clawback/解锁」的合规资产时,应选 PAS;若只需黑名单或应用内闭环,用 Deny Coin 或闭环 Token 更简单。


用途对比一览

需求CoinDeny Coin闭环 TokenPAS
自由转账、无合规✅ 默认✅ 未列名单即可❌ 须过 Rule❌ 须过解析
禁止某些地址收/发✅ 黑名单可用 Rule 模拟✅ 解析里可做
全局暂停需自建可用 versioning 阻断
仅允许某类用户(如 KYC)每笔校验❌ Rule 无法表达「链下 KYC」✅ 解析里读 KYC/白名单
单笔限额、冷却期等自定义规则仅 Rule 能表达的有限形式✅ 任意逻辑
发行方收回资产(Clawback)一般不提供✅ Policy 可选
合规「解锁」到链上余额有 to_coin 等但非标准解锁✅ UnlockFunds
钱包/SDK 自动拼解析交易✅ Templates + Command
适用典型场景通用支付、DeFi制裁/黑名单合规游戏积分、应用内代币证券型代币、合规稳定币、KYC 资产

小结

  • Coin:自由转移、无合规;Deny Coin:黑名单 + 可选全局暂停,无每笔逻辑、无 Clawback;闭环 Token:Rule + ActionRequest,应用内闭环,无每笔发行方审批、一般无 Clawback;PAS:Chest + Request + 发行方解析,每笔可自定义合规、可选 Clawback 与 Unlock。
  • PAS 面向许可型同质化资产,通过 Chest + Request + Policy 解析 实现「每笔转移都可被发行方规则约束」;为什么要 PAS:当需要每笔 KYC/限额/白名单、Clawback 或合规解锁时,Coin / Deny Coin / 闭环 Token 无法满足,选 PAS。
  • 选型时结合「用途对比一览」表:按需求看哪一列打勾,即可在四种方案中做出取舍。