Skip to content

Commit b44042f

Browse files
authored
[Spec] Update spec of code.move (aptos-labs#8888)
* init * mock up native error * bypass compiler error * init PR * fix typeo * add comment * fix lint error
1 parent d15f47d commit b44042f

File tree

4 files changed

+33
-15
lines changed

4 files changed

+33
-15
lines changed

aptos-move/framework/aptos-framework/doc/code.md

Lines changed: 14 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -551,12 +551,15 @@ package.
551551
<b>let</b> allowed_deps = <a href="code.md#0x1_code_check_dependencies">check_dependencies</a>(addr, &pack);
552552

553553
// Check package against conflicts
554+
// To avoid prover compiler <a href="../../aptos-stdlib/../move-stdlib/doc/error.md#0x1_error">error</a> on <b>spec</b>
555+
// the package need <b>to</b> be an immutable variable
554556
<b>let</b> module_names = <a href="code.md#0x1_code_get_module_names">get_module_names</a>(&pack);
555-
<b>let</b> packages = &<b>mut</b> <b>borrow_global_mut</b>&lt;<a href="code.md#0x1_code_PackageRegistry">PackageRegistry</a>&gt;(addr).packages;
556-
<b>let</b> len = <a href="../../aptos-stdlib/../move-stdlib/doc/vector.md#0x1_vector_length">vector::length</a>(packages);
557+
<b>let</b> package_immutable = &<b>borrow_global</b>&lt;<a href="code.md#0x1_code_PackageRegistry">PackageRegistry</a>&gt;(addr).packages;
558+
<b>let</b> len = <a href="../../aptos-stdlib/../move-stdlib/doc/vector.md#0x1_vector_length">vector::length</a>(package_immutable);
557559
<b>let</b> index = len;
558560
<b>let</b> upgrade_number = 0;
559-
<a href="../../aptos-stdlib/../move-stdlib/doc/vector.md#0x1_vector_enumerate_ref">vector::enumerate_ref</a>(packages, |i, <b>old</b>| {
561+
<a href="../../aptos-stdlib/../move-stdlib/doc/vector.md#0x1_vector_enumerate_ref">vector::enumerate_ref</a>(package_immutable
562+
, |i, <b>old</b>| {
560563
<b>let</b> <b>old</b>: &<a href="code.md#0x1_code_PackageMetadata">PackageMetadata</a> = <b>old</b>;
561564
<b>if</b> (<b>old</b>.name == pack.name) {
562565
upgrade_number = <b>old</b>.upgrade_number + 1;
@@ -570,6 +573,7 @@ package.
570573
// Assign the upgrade counter.
571574
pack.upgrade_number = upgrade_number;
572575

576+
<b>let</b> packages = &<b>mut</b> <b>borrow_global_mut</b>&lt;<a href="code.md#0x1_code_PackageRegistry">PackageRegistry</a>&gt;(addr).packages;
573577
// Update registry
574578
<b>let</b> policy = pack.upgrade_policy;
575579
<b>if</b> (index &lt; len) {
@@ -918,7 +922,10 @@ Native function to initiate module loading, including a list of allowed dependen
918922

919923

920924

921-
<pre><code><b>pragma</b> verify = <b>false</b>;
925+
<pre><code><b>pragma</b> aborts_if_is_partial;
926+
<b>let</b> addr = <a href="../../aptos-stdlib/../move-stdlib/doc/signer.md#0x1_signer_address_of">signer::address_of</a>(owner);
927+
<b>modifies</b> <b>global</b>&lt;<a href="code.md#0x1_code_PackageRegistry">PackageRegistry</a>&gt;(addr);
928+
<b>aborts_if</b> pack.upgrade_policy.policy &lt;= <a href="code.md#0x1_code_upgrade_policy_arbitrary">upgrade_policy_arbitrary</a>().policy;
922929
</code></pre>
923930

924931

@@ -950,7 +957,9 @@ Native function to initiate module loading, including a list of allowed dependen
950957

951958

952959

953-
<pre><code><b>pragma</b> verify = <b>false</b>;
960+
<pre><code><b>pragma</b> aborts_if_is_partial;
961+
<b>aborts_if</b> old_pack.upgrade_policy.policy &gt;= <a href="code.md#0x1_code_upgrade_policy_immutable">upgrade_policy_immutable</a>().policy;
962+
<b>aborts_if</b> !<a href="code.md#0x1_code_can_change_upgrade_policy_to">can_change_upgrade_policy_to</a>(old_pack.upgrade_policy, new_pack.upgrade_policy);
954963
</code></pre>
955964

956965

aptos-move/framework/aptos-framework/sources/code.move

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -145,12 +145,15 @@ module aptos_framework::code {
145145
let allowed_deps = check_dependencies(addr, &pack);
146146

147147
// Check package against conflicts
148+
// To avoid prover compiler error on spec
149+
// the package need to be an immutable variable
148150
let module_names = get_module_names(&pack);
149-
let packages = &mut borrow_global_mut<PackageRegistry>(addr).packages;
150-
let len = vector::length(packages);
151+
let package_immutable = &borrow_global<PackageRegistry>(addr).packages;
152+
let len = vector::length(package_immutable);
151153
let index = len;
152154
let upgrade_number = 0;
153-
vector::enumerate_ref(packages, |i, old| {
155+
vector::enumerate_ref(package_immutable
156+
, |i, old| {
154157
let old: &PackageMetadata = old;
155158
if (old.name == pack.name) {
156159
upgrade_number = old.upgrade_number + 1;
@@ -164,6 +167,7 @@ module aptos_framework::code {
164167
// Assign the upgrade counter.
165168
pack.upgrade_number = upgrade_number;
166169

170+
let packages = &mut borrow_global_mut<PackageRegistry>(addr).packages;
167171
// Update registry
168172
let policy = pack.upgrade_policy;
169173
if (index < len) {

aptos-move/framework/aptos-framework/sources/code.spec.move

Lines changed: 12 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -23,27 +23,32 @@ spec aptos_framework::code {
2323
}
2424

2525
spec publish_package(owner: &signer, pack: PackageMetadata, code: vector<vector<u8>>) {
26-
// TODO: Can't verify `check_upgradability` in while loop.
27-
pragma verify = false;
26+
// TODO: Can't verify 'vector::enumerate' loop.
27+
pragma aborts_if_is_partial;
28+
let addr = signer::address_of(owner);
29+
modifies global<PackageRegistry>(addr);
30+
aborts_if pack.upgrade_policy.policy <= upgrade_policy_arbitrary().policy;
2831
}
2932

3033
spec publish_package_txn {
31-
// TODO: Calls `publish_package`.`
34+
// TODO: Calls `publish_package`.
3235
pragma verify = false;
3336
}
3437

3538
spec check_upgradability(old_pack: &PackageMetadata, new_pack: &PackageMetadata, new_modules: &vector<String>) {
36-
// TODO: Can't `aborts_if` in a loop.
37-
pragma verify = false;
39+
// TODO: Can't verify 'vector::enumerate' loop.
40+
pragma aborts_if_is_partial;
41+
aborts_if old_pack.upgrade_policy.policy >= upgrade_policy_immutable().policy;
42+
aborts_if !can_change_upgrade_policy_to(old_pack.upgrade_policy, new_pack.upgrade_policy);
3843
}
3944

4045
spec check_dependencies(publish_address: address, pack: &PackageMetadata): vector<AllowedDep> {
41-
// TODO: loop too deep.
46+
// TODO: Can't verify 'vector::enumerate' loop.
4247
pragma verify = false;
4348
}
4449

4550
spec check_coexistence(old_pack: &PackageMetadata, new_modules: &vector<String>) {
46-
// TODO: loop too deep.
51+
// TODO: Can't verify 'vector::enumerate' loop.
4752
pragma verify = false;
4853
}
4954

71 Bytes
Binary file not shown.

0 commit comments

Comments
 (0)