首页/新闻资讯/正文详情

Diem 框架模块解析:SharedEd25519PublicKey 共享 Ed25519 公钥与认证密钥联动轮换机制

发布时间:2026/9/23 1:13:08 来源:云帆数科 栏目:资讯中心
Diem 框架模块解析:SharedEd25519PublicKey 共享 Ed25519 公钥与认证密钥联动轮换机制
Diem 框架模块解析SharedEd25519PublicKey 共享 Ed25519 公钥与认证密钥联动轮换机制【免费下载链接】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/diem0x1::SharedEd25519PublicKey是 Diem 区块链 Move 框架中的账户密钥管理模块它通过把公钥与账户认证密钥authentication key绑定联动实现可轮换、可共享的 Ed25519 密钥托管能力。本文基于 Diem 框架 1.2.0-rc0 发布工件中的模块文档SharedEd25519PublicKey.md并结合仓库源码完整讲解其资源模型、全部公开函数、密钥派生与轮换的底层原理、错误处理与形式化规范读完你能够理解该模块的完整语义并能直接复用其publish/rotate_key流程设计自己的密钥托管方案。模块定位为什么要共享一把 Ed25519 公钥在 Diem 账户模型中一个账户地址对应一个 32 字节的认证密钥authentication key交易签名校验最终验证的是认证密钥与签名是否匹配。正常情况下认证密钥由账户私钥派生而来用户更换私钥即需轮换认证密钥。SharedEd25519PublicKey模块解决的是一个更具体的托管场景某个地址持有该模块的资源后可以轮换资源中保存的 Ed25519 公钥同时账户的认证密钥会被锁定同步地更新为从新公钥派生的值。用模块文档的原话概括每个持有SharedEd25519PublicKey资源的地址都可以轮换存储在该资源中的公钥但该账户的认证密钥会随之联动更新从而保证两个密钥始终同步。这一机制的实际价值在于账户的私钥可以由密钥托管方持有例如硬件钱包、托管服务或恢复服务而链上账户始终只认从共享公钥派生出的认证密钥任何一次公钥轮换都会同时让链上认证密钥生效杜绝资源里存的公钥与实际使用的认证密钥失配的安全隐患。从源码看该模块位于 language/diem-framework/modules/SharedEd25519PublicKey.move依赖四个内部模块use DiemFramework::Authenticator; use DiemFramework::DiemAccount; use DiemFramework::Signature; use Std::Errors; use Std::Signer;其中DiemAccount提供认证密钥与轮换能力Authenticator负责从公钥派生认证密钥Signature提供 ed25519 公钥合法性校验。资源结构一个公钥 一个轮换能力模块定义了一个具有key能力的资源SharedEd25519PublicKey字段如下字段类型说明keyvectoru832 字节 ed25519 公钥rotation_capDiemAccount::KeyRotationCapability账户的密钥轮换能力其认证密钥始终由key派生struct SharedEd25519PublicKey has key { /// 32 byte ed25519 public key key: vectoru8, /// rotation capability for an account whose authentication key is always derived from key rotation_cap: DiemAccount::KeyRotationCapability, }rotation_cap是整个设计的核心。查看 DiemAccount.move 中的定义/// The holder of KeyRotationCapability for account_address can rotate the authentication key for /// account_address (i.e., write to account_address/DiemAccount/authentication_key). /// There is at most one KeyRotationCapability in existence for a given address. struct KeyRotationCapability has store { /// Address that KeyRotationCapability was associated with when it was created. account_address: address, }KeyRotationCapability只记录创建时绑定的account_address持有该能力即可为该地址轮换认证密钥。每个地址最多同时存在一个这样的能力——这正是SharedEd25519PublicKey可以接管账户密钥控制权的前提资源持有者即资源所在的托管地址通过持有这份能力可以随时把账户认证密钥轮换到任意新公钥派生的值。常量与错误码模块定义了两个u64错误码常量值含义EMALFORMED_PUBLIC_KEY0共享的 ed25519 公钥不是合法的 ed25519 公钥ESHARED_KEY1共享 ed25519 公钥资源未处于所需状态如重复发布或尚未发布const EMALFORMED_PUBLIC_KEY: u64 0; const ESHARED_KEY: u64 1;这些错误码在调用时会与Errors模块的错误类别invalid_argument、already_published、not_published组合成完整的 abort 码下文各函数的错误场景会逐一说明。公开函数逐层解析模块对外暴露 4 个public函数 1 个内部辅助函数构成完整的生命周期publish发布→rotate_key轮换→key/exists_at读取与查询。publish提取轮换能力并发布资源public fun publish(account: signer, key: vectoru8)函数语义分两步执行将发送者的认证密钥轮换为从key派生的值在account地址下发布一个包含 32 字节 ed25519 公钥与发送者轮换能力的资源。实现代码public fun publish(account: signer, key: vectoru8) { let t SharedEd25519PublicKey { key: x, rotation_cap: DiemAccount::extract_key_rotation_capability(account) }; rotate_key_(mut t, key); assert(!exists_at(Signer::address_of(account)), Errors::already_published(ESHARED_KEY)); move_to(account, t); }关键细节先通过DiemAccount::extract_key_rotation_capability(account)把发送者账户的密钥轮换能力提取出来存入资源随后调用内部函数rotate_key_立即把认证密钥轮换到新公钥最后move_to发布资源。两次 abort 条件若发送者地址下已存在SharedEd25519PublicKey资源则以Errors::already_published(ESHARED_KEY)abort若key长度不是 32更准确地说未通过 ed25519 公钥校验则以Errors::invalid_argument(EMALFORMED_PUBLIC_KEY)abort。从 DiemAccount.move 可以看到extract_key_rotation_capability还会在账户已提取过轮换能力时以EKEY_ROTATION_CAPABILITY_ALREADY_EXTRACTEDabort因此一个账户只能发布一次共享公钥资源。rotate_key_内部的公钥轮换核心fun rotate_key_(shared_key: mut SharedEd25519PublicKey, new_public_key: vectoru8)这是模块内部无public修饰仅模块内可见的轮换实现承担全部密码学逻辑fun rotate_key_(shared_key: mut SharedEd25519PublicKey, new_public_key: vectoru8) { // Cryptographic check of public key validity assert( Signature::ed25519_validate_pubkey(copy new_public_key), Errors::invalid_argument(EMALFORMED_PUBLIC_KEY) ); DiemAccount::rotate_authentication_key( shared_key.rotation_cap, Authenticator::ed25519_authentication_key(copy new_public_key) ); shared_key.key new_public_key; }执行顺序很重要它保证了同步性先做密码学校验Signature::ed25519_validate_pubkeynative 函数定义于 Signature.move确认公钥是合法 ed25519 公钥用资源内持有的rotation_cap调用DiemAccount::rotate_authentication_key把账户认证密钥更新为从新公钥派生出的认证密钥最后把新公钥写回shared_key.key。认证密钥派生逻辑在 Authenticator.move/// Compute an authentication key for the ed25519 public key public_key public fun ed25519_authentication_key(public_key: vectoru8): vectoru8 { Vector::push_back(mut public_key, SINGLE_ED25519_SCHEME_ID); Hash::sha3_256(public_key) }即在 32 字节公钥末尾追加单签 ed25519 的 scheme ID再对整体做 SHA3-256得到 32 字节认证密钥。而DiemAccount::rotate_authentication_keyDiemAccount.move会校验认证密钥长度为 32然后写入cap.account_address对应的账户资源。由于rotation_cap内固定记录了被托管账户地址任何轮换都只能作用于该账户符合 DiemAccount.move 中RotateOnlyKeyOfCapAddress规范的访问控制约束。rotate_key公开的轮换入口public fun rotate_key(account: signer, new_public_key: vectoru8) acquires SharedEd25519PublicKey面向外部调用者的轮换接口将account地址下SharedEd25519PublicKey资源中保存的公钥轮换为new_public_key用资源中保存的能力把认证密钥轮换为从new_public_key派生的新值。public fun rotate_key(account: signer, new_public_key: vectoru8) acquires SharedEd25519PublicKey { let addr Signer::address_of(account); assert(exists_at(addr), Errors::not_published(ESHARED_KEY)); rotate_key_(borrow_global_mutSharedEd25519PublicKey(addr), new_public_key); }若account地址下没有该资源则以Errors::not_published(ESHARED_KEY)abort若new_public_key非法长度非 32 或非合法 ed25519 公钥则以Errors::invalid_argument(EMALFORMED_PUBLIC_KEY)abort实现上通过borrow_global_mut拿到资源的可变引用后复用内部rotate_key_保证公开入口与内部逻辑完全一致避免两处实现漂移。key与exists_at读取与查询public fun key(addr: address): vectoru8 acquires SharedEd25519PublicKey public fun exists_at(addr: address): boolkey返回addr地址下资源中保存的公钥若该地址未持有资源以Errors::not_published(ESHARED_KEY)abort。实现为*borrow_globalSharedEd25519PublicKey(addr).key。exists_at返回addr是否持有SharedEd25519PublicKey资源实现为existsSharedEd25519PublicKey(addr)不产生 abort。脚本层封装链上交易的调用入口该模块的能力通过AccountAdministrationScripts中的两个public(script)函数暴露给链上交易使用AccountAdministrationScripts.movepublish_shared_ed25519_public_keypublic(script) fun publish_shared_ed25519_public_key(account: signer, public_key: vectoru8) { SharedEd25519PublicKey::publish(account, public_key) }任何账户都可以发送此交易把发送账户的认证密钥轮换为public_key派生的值并在account下发布共享公钥资源。常见 abort 条件源码第 153-158 行错误类别错误原因说明Errors::INVALID_STATEDiemAccount::EKEY_ROTATION_CAPABILITY_ALREADY_EXTRACTED账户已提取/委托了其KeyRotationCapabilityErrors::ALREADY_PUBLISHEDSharedEd25519PublicKey::ESHARED_KEY资源已发布在该账户下Errors::INVALID_ARGUMENTSharedEd25519PublicKey::EMALFORMED_PUBLIC_KEYpublic_key不是合法 ed25519 公钥rotate_shared_ed25519_public_keypublic(script) fun rotate_shared_ed25519_public_key(account: signer, public_key: vectoru8) { SharedEd25519PublicKey::rotate_key(account, public_key) }任何此前发布过共享公钥资源的账户均可发送此交易轮换密钥。abort 条件源码第 512-516 行错误类别错误原因说明Errors::NOT_PUBLISHEDSharedEd25519PublicKey::ESHARED_KEY账户下未发布共享公钥资源Errors::INVALID_ARGUMENTSharedEd25519PublicKey::EMALFORMED_PUBLIC_KEYpublic_key不是合法 ed25519 公钥形式化规范用 Move Prover 保证的安全性质模块文档为每个函数都附带了 Move Prover 规范spec这些不是注释而是可由验证器证明的安全契约PublishAbortsIf证明publish仅在公钥不合法INVALID_ARGUMENT账户轮换能力不可用资源已存在ALREADY_PUBLISHED时 abortRotateKey_AbortsIf证明rotate_key_在公钥校验失败时以INVALID_ARGUMENTabort并包含DiemAccount::RotateAuthenticationKeyAbortsIf认证密钥长度必须为 32、目标账户必须存在RotateKey_Ensures证明轮换后shared_key.key new_public_key即资源内公钥与传入公钥严格一致模块级Persistence不变式spec module { invariant update forall addr: address where old(existsSharedEd25519PublicKey(addr)): existsSharedEd25519PublicKey(addr); }该全局不变式声明一旦某地址发布了SharedEd25519PublicKey资源该资源将永久存在、不可被销毁。这与资源的key能力而非store能力设计一致从形式化层面保证了托管关系的持久性。使用流程与注意事项总结一个完整的共享公钥托管流程如下发布托管服务以目标账户的signer调用publish(account, key)链上对应publish_shared_ed25519_public_key脚本完成提取轮换能力 轮换认证密钥 发布资源三步此后该账户认证密钥恒等于Authenticator::ed25519_authentication_key(key)轮换需要换钥时调用rotate_key(account, new_public_key)链上对应rotate_shared_ed25519_public_key脚本公钥与认证密钥原子性地同步更新查询通过exists_at(addr)判断托管状态通过key(addr)读取当前公钥。需要牢记的约束每个账户的KeyRotationCapability唯一publish只能成功一次重复发布以ALREADY_PUBLISHED失败公钥必须是合法 ed25519 公钥长度 32否则以EMALFORMED_PUBLIC_KEY失败资源一经发布不可删除Persistence 不变式设计时应把它视为永久的链上托管状态该模块的完整文档与同名实现还同步存在于发布工件 release-1.2.0-rc0 与 current 两套 artifacts 中源码与文档可对照阅读以追踪版本演进。【免费下载链接】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个iphone5耳机硬件避坑指南让老手不再踩雷
3个iphone5耳机硬件避坑指南让老手不再踩雷

3个iphone5耳机硬件避坑指南让老手不再踩雷 你是不是也经历过这种时刻:语法背得滚瓜烂熟,LeetCode刷了几百题,但一碰到iPhone… · 2026/9/23 1:13:08

RedwoodJS 官方教程导读:基于博客引擎项目学习全栈 GraphQL 应用开发
RedwoodJS 官方教程导读:基于博客引擎项目学习全栈 GraphQL 应用开发

后端前端Web框架开发工具 【免费下载链接】redwood RedwoodGraphQL 项目地址: https://gitcode.com/gh_mirrors/re/redwood 点击查看 免费下载 RedwoodJS 的官方教程(Tutorial)以"从零构建一个博客引擎"为主线,带领读者… · 2026/9/23 1:13:08

Skill Seekers 的 Kubernetes 部署实战:Helm 一键部署与手动清单双路径详解
Skill Seekers 的 Kubernetes 部署实战:Helm 一键部署与手动清单双路径详解

Skill Seekers 的 Kubernetes 部署实战:Helm 一键部署与手动清单双路径详解 【免费下载链接】Skill_Seekers Convert documentation websites, GitHub repositories, and PDFs into Claude AI skills with automatic conflict detection 项目地址: https://gitcod… · 2026/9/23 1:13:08

高潜力行业选择与职业发展策略
高潜力行业选择与职业发展策略

1. 行业前景分析与选择逻辑在职业生涯规划中,行业选择往往比个人努力更重要。就像搭乘不同方向的电梯,站在上升的电梯里,即使躺着也能到达高处;而选择下行的电梯,再努力奔跑也难以抵达目的地。这个比喻形象地说明了行业… · 2026/9/23 2:00:39

头疼的英文?这份保姆级教程教你用Python自动化处理报错日志
头疼的英文?这份保姆级教程教你用Python自动化处理报错日志

头疼的英文?这份保姆级教程教你用Python自动化处理报错日志 刚学完Python语法,面对一堆“头疼的英文”报错信息是不是脑子发大?很多人卡在第一步:知道怎么定义变量、写循环,但真遇到项目里的Error… · 2026/9/23 2:00:39

电子商务师培训机构推荐:从报名学习到考试拿证,报考全攻略
电子商务师培训机构推荐:从报名学习到考试拿证,报考全攻略

电商是数字经济的重要组成部分,从开店运营到直播带货,电子商务师是电商产业的运营人才。电商岗位需求量大、就业面广,是互联网从业的热门选择。本文给你一份完整的电子商务师报考全攻略。 一、电子商务师是做什么的? 电子商务师是… · 2026/9/23 2:00:39

PEEK与PEKK选型指南:从分子结构到3D打印的工程决策
PEEK与PEKK选型指南:从分子结构到3D打印的工程决策

简介:这份基础化工行业专题报告聚焦聚醚醚酮(PEEK)与聚醚酮酮(PEKK)两类高性能热塑性材料,面向化工、新材料及投资研究领域的从业者与学习者,系统梳理其材料特性、应用领域与国外发展经验。报告… · 2026/9/23 2:00:32

装备强化卷性能优化实战:3个核心点解决文档痛点
装备强化卷性能优化实战:3个核心点解决文档痛点

装备强化卷性能优化实战:3个核心点解决文档痛点 官方文档动辄几百页,翻到头晕还抓不住重点?别急,今天直接上代码,用【装备强化卷】这个实战项目,把【性能优化】拆成能跑、能测、能复现的三步。 项目目标… · 2026/9/23 2:00:26

3个坑避开秋梦简谱图解原理选型难题
3个坑避开秋梦简谱图解原理选型难题

3个坑避开秋梦简谱图解原理选型难题 版本升级后 API 全变了,你的项目还在用旧接口硬扛吗?这种断崖式的兼容性破坏,是最近半年无数开发者踩中的最大地雷。别急着骂娘,先看看这张 图解原理 ,把底层逻辑捋清楚,才能知道该换哪个方案。 1.… · 2026/9/23 2:00:26

3招搞定手机怎么下载微信面试难题实战项目解析
3招搞定手机怎么下载微信面试难题实战项目解析

3招搞定手机怎么下载微信面试难题实战项目解析 面试被问“手机怎么下载微信”背后的原理,90%的人答不上来。别笑,这看似弱智的问题,实则是考察你对移动应用分发机制、安全校验及网络协议理解的试金石。我带过不少校招新人,他们背了八股文,却连一个A… · 2026/9/23 0:00:03

你有新短消息请注意查收:3个新手避坑指南搞定消息系统选型
你有新短消息请注意查收:3个新手避坑指南搞定消息系统选型

你有新短消息请注意查收:3个新手避坑指南搞定消息系统选型 面试被问“高并发下如何保证消息不丢失”,你张口就是“用Redis”,结果面试官追问“如果Redis宕机了怎么办”,你瞬间卡壳。这种场景太常见了,很多新手在背八股文时,只记住了技术名词… · 2026/9/23 0:00:29

Win7无线热点配置工具源码解析:解决API失效的3个实战技巧
Win7无线热点配置工具源码解析:解决API失效的3个实战技巧

Win7无线热点配置工具源码解析:解决API失效的3个实战技巧 Win7无线热点配置工具在Win10/11上跑不动?不是你的问题,是版本升级后 API 全变了。很多老项目里的 netsh wlan… · 2026/9/23 0:00:36

了解更多?预约专属演示

我们的顾问将为您一对一讲解产品与方案

企业微信二维码