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 editable
frameworkpackage.
即,该样本不是一份独立源码,而是"作用在语料库共享framework包之上的一份配方"。运行流程分三步:
- 复制:评估运行器把共享的
framework包整体复制到独立工作区; - 打补丁:对复制结果应用
preparation.patch; - 哈希校验:校验补丁后的树哈希与预期一致,然后才把隔离的工作区交给 AI Agent。
其中"共享包"位于样本目录下的framework/(其清单记录在framework/corpus-modules.json),包含AptosFramework、AptosStdlib、AptosExperimental、AptosTrading、MoveStdlib五组源码目录及Move.toml、Prover.toml。corpus-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-256 | 1c41a4a754554758e1632217bb867a0dc8c622072f937edf1e1ef44adaf1f116 |
| 补丁后树 SHA-256 | 81b74a60e2db85ae955d8dd92e75d26641aa193d073c593c42b24cceba4d08d4 |
| 必需合约类别 | normal-result、state-transition、frame |
三个"必需合约类别"对应 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用到的GovernanceConfig、UpdateConfig事件结构、system_addresses模块都必须可编译、可解析——同时又把任务边界收敛到单一函数。
Opaque/bodyless 边界合约
规范推断依赖对"被调用函数"的行为假设。样本声明了在证明该目标时**契约可见的透明可执行被调用方(opaque/bodyless boundary)**闭包:
0x1::event::emit0x1::system_addresses::assert_aptos_framework
这两个函数在证明过程中被视为不透明边界,其既有合约(如assert_aptos_framework的aborts_if行为)会作为假设被引用,而非重新推断。其中assert_aptos_framework的实现语义可在 system_addresses.move 中查看(is_aptos_framework_address+ 权限拒绝错误)。
传递规范函数
这些边界合约又引用了两个传递性规范函数,证明器需要它们来展开signer相关属性:
0x1::signer::$address_of0x1::signer::$borrow_address
即从&signer中取地址(address_of)与借用(borrow_address)的规范函数,供let addr = signer::address_of(aptos_framework)这类表达式在证明中被正确求值。
传递源码模块清单
要编译该样本,共享包必须包含以下全部传递源码模块(共 132 个,按模块名排序):
0x1::account、account_abstraction、aggregator、aggregator_factory、aggregator_v2、any、aptos_account、aptos_coin、aptos_hash、auth_data、bcs、bcs_stream、big_ordered_map、block、bls12381、bn254_algebra、chain_id、chain_status、chunky_dkg、chunky_dkg_config、chunky_dkg_config_seqnum、cmp、code、coin、comparator、confidential_amount、confidential_asset、confidential_balance、confidential_range_proofs、config_buffer、consensus_config、copyable_any、create_signer、crypto_algebra、decryption、delegation_pool、dispatchable_fungible_asset、dkg、ed25519、epoch_timeout_config、error、event、execution_config、features、federated_keyless、fixed_point32、fixed_point64、from_bcs、function_info、fungible_asset、gas_schedule、genesis、governance_proposal、guid、hash、init、jwk_consensus_config、jwks、keyless、keyless_account、math128、math64、math_fixed64、mem、multi_ed25519、multi_key、multisig_account、nonce_validation、object、option、optional_aggregator、ordered_map、pool_u64、pool_u64_unbound、primary_fungible_store、randomness、randomness_api_v0_config、randomness_config、randomness_config_seqnum、reconfiguration、reconfiguration_state、reconfiguration_with_dkg、reflect、resource_account、result、ristretto255、ristretto255_bulletproofs、ristretto255_pedersen、secp256k1、secp256r1、sigma_protocol、sigma_protocol_fiat_shamir、sigma_protocol_homomorphism、sigma_protocol_key_rotation、sigma_protocol_proof、sigma_protocol_registration、sigma_protocol_representation、sigma_protocol_representation_vec、sigma_protocol_statement、sigma_protocol_statement_builder、sigma_protocol_transfer、sigma_protocol_utils、sigma_protocol_withdraw、sigma_protocol_witness、signer、simple_map、single_key、smart_table、stake、staking_config、staking_contract、state_storage、storage_gas、storage_slots_allocator、string、string_utils、system_addresses、table、table_with_length、timestamp、transaction_context、transaction_fee、transaction_limits、transaction_validation、type_info、util、validator_consensus_info、vector、version、vesting、voting
该清单与 preparation.patch 中生成的.move-inference-task.json内transitive_module_dependencies字段一一对应,是"任务配方"的机器可读形态:package_module_target、target_functions、called_function_dependencies(即透明边界)、spec_function_dependencies(即传递规范函数)、transitive_called_function_dependencies(含0x1::error::canonical、0x1::error::permission_denied、0x1::event::write_module_event_to_store、0x1::system_addresses::is_aptos_framework_address等更深的调用)、source_commit、schema_version: 3、task_id: "AF-aptos-governance-034"等字段,共同构成样本的完整机器清单。
准备流程(Preparation):隐藏答案、锁定可编辑面
补丁做了什么
README 的核心承诺是:"可执行 Move 实现保持不变",唯一被移除的是 Agent 可见源中的参考规范块。具体到本样本,从 Agent 可见源码中删除的目标参考块为:
sources/AptosFramework/aptos_governance.spec.move:update_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.movesources/AptosFramework/aptos_governance.spec.move
其余 260+ 个.move文件、Move.toml、Prover.toml、corpus-modules.json均视为不可变上下文。这一约束防止 Agent 通过修改system_addresses或event等被调用模块来"作弊式"放宽证明义务,保证所有被推断契约都落在目标函数自身。
为什么需要哈希
Shared package SHA-256与Prepared 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 + 1 | normal-result | post-condition does not hold |
AF-aptos-governance-034-no-framework-check | 删除assert_aptos_framework调用 | abort | caller does not have permission to modify aptos_governance::GovernanceConfig |
AF-aptos-governance-034-threshold-halved | 阈值被减半 | normal-result | post-condition does not hold |
持出评分集变异体(对应会话后门禁)
| 变异体 ID | 变更内容 | 所属合约类别 | 被击杀时的证明器报错 |
|---|---|---|---|
AF-aptos-governance-034-stake-unchanged | required_proposer_stake不更新 | normal-result | post-condition does not hold |
AF-aptos-governance-034-return-when-missing | 资源缺失时提前返回而非中止 | abort | function does not abort under this condition |
AF-aptos-governance-034-duration-zeroed | voting_duration_secs被清零 | normal-result | post-condition does not hold |
从变异体rationale可以看出设计意图:每个变异体都精确钉住参考规范中的一条契约——duration-off-by-one钉住ensures ...voting_duration_secs == voting_duration_secs,no-framework-check钉住aborts_if addr != @aptos_framework,stake-unchanged钉住ensures ...required_proposer_stake == required_proposer_stake,return-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这类样本在其中扮演"任务单元"角色:
- 调度:调度器读取样本 manifest(含
screening_status、哈希、目标函数、变异体路径),把该样本分配给某一实验臂(agent_only/hybrid_guided/hybrid_flexible)的单元格; - 会话:Agent 在沙箱内复制共享包、应用补丁、校验哈希后,只能编辑两个指定文件,借助 MCP 工具(
move_package_verify跑 Move Prover、move_package_wp做最弱前置条件推断等)完成任务; - 评分:会话结束后,
harness.score_round用持出评分集(本样本即mutants-scoring)对推断规范做变异测试,同时corpus-v1.2的用法是把mutants集作为"门禁(disqualification gate)"——变异体存活即否决该契约,本轮成绩作废而非计入测量。
样本命名规则AF-aptos-governance-034也暗示了语料库的组织方式:AF前缀代表 AptosFramework 模块族,aptos-governance是模块名,034是该模块下的序号;同族样本(如AF-account-025、AF-stake-004)共享同一套 268 文件的framework包骨架,仅在目标函数、补丁与变异体上分化,从而保证跨样本可比性。
小结:一份可复现、可评分、可审计的推断任务
AF-aptos-governance-034展示了 Move 规范推断评估样本的标准形态:以共享framework包为编译上下文(132 个传递模块),以update_governance_config为单一函数目标(粒度function),以event::emit与system_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),仅供参考