Skip to content

chain_status - [mainnet]

This module code to assert that it is running in genesis (Self::assert_genesis) or after genesis (Self::assert_operating). These are essentially distinct states of the system. Specifically, if Self::assert_operating succeeds, assumptions about invariants over the global state can be made which reflect that the system has been successfully initialized.

use 0x1::error;
use 0x1::system_addresses;

Constants

The blockchain is not in the genesis status.

const ENOT_GENESIS: u64 = 2;

The blockchain is not in the operating status.

const ENOT_OPERATING: u64 = 1;

Resources

GenesisEndMarker

Marker to publish at the end of genesis.

struct GenesisEndMarker has key
Fields
dummy_field: bool

Functions

set_genesis_end

Marks that genesis has finished.

public(friend) fun set_genesis_end(aptos_framework: &signer)
Implementation
public(friend) fun set_genesis_end(aptos_framework: &signer) {
system_addresses::assert_aptos_framework(aptos_framework);
move_to(aptos_framework, GenesisEndMarker {});
}

is_genesis

Helper function to determine if Aptos is in genesis state.

#[view]
public fun is_genesis(): bool
Implementation
public fun is_genesis(): bool {
!exists<GenesisEndMarker>(@aptos_framework)
}

is_operating

Helper function to determine if Aptos is operating. This is the same as !is_genesis() and is provided for convenience. Testing is_operating() is more frequent than is_genesis().

#[view]
public fun is_operating(): bool
Implementation
public fun is_operating(): bool {
exists<GenesisEndMarker>(@aptos_framework)
}

assert_operating

Helper function to assert operating (not genesis) state.

public fun assert_operating()
Implementation
public fun assert_operating() {
assert!(is_operating(), error::invalid_state(ENOT_OPERATING));
}

assert_genesis

Helper function to assert genesis state.

public fun assert_genesis()
Implementation
public fun assert_genesis() {
assert!(is_genesis(), error::invalid_state(ENOT_OPERATING));
}

Specification

High-level Requirements

No.RequirementCriticalityImplementationEnforcement
1 The end of genesis mark should persist throughout the entire life of the chain. Medium The Aptos framework account should never drop the GenesisEndMarker resource. Audited that GenesisEndMarker is published at the end of genesis and never removed. Formally verified via set_genesis_end that GenesisEndMarker is published.
2 The status of the chain should never be genesis and operating at the same time. Low The status of the chain is determined by the GenesisEndMarker resource. Formally verified via global invariant.
3 The status of the chain should only be changed once, from genesis to operating. Low Attempting to assign a resource type more than once will abort. Formally verified via set_genesis_end.

Module-level Specification

pragma verify = true;
pragma aborts_if_is_strict;
// This enforces high-level requirement 2:
invariant is_genesis() == !is_operating();

set_genesis_end

public(friend) fun set_genesis_end(aptos_framework: &signer)
pragma verify = true;
pragma delegate_invariants_to_caller;
let addr = signer::address_of(aptos_framework);
aborts_if addr != @aptos_framework;
// This enforces high-level requirement 3:
aborts_if exists<GenesisEndMarker>(@aptos_framework);
// This enforces high-level requirement 1:
ensures global<GenesisEndMarker>(@aptos_framework) == GenesisEndMarker {};
schema RequiresIsOperating {
requires is_operating();
}

assert_operating

public fun assert_operating()
aborts_if !is_operating();

assert_genesis

public fun assert_genesis()
aborts_if !is_genesis();