Diem 交易发布选项模块深度解析:DiemTransactionPublishingOption 的链上治理机制
Diem 交易发布选项模块深度解析DiemTransactionPublishingOption 的链上治理机制【免费下载链接】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/diemDiemTransactionPublishingOption 是 Diem 区块链框架Diem Framework中负责定义虚拟机VM交易发布策略的核心链上配置模块它以0x1::DiemTransactionPublishingOption的形式部署在链上管控着谁能发布模块与谁能执行脚本这两项关键权限。本文基于 DiemTransactionPublishingOption.md 与对应源码 DiemTransactionPublishingOption.move完整解析该模块的数据结构、全部公开接口、访问控制规则以及配套的形式化规范帮助读者掌握 Diem 链上发布策略的配置原理与治理操作方式。模块定位VM 发布策略的链上载体该模块的源码注释开宗明义This module defines a struct storing the publishing policies for the VM.本模块定义一个存储虚拟机发布策略的结构体。它将交易发布策略以链上配置on-chain config的形式固化下来网络中的每一次模块发布与脚本执行请求最终都会回落到这个模块中的判断函数上。从 DiemAccount.move 可以看到交易执行的 prologue前奏阶段就是发布策略的强制检查点模块交易module transaction在module_prologue中调用DiemTransactionPublishingOption::is_module_allowed(sender)不通过则以PROLOGUE_EMODULE_NOT_ALLOWED中止脚本交易script transaction在script_prologue中调用DiemTransactionPublishingOption::is_script_allowed(sender, script_hash)不通过则以PROLOGUE_ESCRIPT_NOT_ALLOWED中止。也就是说该模块是 Diem 账户系统在交易准入层面的闸门任何模块/脚本交易都会在这里被逐一放行或拦截。核心结构体三种发布模式的状态表达模块定义了唯一的核心结构体DiemTransactionPublishingOption用于描述 VM 的发布策略struct DiemTransactionPublishingOption has copy, drop, store { script_allow_list: vectorvectoru8, module_publishing_allowed: bool, }字段含义如下字段类型语义script_allow_listvectorvectoru8允许在网络中被执行的脚本哈希白名单。若该向量为空则表示不施加任何限制即所有脚本均被允许。module_publishing_allowedbool若置为true任何人都可以发布新模块。依据这两个字段的组合官方文档给出了三种可能的配置模式禁止模块发布 仅允许白名单脚本module_publishing_allowed falsescript_allow_list非空禁止模块发布 允许自定义脚本module_publishing_allowed falsescript_allow_list为空允许模块发布 允许自定义脚本module_publishing_allowed truescript_allow_list为空。结构体具有copy, drop, store三种能力意味着它可以被复制、丢弃以及作为全局存储中的值保存——这正是其作为DiemConfig泛型配置载荷payload存储于链上的前提条件。紧急熔断资源HaltAllTransactions除了常规发布策略外模块还定义了紧急情况下的熔断资源struct HaltAllTransactions has key {}该资源是一个空壳标记仅有dummy_field: bool占位字段只要它被发布publish到 DiemRoot 账户地址下就表示网络进入了交易暂停状态除 DiemRoot 外的所有账户都无法再发送交易。这在系统遭受攻击、需要紧急止血时非常有用具体用法见下文紧急熔断与恢复一节。常量定义与错误码模块定义了三个错误码与一个长度常量统一以u64表示常量值含义EINVALID_SCRIPT_HASH0脚本哈希长度非法EALLOWLIST_ALREADY_CONTAINS_SCRIPT1脚本哈希已存在于白名单中EHALT_ALL_TRANSACTIONS2尝试发布/撤销一个不存在的HaltAllTransactions资源SCRIPT_HASH_LENGTH32脚本哈希的标准长度32 字节其中SCRIPT_HASH_LENGTH 32表明脚本白名单中的哈希是基于 SHA3-256 等 32 字节摘要的任何非 32 字节长度的哈希都应被视为非法输入。初始化仅在创世Genesis时执行public fun initialize( dr_account: signer, script_allow_list: vectorvectoru8, module_publishing_allowed: bool, )initialize用于在网络创世阶段发布初始发布策略它有两个硬性前提必须处于创世阶段调用DiemTimestamp::assert_genesis()即链上时间尚未启动调用者必须具有 DiemRoot 角色调用Roles::assert_diem_root(dr_account)。满足前提后通过DiemConfig::publish_new_configDiemTransactionPublishingOption(dr_account, ...)将该结构体作为链上配置正式发布。在 Genesis.move 的initialize_internal中可以看到它的实际调用方式DiemTransactionPublishingOption::initialize( dr_account, initial_script_allow_list, is_open_module, );即创世参数中的initial_script_allow_list初始脚本白名单与is_open_module是否开放模块发布两个参数直接决定了网络上线时的发布策略初始状态。脚本放行判断is_script_allowedpublic fun is_script_allowed(account: signer, hash: vectoru8): bool该函数判断发送者能否执行指定哈希的脚本其判定逻辑按优先级依次为DiemRoot 特权若账户具有 DiemRoot 角色直接返回true即管理账户可以发送任意脚本熔断检查若transactions_halted()为真直接返回false即除 DiemRoot 外任何账户在熔断期间都不能发送脚本空哈希特例若hash为空向量返回true——这是因为 VM 适配器adapter在执行脚本函数script function时会传入空哈希空哈希意味着这是框架内置的脚本函数而非自定义脚本因此一律放行白名单判定读取链上配置后若script_allow_list为空开放模式返回true否则检查hash是否contains于白名单中。这段逻辑中空哈希 内置脚本函数放行的设计值得注意它保证了标准库脚本如账户管理、支付类脚本不受白名单收缩的影响网络管理员可以安全地只收紧自定义脚本。模块发布判断is_module_allowedpublic fun is_module_allowed(account: signer): bool该函数判断发送者能否发布模块逻辑非常简洁publish_option.module_publishing_allowed || Roles::has_diem_root_role(account)即链上开放了模块发布权限module_publishing_allowed true或者发送者是 DiemRoot。也就是说 DiemRoot 无论如何都拥有模块发布权而普通账户只有在网络开放模块发布时才被允许。动态调整发布策略set_open_script 与 set_open_module模块提供了两个由 DiemRoot 专属调用的治理接口用于在链运行期间动态调整发布策略public fun set_open_script(dr_account: signer) public fun set_open_module(dr_account: signer, open_module: bool)set_open_script将script_allow_list置为空向量从而开放任意脚本的执行。调用前通过Roles::assert_diem_root校验 DiemRoot 角色随后DiemConfig::get取出当前配置、修改后经DiemConfig::set写回触发链上配置更新与 reconfiguration新纪元切换。set_open_module(dr_account, open_module)将module_publishing_allowed置为传入的布尔值用于开启或关闭模块发布。两者都遵循取出-修改-写回的DiemConfig模式并且都受 DiemRoot 角色约束。模块规格spec中明确指出只有set_open_script和set_open_module这两个函数可以修改DiemTransactionPublishingOption配置对应权限编号 [[H11]][PERMISSION]其余函数通过apply DiemVersionRemainsSame to * except set_open_script, set_open_module的形式化约束保证配置不被改动。在功能测试 change_publishing_options.move 中可以看到完整的治理场景演练普通账户调用set_open_script会以错误码2中止Keep(ABORTED { code: 2, ...)只有 DiemRoot 发送者才能成功执行set_open_module(config, false)随后普通账户发布模块即被拦截INVALID_MODULE_PUBLISHER并且配置变更会触发NewEpochEvent。紧急熔断与恢复halt_all_transactions / resume_transactions / transactions_halted在安全事件等紧急场景下DiemRoot 可以一键暂停全网交易halt_all_transactions(dr_account: signer)校验 DiemRoot 角色后断言 DiemRoot 地址下尚不存在HaltAllTransactions资源否则以Errors::already_published(EHALT_ALL_TRANSACTIONS)中止然后通过move_to将空壳资源发布到 DiemRoot 账户resume_transactions(dr_account: signer)校验 DiemRoot 角色后断言资源确实存在再通过move_from将其移除从而恢复交易transactions_halted(): bool内部辅助函数直接返回existsHaltAllTransactions(DiemRoot)的布尔结果。由于is_script_allowed在判定顺序上把transactions_halted()放在白名单检查之前熔断可以一刀切地覆盖白名单中的脚本——即使脚本在白名单内只要熔断生效就无法执行。功能测试 disable_txes.move 完整验证了这条链路DiemRoot 调用halt_all_transactions后普通账户的自定义脚本与白名单脚本均被Discard(UNKNOWN_SCRIPT)拒绝DiemRoot 调用resume_transactions后交易恢复正常而普通账户调用halt_all_transactions则会以错误码2中止。此外emergency_admin_script.rs 中的端到端测试也通过encode_halt_network_payload验证了基于 writeset 的熔断治理流程。模块规格Module Specification形式化保证该模块内置了面向 Move Prover 的形式化规范从三个层面固化不可变性质初始化不变量DiemTimestamp::is_operating() DiemConfig::spec_is_publishedDiemTransactionPublishingOption()即网络一旦进入运行状态该配置必须已发布杜绝运行时缺失配置的状态访问控制除set_open_script、set_open_module外任何函数不得修改该配置见上文DiemVersionRemainsSameschema 的apply ... except约束辅助函数spec_is_script_allowed与spec_is_module_allowed将运行时判定逻辑抽象为可验证的规范函数供 DiemAccount.move 等调用方的aborts_if条件引用从而在形式化层面证明交易前奏检查与发布策略严格一致。实践小结治理操作速查基于上述解析网络治理者可以按需执行以下操作目标操作前提查看当前发布策略读取 DiemRoot 下的DiemConfigDiemTransactionPublishingOption配置链上配置已发布开放/关闭自定义脚本DiemRoot 调用set_open_scriptDiemRoot 角色开放/关闭模块发布DiemRoot 调用set_open_module(open_module)DiemRoot 角色紧急熔断全网交易DiemRoot 调用halt_all_transactions尚未处于熔断状态恢复全网交易DiemRoot 调用resume_transactions已处于熔断状态初始策略设定创世时通过initialize(script_allow_list, module_publishing_allowed)配置创世阶段 DiemRoot理解DiemTransactionPublishingOption是深入 Diem 交易准入与链上治理体系的关键一步它既承载了白名单/开放/模块发布三种模式的自由切换也内置了全网熔断的应急通道同时通过形式化规范将权限边界固化为可机器验证的不变量体现了 Diem 框架在安全性与可治理性上的整体设计思路。【免费下载链接】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),仅供参考

