Aptos 治理配置更新函数的 Move 规范推断评估样本:AF-aptos-governance-034 全解
2026/9/18 22:59:54 网站建设 项目流程

Aptos 治理配置更新函数的 Move 规范推断评估样本:AF-aptos-governance-034 全解

【免费下载链接】aptos-coreAptos is a layer 1 blockchain built to support the widespread use of blockchain through better technology and user experience.项目地址: https://gitcode.com/GitHub_Trending/ap/aptos-core

AF-aptos-governance-034是 Aptos Core 仓库中 Move 规范推断(spec-inference)评估体系(aptos-move/flow/evaluation/spec-inference)下 corpus-v1.2 语料库中的一个标准样本,它把目标锁定在框架模块0x1::aptos_governance::update_governance_config——一个只允许 Aptos 框架签名者调用、用于在链上治理提案中更新治理参数的函数。本文围绕该样本的 README 说明,结合仓库内真实源码、规范文件、变异体数据与评估管线,完整还原这个"recipe"(配方)式样本的构造原理、编译上下文、准备流程与评分机制,帮助读者理解 MoveFlow 如何用"复制共享包 + 打补丁 + 哈希校验"的方式,为 AI Agent 构造一个可复现、可隔离、可验证的规范推断任务。

样本是什么:语料库上的单一可编辑包 recipe

样本 README 开宗明义地说明了自己的定位:

This sample is a recipe over the corpus's single editableframeworkpackage.

即,该样本不是一份独立源码,而是"作用在语料库共享framework包之上的一份配方"。运行流程分三步:

  1. 复制:评估运行器把共享的framework包整体复制到独立工作区;
  2. 打补丁:对复制结果应用preparation.patch
  3. 哈希校验:校验补丁后的树哈希与预期一致,然后才把隔离的工作区交给 AI Agent。

其中"共享包"位于样本目录下的framework/(其清单记录在framework/corpus-modules.json),包含AptosFrameworkAptosStdlibAptosExperimentalAptosTradingMoveStdlib五组源码目录及Move.tomlProver.tomlcorpus-modules.json同时记录了包的模块/文件映射与解析后的命名地址(named addresses),这是运行器验证"复制得到的包就是语料库中那个包"的依据之一。

目标声明(Target)

样本的核心目标是链上治理配置更新函数,全部元信息如下:

项目
目标函数0x1::aptos_governance::update_governance_config
推断粒度(Granularity)function(函数级)
原始源码aptos_governance.move
共享包内路径sources/AptosFramework/aptos_governance.move
源码根目录aptos-move/framework/aptos-framework
Aptos Core 提交950e413e46090d2056740c36dd7a77b1764b6936
共享包 SHA-2561c41a4a754554758e1632217bb867a0dc8c622072f937edf1e1ef44adaf1f116
补丁后树 SHA-25681b74a60e2db85ae955d8dd92e75d26641aa193d073c593c42b24cceba4d08d4
必需合约类别normal-resultstate-transitionframe

三个"必需合约类别"对应 Move 规范(spec)中的三类关键契约:normal-result(正常结果下的后置条件)、state-transition(状态转移/modifies声明)、frame(涉及signer帧与借用的访问约束)。这决定了 Agent 产出的规范必须覆盖哪些语义维度,也是后续评分时逐类别核对的依据。哈希值(共享包哈希与补丁后树哈希)用于校验"分发出去的工作区与设计者筛选用的工作区逐字节一致",杜绝 Agent 拿到被篡改或被污染的源码。

目标函数实现与参考规范

可执行实现

在原始仓库 aptos_governance.move 中,update_governance_config的实现如下:

/// Update the governance configurations. This can only be called as part of resolving a proposal in this same /// AptosGovernance. public fun update_governance_config( aptos_framework: &signer, min_voting_threshold: u128, required_proposer_stake: u64, voting_duration_secs: u64, ) acquires GovernanceConfig { system_addresses::assert_aptos_framework(aptos_framework); let governance_config = borrow_global_mut<GovernanceConfig>(@aptos_framework); governance_config.voting_duration_secs = voting_duration_secs; governance_config.min_voting_threshold = min_voting_threshold; governance_config.required_proposer_stake = required_proposer_stake; event::emit( UpdateConfig { min_voting_threshold, required_proposer_stake, voting_duration_secs }, ); }

