---
# System prepended metadata

title: Block proposal

---

# Block proposal

## Inchoate micro-block

Round leader creates the key block and a sequence of inchoate micro-blocks filled with transactions.

```mermaid
flowchart RL
    A[Key Block]
    B(IMB 1) --> A
    C(IMB 2) --> B
    D(IMB 3) --> C
    Z(IMB N) -.->D
```

```mermaid
flowchart RL
    subgraph Block1
        direction RL
        kb1(Key Block 1)
        subgraph MB11
            direction BT
            imb11(IMB 1)
            mb11(MB 1) --> imb11
        end
        subgraph MB12
            direction BT
            imb12(IMB 2)
            mb12(MB 2) --> imb12
        end
        MB11 ==> kb1
        MB12 ==> MB11
    end
    subgraph Block2
        direction RL
        kb2(Key Block 2)
        subgraph MB21
            direction BT
            imb21(IMB 1)
            mb21(MB 1) --> imb21
        end
        subgraph MB22
            direction BT
            imb22(IMB 2)
            mb22(MB 2) --> imb22
        end
        MB21 ==> kb2
        MB22 ==> MB21
    end
    Block2 --> Block1
    Z[...] -.-> Block2
```

### Key Block structure

* Leader PK
* Ref Block ID (Prev Key Block or IMB)
* Meta Info *(version, timestamp, flags)*
* *KB_ID = HASH(LPK, Ref, Meta)*
* KB_Sig = SIG(KB_ID)

### Incoate micro-block structure

* Leader PK
* Ref Block ID (Key Block of previous Inchoate Micro-Block)
* Tx Root Hash
* Full Tx Root Hash
* *IMB_ID = HASH(LPK, Ref, TxRH, FTxRH)*
* IMB_Sig = SIG(IMB_ID)
* Transactions

### Micro-Block structure

* IMB
    * LPK
    * Ref
    * TxRH
    * FTxRH
    * IMB_Sig
    * Transactions
* Calculator PK
* Calculator Consensus
* Ref MB
* State Changes Root Hash
* Full State Changes Root Hash
* Proof of Calculation
* *MB_ID = HASH(CPK, CC, RefMB, IMB_ID, StRH, FStRH)*
* MB_Sig = SIG(MB_ID)
* State Changes

### Final Block structure

* Key Block
    * Leader PK
    * Ref Block ID
    * Meta Info
    * Signature
* Micro-Blocks
    * MB 1
        * IMB 1
            * ...
            * Transactions 1
        * ...
        * State Changes 1
    * MB 2
    * ...
    * MB N
* *ID = MB_ID N*
* *B_SIG = MB_Sig N*

## Proof of calcutlation

State Changes are public information available to any member of the network. It can be easily copied by a dishones calculator claiming to be rewarded for the calculation performed. To prevent such behavior, the proof of calculation must not disclose the calculation itself.

The proposal is to use a STARK-like approach to conceal the proof data.

The calculator collects the identifiers of the functions used to calculate State Changes and writes them to the Merkle tree. To make the root hash unique, the calculator's public key is added to the Merkle tree as the first leaf. 

```mermaid
flowchart TD
  R(Root Hash) --> A1( )
  R --> A2( )
  A1 --> B1( )
  A1 --> B2( )
  A2 --> B3( )
  A2 --> B4( )
  B1 --> D(Public Key)
  B1 --> E(Func ID 1)
  B4 --> F(...)
  B4 --> J(Func ID n)
  classDef selected fill:#f9f
  class R,A1,B1,A2,B3,B4,D,J,C selected;
  
```

On the next step it calculates root hash of the Merkle tree and uses if as a source of entropy to select Merkle branches.

The Merkle branch from calculator's Public Key, the randomly selected branches and root hash are provided as the proof of calculation. 

Two levels of verification are possible. 

At the first, basic level, everyone on the network can check that the provided Merkle branches produce the same root hash as in the proof. 

At the second, full verification level, the verifier can repeat all calculations and recreate the tree completely using original calculator's public key. This way one can check that the root hash matches and that the random branches have been chosen correctly. 

### Possible attacks

#### Random Function IDs

An unfair calculator can build a Merkle tree from a random set of function identifiers to simulate a calculation.