相关新闻

react-jsonschema-form 中 oneOf、anyOf 与 allOf 的条件 Schema 表单实战指南

react-jsonschema-form 中 oneOf、anyOf 与 allOf 的条件 Schema 表单实战指南

前端UI组件 【免费下载链接】react-jsonschema-form A React component for building Web forms from JSON Schema. 项目地址: https://gitcode.com/gh_mirrors/re/react-jsonschema-form 点击查看 免费下载 本指南围绕 react-jsonschema-form(RJSF&…

2026/9/25 22:56:19 阅读更多 →
Claude Code Coordinator-Worker 并行派 Worker,Base URL 填 TaoToken 的接口地址

Claude Code Coordinator-Worker 并行派 Worker,Base URL 填 TaoToken 的接口地址

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/23 14:38:41 阅读更多 →
使用 Docker 容器快速搭建本地 Nomad 开发集群(dev/docker-clients 实战指南)

使用 Docker 容器快速搭建本地 Nomad 开发集群(dev/docker-clients 实战指南)

使用 Docker 容器快速搭建本地 Nomad 开发集群(dev/docker-clients 实战指南) 【免费下载链接】nomad Nomad is an easy-to-use, flexible, and performant workload orchestrator that can deploy a mix of microservice, batch, containerized, and no…

