拓冰建站拓冰建站
首页 / 资讯中心 / 正文

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

看完干货,该让你的企业上线了

免费需求沟通 · 48 小时内出具建站方案 · 河南本地可上门