其他
RFC:监管合规性扩展
监管合规性扩展(Regulation Compliance Extension,RCE)是 xUDT 的一个扩展,它增强了 UDT 的监管合规性能力,具有以下功能:
调用白名单 调用黑名单 紧急停止 PKI Style 监管机构支持
Multiple Administrators
监管合规性扩展(RCE)脚本
Code hash: RCE script code hash
Hash type: RCE script hash type
Args: <type ID args for RCE cell>
array Byte32 [byte; 32];
array Uint128 [byte; 16];
struct RCRule { // RC stands for Regulation Compliance
smt_root: Byte32,
flags: byte,
}
vector RCCellVec <Byte32>;
union RCData {
RCRule,
RCCellVec,
}
一个正常的 RCRule 结构。当执行时,RCE 脚本将从类型 ID args 表示的 RCE cell 中加载数据,并强制执行以下检查: 如果当前 RCRule 使用白名单,则当前交易中 xUDT cell 的所有 lock script hash 必须出现在白名单 SMT 树中。关于 SMT 的工作原理细节将在下面解释。 如果当前 RCRule 使用黑名单,则当前交易中的 xUDT cell 的 lock script hash 都不能出现在黑名单 SMT 树中。 当前 RCRule 不能处于紧急停止模式。 RCCellVec 结构的工作原理稍有不同: 首先,嵌套的 RCCellVec 结构被简化为一个只包含 RCRule 结构的普通数组。为了简单起见,我们将添加一个限制,以便任何 RCE cell 最多可以包含 8192 个 RCRule 结构。任何更多的 RCRule 结构都将导致立即失败。 当前交易中当前 xUDT cell 所使用的 lock script hash,都不能在任何使用黑名单的 RCRule 结构的 SMT 树中找到。 只要有任何 RCRule 结构使用了白名单,那么当前交易中所有 xUDT cell 所使用的 lock script hash,都必须在至少一个使用白名单的 RCRule 结构的 SMT 树中找到,且该结构不处于紧急停止模式。
SMT
lock hash 包含在白名单 SMT 中 lock hash 不包含在黑名单 SMT 中
操作
调用
Type:
code_hash: extensible_udt type script
args: <owner lock script hash> <xudt args for RCE script>
Lock:
<user defined lock 1>
<...>
Outputs:
<vec> xUDT_Cell
Data:
<amount: uint128> <xudt data>
Type:
code_hash: extensible_udt type script
args: <owner lock script hash> <xudt args for RCE script>
Lock:
<user defined lock 2>
<...>
Witnesses:
WitnessArgs structure:
Lock: <user defined>
Input Type:
<vec> Bytes structure:
<proof length>
<proof that lock 1 & 2 are both mapped to 1 in SMT>
<...>
更新 RCE cell 中的白名单 SMT
<...>
Outputs:
<vec> RCE Cell
Data:
RCRule:
<new smt root>
<flags>
Type:
<type id type script>
Lock:
<user defined lock>
<...>
Witnesses:
WitnessArgs structure:
Lock: <user defined>
Input Type:
<vec> Bytes structure:
<number of updated keys>
<updated key 1> <updated value 1> <old value 1>
<updated key 2> <updated value 2> <old value 2>
<...>
<proof length>
<proof for the updated keys in the old SMT>
<...>
利用给定的证明,在给定的旧 SMT 根哈希时,我们首先测试更新的密钥和提供的旧值是否正确。 现在我们使用给定的证明,测试使用更新的密钥和更新的值,可以计算出新的 SMT 根哈希。