2026/9/24 8:13:52 阅读更多 →

最新新闻

rsuite Calendar 自定义单元格样式:深入解析 cellClassName 的用法与实现原理

rsuite Calendar 自定义单元格样式:深入解析 cellClassName 的用法与实现原理

前端UI组件 【免费下载链接】rsuite 🧱 A suite of React components . 项目地址: https://gitcode.com/gh_mirrors/rs/rsuite 点击查看 免费下载 导读 本文围绕 rsuite 的 Calendar(日历)组件,重点讲解如何通过 ce…

2026/9/25 22:56:19 阅读更多 →
802.11ax调度机制全解析:OFDMA、MU-MIMO与TWT实战调优

802.11ax调度机制全解析:OFDMA、MU-MIMO与TWT实战调优

如果你最近在无线网络圈子里逛,应该会频繁看到“ax调度”这个词。“ax”就是 802.11ax,也就是 Wi-Fi 6 的技术代号,而“调度”才是 802.11ax 真正值钱的地方。很多人以为 Wi-Fi 6 只是“快了一点”,换了张网卡、开了 160MHz 频宽就…

2026/9/25 22:56:19 阅读更多 →
Windows下H.264解码库集成指南:从选型到踩坑

Windows下H.264解码库集成指南:从选型到踩坑