函数语义非常清晰:先通过system_addresses::assert_aptos_framework强制签名者为@aptos_framework,随后就地修改@aptos_framework地址下的GovernanceConfig资源(borrow_global_mut+ 三个字段赋值),最后发出UpdateConfig事件。acquires GovernanceConfig声明了它对全局存储的访问权。同一文件中还有两个单元测试佐证行为:test_update_governance_config(框架签名者,参数10, 20, 30,正常路径)与test_update_governance_config_unauthorized_should_fail(普通账户,应当中止),见 aptos_governance.move。

参考规范(被隐藏的目标)

仓库自带的规范文件 aptos_governance.spec.move 给出了该函数的"标准答案"式参考规范:

spec update_governance_config( aptos_framework: &signer, min_voting_threshold: u128, required_proposer_stake: u64, voting_duration_secs: u64, ) { let addr = signer::address_of(aptos_framework); let governance_config = global<GovernanceConfig>(@aptos_framework); let post new_governance_config = global<GovernanceConfig>(@aptos_framework); aborts_if addr != @aptos_framework; aborts_if !exists<GovernanceConfig>(@aptos_framework); aborts_if !features::spec_is_enabled(features::MODULE_EVENT_MIGRATION) && !exists<GovernanceEvents>( @aptos_framework ); modifies global<GovernanceConfig>(addr); ensures new_governance_config.voting_duration_secs == voting_duration_secs; ensures new_governance_config.min_voting_threshold == min_voting_threshold; ensures new_governance_config.required_proposer_stake == required_proposer_stake; }

这份参考规范覆盖了三个必需类别:

  • aborts_if(中止条件,对应normal-result/abort 语义):非框架签名者中止;GovernanceConfig不存在时中止;模块事件迁移未启用且GovernanceEvents不存在时中止;
  • modifies(对应state-transition):声明会修改GovernanceConfig
  • ensures(后置条件):三个治理参数逐一等于入参,完整刻画状态转移结果。

样本的准备阶段会把这一参考块从 Agent 可见源码中移除(详见下文),让 Agent 在"不知道标准答案"的前提下重新推断。

编译上下文:传递模块依赖与透明边界

共享包即编译上下文

README 明确:共享包包含目标模块与其源码级传递模块依赖的并集。样本只把0x1::aptos_governance::update_governance_config作为推断目标,其余模块一律只是"编译上下文(compilation context)",不是额外的推断目标。这一设计保证了 Agent 在完整框架语义下工作——例如update_governance_config用到的GovernanceConfigUpdateConfig事件结构、system_addresses模块都必须可编译、可解析——同时又把任务边界收敛到单一函数。

Opaque/bodyless 边界合约

规范推断依赖对"被调用函数"的行为假设。样本声明了在证明该目标时**契约可见的透明可执行被调用方(opaque/bodyless boundary)**闭包:

  • 0x1::event::emit
  • 0x1::system_addresses::assert_aptos_framework

这两个函数在证明过程中被视为不透明边界,其既有合约(如assert_aptos_frameworkaborts_if行为)会作为假设被引用,而非重新推断。其中assert_aptos_framework的实现语义可在 system_addresses.move 中查看(is_aptos_framework_address+ 权限拒绝错误)。

传递规范函数

这些边界合约又引用了两个传递性规范函数,证明器需要它们来展开signer相关属性:

  • 0x1::signer::$address_of
  • 0x1::signer::$borrow_address

即从&signer中取地址(address_of)与借用(borrow_address)的规范函数,供let addr = signer::address_of(aptos_framework)这类表达式在证明中被正确求值。

传递源码模块清单

要编译该样本,共享包必须包含以下全部传递源码模块(共 132 个,按模块名排序):

