language/diem-framework/modules/doc/ChainId.md
<a name="0x1_ChainId"></a>
0x1::ChainIdThe chain id distinguishes between different chains (e.g., testnet and the main Diem network). One important role is to prevent transactions intended for one chain from being executed on another. This code provides a container for storing a chain id and functions to initialize and get it.
<pre><code><b>use</b> <a href="CoreAddresses.md#0x1_CoreAddresses">0x1::CoreAddresses</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="../../../../../../move-stdlib/docs/Signer.md#0x1_Signer">0x1::Signer</a>; </code></pre><a name="0x1_ChainId_ChainId"></a>
ChainId<a name="@Constants_0"></a>
<a name="0x1_ChainId_ECHAIN_ID"></a>
The <code><a href="ChainId.md#0x1_ChainId">ChainId</a></code> resource was not in the required state
<pre><code><b>const</b> <a href="ChainId.md#0x1_ChainId_ECHAIN_ID">ECHAIN_ID</a>: u64 = 0; </code></pre><a name="0x1_ChainId_initialize"></a>
initializePublish the chain ID <code>id</code> of this Diem instance under the DiemRoot account
<pre><code><b>public</b> <b>fun</b> <a href="ChainId.md#0x1_ChainId_initialize">initialize</a>(dr_account: &signer, id: u8) </code></pre> <details> <summary>Implementation</summary> <pre><code><b>public</b> <b>fun</b> <a href="ChainId.md#0x1_ChainId_initialize">initialize</a>(dr_account: &signer, id: u8) { <a href="DiemTimestamp.md#0x1_DiemTimestamp_assert_genesis">DiemTimestamp::assert_genesis</a>(); <a href="CoreAddresses.md#0x1_CoreAddresses_assert_diem_root">CoreAddresses::assert_diem_root</a>(dr_account); <b>assert</b>(!<b>exists</b><<a href="ChainId.md#0x1_ChainId">ChainId</a>>(<a href="../../../../../../move-stdlib/docs/Signer.md#0x1_Signer_address_of">Signer::address_of</a>(dr_account)), <a href="../../../../../../move-stdlib/docs/Errors.md#0x1_Errors_already_published">Errors::already_published</a>(<a href="ChainId.md#0x1_ChainId_ECHAIN_ID">ECHAIN_ID</a>)); move_to(dr_account, <a href="ChainId.md#0x1_ChainId">ChainId</a> { id }) } </code></pre> </details> <details> <summary>Specification</summary> <pre><code><b>pragma</b> opaque; <b>let</b> dr_addr = <a href="../../../../../../move-stdlib/docs/Signer.md#0x1_Signer_address_of">Signer::address_of</a>(dr_account); <b>modifies</b> <b>global</b><<a href="ChainId.md#0x1_ChainId">ChainId</a>>(dr_addr); <b>include</b> <a href="DiemTimestamp.md#0x1_DiemTimestamp_AbortsIfNotGenesis">DiemTimestamp::AbortsIfNotGenesis</a>; <b>include</b> <a href="CoreAddresses.md#0x1_CoreAddresses_AbortsIfNotDiemRoot">CoreAddresses::AbortsIfNotDiemRoot</a>{account: dr_account}; <b>aborts_if</b> <b>exists</b><<a href="ChainId.md#0x1_ChainId">ChainId</a>>(dr_addr) <b>with</b> <a href="../../../../../../move-stdlib/docs/Errors.md#0x1_Errors_ALREADY_PUBLISHED">Errors::ALREADY_PUBLISHED</a>; <b>ensures</b> <b>exists</b><<a href="ChainId.md#0x1_ChainId">ChainId</a>>(dr_addr); </code></pre> </details><a name="0x1_ChainId_get"></a>
getReturn the chain ID of this Diem instance
<pre><code><b>public</b> <b>fun</b> <a href="ChainId.md#0x1_ChainId_get">get</a>(): u8 </code></pre> <details> <summary>Implementation</summary> <pre><code><b>public</b> <b>fun</b> <a href="ChainId.md#0x1_ChainId_get">get</a>(): u8 <b>acquires</b> <a href="ChainId.md#0x1_ChainId">ChainId</a> { <a href="DiemTimestamp.md#0x1_DiemTimestamp_assert_operating">DiemTimestamp::assert_operating</a>(); borrow_global<<a href="ChainId.md#0x1_ChainId">ChainId</a>>(@DiemRoot).id } </code></pre> </details><a name="@Module_Specification_1"></a>
<a name="@Initialization_2"></a>
When Diem is operating, the chain id is always available.
<pre><code><b>invariant</b> [suspendable] <a href="DiemTimestamp.md#0x1_DiemTimestamp_is_operating">DiemTimestamp::is_operating</a>() ==> <b>exists</b><<a href="ChainId.md#0x1_ChainId">ChainId</a>>(@DiemRoot); </code></pre><a name="@Helper_Functions_3"></a>
<a name="0x1_ChainId_spec_get_chain_id"></a>
<pre><code><b>fun</b> <a href="ChainId.md#0x1_ChainId_spec_get_chain_id">spec_get_chain_id</a>(): u8 { <b>global</b><<a href="ChainId.md#0x1_ChainId">ChainId</a>>(@DiemRoot).id } </code></pre>