简介:这是一份面向Windows平台的H.264视频解码库资源,由开发者rapidly552整理分享,适合需要在应用程序中快速集成H.264解码能力的C/C工程师及视频技术学习者。该库严格基于AVC标准,实现了运动补偿、帧内预测、多参考帧、熵编码等核…

2026/9/25 22:56:19 阅读更多 →
C#控制台贪吃蛇实战:从数据结构到游戏循环的完整指南

C#控制台贪吃蛇实战:从数据结构到游戏循环的完整指南

简介:面向C#初学者的控制台贪吃蛇实战项目,以经典小游戏为载体,串联类、方法、变量、条件语句等核心语法,并完整覆盖控制台输入输出、按键捕获、主循环、碰撞检测、蛇身增长、随机食物生成、状态更新与字符画面重绘等关键开发环节…

2026/9/25 22:56:19 阅读更多 →
图书管理系统数据库设计与实现:E-R建模到SQLAlchemy落地

图书管理系统数据库设计与实现:E-R建模到SQLAlchemy落地

简介:本资源是一份面向高校数据库课程学习者与Python初学者的完整课程设计实践方案,聚焦图书管理系统的开发全流程,涵盖需求分析、数据库建模、后端逻辑实现与基础部署。压缩包共9个文件,含4个SQL脚本(books、admin、s…

2026/9/25 22:56:19 阅读更多 →
ZoneDeck进程冻结与效率模式指南:挂起进程省CPU降内存,后台视频游戏秒停

ZoneDeck进程冻结与效率模式指南:挂起进程省CPU降内存,后台视频游戏秒停

ZoneDeck进程冻结与效率模式指南:挂起进程省CPU降内存,后台视频游戏秒停 【免费下载链接】ZoneDeck The Ultimate Workspace Manager, Switch between work and life, seamlessly生活工作无缝切换,专业的桌面工作区管理助手 项目地址: http…

2026/9/25 22:54:18 阅读更多 →

日新闻

AI元人文:从工具使用到思维重构的深度探索

AI元人文:从工具使用到思维重构的深度探索

最近半年我一直在琢磨一件事:AI元人文到底是什么?说白了,就是“用元视角重新审视人与AI的关系”,也在“探索AI如何反向逼着我们发现自己的思考边界”。标题里的“元探索”,在我看就是一层套一层的追问——当你用AI解决…

2026/9/25 0:00:41 阅读更多 →
Python+CNN车牌识别实战:从数据预处理到模型训练与部署

Python+CNN车牌识别实战:从数据预处理到模型训练与部署

简介:基于Python与卷积神经网络的车牌识别项目,面向计算机视觉初学者及智能交通开发者,目标是帮助用户掌握从数据预处理、模型构建到实际部署的完整流程。压缩包共25个文件,包含jpg/png图像样本、py训练脚本、md说明文档、dat数据…

2026/9/25 0:00:41 阅读更多 →
Vim基础操作全攻略:保存退出、模式切换与高频命令实战

Vim基础操作全攻略:保存退出、模式切换与高频命令实战

1. 项目概述1.1 核心需求解析今天聊聊Vim。写这个题目的原因是:几乎每个后端开发者、运维人员、数据工程师某天都会遇到一个场景——深夜加班,服务器登录界面只有黑底白字,编辑器只有vi/vim,你必须在五分钟内完成一次配置修改并保…

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

周新闻

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

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

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

2026/9/25 19:27:14 阅读更多 →
Word表格编号全攻略:从列表编号到题注交叉引用

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

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

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

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

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

2026/9/25 20:29:09 阅读更多 →

月新闻

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

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

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

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

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

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

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

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

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

2026/9/25 19:27:26 阅读更多 →