0x1::accountaccount_abstractionaggregatoraggregator_factoryaggregator_v2anyaptos_accountaptos_coinaptos_hashauth_databcsbcs_streambig_ordered_mapblockbls12381bn254_algebrachain_idchain_statuschunky_dkgchunky_dkg_configchunky_dkg_config_seqnumcmpcodecoincomparatorconfidential_amountconfidential_assetconfidential_balanceconfidential_range_proofsconfig_bufferconsensus_configcopyable_anycreate_signercrypto_algebradecryptiondelegation_pooldispatchable_fungible_assetdkged25519epoch_timeout_configerroreventexecution_configfeaturesfederated_keylessfixed_point32fixed_point64from_bcsfunction_infofungible_assetgas_schedulegenesisgovernance_proposalguidhashinitjwk_consensus_configjwkskeylesskeyless_accountmath128math64math_fixed64memmulti_ed25519multi_keymultisig_accountnonce_validationobjectoptionoptional_aggregatorordered_mappool_u64pool_u64_unboundprimary_fungible_storerandomnessrandomness_api_v0_configrandomness_configrandomness_config_seqnumreconfigurationreconfiguration_statereconfiguration_with_dkgreflectresource_accountresultristretto255ristretto255_bulletproofsristretto255_pedersensecp256k1secp256r1sigma_protocolsigma_protocol_fiat_shamirsigma_protocol_homomorphismsigma_protocol_key_rotationsigma_protocol_proofsigma_protocol_registrationsigma_protocol_representationsigma_protocol_representation_vecsigma_protocol_statementsigma_protocol_statement_buildersigma_protocol_transfersigma_protocol_utilssigma_protocol_withdrawsigma_protocol_witnesssignersimple_mapsingle_keysmart_tablestakestaking_configstaking_contractstate_storagestorage_gasstorage_slots_allocatorstringstring_utilssystem_addressestabletable_with_lengthtimestamptransaction_contexttransaction_feetransaction_limitstransaction_validationtype_infoutilvalidator_consensus_infovectorversionvestingvoting

该清单与 preparation.patch 中生成的.move-inference-task.jsontransitive_module_dependencies字段一一对应,是"任务配方"的机器可读形态:package_module_targettarget_functionscalled_function_dependencies(即透明边界)、spec_function_dependencies(即传递规范函数)、transitive_called_function_dependencies(含0x1::error::canonical0x1::error::permission_denied0x1::event::write_module_event_to_store0x1::system_addresses::is_aptos_framework_address等更深的调用)、source_commitschema_version: 3task_id: "AF-aptos-governance-034"等字段,共同构成样本的完整机器清单。

准备流程(Preparation):隐藏答案、锁定可编辑面

补丁做了什么

README 的核心承诺是:"可执行 Move 实现保持不变",唯一被移除的是 Agent 可见源中的参考规范块。具体到本样本,从 Agent 可见源码中删除的目标参考块为:

  • sources/AptosFramework/aptos_governance.spec.moveupdate_governance_config的参考规范块(1 个块)

preparation.patch 展示了这一可复现变换的完整 diff:除了把aptos_governance.spec.move第 111-135 行附近的spec update_governance_config(...) { ... }整块替换为空白行外,还新增了.move-inference-task.json任务描述文件。也就是说,补丁做两件事——(1) 写入机器可读的任务清单;(2) 擦除参考规范,迫使 Agent 从实现+上下文独立推断。

Agent 的可编辑范围

README 明确限定 Agent只能编辑两个文件:

  • sources/AptosFramework/aptos_governance.move
  • sources/AptosFramework/aptos_governance.spec.move

其余 260+ 个.move文件、Move.tomlProver.tomlcorpus-modules.json均视为不可变上下文。这一约束防止 Agent 通过修改system_addressesevent等被调用模块来"作弊式"放宽证明义务,保证所有被推断契约都落在目标函数自身。

为什么需要哈希

Shared package SHA-256Prepared tree SHA-256两枚哈希在评估中承担双重角色:其一,运行器在复制与打补丁后校验哈希,确保分发给 Agent 的树与语料库中筛选、评分用的树一致;其二,评估框架把哈希写入调度清单与轮次清单(round manifest),实现"装置身份校验(apparatus-identity check)"——正如 spec-inference 主 README 所述,修改harness/prompts/会使对应哈希失效,从而在运行中阻断未记录的环境变更。

变异体与合约类别评分:规范质量的试金石

样本的价值最终由"它能否被评分"决定。仓库为该样本维护了两组变异体数据:

  • 反驳集(refutation,会话中展示给 Agent):mutants/AF-aptos-governance-034/mutants.json,含 3 个 essential 变异体;
  • 持出评分集(held-out scoring,会话后用于打分):mutants-scoring/AF-aptos-governance-034/mutants.json,另有 3 个。

评分结果记录在metadata/mutation-validation-005/AF-aptos-governance-034.json,全部 6 个变异体都被参考规范"击杀"(killed)。

反驳集变异体(对应会话内反馈)

