ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

Diem RecoveryAddress 模块深入解析:VASP 账户恢复机制的设计、实现与形式化验证

Diem RecoveryAddress 模块深入解析:VASP 账户恢复机制的设计、实现与形式化验证 Diem RecoveryAddress 模块深入解析VASP 账户恢复机制的设计、实现与形式化验证【免费下载链接】diemDiem’s mission is to build a trusted and innovative financial network that empowers people and businesses around the world.项目地址: https://gitcode.com/gh_mirrors/di/diem本篇文章基于 Diem 区块链核心框架language/diem-framework/releases/artifacts/release-1.4.0-rc0/docs/modules/RecoveryAddress.md及其源码 RecoveryAddress.move系统剖析 Diem 为 VASP虚拟资产服务提供商设计的链上账户恢复机制它如何通过密钥轮换能力KeyRotationCapability的委托让一个回收地址集中托管同一 VASP 下多个账户的密钥恢复权限。读完本文你将掌握RecoveryAddress资源的结构与生命周期、三个核心入口函数的实现细节与中止条件、MAX_REGISTERED_KEYS等关键常量的约束以及 Move Prover 形式化规范如何保证该机制的安全属性。一、为什么需要链上账户恢复机制在 Diem 的账户模型中每个账户的链上身份由其认证密钥authentication key决定。一旦账户持有者丢失了私钥也就丢失了账户的控制权——除非存在一种机制让账户所有者能够重新生成并轮换认证密钥。Diem 对此给出的答案是DiemAccount模块中的KeyRotationCapability密钥轮换能力它是一种可被提取、转移、存储的授权凭证持有该凭证的一方即拥有为对应账户轮换认证密钥的权力。而RecoveryAddress模块在此基础上更进一步提供了面向 VASP 的多账户集中恢复方案同一 VASP 名下的多个账户可以将各自的KeyRotationCapability委托给一个共同的恢复地址恢复地址下的RecoveryAddress资源集中保存所有这些能力恢复地址自身的认证密钥可以被埋在深山里buried in the mountain只有在真正需要恢复某个账户时才被取出使用。这种设计在隔离高风险密钥与日常操作密钥的同时保留了紧急情况下的恢复通道是 Diem 链上账户管理体系中 VASP 侧的关键基础设施。二、核心资源RecoveryAddress2.1 资源定义RecoveryAddress是一个具备key能力的结构体意味着它可以作为全局存储资源发布在账户地址下见 RecoveryAddress.movestruct RecoveryAddress has key { rotation_caps: vectorKeyRotationCapability }唯一字段rotation_caps是一个KeyRotationCapability的向量存放同一 VASP 下多个账户委托过来的密钥轮换能力。该资源只能存储在 VASP 账户地址下并且从发布那一刻起就永不删除详见下文形式化规范中的资源持久性不变量。2.2 资源设计的两大保证从源码注释与publish实现RecoveryAddress.move可以看出该结构设计刻意保证了两个性质防止恢复循环publish强制要求资源创建者把自己的KeyRotationCapability放在rotation_caps的第一个位置Vector::singleton(rotation_cap)并断言该能力确实属于创建者自己EKEY_ROTATION_DEPENDENCY_CYCLE。这从机制上杜绝了A 是 B 的恢复地址、B 又是 A 的恢复地址这类循环依赖。rotation_caps恒非空由于首个元素必然是恢复地址自身的能力向量永远至少有一个元素这简化了后续所有遍历逻辑与形式化推理。三、错误码与关键常量模块定义了一套语义明确的错误码全部通过标准库 Errors 的错误构造器包装为对应类别的错误invalid_argument、already_published、not_published、limit_exceeded。下表汇总了全部错误常量及其触发场景常量值含义对应错误类别ENOT_A_VASP0只有 VASP 才能创建恢复地址INVALID_ARGUMENTEKEY_ROTATION_DEPENDENCY_CYCLE1将形成密钥轮换依赖循环INVALID_ARGUMENTECANNOT_ROTATE_KEY2调用者没有轮换该账户密钥的权限INVALID_ARGUMENTEINVALID_KEY_ROTATION_DELEGATION3委托双方不属于同一 VASPINVALID_ARGUMENTEACCOUNT_NOT_RECOVERABLE4目标账户不在恢复资源中INVALID_ARGUMENTERECOVERY_ADDRESS5RecoveryAddress资源状态异常NOT_PUBLISHED/ALREADY_PUBLISHEDEMAX_KEYS_REGISTERED6注册的密钥数量已达上限LIMIT_EXCEEDED此外还有一个关键上限常量MAX_REGISTERED_KEYS: u64 256单个恢复地址最多可注册 256 个密钥轮换能力RecoveryAddress.move。add_rotation_capability在追加前会校验Vector::length(recovery_caps) MAX_REGISTERED_KEYS超出即抛出EMAX_KEYS_REGISTERED。四、三个核心入口函数4.1publish初始化恢复地址public fun publish(recovery_account: signer, rotation_cap: KeyRotationCapability)publish提取recovery_account自己的KeyRotationCapability并在其地址下发布RecoveryAddress资源。执行流程与中止条件RecoveryAddress.move校验recovery_account是 VASP 账户否则以ENOT_A_VASP中止校验传入的rotation_cap确属recovery_account本人防止循环依赖否则以EKEY_ROTATION_DEPENDENCY_CYCLE中止校验该地址下尚未存在RecoveryAddress资源不可重复发布否则以ERECOVERY_ADDRESSALREADY_PUBLISHED类别中止通过move_to发布资源rotation_caps初始化为仅含自身能力的单元素向量。在链上脚本层这一操作对应Script::create_recovery_address/AccountAdministrationScripts::create_recovery_address交易脚本见 transaction_script_builder.rs 与 AccountAdministrationScripts.move。4.2add_rotation_capability登记新账户的恢复能力public fun add_rotation_capability( to_recover: KeyRotationCapability, recovery_address: address, )将一个账户to_recover的密钥轮换能力加入恢复地址的rotation_caps向量。其安全约束RecoveryAddress.moverecovery_address下必须已存在RecoveryAddress资源否则以ERECOVERY_ADDRESSNOT_PUBLISHED中止通过VASP::is_same_vasp校验to_recover与recovery_address属于同一 VASP否则以EINVALID_KEY_ROTATION_DELEGATION中止——这是跨实体恢复权限的硬性隔离边界校验注册数量未达MAX_REGISTERED_KEYS否则以EMAX_KEYS_REGISTERED中止通过Vector::push_back追加能力到向量尾部。链上脚本层对应Script::add_recovery_rotation_capability见 transaction_script_builder.rs其错误码映射在 AccountAdministrationScripts.move 中有完整表格化文档。4.3rotate_authentication_key执行密钥恢复public fun rotate_authentication_key( account: signer, recovery_address: address, to_recover: address, new_key: vectoru8, )这是恢复机制的最终落点将to_recover账户的认证密钥轮换为new_key32 字节。执行逻辑RecoveryAddress.move校验recovery_address下存在恢复资源否则以ERECOVERY_ADDRESS中止权限校验调用者account必须是to_recover本人能力原主可自行轮换或recovery_address资源持有者可代任何已登记账户轮换否则以ECANNOT_ROTATE_KEY中止线性遍历rotation_caps逐个比对DiemAccount::key_rotation_capability_address(cap) to_recover命中后调用DiemAccount::rotate_authentication_key(cap, new_key)完成轮换并返回若遍历结束仍未命中以EACCOUNT_NOT_RECOVERABLE中止。需要注意两个细节new_key必须是 32 字节形式化规范RotateAuthenticationKeyAbortsIf显式声明aborts_if len(new_key) ! 32 with Errors::INVALID_ARGUMENT即长度不合法时中止只有to_recover与恢复地址持有者两个入口规范中aborts_if !(Signer::spec_address_of(account) recovery_address || Signer::spec_address_of(account) to_recover)将可调用方精确限定为两者杜绝了任意第三方借道恢复地址干扰他人账户。链上脚本层对应Script::rotate_authentication_key_with_recovery_address见 transaction_script_builder.rs。五、模块级形式化规范用证明保证安全该模块的最大亮点在于随源码内嵌的 Move Prover 规范spec module段见 RecoveryAddress.move将安全属性写成可机械验证的不变量。主要包括五类5.1 初始化不变量每个恢复地址必然持有自己的KeyRotationCapability且位于rotation_caps[0]向量长度恒大于 0。invariant forall addr: address where spec_is_recovery_address(addr): ( len(spec_get_rotation_caps(addr)) 0 spec_get_rotation_caps(addr)[0].account_address addr );这印证了 2.2 节的两个设计保证并使其成为全模块恒成立的性质。5.2 资源持久性不变量一旦地址下发布了RecoveryAddress资源该资源在任何交易后都继续存在模块未提供删除路径。invariant update forall addr: address: old(spec_is_recovery_address(addr)) spec_is_recovery_address(addr);5.3 密钥轮换能力持久性不变量若恢复地址在更新前持有某账户的能力则更新后仍然持有RecoveryAddress资源本身也永不消失。invariant update forall addr: address where old(existsRecoveryAddress(addr)): existsRecoveryAddress(addr);5.4 资源与角色一致性不变量只有 VASP 账户才能持有RecoveryAddress资源。invariant forall addr: address where spec_is_recovery_address(addr): VASP::is_vasp(addr);该不变量与publish中的ENOT_A_VASP检查形成运行时检查 静态证明的双重保障。5.5 辅助函数与函数级规范模块定义了三个规范辅助函数spec_is_recovery_address(addr)判定某地址是否为恢复地址即是否存在该资源spec_get_rotation_caps(recovery_address)读取恢复地址下的全部能力向量spec_holds_key_rotation_cap_for(recovery_address, addr)判定恢复地址是否持有某账户的能力。每个公开函数均通过AbortsIf/Ensures模式声明了完备的中止条件与后置条件。例如rotate_authentication_key的后置条件RecoveryAddress.move为ensures DiemAccount::authentication_key(to_recover) new_key;即函数成功返回则to_recover的认证密钥必然已变为new_key把运行时行为固化为可验证的承诺。六、模块依赖与在框架中的位置RecoveryAddress的依赖关系见文档头部use声明展示了它与框架其他模块的协作边界依赖模块用途DiemAccountKeyRotationCapability类型定义、能力地址查询与认证密钥轮换执行VASPis_vasp角色校验与is_same_vasp同组校验Errors错误码包装与分类Signer获取签名者地址Vector能力向量的构造、遍历与追加其上层调用方为 AccountAdministrationScripts.move将三个函数封装为可直接提交到链上的交易脚本同时每个版本发布的交易脚本构建器 transaction_script_builder.rs 提供了 Rust 侧的脚本枚举CreateRecoveryAddress、AddRecoveryRotationCapability、RotateAuthenticationKeyWithRecoveryAddress供客户端 SDK 生成对应交易。从发布产物看该模块自 release-1.2.0-rc0 起即已存在见 release-1.2.0-rc0/docs/modules/RecoveryAddress.md并在 1.4.0-rc0 中持续提供相同接口属于 Diem 框架中长期稳定的账户管理组件。七、典型使用流程与安全边界总结结合上文一个完整的 VASP 账户恢复场景可以归纳为四个步骤初始化VASP 账户 A 调用publish链上脚本create_recovery_address提取自身能力并在 A 下发布RecoveryAddress资源登记同一 VASP 下的账户 B、C 等各自调用add_rotation_capability链上脚本add_recovery_rotation_capability把自身能力委托给 A需满足同 VASP 约束隔离保管A 的认证密钥私钥被离线妥善保管buried in the mountain日常不参与任何交易签名应急恢复当 B 或 C 的私钥丢失时由 A或账户本人调用rotate_authentication_key链上脚本rotate_authentication_key_with_recovery_address将目标账户认证密钥轮换为新密钥。该机制的安全边界可以凝练为三点同 VASP 隔离恢复能力只能在 VASP 内部委托跨 VASP 委托被EINVALID_KEY_ROTATION_DELEGATION强制拒绝双入口调用只有能力原主与恢复地址持有者可以触发轮换第三方无法干预能力集中、密钥分离多个账户的恢复能力集中在单一地址而该地址的高权限密钥独立保管实现了日常低风险操作与应急高权限操作的物理隔离。【免费下载链接】diemDiem’s mission is to build a trusted and innovative financial network that empowers people and businesses around the world.项目地址: https://gitcode.com/gh_mirrors/di/diem创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表