language/diem-framework/releases/artifacts/current/docs/modules/DiemVersion.md
<a name="0x1_DiemVersion"></a>
0x1::DiemVersionMaintains the version number for the Diem blockchain. The version is stored in a DiemConfig, and may be updated by Diem root.
<pre><code><b>use</b> <a href="DiemConfig.md#0x1_DiemConfig">0x1::DiemConfig</a>; <b>use</b> <a href="DiemTimestamp.md#0x1_DiemTimestamp">0x1::DiemTimestamp</a>; <b>use</b> <a href="../../../../../../move-stdlib/docs/Errors.md#0x1_Errors">0x1::Errors</a>; <b>use</b> <a href="Roles.md#0x1_Roles">0x1::Roles</a>; </code></pre><a name="0x1_DiemVersion_DiemVersion"></a>
DiemVersion<a name="@Constants_0"></a>
<a name="0x1_DiemVersion_EINVALID_MAJOR_VERSION_NUMBER"></a>
Tried to set an invalid major version for the VM. Major versions must be strictly increasing
<pre><code><b>const</b> <a href="DiemVersion.md#0x1_DiemVersion_EINVALID_MAJOR_VERSION_NUMBER">EINVALID_MAJOR_VERSION_NUMBER</a>: u64 = 0; </code></pre><a name="0x1_DiemVersion_initialize"></a>
initializePublishes the DiemVersion config. Must be called during Genesis.
<pre><code><b>public</b> <b>fun</b> <a href="DiemVersion.md#0x1_DiemVersion_initialize">initialize</a>(dr_account: &signer, initial_version: u64) </code></pre> <details> <summary>Implementation</summary> <pre><code><b>public</b> <b>fun</b> <a href="DiemVersion.md#0x1_DiemVersion_initialize">initialize</a>(dr_account: &signer, initial_version: u64) { <a href="DiemTimestamp.md#0x1_DiemTimestamp_assert_genesis">DiemTimestamp::assert_genesis</a>(); <a href="Roles.md#0x1_Roles_assert_diem_root">Roles::assert_diem_root</a>(dr_account); <a href="DiemConfig.md#0x1_DiemConfig_publish_new_config">DiemConfig::publish_new_config</a><<a href="DiemVersion.md#0x1_DiemVersion">DiemVersion</a>>( dr_account, <a href="DiemVersion.md#0x1_DiemVersion">DiemVersion</a> { major: initial_version }, ); } </code></pre> </details> <details> <summary>Specification</summary>Must abort if the signer does not have the DiemRoot role [H10].
<pre><code><b>include</b> <a href="Roles.md#0x1_Roles_AbortsIfNotDiemRoot">Roles::AbortsIfNotDiemRoot</a>{account: dr_account}; <b>include</b> <a href="DiemTimestamp.md#0x1_DiemTimestamp_AbortsIfNotGenesis">DiemTimestamp::AbortsIfNotGenesis</a>; <b>include</b> <a href="DiemConfig.md#0x1_DiemConfig_PublishNewConfigAbortsIf">DiemConfig::PublishNewConfigAbortsIf</a><<a href="DiemVersion.md#0x1_DiemVersion">DiemVersion</a>>; <b>include</b> <a href="DiemConfig.md#0x1_DiemConfig_PublishNewConfigEnsures">DiemConfig::PublishNewConfigEnsures</a><<a href="DiemVersion.md#0x1_DiemVersion">DiemVersion</a>>{payload: <a href="DiemVersion.md#0x1_DiemVersion">DiemVersion</a> { major: initial_version }}; </code></pre> </details><a name="0x1_DiemVersion_set"></a>
setAllows Diem root to update the major version to a larger version.
<pre><code><b>public</b> <b>fun</b> <a href="DiemVersion.md#0x1_DiemVersion_set">set</a>(dr_account: &signer, major: u64) </code></pre> <details> <summary>Implementation</summary> <pre><code><b>public</b> <b>fun</b> <a href="DiemVersion.md#0x1_DiemVersion_set">set</a>(dr_account: &signer, major: u64) { <a href="DiemTimestamp.md#0x1_DiemTimestamp_assert_operating">DiemTimestamp::assert_operating</a>(); <a href="Roles.md#0x1_Roles_assert_diem_root">Roles::assert_diem_root</a>(dr_account); <b>let</b> old_config = <a href="DiemConfig.md#0x1_DiemConfig_get">DiemConfig::get</a><<a href="DiemVersion.md#0x1_DiemVersion">DiemVersion</a>>(); <b>assert</b>( old_config.major < major, <a href="../../../../../../move-stdlib/docs/Errors.md#0x1_Errors_invalid_argument">Errors::invalid_argument</a>(<a href="DiemVersion.md#0x1_DiemVersion_EINVALID_MAJOR_VERSION_NUMBER">EINVALID_MAJOR_VERSION_NUMBER</a>) ); <a href="DiemConfig.md#0x1_DiemConfig_set">DiemConfig::set</a><<a href="DiemVersion.md#0x1_DiemVersion">DiemVersion</a>>( dr_account, <a href="DiemVersion.md#0x1_DiemVersion">DiemVersion</a> { major } ); } </code></pre> </details> <details> <summary>Specification</summary>Must abort if the signer does not have the DiemRoot role [H10].
<pre><code><b>include</b> <a href="Roles.md#0x1_Roles_AbortsIfNotDiemRoot">Roles::AbortsIfNotDiemRoot</a>{account: dr_account}; <b>include</b> <a href="DiemTimestamp.md#0x1_DiemTimestamp_AbortsIfNotOperating">DiemTimestamp::AbortsIfNotOperating</a>; <b>aborts_if</b> <a href="DiemConfig.md#0x1_DiemConfig_get">DiemConfig::get</a><<a href="DiemVersion.md#0x1_DiemVersion">DiemVersion</a>>().major >= major <b>with</b> <a href="../../../../../../move-stdlib/docs/Errors.md#0x1_Errors_INVALID_ARGUMENT">Errors::INVALID_ARGUMENT</a>; <b>include</b> <a href="DiemConfig.md#0x1_DiemConfig_SetAbortsIf">DiemConfig::SetAbortsIf</a><<a href="DiemVersion.md#0x1_DiemVersion">DiemVersion</a>>{account: dr_account}; <b>include</b> <a href="DiemConfig.md#0x1_DiemConfig_SetEnsures">DiemConfig::SetEnsures</a><<a href="DiemVersion.md#0x1_DiemVersion">DiemVersion</a>>{payload: <a href="DiemVersion.md#0x1_DiemVersion">DiemVersion</a> { major }}; </code></pre> </details><a name="@Module_Specification_1"></a>
<a name="@Initialization_2"></a>
After genesis, version is published.
<pre><code><b>invariant</b> [suspendable] <a href="DiemTimestamp.md#0x1_DiemTimestamp_is_operating">DiemTimestamp::is_operating</a>() ==> <a href="DiemConfig.md#0x1_DiemConfig_spec_is_published">DiemConfig::spec_is_published</a><<a href="DiemVersion.md#0x1_DiemVersion">DiemVersion</a>>(); </code></pre><a name="@Access_Control_3"></a>
The permission "UpdateDiemProtocolVersion" is granted to DiemRoot [H10].
<pre><code><b>invariant</b> <b>forall</b> addr: address <b>where</b> <b>exists</b><<a href="DiemConfig.md#0x1_DiemConfig">DiemConfig</a><<a href="DiemVersion.md#0x1_DiemVersion">DiemVersion</a>>>(addr): addr == @DiemRoot; <b>invariant</b> <b>update</b> [suspendable] <b>old</b>(<a href="DiemConfig.md#0x1_DiemConfig_spec_is_published">DiemConfig::spec_is_published</a><<a href="DiemVersion.md#0x1_DiemVersion">DiemVersion</a>>()) && <a href="DiemConfig.md#0x1_DiemConfig_spec_is_published">DiemConfig::spec_is_published</a><<a href="DiemVersion.md#0x1_DiemVersion">DiemVersion</a>>() && <b>old</b>(<a href="DiemConfig.md#0x1_DiemConfig_get">DiemConfig::get</a><<a href="DiemVersion.md#0x1_DiemVersion">DiemVersion</a>>().major) != <a href="DiemConfig.md#0x1_DiemConfig_get">DiemConfig::get</a><<a href="DiemVersion.md#0x1_DiemVersion">DiemVersion</a>>().major ==> <a href="Roles.md#0x1_Roles_spec_signed_by_diem_root_role">Roles::spec_signed_by_diem_root_role</a>(); </code></pre>Only "set" can modify the DiemVersion config [H10]
<a name="0x1_DiemVersion_DiemVersionRemainsSame"></a>
<pre><code><b>schema</b> <a href="DiemVersion.md#0x1_DiemVersion_DiemVersionRemainsSame">DiemVersionRemainsSame</a> { <b>ensures</b> <b>old</b>(<a href="DiemConfig.md#0x1_DiemConfig_spec_is_published">DiemConfig::spec_is_published</a><<a href="DiemVersion.md#0x1_DiemVersion">DiemVersion</a>>()) ==> <b>global</b><<a href="DiemConfig.md#0x1_DiemConfig">DiemConfig</a><<a href="DiemVersion.md#0x1_DiemVersion">DiemVersion</a>>>(@DiemRoot) == <b>old</b>(<b>global</b><<a href="DiemConfig.md#0x1_DiemConfig">DiemConfig</a><<a href="DiemVersion.md#0x1_DiemVersion">DiemVersion</a>>>(@DiemRoot)); } </code></pre>The permission "UpdateDiemProtocolVersion" is granted to DiemRoot [H10].
<pre><code><b>apply</b> <a href="DiemVersion.md#0x1_DiemVersion_DiemVersionRemainsSame">DiemVersionRemainsSame</a> <b>to</b> * <b>except</b> set; </code></pre><a name="@Other_Invariants_4"></a>
Version number never decreases
<pre><code><b>invariant</b> <b>update</b> [suspendable] <a href="DiemTimestamp.md#0x1_DiemTimestamp_is_operating">DiemTimestamp::is_operating</a>() ==> (<b>old</b>(<a href="DiemConfig.md#0x1_DiemConfig_get">DiemConfig::get</a><<a href="DiemVersion.md#0x1_DiemVersion">DiemVersion</a>>().major) <= <a href="DiemConfig.md#0x1_DiemConfig_get">DiemConfig::get</a><<a href="DiemVersion.md#0x1_DiemVersion">DiemVersion</a>>().major); </code></pre>