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),仅供参考

相关新闻

3招搞定网页中的视频怎么下载,从入门到精通

3招搞定网页中的视频怎么下载,从入门到精通

3招搞定网页中的视频怎么下载,从入门到精通 官方文档太长抓不住重点?别急,直接看这篇。 很多人以为下载视频就是右键另存为,但在实际开发和面试中,这往往是个坑。从入门到精通,你需要理解背后的 HTTP 协议、流媒体传输机制以及反爬策略。…

2026/9/22 9:42:57 阅读更多 →
温研备考3大误区速查手册:别再瞎折腾环境了

温研备考3大误区速查手册:别再瞎折腾环境了

温研备考3大误区速查手册:别再瞎折腾环境了 配置环境就卡半天,代码跑不通,心态崩了半截。 别慌,这不是你的问题,是没人给你一份靠谱的速查手册。 今天把温研相关的技术选型坑点,一次性给你捋清楚。…

2026/9/22 9:42:57 阅读更多 →
智能h3输入法2006避坑指南:搞懂底层原理,告别版本崩溃

智能h3输入法2006避坑指南:搞懂底层原理,告别版本崩溃

智能h3输入法2006避坑指南:搞懂底层原理,告别版本崩溃 版本升级后 API 全变了?别慌,这不是玄学,是机制变了。 很多老鸟在维护老旧系统或进行逆向分析时,常遇到智能h3输入法2006这种“远古”但依然坚挺的工具。一升级依赖库,直接报错…

2026/9/22 9:41:56 阅读更多 →

最新新闻

FASTA文件处理速查手册:Python与Go性能对比及选型指南

FASTA文件处理速查手册:Python与Go性能对比及选型指南

FASTA文件处理速查手册:Python与Go性能对比及选型指南 盯着屏幕上一长串 IndexError: list index out of range ,或者 Go 语言里 panic: runtime error: slice…

2026/9/22 10:34:24 阅读更多 →
3步搞懂youiku:保姆级教程助你面试不再露馅

3步搞懂youiku:保姆级教程助你面试不再露馅

3步搞懂youiku:保姆级教程助你面试不再露馅 面试时面试官轻飘飘问一句“说说 youiku 的核心原理”,你脑子瞬间一片空白,只能支支吾吾说“好像是做数据处理的”。这种尴尬谁没经历过?别慌,这篇保姆级教程就是为你准备的。我们直接撕开…

2026/9/22 10:34:23 阅读更多 →
经营养成开发避坑指南:3个核心模块解决StackTrac报错

经营养成开发避坑指南:3个核心模块解决StackTrac报错

经营养成开发避坑指南:3个核心模块解决StackTrac报错 面对满屏红色的 StackTrace,你是否感到窒息?每一行 NullPointerException 或 ArrayIndexOutOfBoundsException…

2026/9/22 10:34:23 阅读更多 →
w10防火墙怎么关闭完整示例与性能优化实战

w10防火墙怎么关闭完整示例与性能优化实战

w10防火墙怎么关闭完整示例与性能优化实战 刚学会Python语法,手痒想跑个本地Web服务,结果浏览器死活连不上。不是代码错了,是Windows…

2026/9/22 10:34:23 阅读更多 →
3天搞定背包旅游源码解析:API全变后的实战重构指南

3天搞定背包旅游源码解析:API全变后的实战重构指南

3天搞定背包旅游源码解析:API全变后的实战重构指南 昨天刚把项目从 Node 18 升级到 Node 20,再顺手把 Express 换成了…

2026/9/22 10:33:23 阅读更多 →
春暖花开性8最新地址避坑指南:3步搞定源码手写实现

春暖花开性8最新地址避坑指南:3步搞定源码手写实现

春暖花开性8最新地址避坑指南:3步搞定源码手写实现 报错一堆看不懂 StackTrace?别慌,这就是很多新人面对【春暖花开性8最新地址】相关模块时的真实写照。今天这篇避坑指南,不聊虚的,直接带你拆解核心逻辑。哪怕你之前只看过文档没动过手,…

2026/9/22 10:33:23 阅读更多 →

日新闻

3台商务办公笔记本实测:手写实现环境配置,告别卡半天

3台商务办公笔记本实测:手写实现环境配置,告别卡半天

3台商务办公笔记本实测:手写实现环境配置,告别卡半天 配置环境就卡半天?别怪机器慢,多半是你没选对工具链。在Java、Go或Python的项目现场, 手写实现…

2026/9/22 0:00:41 阅读更多 →
剑帝加点速查手册:3分钟搞懂核心逻辑

剑帝加点速查手册:3分钟搞懂核心逻辑

剑帝加点速查手册:3分钟搞懂核心逻辑 面试被问原理答不上来,是不是常态?别慌。很多开发者对着 GitHub 开源仓库里的代码发呆,看似简单实则暗藏玄机。今天这份【剑帝加点】速查手册,直接带你拆解核心实现,把面试必考的原理讲透。…

2026/9/22 0:00:41 阅读更多 →
手写实现图片压缩网站核心:搞定WebP转换与质量调优

手写实现图片压缩网站核心:搞定WebP转换与质量调优

手写实现图片压缩网站核心:搞定WebP转换与质量调优 复制来的代码跑不通不知道怎么调?别慌,这种“复制粘贴地狱”在开发圈太常见了。尤其是做 图片压缩网站…

2026/9/22 0:00:41 阅读更多 →

周新闻

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

直接铺开项目本身吧。这几个月我一直在折腾一件事:用Flutter给OpenHarmony做一款游戏集合类的App,说白了就是把若干小游戏塞进一个壳里,用统一入口分发。这个方向本身不算新鲜,真正让我花了不少心思的,是首页那堆游戏卡…

2026/9/22 4:32:41 阅读更多 →
Word表格编号全攻略:从列表编号到题注交叉引用

Word表格编号全攻略:从列表编号到题注交叉引用

写Word文档,最让人头疼的往往是那些“看起来不起眼”的小问题。比如表格编号这事:今天在表后面多加了两个空白行,明天给客户交稿前发现整个章节的编号全部错位,光是挨个改序号就能耗掉大半个下午。我前阵子帮人整理一份上百页的技…

2026/9/22 4:38:57 阅读更多 →
从第一个站到第二个站:独立开发者的静态网站选型与落地实践

从第一个站到第二个站:独立开发者的静态网站选型与落地实践

1. 项目概述1.1 核心需求解析做独立开发者这几年,说实话,第一个网站上线的那天晚上我兴奋得没睡着。但等它跑了半年,流量惨淡、功能臃肿、代码自己都懒得看第二遍之后,我才慢慢琢磨明白一个道理:第一个网站是练手&…

2026/9/22 8:51:04 阅读更多 →

月新闻

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能分类:[AI/大模型]细分主题:AI 增强型 CI/CD 流水线自动化与 GitOps 实践:Agent 工作流、工具调用与任务拆解:从原型到生产的验收清单很多团队在尝试用大…

2026/9/21 15:36:51 阅读更多 →
容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场分类:[工程技术]细分主题:Kubernetes 生产环境运维与排障实战:可复制的项目复盘模板与决策记录大部分团队的事故复盘报告,最后都变成了躺在 Confluence 或钉…

2026/9/21 15:36:51 阅读更多 →
容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步分类:[工程技术]细分主题:Docker 容器化技术与镜像安全管理:核心链路的逐步实现与关键代码取舍面对一个积累了五六年历史包袱的单体架构应用(包含 Web 接口、后台…

2026/9/22 2:43:42 阅读更多 →