变异体 ID变更内容所属合约类别被击杀时的证明器报错
AF-aptos-governance-034-duration-off-by-one= voting_duration_secs + 1normal-resultpost-condition does not hold
AF-aptos-governance-034-no-framework-check删除assert_aptos_framework调用abortcaller does not have permission to modify aptos_governance::GovernanceConfig
AF-aptos-governance-034-threshold-halved阈值被减半normal-resultpost-condition does not hold

持出评分集变异体(对应会话后门禁)

变异体 ID变更内容所属合约类别被击杀时的证明器报错
AF-aptos-governance-034-stake-unchangedrequired_proposer_stake不更新normal-resultpost-condition does not hold
AF-aptos-governance-034-return-when-missing资源缺失时提前返回而非中止abortfunction does not abort under this condition
AF-aptos-governance-034-duration-zeroedvoting_duration_secs被清零normal-resultpost-condition does not hold

从变异体rationale可以看出设计意图:每个变异体都精确钉住参考规范中的一条契约——duration-off-by-one钉住ensures ...voting_duration_secs == voting_duration_secsno-framework-check钉住aborts_if addr != @aptos_frameworkstake-unchanged钉住ensures ...required_proposer_stake == required_proposer_stakereturn-when-missing钉住aborts_if !exists<GovernanceConfig>。因此,只有当 Agent 推断出的规范足够"强"(能证明这些错误实现不满足契约),它才能通过变异测试;一份只写aborts_if不写ensures、或只写部分字段后置条件的弱规范,会放过这些变异体而被扣分。这种"变异体击杀"机制与move-flow experiment prove --target 0x1::aptos_governance::update_governance_config --timeout 40的证明命令配合,构成了对推断规范的客观质量门禁。

样本在 MoveFlow 评估管线中的位置

从 flow/README.md 可知,整个体系是 MoveFlow(AI 辅助的 Aptos Move 智能合约开发工具链)的论文评估装置:evaluation/spec-inference托管控制器、隐藏裁判、语料库构建器与随机调度工具。AF-aptos-governance-034这类样本在其中扮演"任务单元"角色:

  1. 调度:调度器读取样本 manifest(含screening_status、哈希、目标函数、变异体路径),把该样本分配给某一实验臂(agent_only/hybrid_guided/hybrid_flexible)的单元格;
  2. 会话:Agent 在沙箱内复制共享包、应用补丁、校验哈希后,只能编辑两个指定文件,借助 MCP 工具(move_package_verify跑 Move Prover、move_package_wp做最弱前置条件推断等)完成任务;
  3. 评分:会话结束后,harness.score_round用持出评分集(本样本即mutants-scoring)对推断规范做变异测试,同时corpus-v1.2的用法是把mutants集作为"门禁(disqualification gate)"——变异体存活即否决该契约,本轮成绩作废而非计入测量。

样本命名规则AF-aptos-governance-034也暗示了语料库的组织方式:AF前缀代表 AptosFramework 模块族,aptos-governance是模块名,034是该模块下的序号;同族样本(如AF-account-025AF-stake-004)共享同一套 268 文件的framework包骨架,仅在目标函数、补丁与变异体上分化,从而保证跨样本可比性。

小结:一份可复现、可评分、可审计的推断任务

AF-aptos-governance-034展示了 Move 规范推断评估样本的标准形态:以共享framework包为编译上下文(132 个传递模块),以update_governance_config为单一函数目标(粒度function),以event::emitsystem_addresses::assert_aptos_framework为透明边界,通过preparation.patch擦除参考规范并写入机器可读任务清单,再用两枚 SHA-256 哈希锁定树的完整性。它既是 Agent 的"考卷"(只能编辑两个文件、推断覆盖normal-result/state-transition/frame三类契约),也是裁判的"评分卡"(六枚变异体逐一检验规范对中止条件、修改声明与后置条件的刻画)。想要复现验证,可在本仓库内查看样本目录 AF-aptos-governance-034、参考规范 aptos_governance.spec.move、补丁 preparation.patch 与评分数据 AF-aptos-governance-034.json,完整追溯从"目标函数"到"变异体击杀"的整条证据链。

【免费下载链接】aptos-coreAptos is a layer 1 blockchain built to support the widespread use of blockchain through better technology and user experience.项目地址: https://gitcode.com/GitHub_Trending/ap/aptos-core

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询