From 39711b8752cfc29119d820b93e3fc89bc9e036a4 Mon Sep 17 00:00:00 2001 From: Philipp Gackstatter Date: Fri, 5 May 2023 10:30:59 +0200 Subject: [PATCH 001/140] Add TIP-42 skeleton --- tips/TIP-0042/tip-0042.md | 1023 +++++++++++++++++++++++++++++++++++++ 1 file changed, 1023 insertions(+) create mode 100644 tips/TIP-0042/tip-0042.md diff --git a/tips/TIP-0042/tip-0042.md b/tips/TIP-0042/tip-0042.md new file mode 100644 index 000000000..64cf45254 --- /dev/null +++ b/tips/TIP-0042/tip-0042.md @@ -0,0 +1,1023 @@ +--- +tip: TODO +title: IOTA 2.0 UTXO Accounts +description: Defines the IOTA 2.0 Account used to issue blocks onto the network +author: TODO +discussions-to: TODO +status: Draft +type: Standards +layer: Core +created: 2023-05-03 +requires: TIP-19, TIP-20, TIP-21 and TIP-22 +--- + +# Table of Contents + +1. [Summary](#summary) +2. [Motivation](#motivation) +3. [Building Blocks](#building-blocks) +4. [Unlock Conditions](#unlock-conditions) + - [Account Locking & Unlocking](#account-locking--unlocking) +5. [Account Output](#account) +6. [Copyright](#copyright) + +# Summary + +# Motivation + +# Building Blocks + +## Data Types & Subschema Notation + +Data types and subschemas used throughout this TIP are defined in [TIP-21](../TIP-0021/tip-0021.md). + +## Global Protocol Parameters + +Global protocol parameters used throughout this TIP are defined in [TIP-22 (IOTA)](../TIP-0022/tip-0022.md) and [TIP-32 (Shimmer)](../TIP-0032/tip-0032.md). + +## Transaction Payload + +[TIP-20](../TIP-0020/tip-0020.md) is the basis for output validation in this TIP. + +# Unlock Conditions + +New output features that introduce unlocking conditions, that is, they define constraints on how the output can +be unlocked and spent, are grouped under the field Unlock Conditions. + +Each output **must not contain more than one unlock condition of each type** and not all unlock condition types are +supported for each output type. + +##### State Controller Address Unlock Condition + +An unlock condition defined solely for Alias Output. It is functionally equivalent to an +Address Unlock Condition, however there are additional transition constraints defined for the Alias UTXO state +machine that can only be carried out by the `State Controller Address`, hence the distinct unlock condition type. + +
+ State Controller Address Unlock +
+ Defines the State Controller Address that owns this output, that is, it can unlock it with the proper Unlock in a + transaction that state transitions the alias output. +
+
+ + + + + + + + + + + + + + + + +
NameTypeDescription
Unlock Condition Typeuint8 + Set to value 4 to denote an State Controller Address Unlock Condition. +
Address +
+ Ed25519 Address + + + + + + + + + + + + + + + + +
NameTypeDescription
Address Typeuint8 + Set to value 0 to denote an Ed25519 Address. +
PubKeyHashByteArray[32]The raw bytes of the Ed25519 address which is a BLAKE2b-256 hash of the Ed25519 public key.
+
+
+ Alias Address + + + + + + + + + + + + + + + + +
NameTypeDescription
Address Typeuint8 + Set to value 8 to denote an Alias Address. +
Alias IDByteArray[32]The raw bytes of the Alias ID which is the BLAKE2b-256 hash of the outputID that created it.
+
+
+ NFT Address + + + + + + + + + + + + + + + + +
NameTypeDescription
Address Typeuint8 + Set to value 16 to denote an NFT Address. +
NFT IDByteArray[32]The raw bytes of the NFT ID which is the BLAKE2b-256 hash of the outputID that created it.
+
+
+ +The additional constraints are defined in [Alias Output Design](#alias-output) section. + +##### Governor Address Unlock Condition + +An unlock condition defined solely for Alias Output. It is functionally equivalent to an +Address Unlock Condition, however there are additional transition constraints defined for the Alias UTXO state +machine that can only be carried out by the `Governor Address`, hence the distinct unlock condition type. + +
+ Governor Address Unlock +
+ Defines the Governor Address that owns this output, that is, it can unlock it with the proper Unlock in a + transaction that governance transitions the alias output. +
+
+ + + + + + + + + + + + + + + + +
NameTypeDescription
Unlock Condition Typeuint8 + Set to value 5 to denote an Governor Address Unlock Condition. +
Address +
+ Ed25519 Address + + + + + + + + + + + + + + + + +
NameTypeDescription
Address Typeuint8 + Set to value 0 to denote an Ed25519 Address. +
PubKeyHashByteArray[32]The raw bytes of the Ed25519 address which is a BLAKE2b-256 hash of the Ed25519 public key.
+
+
+ Alias Address + + + + + + + + + + + + + + + + +
NameTypeDescription
Address Typeuint8 + Set to value 8 to denote an Alias Address. +
Alias IDByteArray[32]The raw bytes of the Alias ID which is the BLAKE2b-256 hash of the outputID that created it.
+
+
+ NFT Address + + + + + + + + + + + + + + + + +
NameTypeDescription
Address Typeuint8 + Set to value 16 to denote an NFT Address. +
NFT IDByteArray[32]The raw bytes of the NFT ID which is the BLAKE2b-256 hash of the outputID that created it.
+
+
+ +The additional constraints are defined in [Alias Output Design](#alias-output) section. + +##### Immutable Alias Address Unlock Condition + +An unlock condition defined for chain constrained UTXOs that can only be unlocked by a permanent Alias Address. + +Output unlocking is functionally equivalent to an Address Unlock Condition with an Alias Address, +however there are additional transition constraints: the next state of the UTXO machine must have the same +Immutable Alias Address Unlock Condition. + +
+ Immutable Alias Address Unlock Condition +
+ Defines the permanent Alias Address that owns this output. +
+
+ + + + + + + + + + + + + + + + +
NameTypeDescription
Unlock Condition Typeuint8 + Set to value 6 to denote an Immutable Alias Address Unlock Condition. +
Address +
+ Alias Address + + + + + + + + + + + + + + + + +
NameTypeDescription
Address Typeuint8 + Set to value 8 to denote an Alias Address. +
Alias IDByteArray[32]The raw bytes of the Alias ID which is the BLAKE2b-256 hash of the outputID that created it.
+
+
+ +###### Additional semantic transaction validation rules: + - The output must be unlocked with an [Alias Unlock](#alias-unlock-semantic-validation). + - The next state of the UTXO state machine must have the same Immutable Alias Address Unlock Condition defined. + +### Account Locking & Unlocking + +A transaction may consume a (non-alias) output that belongs to an Alias Address by state transitioning the alias output with the matching `Alias ID`. This serves the exact same purpose as providing a signature +to unlock an output locked under a private key backed address, such as Ed25519 Addresses. + +On protocol level, alias unlocking is done using a new unlock type, called **Alias Unlock**. + +
+ Alias Unlock +
+ Points to the unlock of a consumed alias output. +
+
+ + + + + + + + + + + + + + + + + +
NameTypeDescription
Unlock Typeuint8 + Set to value 2 to denote a Alias Unlock. +
Alias Reference Unlock Indexuint16 + Index of input and unlock corresponding to an alias output. +
+ +This unlock is similar to the Reference Unlock. However, it is valid if and only if the input of the +transaction at index `Alias Reference Unlock Index` is an alias output with the same `Alias ID` as the one derived from +the `Address` field of the to-be unlocked output. + +Additionally, the Alias Unlocks must also be ordered to prevent circular dependencies: + +If the i-th *Unlock* of a transaction is an *Alias Unlock* and has `Alias Reference Unlock Index` set to k, +it must hold that i > k. Hence, an Alias Unlock can only reference an *Unlock* (unlocking the +corresponding alias) at a smaller index. + +For example the scenario where `Alias A` is locked to the address of `Alias B` while `Alias B` is in locked to the +address of `Alias A` introduces a circular dependency and is not well-defined. By requiring the *Unlocks* to be +ordered as described above, a transaction consuming `Alias A` as well as `Alias B` can never be valid as there would +always need to be one *Alias Unlock* referencing a greater index. + +#### Alias Unlock Syntactic Validation + + - It must hold that 0 ≤ `Alias Reference Unlock Index` < `Max Inputs Count`. + +#### Alias Unlock Semantic Validation + + - The address of the unlocking condition of the input being unlocked must be an Alias Address. + - The index `i` of the Alias Unlock is the index of the input in the transaction that it unlocks. + `Alias Reference Unlock Index` must be < `i`. + - `Alias Reference Unlock Index` defines a previous input of the transaction and its unlock. This input must + be an Alias Output with `Alias ID` that refers to the Alias Address being unlocked. + - The referenced Alias Output must be unlocked for state transition. + +# Account Output + +The Alias Output is a specific implementation of a UTXO state machine. `Alias ID`, the unique identifier of an +instance of the deployed state machine, is generated deterministically by the protocol and is not allowed to change in +any future state transitions. + +Alias Output represents an alias account in the ledger with two control levels and a permanent +Alias Address. The account owns other outputs that are locked under Alias Address. The account keeps +track of state transitions (`State Index` counter), controlled foundries (`Foundry Counter`) and anchors the layer 2 +state as metadata into the UTXO ledger. + + +
+ Alias Output +
+ Describes an alias account in the ledger that can be controlled by the state and governance controllers. +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
Output Typeuint8 + Set to value 4 to denote a Alias Output. +
Amountuint64The amount of IOTA coins held by the output.
Native Tokens Countuint8The number of native tokens held by the output.
Native Tokens optAnyOf +
+ Native Token + + + + + + + + + + + + + + + + +
NameTypeDescription
Token IDByteArray[38] + Identifier of the native token. +
Amountuint256 + Amount of native tokens of the given Token ID. +
+
+
Alias IDByteArray[32]Unique identifier of the alias, which is the BLAKE2b-256 hash of the Output ID that created it. Alias Address = Alias Address Type || Alias ID
State Indexuint32A counter that must increase by 1 every time the alias is state transitioned.
State Metadata(uint16)ByteArrayMetadata that can only be changed by the state controller. A leading uint16 denotes its length.
Foundry Counteruint32A counter that denotes the number of foundries created by this alias account.
Unlock Conditions Countuint8The number of unlock conditions following.
Unlock Conditions atMostOneOfEach +
+ State Controller Address Unlock Condition + + + + + + + + + + + + + + + +
NameTypeDescription
Unlock Condition Typeuint8 + Set to value 4 to denote an State Controller Address Unlock Condition. +
Address +
+ Ed25519 Address + + + + + + + + + + + + + + + + +
NameTypeDescription
Address Typeuint8 + Set to value 0 to denote an Ed25519 Address. +
PubKeyHashByteArray[32]The raw bytes of the Ed25519 address which is a BLAKE2b-256 hash of the Ed25519 public key.
+
+
+ Alias Address + + + + + + + + + + + + + + + + +
NameTypeDescription
Address Typeuint8 + Set to value 8 to denote an Alias Address. +
Alias IDByteArray[32]The raw bytes of the Alias ID which is the BLAKE2b-256 hash of the outputID that created it.
+
+
+ NFT Address + + + + + + + + + + + + + + + + +
NameTypeDescription
Address Typeuint8 + Set to value 16 to denote an NFT Address. +
NFT IDByteArray[32]The raw bytes of the NFT ID which is the BLAKE2b-256 hash of the outputID that created it.
+
+
+
+
+ Governor Address Unlock Condition + + + + + + + + + + + + + + + +
NameTypeDescription
Unlock Condition Typeuint8 + Set to value 5 to denote an Governor Address Unlock Condition. +
Address +
+ Ed25519 Address + + + + + + + + + + + + + + + + +
NameTypeDescription
Address Typeuint8 + Set to value 0 to denote an Ed25519 Address. +
PubKeyHashByteArray[32]The raw bytes of the Ed25519 address which is a BLAKE2b-256 hash of the Ed25519 public key.
+
+
+ Alias Address + + + + + + + + + + + + + + + + +
NameTypeDescription
Address Typeuint8 + Set to value 8 to denote an Alias Address. +
Alias IDByteArray[32]The raw bytes of the Alias ID which is the BLAKE2b-256 hash of the outputID that created it.
+
+
+ NFT Address + + + + + + + + + + + + + + + + +
NameTypeDescription
Address Typeuint8 + Set to value 16 to denote an NFT Address. +
NFT IDByteArray[32]The raw bytes of the NFT ID which is the BLAKE2b-256 hash of the outputID that created it.
+
+
+
+
Features Countuint8The number of features following.
Features atMostOneOfEach +
+ Sender Feature +
+ Identifies the validated sender of the output. +
+ + + + + + + + + + + + + + + +
NameTypeDescription
Feature Typeuint8 + Set to value 0 to denote a Sender Feature. +
Sender oneOf +
+ Ed25519 Address + + + + + + + + + + + + + + + + +
NameTypeDescription
Address Typeuint8 + Set to value 0 to denote an Ed25519 Address. +
PubKeyHashByteArray[32]The raw bytes of the Ed25519 address which is a BLAKE2b-256 hash of the Ed25519 public key.
+
+
+ Alias Address + + + + + + + + + + + + + + + + +
NameTypeDescription
Address Typeuint8 + Set to value 8 to denote an Alias Address. +
Alias IDByteArray[32]The raw bytes of the Alias ID which is the BLAKE2b-256 hash of the outputID that created it.
+
+
+ NFT Address + + + + + + + + + + + + + + + + +
NameTypeDescription
Address Typeuint8 + Set to value 16 to denote an NFT Address. +
NFT IDByteArray[32]The raw bytes of the NFT ID which is the BLAKE2b-256 hash of the outputID that created it.
+
+
+
+
+ Metadata Feature +
+ Defines metadata (arbitrary binary data) that will be stored in the output. +
+ + + + + + + + + + + + + + + + +
NameTypeDescription
Feature Typeuint8 + Set to value 2 to denote a Metadata Feature. +
Data(uint16)ByteArrayBinary data. A leading uint16 denotes its length.
+
+
Immutable Features Countuint8The number of immutable features following. Immutable features are defined upon deployment of the UTXO state machine and are not allowed to change in any future state transition.
Immutable Features atMostOneOfEach +
+ Issuer Feature +
+ Identifies the validated issuer of the UTXO state machine. +
+ + + + + + + + + + + + + + + +
NameTypeDescription
Feature Typeuint8 + Set to value 1 to denote an Issuer Feature. +
Issuer oneOf +
+ Ed25519 Address + + + + + + + + + + + + + + + + +
NameTypeDescription
Address Typeuint8 + Set to value 0 to denote an Ed25519 Address. +
PubKeyHashByteArray[32]The raw bytes of the Ed25519 address which is a BLAKE2b-256 hash of the Ed25519 public key.
+
+
+ Alias Address + + + + + + + + + + + + + + + + +
NameTypeDescription
Address Typeuint8 + Set to value 8 to denote an Alias Address. +
Alias IDByteArray[32]The raw bytes of the Alias ID which is the BLAKE2b-256 hash of the outputID that created it.
+
+
+ NFT Address + + + + + + + + + + + + + + + + +
NameTypeDescription
Address Typeuint8 + Set to value 16 to denote an NFT Address. +
NFT IDByteArray[32]The raw bytes of the NFT ID which is the BLAKE2b-256 hash of the outputID that created it.
+
+
+
+
+ Metadata Feature +
+ Defines metadata (arbitrary binary data) that will be stored in the output. +
+ + + + + + + + + + + + + + + + +
NameTypeDescription
Feature Typeuint8 + Set to value 2 to denote a Metadata Feature. +
Data(uint16)ByteArrayBinary data. A leading uint16 denotes its length.
+
+
+ + + +### Additional Transaction Syntactic Validation Rules + +#### Output Syntactic Validation + +- `Amount` field must fulfill the dust protection requirements and must not be `0`. +- `Amount` field must be ≤ `Max IOTA Supply`. +- `Native Tokens Count` must not be greater than `Max Native Tokens Count`. +- `Native Tokens` must be lexicographically sorted based on `Token ID`. +- Each Native Token must be unique in the set of `Native Tokens` based on its `Token ID`. No duplicates are + allowed. +- `Amount` of any Native Token must not be `0`. +- It must hold true that `Unlock Conditions Count` = `2`. +- `Unlock Condition Type` of an Unlock Condition must define one of the following types: + - State Controller Address Unlock Condition + - Governor Address Unlock Condition +- Unlock Conditions must be sorted in ascending order based on their `Unlock Condition Type`. +- Syntactic validation of all present unlock conditions must pass. +- It must hold true that `0` ≤ `Features Count` ≤ `2`. +- `Feature Type` of a Feature in `Features` must define one of the following types: + - Sender Feature + - Metadata Feature +- It must hold true that `0` ≤ `Immutable Features Count` ≤ `2`. +- `Feature Type` of a Feature in `Immutable Features` must define on of the following types: + - Issuer Feature + - Metadata Feature +- Features must be sorted in ascending order based on their `Feature Type` both in `Features` and `Immutable Features` + fields. +- Syntactic validation of all present features must pass. +- When `Alias ID` is zeroed out, `State Index` and `Foundry Counter` must be `0`. +- `length(State Metadata)` must not be greater than `Max Metadata Length`. +- `Address` of State Controller Address Unlock Condition and `Address` of + Governor Address Unlock Condition must be different from the alias address derived from `Alias ID`. + +### Additional Transaction Semantic Validation Rules + +- Explicit `Alias ID`: `Alias ID` is taken as the value of the `Alias ID` field in the alias output. +- Implicit `Alias ID`: When an alias output is consumed as an input in a transaction and `Alias ID` field is zeroed out + while `State Index` and `Foundry Counter` are zero, take the BLAKE2b-256 hash of the `Output ID` of the input as + `Alias ID`. +- For every non-zero explicit `Alias ID` on the output side there must be a corresponding alias on the input side. The + corresponding alias has the explicit or implicit `Alias ID` equal to that of the alias on the output side. + +#### Consumed Outputs + +Whenever an alias output is consumed in a transaction, it means that the alias is transitioned into its next state. The +**current state** is defined as the **consumed alias output**, while the **next state** is defined as the **alias +output with the same explicit `AliasID` on the output side**. There are two types of transitions: `state transition` +and `governance transition`. +- State transition: + - A state transition is identified by an incremented `State Index`. + - The `State Index` must be incremented by 1. + - The unlock must correspond to the `Address` of State Controller Address Unlock Condition. + - State transition can only change the following fields in the next state: + - `IOTA Amount`, + - `Native Tokens`, + - `State Index`, + - `State Metadata`, + - `Foundry Counter` and + - `Sender Feature` in `Features`. + - `Foundry Counter` field must increase by the number of foundry outputs created in the transaction that map to + `Alias ID`. The `Serial Number` fields of the created foundries must be the set of natural numbers that cover the + open-ended interval between the previous and next values of the `Foundry Counter` field in the alias output. + - The created foundry outputs must be sorted in the list of outputs by their `Serial Number`. Note, that any + foundry that maps to `Alias ID` and has a `Serial Number` that is less or equal to the `Foundry Counter` of the + input alias is ignored when it comes to sorting. + - Newly created foundries in the transaction that map to different aliases can be interleaved when it comes to + sorting. +- Governance transition: + - A governance transition is identified by an unchanged `State Index` in next state. If there is no alias output on + the output side with a corresponding explicit `Alias ID`, the alias is being destroyed. The next state is the + empty state. + - The unlock must correspond to the `Address` of Governor Address Unlock Condition. + - Governance transition must only change the following fields: + - `Address` of State Controller Address Unlock Condition, + - `Address` of Governor Address Unlock Condition, + - `Metadata Feature` and `Sender Feature` in `Features`. + - The `Metadata Feature` is optional, the governor can put additional info about the chain here, for example chain + name, fee structure, supported VMs, list of access nodes, etc., anything that helps clients to fetch info (i.e. + account balances) about the layer 2 network. +- When a consumed alias output has Features defined in `Immutable Features` and a corresponding alias output on the + output side, `Immutable Features` is not allowed to change. + +#### Created Outputs + +- When Issuer Feature is present in an output and explicit `Alias ID` is zeroed out, an input with `Address` field + that corresponds to `Issuer` must be unlocked in the transaction. + +### Notes +- Governor Address Unlock Condition field is made mandatory for now to help formal verification. When the same + entity is defined for state and governance controllers, the output is self governed. Later, for compression reasons, + it is possible to make the governance controller optional and define a self-governed alias as one that does not have + the governance Governor Address Unlock Condition set. +- Indexers and node plugins shall map the alias address of the output derived with `Alias ID` to the regular + address -> output mapping table, so that given an Alias Address, its most recent unspent alias output + can be retrieved. + +## Unlocking Chain Script Locked Outputs + +TODO: Adapt to remove NFT references and move those to the UTXO TIP. + +Two of the introduced output types ([Alias](#alias-output), [NFT](#nft-output)) implement the so-called UTXO chain +constraint. These outputs receive their unique identifiers upon creation, generated by the protocol, and carry it +forward with them through transactions until they are destroyed. These unique identifiers (`Alias ID`, `NFT ID`) also +function as global addresses for the state machines, but unlike Ed25519 Addresses, they are not backed by private +keys that could be used for signing. The rightful owners who can unlock these addresses are defined in the outputs +themselves. + +Since such addresses are accounts in the ledger, it is possible to send funds to these addresses. The unlock mechanism +of such funds is designed in a way that **proving ownership of the address is reduced to the ability to unlock the +corresponding output that defines the address.** + +# Copyright + +Copyright and related rights waived via [CC0](https://creativecommons.org/publicdomain/zero/1.0/). From 2dcf8c05faea58ea065deec74cc4645701484216 Mon Sep 17 00:00:00 2001 From: Philipp Gackstatter Date: Fri, 5 May 2023 14:39:52 +0200 Subject: [PATCH 002/140] Add `Block Issuer Feature` partially --- tips/TIP-0042/tip-0042.md | 75 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 75 insertions(+) diff --git a/tips/TIP-0042/tip-0042.md b/tips/TIP-0042/tip-0042.md index 64cf45254..99cc47845 100644 --- a/tips/TIP-0042/tip-0042.md +++ b/tips/TIP-0042/tip-0042.md @@ -376,6 +376,81 @@ always need to be one *Alias Unlock* referencing a greater index. be an Alias Output with `Alias ID` that refers to the Alias Address being unlocked. - The referenced Alias Output must be unlocked for state transition. +# Features + +## Block Issuer Feature + +The presence of a Block Issuer Feature on an account signals that this account is an issuer account. Such accounts can issue blocks. This feature defines the public keys with which a signature to burn BIC from the containing account can be verified. It allows for unbonding the issuer deposit from an account. Any mana generated or stored by an issuer account is locked to that account. + +### Additional semantic transaction validation rule: +- When a Block Issuer Feature is present in an account output, the transaction that contains this output is valid, if and only if: + - `Amount` >= `Issuer Deposit`, which implies that the `Amount` must be at least the issuer deposit or the required storage deposit, whichever is higher. +- When a Block Issuer Feature is present in an account input containing `Issuer Deposit Unbond` = `0` or in an account output representing the initial state of its UTXO state machine, the transaction that contains the account output is valid, if either of the following conditions for the account output hold: + - `Issuer Deposit Unbond` = `0`. + - `Issuer Deposit Unbond` >= `Slot Index + MCA`, where the `Slot Index` is the slot index of the slot commitment in which this transaction is included and `MCA` is the maximum committable age (TODO: Define or link to definition) +- When a Block Issuer Feature is present in an account input with `Issuer Deposit Unbond` != `0`, the transaction that contains the corresponding account output is valid, if either of the following conditions hold: + - The value of `Issuer Deposit Unbond` on the account output matches the value of `Issuer Deposit Unbond` on the account input. + - If all of the following conditions hold: + - `Slot Index` >= `Issuer Deposit Unbond`, where the `Slot Index` is the slot index of the slot commitment in which this transaction is included. + - The BIC balance of the containing account is non-negative. + - The Block Issuer Feature is removed in the account output. + +
+ Block Issuer Feature +
+ Contains the public keys to verify block signatures and allows for unbonding the issuer deposit. +
+
+ +TODO: Decide on using either addresses or actual keys as the block issuer keys. + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
Feature Typeuint8 + Set to value X to denote a Block Issuer Feature. +
Block Issuer Keys anyOf +
+ Ed25519 Address + + + + + + + + + + + + + + + + +
NameTypeDescription
Address Typeuint8 + Set to value 0 to denote an Ed25519 Address. +
PubKeyHashByteArray[32]The raw bytes of the Ed25519 address which is a BLAKE2b-256 hash of the Ed25519 public key.
+
+
Issuer Deposit Unbonduint64The slot index at which the issuer deposit can be unlocked.
+ # Account Output The Alias Output is a specific implementation of a UTXO state machine. `Alias ID`, the unique identifier of an From 197a277a79e4f3a57052e1e19adb7d2ba80e0d1a Mon Sep 17 00:00:00 2001 From: Philipp Gackstatter Date: Fri, 5 May 2023 15:36:33 +0200 Subject: [PATCH 003/140] Fix table of contents; header indentation --- tips/TIP-0042/tip-0042.md | 28 ++++++++++++++++------------ 1 file changed, 16 insertions(+), 12 deletions(-) diff --git a/tips/TIP-0042/tip-0042.md b/tips/TIP-0042/tip-0042.md index 99cc47845..d3d6de316 100644 --- a/tips/TIP-0042/tip-0042.md +++ b/tips/TIP-0042/tip-0042.md @@ -17,9 +17,13 @@ requires: TIP-19, TIP-20, TIP-21 and TIP-22 2. [Motivation](#motivation) 3. [Building Blocks](#building-blocks) 4. [Unlock Conditions](#unlock-conditions) + - [State Controller Address Unlock Condition](#state-controller-address-unlock-condition) + - [Governor Address Unlock Condition](#governor-address-unlock-condition) + - [Immutable Alias Address Unlock Condition](#immutable-alias-address-unlock-condition) - [Account Locking & Unlocking](#account-locking--unlocking) -5. [Account Output](#account) -6. [Copyright](#copyright) +5. [Features](#features) +6. [Account Output](#account-output) +7. [Copyright](#copyright) # Summary @@ -47,7 +51,7 @@ be unlocked and spent, are grouped under the field Unlock Conditions. Each output **must not contain more than one unlock condition of each type** and not all unlock condition types are supported for each output type. -##### State Controller Address Unlock Condition +## State Controller Address Unlock Condition An unlock condition defined solely for Alias Output. It is functionally equivalent to an Address Unlock Condition, however there are additional transition constraints defined for the Alias UTXO state @@ -149,7 +153,7 @@ machine that can only be carried out by the `State Controller Address`, hence th The additional constraints are defined in [Alias Output Design](#alias-output) section. -##### Governor Address Unlock Condition +## Governor Address Unlock Condition An unlock condition defined solely for Alias Output. It is functionally equivalent to an Address Unlock Condition, however there are additional transition constraints defined for the Alias UTXO state @@ -251,7 +255,7 @@ machine that can only be carried out by the `Governor Address`, hence the distin The additional constraints are defined in [Alias Output Design](#alias-output) section. -##### Immutable Alias Address Unlock Condition +## Immutable Alias Address Unlock Condition An unlock condition defined for chain constrained UTXOs that can only be unlocked by a permanent Alias Address. @@ -308,7 +312,7 @@ however there are additional transition constraints: the next state of the UTXO -###### Additional semantic transaction validation rules: +### Additional semantic transaction validation rules: - The output must be unlocked with an [Alias Unlock](#alias-unlock-semantic-validation). - The next state of the UTXO state machine must have the same Immutable Alias Address Unlock Condition defined. @@ -982,9 +986,9 @@ state as metadata into the UTXO ledger. -### Additional Transaction Syntactic Validation Rules +## Additional Transaction Syntactic Validation Rules -#### Output Syntactic Validation +### Output Syntactic Validation - `Amount` field must fulfill the dust protection requirements and must not be `0`. - `Amount` field must be ≤ `Max IOTA Supply`. @@ -1015,7 +1019,7 @@ state as metadata into the UTXO ledger. - `Address` of State Controller Address Unlock Condition and `Address` of Governor Address Unlock Condition must be different from the alias address derived from `Alias ID`. -### Additional Transaction Semantic Validation Rules +## Additional Transaction Semantic Validation Rules - Explicit `Alias ID`: `Alias ID` is taken as the value of the `Alias ID` field in the alias output. - Implicit `Alias ID`: When an alias output is consumed as an input in a transaction and `Alias ID` field is zeroed out @@ -1024,7 +1028,7 @@ state as metadata into the UTXO ledger. - For every non-zero explicit `Alias ID` on the output side there must be a corresponding alias on the input side. The corresponding alias has the explicit or implicit `Alias ID` equal to that of the alias on the output side. -#### Consumed Outputs +### Consumed Outputs Whenever an alias output is consumed in a transaction, it means that the alias is transitioned into its next state. The **current state** is defined as the **consumed alias output**, while the **next state** is defined as the **alias @@ -1064,7 +1068,7 @@ and `governance transition`. - When a consumed alias output has Features defined in `Immutable Features` and a corresponding alias output on the output side, `Immutable Features` is not allowed to change. -#### Created Outputs +### Created Outputs - When Issuer Feature is present in an output and explicit `Alias ID` is zeroed out, an input with `Address` field that corresponds to `Issuer` must be unlocked in the transaction. @@ -1080,7 +1084,7 @@ and `governance transition`. ## Unlocking Chain Script Locked Outputs -TODO: Adapt to remove NFT references and move those to the UTXO TIP. +TODO: Adapt to remove NFT references and move those to the NFT TIP. Two of the introduced output types ([Alias](#alias-output), [NFT](#nft-output)) implement the so-called UTXO chain constraint. These outputs receive their unique identifiers upon creation, generated by the protocol, and carry it From cfe2f9f9053ce5b9293ef4f510a6b6bfcdd71ec0 Mon Sep 17 00:00:00 2001 From: Philipp Gackstatter Date: Mon, 8 May 2023 07:51:34 +0200 Subject: [PATCH 004/140] Add Manalock UC & define soulbound Mana --- tips/TIP-0042/tip-0042.md | 59 ++++++++++++++++++++++++++++++++++++++- 1 file changed, 58 insertions(+), 1 deletion(-) diff --git a/tips/TIP-0042/tip-0042.md b/tips/TIP-0042/tip-0042.md index d3d6de316..81fd6947d 100644 --- a/tips/TIP-0042/tip-0042.md +++ b/tips/TIP-0042/tip-0042.md @@ -20,6 +20,7 @@ requires: TIP-19, TIP-20, TIP-21 and TIP-22 - [State Controller Address Unlock Condition](#state-controller-address-unlock-condition) - [Governor Address Unlock Condition](#governor-address-unlock-condition) - [Immutable Alias Address Unlock Condition](#immutable-alias-address-unlock-condition) + - [Manalock Unlock Condition](#manalock-unlock-condition) - [Account Locking & Unlocking](#account-locking--unlocking) 5. [Features](#features) 6. [Account Output](#account-output) @@ -316,6 +317,56 @@ however there are additional transition constraints: the next state of the UTXO - The output must be unlocked with an [Alias Unlock](#alias-unlock-semantic-validation). - The next state of the UTXO state machine must have the same Immutable Alias Address Unlock Condition defined. +## Manalock Unlock Condition + +Slot indices in the Tangle are introduced via slot commitments. Each such commitment carries an index. The slot index of the committing slot commitment provides the current slot index as an input parameter to transaction validation. (TODO: Verify). + +An output that contains a Manalock Unlock Condition can not be unlocked before the specified lock has +expired. The lock is expired when the slot index of the slot committment in which the transaction is included is equal or past the slot index defined in the Manalock Unlock Condition. + +### Additional syntactic transaction validation rules: + +- `Slot Index` field of a Manalock Unlock Condition must be > `0`. + +### Additional semantic transaction validation rules: + +- An output that has a Manalock Unlock Condition specified can only be created in a transaction if it also contains an Address Unlock Condition with an `Account Address`. +- An output that has a Manalock Unlock Condition specified must only be consumed and unlocked in a + transaction, if both of the following conditions hold: + - the slot index of the committing slot is equal or past the `Slot Index` specified in the unlock + condition. + - the specified `Account Address` of the Address Unlock Condition has a non-negative BIC balance. + +
+ Manalock Unlock Condition +
+ Defines a slot index until which the output can not be unlocked. +
+
+ + + + + + + + + + + + + + + + + +
NameTypeDescription
Unlock Condition Typeuint8 + Set to value X to denote a Manalock Unlock Condition. +
Slot Indexuint64 + Slot index starting from which the output can be consumed. +
+ + ### Account Locking & Unlocking A transaction may consume a (non-alias) output that belongs to an Alias Address by state transitioning the alias output with the matching `Alias ID`. This serves the exact same purpose as providing a signature @@ -384,11 +435,17 @@ always need to be one *Alias Unlock* referencing a greater index. ## Block Issuer Feature -The presence of a Block Issuer Feature on an account signals that this account is an issuer account. Such accounts can issue blocks. This feature defines the public keys with which a signature to burn BIC from the containing account can be verified. It allows for unbonding the issuer deposit from an account. Any mana generated or stored by an issuer account is locked to that account. +The presence of a Block Issuer Feature on an account signals that this account is an issuer account, that is, accounts that can issue blocks. This feature defines the public keys with which a signature to burn BIC from the containing account can be verified. It allows for unbonding the issuer deposit from an account. Any mana generated or stored by an issuer account is locked to that account. ### Additional semantic transaction validation rule: - When a Block Issuer Feature is present in an account output, the transaction that contains this output is valid, if and only if: - `Amount` >= `Issuer Deposit`, which implies that the `Amount` must be at least the issuer deposit or the required storage deposit, whichever is higher. + - The following condition for Mana in the transaction holds for the account containing the feature: `AccountIn_potential + AccountIn_stored = AccountOut_allotted + AccountOut_stored + AccountOut_locked`, where + - `AccountIn_potential` is the decayed potential Mana generated by the `Amount` of the account input. + - `AccountIn_stored` is the decayed stored Mana of the account input. + - `AccountOut_allotted` is the amount of Mana allotted to the account. + - `AccountOut_stored` is the amount of Mana stored in the account. + - `AccountOut_locked` is the amount of Mana locked into outputs with a Manalock Unlock Condition and an Address Unlock Condition with the `Account Address` variant containing the input account's address. - When a Block Issuer Feature is present in an account input containing `Issuer Deposit Unbond` = `0` or in an account output representing the initial state of its UTXO state machine, the transaction that contains the account output is valid, if either of the following conditions for the account output hold: - `Issuer Deposit Unbond` = `0`. - `Issuer Deposit Unbond` >= `Slot Index + MCA`, where the `Slot Index` is the slot index of the slot commitment in which this transaction is included and `MCA` is the maximum committable age (TODO: Define or link to definition) From cf316d6b0ca56292b01d911bb5087aeaef63ffa6 Mon Sep 17 00:00:00 2001 From: Philipp Gackstatter Date: Thu, 11 May 2023 09:01:56 +0200 Subject: [PATCH 005/140] Use public keys as block issuer keys --- tips/TIP-0042/tip-0042.md | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/tips/TIP-0042/tip-0042.md b/tips/TIP-0042/tip-0042.md index 81fd6947d..4efe15326 100644 --- a/tips/TIP-0042/tip-0042.md +++ b/tips/TIP-0042/tip-0042.md @@ -463,8 +463,6 @@ The presence of a Block Issuer Feature on an account signals that this ac -TODO: Decide on using either addresses or actual keys as the block issuer keys. - @@ -482,7 +480,7 @@ TODO: Decide on using either addresses or actual keys as the block issuer keys. @@ -435,27 +435,36 @@ always need to be one *Alias Unlock* referencing a greater index. ## Block Issuer Feature -The presence of a Block Issuer Feature on an account signals that this account is an issuer account, that is, accounts that can issue blocks. This feature defines the public keys with which a signature to burn BIC from the containing account can be verified. It allows for unbonding the issuer deposit from an account. Any mana generated or stored by an issuer account is locked to that account. +The presence of a Block Issuer Feature on an account signals that this account can issue blocks - it is an _issuer account_. This feature defines the public keys with which a signature to burn BIC from the containing account can be verified. The feature is locked to the account to disincentivize malicious behavior when issuing blocks. The feature can be unlocked with an expiration mechanism. Any mana generated or stored by an issuer account is locked to that account. ### Additional semantic transaction validation rule: +- When a Block Issuer Feature is present in an account output and it was not present in the account input, or the account output represents the initial state of its UTXO state machine, the transaction that contains the account output is valid, if the following condition holds: + - `Expiry Slot >= Transaction Slot Index + MCA`, where `Transaction Slot Index` is the index of the slot to which the transaction belongs. - When a Block Issuer Feature is present in an account output, the transaction that contains this output is valid, if and only if: - - `Amount` >= `Issuer Deposit`, which implies that the `Amount` must be at least the issuer deposit or the required storage deposit, whichever is higher. - The following condition for Mana in the transaction holds for the account containing the feature: `AccountIn_potential + AccountIn_stored = AccountOut_allotted + AccountOut_stored + AccountOut_locked`, where - `AccountIn_potential` is the decayed potential Mana generated by the `Amount` of the account input. - `AccountIn_stored` is the decayed stored Mana of the account input. - `AccountOut_allotted` is the amount of Mana allotted to the account. - `AccountOut_stored` is the amount of Mana stored in the account. - - `AccountOut_locked` is the amount of Mana locked into outputs with a Manalock Unlock Condition and an Address Unlock Condition with the `Account Address` variant containing the input account's address. -- When a Block Issuer Feature is present in an account input containing `Issuer Deposit Unbond` = `0` or in an account output representing the initial state of its UTXO state machine, the transaction that contains the account output is valid, if either of the following conditions for the account output hold: - - `Issuer Deposit Unbond` = `0`. - - `Issuer Deposit Unbond` >= `Slot Index + MCA`, where the `Slot Index` is the slot index of the slot commitment in which this transaction is included and `MCA` is the maximum committable age (TODO: Define or link to definition) -- When a Block Issuer Feature is present in an account input with `Issuer Deposit Unbond` != `0`, the transaction that contains the corresponding account output is valid, if either of the following conditions hold: - - The value of `Issuer Deposit Unbond` on the account output matches the value of `Issuer Deposit Unbond` on the account input. + - `AccountOut_locked` is the amount of Mana locked into outputs for which each output satisfies all of the following conditions: + - The output has a Manalock Unlock Condition containing a `Slot Index >= Transaction Slot Index + MCA`. + - The output has an Address Unlock Condition with the `Account Address` variant containing the input account's address. +- When a Block Issuer Feature is present in an account input containing `Expiry Slot >= Transaction Slot Index` the transaction that contains the account output is valid, if all of the following conditions for the account output hold: + - The account is not destroyed on the output side and retains its Block Issuer Feature. + - If either of the following conditions hold: + - The value of `Expiry Slot` on the account output matches the value of `Expiry Slot` on the account input. + - `Expiry Slot >= Transaction Slot Index + MCA` +- When a Block Issuer Feature is present in an account input with `Expiry Slot < Transaction Slot Index`, the transaction that contains the corresponding account output is valid, if either of the following conditions hold: + - `Expiry Slot >= Transaction Slot Index + MCA` - If all of the following conditions hold: - - `Slot Index` >= `Issuer Deposit Unbond`, where the `Slot Index` is the slot index of the slot commitment in which this transaction is included. - The BIC balance of the containing account is non-negative. - The Block Issuer Feature is removed in the account output. + +
Block Issuer Feature
@@ -473,7 +482,7 @@ The presence of a Block Issuer Feature on an account signals that this ac
@@ -488,7 +497,7 @@ The presence of a Block Issuer Feature on an account signals that this ac - + - + @@ -1045,6 +1054,8 @@ state as metadata into the UTXO ledger. ### Output Syntactic Validation +TODO: Add Block Issuer Feature rules. + - `Amount` field must fulfill the dust protection requirements and must not be `0`. - `Amount` field must be ≤ `Max IOTA Supply`. - `Native Tokens Count` must not be greater than `Max Native Tokens Count`. From 451eca9c2638fee237b0f9a4ee45ec40b601eef4 Mon Sep 17 00:00:00 2001 From: Philipp Gackstatter Date: Mon, 8 May 2023 07:57:17 +0200 Subject: [PATCH 007/140] Rename `Alias` -> `Account` --- tips/TIP-0042/tip-0042.md | 210 +++++++++++++++++++------------------- 1 file changed, 105 insertions(+), 105 deletions(-) diff --git a/tips/TIP-0042/tip-0042.md b/tips/TIP-0042/tip-0042.md index d9f6ce028..37e93e5ae 100644 --- a/tips/TIP-0042/tip-0042.md +++ b/tips/TIP-0042/tip-0042.md @@ -19,7 +19,7 @@ requires: TIP-19, TIP-20, TIP-21 and TIP-22 4. [Unlock Conditions](#unlock-conditions) - [State Controller Address Unlock Condition](#state-controller-address-unlock-condition) - [Governor Address Unlock Condition](#governor-address-unlock-condition) - - [Immutable Alias Address Unlock Condition](#immutable-alias-address-unlock-condition) + - [Immutable Account Address Unlock Condition](#immutable-account-address-unlock-condition) - [Manalock Unlock Condition](#manalock-unlock-condition) - [Account Locking & Unlocking](#account-locking--unlocking) 5. [Features](#features) @@ -54,15 +54,15 @@ supported for each output type. ## State Controller Address Unlock Condition -An unlock condition defined solely for Alias Output. It is functionally equivalent to an -Address Unlock Condition, however there are additional transition constraints defined for the Alias UTXO state +An unlock condition defined solely for Account Output. It is functionally equivalent to an +Address Unlock Condition, however there are additional transition constraints defined for the Account UTXO state machine that can only be carried out by the `State Controller Address`, hence the distinct unlock condition type.
State Controller Address Unlock
Defines the State Controller Address that owns this output, that is, it can unlock it with the proper Unlock in a - transaction that state transitions the alias output. + transaction that state transitions the account output.
@@ -105,7 +105,7 @@ machine that can only be carried out by the `State Controller Address`, hence th
NameBlock Issuer Keys anyOf
- Ed25519 Address + Ed25519 Public Key @@ -493,13 +491,13 @@ TODO: Decide on using either addresses or actual keys as the block issuer keys. - + - +
NameAddress Type uint8 - Set to value 0 to denote an Ed25519 Address. + Set to value 0 to denote an Ed25519 Public Key.
PubKeyHashPublic Key ByteArray[32]The raw bytes of the Ed25519 address which is a BLAKE2b-256 hash of the Ed25519 public key.The raw bytes of the Ed25519 public key.
From 234facff59626b206c6865a933f3bd1e38e6d365 Mon Sep 17 00:00:00 2001 From: Philipp Gackstatter Date: Thu, 11 May 2023 11:16:11 +0200 Subject: [PATCH 006/140] Update Block Issuer Feature TX valid. rules --- tips/TIP-0042/tip-0042.md | 43 ++++++++++++++++++++++++--------------- 1 file changed, 27 insertions(+), 16 deletions(-) diff --git a/tips/TIP-0042/tip-0042.md b/tips/TIP-0042/tip-0042.md index 4efe15326..d9f6ce028 100644 --- a/tips/TIP-0042/tip-0042.md +++ b/tips/TIP-0042/tip-0042.md @@ -319,10 +319,10 @@ however there are additional transition constraints: the next state of the UTXO ## Manalock Unlock Condition -Slot indices in the Tangle are introduced via slot commitments. Each such commitment carries an index. The slot index of the committing slot commitment provides the current slot index as an input parameter to transaction validation. (TODO: Verify). +Slot indices in the Tangle are introduced via slot commitments. Each such commitment carries an index. The slot index of a transaction can be calculated based on its timestamp. TODO: Link to final location of formula currently defined in https://github.com/iotaledger/iota-core/blob/develop/documentation/APIs/core-models.md#slot-index. An output that contains a Manalock Unlock Condition can not be unlocked before the specified lock has -expired. The lock is expired when the slot index of the slot committment in which the transaction is included is equal or past the slot index defined in the Manalock Unlock Condition. +expired. The lock is expired when the index of the slot in which the transaction belongs to is equal or past the slot index defined in the Manalock Unlock Condition. ### Additional syntactic transaction validation rules: @@ -335,7 +335,7 @@ expired. The lock is expired when the slot index of the slot committment in whic transaction, if both of the following conditions hold: - the slot index of the committing slot is equal or past the `Slot Index` specified in the unlock condition. - - the specified `Account Address` of the Address Unlock Condition has a non-negative BIC balance. + - the specified `Account Address` of the Address Unlock Condition has a non-negative BIC balance at `Transaction Slot Index - MCA` where `Transaction Slot Index` is the index of the slot to which the transaction belongs.
Manalock Unlock Condition @@ -354,7 +354,7 @@ expired. The lock is expired when the slot index of the slot committment in whic
Unlock Condition Type uint8 - Set to value X to denote a Manalock Unlock Condition. + Set to value 7 to denote a Manalock Unlock Condition.
Feature Type uint8 - Set to value X to denote a Block Issuer Feature. + Set to value 4 to denote a Block Issuer Feature.
Description
Address TypePublic Key Type uint8 Set to value 0 to denote an Ed25519 Public Key. @@ -504,7 +513,7 @@ The presence of a Block Issuer Feature on an account signals that this ac
Issuer Deposit UnbondExpiry Slot uint64 The slot index at which the issuer deposit can be unlocked.
- Alias Address + Account Address @@ -116,13 +116,13 @@ machine that can only be carried out by the `State Controller Address`, hence th - + - +
NameAddress Type uint8 - Set to value 8 to denote an Alias Address. + Set to value 8 to denote an Account Address.
Alias IDAccount ID ByteArray[32]The raw bytes of the Alias ID which is the BLAKE2b-256 hash of the outputID that created it.The raw bytes of the Account ID which is the BLAKE2b-256 hash of the outputID that created it.
@@ -152,19 +152,19 @@ machine that can only be carried out by the `State Controller Address`, hence th -The additional constraints are defined in [Alias Output Design](#alias-output) section. +The additional constraints are defined in [Account Output Design](#account-output) section. ## Governor Address Unlock Condition -An unlock condition defined solely for Alias Output. It is functionally equivalent to an -Address Unlock Condition, however there are additional transition constraints defined for the Alias UTXO state +An unlock condition defined solely for Account Output. It is functionally equivalent to an +Address Unlock Condition, however there are additional transition constraints defined for the Account UTXO state machine that can only be carried out by the `Governor Address`, hence the distinct unlock condition type.
Governor Address Unlock
Defines the Governor Address that owns this output, that is, it can unlock it with the proper Unlock in a - transaction that governance transitions the alias output. + transaction that governance transitions the account output.
@@ -207,7 +207,7 @@ machine that can only be carried out by the `Governor Address`, hence the distin
- Alias Address + Account Address @@ -218,13 +218,13 @@ machine that can only be carried out by the `Governor Address`, hence the distin - + - +
NameAddress Type uint8 - Set to value 8 to denote an Alias Address. + Set to value 8 to denote an Account Address.
Alias IDAccount ID ByteArray[32]The raw bytes of the Alias ID which is the BLAKE2b-256 hash of the outputID that created it.The raw bytes of the Account ID which is the BLAKE2b-256 hash of the outputID that created it.
@@ -254,20 +254,20 @@ machine that can only be carried out by the `Governor Address`, hence the distin -The additional constraints are defined in [Alias Output Design](#alias-output) section. +The additional constraints are defined in [Account Output Design](#account-output) section. -## Immutable Alias Address Unlock Condition +## Immutable Account Address Unlock Condition -An unlock condition defined for chain constrained UTXOs that can only be unlocked by a permanent Alias Address. +An unlock condition defined for chain constrained UTXOs that can only be unlocked by a permanent Account Address. -Output unlocking is functionally equivalent to an Address Unlock Condition with an Alias Address, +Output unlocking is functionally equivalent to an Address Unlock Condition with an Account Address, however there are additional transition constraints: the next state of the UTXO machine must have the same -Immutable Alias Address Unlock Condition. +Immutable Account Address Unlock Condition.
- Immutable Alias Address Unlock Condition + Immutable Account Address Unlock Condition
- Defines the permanent Alias Address that owns this output. + Defines the permanent Account Address that owns this output.
@@ -281,14 +281,14 @@ however there are additional transition constraints: the next state of the UTXO Unlock Condition Type uint8 - Set to value 6 to denote an Immutable Alias Address Unlock Condition. + Set to value 6 to denote an Immutable Account Address Unlock Condition. Address
- Alias Address + Account Address @@ -299,13 +299,13 @@ however there are additional transition constraints: the next state of the UTXO - + - +
NameAddress Type uint8 - Set to value 8 to denote an Alias Address. + Set to value 8 to denote an Account Address.
Alias IDAccount ID ByteArray[32]The raw bytes of the Alias ID which is the BLAKE2b-256 hash of the outputID that created it.The raw bytes of the Account ID which is the BLAKE2b-256 hash of the outputID that created it.
@@ -314,8 +314,8 @@ however there are additional transition constraints: the next state of the UTXO ### Additional semantic transaction validation rules: - - The output must be unlocked with an [Alias Unlock](#alias-unlock-semantic-validation). - - The next state of the UTXO state machine must have the same Immutable Alias Address Unlock Condition defined. + - The output must be unlocked with an [Account Unlock](#account-unlock-semantic-validation). + - The next state of the UTXO state machine must have the same Immutable Account Address Unlock Condition defined. ## Manalock Unlock Condition @@ -369,15 +369,15 @@ expired. The lock is expired when the index of the slot in which the transaction ### Account Locking & Unlocking -A transaction may consume a (non-alias) output that belongs to an Alias Address by state transitioning the alias output with the matching `Alias ID`. This serves the exact same purpose as providing a signature +A transaction may consume a (non-account) output that belongs to an Account Address by state transitioning the account output with the matching `Account ID`. This serves the exact same purpose as providing a signature to unlock an output locked under a private key backed address, such as Ed25519 Addresses. -On protocol level, alias unlocking is done using a new unlock type, called **Alias Unlock**. +On protocol level, account unlocking is done using a new unlock type, called **Account Unlock**.
- Alias Unlock + Account Unlock
- Points to the unlock of a consumed alias output. + Points to the unlock of a consumed account output.
@@ -391,45 +391,45 @@ On protocol level, alias unlocking is done using a new unlock type, called **Ali Unlock Type uint8 - Set to value 2 to denote a Alias Unlock. + Set to value 2 to denote a Account Unlock. - Alias Reference Unlock Index + Account Reference Unlock Index uint16 - Index of input and unlock corresponding to an alias output. + Index of input and unlock corresponding to an account output. This unlock is similar to the Reference Unlock. However, it is valid if and only if the input of the -transaction at index `Alias Reference Unlock Index` is an alias output with the same `Alias ID` as the one derived from +transaction at index `Account Reference Unlock Index` is an account output with the same `Account ID` as the one derived from the `Address` field of the to-be unlocked output. -Additionally, the Alias Unlocks must also be ordered to prevent circular dependencies: +Additionally, the Account Unlocks must also be ordered to prevent circular dependencies: -If the i-th *Unlock* of a transaction is an *Alias Unlock* and has `Alias Reference Unlock Index` set to k, -it must hold that i > k. Hence, an Alias Unlock can only reference an *Unlock* (unlocking the -corresponding alias) at a smaller index. +If the i-th *Unlock* of a transaction is an *Account Unlock* and has `Account Reference Unlock Index` set to k, +it must hold that i > k. Hence, an Account Unlock can only reference an *Unlock* (unlocking the +corresponding account) at a smaller index. -For example the scenario where `Alias A` is locked to the address of `Alias B` while `Alias B` is in locked to the -address of `Alias A` introduces a circular dependency and is not well-defined. By requiring the *Unlocks* to be -ordered as described above, a transaction consuming `Alias A` as well as `Alias B` can never be valid as there would -always need to be one *Alias Unlock* referencing a greater index. +For example the scenario where `Account A` is locked to the address of `Account B` while `Account B` is in locked to the +address of `Account A` introduces a circular dependency and is not well-defined. By requiring the *Unlocks* to be +ordered as described above, a transaction consuming `Account A` as well as `Account B` can never be valid as there would +always need to be one *Account Unlock* referencing a greater index. -#### Alias Unlock Syntactic Validation +#### Account Unlock Syntactic Validation - - It must hold that 0 ≤ `Alias Reference Unlock Index` < `Max Inputs Count`. + - It must hold that 0 ≤ `Account Reference Unlock Index` < `Max Inputs Count`. -#### Alias Unlock Semantic Validation +#### Account Unlock Semantic Validation - - The address of the unlocking condition of the input being unlocked must be an Alias Address. - - The index `i` of the Alias Unlock is the index of the input in the transaction that it unlocks. - `Alias Reference Unlock Index` must be < `i`. - - `Alias Reference Unlock Index` defines a previous input of the transaction and its unlock. This input must - be an Alias Output with `Alias ID` that refers to the Alias Address being unlocked. - - The referenced Alias Output must be unlocked for state transition. + - The address of the unlocking condition of the input being unlocked must be an Account Address. + - The index `i` of the Account Unlock is the index of the input in the transaction that it unlocks. + `Account Reference Unlock Index` must be < `i`. + - `Account Reference Unlock Index` defines a previous input of the transaction and its unlock. This input must + be an Account Output with `Account ID` that refers to the Account Address being unlocked. + - The referenced Account Output must be unlocked for state transition. # Features @@ -521,20 +521,20 @@ The presence of a Block Issuer Feature on an account signals that this ac # Account Output -The Alias Output is a specific implementation of a UTXO state machine. `Alias ID`, the unique identifier of an +The Account Output is a specific implementation of a UTXO state machine. `Account ID`, the unique identifier of an instance of the deployed state machine, is generated deterministically by the protocol and is not allowed to change in any future state transitions. -Alias Output represents an alias account in the ledger with two control levels and a permanent -Alias Address. The account owns other outputs that are locked under Alias Address. The account keeps +Account Output represents an account in the ledger with two control levels and a permanent +Account Address. The account owns other outputs that are locked under Account Address. The account keeps track of state transitions (`State Index` counter), controlled foundries (`Foundry Counter`) and anchors the layer 2 state as metadata into the UTXO ledger.
- Alias Output + Account Output
- Describes an alias account in the ledger that can be controlled by the state and governance controllers. + Describes an account in the ledger that can be controlled by the state and governance controllers.
@@ -546,7 +546,7 @@ state as metadata into the UTXO ledger. @@ -589,14 +589,14 @@ state as metadata into the UTXO ledger. - + - + - + @@ -606,7 +606,7 @@ state as metadata into the UTXO ledger. - + @@ -657,7 +657,7 @@ state as metadata into the UTXO ledger.
Output Type uint8 - Set to value 4 to denote a Alias Output. + Set to value 4 to denote a Account Output.
Alias IDAccount ID ByteArray[32]Unique identifier of the alias, which is the BLAKE2b-256 hash of the Output ID that created it. Alias Address = Alias Address Type || Alias IDUnique identifier of the account, which is the BLAKE2b-256 hash of the Output ID that created it. Account Address = Account Address Type || Account ID
State Index uint32A counter that must increase by 1 every time the alias is state transitioned.A counter that must increase by 1 every time the account is state transitioned.
State Metadata
Foundry Counter uint32A counter that denotes the number of foundries created by this alias account.A counter that denotes the number of foundries created by this account.
Unlock Conditions Count
- Alias Address + Account Address @@ -668,13 +668,13 @@ state as metadata into the UTXO ledger. - + - +
NameAddress Type uint8 - Set to value 8 to denote an Alias Address. + Set to value 8 to denote an Account Address.
Alias IDAccount ID ByteArray[32]The raw bytes of the Alias ID which is the BLAKE2b-256 hash of the outputID that created it.The raw bytes of the Account ID which is the BLAKE2b-256 hash of the outputID that created it.
@@ -745,7 +745,7 @@ state as metadata into the UTXO ledger.
- Alias Address + Account Address @@ -756,13 +756,13 @@ state as metadata into the UTXO ledger. - + - +
NameAddress Type uint8 - Set to value 8 to denote an Alias Address. + Set to value 8 to denote an Account Address.
Alias IDAccount ID ByteArray[32]The raw bytes of the Alias ID which is the BLAKE2b-256 hash of the outputID that created it.The raw bytes of the Account ID which is the BLAKE2b-256 hash of the outputID that created it.
@@ -846,7 +846,7 @@ state as metadata into the UTXO ledger.
- Alias Address + Account Address @@ -857,13 +857,13 @@ state as metadata into the UTXO ledger. - + - +
NameAddress Type uint8 - Set to value 8 to denote an Alias Address. + Set to value 8 to denote an Account Address.
Alias IDAccount ID ByteArray[32]The raw bytes of the Alias ID which is the BLAKE2b-256 hash of the outputID that created it.The raw bytes of the Account ID which is the BLAKE2b-256 hash of the outputID that created it.
@@ -972,7 +972,7 @@ state as metadata into the UTXO ledger.
- Alias Address + Account Address @@ -983,13 +983,13 @@ state as metadata into the UTXO ledger. - + - +
NameAddress Type uint8 - Set to value 8 to denote an Alias Address. + Set to value 8 to denote an Account Address.
Alias IDAccount ID ByteArray[32]The raw bytes of the Alias ID which is the BLAKE2b-256 hash of the outputID that created it.The raw bytes of the Account ID which is the BLAKE2b-256 hash of the outputID that created it.
@@ -1080,25 +1080,25 @@ TODO: Add Block Issuer Feature rules. - Features must be sorted in ascending order based on their `Feature Type` both in `Features` and `Immutable Features` fields. - Syntactic validation of all present features must pass. -- When `Alias ID` is zeroed out, `State Index` and `Foundry Counter` must be `0`. +- When `Account ID` is zeroed out, `State Index` and `Foundry Counter` must be `0`. - `length(State Metadata)` must not be greater than `Max Metadata Length`. - `Address` of State Controller Address Unlock Condition and `Address` of - Governor Address Unlock Condition must be different from the alias address derived from `Alias ID`. + Governor Address Unlock Condition must be different from the account address derived from `Account ID`. ## Additional Transaction Semantic Validation Rules -- Explicit `Alias ID`: `Alias ID` is taken as the value of the `Alias ID` field in the alias output. -- Implicit `Alias ID`: When an alias output is consumed as an input in a transaction and `Alias ID` field is zeroed out +- Explicit `Account ID`: `Account ID` is taken as the value of the `Account ID` field in the account output. +- Implicit `Account ID`: When an account output is consumed as an input in a transaction and `Account ID` field is zeroed out while `State Index` and `Foundry Counter` are zero, take the BLAKE2b-256 hash of the `Output ID` of the input as - `Alias ID`. -- For every non-zero explicit `Alias ID` on the output side there must be a corresponding alias on the input side. The - corresponding alias has the explicit or implicit `Alias ID` equal to that of the alias on the output side. + `Account ID`. +- For every non-zero explicit `Account ID` on the output side there must be a corresponding account on the input side. The + corresponding account has the explicit or implicit `Account ID` equal to that of the account on the output side. ### Consumed Outputs -Whenever an alias output is consumed in a transaction, it means that the alias is transitioned into its next state. The -**current state** is defined as the **consumed alias output**, while the **next state** is defined as the **alias -output with the same explicit `AliasID` on the output side**. There are two types of transitions: `state transition` +Whenever an account output is consumed in a transaction, it means that the account is transitioned into its next state. The +**current state** is defined as the **consumed account output**, while the **next state** is defined as the **account +output with the same explicit `AccountID` on the output side**. There are two types of transitions: `state transition` and `governance transition`. - State transition: - A state transition is identified by an incremented `State Index`. @@ -1112,16 +1112,16 @@ and `governance transition`. - `Foundry Counter` and - `Sender Feature` in `Features`. - `Foundry Counter` field must increase by the number of foundry outputs created in the transaction that map to - `Alias ID`. The `Serial Number` fields of the created foundries must be the set of natural numbers that cover the - open-ended interval between the previous and next values of the `Foundry Counter` field in the alias output. + `Account ID`. The `Serial Number` fields of the created foundries must be the set of natural numbers that cover the + open-ended interval between the previous and next values of the `Foundry Counter` field in the account output. - The created foundry outputs must be sorted in the list of outputs by their `Serial Number`. Note, that any - foundry that maps to `Alias ID` and has a `Serial Number` that is less or equal to the `Foundry Counter` of the - input alias is ignored when it comes to sorting. - - Newly created foundries in the transaction that map to different aliases can be interleaved when it comes to + foundry that maps to `Account ID` and has a `Serial Number` that is less or equal to the `Foundry Counter` of the + input account is ignored when it comes to sorting. + - Newly created foundries in the transaction that map to different accounts can be interleaved when it comes to sorting. - Governance transition: - - A governance transition is identified by an unchanged `State Index` in next state. If there is no alias output on - the output side with a corresponding explicit `Alias ID`, the alias is being destroyed. The next state is the + - A governance transition is identified by an unchanged `State Index` in next state. If there is no account output on + the output side with a corresponding explicit `Account ID`, the account is being destroyed. The next state is the empty state. - The unlock must correspond to the `Address` of Governor Address Unlock Condition. - Governance transition must only change the following fields: @@ -1131,30 +1131,30 @@ and `governance transition`. - The `Metadata Feature` is optional, the governor can put additional info about the chain here, for example chain name, fee structure, supported VMs, list of access nodes, etc., anything that helps clients to fetch info (i.e. account balances) about the layer 2 network. -- When a consumed alias output has Features defined in `Immutable Features` and a corresponding alias output on the +- When a consumed account output has Features defined in `Immutable Features` and a corresponding account output on the output side, `Immutable Features` is not allowed to change. ### Created Outputs -- When Issuer Feature is present in an output and explicit `Alias ID` is zeroed out, an input with `Address` field +- When Issuer Feature is present in an output and explicit `Account ID` is zeroed out, an input with `Address` field that corresponds to `Issuer` must be unlocked in the transaction. ### Notes - Governor Address Unlock Condition field is made mandatory for now to help formal verification. When the same entity is defined for state and governance controllers, the output is self governed. Later, for compression reasons, - it is possible to make the governance controller optional and define a self-governed alias as one that does not have + it is possible to make the governance controller optional and define a self-governed account as one that does not have the governance Governor Address Unlock Condition set. -- Indexers and node plugins shall map the alias address of the output derived with `Alias ID` to the regular - address -> output mapping table, so that given an Alias Address, its most recent unspent alias output +- Indexers and node plugins shall map the account address of the output derived with `Account ID` to the regular + address -> output mapping table, so that given an Account Address, its most recent unspent account output can be retrieved. ## Unlocking Chain Script Locked Outputs TODO: Adapt to remove NFT references and move those to the NFT TIP. -Two of the introduced output types ([Alias](#alias-output), [NFT](#nft-output)) implement the so-called UTXO chain +Two of the introduced output types ([Account](#account-output), [NFT](#nft-output)) implement the so-called UTXO chain constraint. These outputs receive their unique identifiers upon creation, generated by the protocol, and carry it -forward with them through transactions until they are destroyed. These unique identifiers (`Alias ID`, `NFT ID`) also +forward with them through transactions until they are destroyed. These unique identifiers (`Account ID`, `NFT ID`) also function as global addresses for the state machines, but unlike Ed25519 Addresses, they are not backed by private keys that could be used for signing. The rightful owners who can unlock these addresses are defined in the outputs themselves. From 3dcc05e4ee2dd242f4f0d59334421ff21abc791e Mon Sep 17 00:00:00 2001 From: Philipp Gackstatter Date: Mon, 8 May 2023 08:49:03 +0200 Subject: [PATCH 008/140] Add Block Issuer Feature to acc. validation rules --- tips/TIP-0042/tip-0042.md | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/tips/TIP-0042/tip-0042.md b/tips/TIP-0042/tip-0042.md index 37e93e5ae..bab29efdf 100644 --- a/tips/TIP-0042/tip-0042.md +++ b/tips/TIP-0042/tip-0042.md @@ -918,6 +918,13 @@ state as metadata into the UTXO ledger. +
+ Block Issuer Feature +
+ Contains the public keys to verify block signatures and allows for unbonding the issuer deposit. +
+

TODO: Copy issuer feature definition.

+
@@ -1069,10 +1076,11 @@ TODO: Add Block Issuer Feature rules. - Governor Address Unlock Condition - Unlock Conditions must be sorted in ascending order based on their `Unlock Condition Type`. - Syntactic validation of all present unlock conditions must pass. -- It must hold true that `0` ≤ `Features Count` ≤ `2`. +- It must hold true that `0` ≤ `Features Count` ≤ `3`. - `Feature Type` of a Feature in `Features` must define one of the following types: - Sender Feature - Metadata Feature + - Block Issuer Feature - It must hold true that `0` ≤ `Immutable Features Count` ≤ `2`. - `Feature Type` of a Feature in `Immutable Features` must define on of the following types: - Issuer Feature From bceccbd3e84d22fe353cb8508630b93d4aae8e5e Mon Sep 17 00:00:00 2001 From: Philipp Gackstatter Date: Thu, 11 May 2023 11:23:17 +0200 Subject: [PATCH 009/140] Remove outdated commented rule --- tips/TIP-0042/tip-0042.md | 5 ----- 1 file changed, 5 deletions(-) diff --git a/tips/TIP-0042/tip-0042.md b/tips/TIP-0042/tip-0042.md index bab29efdf..d74485824 100644 --- a/tips/TIP-0042/tip-0042.md +++ b/tips/TIP-0042/tip-0042.md @@ -460,11 +460,6 @@ The presence of a Block Issuer Feature on an account signals that this ac - The BIC balance of the containing account is non-negative. - The Block Issuer Feature is removed in the account output. - -
Block Issuer Feature
From cef2fe88211e97c7171958a21991ac4b1ff82a5d Mon Sep 17 00:00:00 2001 From: Philipp Gackstatter Date: Fri, 12 May 2023 09:15:01 +0200 Subject: [PATCH 010/140] Update tips/TIP-0042/tip-0042.md Co-authored-by: Andrew Cullen <45826600+cyberphysic4l@users.noreply.github.com> --- tips/TIP-0042/tip-0042.md | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/tips/TIP-0042/tip-0042.md b/tips/TIP-0042/tip-0042.md index d74485824..0588f0adc 100644 --- a/tips/TIP-0042/tip-0042.md +++ b/tips/TIP-0042/tip-0042.md @@ -438,6 +438,7 @@ always need to be one *Account Unlock* referencing a greater index. The presence of a Block Issuer Feature on an account signals that this account can issue blocks - it is an _issuer account_. This feature defines the public keys with which a signature to burn BIC from the containing account can be verified. The feature is locked to the account to disincentivize malicious behavior when issuing blocks. The feature can be unlocked with an expiration mechanism. Any mana generated or stored by an issuer account is locked to that account. ### Additional semantic transaction validation rule: +- When a Block Issuer Feature is present in an account input, the transaction is invalid if that block issuer has negative BIC balance. - When a Block Issuer Feature is present in an account output and it was not present in the account input, or the account output represents the initial state of its UTXO state machine, the transaction that contains the account output is valid, if the following condition holds: - `Expiry Slot >= Transaction Slot Index + MCA`, where `Transaction Slot Index` is the index of the slot to which the transaction belongs. - When a Block Issuer Feature is present in an account output, the transaction that contains this output is valid, if and only if: @@ -456,9 +457,7 @@ The presence of a Block Issuer Feature on an account signals that this ac - `Expiry Slot >= Transaction Slot Index + MCA` - When a Block Issuer Feature is present in an account input with `Expiry Slot < Transaction Slot Index`, the transaction that contains the corresponding account output is valid, if either of the following conditions hold: - `Expiry Slot >= Transaction Slot Index + MCA` - - If all of the following conditions hold: - - The BIC balance of the containing account is non-negative. - - The Block Issuer Feature is removed in the account output. + - The Block Issuer Feature is removed in the account output.
Block Issuer Feature From 0a9c0b8a944d057041318842ca6ca5d53fd3266a Mon Sep 17 00:00:00 2001 From: Philipp Gackstatter Date: Fri, 12 May 2023 10:33:11 +0200 Subject: [PATCH 011/140] Remove `Manalock` to move it to TIP-38 --- tips/TIP-0042/tip-0042.md | 50 --------------------------------------- 1 file changed, 50 deletions(-) diff --git a/tips/TIP-0042/tip-0042.md b/tips/TIP-0042/tip-0042.md index 0588f0adc..f1fe10d9c 100644 --- a/tips/TIP-0042/tip-0042.md +++ b/tips/TIP-0042/tip-0042.md @@ -317,56 +317,6 @@ however there are additional transition constraints: the next state of the UTXO - The output must be unlocked with an [Account Unlock](#account-unlock-semantic-validation). - The next state of the UTXO state machine must have the same Immutable Account Address Unlock Condition defined. -## Manalock Unlock Condition - -Slot indices in the Tangle are introduced via slot commitments. Each such commitment carries an index. The slot index of a transaction can be calculated based on its timestamp. TODO: Link to final location of formula currently defined in https://github.com/iotaledger/iota-core/blob/develop/documentation/APIs/core-models.md#slot-index. - -An output that contains a Manalock Unlock Condition can not be unlocked before the specified lock has -expired. The lock is expired when the index of the slot in which the transaction belongs to is equal or past the slot index defined in the Manalock Unlock Condition. - -### Additional syntactic transaction validation rules: - -- `Slot Index` field of a Manalock Unlock Condition must be > `0`. - -### Additional semantic transaction validation rules: - -- An output that has a Manalock Unlock Condition specified can only be created in a transaction if it also contains an Address Unlock Condition with an `Account Address`. -- An output that has a Manalock Unlock Condition specified must only be consumed and unlocked in a - transaction, if both of the following conditions hold: - - the slot index of the committing slot is equal or past the `Slot Index` specified in the unlock - condition. - - the specified `Account Address` of the Address Unlock Condition has a non-negative BIC balance at `Transaction Slot Index - MCA` where `Transaction Slot Index` is the index of the slot to which the transaction belongs. - -
- Manalock Unlock Condition -
- Defines a slot index until which the output can not be unlocked. -
-
- - - - - - - - - - - - - - - - - -
NameTypeDescription
Unlock Condition Typeuint8 - Set to value 7 to denote a Manalock Unlock Condition. -
Slot Indexuint64 - Slot index starting from which the output can be consumed. -
- - ### Account Locking & Unlocking A transaction may consume a (non-account) output that belongs to an Account Address by state transitioning the account output with the matching `Account ID`. This serves the exact same purpose as providing a signature From 933747f2ef8a12d4e821a9425fd8a11f3c2fbd29 Mon Sep 17 00:00:00 2001 From: Philipp Gackstatter Date: Mon, 15 May 2023 09:22:46 +0200 Subject: [PATCH 012/140] Remove manalock unlock condition from ToC --- tips/TIP-0042/tip-0042.md | 1 - 1 file changed, 1 deletion(-) diff --git a/tips/TIP-0042/tip-0042.md b/tips/TIP-0042/tip-0042.md index f1fe10d9c..b97511f6f 100644 --- a/tips/TIP-0042/tip-0042.md +++ b/tips/TIP-0042/tip-0042.md @@ -20,7 +20,6 @@ requires: TIP-19, TIP-20, TIP-21 and TIP-22 - [State Controller Address Unlock Condition](#state-controller-address-unlock-condition) - [Governor Address Unlock Condition](#governor-address-unlock-condition) - [Immutable Account Address Unlock Condition](#immutable-account-address-unlock-condition) - - [Manalock Unlock Condition](#manalock-unlock-condition) - [Account Locking & Unlocking](#account-locking--unlocking) 5. [Features](#features) 6. [Account Output](#account-output) From 78c08445979b75d6cc2a8cf753468c16940221f4 Mon Sep 17 00:00:00 2001 From: Philipp Gackstatter Date: Mon, 15 May 2023 09:46:29 +0200 Subject: [PATCH 013/140] Remove chain constraint unlock description --- tips/TIP-0042/tip-0042.md | 15 --------------- 1 file changed, 15 deletions(-) diff --git a/tips/TIP-0042/tip-0042.md b/tips/TIP-0042/tip-0042.md index b97511f6f..664e12c86 100644 --- a/tips/TIP-0042/tip-0042.md +++ b/tips/TIP-0042/tip-0042.md @@ -1099,21 +1099,6 @@ and `governance transition`. address -> output mapping table, so that given an Account Address, its most recent unspent account output can be retrieved. -## Unlocking Chain Script Locked Outputs - -TODO: Adapt to remove NFT references and move those to the NFT TIP. - -Two of the introduced output types ([Account](#account-output), [NFT](#nft-output)) implement the so-called UTXO chain -constraint. These outputs receive their unique identifiers upon creation, generated by the protocol, and carry it -forward with them through transactions until they are destroyed. These unique identifiers (`Account ID`, `NFT ID`) also -function as global addresses for the state machines, but unlike Ed25519 Addresses, they are not backed by private -keys that could be used for signing. The rightful owners who can unlock these addresses are defined in the outputs -themselves. - -Since such addresses are accounts in the ledger, it is possible to send funds to these addresses. The unlock mechanism -of such funds is designed in a way that **proving ownership of the address is reduced to the ability to unlock the -corresponding output that defines the address.** - # Copyright Copyright and related rights waived via [CC0](https://creativecommons.org/publicdomain/zero/1.0/). From 4fa4f4f8aae4d884d6eae1640fa95cfdd18b3a5e Mon Sep 17 00:00:00 2001 From: Roman Overko Date: Wed, 17 May 2023 17:33:52 +0200 Subject: [PATCH 014/140] Added mana_amount, storage deposit calc --- ...iota_AccountOutput_(max_functionality).jpg | Bin 0 -> 52036 bytes ...iota_AccountOutput_(min_functionality).jpg | Bin 0 -> 51928 bytes tips/TIP-0042/tip-0042.md | 751 ++++++++++++++++++ 3 files changed, 751 insertions(+) create mode 100644 tips/TIP-0042/assets/deposit_miota_AccountOutput_(max_functionality).jpg create mode 100644 tips/TIP-0042/assets/deposit_miota_AccountOutput_(min_functionality).jpg diff --git a/tips/TIP-0042/assets/deposit_miota_AccountOutput_(max_functionality).jpg b/tips/TIP-0042/assets/deposit_miota_AccountOutput_(max_functionality).jpg new file mode 100644 index 0000000000000000000000000000000000000000..b16e1381fd13b40d72f68ddc9e31e8d97f82e8b2 GIT binary patch literal 52036 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
_&gT`4&-t4xdzjXR6IHbXQSo@UF zl#yGls?Mowmgo^ao~^L1Ag)?nkjloU_{CiYo-4at>GjU0I^*>n5rD;C%Hp5n_W#+* zEqWl!`4*6yA!-7Ce*uq z&6~*?)0M^yW*Ho$+egD^1h;>5xGCvf+E%;kqU*}t^A##zGoFzDUD@Z&DVR(&qo~y^ zMSdZ{?$pdcwKt9s5;7MbdI9g(@&uhn-7}KlD$JIpFQRP9;%4*_^hER2^i9d*P@}ty zI7hmo*6id+1H<*jdUIqGCPicC65^3bq5#on-^fL>=NkQkd|G!ja*mLnXb+^`%}53- zSVnIyFPZU|2`c7Z-_58CukeRbXuz6XOeZC+SQvEZgEPg|S%qDQ@V_zVbh~2~Zt<}8 z_E42}L8%YO6ddp(e>gxz$~MzO3F#g3Ih1GU(G&7s_*IoQ@X@AysQ1yMxBtve)1$gOm6#-kT&OqO3}U=nD3wi0M?n_Aq%WVUc3KQZBJoOp;Kvc zir=^7jbw5j&n(A335_nimGBWa4IfpCf?F(HO?N%X-o;cyJx#LFN!rVlWU-^GeYD4u z)H5u>dN82Y;+GUFMW)+~Gmkf_h1#6fUpQ`iEh2)65Sq>QM+6tMqp;{%x7HlSjLtLU z$(TfuLaMj0`@lXe6|5$_yP=0s?kwoqI|FCNL7p($@mQooB}K6!rJC(7dM9DoVeQ!lV$VEq zSJ8(D12wXXicscTj&r&cSceLkh7`fRnmh4;vxx2AT}vIb<=a=iQ0QoM6D_;!AI}xv z(>*v5E|vga*fXZKZ0#%$_2>5IXR<~N3eC~fh$z)7a}R!aqUtbrWnPH1lKHKEITX6o+Z(gCDcLb^M}uU2a*fKL+rn1@xxPMY`t0*`V>d z^Pzr9dlmxaMs=Y;l5}_Y<|HI3Xz%4H_2CP`?!A-{0=n*EBmIp0_~ozggjoG!&7xF* zsft-a#7H!F%}VisQ8_fc%A378L|Nqop#vG0SdV8$&gs2CZWBD_d6eDL^aHV1Tr*Gi z$$pXjvOJS?g7TE|agYJ`wP#=as;)c?n*dv#sISNkBzWDhC21x*yux~9?<92tNLj8M zxqa4)Z$&BZ{4Xp>e!9{0b>iTJN&PzvVp7058A9&)+JXUt(1~g7T}BEb#U$-_1mjyi$B*uU+-S z&NW(-rs8G8q^zE5d-{jgOX~)-ibMQmQr`*5j%bH>i`AXSPOmZwJg+!>91RvuBSG3b mO`U$vkf6&+Q_`^Zq*9EXfQJ=JfbrDs|0;Cp literal 0 HcmV?d00001 diff --git a/tips/TIP-0042/assets/deposit_miota_AccountOutput_(min_functionality).jpg b/tips/TIP-0042/assets/deposit_miota_AccountOutput_(min_functionality).jpg new file mode 100644 index 0000000000000000000000000000000000000000..3bf5ddcec1f9f671fb4b54d967c3eaacd84e8a7e GIT binary patch literal 51928 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 literal 0 HcmV?d00001 diff --git a/tips/TIP-0042/tip-0042.md b/tips/TIP-0042/tip-0042.md index 664e12c86..6a91e8be4 100644 --- a/tips/TIP-0042/tip-0042.md +++ b/tips/TIP-0042/tip-0042.md @@ -497,6 +497,11 @@ state as metadata into the UTXO ledger. uint64 The amount of IOTA coins held by the output. + + Mana Amount mana_amount + uint64 + The amount of (stored) Mana held by the output. + Native Tokens Count uint8 @@ -1008,6 +1013,7 @@ TODO: Add Block Issuer Feature rules. - `Amount` field must fulfill the dust protection requirements and must not be `0`. - `Amount` field must be ≤ `Max IOTA Supply`. +- Mana Amount `mana_amount` field must be ≥ `0` and ≤ `TOTAL_MANA`. - `Native Tokens Count` must not be greater than `Max Native Tokens Count`. - `Native Tokens` must be lexicographically sorted based on `Token ID`. - Each Native Token must be unique in the set of `Native Tokens` based on its `Token ID`. No duplicates are @@ -1090,6 +1096,751 @@ and `governance transition`. - When Issuer Feature is present in an output and explicit `Account ID` is zeroed out, an input with `Address` field that corresponds to `Issuer` must be unlocked in the transaction. +### Storage Deposit Calculation + +The following table shows the Account Output including the possible fields and their specific weight. + + +
+ Account Output +
+ Describes an account in the ledger that can be controlled by the state and governance controllers. +
+
+ + + + + + + + + + + + + + + + +
Offset + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FieldField typeLength MinimumLength MaximumDescription
OutputIDkey3434The ID of the output.
Block ID (included)data3232The ID of the block in which the transaction payload that created this output was included.
Confirmation Milestone Indexdata44The index of the milestone which confirmed the transaction that created the output.
Confirmation Unix Timestampdata44The unix timestamp of the milestone which confirmed the transaction that created the output.
+
Fields + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameField typeLength MinimumLength MaximumDescription
Output Typedata11 + Set to value 4 to denote a Account Output. +
Amountdata88The amount of IOTA coins held by the output.
Mana Amount mana_amountdata88The amount of (stored) Mana held by the output.
Native Tokens Countdata11The number of native tokens held by the output.
Native Tokens optAnyOf +
+ Native Token + + + + + + + + + + + + + + + + + + + + + + +
NameField typeLength MinimumLength MaximumDescription
Token IDdata3838 + Identifier of the native token. +
Amountdata3232 + Amount of native tokens of the given Token ID. +
+
+
Account IDdata3232Unique identifier of the account, which is the BLAKE2b-256 hash of the Output ID that created it. Account Address = Account Address Type || Account ID
State Indexdata44A counter that must increase by 1 every time the account is state transitioned.
State Metadata Lengthdata22Length of the following State Metadata field.
State Metadatadata08192Metadata that can only be changed by the state controller.
Foundry Counterdata44A counter that denotes the number of foundries created by this account.
Unlock Conditions Countdata11The number of unlock conditions following.
Unlock Conditions atMostOneOfEach +
+ State Controller Address Unlock Condition + + + + + + + + + + + + + + + + + + + +
NameField typeLength MinimumLength MaximumDescription
Unlock Condition Typedata11 + Set to value 4 to denote an State Controller Address Unlock Condition. +
Address +
+ Ed25519 Address + + + + + + + + + + + + + + + + + + + + + + +
NameField typeLength MinimumLength MaximumDescription
Address Typedata11 + Set to value 0 to denote an Ed25519 Address. +
PubKeyHashdata3232The raw bytes of the Ed25519 address which is a BLAKE2b-256 hash of the Ed25519 public key.
+
+
+ Account Address + + + + + + + + + + + + + + + + + + + + + + +
NameField typeLength MinimumLength MaximumDescription
Address Typedata11 + Set to value 8 to denote an Account Address. +
Account IDdata3232The raw bytes of the Account ID which is the BLAKE2b-256 hash of the outputID that created it.
+
+
+ NFT Address + + + + + + + + + + + + + + + + + + + + + + +
NameField typeLength MinimumLength MaximumDescription
Address Typedata11 + Set to value 16 to denote an NFT Address. +
NFT IDdata3232The raw bytes of the NFT ID which is the BLAKE2b-256 hash of the outputID that created it.
+
+
+
+
+ Governor Address Unlock Condition + + + + + + + + + + + + + + + + + + + +
NameField typeLength MinimumLength MaximumDescription
Unlock Condition Typedata11 + Set to value 5 to denote an Governor Address Unlock Condition. +
Address +
+ Ed25519 Address + + + + + + + + + + + + + + + + + + + + + + +
NameField typeLength MinimumLength MaximumDescription
Address Typedata11 + Set to value 0 to denote an Ed25519 Address. +
PubKeyHashdata3232The raw bytes of the Ed25519 address which is a BLAKE2b-256 hash of the Ed25519 public key.
+
+
+ Account Address + + + + + + + + + + + + + + + + + + + + + + +
NameField typeLength MinimumLength MaximumDescription
Address Typedata11 + Set to value 8 to denote an Account Address. +
Account IDdata3232The raw bytes of the Account ID which is the BLAKE2b-256 hash of the outputID that created it.
+
+
+ NFT Address + + + + + + + + + + + + + + + + + + + + + + +
NameField typeLength MinimumLength MaximumDescription
Address Typedata11 + Set to value 16 to denote an NFT Address. +
NFT IDdata3232The raw bytes of the NFT ID which is the BLAKE2b-256 hash of the outputID that created it.
+
+
+
+
Features Countdata11The number of features following.
Features atMostOneOfEach +
+ Sender Feature +
+ Identifies the validated sender of the output. +
+ + + + + + + + + + + + + + + + + + + +
NameField typeLength MinimumLength MaximumDescription
Feature Typedata11 + Set to value 0 to denote a Sender Feature. +
Sender oneOf +
+ Ed25519 Address + + + + + + + + + + + + + + + + + + + + + + +
NameField typeLength MinimumLength MaximumDescription
Address Typedata11 + Set to value 0 to denote an Ed25519 Address. +
PubKeyHashdata3232The raw bytes of the Ed25519 address which is a BLAKE2b-256 hash of the Ed25519 public key.
+
+
+ Account Address + + + + + + + + + + + + + + + + + + + + + + +
NameField typeLength MinimumLength MaximumDescription
Address Typedata11 + Set to value 8 to denote an Account Address. +
Account IDdata3232The raw bytes of the Account ID which is the BLAKE2b-256 hash of the outputID that created it.
+
+
+ NFT Address + + + + + + + + + + + + + + + + + + + + + + +
NameField typeLength MinimumLength MaximumDescription
Address Typedata11 + Set to value 16 to denote an NFT Address. +
NFT IDdata3232The raw bytes of the NFT ID which is the BLAKE2b-256 hash of the outputID that created it.
+
+
+
+
+ Metadata Feature +
+ Defines metadata (arbitrary binary data) that will be stored in the output. +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameField typeLength MinimumLength MaximumDescription
Feature Typedata11 + Set to value 2 to denote a Metadata Feature. +
Data Lengthdata22 + Length of the following data field in bytes. +
Datadata18192Binary data.
+
+
Immutable Features Countdata11The number of immutable features following. Immutable features are defined upon deployment of the UTXO state machine and are not allowed to change in any future state transition.
Immutable Features atMostOneOfEach +
+ Issuer Feature +
+ Identifies the validated issuer of the UTXO state machine. +
+ + + + + + + + + + + + + + + + + + + +
NameField typeLength MinimumLength MaximumDescription
Feature Typedata11 + Set to value 1 to denote an Issuer Feature. +
Issuer oneOf +
+ Ed25519 Address + + + + + + + + + + + + + + + + + + + + + + +
NameField typeLength MinimumLength MaximumDescription
Address Typedata11 + Set to value 0 to denote an Ed25519 Address. +
PubKeyHashdata3232The raw bytes of the Ed25519 address which is a BLAKE2b-256 hash of the Ed25519 public key.
+
+
+ Account Address + + + + + + + + + + + + + + + + + + + + + + +
NameField typeLength MinimumLength MaximumDescription
Address Typedata11 + Set to value 8 to denote an Account Address. +
Account IDdata3232The raw bytes of the Account ID which is the BLAKE2b-256 hash of the outputID that created it.
+
+
+ NFT Address + + + + + + + + + + + + + + + + + + + + + + +
NameField typeLength MinimumLength MaximumDescription
Address Typedata11 + Set to value 16 to denote an NFT Address. +
NFT IDdata3232The raw bytes of the NFT ID which is the BLAKE2b-256 hash of the outputID that created it.
+
+
+
+
+ Metadata Feature +
+ Defines metadata (arbitrary binary data) that will be stored in the output. +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameField typeLength MinimumLength MaximumDescription
Feature Typedata11 + Set to value 2 to denote a Metadata Feature. +
Data Lengthdata22 + Length of the following data field in bytes. +
Datadata18192Binary data.
+
+
+
v_byte Minimum469
v_byte Maximum29633
+
+ + +![](assets/deposit_miota_AccountOutput_(min_functionality).jpg) + +![](assets/deposit_miota_AccountOutput_(max_functionality).jpg) + ### Notes - Governor Address Unlock Condition field is made mandatory for now to help formal verification. When the same entity is defined for state and governance controllers, the output is self governed. Later, for compression reasons, From a07c5068cde9a610c49339d89402bb3d70c7a7d0 Mon Sep 17 00:00:00 2001 From: Philipp Gackstatter Date: Tue, 23 May 2023 16:14:33 +0200 Subject: [PATCH 015/140] Add summary & motivation --- tips/TIP-0042/tip-0042.md | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/tips/TIP-0042/tip-0042.md b/tips/TIP-0042/tip-0042.md index 6a91e8be4..5a0beb076 100644 --- a/tips/TIP-0042/tip-0042.md +++ b/tips/TIP-0042/tip-0042.md @@ -27,8 +27,33 @@ requires: TIP-19, TIP-20, TIP-21 and TIP-22 # Summary +The account is the central component of the IOTA 2.0 ledger that enables: + +- issuance of blocks by burning block issuance credits, a downstream product of Mana, +- staking IOTA tokens for the validation of the network, +- and secure ownership of all digital assets on the ledger. + +It was originally defined as the Alias Output in [TIP-18](../TIP-0018/tip-0018.md). The Account Output represents a strict extension of the functionality of the Alias Output. + +## Summary of changes compared to TIP-18 + +- Rename "Alias" to "Account". +- Add _Block Issuer Feature_. + - Mana owned by an account with a _Block Issuer Feature_ is bound to that account and can only be moved out with a delay. + - Accounts with a Block Issuance Credit of less than zero cannot be unlocked until the balance is non-negative. + # Motivation +The goal of IOTA 2.0 is digital autonomy for everyone. Its incentivization model broadly consists of Mana and Staking. Mana is needed to write to the ledger, while staking is required for the protocol's security. Both of these mechanisms should follow the principle of Digital Autonomy, and the account is a manifestation of that principle on the IOTA ledger. + +Accounts are the central component of the IOTA 2.0 ledger and are central to the goal of digital autonomy. In DLTs, one can distinguish between natural and synthetic actors. Natural actors are those that directly benefit from utilizing the ledger and thus have a natural incentive to participate, while synthetic actors do not and instead need to be artificially incentivized to participate. Accounts enable natural actors to accumulate Mana from their IOTA tokens and burn it to issue blocks, making the network feeless for token holders. Account owners can therefore be their own block issuers rather than having to depend on a synthetic actor to publish their block, thus contributing to digital autonomy. + +Next to block issuance, accounts are used for staking and delegation. Users can stake tokens from their account to become a validator in the protocol. Other users increase a validator's consensus weight by delegating to a staking account of their choice. Staking and delegation have low barriers to entry, as anyone can participate in the validation and no minimum stake is required. Stakers need to lock their tokens in order to become validators, increasing the committment to the security of the network. + +The account's keys in unlock conditions can be rotated, while its Account ID stays the same. With its ability to own other outputs, this means an improvement for both the security as well as the user experience, as a single account can be used to control all of a user's assets on the ledger. + +In summary, the account is the central component that enables the issuance of blocks, staking for validation and secure ownership of digital assets. + # Building Blocks ## Data Types & Subschema Notation From ba8b5f74946c3d0e52ee66136db007892ba80972 Mon Sep 17 00:00:00 2001 From: Philipp Gackstatter Date: Tue, 23 May 2023 17:53:37 +0200 Subject: [PATCH 016/140] Remove storage deposit figures --- ..._miota_AccountOutput_(max_functionality).jpg | Bin 52036 -> 0 bytes ..._miota_AccountOutput_(min_functionality).jpg | Bin 51928 -> 0 bytes tips/TIP-0042/tip-0042.md | 4 ---- 3 files changed, 4 deletions(-) delete mode 100644 tips/TIP-0042/assets/deposit_miota_AccountOutput_(max_functionality).jpg delete mode 100644 tips/TIP-0042/assets/deposit_miota_AccountOutput_(min_functionality).jpg diff --git a/tips/TIP-0042/assets/deposit_miota_AccountOutput_(max_functionality).jpg b/tips/TIP-0042/assets/deposit_miota_AccountOutput_(max_functionality).jpg deleted file mode 100644 index b16e1381fd13b40d72f68ddc9e31e8d97f82e8b2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 52036 zcmeFZ2UHZ@wk}#^Ljh za?Uw6bklvyfA6z5@Sn5yzUQ3#-W%sW9W@54s#aI6wdVZhoZpm#l^$L!N@j6=HTXe@cTzFE?v5GpBLy5ugJA3>@%nf4}fw|6yQaVdLQ9;a?)S4Bk+74Zy^}!otMH z!ok7D2JiL)uLIcEafol-7stJ!VuW|wj^x4X$j|r;62*0-s=eEc+|TWOFA>}%Bd4Hb zy2H$Jmz9T?kN=^7pyVSdX&G6$$4}MNH8i!fb&O43n3|beSUNa5IlH*Jx%<8Ge;W`O z6dV=(J|;HqLwrJNT6#uiR(4MA*OJn*@``VjRrL*xP0cMoTig2j2L^|RM}CdY%+Ad( zEG{jttnTdY?H?Q-!H-XVj|&69`pdBXHnI!jx(<#D6B`=~8}IkHFfd)f1M50A&aL~n z#NsM=Ms_!DKX{E#A`$tyxb6}Ix9T?ObNgO`n~Xd&Ogq1a_Q%NnwSoEmr$+X-f&G14 zqrep`3~=$Vt^*L@=!7NJhv45mGPjhrIG4l-Qxj_;HLy=q{fPGC9<1!YoR;24?V=ok z)w|WdPxtGq~Xh7-y zKeClZn|q1T$bO0}5O$M4)Uo?;Ri?E@g$3J0A+tZ7;1D}#5X-fdtGb?N$w zrt&@)&8(clvV0{sQ<<){=@YFwKy6d@?%LJybQ98_!n;HapHnW&)Oq8nif>Q);;*6n z$`QpC7&a5o=0->yY3()~sVSwyJ8VtG{Az@g-=}s5TH!E0FQwh!&TS)+;6Y@KOxA zfA)|th9Y*$*woh}BURT#ZXb0-a$M6w~Ao%gu6PIQj$czO5Q%uz+w>gtE2bDPr1^4;TgR8!W7d* z8x$oookZ=s(Y7ZfT3xy#-;*=+t9PtRb@ETF!{f47&v891*#CdX|d4lIHJHA5)OVS6reIn^E%iF!iChAVLurAN@IX?XaqEf>mci zXM9wCeq2|t89Va6a)Xc@Ht92Q>~Jg1zlqEIHoxxzh0^8amm>MkAqaLM)HOOhXir`$ zbQ&8JFiYMJWrNoDaf?!jNN)EN0_b5V-FPJ^5f%`50`LlLl12!XWUD>(CwEqSG|IBM#^`r4o4Ye^%E#9r%s!Dt=`hdJG;txR#1X*1L8P3o*$uNOK=j077`5k^CCufVb-k-5z<7PdLY8_ zBqJ5*M!BH&OK1Qi9b6D|EQbHf`X-lcGrysn-RAe-SH1a+go^wd6$u(}naoE6^;pwe zC!~%_NZ>cD=apA%7c|Y>wcC4w-$)33EhB8F0V{omTIfb$fhMQ12lr3937Nszb~z=e zVnzYK0euK|cHtoZ^ZFK8O)KH^Hci`JUQWOFgN5(@E55s^ty;%(B4%0eC!JRY?Zsd6UtYzn#uJg(O%qG+ycomYqaHn#tG$*e zuc7u&K{~@}hq+<ypoxdN;`SJ@vbuX0t-YXn?r;vSP5ioPECdQ8V6NK`d?N zhVHN=Sy0wjm;K>gKG=B~>VE;6lg|>naAS!uJPj*yAG(ZZ#|94u(7@cD7OFcG4d9fe z`v=UGLYLK+k=N7PX7yDOS_4d*CgEa4C_$w)nXj4O@1Bl^j1IW$r8czBX=U0Dx1 zGeQ~?NY<8QKM!@?p%(bjC30W$;-mLT`}aQy6j-w_g>wo@`oEP%-Nt(;;!~h>W^H&w z3%vOF!#1{TOfD>8{s_-iI!SnB2GnFlLxa{P#$(YdcEWfn$h!DbiWvnYzA)=7EIsSA zkE0{z@d}|I%P=(ae3`sEG(2#nk7A%#iUd$Ob7*)MjtK`U$s5l z0zuTT%)(&ma=EeI@V*6kUNPwBY^ zs47Uv=i&92kBxbKA|?~?=D&YWmU;<`njl(kyLO{I&jOlf1sPQ`vKcyjri<^4J61Wh zC^YVmB}`c3pwCMJX!1`N9g}Us*4eVrz>3LW--Qzc76&m=)YB|KaMEc^GfkOGsr>Vs*YF9Sh zNg3oF_XzPWDl`z11wG%<95PhV1J!ZT9I|vlk{#bTu=IkFp-c_@GbSwfuG+ffbY{z% zaNJ20zyhr2lOCR0(vjSWyAvCfZ}D_hS$h2$i@t zNoms>B=Dt-;%0FqW=u+Ej;$WXoj4~xh>1)KO0$qiqfU8Vs7@%b&aJwpWAk|qZ-?ge zZL*6k)yjSC(TsI=tntTRdD5+4;Tu*}(qqbP7{p24`lz2VaB>v7UKY4tE8W+x*q;?H z>GHCtCaSIXQ*eRr$n}qrkx^U-MCc`Qkp*|%~t^LhOp4&6`r zS-|w`gbni)q6c65%h=fvRE_+C*1yDaR>?GPzH2l|z~7W75h7!Z+}*@tv=O$`=l3hv zl($OAXv!bT%UQiMi*KeM&Tzej{9aZJ`$Du|7k;PXzA|3&Sdg%g*Q|)p)BXdudk6AM zwH3Afw_+tEbA8`5?4{k+GkYECpcSQM7{*^8WyR(CI?YeHCd%y1xV#I=J?3kh=0WdX z^@i7Odkh!!%bX0I5Uq((+xiqRmsJiwaUSlqc&e9P9+92K-jT0-=`z{r3>r7-P!X(1NtqfkjL||8IGMhY0c3y7BNZ_u^YjDaGJD(Z2Ep->zq!9rPaex`*^$$ z@9t>P2~hT5IvfcytcgY>3! z4VNC!AzgSQ=^8u)#^v%X6W)HNM=a`AY%$6v|Er`fIhe%1c^1QvErIUfru9C_4Ct{#UrmOuGcd zhQUJ1j?yhi%8ygF+|=ksHFsuP1<0*@UdGMAQzvBGP=Zs8??y?f@3^}Zx#5C_dFof| z+RiBXN8sGwis9LUA3{&II8mXN73yajVmJpClEA|B_Bh>bslp;HOthPe>HUM9C|nmp*%OUB)pyD= z;NhE_>`Kafd%7*VZ*|0Xb7kr%PO ze=`amvsLPK(~F~FJ&dL$(bO8JG2>nHqn8*=YO?&-MBzZvg#RBRNZJW!LrEcu5Cp4` z6K!6{nDcEwzjByo;$~aVD%oueR%E>N%jqlocmwK6aK##4G$0NhFjX*C$-eh;>*WS& z*b1k)@z`^uVNS#@!S;|a0u6{I(joDbw(}P@I5$U|AE*~?mf0pB#~ZhZQte$r_3J%@ zw%-NgK^G*m0VNtpNdQTV9I)L(c{6g63)NP<3|W|f)PFklO9Qd}P7CPG_aj-Yb*qrj zjzrDP?@K6?1e?4U`MOkzml}KVShVg^`w$9X4XEUd=}-J3e_4k2j=X z!_6!&EiVaev9cw(9{nv}mc(orGj-tk_k`Adh3dCM%aP^UDcmd+ORN+QEwz?K)(UeT z9%CP!DuNCS;cBDOg{E@6UJ^oD8Ws#xk4j{Vw^+FzPJFcMOB?W%$%9Lkjp?>eZJ3t# zz5Q&#)5~ZLvy%wF2536h;{(%?-8!|I@Y}0I*hE(>DeLv5Fdvn>+&oN@uQ$FG8Lsbl ztu3qKiAzq4ALS{p*$!?h@8vM*4y}>~ym!SC{M5HMZ4(`CGDiQTzVejfv4XDFc4mI; z$@fera}J)d#M(~GN4@QUL|Zj*Ob(%FrE>q+&r_>p__cbwvpFZ1eO_?;E<5a9V0j<8 z&Wqi)uqH8yEIY<|S~kV@`Z%R*uM)#S>D(35L*?8te05__H~+Vb;~Qn-3|Qenr%XCr zbhYhB-sAK|QGuhQN&gJuVOZSVFFax2ww}Gorsq_Br2uH}h<^4?cpH*tQDJDDsG1~p zB*E(({BVwAOcJv?XjB0EO48M5aPq9ctv}1cCRU^NQ-{u6;!N*~S`8m9 ztys&U5jO(vt@(V5V4f%V>>S-MJiq9}yuEOkns8Y1*^)o=IA7z^OqJ^(&D?uPTOFYH zHmnkOC8b(5z^iZERP{aaMNVtR$jY_)VdAl|^!`r9U_$~LEgS+oDaL4B%A5Xt@h;G8 z!>P*?(x=f~@wav(RWR^_<6mOL3P;HqtJ@;^-O#|LE2CXOxrNCtb_7z6(YkKiU1UO9 zg$uWQ7)|&U2Qa!;y;(nbGLsyN($~ZcYrSor-Eb_SX|!yT=ZxC<_34MK@LT=VY<5mfUSu`8S*mm~YZaJX6?#eUEY&(E!&;6_m;r z?0wg4d#$1T4Nq*}1mq~|eR9t;@0gxZi&#PTjgpdz3cCF^E?8TEigsK6(vDDq#QR&@ zc{pk%;5sL6ooqt(b=0fQE^amt`^B&W3_&oSDuNwA87Kswyxg4UbfN7CXbO0s0VW18 z`2V7QgbFJw46kgTI=)NEdFopP+qW(N939U(IpE)RC?-Mwp^8KO`(-XsRBExV1stD! zx$?Wna0a55tQ_fqw8$qz*OaF9ZMQn}T)kQ`mR@E)v)eUvuhNwM8sDy>Ll8HH0%b4D>OqUdG&grb54x$$2YJ?L80y^hlRg);&!jmB zL(OA_%I_{7-_zlIAkFl2{^2p~4dD{~4OiOxOb4Bf&V1#w4?9%f3>FqLg|(`Z&Lr{t zY7r1dJWJSQ>qheDyP7>p64EuKSaE5!yDdrcDZ5<5O@C1GIV3(pI6CPPbB2xUkxtb% z8t`?ZdHj=qR9S}lg&Ox=H&TAUmC@#BH?=aJoRnMq5T_@5rqzm_ZMIaNWO^$UZ?sJ2 zd$?FU)%RzZT+b_&fjaU|ORYMmnJH3pzK}e_DXCnYE)I>|nG9U5K`q&MM0`7Dp8vdE z6X0^eY+J5YHI+w@*y}a9-TvwP+RBW*j!uQLnC_|G*6Xr|jN9XV_guu}ax4k4bbjLF zZmK>Yn5T8ai|pya)BJmsR5!qJ@ZnxQ8Yo_${l=t}xVTgCI@DfdO$edX4BN;3iUz*J z5Q2R?<1w4xci-DMrJY)N;T>dY(w%0^DKw%1<6mZUlW1Ul1zL)<0u8?vCjylFlB{(@ zr=tMo_~AjT4T<(A<@|#F3$^LMbh{mEbIPe4X72Kl;QOJMqh()p$8G5u^}@c9izs>a z^PVa_?&q2D$W5)WlfA;yYwP@ep0)YgLYFN0QnYrN*>eN`5neW`Jh}?q$+1qe(uz@r z7#(54tXB_zWR6%SIOn~zaa=>_{={H?Q4w#VETa;`sQJ+{!86vI=zHyeQTQm$Q{B?) z0d|H(ArFUptZj|26bITP>zJw?l;M>NC))F%!Q2{6wP9ql#B=x;MvX>vdbd$k86}#%S!76s(qpjso-EymeN# zwxE$92gwvYsU>JVuUqxHk1<8WI>^RNc~7;FOx)iu+8_!@9!aICA2Q_ri3Kr32uxJd z)O2$e?RfOyr5a4>Sd3lT{Y96v?Y+M2zeU!IgeK7IS zc(PLIx`EaNJhA?U91pj}+tq1XMjmOq8`w*k(u`Q+?!%l6I-AMnO6x@MC(0FcRb%s^ z2y29*NQJ47h(=_3RsN`9uFmx83Lhm2m zlXCb@;ffdLseMQfdp>1V-A2beDqOPYI49(pKS(8A0l9&cKRkTxgk@#JlUb!O5@0m0 zOniyfW@Ch*q6~1_TN@QAPe^!wQWmN~D5jgkasByocVK=R<;0PkyE0l^nXCXSt9?V0 zDQ^)gh1bt2Tf|v2V9R@zk~|u5hppO>w8YA{) zwHH%C=l)P^zwpp?@)gE*L(Wdf?RuUX54db7klfLQ{J$+ z*-xc z>0dmE!WfGzX?KwZ&|rf&S2oCWP-;&6&`h0%)LIV%4TSffWzBmxo_#0xItloi!x;>9 z4qyh;JpqAEv`$cx?$Xoc0!_>0cC7t8XDFet&`TG2>|xts$KB}eo@bhp|B=`w-Og+s z>le@GWgmqV!s0dM`d_{@tI?HzNPn3Nt3C9})exPsm_H>=NUhG2k0xX8B_>h5|4_7K zUsSPX{fC4;&VS+JS}#o)!TfDFFUdzFJd>t(KoSVd1p|Yrxo7F{bN2(f|1Vsm zbU}JRPF>g*r#6ce|y~E(h$%XWu&3S+5<=LU+QxvMs%}PfUn@~CC zt#5@zqjW}3UMB#n=4V{+-|qOdrv*m0#OL!8=6JW!o}I zoJK26+g}M3`UV4RiQAgUkR!uG(gEoHSIZT)kJ~ax9~c9Ish2{BvmP)s? zmuu`!RF8?F-5szfG~f?B{ww#ZEcJe>ooJM?zB!Z-*NuH+Lqj+Svb1Q}3a$5H&UKHC z&RpYLv(2?QjO$?w(Axa0t;UD{^9p{~C5j_n&PZk?vi+D7t}-u&1|Sbm@+cAvofe7S z{dVmF$5YnkzDe7IV%@QH3uf|TA97*4PI;pYi&6FB^8S4Gm(z^J!IPw6aw3W(7^-f6 zdo$Wc$$NX8AloN)ZRJEdK0OFGF-u1~NY~MK6eq&%KuD}LwOgid9}&O#vUE(yVo4xD z>zSGb5#rI6Ml_Hd4`o6F1b-jKt!SCPh5qnQcM?qx8KbNdaPAW;&N|Q0$U&Ye zQNHk9nfg`VJfgM!>(Ge!Sl5ehj{Gp|?-TX+*STbDWR|H@P~e|_Gj{Fhx$k{Sq7*Dr z+|Ow%3C#=x`)l&c{WuznIPbC6$tjEfHX)??H=jc9LCm8sQ*u3|n6ChR0>)9?FuTmm zMA2v?cHe95mWMxk@6zB)a6wq375jK5Xm18Q>EF1QY8)$XuEEPZ;E$Q{?+)usL>tWV z=*5R>A$|?Z*mDJCtmn+|`Pc}Ifb;ZMZ)#kw+T6VCbPy{B>q<~qztcAuYhI{vG|L=t zZ};ZLrXKXl_2`q2L_;~ydaD9UYI77>l@r8S*RL4b0LFF&8nkJHdG0I6A8HhsQhz7A zgxsZ{&t7bs<|1>USjPu>@6{fI zu_?E#N*0knBgn^^nx7@a&#%W>i;?GemcRewZ*_SH{P;TcP-k*h0P!BSY0`PMz=#RS7O}Lg&-XVTT0ZBYMkAF?uh= z${2Odk@8+1CCU)(8xG%$_H1 zZl=8Udhw3s)GDbK?myEm{Mvn(5b_qk-8&2GATLaydq(rNlMzwS$f|iE1L}sCuJWAp zcGG;W_j(C31PP|1BUBD;=~kg@HtUYxy46E*ZBG-Ahmtj;;0cD@ocU77OTRNA#ka&6 zeehJRZXY%25GF_3<&NRfsMC26)!ADCoP^@*Cg&6E}_Ibb#$dTHBp9(M$C;uoMrkPiCI&Y#B%f|*JXU92WgkG zMRE-{pwu7d~tvfHo?mPGYf<@C>nQxq8o^FF$9g*6ldQM#d-eONjSX0(+L z)tPpbHv5rX45;f$B$mRf-&vw~MT|>SQxGQBDCvA1PyQZy>!V9{Znx%3caxNmc%;L< zl8tJ=gxt+}-)2>79t@l`lyUk_3sqs{u4a?JFEEHrC~jnXd67Izo1ulfm#IHn3Dzum6blt`5X?gynMl}+J#=9SP9El0$B?DX1^>wIVcTm)Jd1r z!X`ADm8Y1ar;w{@uO>-ArPG~sR4L6>+OfDX?xw~S`bKK*bSUR$kNfN0>_be@V|dy- z|2OZu6ARqtDGI+iL~^?cBuaOJ8eUaNbVWyBGM|Fs%izm< z{w4QzR{3YA+xZqoTM;eIfM;@?P@G@5pn{TWS?_*z!Q(?Ej?tkzu^P>ZMSpI()SP;^FIZGLh;tnx{?VR9|XPUHJ8$SKw)bPFsJfaiiJuZA!IGl@hX zM12PlYBu{q6LW&}=|(iDTcS&-6EGtcoOZ62a@kQ`say#ptPshFRS1eTrE-YjtHP18 z@TJq07eO+s`%GT1t8FY)^!&RUKj97rM+=7vJt9Q|%62D%ws6HV5y>#B2C|Zzm3vdH zC_lP_mtPKO%PR_#pi%oQxJkX&J$5cu*luhpL{`4D zrC3X*^whjn{)Gv?&;)&g>+%aIqXS2j0RJACYECGFTcWz1t>keuSxeR@EL21sSjwNzNknE&E3yk+@kE1t(K@lTc< z^K9yWjdf_%$j((Ntghq7I|931PQ1lD!?Q98#+qJVp(l9bU~WU^_!+`;M1g=edEwC*XH&*xe-)NN06Pp{7IR$c}C-7!QKts(R(7LNj*^C zQ^ocRX`n8+y-+Q`yg8G6d-GoU9Zi$&$vSFSHYBJ3dRCCi6v}dHbS*cuD$YC9<>v&d zF2O7gBtgDU%GzZZ8oNDBo*X^7@x<)u1+N_sXBIIg4XMN?v_}8OUf=NgQ`N`73gwe!tGmdct#eC zkWZuUK(Sg@lww0&qP;_qP2KV*3+G2#GB0qH?uPyIyz2jvhs#oVH8KMBA4DH#%BFiLd9%&n8b~9edyHEH0PKJ%7h^{|1*;q*#qDP9-8ZdXuiPIBY6erzbVIsr3J~c(64;mhi2Bx~3JszZu>PVurN?hXEqRjAIh^^ukJ~j^euE*SlL#Z2NcvK8yaYke4NDBb%Lvz;6?P>wXS`z;SNzPHwd(;|?rs)ySvF1seD zrbJe-Xdza%uwA4VXa(6z+n*rJ=+ZzD#NP_xfX=No(HgiPUx&UO70L6E3aE%4CE7O3 z`K4w*E(vt>%a9*9V;v7OfOk`aFVnIWSSA!<_%UKpL5{2;42RGJq1I9vWdM6e;xOnT zvqR|KZSJ)`me}ad1Uu=}=(s-eBpoF-2qn zO-2bL*|HxKNqd5xW{-k1Yj8*z3ClhfNvXY>NBcIBnfex_0YyCrE%&tgV_Ik{0^K`V z=D-;u#lG&kxM=k$j?yWO0x!P#m2;6IRXJPbIf6nYdhHHvUF{+oD3bgDKGC5`6S8wK z8%+z&l<~238tNKzG791;nKSN=griJ`Ur5o`(>NV}IVlsZIw`lm@AkqZRhl@3WzT95J@2EQOMYiD$~t7=3j$ z{oK!D>$rE#^W@mW)Kq_gC5%su{`)DCPCeJ8-7)=|uc9=AS>|A)$`)sRSe6NK zaHEyjbywq!L-*}sScFb!ZCWeY*jDN{X@Z}Gd=B4i43r9-o!a1LkF98=wGA6G>k@9m zETUETpGeF6Gy3HJ*1^UXgMi{hw7pd^my4(cJNmsTgvG?xE`+S2T?c4|$sPR2mLZtCI|WXa=j z+iT`SXkg7rmsd2&eQCFonX$s8Qp%>2l`Sc;MU*PdJ^ z#>PzF)_m(przq%RIIC$=MbLr8kT>Hkl3VCbNa?mC;8jZ~QBTFArixuAL&*zaOEb<-z%=u=c$? z_I8~i5c(7>BY!iAg2MNoqc`aK7qx)nx1wmkduSh#=jush`=m;f&DSv@(`gby|}DID&5AfBm0A+)jble36J;T8uHm2>3loZ zKg|f73q`+?r(EH@>Y93_Kag~}nza9sGh%4+8S3RR!%@yVSQU)`)z^ksiWsYTLE8;h zd9xlNUP{V?AXOsd4=vM{Az|@c*nKS6T-`3yiV==4Fdyp7&$pvL+G+hDHrT{`9GCTR zq~FhZyA?6wUIXaokzX>ix}Ea%<@d)dZpPY=we?&rHq_fx<;$Kaw|-_=Y5(Ar6|?l$ zvM+r#ctzU8PF@0+&tw%OM=W`60dRLFMb7#2(PE?la9AM?=D#PQ+JIbUu2c>OER={ex zHT`QRRDll1w(0Y+v-a}N*1dZ9uxq6c6)6^&PkpG4Df7LVmVb@W)b59k+yhy?CJmc1 z-owb~MpfNbnop$7U>N1(1VOsFTB#=Y#4sHH-qv;rFQgDMH`Z{OF6+}@pse38nt6@q zL?0RdYfu&q%yWW9T@Qrro}^0VZ*V`zMCn%$bsTe0FD+A7CLdJRyi>}RBdI2Hc^7#) zUM^HrOFLMb+Avm8O0n$tiz%FGf+3ek<6+?q)OB`6DExHrASd8eVK7Adsvrbo#i&BT zEVpZ-Bf9AnKP@S36cXt17<6m4P}HlL!}}i4gQ|>#WJy5~zRf!4e#2N9qw#WN3G|lw zt?k$VA|=AEmchlV$jQ=Mefwk30|Ux1rJ@)@sK|i#@gY+3XzMFt>X;(RQ??h&`mIpw zZ-DP!l;TF+NCauJx%LLZ_jARpYTiD>a@5_#8xivHc&W$6Xuve<^c>UiS4T(t4@YMa zQc+{{2mVur{{{ckP;6_-C%8IhJ1yYeSI9r$IAp$hnKX>>*GwJk3Ph|Ek%MNUr8_9< z9vbMzhy7ru+xF83DPFqocLuU(emqY*xKnj5qCCe_L>LiPAxFG)l67H;0zygwRczyW zL6e&f)UU4(?XqzCmfvk#oq)z5MwBcN=+ldVzlTp zlwf9dzu^m#FZ;2*kGPfvMPMfd9GyhjuN{tOi_+~HtBs|^m(xgf&viM^A{LOSjtok% zNB%P|=qbfNyW^j;MdyNpb2F1WdU2cs7fbz`8c}`|-IRaa8jmCzFw1(z zb8hBA+GCvou|;`mV+8Unt8Wb0`=*mt62v6i$gQKekpz(1jnRZR$>P60DUi0qA{!T3M1A0%irF0K45So#AZQA1 zJUQ%uN?0HWKKVuIhgSuIB>+5C&;wEG0Yel3O#!!rJ}rQqzz8OYT)ids{R%q z`e~!IiRhiiPT9VsTv4E^*HQG@`Sj3G zy0~Q_UDcAGxH)h6`gr!rO4Ci+>pi8NN(hO*A2P2p+DtV~0%4Q)KQlcQIeeWk27caV zN%%S%pr=ayw{160U9Jo$F@DHjYghh~vYO{SP$HHonv}{kFYd?9YUc81)=s zm56QizJ!zjG5M{k}S8vXpsh?9X0l zHWM(r|G@Wbg7-g8_g(@_J`(tEv8N%9xQY;6I5#mZS)qjFL!!(ztrL8wh#bg08aG#>gCM9lsbEIfpWH z&vzEXt_(l%?x~lPY#COjUTTl5Qif}?CvsFoea=YR)jVmN>I>H~>_Bb7Zq45IKGS`6|@+-f7;IGbn+Xi|O#O)Y4jm&Nw6y4w%zC%P*xcKfS5%YwQ znsN3z2GSC`K|}?a=v@c>ByTZj^sp4T0)N{i9R(^%9Gmv;$gL|ql+97dWW z$in8=a#nV{Za@%BPNgav(5mm#i@O4x>$W#rQ6-J{IT4XW+a%EX`$cl7k|zGksCg6U zdVSR>%VFP&Z6%(N0QdnKTfPr?i8d0CNhLYJuNrJ^Dmb3wBA;&DIVpA!otOJ;asBk~i*l%P+Aj3RqNpdZ zx+SiX8LMB%Ys-a+2Ro6dUIX`#{9CQg|B1aMXX}MX&qF7;WAj4U-|wOwjQ1xo{^iB? z%(dl#fyUT!tVIIe0;01qNV!yIebpW`P|X5q%Tb#7bQ_^x6}#9WyFqOu7a73#MT97Y z)JT~5Gqb`2tb5r7S9trC0P22(p# z>2Fz3^X4!q%w!o}$N~~NjWag_Vh>*=DBR1Gp~>4s+u$xCdENjtpgyBJl^1Jx8U+f< zQot_i9w%)J( zrUql6dpyf9YOsnynW-pr9`^n+0zYH7-)=0jf<0nJ^k7u|d=wO6bvk&2#~;}Rf|P5$ z(m@jaYv_0&bmw*iT)IY_`J|iV32aju3jeHcP2yqUSTXMR>0=!7)`=gOc-RpINgs&@ zFv0+d4%y^W=i=XbXpMK!`CBPgT?pN%KfvA6Z^Sd#zC#0LEFjofs%;bc)*6AxJNX_B zJYHD_#T@l)Db4{y_{PjU8u;MKe3}D#BRZdi@BU?du+f0vNNUz-=YdfNBEB`neC5b7 zkFyyE(wC*cR}ZOt@e(Hc9{RXUio-%QwVGw5g;H!L8O=H~8*S*O4UfjBN z{`&vGx|rYfIsbOBC4#t0B~9G1)0!u_^mtEDJa6Jr;zY=Og0H}X#w0xV6_yl22h_DN zHk5Z+Hx-$xy!S91Dt$}M&w*Xo)n!@m4U}gh(g9ypwGAkeEXi?ub@?&aD)3g1% zEtgqm>s{EF%RtB%eRm3+4u-W59A+oh1|zCs>-` z=%|b*aPcJF`A+{we`rV@<_kLhZwirec7=cKC!76c#NmYWG48Xrx=Cbo{5ztyGYhbVc6Kb^$dRa;x3#f51=@Rmmj7K#|QMtdQF>T??jYHhlE!ipt(A8Y|vLyb9#F557(4!Pdt; zv70=}*!52AFAemp@_k{LqkUg%8uTa^~amiNWqQv1&EtJBRoC0%oGG-rtY z-LV{%N$kvbCmXfU@X3?`e!;~o<4o6ms@*>G9-`v5oo0gTrcpNZEO;Dp^Tr>Isg-eC z&X2kjT7NwQ+C5YWejld28zrPwztt$%62#oU;WYHcmz{EG>#p^U;`mWzrH-rxAzYa+ zb<~SA%#D=8A#{=z6$8+(p(pp;V;bMpNAY~+#u>%(#q_--a*TD`htIl(>9c{vow9+l zpxJwEwCvs+aUew+$*C-kH%^&&9%-_+>(ZgXuhPPZTb0%KdL!N^m$pZV>Bs)jp> zkG&UB>%%IC)X$MD)YktszUtzxFqB`8-DzbL`_1BtYuM`>#0BHNg#BVPGUsQs>}vO$ zQZ_c1Z&d?jfw!L6MCp5PsN37MKA3jUj*Sy#9Z27i>P*U}*hjR7Sc^6`kjs%vWMGF& zzoK|e&XC3E*K|3V*iu83d?>_nH2JWpR9XJe>v1#r4RtjWsj~_ zzoz@EUBXS_q z84kU-PtlmVIAomjOZV5r>b0?WM!6SiuU2l5Oh^A5eI+Bot&@guUTWNRbrY6xz|{UF zrHRO;#vMio8&?VC%d$329 ze2oNS%Q-oC2Yn2(OCV#K#*PM$v;~Ow_Ky9SlkWEr4F1Vfd~0_rQ@UYAOHdoF_3dkQ zR2NEsu`HO{CM;6h$MG5eGZW_@%>tb;VtBP`e-UTd)dx#YzmvkFQmCN+A z*Sqse8Jd+l%z;iq|&=_`*&#JTRW{lcI)H?$#zmN>z=PZ8w!~^5E^OpVM z%ti!k^0F0Rwpl+P(6wYIM?4Y>#iOQu6Yf68OtGe;hS7BakuIuNZ?72j(s`A;2x9s) zB!BuDZJmF*5}W^;3$%36F9KcQvu@M!^1tLs{Wty03{qtJgJR;{fkNJa~80Jgi4LZ;q%`f@1;Mb==3C zN{@e&To-A)|72U>^l6u{DmzWpi%pye8)OF{e?+91IQVt!MqT_&F0ZhbF0=*^75;?ryIr~`IG zUXBw9j14EeUHgHesjW#^ol|1}U*vstSXAx$?kEZ(0*Z8q3W!KaspN*tm&(!n$zxjPCEJ?T0jm7fdR&NTr#nsn z&2HucguG^)?5!ppDMx(vdTn^6rmw!_*2gUF51mBPxt5!1Kx|YXNc&9l#rRfP5?;Q$z!&f3h>Pn_%Tvns@^V?0;6DL2}R+le#n8-|4pVguh zX&>emPive-egwD>dW1kvU*_qj;am?R;)fsJJ{u99tZu4l`O+!Mx@0euoP{Lp(V9Mj zN+jE5RoSwNDRJ@8U$4%Jr3~i$-l#l6CE!KfP)_4h28QoA!K~K)pqVPVNkVXag=&a3 zd?s8u-}6Qof3j(WY?;YpebTF)>bIGh2Y@K_SAwbfm!;6*`F5F5XKGBMPG~!g$FA&% z^4jd=rR`616?bmq@H?>cv*)f3jJ_+z*R%*>w22)8$=Qc~4gR>OY_OsGCL+?QsZ&a6 zRnf$3EhPe?BKX0%kQ^X{BVq+$b8X?GdDvlrK85Cr;4dj*bCNyUXGtY9ol3Z0XvhgV zWQve)ppj1wOH$nFGR-xM2jc~hVcm(D-j6RmWcS2pd>w}HUr0|NvT5+3(7U{>$<+8o zqOia$T4kG#vF-Xr#mEp*s!mZdQx|zLYUVxg5b3aMoORENUVEqWI3nKIsG27q$-_yRGEIQ-n;iY?vww4V% z5(jk*sqPjX4n{;l*z1{Pnc7ijcXO{ZZ!Y2}X6O$_IJN9v-1)<`pD92x>rB$}h#51rseVKR)? z3j#N|0yoF(A70B9ca4KvPk&GO4 zx0q+H(gx97rhaByF0a69qSD9VfJ$<+y1A`n{D8&0n?>G!PJpN$6+Md zxG#6;v+35`u~z9%BHRMBhPHLQXPmJlI%?RraC_{JV_JgEL+}(+KXgHQ5WKz{55zU$ zr_y|`8zW3JQkwLu~E4Mi81*$Pro%W)cXT;`WD&CUDwQzs!GA%!UD8%D%ho$(Im`Mfq9uU-Ed%L#;`q_W(Xdd=9`JdZY^Y7tm~=zym|S z5w=vj!(N}YQW0<^?sJ8(fg-=oq_#* zgI_yA_u>G$kHhvAXEFU4;hM5_ck70Ah&=vO1NkS5e_e#rDS5)Z2z% zGO&Ki5IMgN{iJZ79wp_dcSus)b%X)J)rbYac#H%xf}dG|C{67E6zy>ulzj@J4MP0g z)v(jITQ>NEoOr?|=;^EfA9{F$Jn51WuYb*@LHwYS(sfJJ13awT;T8G68<5<81TFY~ zc@+M`-+$3>I#yaDRIM(0imPM*vl@>F0`MQuN31rdW>IEI=~IG$uWZ&t#^*er!a`lZ zd?3ZY8~FcUX5zp54IXdGr7%clO?JHaIAYgco7%(?0pc7r#Vi1sL{3??P z;DtWqKqr>LSn!kI-X64StR~P$X&5vBSyR3nkp8{Q_98v^!=Z`Z?>N0kPwrn&$fREn zVdS>;577J=czqtoYryWUW8HhPSm?<=NIc-(wLqCI$cVyWTKt#ABqu* zWKcG@Dyp^_?+&+EGTgk~ zYZffQMs)ew%e4f;Ac$OPzhzv{Li`fshw+GbNG#x%5B|Zdmx39?Xyx?aRB9>+o z;!0W^aCQpO@bTZ!pI;>r>bTo9D#*`PPy6iC8OsGO5}Ruzmkhs+5)V zD|A)iC)e(IoJ(rdvF-Mc!*0A0%1UR*+T)9Hn}ibS8P-IRT0;HL8XzVgU|2Oz)Z=71 zM9bS|@D)Dr+SpwQUZv3MW2;s=P&cYD3Jexqxn(;KQA4|mv&cl&H65G*?$ zYsEu9ZQ8Wn1t*VuG3Pa=UTEcN;S#fI{X7<2ebt9PMPA#ztKNzTvdxBEY7%X}+bRcM z&yF7elA&)c8Y^rBO#EuTB_%ui#R+peL!~(e7Wkj-MUFe|s9nKS&dA=!g3-ccD+WL% zZa9i?qFFiQl~m8$H|!DvdtY^@)eG>xcP&B$maetx@CgcJ(4)QAz{_u;hgbWxI7t>N zg3srqS+2Zf31Rhs;KCsQTG!&3Zejan@|u{e^>MBJ$vpjWzW#p*C$_TxG>wJ+b_cDb z;q&sL+nw@odSrz&u&E+}3S58%fZ8vc-I0cea8%b&U-cO`gkL0H69^kz$O-rX5@En% z!KguD$h$cVQgzz~9qeyG+;-HoJ{x%u2`zS5KLFCpfa%+YqAr_6f^%0qK>Ad$>fP<-wu|?9Bm(SS14at4uy^Su8m-Zj6pw z(brREtlFJl!9(h)kS=7j<5y}2C$!53lZ#5jm3n=mLxy=I^RIJ^wB;#vl%pm=c(3{* zuyg~CR!Ri5SA~7rv{>K_GR#ifnhKw1ty=G)vpka?jJom}UNO^U9@KO{JFi-rCqw9V zbBw*-kNs1Vk+>71Z)?`shuZXtnplPbPD`d0?AyA6Y&kJBm=&Q72=Lj;~@ zs2J@vsMUP<`r{v#^yjc$s~4TaE9EdOx25u<>hrvMv0d_ff%|!#z8!ZvtnhsW;TI%EKT~?-tJJg>v^({y9BzrO|WC9}y z^8HxD?2=8YEfxf7lJ4bZEL40&#*8rf8%6hPFhsN52RY^ICv)FrV9sCHAf8-Rnge8@ z++rRNru9wt^%~E;x#y=s!ZyjJ7r#qgkkbN(wix7`dTvz1m3f8!-=vofEb-0#iNlV474HXEFLcc?M0+=hU+|jO~U4-*nywC2Syk=vZ@dG!_yHZCMkuW4%QfXE1Iy0BY3U3VMWmw(B_3JrA4}`9$@d~;H+$*<| zws@XlewA;e4ks*~i~)upLI5J;9-=K34PiNq^x@UfU(qqAcDR4_?G-;-+SPL*B2fkh zy$-p=rUE)Eg^NzA-$oPeHg|t2@G35ebLnce-AN$yKN+_Er*NAmH{yy@KmLlY_{oIA zzdBVOh!Emx^+g#f)Nk=I0ZE8)6h(dHFnen9lfNEpgsjE&wspy9+-8$U@4{Z5HoR<<}*qeCO`OuKVt| zLvF3hmVAJzad}RBoXg`7p)u`Xjxk{W9+>pmNBi{wz@Y5b%r3hRF%Y+<-v~z41F4-5 zXFu{qybax3QhP09nA<>CyqYv^&~INoh%^NUcN~bIXlg@}Vk(GDpx&v#u}5RG$qeCk zRol>2mlp6#Y^IL{r`Qa;1W5F~VCNGwqui0di;ITw_JvX@udMhgsBLEKwL3ghC*Ke$qyTjS*s=GNHx^Cxm^Mk88?E}*nUmpy> zzsJ^mHepZc)0bq@$$1-E_R?1KR&)jbou?o8AILavqx}|gd3zbdAEDHy=X;(uyRpL6 zR=#qwSVCS3lYNio z^G=O2nWQuR5}vVCAW_=u%d}1|W5yWLf?47Ap*kvSR4Xj@7UD@n!2w0Uw?6ZlLAT0B zU$uyhQN~@xetGmz*UMBm9cN%6M-7qPk)*Ck;ZRcDw`yfA&84L83NmV*#hsEbRAb6X z-{{_Sib}j{l!ozXQk5j?FLpI{nPq{MJu#;Vp5Z;Sw4-)4WidjR4iy+}4LgejYMY3K z_BKsSK87VG%^WodzIhp2wUfFW@ol-5gsn(enaUx#XM9aiRiB|Orv0Kb@eH!;fzYer z1R^B3!XxdVH>-KKkg)XaE1N__0&>x30EsVD2@sOAkW0L{n?icyfd9+9NPouXp;&@x zKq2aip8b@~EllYrfM!NAVopT43mx)E=F^;uIfEPJHcamnT^mq5w zKM`x4J;tGx4-4JUKYXJNadp0Y6@TtE-95R-s{+=o5oZjY7|iHi*s&(&@)h@{*j!$+ zuj7be3Pi@1mDOr}YA$GWTDxgD0&pl*1z*NLN}v}{AnMZXGwH>RwFIF_cU{0t<2i3sffl;C=Hvx=O-kh9H$V3t08&LsD8%zL8Fli)&=e$ zB~w^h``yT%q?UaQG4 zuMqbsHrbPXG%8E9v2>rz=y|izGf^dBQCv@<;zt}s=vqupJ%ggWk19>lg7yzXTV?!(-#7ZCYyzVBX1lvaMpWEX2^PdeqrjvM;Q zXCG31X-Ocuci1#iH-7!K5Z{Hj+NO~O9i%2NLZ`2MOnE+5(0>1#+){vKuVs-%?pZyv zC<@I?(wg`D>@IN2o=5=bc!em_?xhJ1+^GWWU1Wu8#?-rd$xcZB=GK#~4}lKi90+rO zkMFKNdQ; z_aW)aH~BTt8`}G?jrw4|Mw}Mri~=7H94Rh6v?*>2A?kd{U-zXeVNu81KJEgrNfUNq zydCK=Y|)`Rwbt4=gH_A&lS>E?OoWc%COe8dNPC4iBz3JAujRNOwB7L^X|DlWzR0NG$~!gv$_ zNSuYu5f<3-v=aYwZSQ1Cxnt7!$@h+`K5hxk1R8C2PQcB7sqgb7KKb}-#-9N{Vqjt) z18ldY;vnTyU00klr{7++0@4#BKS1xY92CyW|50O;Q88Ob`bgWf;V1E9VM_H|Eb0_B zc)grP$k6U z`l8pI4p>=q@EofF0IkFpk1EQ9I=0ZD|!o-AFIy?CFUby1rck;a@FJE4r7ny&2{BIxj=?z`u z>4nbHPv2g@3_XvugI=vX@aH&8m<>ScxeomPbWj7fKz!zaorwc{7gOy7tl<5wYh^UG zDY90Z%#U4#vWC`HjOZSBli+<1KUD1W8kR{-lRfnrlG^*g^T-jvI0Y&+uP6*#97-g; zHp|eGMkM;-uD8KW`?YGDQjp{;z_^A)6QXF=)N)cnV+OqAl(k?;NxVW{AEH*z` zH~n9nHviU~Gtz8v-wWs{*_%D6cQR(c)89F8T|Ko>fsEf@^s4|ps(t2tR z*@vnOAFypp%y##91eej%OkfAXv6Su7zWF~Q1PA#PeMVY zzIk--5tzLhUE2@?DS9ur1s+4eaA-2smvqgJq1+aqa2 z+|k2CFuv)xWqM>rT6)E{rtQ%@S9aiC!z=U8?875)gyPI=KFnAUYVP%%E37T`$7rl@ zSl=Wd8&V7}yd-(x@w|-VVRLfnW>c(vy4YFd1ba$jo2F>GkTm;Tl+=0UwXuHnv&v^7 z=f2^-t-01~T-0a9lpid~NA>C`*_FzxhSYj~Z6hGi;GCiTlY))T56_=F8xg({qKG<@ zk7sS~J$r9zxW$-qCcGzmS)eh;JB@GkTWI9VrqG7U)VPyhRPM*&6>;P=4`o5^EVejfisXLifVWU#4AGB9>I;Adh zzc}-yLn>=Qz@wU$HGMccm7McZ00V^a@rHE8RHR7L=WetNF5FExFycPaeMd373AszA zlcfL95!rsB`TBOq%hxj5sIWmuMM(kqzFLKMYhj~_38m{r4sHbFo%CiZeOy_PYCs+G z=A!c+{c}!26oEsJcI#F<=?3+qM$|m*X82RH8uFeUAj@2;HPXg3Bu3rk=*riY87KLa zl}q6TPoVNumjYH|;tBK83e_}Aw&rd2SwEqs(IFa1tDu&ZQRPDuzpx`!0hP|kbhFY_ z99vqo0Qz-?OJx2<*2{H9&7H2KXOf(HaXk^#JnNG@Ap+M>*;LU}HH@a%SBhz9>D>H+ zN5h!a+;p;Td2Gc5aQ-b=5S?PM{1b`Dv83FkXbFFOM)f#VaW;l0)^>QJVYu?;XUp(+ zK6d7x<61y|FN#OT*^e`5zFSk)j@nqBTQkH9aazY&65Y8o17sWUo%;y;_Cwmf>k`C( zN1rDU+VA;EtRk3d<|ITEJ6#h9bRPs0z^@VD!xLgw2hWaCyZOAn$wV8$5r4PUN1M1x zoAZ&`E9y-q@3D`;WMw54hS8Ea(UWo`DuFQ*b2e3^^AGMwxRALu$bQa=r`kMUT($Q| zv7@mxme$J4$NGY3U=RXiLNymD*^L%93&2pw_1*wbq-6zf_{QIQ1-0^1;cO)kn*X;P z?4M5dY38e?Q$K-f;u94Q$Cn@fIYl}ATiQqI)|RWe48x89Hvwi?;V#D9{5DQh^#-0V zr=7f_-zfxQ&F!eysqUz3 zK6Qjr@}JIhiPxLBS`2`rzQ3mvkh!MUM-2Gs=M0~9w;tY|4;W__Hkyei(tCC*h4u;5 z=Y;`c+67}FBNxr;XJhE29D1q#Qs4z}rQCEv^+u;(y5Z=eQzs(pj+IUOvq9ckV&1um z3U`sMy|0q97kyalK*+ROVX1XU)tkNv)!;S%X>h)fRVow_TuZoPfa2&4M}+{As%Sjy^WrO7ieMJTjo7mJ?V!-RJMOCbL4BGqv2?GnJCL_z) z27sQp)9bCfDK`7AnqU}>QBd*f?tw{Ni~H1(F{Nf7>BnaHo78u^7FCPK6pM67mK9`Z zvi800N(Mrs7(@L)AP{rL>>ibH=HOp@L2m)rC2^ZT_*%IqpRi=DO8_Pp(=blDDZo8m z`p!}2W*A?`+r7M09M=~>Ahq?4oV=2H_~6;uW#<`o>sHC45sUzh?7cOX9rTeepJ zEB5>O#ePPu8~k&X@x_24+T{Wi`elmz?LFRYV_0l<#U{ttcLI+19VAF5+Jw$Ch|yIx zkkM}5ntK(Lyupu<&U$W=9!o5`5pL$(;+$q~DWq;pzU$+(Gu)$4+DL#QrH)W4ZN=!ZM9qylr6>^Ql#$o_KCHr?`9xBLth4+1%XPh zBRvVTU$F(dz#4A^>$##ga}1XvZy^nMUcuh*R6ZLEoZQQmIMS&_@58W%Nq>EeC%@G# zsp48XI%`3KWf@j?UL=m2^*5m~A^+L)&xlB`&wplbGK;RzF|85tZIJl7wl5zedvvMR z@Ld}tQ2_;E-m6A+E!2}{H{L_kBsI|^L#wjtS>kI;;set?`-;1hdYB#Sh~LX-hSkspp@>I;{E)P z8+Xp`^CRe%-xOBW3PgWg6Vl)fUAnia>7LqT=m-CZn2Ulsk%m^-MCCnHLCCpvUDnZ7 zN7*P>7M>duHDk;3tn_nyq!x^R-S}d&>+`UV+15gIaPhs=!588;$}CE?-nx=8j?-Em zWp{kKbeZdQBgjF7bI_`2k#_{Yn4s;dE5BMq&)GGGE0wf#fw+FC4C)L}QgC+88t7LJT3XwGI@(5TlzKLz_q$(E)3Afx|s(ZAjf-} zosk)uQqBe$8e>}Gp^V?;a{OM0N8sW3dmO6_6<2DT4ephOWRY=ewHMqLiBgiV=y1$x zgRR(HUc4V^J29lLXEtG4b>$}c>+fQBr1H)SD%*RCsLsJCW>&GB*oKi(?3JP;wPD+! zkqI05>8<^vnQMJ#7RjlbqB0L^hmk=k^I;=~M?%ZD>KB~Cy~I=VQ}xE=EldD~DD5w{ zymvcuHunxZ`RRjRAajRnr&L*qAt? zZ{DtoocM0w9J*(`eSao?H%`|ct-Et(vG{ZqY+t`||7U-meKNjq%*gQvF4@1=_ViH?IT>uoOpcsD z+K1ZMRJOnvIv+IY(XJkTJEqP()%80xl3^M!r%XR05U+W*v8TR zJ^kg5D1z(-0dK#>GLG-)PB7d;!)2ttbm+>GtpoyP+zve?KW|P^d)>>zQgrFkJP;eo zj+r3TFsHgNKos5nvOro9Hl0pL9=1f0y03bFI+|sMMC_)dZxX{<;%S!MFESe|kQE!LuaBe=8{G6*B0B3g7gP=@iydJzCZNmx^YaFTud|X#86Y^Caw^`YqV*e-J{{+&`5|#@P}TzYPS&X|pN<4QBrnNLK&K;XytXoH zes>$P_&b#BoI#!}J5;`w6pwB-(jHNC<^=1hK&(3`N zRd*8(JGl;?wGR?*GC;PcgTT`&?m=PXUF%lv4-<$||5D1H6fH)Ad!;JMNc;M^z!07t zs+K+6K<*Ly4_plelmQ+=oS+@$)x||9YNy7P6-S4cgUI{Pu*tXJ(32hQE zh=$KtXwg*P8K>#Bb8g*iBrDQ246CeTb5UF(8!m96u>-tJjTO$6=*bpmrYVb$9iL0K z42QgIA~fEsAj}Jr-7)G9EQ3^)^s)f01yh9|%83!~+sV@-diL zKu77Iqe8y$Oa8h@nkf~prs<)M_vpUrORL!G_IV!JOBZ3x(2uXfQT@o_#H`M#n&kgPv3@BiUCfkq4!BW z`4fzw|1v%3Y0`qf$f(R{)&WYYBLVEnFYf1}pfklI-A|i?$TapJ zz=}~vPXL^Ofk8%-K#^=QYzwQLwRwe|@>XG@IXPi3(|yim|J4jCF&0&jSKqZAAc@UC zz3=C3G$T)}Hz}U^Fc9jaZvaN^vD)!7e86d1T6oF*$xDNx=IS@cOEE!rMr@b5bDGeD zxOuZE8zX`!Ubx&3kbKB~@RQeQ*z!+rSc?u$)&MnfSqAz6lQkYx2y~EnUr&#qKjNd` zh(LwQ&8Th^WhZ5q1eFngvBo;sI};mDeC-u{c`|U2fOt|#A%7oe=E zQv&Q=aJgWNbt<5f8_1_kOJ*L--h|gM#&I?(r2uhjsD`~b$)3`@3 zR`iLQZ8wNVp*#-Rrc_uShvS#%ou)5&=#+4xh+Emo6K1kk@~GnZZ!MG(Y*!T!?8-rR9cT`gK8%LdlkOY#14*PbbfD& zj8~UlOl;&@0}+gw`o@>=vK0by`lO5CDVojVT=Ywqd?ti^kr?(yR(WD%0ZhKV_vle2 zDjTC8zwlxR1v8tFszyxx)RUI1vb6vzd34GAwV_>A_3_Qc&b&%{Hpw5|?Kr1XD7GxN zObCB~2yhRHQ9#{HL?lvX-wvg24(V3S1745jMQ}zeO5l|x2 zNdE1j01D>vQf;hDb_Bs=Hn_IA2Qwc6%?Hov0dyD)Nx`P6I^B}NHJM-f zfr!RQ3Qj2z@`Xzy2@!u8zW&D>WV83T8lO+c%1v0B4zp?Tv)9!V%MS#b0rB?fYlw?` zSvKmm-G$#wb7-(vx@Z9KAR^6wCX#-8lNjZbgyj%U!<@CTMVb5ni6$XM@}KWMsP)O# z>&We(>maL#eud1q>7kA`lI>=&?f^&k**@skuT@?EB9l2&D|nXW`C)nz5|KO0xpKHZ zRk#xd%^2<0egY+}66q*0U5Ag9MO;D5%9@I9;(Xnw9LY?Kmtt_l>PKhc^+i47QXG#t z3Xb+~_X0S~JB4C(8(UU5D8LaGkN6FM!{DaCVMcS7tZ=aF(@!2u&yV9~|8%_UXVvY= zo#?cD`~POh^Tf_{7Cs(h;8AJAwz`Ig;S0RKoueu5dw71gagKeq#PI!jQ$_|H{WxES z4B@Q8Q?$WyENjXpw^uslv6si3<>w)r;;rdN`PxCP;E$NwN6s*ZE)=TQviLSa?R7~$ z27>hhFiPcaWUE@JFcXs6D+wjfqML%!&DLBF!tJnS;1nwj7exIa>he+^EB(~_1K=}W zYqTn0%}`Tleffr)P=6dHR)6U8)Oca=%_W5auS$`wA zKET46+l;#8b6PXB{1#-<>#!FJD8>V!(2^{(3<&|Iud4>fg7Nku>HIhMLV>6!1byq; z_1?06G`mRmeoC>`@e7!b#W&axjnNf!@g?ny2tBsnr6RRYa7gQ>GXjoS<-9&z%XKRN zo%{YZY*BS75SjmrqWZt1unu{#1+iiaX)ykv@c!LhomnDWc^qLL^(!u3D)+x>X)n;5 zY||+h>V1`dV;h?=i#hM$`2Ff4@}|qcEsE%;6CD{h!ZcPVx}-?vq{s}c${4c_AdJth zGhEmA6ttn>W{(X>nqc1=^D^4I-95{FU=!+lAi0HZUt+DQ% zOA3j8oXcP-e(u7@be+shJiYhxeQ|esjR6@*m(^9nvIti150BN>ja$5*mkGRao1xoY zRdf-aBUjrSybGkstz7g&IXID zAe(htgm6X#wQ6jN7LAp_*MZKnGL-Ns^}g`FsfVOz>MT5f0J#D73Y7Uc)^EJ+Jj@kn z3@*e>?3J#fZDo7G1;FVcLiYote?U{y#sTbaR7c?9&efsSIahaRz!IK0>uW^pXl_XT0p&!#at6S9gyCY(@PBDRWGw#{)}vYs>tR*9 zUJu=LaDC~EMvp)zd;qM+(lOQ}bOOM7oNqkFdc-pVSP$Du0PAt00pu5~$BFg}Tf4*u z2gg_s;CyL3Hn!6u0jx(yDFy`u-(j4`P>&d!qYWTz{}bx*pJ}?32?3BE4=BiwkshzY z0i;LM`fngTPCosbE`am^-<#N<0Apkb-*#wgNogHPN$&F zczI!<0Z@SMj|F?Ltl7`2FJ6*|=3T8b7r%P#0TrddhLA9%8DyVz1y5ej|%^E=)3OVP19u$ifAr62QpqWc4@QH zjdw0#>6)ge*MjD5v=hS)rblYSsaM$mdt&YgTM5IEf3SubA4>TS-o)Nfgx;#X!232 zH>6h0`cev;@#+0F!R|G#QoX{bi%iLW=ngZ{TutqnmQCD{**(gx?=^7wDfq>C5hs{_ z!~Pa2eHU32xPF45>(ipS?*P9J^r5ZHew-*47}F^CE_Bexj@hgV!4Zg_%G*$&RJ9lV zw`u3t(y~z~%3guLz8aGs{2U{i3c&Vj``CeZLo_0jK@OK1eP=13&c$zGZ>-$SH80r> zz|aV+|L#Yh1%j=c9e`PdN~Q7yrsX>bIJ%goh5-r14R?dpgEM>fVA<;Ka-36H6x$Zt zlFKKSfTQYw;Chj+Raq%sCru$fzaT|g2f`dM6{eUr;kjscl#~%dudoAqKC`+Ow#I&| z++zKb`HS@sp7W1JJX9!WiJxG3-PCu{UPmI8C`$}u{F2l7$q6ZR;}x^cgj`ucI?b$XN@h`ch+0+HAIbXlq=o$K46 z|6_esuIdI37FzpDksKnB+;v>r?PiXLXEz<7@%*D{zW_Y!e3Q5 zEyEZUi^2pFud}ryKxg{GbscJM_417jfi{ESqwJa2eV-IdzS?7XahBGHG2sqv$eG(b zO%~nD;lVSS{$eSR)GLY_(A=*+6);;h!zmEL1j&pp}A9)6umo5rS3NoG7WFvv88b*oyBWcPo!&@ z&tKr*;j7lyxrHCIf-nhbVvU?*io_$h#V@|NO&^&fIm0ql8KgA#RfF&GopG}*s&2Az z;Y_&&Dlb)>Q!hQIEqu@;Z2}S)^np z+!iENKV?M=Y~#eQI7RGJGU?U7J7R!>m)fr#1WwCt0Y}Cw1|OjcK*inX98uBodia;?JKm-Yg&I~r*eS&8J?8>NRHG6SRqicYUIg%{C z(PWtn3n8qX7EVJK^w`+02V%1TTWp*cDD8sP;^W&6u53enmex#@hHJu}?>2+|-|LOn z-U6PK&vATK0EY$=UYl`2e*0{4z;vXq_Ue0Gt+;8)mmZG?Efm{qF3nsOqxI_Uqo0QW z$7ak1v6Z)5k42B(TvXd4mVcu!eC+;SwkhL#?t^zNq4^NoB|)2*Z6WJIUKqb0Anv31 z13GTWFph;W4R__)r&;fy-qDm+dxHYrg-%@U;Pm5T4ktqtun$By`=)Rb%h|vZr1tU$ z(93(2YQhgstIGeP+a^8irPT&U~aUi?R~bxNB`{Bd zDZm+(B9=dzjqdS6)KHc+b!ajHY_IQH&|f~QcrBT*5#18(h1zzXo_Jz-?|3afxl$Jg zzTMOEX5Q+M(qCrWZx5t;Qh$yXwri#u?MA!xHffWU!t~cr=&`ucNj7?wlRqAwKg~A} zZ~<5U0ELADReeKuj(&h7kl%h*l>Q`;(RH_-v?$$tteFH5!%6S^@mEARO;~5xZGkeC zecGSo&s=AD==z0kfmZ?V>a^)i8}i{%iO5K21qf-74FIQh2{qKe*xZ>#XjFMoi-lSSPyX>{3E zLL0j93Rm$@H%nCN>Dq3I=>u)t;-tuuxb7}xXXCKiJzx-mY3hI* zkRoXo&bBtLC4yWPv+^`wz6Dyhv3Xv;i{C=|Acx4Pq+-Ky9FCh}maQ$4ZInzh}6jsG8yjY09Aj} zv&JhestCrs9e_qz3Hp`FxOOSm=IP?~AE1jh|G?>TY+)n1Cfib{6RX%XeKR|C#Q^%1 z_0A7a=0I*Z_8hbchJrXg2I%LfS#y(Ez(;(R2fyoD^&EN=`C-=4h}|WOCQ#B!IWdI2 zE?=Gl_ep)H`~;A%r6LE7y`1bSte}&QhRO$iw5ik3dl*fFk>%+vlji$-KP2hW@6)s z&8j>}+C;a3&AuT}VvU^`c)E^yX@Fgh-{31e<(MU%x?_JPJhN>Bn&566GaiP9wl@Ku zdE6>=VBtOh_&kQ@7^Porw1q&~3KsVRDtL7&aU}@cjs`_f-7+(S4gfYxYHI<&hL$Zk z0N6lNQ{;9DB3*j`jJD^s5#oW!=~jlO3f&joV}NIF&V}W>gF-;83ngpSyLR9VWCxV@ z$s628;;|fw7Bs#`9r_bmO3*!X;W!p6Meva`_JZ3J)^S4U$i&9Qgjh5{K{e?jFY`e!*#wXlNN{24T{ADp?FJw2xM?emM*~Fq zwUc-S^}?B8G#(ZoP&+6<$?b~FRom4*oItBc3JGR0k8P6G0Ss1Bz?V+n+db@oz9fDw zmZGxHV}3FaaAQ#{4j?5jZ&@sP5>eWqB>ZST4VnZb%Kt9)gqCitis58DPANG(m_ ztVh=`<+-WAX0Q+`aeKE{n(+t&=7YnFV)oO0KR}T*%!j~4GJ*_JsLQMYk{X9eiw`jK zGU9d}87^>0qT8hD*jy#u_yOyOwg9>AB*15Yd` zMoI3b0J?H1t+jhAfRzA2Geyc^OU9LfYsG*_M)xintl>e7_F8%n9Ew&uh;=7xhEXCu z@um2>?)+2Iq||<4LU?I6(KijVCF`hra_syqSYuxM#kDFf?4{JkD7Jy;&^RN{b$6n7A`eoHMQ6G$ zX&V^lk^rSf;)d8~s_&_>Fnbt-NP;)`LJmU3{5HM7hqqJt<@ z`-~ZHTSi(iTDOD7>ExA#92Qm4^!8TlB`H>B$u&`gvGZX!K0FNd^XDfJ!Ed=G)+zUp ztlLWGXfJ4}$+q)0=&U48oP0Hi{Ul1@pG#2w9+qHf>^HChCn;4<2_7d9IQ$tvaMIyD zxx=YcoJvAD{6!Ar=ihH}DX(8ySL916#4NkSEP3|z0p4R%j20PO1}9Jy2KKD$XRZ7Acy}cZ-j}MNGmv zqO(>?>o9sOvCu_Ga6I}b)PmxjmMmsvUaL-1YQdUfks0N0gT7G`fXzHS0Iwzh_SfR= zbZl2W^d{#rDt_JsI9M)Zw_&riYUEK@0M-%k6kY#QjNUsyr$AaB+o8im>i)?0F?JvO z{LeNN?Zh7B-P1LT*R|s?VAey1s#N2hpB6#)Lx?dE71Fm4-wT|!lhWrlr~9z1RN$^D z2(n5&){-sx@E&;2eDQYDl1+*fu$|6%EnC2k?IAg(38l?*PqpJ$9Gtk%P8rg(AgdgO z^Ptr6M^JS@i{skIAD{~09Pr~S1Wxb2$P2N}3}QW9{`S ze&Z?@5T1E{_6G>w3)qh!a1+qSJ<8w@&@B}}BS*M|9?seLX>v0s@)Nf<5GenXl~XVA z7b~adGa#4c)+cLb3D}I|w+<6{-Gr2oK=yT{c0&yLTzA6)3$Q_W8t3{KsV=_68@NZ` zlcINdk+@gk*uZfVG}E-lEE7E4^@e^;w8D|{sCY&H#^6BFQh%8qfgaMsN9y?=kZ|Ou zg2(#U=slk@|M_kbRSkbn( zP;;5t+V&AOwWDm}Z~Yc0k(7q_-xMW%8|Cbg#}=!WZp0SK+U1XrOE84ot`GK55!zgb z6gRRj=AsF(AU8H1WD;QdKqq5$$N;nHE33eUPizBXPl9)2`< z;G6fkC-W$(M^XEDLWHkb_)n}uet-se-C>Ppy?>byFu1IZH1LYP{m=HYfHw{f^Z#W! zI2`ed1i>)TupExO$T6(wE~Llys1vvhps;x*84rCd@dM-}ioFF}#XJ`QGz8MXYrs}H zZF;!NRAGS~0}3&fGWU+ZM;rQ2t)^~Q=)d2JLF0a*dMTnOaN#M446zgfO)jgl;s$eFb;7~q%9cQh;rEBMMIM41p8d@B(?JwwK6i;n66>zlKm$fq;!*Nd zK#opK6^O&U-h^(dI1yg2pANvN7f`NQuC5LUS7ijv=|kyxJyg>EHy`~2gk~Nm0#X@S zfOqxz<%xF zx1X;h@$>D@bODpneRBPfx=0>P8~|AEN!Y9Fc+hYCiO|VcdT14gpLbRKy{>2e&bX*O z{n^4;G@0_1A~cI!jIJZLx&l%9fvc)rer68V>d6BAcb@wXzSjSoA+sB(5!`q)s!P5p z;g9p=Vz@g6gFbBC?eFJ}vrG?BeEPB)NAq&JF8kNpdS&OXK)g^*fLY=8f8oRacLz92 z6Se-8z}7{pk@_~_-8-^7+Clz+;-!w<@uXCVN?F8{?{mzGG<59aB%dPX96fs>sSa(x zyqR!O?_XQC|8pk7zr5oV=LVy%mjZj5Vxnj7+2jdvK$rYzyx-*X`qb&!@k(0~=x-|! zSfU7c;ZL!4=A7armMa`J5ceNh;s4!<@GovonZLc7{<7Pcy%g=;r8ECNOy@|@SSC)e z4|;QZ14`KfAn+pp=kB5Z*%4-cK2v*vsS+31Z_+y7Pfk33z|jCD12QwGPd7CO!s`o% z4kbO@l3lL$FR0WgNjkUApzv@u;KF{Gesnrc{I5+k@+=NT$~PILu`T_UxoG&E{q`gF zuPue#BL;#}O)sDfIuSo-+-Fi+Z_weiC;4A+{&74)O_g29*z%LKQ)|@qXCS*XEz5x* z1zEiY>V_KHp1^rXO;s#4VyHsZU&5Y*})s`rTa%JC6)S!Yx*jDS7 z8%v5fl8LKa0ks;13ht~8hpbq&XM zRJF8K6g}3cImdyEFIB{q=qSzM1!Z-kJA%=6Ro&E>m8KrmR6WdWYR$s5%5} zY!%DSdOc?U@mOUKD`_CiWFO((p|(LM5JNp>DU9ASBT8V*bw4jMH@^X)$^0oODN*2! zs79?`NmTH>9GqiU+Z-&sf(er&&$B^@t)KoVt^l(dk;P(W#+4VUR%Dvp{HOgjj}Q%q zLr=H9Pp?OMxYZm|P85Z_uX!c8LRyiBOaV82!H*m(3ax~kv@-lAlU@($u_B3(@0`a# z`P}$nMts9;LKw_D@^CrIi@k(+N>*r!d0mbVW7+o!xu)LZ}QuBF~VL4Ua;o*IXWMbT#^RgfdruXcJZNblO<@ zJ^G4Q_Kl6&C)HH>e#7CzW2O6V_Z1YUM5XVCvmC!frW_pSz&{1cgoYr1ysiYWM}96h zm%(afZCd;qnB-@aS?;qEV_296ZT-Z{s=4U(F-=HLV|@F(K+IndDWTMlFXyF%8}3tD zW5acGT!^KUK-{N=(@vVMSVuKr%grEOwKt`%b~3biBIfB*Q(%d$auB|YLH9v-+Ud*c zJXG=P*%TEr2R)lO?-F`V7KaV3XF~H3j|)`-6g}Kqy|geJ2BTMhrh1OIX;!Vu$F=CM zRsDd`0)^4pA^AN%HaREq`jr(SQvA6?t7HLDW~bRNPewkhIbq|Ly~PO=H0i zbuiYoK4hEYP-PdQzSx)}py@|4zZ5Lw*WsIyHKy#^2pSHOi z$r@I8I;QeL5T{|5x|C>g)M!=sqj`jN_L*pX-5{$w5%F9_YEB z_ljA!+67-yqpa!3lIUA4Ur-DWMzp&P&bs0%sHto4hLG8&8x{}f8b=aQyOvV0UH
_&gT`4&-t4xdzjXR6IHbXQSo@UF zl#yGls?Mowmgo^ao~^L1Ag)?nkjloU_{CiYo-4at>GjU0I^*>n5rD;C%Hp5n_W#+* zEqWl!`4*6yA!-7Ce*uq z&6~*?)0M^yW*Ho$+egD^1h;>5xGCvf+E%;kqU*}t^A##zGoFzDUD@Z&DVR(&qo~y^ zMSdZ{?$pdcwKt9s5;7MbdI9g(@&uhn-7}KlD$JIpFQRP9;%4*_^hER2^i9d*P@}ty zI7hmo*6id+1H<*jdUIqGCPicC65^3bq5#on-^fL>=NkQkd|G!ja*mLnXb+^`%}53- zSVnIyFPZU|2`c7Z-_58CukeRbXuz6XOeZC+SQvEZgEPg|S%qDQ@V_zVbh~2~Zt<}8 z_E42}L8%YO6ddp(e>gxz$~MzO3F#g3Ih1GU(G&7s_*IoQ@X@AysQ1yMxBtve)1$gOm6#-kT&OqO3}U=nD3wi0M?n_Aq%WVUc3KQZBJoOp;Kvc zir=^7jbw5j&n(A335_nimGBWa4IfpCf?F(HO?N%X-o;cyJx#LFN!rVlWU-^GeYD4u z)H5u>dN82Y;+GUFMW)+~Gmkf_h1#6fUpQ`iEh2)65Sq>QM+6tMqp;{%x7HlSjLtLU z$(TfuLaMj0`@lXe6|5$_yP=0s?kwoqI|FCNL7p($@mQooB}K6!rJC(7dM9DoVeQ!lV$VEq zSJ8(D12wXXicscTj&r&cSceLkh7`fRnmh4;vxx2AT}vIb<=a=iQ0QoM6D_;!AI}xv z(>*v5E|vga*fXZKZ0#%$_2>5IXR<~N3eC~fh$z)7a}R!aqUtbrWnPH1lKHKEITX6o+Z(gCDcLb^M}uU2a*fKL+rn1@xxPMY`t0*`V>d z^Pzr9dlmxaMs=Y;l5}_Y<|HI3Xz%4H_2CP`?!A-{0=n*EBmIp0_~ozggjoG!&7xF* zsft-a#7H!F%}VisQ8_fc%A378L|Nqop#vG0SdV8$&gs2CZWBD_d6eDL^aHV1Tr*Gi z$$pXjvOJS?g7TE|agYJ`wP#=as;)c?n*dv#sISNkBzWDhC21x*yux~9?<92tNLj8M zxqa4)Z$&BZ{4Xp>e!9{0b>iTJN&PzvVp7058A9&)+JXUt(1~g7T}BEb#U$-_1mjyi$B*uU+-S z&NW(-rs8G8q^zE5d-{jgOX~)-ibMQmQr`*5j%bH>i`AXSPOmZwJg+!>91RvuBSG3b mO`U$vkf6&+Q_`^Zq*9EXfQJ=JfbrDs|0;Cp diff --git a/tips/TIP-0042/assets/deposit_miota_AccountOutput_(min_functionality).jpg b/tips/TIP-0042/assets/deposit_miota_AccountOutput_(min_functionality).jpg deleted file mode 100644 index 3bf5ddcec1f9f671fb4b54d967c3eaacd84e8a7e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 51928 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 diff --git a/tips/TIP-0042/tip-0042.md b/tips/TIP-0042/tip-0042.md index 5a0beb076..cc1606445 100644 --- a/tips/TIP-0042/tip-0042.md +++ b/tips/TIP-0042/tip-0042.md @@ -1862,10 +1862,6 @@ The following table shows the Account Output including the possible fields and t
-![](assets/deposit_miota_AccountOutput_(min_functionality).jpg) - -![](assets/deposit_miota_AccountOutput_(max_functionality).jpg) - ### Notes - Governor Address Unlock Condition field is made mandatory for now to help formal verification. When the same entity is defined for state and governance controllers, the output is self governed. Later, for compression reasons, From c06550042ac527f6fe35ab7189fa5fbffb54eecb Mon Sep 17 00:00:00 2001 From: Philipp Gackstatter Date: Tue, 23 May 2023 17:54:03 +0200 Subject: [PATCH 017/140] Use `Mana Amount` as the field name --- tips/TIP-0042/tip-0042.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tips/TIP-0042/tip-0042.md b/tips/TIP-0042/tip-0042.md index cc1606445..dc745704e 100644 --- a/tips/TIP-0042/tip-0042.md +++ b/tips/TIP-0042/tip-0042.md @@ -523,7 +523,7 @@ state as metadata into the UTXO ledger. The amount of IOTA coins held by the output. - Mana Amount mana_amount + Mana Amount uint64 The amount of (stored) Mana held by the output. @@ -1202,7 +1202,7 @@ The following table shows the Account Output including the possible fields and t The amount of IOTA coins held by the output. - Mana Amount mana_amount + Mana Amount data 8 8 From 6f7247f1434766ce39c1e03d8fbbcdf45d485cfa Mon Sep 17 00:00:00 2001 From: Philipp Gackstatter Date: Tue, 23 May 2023 17:56:10 +0200 Subject: [PATCH 018/140] Make `Mana Amount` rule consistent --- tips/TIP-0042/tip-0042.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tips/TIP-0042/tip-0042.md b/tips/TIP-0042/tip-0042.md index dc745704e..315323b37 100644 --- a/tips/TIP-0042/tip-0042.md +++ b/tips/TIP-0042/tip-0042.md @@ -1038,7 +1038,7 @@ TODO: Add Block Issuer Feature rules. - `Amount` field must fulfill the dust protection requirements and must not be `0`. - `Amount` field must be ≤ `Max IOTA Supply`. -- Mana Amount `mana_amount` field must be ≥ `0` and ≤ `TOTAL_MANA`. +- Mana Amount field must be ≤ `Total Mana`. - `Native Tokens Count` must not be greater than `Max Native Tokens Count`. - `Native Tokens` must be lexicographically sorted based on `Token ID`. - Each Native Token must be unique in the set of `Native Tokens` based on its `Token ID`. No duplicates are From ad1624361fddc99593b5c3863f7126bd550abaff Mon Sep 17 00:00:00 2001 From: Philipp Gackstatter Date: Tue, 23 May 2023 18:24:13 +0200 Subject: [PATCH 019/140] Update v_byte min and max --- tips/TIP-0042/tip-0042.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tips/TIP-0042/tip-0042.md b/tips/TIP-0042/tip-0042.md index 315323b37..18ff5751f 100644 --- a/tips/TIP-0042/tip-0042.md +++ b/tips/TIP-0042/tip-0042.md @@ -1852,11 +1852,11 @@ The following table shows the Account Output including the possible fields and t v_byte Minimum - 469 + 477 v_byte Maximum - 29633 + 29641 From 82c7a99a845df6c89e9b180aa8c756f62565efef Mon Sep 17 00:00:00 2001 From: Philipp Gackstatter Date: Fri, 26 May 2023 09:42:41 +0200 Subject: [PATCH 020/140] Replace soulbound mana equation, use timelock --- tips/TIP-0042/tip-0042.md | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/tips/TIP-0042/tip-0042.md b/tips/TIP-0042/tip-0042.md index 18ff5751f..761aca931 100644 --- a/tips/TIP-0042/tip-0042.md +++ b/tips/TIP-0042/tip-0042.md @@ -416,13 +416,17 @@ The presence of a Block Issuer Feature on an account signals that this ac - When a Block Issuer Feature is present in an account output and it was not present in the account input, or the account output represents the initial state of its UTXO state machine, the transaction that contains the account output is valid, if the following condition holds: - `Expiry Slot >= Transaction Slot Index + MCA`, where `Transaction Slot Index` is the index of the slot to which the transaction belongs. - When a Block Issuer Feature is present in an account output, the transaction that contains this output is valid, if and only if: - - The following condition for Mana in the transaction holds for the account containing the feature: `AccountIn_potential + AccountIn_stored = AccountOut_allotted + AccountOut_stored + AccountOut_locked`, where + - The following condition for Mana in the transaction holds for the account containing the feature: `TotalManaIn - AccountIn >= TotalManaOut - AccountOut`, where: + - `TotalManaIn` is the sum of all mana on the input side of the transaction. + - `TotalManaOut` is the sum of all mana on the output side of the transaction. + - `AccountIn = AccountIn_potential + AccountIn_stored`. + - `AccountOut = AccountOut_allotted + AccountOut_stored + AccountOut_locked`. - `AccountIn_potential` is the decayed potential Mana generated by the `Amount` of the account input. - `AccountIn_stored` is the decayed stored Mana of the account input. - `AccountOut_allotted` is the amount of Mana allotted to the account. - `AccountOut_stored` is the amount of Mana stored in the account. - `AccountOut_locked` is the amount of Mana locked into outputs for which each output satisfies all of the following conditions: - - The output has a Manalock Unlock Condition containing a `Slot Index >= Transaction Slot Index + MCA`. + - The output has a Timelock Unlock Condition containing a `Slot Index >= Transaction Slot Index + MCA`. - The output has an Address Unlock Condition with the `Account Address` variant containing the input account's address. - When a Block Issuer Feature is present in an account input containing `Expiry Slot >= Transaction Slot Index` the transaction that contains the account output is valid, if all of the following conditions for the account output hold: - The account is not destroyed on the output side and retains its Block Issuer Feature. From 36c5abbf233501fb11bb0fef5c6bf19c576bad6a Mon Sep 17 00:00:00 2001 From: Philipp Gackstatter Date: Sat, 27 May 2023 14:22:26 +0200 Subject: [PATCH 021/140] Update header --- tips/TIP-0042/tip-0042.md | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/tips/TIP-0042/tip-0042.md b/tips/TIP-0042/tip-0042.md index 761aca931..c06054408 100644 --- a/tips/TIP-0042/tip-0042.md +++ b/tips/TIP-0042/tip-0042.md @@ -1,14 +1,15 @@ --- -tip: TODO +tip: 42 title: IOTA 2.0 UTXO Accounts description: Defines the IOTA 2.0 Account used to issue blocks onto the network -author: TODO +author: Philipp Gackstatter (@PhilippGackstatter) , Levente Pap (@lzpap) discussions-to: TODO status: Draft type: Standards layer: Core created: 2023-05-03 -requires: TIP-19, TIP-20, TIP-21 and TIP-22 +requires: TIP-21, TIP-22, TIP-38, TIP-45 and TIP-47 +replaces: TIP-18 --- # Table of Contents @@ -66,7 +67,7 @@ Global protocol parameters used throughout this TIP are defined in [TIP-22 (IOTA ## Transaction Payload -[TIP-20](../TIP-0020/tip-0020.md) is the basis for output validation in this TIP. +[TIP-45](../TIP-0045/tip-0045.md) is the basis for output validation in this TIP. # Unlock Conditions From 30a67178685d70f3f2eb4d41dff70b0e19244a3c Mon Sep 17 00:00:00 2001 From: Philipp Gackstatter Date: Tue, 30 May 2023 14:00:21 +0200 Subject: [PATCH 022/140] Expand `MCA` & add explicit `Issuer Deposit` --- tips/TIP-0042/tip-0042.md | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/tips/TIP-0042/tip-0042.md b/tips/TIP-0042/tip-0042.md index c06054408..8015a6422 100644 --- a/tips/TIP-0042/tip-0042.md +++ b/tips/TIP-0042/tip-0042.md @@ -2,7 +2,7 @@ tip: 42 title: IOTA 2.0 UTXO Accounts description: Defines the IOTA 2.0 Account used to issue blocks onto the network -author: Philipp Gackstatter (@PhilippGackstatter) , Levente Pap (@lzpap) +author: Philipp Gackstatter (@PhilippGackstatter) , Andrew Cullen (@cyberphysic4l) , Levente Pap (@lzpap) discussions-to: TODO status: Draft type: Standards @@ -23,6 +23,7 @@ replaces: TIP-18 - [Immutable Account Address Unlock Condition](#immutable-account-address-unlock-condition) - [Account Locking & Unlocking](#account-locking--unlocking) 5. [Features](#features) + - [Block Issuer Feature](#block-issuer-feature) 6. [Account Output](#account-output) 7. [Copyright](#copyright) @@ -415,8 +416,9 @@ The presence of a Block Issuer Feature on an account signals that this ac ### Additional semantic transaction validation rule: - When a Block Issuer Feature is present in an account input, the transaction is invalid if that block issuer has negative BIC balance. - When a Block Issuer Feature is present in an account output and it was not present in the account input, or the account output represents the initial state of its UTXO state machine, the transaction that contains the account output is valid, if the following condition holds: - - `Expiry Slot >= Transaction Slot Index + MCA`, where `Transaction Slot Index` is the index of the slot to which the transaction belongs. -- When a Block Issuer Feature is present in an account output, the transaction that contains this output is valid, if and only if: + - `Expiry Slot >= Transaction Slot Index + Maximum Committable Age`, where `Transaction Slot Index` is the index of the slot to which the transaction belongs. +- When a Block Issuer Feature is present in an account output, the transaction that contains this output is valid, if all of the following conditions for the account output hold: + - `Amount >= Issuer Deposit`, which implies that the `Amount` must be at least the issuer deposit or the required storage deposit, whichever is higher. - The following condition for Mana in the transaction holds for the account containing the feature: `TotalManaIn - AccountIn >= TotalManaOut - AccountOut`, where: - `TotalManaIn` is the sum of all mana on the input side of the transaction. - `TotalManaOut` is the sum of all mana on the output side of the transaction. @@ -427,15 +429,15 @@ The presence of a Block Issuer Feature on an account signals that this ac - `AccountOut_allotted` is the amount of Mana allotted to the account. - `AccountOut_stored` is the amount of Mana stored in the account. - `AccountOut_locked` is the amount of Mana locked into outputs for which each output satisfies all of the following conditions: - - The output has a Timelock Unlock Condition containing a `Slot Index >= Transaction Slot Index + MCA`. + - The output has a Timelock Unlock Condition containing a `Slot Index >= Transaction Slot Index + Maximum Committable Age`. - The output has an Address Unlock Condition with the `Account Address` variant containing the input account's address. - When a Block Issuer Feature is present in an account input containing `Expiry Slot >= Transaction Slot Index` the transaction that contains the account output is valid, if all of the following conditions for the account output hold: - The account is not destroyed on the output side and retains its Block Issuer Feature. - If either of the following conditions hold: - The value of `Expiry Slot` on the account output matches the value of `Expiry Slot` on the account input. - - `Expiry Slot >= Transaction Slot Index + MCA` + - `Expiry Slot >= Transaction Slot Index + Maximum Committable Age` - When a Block Issuer Feature is present in an account input with `Expiry Slot < Transaction Slot Index`, the transaction that contains the corresponding account output is valid, if either of the following conditions hold: - - `Expiry Slot >= Transaction Slot Index + MCA` + - `Expiry Slot >= Transaction Slot Index + Maximum Committable Age` - The Block Issuer Feature is removed in the account output.
From 12d78633f99ae9d87806733d653389175519107a Mon Sep 17 00:00:00 2001 From: Philipp Gackstatter Date: Tue, 30 May 2023 14:36:17 +0200 Subject: [PATCH 023/140] Add Block Issuer Feature to storage deposit calc --- tips/TIP-0042/tip-0042.md | 136 ++++++++++++++++++++++++++++++++++++-- 1 file changed, 131 insertions(+), 5 deletions(-) diff --git a/tips/TIP-0042/tip-0042.md b/tips/TIP-0042/tip-0042.md index 8015a6422..992e2c4c2 100644 --- a/tips/TIP-0042/tip-0042.md +++ b/tips/TIP-0042/tip-0042.md @@ -903,7 +903,52 @@ state as metadata into the UTXO ledger.
Contains the public keys to verify block signatures and allows for unbonding the issuer deposit.
-

TODO: Copy issuer feature definition.

+ + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
Feature Typeuint8 + Set to value 4 to denote a Block Issuer Feature. +
Block Issuer Keys anyOf +
+ Ed25519 Public Key + + + + + + + + + + + + + + + + +
NameTypeDescription
Public Key Typeuint8 + Set to value 0 to denote an Ed25519 Public Key. +
Public KeyByteArray[32]The raw bytes of the Ed25519 public key.
+
+
Expiry Slotuint64The slot index at which the issuer deposit can be unlocked.
@@ -1041,11 +1086,9 @@ state as metadata into the UTXO ledger. ### Output Syntactic Validation -TODO: Add Block Issuer Feature rules. - - `Amount` field must fulfill the dust protection requirements and must not be `0`. - `Amount` field must be ≤ `Max IOTA Supply`. -- Mana Amount field must be ≤ `Total Mana`. +- `Mana Amount` field must be ≤ `Total Mana`. - `Native Tokens Count` must not be greater than `Max Native Tokens Count`. - `Native Tokens` must be lexicographically sorted based on `Token ID`. - Each Native Token must be unique in the set of `Native Tokens` based on its `Token ID`. No duplicates are @@ -1116,7 +1159,7 @@ and `governance transition`. - Governance transition must only change the following fields: - `Address` of State Controller Address Unlock Condition, - `Address` of Governor Address Unlock Condition, - - `Metadata Feature` and `Sender Feature` in `Features`. + - `Metadata Feature`, `Sender Feature` and `Block Issuer Feature` in `Features`. - The `Metadata Feature` is optional, the governor can put additional info about the chain here, for example chain name, fee structure, supported VMs, list of access nodes, etc., anything that helps clients to fetch info (i.e. account balances) about the layer 2 network. @@ -1130,6 +1173,25 @@ and `governance transition`. ### Storage Deposit Calculation +The storage deposit of Block Issuer Keys is higher than for other field types. Therefore, +the storage deposit calculation of account outputs defines an additional corresponding field type. + + + + + + + + + + + + + + +
NameDescriptionWeightReasoning
block_issuer_keyA Block Issuer Key contained in a Block Issuer Feature.1000.0A block issuer key needs to be kept in-memory for the efficient processing of incoming blocks and cannot be + offloaded to disc.
+ The following table shows the Account Output including the possible fields and their specific weight. @@ -1687,6 +1749,70 @@ The following table shows the Account Output including the possible fields and t
+
+ Block Issuer Feature +
+ Contains the public keys to verify block signatures and allows for unbonding the issuer deposit. +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
NameField typeLength MinimumLength MaximumDescription
Feature Typedata11 + Set to value 4 to denote a Block Issuer Feature. +
Block Issuer Keys anyOf +
+ Ed25519 Public Key + + + + + + + + + + + + + + + + + + + + + + +
NameField typeLength MinimumLength MaximumDescription
Public Key Typeblock_issuer_key11 + Set to value 0 to denote an Ed25519 Public Key. +
Public KeyByteArray[32]3232The raw bytes of the Ed25519 public key.
+
+
Expiry Slotdata88The slot index at which the issuer deposit can be unlocked.
+
From 9c7befccdde041cef8d3aa8333f7d4b26a0337fb Mon Sep 17 00:00:00 2001 From: Philipp Gackstatter Date: Wed, 31 May 2023 09:56:50 +0200 Subject: [PATCH 024/140] Format markdown --- tips/TIP-0042/tip-0042.md | 294 ++++++++++++++++++++++---------------- 1 file changed, 168 insertions(+), 126 deletions(-) diff --git a/tips/TIP-0042/tip-0042.md b/tips/TIP-0042/tip-0042.md index 992e2c4c2..df27686d4 100644 --- a/tips/TIP-0042/tip-0042.md +++ b/tips/TIP-0042/tip-0042.md @@ -2,7 +2,9 @@ tip: 42 title: IOTA 2.0 UTXO Accounts description: Defines the IOTA 2.0 Account used to issue blocks onto the network -author: Philipp Gackstatter (@PhilippGackstatter) , Andrew Cullen (@cyberphysic4l) , Levente Pap (@lzpap) +author: + Philipp Gackstatter (@PhilippGackstatter) , Andrew Cullen (@cyberphysic4l) + , Levente Pap (@lzpap) discussions-to: TODO status: Draft type: Standards @@ -18,12 +20,12 @@ replaces: TIP-18 2. [Motivation](#motivation) 3. [Building Blocks](#building-blocks) 4. [Unlock Conditions](#unlock-conditions) - - [State Controller Address Unlock Condition](#state-controller-address-unlock-condition) - - [Governor Address Unlock Condition](#governor-address-unlock-condition) - - [Immutable Account Address Unlock Condition](#immutable-account-address-unlock-condition) - - [Account Locking & Unlocking](#account-locking--unlocking) + - [State Controller Address Unlock Condition](#state-controller-address-unlock-condition) + - [Governor Address Unlock Condition](#governor-address-unlock-condition) + - [Immutable Account Address Unlock Condition](#immutable-account-address-unlock-condition) + - [Account Locking & Unlocking](#account-locking--unlocking) 5. [Features](#features) - - [Block Issuer Feature](#block-issuer-feature) + - [Block Issuer Feature](#block-issuer-feature) 6. [Account Output](#account-output) 7. [Copyright](#copyright) @@ -35,26 +37,43 @@ The account is the central component of the IOTA 2.0 ledger that enables: - staking IOTA tokens for the validation of the network, - and secure ownership of all digital assets on the ledger. -It was originally defined as the Alias Output in [TIP-18](../TIP-0018/tip-0018.md). The Account Output represents a strict extension of the functionality of the Alias Output. +It was originally defined as the Alias Output in [TIP-18](../TIP-0018/tip-0018.md). The Account Output represents a +strict extension of the functionality of the Alias Output. ## Summary of changes compared to TIP-18 - Rename "Alias" to "Account". - Add _Block Issuer Feature_. - - Mana owned by an account with a _Block Issuer Feature_ is bound to that account and can only be moved out with a delay. - - Accounts with a Block Issuance Credit of less than zero cannot be unlocked until the balance is non-negative. + - Mana owned by an account with a _Block Issuer Feature_ is bound to that account and can only be moved out with a + delay. + - Accounts with a Block Issuance Credit of less than zero cannot be unlocked until the balance is non-negative. # Motivation -The goal of IOTA 2.0 is digital autonomy for everyone. Its incentivization model broadly consists of Mana and Staking. Mana is needed to write to the ledger, while staking is required for the protocol's security. Both of these mechanisms should follow the principle of Digital Autonomy, and the account is a manifestation of that principle on the IOTA ledger. +The goal of IOTA 2.0 is digital autonomy for everyone. Its incentivization model broadly consists of Mana and Staking. +Mana is needed to write to the ledger, while staking is required for the protocol's security. Both of these mechanisms +should follow the principle of Digital Autonomy, and the account is a manifestation of that principle on the IOTA +ledger. -Accounts are the central component of the IOTA 2.0 ledger and are central to the goal of digital autonomy. In DLTs, one can distinguish between natural and synthetic actors. Natural actors are those that directly benefit from utilizing the ledger and thus have a natural incentive to participate, while synthetic actors do not and instead need to be artificially incentivized to participate. Accounts enable natural actors to accumulate Mana from their IOTA tokens and burn it to issue blocks, making the network feeless for token holders. Account owners can therefore be their own block issuers rather than having to depend on a synthetic actor to publish their block, thus contributing to digital autonomy. +Accounts are the central component of the IOTA 2.0 ledger and are central to the goal of digital autonomy. In DLTs, one +can distinguish between natural and synthetic actors. Natural actors are those that directly benefit from utilizing the +ledger and thus have a natural incentive to participate, while synthetic actors do not and instead need to be +artificially incentivized to participate. Accounts enable natural actors to accumulate Mana from their IOTA tokens and +burn it to issue blocks, making the network feeless for token holders. Account owners can therefore be their own block +issuers rather than having to depend on a synthetic actor to publish their block, thus contributing to digital autonomy. -Next to block issuance, accounts are used for staking and delegation. Users can stake tokens from their account to become a validator in the protocol. Other users increase a validator's consensus weight by delegating to a staking account of their choice. Staking and delegation have low barriers to entry, as anyone can participate in the validation and no minimum stake is required. Stakers need to lock their tokens in order to become validators, increasing the committment to the security of the network. +Next to block issuance, accounts are used for staking and delegation. Users can stake tokens from their account to +become a validator in the protocol. Other users increase a validator's consensus weight by delegating to a staking +account of their choice. Staking and delegation have low barriers to entry, as anyone can participate in the validation +and no minimum stake is required. Stakers need to lock their tokens in order to become validators, increasing the +committment to the security of the network. -The account's keys in unlock conditions can be rotated, while its Account ID stays the same. With its ability to own other outputs, this means an improvement for both the security as well as the user experience, as a single account can be used to control all of a user's assets on the ledger. +The account's keys in unlock conditions can be rotated, while its Account ID stays the same. With its ability to own +other outputs, this means an improvement for both the security as well as the user experience, as a single account can +be used to control all of a user's assets on the ledger. -In summary, the account is the central component that enables the issuance of blocks, staking for validation and secure ownership of digital assets. +In summary, the account is the central component that enables the issuance of blocks, staking for validation and secure +ownership of digital assets. # Building Blocks @@ -64,7 +83,8 @@ Data types and subschemas used throughout this TIP are defined in [TIP-21](../TI ## Global Protocol Parameters -Global protocol parameters used throughout this TIP are defined in [TIP-22 (IOTA)](../TIP-0022/tip-0022.md) and [TIP-32 (Shimmer)](../TIP-0032/tip-0032.md). +Global protocol parameters used throughout this TIP are defined in [TIP-22 (IOTA)](../TIP-0022/tip-0022.md) and +[TIP-32 (Shimmer)](../TIP-0032/tip-0032.md). ## Transaction Payload @@ -72,17 +92,17 @@ Global protocol parameters used throughout this TIP are defined in [TIP-22 (IOTA # Unlock Conditions -New output features that introduce unlocking conditions, that is, they define constraints on how the output can -be unlocked and spent, are grouped under the field Unlock Conditions. +New output features that introduce unlocking conditions, that is, they define constraints on how the output can be +unlocked and spent, are grouped under the field Unlock Conditions. Each output **must not contain more than one unlock condition of each type** and not all unlock condition types are supported for each output type. ## State Controller Address Unlock Condition -An unlock condition defined solely for Account Output. It is functionally equivalent to an -Address Unlock Condition, however there are additional transition constraints defined for the Account UTXO state -machine that can only be carried out by the `State Controller Address`, hence the distinct unlock condition type. +An unlock condition defined solely for Account Output. It is functionally equivalent to an Address Unlock +Condition, however there are additional transition constraints defined for the Account UTXO state machine that can +only be carried out by the `State Controller Address`, hence the distinct unlock condition type.
State Controller Address Unlock @@ -182,9 +202,9 @@ The additional constraints are defined in [Account Output Design](#account-outpu ## Governor Address Unlock Condition -An unlock condition defined solely for Account Output. It is functionally equivalent to an -Address Unlock Condition, however there are additional transition constraints defined for the Account UTXO state -machine that can only be carried out by the `Governor Address`, hence the distinct unlock condition type. +An unlock condition defined solely for Account Output. It is functionally equivalent to an Address Unlock +Condition, however there are additional transition constraints defined for the Account UTXO state machine that can +only be carried out by the `Governor Address`, hence the distinct unlock condition type.
Governor Address Unlock @@ -287,8 +307,8 @@ The additional constraints are defined in [Account Output Design](#account-outpu An unlock condition defined for chain constrained UTXOs that can only be unlocked by a permanent Account Address. Output unlocking is functionally equivalent to an Address Unlock Condition with an Account Address, -however there are additional transition constraints: the next state of the UTXO machine must have the same -Immutable Account Address Unlock Condition. +however there are additional transition constraints: the next state of the UTXO machine must have the same Immutable +Account Address Unlock Condition.
Immutable Account Address Unlock Condition @@ -340,13 +360,15 @@ however there are additional transition constraints: the next state of the UTXO ### Additional semantic transaction validation rules: - - The output must be unlocked with an [Account Unlock](#account-unlock-semantic-validation). - - The next state of the UTXO state machine must have the same Immutable Account Address Unlock Condition defined. + +- The output must be unlocked with an [Account Unlock](#account-unlock-semantic-validation). +- The next state of the UTXO state machine must have the same Immutable Account Address Unlock Condition defined. ### Account Locking & Unlocking -A transaction may consume a (non-account) output that belongs to an Account Address by state transitioning the account output with the matching `Account ID`. This serves the exact same purpose as providing a signature -to unlock an output locked under a private key backed address, such as Ed25519 Addresses. +A transaction may consume a (non-account) output that belongs to an Account Address by state transitioning the +account output with the matching `Account ID`. This serves the exact same purpose as providing a signature to unlock an +output locked under a private key backed address, such as Ed25519 Addresses. On protocol level, account unlocking is done using a new unlock type, called **Account Unlock**. @@ -379,66 +401,84 @@ On protocol level, account unlocking is done using a new unlock type, called **A -This unlock is similar to the Reference Unlock. However, it is valid if and only if the input of the -transaction at index `Account Reference Unlock Index` is an account output with the same `Account ID` as the one derived from -the `Address` field of the to-be unlocked output. +This unlock is similar to the Reference Unlock. However, it is valid if and only if the input of the transaction +at index `Account Reference Unlock Index` is an account output with the same `Account ID` as the one derived from the +`Address` field of the to-be unlocked output. Additionally, the Account Unlocks must also be ordered to prevent circular dependencies: -If the i-th *Unlock* of a transaction is an *Account Unlock* and has `Account Reference Unlock Index` set to k, -it must hold that i > k. Hence, an Account Unlock can only reference an *Unlock* (unlocking the -corresponding account) at a smaller index. +If the i-th _Unlock_ of a transaction is an _Account Unlock_ and has `Account Reference Unlock Index` set to k, it must +hold that i > k. Hence, an Account Unlock can only reference an _Unlock_ (unlocking the corresponding account) at +a smaller index. For example the scenario where `Account A` is locked to the address of `Account B` while `Account B` is in locked to the -address of `Account A` introduces a circular dependency and is not well-defined. By requiring the *Unlocks* to be +address of `Account A` introduces a circular dependency and is not well-defined. By requiring the _Unlocks_ to be ordered as described above, a transaction consuming `Account A` as well as `Account B` can never be valid as there would -always need to be one *Account Unlock* referencing a greater index. +always need to be one _Account Unlock_ referencing a greater index. #### Account Unlock Syntactic Validation - - It must hold that 0 ≤ `Account Reference Unlock Index` < `Max Inputs Count`. +- It must hold that 0 ≤ `Account Reference Unlock Index` < `Max Inputs Count`. #### Account Unlock Semantic Validation - - The address of the unlocking condition of the input being unlocked must be an Account Address. - - The index `i` of the Account Unlock is the index of the input in the transaction that it unlocks. - `Account Reference Unlock Index` must be < `i`. - - `Account Reference Unlock Index` defines a previous input of the transaction and its unlock. This input must - be an Account Output with `Account ID` that refers to the Account Address being unlocked. - - The referenced Account Output must be unlocked for state transition. +- The address of the unlocking condition of the input being unlocked must be an Account Address. +- The index `i` of the Account Unlock is the index of the input in the transaction that it unlocks. + `Account Reference Unlock Index` must be < `i`. +- `Account Reference Unlock Index` defines a previous input of the transaction and its unlock. This input must be an + Account Output with `Account ID` that refers to the Account Address being unlocked. +- The referenced Account Output must be unlocked for state transition. # Features ## Block Issuer Feature -The presence of a Block Issuer Feature on an account signals that this account can issue blocks - it is an _issuer account_. This feature defines the public keys with which a signature to burn BIC from the containing account can be verified. The feature is locked to the account to disincentivize malicious behavior when issuing blocks. The feature can be unlocked with an expiration mechanism. Any mana generated or stored by an issuer account is locked to that account. +The presence of a Block Issuer Feature on an account signals that this account can issue blocks - it is an +_issuer account_. This feature defines the public keys with which a signature to burn BIC from the containing account +can be verified. The feature is locked to the account to disincentivize malicious behavior when issuing blocks. The +feature can be unlocked with an expiration mechanism. Any mana generated or stored by an issuer account is locked to +that account. ### Additional semantic transaction validation rule: -- When a Block Issuer Feature is present in an account input, the transaction is invalid if that block issuer has negative BIC balance. -- When a Block Issuer Feature is present in an account output and it was not present in the account input, or the account output represents the initial state of its UTXO state machine, the transaction that contains the account output is valid, if the following condition holds: - - `Expiry Slot >= Transaction Slot Index + Maximum Committable Age`, where `Transaction Slot Index` is the index of the slot to which the transaction belongs. -- When a Block Issuer Feature is present in an account output, the transaction that contains this output is valid, if all of the following conditions for the account output hold: - - `Amount >= Issuer Deposit`, which implies that the `Amount` must be at least the issuer deposit or the required storage deposit, whichever is higher. - - The following condition for Mana in the transaction holds for the account containing the feature: `TotalManaIn - AccountIn >= TotalManaOut - AccountOut`, where: - - `TotalManaIn` is the sum of all mana on the input side of the transaction. - - `TotalManaOut` is the sum of all mana on the output side of the transaction. - - `AccountIn = AccountIn_potential + AccountIn_stored`. - - `AccountOut = AccountOut_allotted + AccountOut_stored + AccountOut_locked`. - - `AccountIn_potential` is the decayed potential Mana generated by the `Amount` of the account input. - - `AccountIn_stored` is the decayed stored Mana of the account input. - - `AccountOut_allotted` is the amount of Mana allotted to the account. - - `AccountOut_stored` is the amount of Mana stored in the account. - - `AccountOut_locked` is the amount of Mana locked into outputs for which each output satisfies all of the following conditions: - - The output has a Timelock Unlock Condition containing a `Slot Index >= Transaction Slot Index + Maximum Committable Age`. - - The output has an Address Unlock Condition with the `Account Address` variant containing the input account's address. -- When a Block Issuer Feature is present in an account input containing `Expiry Slot >= Transaction Slot Index` the transaction that contains the account output is valid, if all of the following conditions for the account output hold: - - The account is not destroyed on the output side and retains its Block Issuer Feature. - - If either of the following conditions hold: - - The value of `Expiry Slot` on the account output matches the value of `Expiry Slot` on the account input. - - `Expiry Slot >= Transaction Slot Index + Maximum Committable Age` -- When a Block Issuer Feature is present in an account input with `Expiry Slot < Transaction Slot Index`, the transaction that contains the corresponding account output is valid, if either of the following conditions hold: + +- When a Block Issuer Feature is present in an account input, the transaction is invalid if that block issuer has + negative BIC balance. +- When a Block Issuer Feature is present in an account output and it was not present in the account input, or the + account output represents the initial state of its UTXO state machine, the transaction that contains the account + output is valid, if the following condition holds: + - `Expiry Slot >= Transaction Slot Index + Maximum Committable Age`, where `Transaction Slot Index` is the index of + the slot to which the transaction belongs. +- When a Block Issuer Feature is present in an account output, the transaction that contains this output is + valid, if all of the following conditions for the account output hold: + - `Amount >= Issuer Deposit`, which implies that the `Amount` must be at least the issuer deposit or the required + storage deposit, whichever is higher. + - The following condition for Mana in the transaction holds for the account containing the feature: + `TotalManaIn - AccountIn >= TotalManaOut - AccountOut`, where: + - `TotalManaIn` is the sum of all mana on the input side of the transaction. + - `TotalManaOut` is the sum of all mana on the output side of the transaction. + - `AccountIn = AccountIn_potential + AccountIn_stored`. + - `AccountOut = AccountOut_allotted + AccountOut_stored + AccountOut_locked`. + - `AccountIn_potential` is the decayed potential Mana generated by the `Amount` of the account input. + - `AccountIn_stored` is the decayed stored Mana of the account input. + - `AccountOut_allotted` is the amount of Mana allotted to the account. + - `AccountOut_stored` is the amount of Mana stored in the account. + - `AccountOut_locked` is the amount of Mana locked into outputs for which each output satisfies all of the following + conditions: + - The output has a Timelock Unlock Condition containing a + `Slot Index >= Transaction Slot Index + Maximum Committable Age`. + - The output has an Address Unlock Condition with the `Account Address` variant containing the input + account's address. +- When a Block Issuer Feature is present in an account input containing `Expiry Slot >= Transaction Slot Index` + the transaction that contains the account output is valid, if all of the following conditions for the account output + hold: + - The account is not destroyed on the output side and retains its Block Issuer Feature. + - If either of the following conditions hold: + - The value of `Expiry Slot` on the account output matches the value of `Expiry Slot` on the account input. - `Expiry Slot >= Transaction Slot Index + Maximum Committable Age` - - The Block Issuer Feature is removed in the account output. +- When a Block Issuer Feature is present in an account input with `Expiry Slot < Transaction Slot Index`, the + transaction that contains the corresponding account output is valid, if either of the following conditions hold: + - `Expiry Slot >= Transaction Slot Index + Maximum Committable Age` + - The Block Issuer Feature is removed in the account output.
Block Issuer Feature @@ -496,14 +536,14 @@ The presence of a Block Issuer Feature on an account signals that this ac # Account Output -The Account Output is a specific implementation of a UTXO state machine. `Account ID`, the unique identifier of an -instance of the deployed state machine, is generated deterministically by the protocol and is not allowed to change in -any future state transitions. +The Account Output is a specific implementation of a UTXO state machine. `Account ID`, the unique identifier of +an instance of the deployed state machine, is generated deterministically by the protocol and is not allowed to change +in any future state transitions. -Account Output represents an account in the ledger with two control levels and a permanent -Account Address. The account owns other outputs that are locked under Account Address. The account keeps -track of state transitions (`State Index` counter), controlled foundries (`Foundry Counter`) and anchors the layer 2 -state as metadata into the UTXO ledger. +Account Output represents an account in the ledger with two control levels and a permanent Account +Address. The account owns other outputs that are locked under Account Address. The account keeps track of +state transitions (`State Index` counter), controlled foundries (`Foundry Counter`) and anchors the layer 2 state as +metadata into the UTXO ledger.
@@ -1109,72 +1149,73 @@ state as metadata into the UTXO ledger. - `Feature Type` of a Feature in `Immutable Features` must define on of the following types: - Issuer Feature - Metadata Feature -- Features must be sorted in ascending order based on their `Feature Type` both in `Features` and `Immutable Features` - fields. +- Features must be sorted in ascending order based on their `Feature Type` both in `Features` and + `Immutable Features` fields. - Syntactic validation of all present features must pass. - When `Account ID` is zeroed out, `State Index` and `Foundry Counter` must be `0`. - `length(State Metadata)` must not be greater than `Max Metadata Length`. -- `Address` of State Controller Address Unlock Condition and `Address` of - Governor Address Unlock Condition must be different from the account address derived from `Account ID`. +- `Address` of State Controller Address Unlock Condition and `Address` of Governor Address Unlock + Condition must be different from the account address derived from `Account ID`. ## Additional Transaction Semantic Validation Rules - Explicit `Account ID`: `Account ID` is taken as the value of the `Account ID` field in the account output. -- Implicit `Account ID`: When an account output is consumed as an input in a transaction and `Account ID` field is zeroed out - while `State Index` and `Foundry Counter` are zero, take the BLAKE2b-256 hash of the `Output ID` of the input as - `Account ID`. -- For every non-zero explicit `Account ID` on the output side there must be a corresponding account on the input side. The - corresponding account has the explicit or implicit `Account ID` equal to that of the account on the output side. +- Implicit `Account ID`: When an account output is consumed as an input in a transaction and `Account ID` field is + zeroed out while `State Index` and `Foundry Counter` are zero, take the BLAKE2b-256 hash of the `Output ID` of the + input as `Account ID`. +- For every non-zero explicit `Account ID` on the output side there must be a corresponding account on the input side. + The corresponding account has the explicit or implicit `Account ID` equal to that of the account on the output side. ### Consumed Outputs -Whenever an account output is consumed in a transaction, it means that the account is transitioned into its next state. The -**current state** is defined as the **consumed account output**, while the **next state** is defined as the **account -output with the same explicit `AccountID` on the output side**. There are two types of transitions: `state transition` -and `governance transition`. +Whenever an account output is consumed in a transaction, it means that the account is transitioned into its next state. +The **current state** is defined as the **consumed account output**, while the **next state** is defined as the +**account output with the same explicit `AccountID` on the output side**. There are two types of transitions: +`state transition` and `governance transition`. + - State transition: - - A state transition is identified by an incremented `State Index`. - - The `State Index` must be incremented by 1. - - The unlock must correspond to the `Address` of State Controller Address Unlock Condition. - - State transition can only change the following fields in the next state: - - `IOTA Amount`, - - `Native Tokens`, - - `State Index`, - - `State Metadata`, - - `Foundry Counter` and - - `Sender Feature` in `Features`. - - `Foundry Counter` field must increase by the number of foundry outputs created in the transaction that map to - `Account ID`. The `Serial Number` fields of the created foundries must be the set of natural numbers that cover the - open-ended interval between the previous and next values of the `Foundry Counter` field in the account output. - - The created foundry outputs must be sorted in the list of outputs by their `Serial Number`. Note, that any - foundry that maps to `Account ID` and has a `Serial Number` that is less or equal to the `Foundry Counter` of the - input account is ignored when it comes to sorting. - - Newly created foundries in the transaction that map to different accounts can be interleaved when it comes to - sorting. + - A state transition is identified by an incremented `State Index`. + - The `State Index` must be incremented by 1. + - The unlock must correspond to the `Address` of State Controller Address Unlock Condition. + - State transition can only change the following fields in the next state: + - `IOTA Amount`, + - `Native Tokens`, + - `State Index`, + - `State Metadata`, + - `Foundry Counter` and + - `Sender Feature` in `Features`. + - `Foundry Counter` field must increase by the number of foundry outputs created in the transaction that map to + `Account ID`. The `Serial Number` fields of the created foundries must be the set of natural numbers that cover the + open-ended interval between the previous and next values of the `Foundry Counter` field in the account output. + - The created foundry outputs must be sorted in the list of outputs by their `Serial Number`. Note, that any foundry + that maps to `Account ID` and has a `Serial Number` that is less or equal to the `Foundry Counter` of the input + account is ignored when it comes to sorting. + - Newly created foundries in the transaction that map to different accounts can be interleaved when it comes to + sorting. - Governance transition: - - A governance transition is identified by an unchanged `State Index` in next state. If there is no account output on - the output side with a corresponding explicit `Account ID`, the account is being destroyed. The next state is the - empty state. - - The unlock must correspond to the `Address` of Governor Address Unlock Condition. - - Governance transition must only change the following fields: - - `Address` of State Controller Address Unlock Condition, - - `Address` of Governor Address Unlock Condition, - - `Metadata Feature`, `Sender Feature` and `Block Issuer Feature` in `Features`. - - The `Metadata Feature` is optional, the governor can put additional info about the chain here, for example chain - name, fee structure, supported VMs, list of access nodes, etc., anything that helps clients to fetch info (i.e. - account balances) about the layer 2 network. -- When a consumed account output has Features defined in `Immutable Features` and a corresponding account output on the - output side, `Immutable Features` is not allowed to change. + - A governance transition is identified by an unchanged `State Index` in next state. If there is no account output on + the output side with a corresponding explicit `Account ID`, the account is being destroyed. The next state is the + empty state. + - The unlock must correspond to the `Address` of Governor Address Unlock Condition. + - Governance transition must only change the following fields: + - `Address` of State Controller Address Unlock Condition, + - `Address` of Governor Address Unlock Condition, + - `Metadata Feature`, `Sender Feature` and `Block Issuer Feature` in `Features`. + - The `Metadata Feature` is optional, the governor can put additional info about the chain here, for example chain + name, fee structure, supported VMs, list of access nodes, etc., anything that helps clients to fetch info (i.e. + account balances) about the layer 2 network. +- When a consumed account output has Features defined in `Immutable Features` and a corresponding account output + on the output side, `Immutable Features` is not allowed to change. ### Created Outputs -- When Issuer Feature is present in an output and explicit `Account ID` is zeroed out, an input with `Address` field - that corresponds to `Issuer` must be unlocked in the transaction. +- When Issuer Feature is present in an output and explicit `Account ID` is zeroed out, an input with `Address` + field that corresponds to `Issuer` must be unlocked in the transaction. ### Storage Deposit Calculation -The storage deposit of Block Issuer Keys is higher than for other field types. Therefore, -the storage deposit calculation of account outputs defines an additional corresponding field type. +The storage deposit of Block Issuer Keys is higher than for other field types. Therefore, the storage deposit +calculation of account outputs defines an additional corresponding field type.
@@ -1996,13 +2037,14 @@ The following table shows the Account Output including the possible fields and t
### Notes + - Governor Address Unlock Condition field is made mandatory for now to help formal verification. When the same entity is defined for state and governance controllers, the output is self governed. Later, for compression reasons, it is possible to make the governance controller optional and define a self-governed account as one that does not have the governance Governor Address Unlock Condition set. - Indexers and node plugins shall map the account address of the output derived with `Account ID` to the regular - address -> output mapping table, so that given an Account Address, its most recent unspent account output - can be retrieved. + address -> output mapping table, so that given an Account Address, its most recent unspent account + output can be retrieved. # Copyright From a36926a6ff04d1cc19cafe679600db127379ec7c Mon Sep 17 00:00:00 2001 From: Philipp Gackstatter Date: Wed, 31 May 2023 22:34:21 +0200 Subject: [PATCH 025/140] Add `Block Issuer Keys Count` --- tips/TIP-0042/tip-0042.md | 48 +++++++++++++++++++++++++++------------ 1 file changed, 34 insertions(+), 14 deletions(-) diff --git a/tips/TIP-0042/tip-0042.md b/tips/TIP-0042/tip-0042.md index df27686d4..3adda2d67 100644 --- a/tips/TIP-0042/tip-0042.md +++ b/tips/TIP-0042/tip-0042.md @@ -439,9 +439,13 @@ can be verified. The feature is locked to the account to disincentivize maliciou feature can be unlocked with an expiration mechanism. Any mana generated or stored by an issuer account is locked to that account. -### Additional semantic transaction validation rule: +### Additional syntactic transaction validation rule -- When a Block Issuer Feature is present in an account input, the transaction is invalid if that block issuer has +- The following condition must hold: `Block Issuer Key Count >= 1`. + +### Additional semantic transaction validation rule + +- When a Block Issuer Feature is present in an account input, the transaction is invalid if that account has negative BIC balance. - When a Block Issuer Feature is present in an account output and it was not present in the account input, or the account output represents the initial state of its UTXO state machine, the transaction that contains the account @@ -500,6 +504,18 @@ that account. Set to value 4 to denote a Block Issuer Feature. + + Expiry Slot + uint64 + The slot index at which the Block Issuer Feature expires and can be removed. + + + Block Issuer Keys Count + uint8 + + The number of Block Issuer Keys. + + Block Issuer Keys anyOf @@ -527,11 +543,6 @@ that account.
- - Expiry Slot - uint64 - The slot index at which the issuer deposit can be unlocked. - # Account Output @@ -1812,6 +1823,22 @@ The following table shows the Account Output including the possible fields and t Set to value 4 to denote a Block Issuer Feature. + + Expiry Slot + data + 8 + 8 + The slot index at which the issuer deposit can be unlocked. + + + Block Issuer Keys Count + data + 1 + 1 + + The number of Block Issuer Keys. + + Block Issuer Keys anyOf @@ -1845,13 +1872,6 @@ The following table shows the Account Output including the possible fields and t
- - Expiry Slot - data - 8 - 8 - The slot index at which the issuer deposit can be unlocked. -
From 7b28bc99580abbfc1b5c803a07b4dc72d8e5df9d Mon Sep 17 00:00:00 2001 From: Andrew Cullen <45826600+cyberphysic4l@users.noreply.github.com> Date: Fri, 2 Jun 2023 16:27:26 +0100 Subject: [PATCH 026/140] update Mana/BIC wording --- tips/TIP-0042/tip-0042.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/tips/TIP-0042/tip-0042.md b/tips/TIP-0042/tip-0042.md index 3adda2d67..45656fa9c 100644 --- a/tips/TIP-0042/tip-0042.md +++ b/tips/TIP-0042/tip-0042.md @@ -33,7 +33,7 @@ replaces: TIP-18 The account is the central component of the IOTA 2.0 ledger that enables: -- issuance of blocks by burning block issuance credits, a downstream product of Mana, +- issuance of blocks by burning Mana, - staking IOTA tokens for the validation of the network, - and secure ownership of all digital assets on the ledger. @@ -434,7 +434,7 @@ always need to be one _Account Unlock_ referencing a greater index. ## Block Issuer Feature The presence of a Block Issuer Feature on an account signals that this account can issue blocks - it is an -_issuer account_. This feature defines the public keys with which a signature to burn BIC from the containing account +_issuer account_. This feature defines the public keys with which a signature to burn Mana from the containing account's Block Issuance Credit can be verified. The feature is locked to the account to disincentivize malicious behavior when issuing blocks. The feature can be unlocked with an expiration mechanism. Any mana generated or stored by an issuer account is locked to that account. @@ -446,7 +446,7 @@ that account. ### Additional semantic transaction validation rule - When a Block Issuer Feature is present in an account input, the transaction is invalid if that account has - negative BIC balance. + negative Block Issuance Credit. - When a Block Issuer Feature is present in an account output and it was not present in the account input, or the account output represents the initial state of its UTXO state machine, the transaction that contains the account output is valid, if the following condition holds: From a7d2f78f6819d1ca8408a6190c7ca2f10fbc5263 Mon Sep 17 00:00:00 2001 From: Andrew Cullen <45826600+cyberphysic4l@users.noreply.github.com> Date: Wed, 7 Jun 2023 08:48:35 +0100 Subject: [PATCH 027/140] remove mana amount less than supply check --- tips/TIP-0042/tip-0042.md | 1 - 1 file changed, 1 deletion(-) diff --git a/tips/TIP-0042/tip-0042.md b/tips/TIP-0042/tip-0042.md index 45656fa9c..8ccee9629 100644 --- a/tips/TIP-0042/tip-0042.md +++ b/tips/TIP-0042/tip-0042.md @@ -1139,7 +1139,6 @@ metadata into the UTXO ledger. - `Amount` field must fulfill the dust protection requirements and must not be `0`. - `Amount` field must be ≤ `Max IOTA Supply`. -- `Mana Amount` field must be ≤ `Total Mana`. - `Native Tokens Count` must not be greater than `Max Native Tokens Count`. - `Native Tokens` must be lexicographically sorted based on `Token ID`. - Each Native Token must be unique in the set of `Native Tokens` based on its `Token ID`. No duplicates are From 4289478c28599848eef8b521ec1f5d112b49ba4f Mon Sep 17 00:00:00 2001 From: Philipp Gackstatter Date: Fri, 16 Jun 2023 09:22:30 +0200 Subject: [PATCH 028/140] Update field type of Ed25519 public key --- tips/TIP-0042/tip-0042.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tips/TIP-0042/tip-0042.md b/tips/TIP-0042/tip-0042.md index 8ccee9629..054cdeb4e 100644 --- a/tips/TIP-0042/tip-0042.md +++ b/tips/TIP-0042/tip-0042.md @@ -1862,7 +1862,7 @@ The following table shows the Account Output including the possible fields and t Public Key - ByteArray[32] + block_issuer_key 32 32 The raw bytes of the Ed25519 public key. From 98beef9f1c27f42f0597124af7226e6e249f8978 Mon Sep 17 00:00:00 2001 From: Philipp Gackstatter Date: Fri, 16 Jun 2023 11:03:26 +0200 Subject: [PATCH 029/140] Add `Staking Feature` to the Account --- tips/TIP-0042/tip-0042.md | 105 ++++++++++++++++++++++++++++++++++++-- 1 file changed, 101 insertions(+), 4 deletions(-) diff --git a/tips/TIP-0042/tip-0042.md b/tips/TIP-0042/tip-0042.md index 054cdeb4e..916d6181f 100644 --- a/tips/TIP-0042/tip-0042.md +++ b/tips/TIP-0042/tip-0042.md @@ -26,6 +26,7 @@ replaces: TIP-18 - [Account Locking & Unlocking](#account-locking--unlocking) 5. [Features](#features) - [Block Issuer Feature](#block-issuer-feature) + - [Staking Feature](#staking-feature) 6. [Account Output](#account-output) 7. [Copyright](#copyright) @@ -434,10 +435,10 @@ always need to be one _Account Unlock_ referencing a greater index. ## Block Issuer Feature The presence of a Block Issuer Feature on an account signals that this account can issue blocks - it is an -_issuer account_. This feature defines the public keys with which a signature to burn Mana from the containing account's Block Issuance Credit -can be verified. The feature is locked to the account to disincentivize malicious behavior when issuing blocks. The -feature can be unlocked with an expiration mechanism. Any mana generated or stored by an issuer account is locked to -that account. +_issuer account_. This feature defines the public keys with which a signature to burn Mana from the containing account's +Block Issuance Credit can be verified. The feature is locked to the account to disincentivize malicious behavior when +issuing blocks. The feature can be unlocked with an expiration mechanism. Any mana generated or stored by an issuer +account is locked to that account. ### Additional syntactic transaction validation rule @@ -545,6 +546,102 @@ that account. +## Staking Feature + +The presence of a Staking Feature on an account signals that this account wants to participate in the validation +of the network. Accounts with this feature are also referred to as _stakers_ or _registered validators_ and are eligible +to be selected into the validator committee. Refer to [TIP-40](../TIP-0040/tip-0040.md) for details on Committee +Selection and Staking in general. + +The user-chosen amount of IOTA coins in the `Staked Amount` field of the feature is locked until `End Epoch`. The latter +can also be chosen freely, with the constraint that the locked funds must be _unbonded_ before they can be unlocked. +Since a staker has significant control over the rewards of the validator pool, formed by itself and its delegators, this +unbonding period is in place to protect delegators from stakers changing the rules without prior notice. Once a staker +goes into its unbonding period, delegators can be notified that a change is upcoming. Once an account has a Staking +Feature whose `End Epoch` is the current one or has passed, it is no longer considered for validator selection and the +Feature can be removed or updated. In the same transaction, the staker may claim their Mana Rewards for all epochs in +which they were selected to participate in the validator committee. + +### Additional syntactic transaction validation rule + +- The following condition must hold: `Staked Amount > 0`. + +### Additional semantic transaction validation rule + +- Let `Transaction Epoch Index` be the index of the epoch to which a transaction belongs. +- When a _Staking Feature_ is present in an account output on the output side of a transaction, the transaction that + contains this output is valid, if and only if all of the following conditions hold: + - If the Staking Feature was not present on the account input, all of the following conditions must hold: + - The `Amount` in the containing account output satisfies `Amount >= Staked Amount`. + - `Start Epoch` must be set to `Transaction Epoch Index`. + - `End Epoch` satisfies `End Epoch >= Transaction Epoch Index + Unbonding Period`. + - If the Staking Feature is present on the account input and `Transaction Epoch Index < End Epoch`, all of the + following conditions must hold: + - The `Amount` in the containing account output satisfies `Amount >= Staked Amount`. + - `Staked Amount` in the Staking Feature on the output is equal to `Staked Amount` in the Staking Feature on the + input. + - `Fixed Cost` in the Staking Feature on the output is equal to `Fixed Cost` in the Staking Feature on the input. + - `Start Epoch` in the Staking Feature on the output must be equal to `Start Epoch` in the Staking Feature on the + input. + - One of the following conditions holds: + - `End Epoch` in the Staking Feature on the output is equal to `End Epoch` in the Staking Feature on the input. + - `End Epoch` satisfies `End Epoch >= Transaction Epoch Index + Unbonding Period`. + - If the Staking Feature is present on the account input and `Transaction Epoch Index >= End Epoch`, either of the + following conditions must hold: + - One of the following conditions must hold: + - The Staking Feature is removed on the output side of the transaction and the Mana amount on the input side of + the transaction is increased by at most the amount defined in + [TIP-40 (Validator Rewards)](../TIP-0040/tip-0040.md#validator-rewards). + - All of the following conditions hold: + - The `Amount` in the containing account output satisfies `Amount >= Staked Amount`. + - `Start Epoch` is set to `Transaction Epoch Index`. + - `End Epoch` satisfies `End Epoch >= Transaction Epoch Index + Unbonding Period`. + - The Mana amount on the input side of the transaction is increased by at most the amount defined in + [TIP-40 (Validator Rewards)](../TIP-0040/tip-0040.md#validator-rewards). + - The fields `Staked Amount`, `Start Epoch`, `End Epoch` and `Fixed Cost` on the input and output side match. + +
+ Staking Feature +
+ Stakes IOTA coins to become eligible for committee selection, validate the network and receive Mana rewards. +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
Feature Typeuint8 + Set to value 5 to denote a Staking Feature. +
Staked Amountuint64The amount of IOTA coins that are locked and staked in the containing account.
Fixed CostTODO: uint64The fixed cost of the validator, which it receives as part of its Mana rewards.
Start Epochuint64The epoch index in which the staking started.
End Epochuint64The epoch index in which the staking ends.
+ # Account Output The Account Output is a specific implementation of a UTXO state machine. `Account ID`, the unique identifier of From a703a1970021bf4cd2b9df4835fb0920aad311ff Mon Sep 17 00:00:00 2001 From: Philipp Gackstatter Date: Fri, 16 Jun 2023 13:21:49 +0200 Subject: [PATCH 030/140] Remove fixed cost todo --- tips/TIP-0042/tip-0042.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tips/TIP-0042/tip-0042.md b/tips/TIP-0042/tip-0042.md index 916d6181f..63950bc40 100644 --- a/tips/TIP-0042/tip-0042.md +++ b/tips/TIP-0042/tip-0042.md @@ -627,7 +627,7 @@ which they were selected to participate in the validator committee. Fixed Cost - TODO: uint64 + uint64 The fixed cost of the validator, which it receives as part of its Mana rewards. From 52eb98364fb6e5eedf382c3b02575cad25cc5e28 Mon Sep 17 00:00:00 2001 From: Philipp Gackstatter Date: Tue, 20 Jun 2023 15:46:29 +0200 Subject: [PATCH 031/140] Update TX validation rules --- tips/TIP-0042/tip-0042.md | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/tips/TIP-0042/tip-0042.md b/tips/TIP-0042/tip-0042.md index 63950bc40..7be57df27 100644 --- a/tips/TIP-0042/tip-0042.md +++ b/tips/TIP-0042/tip-0042.md @@ -577,12 +577,9 @@ which they were selected to participate in the validator committee. - `End Epoch` satisfies `End Epoch >= Transaction Epoch Index + Unbonding Period`. - If the Staking Feature is present on the account input and `Transaction Epoch Index < End Epoch`, all of the following conditions must hold: + - A Staking Feature must be present on the corresponding account on the output side of the transaction. - The `Amount` in the containing account output satisfies `Amount >= Staked Amount`. - - `Staked Amount` in the Staking Feature on the output is equal to `Staked Amount` in the Staking Feature on the - input. - - `Fixed Cost` in the Staking Feature on the output is equal to `Fixed Cost` in the Staking Feature on the input. - - `Start Epoch` in the Staking Feature on the output must be equal to `Start Epoch` in the Staking Feature on the - input. + - The fields `Staked Amount`, `Start Epoch` and `Fixed Cost` on the feature on the input and the feature on the output side match. - One of the following conditions holds: - `End Epoch` in the Staking Feature on the output is equal to `End Epoch` in the Staking Feature on the input. - `End Epoch` satisfies `End Epoch >= Transaction Epoch Index + Unbonding Period`. @@ -593,12 +590,13 @@ which they were selected to participate in the validator committee. the transaction is increased by at most the amount defined in [TIP-40 (Validator Rewards)](../TIP-0040/tip-0040.md#validator-rewards). - All of the following conditions hold: + - A Staking Feature must be present on the corresponding account on the output side of the transaction. - The `Amount` in the containing account output satisfies `Amount >= Staked Amount`. - `Start Epoch` is set to `Transaction Epoch Index`. - `End Epoch` satisfies `End Epoch >= Transaction Epoch Index + Unbonding Period`. - The Mana amount on the input side of the transaction is increased by at most the amount defined in [TIP-40 (Validator Rewards)](../TIP-0040/tip-0040.md#validator-rewards). - - The fields `Staked Amount`, `Start Epoch`, `End Epoch` and `Fixed Cost` on the input and output side match. + - The fields `Staked Amount`, `Start Epoch`, `End Epoch` and `Fixed Cost` on the feature on the input and the feature on the output side match.
Staking Feature From a065949dac8125a8e53947bd6cd207c405046ace Mon Sep 17 00:00:00 2001 From: Philipp Gackstatter Date: Tue, 20 Jun 2023 19:13:29 +0200 Subject: [PATCH 032/140] Fix typo --- tips/TIP-0042/tip-0042.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tips/TIP-0042/tip-0042.md b/tips/TIP-0042/tip-0042.md index 7be57df27..0f36150e6 100644 --- a/tips/TIP-0042/tip-0042.md +++ b/tips/TIP-0042/tip-0042.md @@ -580,7 +580,7 @@ which they were selected to participate in the validator committee. - A Staking Feature must be present on the corresponding account on the output side of the transaction. - The `Amount` in the containing account output satisfies `Amount >= Staked Amount`. - The fields `Staked Amount`, `Start Epoch` and `Fixed Cost` on the feature on the input and the feature on the output side match. - - One of the following conditions holds: + - One of the following conditions hold: - `End Epoch` in the Staking Feature on the output is equal to `End Epoch` in the Staking Feature on the input. - `End Epoch` satisfies `End Epoch >= Transaction Epoch Index + Unbonding Period`. - If the Staking Feature is present on the account input and `Transaction Epoch Index >= End Epoch`, either of the From 7e7f555cc77d055eb346e0adaa33091e10611207 Mon Sep 17 00:00:00 2001 From: Philipp Gackstatter Date: Mon, 3 Jul 2023 11:21:08 +0200 Subject: [PATCH 033/140] Integrate Staking Feature in output; add deposit --- tips/TIP-0042/tip-0042.md | 215 +++++++++++++++++++++++++++++--------- 1 file changed, 164 insertions(+), 51 deletions(-) diff --git a/tips/TIP-0042/tip-0042.md b/tips/TIP-0042/tip-0042.md index 0f36150e6..beff9cfff 100644 --- a/tips/TIP-0042/tip-0042.md +++ b/tips/TIP-0042/tip-0042.md @@ -44,10 +44,16 @@ strict extension of the functionality of the Alias Output. ## Summary of changes compared to TIP-18 - Rename "Alias" to "Account". +- Add `Mana` field to the `Account`. - Add _Block Issuer Feature_. - Mana owned by an account with a _Block Issuer Feature_ is bound to that account and can only be moved out with a delay. - Accounts with a Block Issuance Credit of less than zero cannot be unlocked until the balance is non-negative. + - The block issuer keys in such a feature have a higher storage deposit. +- Add _Staking Feature_. + - Locks a certain amount of tokens to an account which makes the staker eligible to be selected into the validator + committee. + - The feature has a higher storage deposit than regular features. # Motivation @@ -579,7 +585,8 @@ which they were selected to participate in the validator committee. following conditions must hold: - A Staking Feature must be present on the corresponding account on the output side of the transaction. - The `Amount` in the containing account output satisfies `Amount >= Staked Amount`. - - The fields `Staked Amount`, `Start Epoch` and `Fixed Cost` on the feature on the input and the feature on the output side match. + - The fields `Staked Amount`, `Start Epoch` and `Fixed Cost` on the feature on the input and the feature on the + output side match. - One of the following conditions hold: - `End Epoch` in the Staking Feature on the output is equal to `End Epoch` in the Staking Feature on the input. - `End Epoch` satisfies `End Epoch >= Transaction Epoch Index + Unbonding Period`. @@ -596,7 +603,8 @@ which they were selected to participate in the validator committee. - `End Epoch` satisfies `End Epoch >= Transaction Epoch Index + Unbonding Period`. - The Mana amount on the input side of the transaction is increased by at most the amount defined in [TIP-40 (Validator Rewards)](../TIP-0040/tip-0040.md#validator-rewards). - - The fields `Staked Amount`, `Start Epoch`, `End Epoch` and `Fixed Cost` on the feature on the input and the feature on the output side match. + - The fields `Staked Amount`, `Start Epoch`, `End Epoch` and `Fixed Cost` on the feature on the input and the + feature on the output side match.
Staking Feature @@ -1050,50 +1058,97 @@ metadata into the UTXO ledger. Contains the public keys to verify block signatures and allows for unbonding the issuer deposit. - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
Feature Typeuint8 - Set to value 4 to denote a Block Issuer Feature. -
Block Issuer Keys anyOf -
- Ed25519 Public Key - - - - - - - - - - - - - - - - -
NameTypeDescription
Public Key Typeuint8 - Set to value 0 to denote an Ed25519 Public Key. -
Public KeyByteArray[32]The raw bytes of the Ed25519 public key.
-
-
Expiry Slotuint64The slot index at which the issuer deposit can be unlocked.
NameTypeDescription
Feature Typeuint8 + Set to value 4 to denote a Block Issuer Feature. +
Expiry Slotuint64The slot index at which the Block Issuer Feature expires and can be removed.
Block Issuer Keys Countuint8 + The number of Block Issuer Keys. +
Block Issuer Keys anyOf +
+ Ed25519 Public Key + + + + + + + + + + + + + + + + +
NameTypeDescription
Public Key Typeuint8 + Set to value 0 to denote an Ed25519 Public Key. +
Public KeyByteArray[32]The raw bytes of the Ed25519 public key.
+
+
+
+
+ Staking Feature +
+ Stakes IOTA coins to become eligible for committee selection, validate the network and receive Mana rewards. +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
Feature Typeuint8 + Set to value 5 to denote a Staking Feature. +
Staked Amountuint64The amount of IOTA coins that are locked and staked in the containing account.
Fixed Costuint64The fixed cost of the validator, which it receives as part of its Mana rewards.
Start Epochuint64The epoch index in which the staking started.
End Epochuint64The epoch index in which the staking ends.
@@ -1245,7 +1300,7 @@ metadata into the UTXO ledger. - Governor Address Unlock Condition - Unlock Conditions must be sorted in ascending order based on their `Unlock Condition Type`. - Syntactic validation of all present unlock conditions must pass. -- It must hold true that `0` ≤ `Features Count` ≤ `3`. +- It must hold true that `0` ≤ `Features Count` ≤ `4`. - `Feature Type` of a Feature in `Features` must define one of the following types: - Sender Feature - Metadata Feature @@ -1305,7 +1360,7 @@ The **current state** is defined as the **consumed account output**, while the * - Governance transition must only change the following fields: - `Address` of State Controller Address Unlock Condition, - `Address` of Governor Address Unlock Condition, - - `Metadata Feature`, `Sender Feature` and `Block Issuer Feature` in `Features`. + - `Metadata Feature`, `Sender Feature`, `Block Issuer Feature` and `Staking Feature` in `Features`. - The `Metadata Feature` is optional, the governor can put additional info about the chain here, for example chain name, fee structure, supported VMs, list of access nodes, etc., anything that helps clients to fetch info (i.e. account balances) about the layer 2 network. @@ -1332,10 +1387,16 @@ calculation of account outputs defines an additional corresponding field type. block_issuer_key A Block Issuer Key contained in a Block Issuer Feature. - 1000.0 + TODO: TBD A block issuer key needs to be kept in-memory for the efficient processing of incoming blocks and cannot be offloaded to disc. + + staking + Any field contained in a Staking Feature. + TODO: TBD + Staking requires additional bookkeeping in nodes for committee selection and mana rewards tracking. + The following table shows the Account Output including the possible fields and their specific weight. @@ -1968,6 +2029,58 @@ The following table shows the Account Output including the possible fields and t
+
+ Staking Feature +
+ Stakes IOTA coins to become eligible for committee selection, validate the network and receive Mana rewards. +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameField typeLength MinimumLength MaximumDescription
Feature Typestaking11 + Set to value 5 to denote a Staking Feature. +
Staked Amountstaking88The amount of IOTA coins that are locked and staked in the containing account.
Fixed Coststaking88The fixed cost of the validator, which it receives as part of its Mana rewards.
Start Epochstaking88The epoch index in which the staking started.
End Epochstaking88The epoch index in which the staking ends.
+
@@ -2139,11 +2252,11 @@ The following table shows the Account Output including the possible fields and t - v_byte Minimum + TODO: Update: v_byte Minimum 477 - v_byte Maximum + TODO: Update: v_byte Maximum 29641 From 76ca88f38b3e3205fa8746a71a4d99433bd805d8 Mon Sep 17 00:00:00 2001 From: Philipp Gackstatter Date: Tue, 4 Jul 2023 12:10:20 +0200 Subject: [PATCH 034/140] Add Block Issuer Feature requirement --- tips/TIP-0042/tip-0042.md | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/tips/TIP-0042/tip-0042.md b/tips/TIP-0042/tip-0042.md index beff9cfff..1bbd432fe 100644 --- a/tips/TIP-0042/tip-0042.md +++ b/tips/TIP-0042/tip-0042.md @@ -577,10 +577,11 @@ which they were selected to participate in the validator committee. - Let `Transaction Epoch Index` be the index of the epoch to which a transaction belongs. - When a _Staking Feature_ is present in an account output on the output side of a transaction, the transaction that contains this output is valid, if and only if all of the following conditions hold: + - A _Block Issuer Feature_ must be present in the account. - If the Staking Feature was not present on the account input, all of the following conditions must hold: - The `Amount` in the containing account output satisfies `Amount >= Staked Amount`. - `Start Epoch` must be set to `Transaction Epoch Index`. - - `End Epoch` satisfies `End Epoch >= Transaction Epoch Index + Unbonding Period`. + - `End Epoch` satisfies `End Epoch >= Transaction Epoch Index + Staking Unbonding Period`. - If the Staking Feature is present on the account input and `Transaction Epoch Index < End Epoch`, all of the following conditions must hold: - A Staking Feature must be present on the corresponding account on the output side of the transaction. @@ -589,7 +590,7 @@ which they were selected to participate in the validator committee. output side match. - One of the following conditions hold: - `End Epoch` in the Staking Feature on the output is equal to `End Epoch` in the Staking Feature on the input. - - `End Epoch` satisfies `End Epoch >= Transaction Epoch Index + Unbonding Period`. + - `End Epoch` satisfies `End Epoch >= Transaction Epoch Index + Staking Unbonding Period`. - If the Staking Feature is present on the account input and `Transaction Epoch Index >= End Epoch`, either of the following conditions must hold: - One of the following conditions must hold: @@ -600,7 +601,7 @@ which they were selected to participate in the validator committee. - A Staking Feature must be present on the corresponding account on the output side of the transaction. - The `Amount` in the containing account output satisfies `Amount >= Staked Amount`. - `Start Epoch` is set to `Transaction Epoch Index`. - - `End Epoch` satisfies `End Epoch >= Transaction Epoch Index + Unbonding Period`. + - `End Epoch` satisfies `End Epoch >= Transaction Epoch Index + Staking Unbonding Period`. - The Mana amount on the input side of the transaction is increased by at most the amount defined in [TIP-40 (Validator Rewards)](../TIP-0040/tip-0040.md#validator-rewards). - The fields `Staked Amount`, `Start Epoch`, `End Epoch` and `Fixed Cost` on the feature on the input and the From 2eaa8069360e705824204b105414afb28f73cb53 Mon Sep 17 00:00:00 2001 From: Philipp Gackstatter Date: Tue, 4 Jul 2023 12:36:27 +0200 Subject: [PATCH 035/140] Restructure Staking Feat val, allow acc. destruct. --- tips/TIP-0042/tip-0042.md | 43 +++++++++++++++++++++++---------------- 1 file changed, 26 insertions(+), 17 deletions(-) diff --git a/tips/TIP-0042/tip-0042.md b/tips/TIP-0042/tip-0042.md index 1bbd432fe..83be03c8f 100644 --- a/tips/TIP-0042/tip-0042.md +++ b/tips/TIP-0042/tip-0042.md @@ -489,7 +489,7 @@ account is locked to that account. - When a Block Issuer Feature is present in an account input with `Expiry Slot < Transaction Slot Index`, the transaction that contains the corresponding account output is valid, if either of the following conditions hold: - `Expiry Slot >= Transaction Slot Index + Maximum Committable Age` - - The Block Issuer Feature is removed in the account output. + - The Block Issuer Feature is removed in the account output or the account is destroyed.
Block Issuer Feature @@ -575,37 +575,46 @@ which they were selected to participate in the validator committee. ### Additional semantic transaction validation rule - Let `Transaction Epoch Index` be the index of the epoch to which a transaction belongs. +- When a _Staking Feature_ is present in an account output on the input or output side of a transaction, the transaction + that contains this output is valid, if and only if: + - A _Commitment Input_ is present. - When a _Staking Feature_ is present in an account output on the output side of a transaction, the transaction that contains this output is valid, if and only if all of the following conditions hold: - A _Block Issuer Feature_ must be present in the account. - - If the Staking Feature was not present on the account input, all of the following conditions must hold: - - The `Amount` in the containing account output satisfies `Amount >= Staked Amount`. - - `Start Epoch` must be set to `Transaction Epoch Index`. - - `End Epoch` satisfies `End Epoch >= Transaction Epoch Index + Staking Unbonding Period`. - - If the Staking Feature is present on the account input and `Transaction Epoch Index < End Epoch`, all of the - following conditions must hold: - - A Staking Feature must be present on the corresponding account on the output side of the transaction. +- When a _Staking Feature_ is present in an account output on the output side of a transaction and it was not present on + the input side, the transaction that contains this output is valid, if and only if all of the following conditions + hold: + - The `Amount` in the containing account output satisfies `Amount >= Staked Amount`. + - `Start Epoch` must be set to `Transaction Epoch Index`. + - `End Epoch` satisfies `End Epoch >= Transaction Epoch Index + Staking Unbonding Period`. +- When a _Staking Feature_ is present in an account output on the input side of a transaction, the transaction that + contains this input is valid, if and only if all of the following conditions hold: + - If `Transaction Epoch Index < End Epoch`, all of the following conditions must hold: + - A _Staking Feature_ must be present on the corresponding account on the output side of the transaction. - The `Amount` in the containing account output satisfies `Amount >= Staked Amount`. - The fields `Staked Amount`, `Start Epoch` and `Fixed Cost` on the feature on the input and the feature on the output side match. - One of the following conditions hold: - - `End Epoch` in the Staking Feature on the output is equal to `End Epoch` in the Staking Feature on the input. + - `End Epoch` in the _Staking Feature_ on the output is equal to `End Epoch` in the _Staking Feature_ on the + input. - `End Epoch` satisfies `End Epoch >= Transaction Epoch Index + Staking Unbonding Period`. - - If the Staking Feature is present on the account input and `Transaction Epoch Index >= End Epoch`, either of the - following conditions must hold: + - If `Transaction Epoch Index >= End Epoch`, either of the following conditions must hold: + - A _Staking Feature_ is present on the output side and the fields `Staked Amount`, `Start Epoch`, `End Epoch` and + `Fixed Cost` on the feature on the input side and the feature on the output side match. - One of the following conditions must hold: - - The Staking Feature is removed on the output side of the transaction and the Mana amount on the input side of - the transaction is increased by at most the amount defined in - [TIP-40 (Validator Rewards)](../TIP-0040/tip-0040.md#validator-rewards). - All of the following conditions hold: - - A Staking Feature must be present on the corresponding account on the output side of the transaction. + - The _Staking Feature_ is removed on the output side of the transaction or the account is destroyed. + - A _Reward Input_ must be present whose `Index` references the account input. + - The Mana amount on the input side of the transaction is increased by at most the amount defined in + [TIP-40 (Validator Rewards)](../TIP-0040/tip-0040.md#validator-rewards). + - All of the following conditions hold: + - A _Staking Feature_ must be present on the corresponding account on the output side of the transaction. - The `Amount` in the containing account output satisfies `Amount >= Staked Amount`. - `Start Epoch` is set to `Transaction Epoch Index`. - `End Epoch` satisfies `End Epoch >= Transaction Epoch Index + Staking Unbonding Period`. + - A _Reward Input_ must be present whose `Index` references the account input. - The Mana amount on the input side of the transaction is increased by at most the amount defined in [TIP-40 (Validator Rewards)](../TIP-0040/tip-0040.md#validator-rewards). - - The fields `Staked Amount`, `Start Epoch`, `End Epoch` and `Fixed Cost` on the feature on the input and the - feature on the output side match.
Staking Feature From c4f1e64ac79fa65a5f46eb81a0c533427ca11ca3 Mon Sep 17 00:00:00 2001 From: Philipp Gackstatter Date: Tue, 4 Jul 2023 12:39:02 +0200 Subject: [PATCH 036/140] Rename `Mana Amount` -> `Mana` --- tips/TIP-0042/tip-0042.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tips/TIP-0042/tip-0042.md b/tips/TIP-0042/tip-0042.md index 83be03c8f..05d143131 100644 --- a/tips/TIP-0042/tip-0042.md +++ b/tips/TIP-0042/tip-0042.md @@ -694,7 +694,7 @@ metadata into the UTXO ledger. The amount of IOTA coins held by the output. - Mana Amount + Mana uint64 The amount of (stored) Mana held by the output. @@ -1488,7 +1488,7 @@ The following table shows the Account Output including the possible fields and t The amount of IOTA coins held by the output. - Mana Amount + Mana data 8 8 From ae1ebb650e0dcb05f09d197b301939db2daf270a Mon Sep 17 00:00:00 2001 From: Philipp Gackstatter Date: Tue, 4 Jul 2023 13:07:32 +0200 Subject: [PATCH 037/140] Introduce past/future bounded epoch index --- tips/TIP-0042/tip-0042.md | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-) diff --git a/tips/TIP-0042/tip-0042.md b/tips/TIP-0042/tip-0042.md index 05d143131..97ab21b4d 100644 --- a/tips/TIP-0042/tip-0042.md +++ b/tips/TIP-0042/tip-0042.md @@ -574,7 +574,10 @@ which they were selected to participate in the validator committee. ### Additional semantic transaction validation rule -- Let `Transaction Epoch Index` be the index of the epoch to which a transaction belongs. +- Let `Future Bounded Epoch Index` be the epoch index corresponding to the slot index given by + `Slot Index + Min Committable Age` where `Slot Index` is the index of the commitment input. +- Let `Past Bounded Epoch Index` be the epoch index corresponding to the slot index given by + `Slot Index + Max Committable Age` where `Slot Index` is the index of the commitment input. - When a _Staking Feature_ is present in an account output on the input or output side of a transaction, the transaction that contains this output is valid, if and only if: - A _Commitment Input_ is present. @@ -585,11 +588,11 @@ which they were selected to participate in the validator committee. the input side, the transaction that contains this output is valid, if and only if all of the following conditions hold: - The `Amount` in the containing account output satisfies `Amount >= Staked Amount`. - - `Start Epoch` must be set to `Transaction Epoch Index`. - - `End Epoch` satisfies `End Epoch >= Transaction Epoch Index + Staking Unbonding Period`. + - `Start Epoch` must be set to `Past Bounded Epoch Index`. + - `End Epoch` satisfies `End Epoch >= Past Bounded Epoch Index + Staking Unbonding Period`. - When a _Staking Feature_ is present in an account output on the input side of a transaction, the transaction that contains this input is valid, if and only if all of the following conditions hold: - - If `Transaction Epoch Index < End Epoch`, all of the following conditions must hold: + - If `Future Bounded Epoch Index < End Epoch`, all of the following conditions must hold: - A _Staking Feature_ must be present on the corresponding account on the output side of the transaction. - The `Amount` in the containing account output satisfies `Amount >= Staked Amount`. - The fields `Staked Amount`, `Start Epoch` and `Fixed Cost` on the feature on the input and the feature on the @@ -597,8 +600,8 @@ which they were selected to participate in the validator committee. - One of the following conditions hold: - `End Epoch` in the _Staking Feature_ on the output is equal to `End Epoch` in the _Staking Feature_ on the input. - - `End Epoch` satisfies `End Epoch >= Transaction Epoch Index + Staking Unbonding Period`. - - If `Transaction Epoch Index >= End Epoch`, either of the following conditions must hold: + - `End Epoch` satisfies `End Epoch >= Past Bounded Epoch Index + Staking Unbonding Period`. + - If `Future Bounded Epoch Index >= End Epoch`, either of the following conditions must hold: - A _Staking Feature_ is present on the output side and the fields `Staked Amount`, `Start Epoch`, `End Epoch` and `Fixed Cost` on the feature on the input side and the feature on the output side match. - One of the following conditions must hold: @@ -610,8 +613,8 @@ which they were selected to participate in the validator committee. - All of the following conditions hold: - A _Staking Feature_ must be present on the corresponding account on the output side of the transaction. - The `Amount` in the containing account output satisfies `Amount >= Staked Amount`. - - `Start Epoch` is set to `Transaction Epoch Index`. - - `End Epoch` satisfies `End Epoch >= Transaction Epoch Index + Staking Unbonding Period`. + - `Start Epoch` is set to `Past Bounded Epoch Index`. + - `End Epoch` satisfies `End Epoch >= Past Bounded Epoch Index + Staking Unbonding Period`. - A _Reward Input_ must be present whose `Index` references the account input. - The Mana amount on the input side of the transaction is increased by at most the amount defined in [TIP-40 (Validator Rewards)](../TIP-0040/tip-0040.md#validator-rewards). From 7feb10078e44e78af7764e14f93151d01f1ce39d Mon Sep 17 00:00:00 2001 From: Philipp Gackstatter Date: Mon, 17 Jul 2023 09:48:47 +0200 Subject: [PATCH 038/140] Use past/future bounded slot indices for BIF --- tips/TIP-0042/tip-0042.md | 25 ++++++++++++++----------- 1 file changed, 14 insertions(+), 11 deletions(-) diff --git a/tips/TIP-0042/tip-0042.md b/tips/TIP-0042/tip-0042.md index 97ab21b4d..9cef0e9a6 100644 --- a/tips/TIP-0042/tip-0042.md +++ b/tips/TIP-0042/tip-0042.md @@ -452,13 +452,16 @@ account is locked to that account. ### Additional semantic transaction validation rule +- Let `Future Bounded Slot Index` be given by `Commitment Index + Min Committable Age` where `Commitment Index` is the + slot index of the commitment input. +- Let `Past Bounded Slot Index` be given by `Commitment Index + Max Committable Age` where `Commitment Index` is the + slot index of the commitment input. - When a Block Issuer Feature is present in an account input, the transaction is invalid if that account has negative Block Issuance Credit. - When a Block Issuer Feature is present in an account output and it was not present in the account input, or the account output represents the initial state of its UTXO state machine, the transaction that contains the account output is valid, if the following condition holds: - - `Expiry Slot >= Transaction Slot Index + Maximum Committable Age`, where `Transaction Slot Index` is the index of - the slot to which the transaction belongs. + - `Expiry Slot >= Past Bounded Slot Index + Maximum Committable Age`. - When a Block Issuer Feature is present in an account output, the transaction that contains this output is valid, if all of the following conditions for the account output hold: - `Amount >= Issuer Deposit`, which implies that the `Amount` must be at least the issuer deposit or the required @@ -476,19 +479,19 @@ account is locked to that account. - `AccountOut_locked` is the amount of Mana locked into outputs for which each output satisfies all of the following conditions: - The output has a Timelock Unlock Condition containing a - `Slot Index >= Transaction Slot Index + Maximum Committable Age`. + `Slot Index >= Past Bounded Slot Index + Maximum Committable Age`. - The output has an Address Unlock Condition with the `Account Address` variant containing the input account's address. -- When a Block Issuer Feature is present in an account input containing `Expiry Slot >= Transaction Slot Index` - the transaction that contains the account output is valid, if all of the following conditions for the account output - hold: +- When a Block Issuer Feature is present in an account input containing + `Expiry Slot >= Future Bounded Slot Index` the transaction that contains the account output is valid, if all of the + following conditions for the account output hold: - The account is not destroyed on the output side and retains its Block Issuer Feature. - If either of the following conditions hold: - The value of `Expiry Slot` on the account output matches the value of `Expiry Slot` on the account input. - - `Expiry Slot >= Transaction Slot Index + Maximum Committable Age` -- When a Block Issuer Feature is present in an account input with `Expiry Slot < Transaction Slot Index`, the + - `Expiry Slot >= Past Bounded Slot Index + Maximum Committable Age` +- When a Block Issuer Feature is present in an account input with `Expiry Slot < Future Bounded Slot Index`, the transaction that contains the corresponding account output is valid, if either of the following conditions hold: - - `Expiry Slot >= Transaction Slot Index + Maximum Committable Age` + - `Expiry Slot >= Past Bounded Slot Index + Maximum Committable Age` - The Block Issuer Feature is removed in the account output or the account is destroyed.
@@ -575,9 +578,9 @@ which they were selected to participate in the validator committee. ### Additional semantic transaction validation rule - Let `Future Bounded Epoch Index` be the epoch index corresponding to the slot index given by - `Slot Index + Min Committable Age` where `Slot Index` is the index of the commitment input. + `Commitment Index + Min Committable Age` where `Commitment Index` is the slot index of the commitment input. - Let `Past Bounded Epoch Index` be the epoch index corresponding to the slot index given by - `Slot Index + Max Committable Age` where `Slot Index` is the index of the commitment input. + `Commitment Index + Max Committable Age` where `Commitment Index` is the slot index of the commitment input. - When a _Staking Feature_ is present in an account output on the input or output side of a transaction, the transaction that contains this output is valid, if and only if: - A _Commitment Input_ is present. From ac87526d55221f6b32f60e91594870f1f0c74786 Mon Sep 17 00:00:00 2001 From: Philipp Gackstatter Date: Mon, 17 Jul 2023 12:42:19 +0200 Subject: [PATCH 039/140] Add commitment input constraint for BIF --- tips/TIP-0042/tip-0042.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/tips/TIP-0042/tip-0042.md b/tips/TIP-0042/tip-0042.md index 9cef0e9a6..b1fcafb4a 100644 --- a/tips/TIP-0042/tip-0042.md +++ b/tips/TIP-0042/tip-0042.md @@ -456,6 +456,9 @@ account is locked to that account. slot index of the commitment input. - Let `Past Bounded Slot Index` be given by `Commitment Index + Max Committable Age` where `Commitment Index` is the slot index of the commitment input. +- When a _Block Issuer Feature_ is present in an account on the input or output side of a transaction, the transaction + that contains this output is valid, if and only if: + - A _Commitment Input_ is present. - When a Block Issuer Feature is present in an account input, the transaction is invalid if that account has negative Block Issuance Credit. - When a Block Issuer Feature is present in an account output and it was not present in the account input, or the From a0e502d84076c70f6467aefe1ad96efbd6dc116f Mon Sep 17 00:00:00 2001 From: Philipp Gackstatter Date: Tue, 18 Jul 2023 13:58:55 +0200 Subject: [PATCH 040/140] Update time boundaries for Block Issuer Feature --- tips/TIP-0042/tip-0042.md | 15 ++++++--------- 1 file changed, 6 insertions(+), 9 deletions(-) diff --git a/tips/TIP-0042/tip-0042.md b/tips/TIP-0042/tip-0042.md index b1fcafb4a..97211accc 100644 --- a/tips/TIP-0042/tip-0042.md +++ b/tips/TIP-0042/tip-0042.md @@ -452,8 +452,6 @@ account is locked to that account. ### Additional semantic transaction validation rule -- Let `Future Bounded Slot Index` be given by `Commitment Index + Min Committable Age` where `Commitment Index` is the - slot index of the commitment input. - Let `Past Bounded Slot Index` be given by `Commitment Index + Max Committable Age` where `Commitment Index` is the slot index of the commitment input. - When a _Block Issuer Feature_ is present in an account on the input or output side of a transaction, the transaction @@ -464,7 +462,7 @@ account is locked to that account. - When a Block Issuer Feature is present in an account output and it was not present in the account input, or the account output represents the initial state of its UTXO state machine, the transaction that contains the account output is valid, if the following condition holds: - - `Expiry Slot >= Past Bounded Slot Index + Maximum Committable Age`. + - `Expiry Slot >= Past Bounded Slot Index`. - When a Block Issuer Feature is present in an account output, the transaction that contains this output is valid, if all of the following conditions for the account output hold: - `Amount >= Issuer Deposit`, which implies that the `Amount` must be at least the issuer deposit or the required @@ -485,16 +483,15 @@ account is locked to that account. `Slot Index >= Past Bounded Slot Index + Maximum Committable Age`. - The output has an Address Unlock Condition with the `Account Address` variant containing the input account's address. -- When a Block Issuer Feature is present in an account input containing - `Expiry Slot >= Future Bounded Slot Index` the transaction that contains the account output is valid, if all of the - following conditions for the account output hold: +- When a Block Issuer Feature is present in an account input containing `Expiry Slot >= Commitment Index` the + transaction that contains the account output is valid, if all of the following conditions for the account output hold: - The account is not destroyed on the output side and retains its Block Issuer Feature. - If either of the following conditions hold: - The value of `Expiry Slot` on the account output matches the value of `Expiry Slot` on the account input. - - `Expiry Slot >= Past Bounded Slot Index + Maximum Committable Age` -- When a Block Issuer Feature is present in an account input with `Expiry Slot < Future Bounded Slot Index`, the + - `Expiry Slot >= Past Bounded Slot Index` +- When a Block Issuer Feature is present in an account input with `Expiry Slot < Commitment Index`, the transaction that contains the corresponding account output is valid, if either of the following conditions hold: - - `Expiry Slot >= Past Bounded Slot Index + Maximum Committable Age` + - `Expiry Slot >= Past Bounded Slot Index` - The Block Issuer Feature is removed in the account output or the account is destroyed.
From 0dcdb00c1942fbc629196f32e853f457fe29c6bd Mon Sep 17 00:00:00 2001 From: Philipp Gackstatter Date: Wed, 19 Jul 2023 12:50:19 +0200 Subject: [PATCH 041/140] Constrain when staking feat can be removed --- tips/TIP-0042/tip-0042.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tips/TIP-0042/tip-0042.md b/tips/TIP-0042/tip-0042.md index 97211accc..eebca3685 100644 --- a/tips/TIP-0042/tip-0042.md +++ b/tips/TIP-0042/tip-0042.md @@ -595,7 +595,7 @@ which they were selected to participate in the validator committee. - `End Epoch` satisfies `End Epoch >= Past Bounded Epoch Index + Staking Unbonding Period`. - When a _Staking Feature_ is present in an account output on the input side of a transaction, the transaction that contains this input is valid, if and only if all of the following conditions hold: - - If `Future Bounded Epoch Index < End Epoch`, all of the following conditions must hold: + - If `Future Bounded Epoch Index <= End Epoch`, all of the following conditions must hold: - A _Staking Feature_ must be present on the corresponding account on the output side of the transaction. - The `Amount` in the containing account output satisfies `Amount >= Staked Amount`. - The fields `Staked Amount`, `Start Epoch` and `Fixed Cost` on the feature on the input and the feature on the @@ -604,7 +604,7 @@ which they were selected to participate in the validator committee. - `End Epoch` in the _Staking Feature_ on the output is equal to `End Epoch` in the _Staking Feature_ on the input. - `End Epoch` satisfies `End Epoch >= Past Bounded Epoch Index + Staking Unbonding Period`. - - If `Future Bounded Epoch Index >= End Epoch`, either of the following conditions must hold: + - If `Future Bounded Epoch Index > End Epoch`, either of the following conditions must hold: - A _Staking Feature_ is present on the output side and the fields `Staked Amount`, `Start Epoch`, `End Epoch` and `Fixed Cost` on the feature on the input side and the feature on the output side match. - One of the following conditions must hold: From adb40679155c118089c196b52e61bdeb180553a3 Mon Sep 17 00:00:00 2001 From: Philipp Gackstatter Date: Thu, 20 Jul 2023 16:10:55 +0200 Subject: [PATCH 042/140] Remove unnecessary staking feat syntax rule --- tips/TIP-0042/tip-0042.md | 4 ---- 1 file changed, 4 deletions(-) diff --git a/tips/TIP-0042/tip-0042.md b/tips/TIP-0042/tip-0042.md index eebca3685..1ce5e3e00 100644 --- a/tips/TIP-0042/tip-0042.md +++ b/tips/TIP-0042/tip-0042.md @@ -571,10 +571,6 @@ Feature whose `End Epoch` is the current one or has passed, it is no longer cons Feature can be removed or updated. In the same transaction, the staker may claim their Mana Rewards for all epochs in which they were selected to participate in the validator committee. -### Additional syntactic transaction validation rule - -- The following condition must hold: `Staked Amount > 0`. - ### Additional semantic transaction validation rule - Let `Future Bounded Epoch Index` be the epoch index corresponding to the slot index given by From 7cd1f6b653f744deb67493c6390ba422750deba7 Mon Sep 17 00:00:00 2001 From: Philipp Gackstatter Date: Thu, 20 Jul 2023 16:12:04 +0200 Subject: [PATCH 043/140] Add max block issuer keys count rule --- tips/TIP-0042/tip-0042.md | 1 + 1 file changed, 1 insertion(+) diff --git a/tips/TIP-0042/tip-0042.md b/tips/TIP-0042/tip-0042.md index 1ce5e3e00..165167100 100644 --- a/tips/TIP-0042/tip-0042.md +++ b/tips/TIP-0042/tip-0042.md @@ -449,6 +449,7 @@ account is locked to that account. ### Additional syntactic transaction validation rule - The following condition must hold: `Block Issuer Key Count >= 1`. +- The following condition must hold: `Block Issuer Key Count <= 128`. ### Additional semantic transaction validation rule From 865cbfcb66168a4b366377e29642e82155b83591 Mon Sep 17 00:00:00 2001 From: Philipp Gackstatter Date: Thu, 27 Jul 2023 15:21:38 +0200 Subject: [PATCH 044/140] Catch account ref unlock in syntactic validation --- tips/TIP-0042/tip-0042.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tips/TIP-0042/tip-0042.md b/tips/TIP-0042/tip-0042.md index 165167100..d2cd67f4b 100644 --- a/tips/TIP-0042/tip-0042.md +++ b/tips/TIP-0042/tip-0042.md @@ -425,7 +425,7 @@ always need to be one _Account Unlock_ referencing a greater index. #### Account Unlock Syntactic Validation -- It must hold that 0 ≤ `Account Reference Unlock Index` < `Max Inputs Count`. +- It must hold that 0 ≤ `Account Reference Unlock Index` < `Max Inputs Count - 1`. #### Account Unlock Semantic Validation From 6f62faecd51118a287b7300fe7de2fbe1891c25c Mon Sep 17 00:00:00 2001 From: Philipp Gackstatter Date: Wed, 2 Aug 2023 09:39:54 +0200 Subject: [PATCH 045/140] Prettify bullet point summary --- tips/TIP-0042/tip-0042.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/tips/TIP-0042/tip-0042.md b/tips/TIP-0042/tip-0042.md index d2cd67f4b..2678a0c51 100644 --- a/tips/TIP-0042/tip-0042.md +++ b/tips/TIP-0042/tip-0042.md @@ -34,9 +34,9 @@ replaces: TIP-18 The account is the central component of the IOTA 2.0 ledger that enables: -- issuance of blocks by burning Mana, -- staking IOTA tokens for the validation of the network, -- and secure ownership of all digital assets on the ledger. +- Issuance of blocks by burning Mana. +- Staking IOTA tokens for the validation of the network. +- Secure ownership of all digital assets on the ledger. It was originally defined as the Alias Output in [TIP-18](../TIP-0018/tip-0018.md). The Account Output represents a strict extension of the functionality of the Alias Output. From 5550dd8e4b7b13e514f0834dd7a4f7ccda0fe21d Mon Sep 17 00:00:00 2001 From: Philipp Gackstatter Date: Thu, 3 Aug 2023 13:08:51 +0200 Subject: [PATCH 046/140] Add uniqueness constraint for block issuer keys --- tips/TIP-0042/tip-0042.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/tips/TIP-0042/tip-0042.md b/tips/TIP-0042/tip-0042.md index 2678a0c51..d69b524b4 100644 --- a/tips/TIP-0042/tip-0042.md +++ b/tips/TIP-0042/tip-0042.md @@ -450,6 +450,8 @@ account is locked to that account. - The following condition must hold: `Block Issuer Key Count >= 1`. - The following condition must hold: `Block Issuer Key Count <= 128`. +- The following condition must hold: Each key in `Block Issuer Keys` must be unique based on its `Public Key`. No + duplicates are allowed. ### Additional semantic transaction validation rule From 79e9b7ca996a23215093ff2d707fd80dd36f8158 Mon Sep 17 00:00:00 2001 From: Philipp Gackstatter Date: Thu, 3 Aug 2023 13:19:20 +0200 Subject: [PATCH 047/140] Add lexicographic order for block issuer keys --- tips/TIP-0042/tip-0042.md | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/tips/TIP-0042/tip-0042.md b/tips/TIP-0042/tip-0042.md index d69b524b4..d06b0c13b 100644 --- a/tips/TIP-0042/tip-0042.md +++ b/tips/TIP-0042/tip-0042.md @@ -448,10 +448,11 @@ account is locked to that account. ### Additional syntactic transaction validation rule -- The following condition must hold: `Block Issuer Key Count >= 1`. -- The following condition must hold: `Block Issuer Key Count <= 128`. -- The following condition must hold: Each key in `Block Issuer Keys` must be unique based on its `Public Key`. No - duplicates are allowed. +- The following conditions must all hold: + - `Block Issuer Key Count >= 1`. + - `Block Issuer Key Count <= 128`. + - Each key in `Block Issuer Keys` must be unique based on its `Public Key`. No duplicates are allowed. + - Each key in `Block Issuer Keys` must be lexicographically ordered based on its `Public Key`. ### Additional semantic transaction validation rule From 44650fe78348ba40a91177570659bef8a54dba31 Mon Sep 17 00:00:00 2001 From: Philipp Gackstatter Date: Tue, 15 Aug 2023 10:49:53 +0200 Subject: [PATCH 048/140] Update storage deposit calculation offset --- tips/TIP-0042/tip-0042.md | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/tips/TIP-0042/tip-0042.md b/tips/TIP-0042/tip-0042.md index d06b0c13b..575047baf 100644 --- a/tips/TIP-0042/tip-0042.md +++ b/tips/TIP-0042/tip-0042.md @@ -1445,23 +1445,23 @@ The following table shows the Account Output including the possible fields and t Block ID (included) data - 32 - 32 + 40 + 40 The ID of the block in which the transaction payload that created this output was included. - Confirmation Milestone Index + Slot Booked data - 4 - 4 - The index of the milestone which confirmed the transaction that created the output. + 8 + 8 + The index of the slot in which the transaction that created it was booked. - Confirmation Unix Timestamp + Slot Created data - 4 - 4 - The unix timestamp of the milestone which confirmed the transaction that created the output. + 8 + 8 + The index of the slot in which the transaction was created. From 352da066f64f29283c2b8f9606daac8302d92daf Mon Sep 17 00:00:00 2001 From: Philipp Gackstatter Date: Wed, 16 Aug 2023 14:09:39 +0200 Subject: [PATCH 049/140] Fix feature permissions of governor / state ctrl --- tips/TIP-0042/tip-0042.md | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/tips/TIP-0042/tip-0042.md b/tips/TIP-0042/tip-0042.md index 575047baf..6eeba398e 100644 --- a/tips/TIP-0042/tip-0042.md +++ b/tips/TIP-0042/tip-0042.md @@ -461,6 +461,7 @@ account is locked to that account. - When a _Block Issuer Feature_ is present in an account on the input or output side of a transaction, the transaction that contains this output is valid, if and only if: - A _Commitment Input_ is present. + - A _Block Issuance Credit Input_ is present whose `Account ID` equals that of the account being state transitioned. - When a Block Issuer Feature is present in an account input, the transaction is invalid if that account has negative Block Issuance Credit. - When a Block Issuer Feature is present in an account output and it was not present in the account input, or the @@ -1358,8 +1359,9 @@ The **current state** is defined as the **consumed account output**, while the * - `Native Tokens`, - `State Index`, - `State Metadata`, - - `Foundry Counter` and - - `Sender Feature` in `Features`. + - `Foundry Counter`, + - `Sender Feature` in `Features` and + - `Staking Feature` in `Features`. - `Foundry Counter` field must increase by the number of foundry outputs created in the transaction that map to `Account ID`. The `Serial Number` fields of the created foundries must be the set of natural numbers that cover the open-ended interval between the previous and next values of the `Foundry Counter` field in the account output. @@ -1376,7 +1378,7 @@ The **current state** is defined as the **consumed account output**, while the * - Governance transition must only change the following fields: - `Address` of State Controller Address Unlock Condition, - `Address` of Governor Address Unlock Condition, - - `Metadata Feature`, `Sender Feature`, `Block Issuer Feature` and `Staking Feature` in `Features`. + - `Metadata Feature`, `Sender Feature`, `Block Issuer Feature` in `Features`. - The `Metadata Feature` is optional, the governor can put additional info about the chain here, for example chain name, fee structure, supported VMs, list of access nodes, etc., anything that helps clients to fetch info (i.e. account balances) about the layer 2 network. From 7531b1948886f71a5cc6fd1da1741c34ee1e4889 Mon Sep 17 00:00:00 2001 From: Philipp Gackstatter Date: Tue, 5 Sep 2023 14:36:00 +0200 Subject: [PATCH 050/140] Clarify block issuer key order & uniqueness --- tips/TIP-0042/tip-0042.md | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/tips/TIP-0042/tip-0042.md b/tips/TIP-0042/tip-0042.md index 6eeba398e..a06fa0f98 100644 --- a/tips/TIP-0042/tip-0042.md +++ b/tips/TIP-0042/tip-0042.md @@ -451,8 +451,10 @@ account is locked to that account. - The following conditions must all hold: - `Block Issuer Key Count >= 1`. - `Block Issuer Key Count <= 128`. - - Each key in `Block Issuer Keys` must be unique based on its `Public Key`. No duplicates are allowed. - - Each key in `Block Issuer Keys` must be lexicographically ordered based on its `Public Key`. + - Each key in `Block Issuer Keys` must be unique based on the concatenation of its `Public Key Type` and `Public Key`. + No duplicates are allowed. + - Each key in `Block Issuer Keys` must be lexicographically ordered based on the concatenation of its + `Public Key Type` and `Public Key`. ### Additional semantic transaction validation rule From ee4b090cd6d89668efab09ce79b51fa05e9c719f Mon Sep 17 00:00:00 2001 From: Philipp Gackstatter Date: Tue, 5 Sep 2023 15:42:08 +0200 Subject: [PATCH 051/140] Add implicit account TX validation rules --- tips/TIP-0042/tip-0042.md | 55 ++++++++++++++++++++++++++++++++++++++- 1 file changed, 54 insertions(+), 1 deletion(-) diff --git a/tips/TIP-0042/tip-0042.md b/tips/TIP-0042/tip-0042.md index a06fa0f98..a648bdded 100644 --- a/tips/TIP-0042/tip-0042.md +++ b/tips/TIP-0042/tip-0042.md @@ -465,7 +465,7 @@ account is locked to that account. - A _Commitment Input_ is present. - A _Block Issuance Credit Input_ is present whose `Account ID` equals that of the account being state transitioned. - When a Block Issuer Feature is present in an account input, the transaction is invalid if that account has - negative Block Issuance Credit. + negative Block Issuance Credit, whose value is taken from the _Block Issuance Credit Input_. - When a Block Issuer Feature is present in an account output and it was not present in the account input, or the account output represents the initial state of its UTXO state machine, the transaction that contains the account output is valid, if the following condition holds: @@ -2293,6 +2293,59 @@ The following table shows the Account Output including the possible fields and t address -> output mapping table, so that given an Account Address, its most recent unspent account output can be retrieved. +### Implicit Account + +An implicit account is defined as a Basic Output owned by an _implicit account address_, defined in +[TIP-50](../TIP-0050/tip-0050.md). Its only purpose and functionality is to be converted to a regular account. + +#### Creation Semantic Transaction Validation Rules + +To create an implicit account, a Basic Output is created on the output side of a transaction and the `Address` in the +`Address Unlock Condition` is set to an address with the implicit account flag set, according to TIP-50. + +- If an output in a transaction contains an unlock condition with an implicit account address that output is referred to + as an `Implicit Account` and the transaction is valid only if all of the following conditions hold: + - The unlock condition on the `Implicit Account` is of type `Address Unlock Condition`. + - No other unlock conditions are present on the `Implicit Account`, that is, `Unlock Conditions Count == 1`. + - The `Implicit Account` is of type `Basic Output`. + - The `Implicit Account` holds no Native Tokens, that is, `Native Tokens Count == 1`. + - TOOD: Should we disallow features? Probably okay to allow. + - It must hold for the `Amount` of the `Implicit Account`: + `Amount >= Storage Deposit of Minimal Account Output with Block Issuer Feature (TODO: Calculate)` + - It must hold for the `Mana` on the `Implicit Account`: `Mana >= RMC Min * factor` (TODO: Define factor). + +#### Conversion Semantic Transaction Validation Rules + +To convert an implicit account to an account, a block can be issued using the implicit account as the block issuer, +containing a transaction that consumes the implicit account on the input side and creates an account output on the +output side. Since an implicit account can issue blocks, some of the requirements of a block issuer account apply to +accounts as well, as defined below. + +- The account ID of an `Implicit Account` is refered to as `Implicit Account ID` and is the BLAKE2b-256 hash of the + Output ID of the `Implicit Account`. +- If a transaction contains an input with an unlock condition containing an implicit account address, the transaction is + only valid if all of the following conditions hold: + - An `Explicit Account` is created on the output side, which is an Account Output with its `Account ID` set to the + `Implicit Account ID`. + - The `Explicit Account` has a Block Issuer Feature. + - It must hold that the value of the `Mana` on the `Explicit Account` is at least the value of the `Mana` on the + `Implicit Account`. + - A _Commitment Input_ is present. + - A _Block Issuance Credit Input_ is present whose _Account ID_ equals the `Implicit Account ID`. + - The transaction is invalid if the `Implicit Account` has negative Block Issuance Credit whose value is taken from + the _Block Issuance Credit Input_. + +# Rationale & Alternatives + +## Implicit Accounts + +The rationale for having implicit accounts is that first-time users in a network usually receive funds in Basic Outputs +rather than Account Outputs. This leaves them unable to issue blocks since an Account with a Block Issuer Feature is +required to do so. Implicit Accounts give those users a permissionless way to create their account with the only +requirement being owned funds in an output. + +TODO: Justify initial Mana deposit. + # Copyright Copyright and related rights waived via [CC0](https://creativecommons.org/publicdomain/zero/1.0/). From d9a54fa19fd31754d48d53d31cfbec11bc418323 Mon Sep 17 00:00:00 2001 From: Philipp Gackstatter Date: Tue, 5 Sep 2023 15:43:02 +0200 Subject: [PATCH 052/140] Add implicit account to ToC --- tips/TIP-0042/tip-0042.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/tips/TIP-0042/tip-0042.md b/tips/TIP-0042/tip-0042.md index a648bdded..911e77987 100644 --- a/tips/TIP-0042/tip-0042.md +++ b/tips/TIP-0042/tip-0042.md @@ -28,7 +28,8 @@ replaces: TIP-18 - [Block Issuer Feature](#block-issuer-feature) - [Staking Feature](#staking-feature) 6. [Account Output](#account-output) -7. [Copyright](#copyright) +7. [Implicit Account](#implicit-account) +8. [Copyright](#copyright) # Summary From 8b4496f2eedd8ad9b90a13a3fa57d4c01c2099c2 Mon Sep 17 00:00:00 2001 From: Philipp Gackstatter Date: Tue, 5 Sep 2023 16:22:44 +0200 Subject: [PATCH 053/140] Correct Native Tokens Count requirement --- tips/TIP-0042/tip-0042.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tips/TIP-0042/tip-0042.md b/tips/TIP-0042/tip-0042.md index 911e77987..427f51ed2 100644 --- a/tips/TIP-0042/tip-0042.md +++ b/tips/TIP-0042/tip-0042.md @@ -2309,7 +2309,7 @@ To create an implicit account, a Basic Output is created on the output side of a - The unlock condition on the `Implicit Account` is of type `Address Unlock Condition`. - No other unlock conditions are present on the `Implicit Account`, that is, `Unlock Conditions Count == 1`. - The `Implicit Account` is of type `Basic Output`. - - The `Implicit Account` holds no Native Tokens, that is, `Native Tokens Count == 1`. + - The `Implicit Account` holds no Native Tokens, that is, `Native Tokens Count == 0`. - TOOD: Should we disallow features? Probably okay to allow. - It must hold for the `Amount` of the `Implicit Account`: `Amount >= Storage Deposit of Minimal Account Output with Block Issuer Feature (TODO: Calculate)` From 8891f127916069c5f640e8975646aa9fac87ccfd Mon Sep 17 00:00:00 2001 From: Philipp Gackstatter Date: Tue, 5 Sep 2023 16:24:51 +0200 Subject: [PATCH 054/140] Improve implicit account id description --- tips/TIP-0042/tip-0042.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tips/TIP-0042/tip-0042.md b/tips/TIP-0042/tip-0042.md index 427f51ed2..3eff757a0 100644 --- a/tips/TIP-0042/tip-0042.md +++ b/tips/TIP-0042/tip-0042.md @@ -2323,7 +2323,7 @@ output side. Since an implicit account can issue blocks, some of the requirement accounts as well, as defined below. - The account ID of an `Implicit Account` is refered to as `Implicit Account ID` and is the BLAKE2b-256 hash of the - Output ID of the `Implicit Account`. + Output ID of the Basic Output that represents the `Implicit Account`. - If a transaction contains an input with an unlock condition containing an implicit account address, the transaction is only valid if all of the following conditions hold: - An `Explicit Account` is created on the output side, which is an Account Output with its `Account ID` set to the From ba27c26b918b32ae1e22a54673172943e19c27a8 Mon Sep 17 00:00:00 2001 From: Philipp Gackstatter Date: Tue, 5 Sep 2023 16:29:25 +0200 Subject: [PATCH 055/140] Also require potential mana to be transferred --- tips/TIP-0042/tip-0042.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tips/TIP-0042/tip-0042.md b/tips/TIP-0042/tip-0042.md index 3eff757a0..62960a3b6 100644 --- a/tips/TIP-0042/tip-0042.md +++ b/tips/TIP-0042/tip-0042.md @@ -2330,7 +2330,7 @@ accounts as well, as defined below. `Implicit Account ID`. - The `Explicit Account` has a Block Issuer Feature. - It must hold that the value of the `Mana` on the `Explicit Account` is at least the value of the `Mana` on the - `Implicit Account`. + `Implicit Account` plus the potential Mana generated by the `Implicit Account`. - A _Commitment Input_ is present. - A _Block Issuance Credit Input_ is present whose _Account ID_ equals the `Implicit Account ID`. - The transaction is invalid if the `Implicit Account` has negative Block Issuance Credit whose value is taken from From ef53dc7b336d7ff9a5d511d8c500516b736a7b70 Mon Sep 17 00:00:00 2001 From: Philipp Gackstatter Date: Fri, 8 Sep 2023 15:02:45 +0200 Subject: [PATCH 056/140] Polish implicit account creation --- tips/TIP-0042/tip-0042.md | 28 +++++++++++++++------------- 1 file changed, 15 insertions(+), 13 deletions(-) diff --git a/tips/TIP-0042/tip-0042.md b/tips/TIP-0042/tip-0042.md index 62960a3b6..27ddaa063 100644 --- a/tips/TIP-0042/tip-0042.md +++ b/tips/TIP-0042/tip-0042.md @@ -2296,23 +2296,23 @@ The following table shows the Account Output including the possible fields and t ### Implicit Account -An implicit account is defined as a Basic Output owned by an _implicit account address_, defined in -[TIP-50](../TIP-0050/tip-0050.md). Its only purpose and functionality is to be converted to a regular account. +An _Implicit Account_ is defined as a Basic Output owned by an _Implicit Account Creation Address_, defined in +[TIP-50](../TIP-0050/tip-0050.md#implicit-account-creation-address). Its only purpose and functionality is to be +converted to a regular account. #### Creation Semantic Transaction Validation Rules To create an implicit account, a Basic Output is created on the output side of a transaction and the `Address` in the -`Address Unlock Condition` is set to an address with the implicit account flag set, according to TIP-50. +`Address Unlock Condition` is set to an address of type _Implicit Account Creation Address_. -- If an output in a transaction contains an unlock condition with an implicit account address that output is referred to - as an `Implicit Account` and the transaction is valid only if all of the following conditions hold: - - The unlock condition on the `Implicit Account` is of type `Address Unlock Condition`. - - No other unlock conditions are present on the `Implicit Account`, that is, `Unlock Conditions Count == 1`. +- If an output in a transaction contains an unlock condition with an implicit account address, that output is referred + to as an `Implicit Account`, and the transaction is valid only if all of the following conditions hold: - The `Implicit Account` is of type `Basic Output`. - - The `Implicit Account` holds no Native Tokens, that is, `Native Tokens Count == 0`. - - TOOD: Should we disallow features? Probably okay to allow. + - The `Implicit Account`'s `Unlock Conditions Count == 1`. + - The unlock condition on the `Implicit Account` is of type `Address Unlock Condition`. + - The `Implicit Account`'s `Native Tokens Count == 0`. - It must hold for the `Amount` of the `Implicit Account`: - `Amount >= Storage Deposit of Minimal Account Output with Block Issuer Feature (TODO: Calculate)` + `Amount >= Storage Deposit of Minimal Account Output with Block Issuer Feature` (TODO: Calculate) - It must hold for the `Mana` on the `Implicit Account`: `Mana >= RMC Min * factor` (TODO: Define factor). #### Conversion Semantic Transaction Validation Rules @@ -2326,9 +2326,11 @@ accounts as well, as defined below. Output ID of the Basic Output that represents the `Implicit Account`. - If a transaction contains an input with an unlock condition containing an implicit account address, the transaction is only valid if all of the following conditions hold: - - An `Explicit Account` is created on the output side, which is an Account Output with its `Account ID` set to the - `Implicit Account ID`. - - The `Explicit Account` has a Block Issuer Feature. + - An `Account` Output is created on the output side, for which all of the following conditions hold: + - TODO: Fix confusion between implicit account id mentioned here and further above in the account TX section. + - It must hold that the value of the `Mana` on the `Explicit Account` is at least the value of the `Mana` on the `Implicit Account` plus the potential Mana generated by the `Implicit Account`. - A _Commitment Input_ is present. From 9e4d4c9bed8cc8aa25a32da958e7867ca85ff9a4 Mon Sep 17 00:00:00 2001 From: Philipp Gackstatter Date: Mon, 11 Sep 2023 11:46:57 +0200 Subject: [PATCH 057/140] Fix implicit account validation rules --- tips/TIP-0042/tip-0042.md | 28 +++++++++++++++++----------- 1 file changed, 17 insertions(+), 11 deletions(-) diff --git a/tips/TIP-0042/tip-0042.md b/tips/TIP-0042/tip-0042.md index 27ddaa063..51a49b1bb 100644 --- a/tips/TIP-0042/tip-0042.md +++ b/tips/TIP-0042/tip-0042.md @@ -1342,7 +1342,8 @@ metadata into the UTXO ledger. - Explicit `Account ID`: `Account ID` is taken as the value of the `Account ID` field in the account output. - Implicit `Account ID`: When an account output is consumed as an input in a transaction and `Account ID` field is zeroed out while `State Index` and `Foundry Counter` are zero, take the BLAKE2b-256 hash of the `Output ID` of the - input as `Account ID`. + input as `Account ID`. Note that "implicit" here only refers to the account ID and has no relationship to the implicit + account concept. - For every non-zero explicit `Account ID` on the output side there must be a corresponding account on the input side. The corresponding account has the explicit or implicit `Account ID` equal to that of the account on the output side. @@ -1393,7 +1394,7 @@ The **current state** is defined as the **consumed account output**, while the * - When Issuer Feature is present in an output and explicit `Account ID` is zeroed out, an input with `Address` field that corresponds to `Issuer` must be unlocked in the transaction. -### Storage Deposit Calculation +## Storage Deposit Calculation The storage deposit of Block Issuer Keys is higher than for other field types. Therefore, the storage deposit calculation of account outputs defines an additional corresponding field type. @@ -2294,13 +2295,15 @@ The following table shows the Account Output including the possible fields and t address -> output mapping table, so that given an Account Address, its most recent unspent account output can be retrieved. -### Implicit Account +## Implicit Account + +TODO: Describe motivation for this feature. An _Implicit Account_ is defined as a Basic Output owned by an _Implicit Account Creation Address_, defined in [TIP-50](../TIP-0050/tip-0050.md#implicit-account-creation-address). Its only purpose and functionality is to be converted to a regular account. -#### Creation Semantic Transaction Validation Rules +### Creation Semantic Transaction Validation Rules To create an implicit account, a Basic Output is created on the output side of a transaction and the `Address` in the `Address Unlock Condition` is set to an address of type _Implicit Account Creation Address_. @@ -2315,29 +2318,32 @@ To create an implicit account, a Basic Output is created on the output side of a `Amount >= Storage Deposit of Minimal Account Output with Block Issuer Feature` (TODO: Calculate) - It must hold for the `Mana` on the `Implicit Account`: `Mana >= RMC Min * factor` (TODO: Define factor). -#### Conversion Semantic Transaction Validation Rules +### Conversion Semantic Transaction Validation Rules To convert an implicit account to an account, a block can be issued using the implicit account as the block issuer, containing a transaction that consumes the implicit account on the input side and creates an account output on the output side. Since an implicit account can issue blocks, some of the requirements of a block issuer account apply to -accounts as well, as defined below. +implicit accounts as well, as defined below. - The account ID of an `Implicit Account` is refered to as `Implicit Account ID` and is the BLAKE2b-256 hash of the Output ID of the Basic Output that represents the `Implicit Account`. - If a transaction contains an input with an unlock condition containing an implicit account address, the transaction is only valid if all of the following conditions hold: - - An `Account` Output is created on the output side, for which all of the following conditions hold: - - TODO: Fix confusion between implicit account id mentioned here and further above in the account TX section. - + - The `Account` must have a Block Issuer Feature. - It must hold that the value of the `Mana` on the `Explicit Account` is at least the value of the `Mana` on the - `Implicit Account` plus the potential Mana generated by the `Implicit Account`. + `Implicit Account` plus the Potential Mana generated by the `Implicit Account`. - A _Commitment Input_ is present. - A _Block Issuance Credit Input_ is present whose _Account ID_ equals the `Implicit Account ID`. - The transaction is invalid if the `Implicit Account` has negative Block Issuance Credit whose value is taken from the _Block Issuance Credit Input_. +### Implicit Account Block Issuance + +An implicit account can issue a block by using the public key from which the implicit account creation address was +derived as a block issuer key. + # Rationale & Alternatives ## Implicit Accounts From 0dfe5788ed3b4a596bf94a9db932c47229119bf0 Mon Sep 17 00:00:00 2001 From: Philipp Gackstatter Date: Tue, 12 Sep 2023 11:33:06 +0200 Subject: [PATCH 058/140] Remove issuer deposit --- tips/TIP-0042/tip-0042.md | 267 +++++++++++++++++++------------------- 1 file changed, 136 insertions(+), 131 deletions(-) diff --git a/tips/TIP-0042/tip-0042.md b/tips/TIP-0042/tip-0042.md index 51a49b1bb..caaad56cd 100644 --- a/tips/TIP-0042/tip-0042.md +++ b/tips/TIP-0042/tip-0042.md @@ -472,25 +472,22 @@ account is locked to that account. output is valid, if the following condition holds: - `Expiry Slot >= Past Bounded Slot Index`. - When a Block Issuer Feature is present in an account output, the transaction that contains this output is - valid, if all of the following conditions for the account output hold: - - `Amount >= Issuer Deposit`, which implies that the `Amount` must be at least the issuer deposit or the required - storage deposit, whichever is higher. - - The following condition for Mana in the transaction holds for the account containing the feature: - `TotalManaIn - AccountIn >= TotalManaOut - AccountOut`, where: - - `TotalManaIn` is the sum of all mana on the input side of the transaction. - - `TotalManaOut` is the sum of all mana on the output side of the transaction. - - `AccountIn = AccountIn_potential + AccountIn_stored`. - - `AccountOut = AccountOut_allotted + AccountOut_stored + AccountOut_locked`. - - `AccountIn_potential` is the decayed potential Mana generated by the `Amount` of the account input. - - `AccountIn_stored` is the decayed stored Mana of the account input. - - `AccountOut_allotted` is the amount of Mana allotted to the account. - - `AccountOut_stored` is the amount of Mana stored in the account. - - `AccountOut_locked` is the amount of Mana locked into outputs for which each output satisfies all of the following - conditions: - - The output has a Timelock Unlock Condition containing a - `Slot Index >= Past Bounded Slot Index + Maximum Committable Age`. - - The output has an Address Unlock Condition with the `Account Address` variant containing the input - account's address. + valid, only if the following condition for Mana in the transaction holds for the account containing the feature: + `TotalManaIn - AccountIn >= TotalManaOut - AccountOut`, where: + - `TotalManaIn` is the sum of all mana on the input side of the transaction. + - `TotalManaOut` is the sum of all mana on the output side of the transaction. + - `AccountIn = AccountIn_potential + AccountIn_stored`. + - `AccountOut = AccountOut_allotted + AccountOut_stored + AccountOut_locked`. + - `AccountIn_potential` is the decayed potential Mana generated by the `Amount` of the account input. + - `AccountIn_stored` is the decayed stored Mana of the account input. + - `AccountOut_allotted` is the amount of Mana allotted to the account. + - `AccountOut_stored` is the amount of Mana stored in the account. + - `AccountOut_locked` is the amount of Mana locked into outputs for which each output satisfies all of the following + conditions: + - The output has a Timelock Unlock Condition containing a + `Slot Index >= Past Bounded Slot Index + Maximum Committable Age`. + - The output has an Address Unlock Condition with the `Account Address` variant containing the input + account's address. - When a Block Issuer Feature is present in an account input containing `Expiry Slot >= Commitment Index` the transaction that contains the account output is valid, if all of the following conditions for the account output hold: - The account is not destroyed on the output side and retains its Block Issuer Feature. @@ -503,64 +500,68 @@ account is locked to that account. - The Block Issuer Feature is removed in the account output or the account is destroyed.
- Block Issuer Feature -
- Contains the public keys to verify block signatures and allows for unbonding the issuer deposit. -
+ Block Issuer Feature +
Contains the public keys used to verify block signatures.
- - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
Feature Typeuint8 - Set to value 4 to denote a Block Issuer Feature. -
Expiry Slotuint64The slot index at which the Block Issuer Feature expires and can be removed.
Block Issuer Keys Countuint8 - The number of Block Issuer Keys. -
Block Issuer Keys anyOf -
- Ed25519 Public Key - - - - - - - - - - - - - - - - -
NameTypeDescription
Public Key Typeuint8 - Set to value 0 to denote an Ed25519 Public Key. -
Public KeyByteArray[32]The raw bytes of the Ed25519 public key.
-
-
+ Name + + Type + + Description +
Feature Typeuint8Set to value 4 to denote a Block Issuer Feature.
Expiry Slotuint64The slot index at which the Block Issuer Feature expires and can be removed.
Block Issuer Keys Countuint8The number of Block Issuer Keys.
Block Issuer Keys anyOf +
+ Block Issuer Key Ed25519 + + + + + + + + + + + + + + + + +
+ Name + + Type + + Description +
Block Issuer Key Typeuint8Set to value 0 to denote a Block Issuer Key Ed25519.
Public KeyByteArray[32]The raw bytes of the Ed25519 public key.
+
+
## Staking Feature @@ -1073,63 +1074,67 @@ metadata into the UTXO ledger.
- Block Issuer Feature -
- Contains the public keys to verify block signatures and allows for unbonding the issuer deposit. -
- - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
Feature Typeuint8 - Set to value 4 to denote a Block Issuer Feature. -
Expiry Slotuint64The slot index at which the Block Issuer Feature expires and can be removed.
Block Issuer Keys Countuint8 - The number of Block Issuer Keys. -
Block Issuer Keys anyOf -
- Ed25519 Public Key - - - - - - - - - - - - - - - - -
NameTypeDescription
Public Key Typeuint8 - Set to value 0 to denote an Ed25519 Public Key. -
Public KeyByteArray[32]The raw bytes of the Ed25519 public key.
-
-
+ Block Issuer Feature +
Contains the public keys used to verify block signatures.
+ + + + + + + + + + + + + + + + + + + + + + + + + +
+ Name + + Type + + Description +
Feature Typeuint8Set to value 4 to denote a Block Issuer Feature.
Expiry Slotuint64The slot index at which the Block Issuer Feature expires and can be removed.
Block Issuer Keys Countuint8The number of Block Issuer Keys.
Block Issuer Keys anyOf +
+ Block Issuer Key Ed25519 + + + + + + + + + + + + + + + + +
+ Name + + Type + + Description +
Block Issuer Key Typeuint8Set to value 0 to denote a Block Issuer Key Ed25519.
Public KeyByteArray[32]The raw bytes of the Ed25519 public key.
+
+
Staking Feature From f8500502eb7ca29f9e29987f45f1ad291b8f94f7 Mon Sep 17 00:00:00 2001 From: Philipp Gackstatter Date: Thu, 21 Sep 2023 14:10:16 +0200 Subject: [PATCH 059/140] Format schema table (no content changes) --- tips/TIP-0042/tip-0042.md | 190 ++++++++++++++++++++------------------ 1 file changed, 101 insertions(+), 89 deletions(-) diff --git a/tips/TIP-0042/tip-0042.md b/tips/TIP-0042/tip-0042.md index caaad56cd..f7b42beb7 100644 --- a/tips/TIP-0042/tip-0042.md +++ b/tips/TIP-0042/tip-0042.md @@ -113,97 +113,109 @@ Condition, however there are additional transition constraints defined for t only be carried out by the `State Controller Address`, hence the distinct unlock condition type.
- State Controller Address Unlock -
- Defines the State Controller Address that owns this output, that is, it can unlock it with the proper Unlock in a - transaction that state transitions the account output. -
+ State Controller Address Unlock Condition +
Defines the State Controller Address that owns this output. It can unlock the output with the proper Unlock in a transaction that state transitions the account output.
- - - - - - - - - - - - - - - + + + + + + + + + + + + + +
NameTypeDescription
Unlock Condition Typeuint8 - Set to value 4 to denote an State Controller Address Unlock Condition. -
Address -
- Ed25519 Address - - - - - - - - - - - - - - - - -
NameTypeDescription
Address Typeuint8 - Set to value 0 to denote an Ed25519 Address. -
PubKeyHashByteArray[32]The raw bytes of the Ed25519 address which is a BLAKE2b-256 hash of the Ed25519 public key.
-
-
- Account Address - - - - - - - - - - - - - - - - -
NameTypeDescription
Address Typeuint8 - Set to value 8 to denote an Account Address. -
Account IDByteArray[32]The raw bytes of the Account ID which is the BLAKE2b-256 hash of the outputID that created it.
-
-
- NFT Address - - - - - - - - - - - - - - - - -
NameTypeDescription
Address Typeuint8 - Set to value 16 to denote an NFT Address. -
NFT IDByteArray[32]The raw bytes of the NFT ID which is the BLAKE2b-256 hash of the outputID that created it.
-
-
+ Name + + Type + + Description +
Unlock Condition Typeuint8Set to value 4 to denote a State Controller Address Unlock Condition.
Address oneOf +
+ Ed25519 Address + + + + + + + + + + + + + + + + +
+ Name + + Type + + Description +
Address Typeuint8Set to value 0 to denote an Ed25519 Address.
PubKeyHashByteArray[32]The raw bytes of the Ed25519 address which is the BLAKE2b-256 hash of the Ed25519 public key.
+
+
+ Account Address + + + + + + + + + + + + + + + + +
+ Name + + Type + + Description +
Address Typeuint8Set to value 8 to denote an Account Address.
Account IDByteArray[32]The raw bytes of the Account ID which is the BLAKE2b-256 hash of the Output ID that created it.
+
+
+ NFT Address + + + + + + + + + + + + + + + + +
+ Name + + Type + + Description +
Address Typeuint8Set to value 16 to denote an NFT Address.
NFT IDByteArray[32]The raw bytes of the NFT ID which is the BLAKE2b-256 hash of the Output ID that created it.
+
+
The additional constraints are defined in [Account Output Design](#account-output) section. From 48fec4ae68d4dc6b7eafdb25393ce31df05628f7 Mon Sep 17 00:00:00 2001 From: Philipp Gackstatter Date: Thu, 21 Sep 2023 14:11:49 +0200 Subject: [PATCH 060/140] Format schema table (no content changes) --- tips/TIP-0042/tip-0042.md | 190 ++++++++++++++++++++------------------ 1 file changed, 101 insertions(+), 89 deletions(-) diff --git a/tips/TIP-0042/tip-0042.md b/tips/TIP-0042/tip-0042.md index f7b42beb7..33edee522 100644 --- a/tips/TIP-0042/tip-0042.md +++ b/tips/TIP-0042/tip-0042.md @@ -227,97 +227,109 @@ Condition, however there are additional transition constraints defined for t only be carried out by the `Governor Address`, hence the distinct unlock condition type.
- Governor Address Unlock -
- Defines the Governor Address that owns this output, that is, it can unlock it with the proper Unlock in a - transaction that governance transitions the account output. -
+ Governor Address Unlock Condition +
Defines the Governor Address that owns this output. It can unlock the output with the proper Unlock in a transaction that governance transitions the account output.
- - - - - - - - - - - - - - - + + + + + + + + + + + + + +
NameTypeDescription
Unlock Condition Typeuint8 - Set to value 5 to denote an Governor Address Unlock Condition. -
Address -
- Ed25519 Address - - - - - - - - - - - - - - - - -
NameTypeDescription
Address Typeuint8 - Set to value 0 to denote an Ed25519 Address. -
PubKeyHashByteArray[32]The raw bytes of the Ed25519 address which is a BLAKE2b-256 hash of the Ed25519 public key.
-
-
- Account Address - - - - - - - - - - - - - - - - -
NameTypeDescription
Address Typeuint8 - Set to value 8 to denote an Account Address. -
Account IDByteArray[32]The raw bytes of the Account ID which is the BLAKE2b-256 hash of the outputID that created it.
-
-
- NFT Address - - - - - - - - - - - - - - - - -
NameTypeDescription
Address Typeuint8 - Set to value 16 to denote an NFT Address. -
NFT IDByteArray[32]The raw bytes of the NFT ID which is the BLAKE2b-256 hash of the outputID that created it.
-
-
+ Name + + Type + + Description +
Unlock Condition Typeuint8Set to value 5 to denote a Governor Address Unlock Condition.
Address oneOf +
+ Ed25519 Address + + + + + + + + + + + + + + + + +
+ Name + + Type + + Description +
Address Typeuint8Set to value 0 to denote an Ed25519 Address.
PubKeyHashByteArray[32]The raw bytes of the Ed25519 address which is the BLAKE2b-256 hash of the Ed25519 public key.
+
+
+ Account Address + + + + + + + + + + + + + + + + +
+ Name + + Type + + Description +
Address Typeuint8Set to value 8 to denote an Account Address.
Account IDByteArray[32]The raw bytes of the Account ID which is the BLAKE2b-256 hash of the Output ID that created it.
+
+
+ NFT Address + + + + + + + + + + + + + + + + +
+ Name + + Type + + Description +
Address Typeuint8Set to value 16 to denote an NFT Address.
NFT IDByteArray[32]The raw bytes of the NFT ID which is the BLAKE2b-256 hash of the Output ID that created it.
+
+
The additional constraints are defined in [Account Output Design](#account-output) section. From e2e6bbb9a5abe67f0a381765f8d00b93b635b5fd Mon Sep 17 00:00:00 2001 From: Philipp Gackstatter Date: Thu, 21 Sep 2023 14:19:57 +0200 Subject: [PATCH 061/140] Format schema tables (no content changes) --- tips/TIP-0042/tip-0042.md | 141 +++++++++++++++++++------------------- 1 file changed, 72 insertions(+), 69 deletions(-) diff --git a/tips/TIP-0042/tip-0042.md b/tips/TIP-0042/tip-0042.md index 33edee522..6ce73d6b9 100644 --- a/tips/TIP-0042/tip-0042.md +++ b/tips/TIP-0042/tip-0042.md @@ -343,52 +343,57 @@ however there are additional transition constraints: the next state of the UTXO Account Address Unlock Condition.
- Immutable Account Address Unlock Condition -
- Defines the permanent Account Address that owns this output. -
+ Immutable Account Address Unlock Condition +
Defines the permanent Account Address that owns this output.
- - - - - - - - - - - - - - - + + + + + + + + + + + + + +
NameTypeDescription
Unlock Condition Typeuint8 - Set to value 6 to denote an Immutable Account Address Unlock Condition. -
Address -
- Account Address - - - - - - - - - - - - - - - - -
NameTypeDescription
Address Typeuint8 - Set to value 8 to denote an Account Address. -
Account IDByteArray[32]The raw bytes of the Account ID which is the BLAKE2b-256 hash of the outputID that created it.
-
-
+ Name + + Type + + Description +
Unlock Condition Typeuint8Set to value 6 to denote an Immutable Account Address Unlock Condition.
Address oneOf +
+ Account Address + + + + + + + + + + + + + + + + +
+ Name + + Type + + Description +
Address Typeuint8Set to value 8 to denote an Account Address.
Account IDByteArray[32]The raw bytes of the Account ID which is the BLAKE2b-256 hash of the Output ID that created it.
+
+
### Additional semantic transaction validation rules: @@ -405,32 +410,31 @@ output locked under a private key backed address, such as Ed25519 Addresses - Account Unlock -
- Points to the unlock of a consumed account output. -
+ Account Unlock +
Points to the unlock of a consumed account output.
- - - - - - - - - - - - - - - - + + + + + + + + + + + + + + +
NameTypeDescription
Unlock Typeuint8 - Set to value 2 to denote a Account Unlock. -
Account Reference Unlock Indexuint16 - Index of input and unlock corresponding to an account output. -
+ Name + + Type + + Description +
Unlock Typeuint8Set to value 2 to denote an Account Unlock.
Account Reference Unlock Indexuint16Index of input and unlock corresponding to an account output.
This unlock is similar to the Reference Unlock. However, it is valid if and only if the input of the transaction @@ -527,7 +531,6 @@ account is locked to that account. Block Issuer Feature
Contains the public keys used to verify block signatures.
- + + + + + + + + +
From 1a919052eb7c3b5ac3bf1328e04172e3b85278ee Mon Sep 17 00:00:00 2001 From: Philipp Gackstatter Date: Thu, 21 Sep 2023 14:21:13 +0200 Subject: [PATCH 062/140] Format schema tables (no content changes) --- tips/TIP-0042/tip-0042.md | 1391 +++++++++++++++++++------------------ 1 file changed, 731 insertions(+), 660 deletions(-) diff --git a/tips/TIP-0042/tip-0042.md b/tips/TIP-0042/tip-0042.md index 6ce73d6b9..7dba2837b 100644 --- a/tips/TIP-0042/tip-0042.md +++ b/tips/TIP-0042/tip-0042.md @@ -655,45 +655,46 @@ which they were selected to participate in the validator committee. [TIP-40 (Validator Rewards)](../TIP-0040/tip-0040.md#validator-rewards).
- Staking Feature -
- Stakes IOTA coins to become eligible for committee selection, validate the network and receive Mana rewards. -
+ Staking Feature +
Stakes IOTA coins to become eligible for committee selection, validate the network and receive Mana rewards.
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
Feature Typeuint8 - Set to value 5 to denote a Staking Feature. -
Staked Amountuint64The amount of IOTA coins that are locked and staked in the containing account.
Fixed Costuint64The fixed cost of the validator, which it receives as part of its Mana rewards.
Start Epochuint64The epoch index in which the staking started.
End Epochuint64The epoch index in which the staking ends.
+ Name + + Type + + Description +
Feature Typeuint8Set to value 5 to denote a Staking Feature.
Staked Amountuint64The amount of IOTA coins that are locked and staked in the containing account.
Fixed Costuint64The fixed cost of the validator, which it receives as part of its Mana rewards.
Start Epochuint64The epoch index in which the staking started.
End Epochuint64The epoch index in which the staking ends.
# Account Output @@ -707,632 +708,702 @@ Address. The account owns other outputs that are locked under Account Add state transitions (`State Index` counter), controlled foundries (`Foundry Counter`) and anchors the layer 2 state as metadata into the UTXO ledger. +
+ Account Output +
Describes an account in the ledger that can be controlled by the state and governance controllers.
+
-
- Account Output -
- Describes an account in the ledger that can be controlled by the state and governance controllers. -
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Name + + Type + + Description +
Output Typeuint8Set to value 4 to denote an Account Output.
Amountuint64The amount of IOTA coins held by the output.
Manauint64The amount of (stored) Mana held by the output.
Native Tokens Countuint8The number of native tokens held by the output.
Native Tokens optAnyOf +
+ Native Token - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + +
NameTypeDescription
Output Typeuint8 - Set to value 4 to denote a Account Output. -
Amountuint64The amount of IOTA coins held by the output.
Manauint64The amount of (stored) Mana held by the output.
Native Tokens Countuint8The number of native tokens held by the output.
Native Tokens optAnyOf -
- Native Token - - - - - - - - - - - - - - - - -
NameTypeDescription
Token IDByteArray[38] - Identifier of the native token. -
Amountuint256 - Amount of native tokens of the given Token ID. -
-
-
Account IDByteArray[32]Unique identifier of the account, which is the BLAKE2b-256 hash of the Output ID that created it. Account Address = Account Address Type || Account ID
State Indexuint32A counter that must increase by 1 every time the account is state transitioned.
State Metadata(uint16)ByteArrayMetadata that can only be changed by the state controller. A leading uint16 denotes its length.
Foundry Counteruint32A counter that denotes the number of foundries created by this account.
Unlock Conditions Countuint8The number of unlock conditions following.
Unlock Conditions atMostOneOfEach -
- State Controller Address Unlock Condition - - - - - - - - - - - - - - - -
NameTypeDescription
Unlock Condition Typeuint8 - Set to value 4 to denote an State Controller Address Unlock Condition. -
Address -
- Ed25519 Address - - - - - - - - - - - - - - - - -
NameTypeDescription
Address Typeuint8 - Set to value 0 to denote an Ed25519 Address. -
PubKeyHashByteArray[32]The raw bytes of the Ed25519 address which is a BLAKE2b-256 hash of the Ed25519 public key.
-
-
- Account Address - - - - - - - - - - - - - - - - -
NameTypeDescription
Address Typeuint8 - Set to value 8 to denote an Account Address. -
Account IDByteArray[32]The raw bytes of the Account ID which is the BLAKE2b-256 hash of the outputID that created it.
-
-
- NFT Address - - - - - - - - - - - - - - - - -
NameTypeDescription
Address Typeuint8 - Set to value 16 to denote an NFT Address. -
NFT IDByteArray[32]The raw bytes of the NFT ID which is the BLAKE2b-256 hash of the outputID that created it.
-
-
-
-
- Governor Address Unlock Condition - - - - - - - - - - - - - - - -
NameTypeDescription
Unlock Condition Typeuint8 - Set to value 5 to denote an Governor Address Unlock Condition. -
Address -
- Ed25519 Address - - - - - - - - - - - - - - - - -
NameTypeDescription
Address Typeuint8 - Set to value 0 to denote an Ed25519 Address. -
PubKeyHashByteArray[32]The raw bytes of the Ed25519 address which is a BLAKE2b-256 hash of the Ed25519 public key.
-
-
- Account Address - - - - - - - - - - - - - - - - -
NameTypeDescription
Address Typeuint8 - Set to value 8 to denote an Account Address. -
Account IDByteArray[32]The raw bytes of the Account ID which is the BLAKE2b-256 hash of the outputID that created it.
-
-
- NFT Address - - - - - - - - - - - - - - - - -
NameTypeDescription
Address Typeuint8 - Set to value 16 to denote an NFT Address. -
NFT IDByteArray[32]The raw bytes of the NFT ID which is the BLAKE2b-256 hash of the outputID that created it.
-
-
-
-
Features Countuint8The number of features following.
Features atMostOneOfEach -
- Sender Feature -
- Identifies the validated sender of the output. -
- - - - - - - - - - - - - - - -
NameTypeDescription
Feature Typeuint8 - Set to value 0 to denote a Sender Feature. -
Sender oneOf -
- Ed25519 Address - - - - - - - - - - - - - - - - -
NameTypeDescription
Address Typeuint8 - Set to value 0 to denote an Ed25519 Address. -
PubKeyHashByteArray[32]The raw bytes of the Ed25519 address which is a BLAKE2b-256 hash of the Ed25519 public key.
-
-
- Account Address - - - - - - - - - - - - - - - - -
NameTypeDescription
Address Typeuint8 - Set to value 8 to denote an Account Address. -
Account IDByteArray[32]The raw bytes of the Account ID which is the BLAKE2b-256 hash of the outputID that created it.
-
-
- NFT Address - - - - - - - - - - - - - - - - -
NameTypeDescription
Address Typeuint8 - Set to value 16 to denote an NFT Address. -
NFT IDByteArray[32]The raw bytes of the NFT ID which is the BLAKE2b-256 hash of the outputID that created it.
-
-
-
-
- Metadata Feature -
- Defines metadata (arbitrary binary data) that will be stored in the output. -
- - - - - - - - - - - - - - - - -
NameTypeDescription
Feature Typeuint8 - Set to value 2 to denote a Metadata Feature. -
Data(uint16)ByteArrayBinary data. A leading uint16 denotes its length.
-
-
- Block Issuer Feature -
Contains the public keys used to verify block signatures.
- - - - - - - - - - - - - - - - - - - - - - - - - -
- Name - - Type - - Description -
Feature Typeuint8Set to value 4 to denote a Block Issuer Feature.
Expiry Slotuint64The slot index at which the Block Issuer Feature expires and can be removed.
Block Issuer Keys Countuint8The number of Block Issuer Keys.
Block Issuer Keys anyOf -
- Block Issuer Key Ed25519 - - - - - - - - - - - - - - - - -
- Name - - Type - - Description -
Block Issuer Key Typeuint8Set to value 0 to denote a Block Issuer Key Ed25519.
Public KeyByteArray[32]The raw bytes of the Ed25519 public key.
-
-
-
-
- Staking Feature -
- Stakes IOTA coins to become eligible for committee selection, validate the network and receive Mana rewards. -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
Feature Typeuint8 - Set to value 5 to denote a Staking Feature. -
Staked Amountuint64The amount of IOTA coins that are locked and staked in the containing account.
Fixed Costuint64The fixed cost of the validator, which it receives as part of its Mana rewards.
Start Epochuint64The epoch index in which the staking started.
End Epochuint64The epoch index in which the staking ends.
-
-
Immutable Features Countuint8The number of immutable features following. Immutable features are defined upon deployment of the UTXO state machine and are not allowed to change in any future state transition.
Immutable Features atMostOneOfEach -
- Issuer Feature -
- Identifies the validated issuer of the UTXO state machine. -
- - - - - - - - - - - - - - - -
NameTypeDescription
Feature Typeuint8 - Set to value 1 to denote an Issuer Feature. -
Issuer oneOf -
- Ed25519 Address - - - - - - - - - - - - - - - - -
NameTypeDescription
Address Typeuint8 - Set to value 0 to denote an Ed25519 Address. -
PubKeyHashByteArray[32]The raw bytes of the Ed25519 address which is a BLAKE2b-256 hash of the Ed25519 public key.
-
-
- Account Address - - - - - - - - - - - - - - - - -
NameTypeDescription
Address Typeuint8 - Set to value 8 to denote an Account Address. -
Account IDByteArray[32]The raw bytes of the Account ID which is the BLAKE2b-256 hash of the outputID that created it.
-
-
- NFT Address - - - - - - - - - - - - - - - - -
NameTypeDescription
Address Typeuint8 - Set to value 16 to denote an NFT Address. -
NFT IDByteArray[32]The raw bytes of the NFT ID which is the BLAKE2b-256 hash of the outputID that created it.
-
-
-
-
- Metadata Feature -
- Defines metadata (arbitrary binary data) that will be stored in the output. -
- - - - - - - - - - - - - - - - -
NameTypeDescription
Feature Typeuint8 - Set to value 2 to denote a Metadata Feature. -
Data(uint16)ByteArrayBinary data. A leading uint16 denotes its length.
-
-
+ Name + + Type + + Description +
Token IDByteArray[38]Identifier of the native token.
Amountuint256Amount of native tokens of the given Token ID.
-
+ +
Account IDByteArray[32]Unique identifier of the account, which is the BLAKE2b-256 hash of the Output ID that created it. Account Address = Account Address Type || Account ID.
State Indexuint32A counter that must increase by 1 every time the account is state transitioned.
State Metadata(uint16)ByteArrayMetadata that can only be changed by the state controller. A leading uint16 denotes its length.
Foundry Counteruint32A counter that denotes the number of foundries created by this account.
Unlock Conditions Countuint8The number of unlock conditions following.
Unlock Conditions atMostOneOfEach +
+ State Controller Address Unlock Condition +
Defines the State Controller Address that owns this output. It can unlock the output with the proper Unlock in a transaction that state transitions the account output.
+ + + + + + + + + + + + + + + +
+ Name + + Type + + Description +
Unlock Condition Typeuint8Set to value 4 to denote a State Controller Address Unlock Condition.
Address oneOf +
+ Ed25519 Address + + + + + + + + + + + + + + + + +
+ Name + + Type + + Description +
Address Typeuint8Set to value 0 to denote an Ed25519 Address.
PubKeyHashByteArray[32]The raw bytes of the Ed25519 address which is the BLAKE2b-256 hash of the Ed25519 public key.
+
+
+ Account Address + + + + + + + + + + + + + + + + +
+ Name + + Type + + Description +
Address Typeuint8Set to value 8 to denote an Account Address.
Account IDByteArray[32]The raw bytes of the Account ID which is the BLAKE2b-256 hash of the Output ID that created it.
+
+
+ NFT Address + + + + + + + + + + + + + + + + +
+ Name + + Type + + Description +
Address Typeuint8Set to value 16 to denote an NFT Address.
NFT IDByteArray[32]The raw bytes of the NFT ID which is the BLAKE2b-256 hash of the Output ID that created it.
+
+
+
+
+ Governor Address Unlock Condition +
Defines the Governor Address that owns this output. It can unlock the output with the proper Unlock in a transaction that governance transitions the account output.
+ + + + + + + + + + + + + + + +
+ Name + + Type + + Description +
Unlock Condition Typeuint8Set to value 5 to denote a Governor Address Unlock Condition.
Address oneOf +
+ Ed25519 Address + + + + + + + + + + + + + + + + +
+ Name + + Type + + Description +
Address Typeuint8Set to value 0 to denote an Ed25519 Address.
PubKeyHashByteArray[32]The raw bytes of the Ed25519 address which is the BLAKE2b-256 hash of the Ed25519 public key.
+
+
+ Account Address + + + + + + + + + + + + + + + + +
+ Name + + Type + + Description +
Address Typeuint8Set to value 8 to denote an Account Address.
Account IDByteArray[32]The raw bytes of the Account ID which is the BLAKE2b-256 hash of the Output ID that created it.
+
+
+ NFT Address + + + + + + + + + + + + + + + + +
+ Name + + Type + + Description +
Address Typeuint8Set to value 16 to denote an NFT Address.
NFT IDByteArray[32]The raw bytes of the NFT ID which is the BLAKE2b-256 hash of the Output ID that created it.
+
+
+
+
Features Countuint8The number of features following.
Features atMostOneOfEach +
+ Sender Feature +
Identifies the validated sender of the output.
+ + + + + + + + + + + + + + + +
+ Name + + Type + + Description +
Feature Typeuint8Set to value 0 to denote a Sender Feature.
Sender oneOf +
+ Ed25519 Address + + + + + + + + + + + + + + + + +
+ Name + + Type + + Description +
Address Typeuint8Set to value 0 to denote an Ed25519 Address.
PubKeyHashByteArray[32]The raw bytes of the Ed25519 address which is the BLAKE2b-256 hash of the Ed25519 public key.
+
+
+ Account Address + + + + + + + + + + + + + + + + +
+ Name + + Type + + Description +
Address Typeuint8Set to value 8 to denote an Account Address.
Account IDByteArray[32]The raw bytes of the Account ID which is the BLAKE2b-256 hash of the Output ID that created it.
+
+
+ NFT Address + + + + + + + + + + + + + + + + +
+ Name + + Type + + Description +
Address Typeuint8Set to value 16 to denote an NFT Address.
NFT IDByteArray[32]The raw bytes of the NFT ID which is the BLAKE2b-256 hash of the Output ID that created it.
+
+
+
+
+ Metadata Feature +
Defines metadata (arbitrary binary data) that will be stored in the output.
+ + + + + + + + + + + + + + + + +
+ Name + + Type + + Description +
Feature Typeuint8Set to value 2 to denote a Metadata Feature.
Data(uint16)ByteArrayBinary data. A leading uint16 denotes its length.
+
+
+ Block Issuer Feature +
Contains the public keys used to verify block signatures.
+ + + + + + + + + + + + + + + + + + + + + + + + + +
+ Name + + Type + + Description +
Feature Typeuint8Set to value 4 to denote a Block Issuer Feature.
Expiry Slotuint64The slot index at which the Block Issuer Feature expires and can be removed.
Block Issuer Keys Countuint8The number of Block Issuer Keys.
Block Issuer Keys anyOf +
+ Block Issuer Key Ed25519 + + + + + + + + + + + + + + + + +
+ Name + + Type + + Description +
Block Issuer Key Typeuint8Set to value 0 to denote a Block Issuer Key Ed25519.
Public KeyByteArray[32]The raw bytes of the Ed25519 public key.
+
+
+
+
+ Staking Feature +
Stakes IOTA coins to become eligible for committee selection, validate the network and receive Mana rewards.
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Name + + Type + + Description +
Feature Typeuint8Set to value 5 to denote a Staking Feature.
Staked Amountuint64The amount of IOTA coins that are locked and staked in the containing account.
Fixed Costuint64The fixed cost of the validator, which it receives as part of its Mana rewards.
Start Epochuint64The epoch index in which the staking started.
End Epochuint64The epoch index in which the staking ends.
+
+
Immutable Features Countuint8The number of immutable features following. Immutable features are defined upon deployment of the UTXO state machine and are not allowed to change in any future state transition.
Immutable Features atMostOneOfEach +
+ Issuer Feature +
Identifies the validated issuer of the UTXO state machine.
+ + + + + + + + + + + + + + + +
+ Name + + Type + + Description +
Feature Typeuint8Set to value 1 to denote a Issuer Feature.
Issuer oneOf +
+ Ed25519 Address + + + + + + + + + + + + + + + + +
+ Name + + Type + + Description +
Address Typeuint8Set to value 0 to denote an Ed25519 Address.
PubKeyHashByteArray[32]The raw bytes of the Ed25519 address which is the BLAKE2b-256 hash of the Ed25519 public key.
+
+
+ Account Address + + + + + + + + + + + + + + + + +
+ Name + + Type + + Description +
Address Typeuint8Set to value 8 to denote an Account Address.
Account IDByteArray[32]The raw bytes of the Account ID which is the BLAKE2b-256 hash of the Output ID that created it.
+
+
+ NFT Address + + + + + + + + + + + + + + + + +
+ Name + + Type + + Description +
Address Typeuint8Set to value 16 to denote an NFT Address.
NFT IDByteArray[32]The raw bytes of the NFT ID which is the BLAKE2b-256 hash of the Output ID that created it.
+
+
+
+
+ Metadata Feature +
Defines metadata (arbitrary binary data) that will be stored in the output.
+ + + + + + + + + + + + + + + + +
+ Name + + Type + + Description +
Feature Typeuint8Set to value 2 to denote a Metadata Feature.
Data(uint16)ByteArrayBinary data. A leading uint16 denotes its length.
+
+
## Additional Transaction Syntactic Validation Rules From b680742a51049f5ee38d0ecd9eeec627fea37153 Mon Sep 17 00:00:00 2001 From: Philipp Gackstatter Date: Thu, 21 Sep 2023 14:22:48 +0200 Subject: [PATCH 063/140] Format schema table (no content changes) --- tips/TIP-0042/tip-0042.md | 2160 ++++++++++++++++++++++--------------- 1 file changed, 1305 insertions(+), 855 deletions(-) diff --git a/tips/TIP-0042/tip-0042.md b/tips/TIP-0042/tip-0042.md index 7dba2837b..d0ecee5b4 100644 --- a/tips/TIP-0042/tip-0042.md +++ b/tips/TIP-0042/tip-0042.md @@ -1526,866 +1526,1316 @@ calculation of account outputs defines an additional corresponding field type. The following table shows the Account Output including the possible fields and their specific weight. +
+ Account Output +
Describes an account in the ledger that can be controlled by the state and governance controllers.
+
-
- Account Output -
- Describes an account in the ledger that can be controlled by the state and governance controllers. -
-
- - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Offset +
Offset + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Field + + Field type + + Length Minimum + + Length Maximum + + Description +
OutputID + key + 3434The ID of the output.
Block ID (included) + data + 4040The ID of the block in which the transaction payload that created this output was included.
Slot Booked + data + 88The index of the slot in which the transaction that created it was booked.
Slot Created + data + 88The index of the slot in which the transaction was created.
+
Fields + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Field + + Field type + + Length Minimum + + Length Maximum + + Description +
Output Type + data + 11Set to value 4 to denote an Account Output.
Amount + data + 88The amount of IOTA coins held by the output.
Mana + data + 88The amount of (stored) Mana held by the output.
Native Tokens Count + data + 11The number of native tokens held by the output.
Native Tokens optAnyOf +
+ Native Token + + + + - - - - + +
Fields - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + +
FieldField typeLength MinimumLength MaximumDescription
OutputIDkey3434The ID of the output.
Block ID (included)data4040The ID of the block in which the transaction payload that created this output was included.
Slot Bookeddata88The index of the slot in which the transaction that created it was booked.
Slot Createddata88The index of the slot in which the transaction was created.
+ Field + + Field type + + Length Minimum + + Length Maximum + + Description +
Token ID + data + 3838Identifier of the native token.
Amount + data + 3232Amount of native tokens of the given Token ID.
-
Fields +
+
+
Account ID + data + 3232Unique identifier of the account, which is the BLAKE2b-256 hash of the Output ID that created it. Account Address = Account Address Type || Account ID.
State Index + data + 44A counter that must increase by 1 every time the account is state transitioned.
State Metadata Length + data + 22Length of the following field.
State Metadata + data + 28194Metadata that can only be changed by the state controller. A leading uint16 denotes its length.
Foundry Counter + data + 44A counter that denotes the number of foundries created by this account.
Unlock Conditions Count + data + 11The number of unlock conditions following.
Unlock Conditions atMostOneOfEach +
+ State Controller Address Unlock Condition +
Defines the State Controller Address that owns this output. It can unlock the output with the proper Unlock in a transaction that state transitions the account output.
+ + + + - - - - - - - - - -
Fields - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + +
NameField typeLength MinimumLength MaximumDescription
Output Typedata11 - Set to value 4 to denote a Account Output. -
Amountdata88The amount of IOTA coins held by the output.
Manadata88The amount of (stored) Mana held by the output.
Native Tokens Countdata11The number of native tokens held by the output.
Native Tokens optAnyOf -
- Native Token - - - - - - - - - - - - - - - - - - - - - - -
NameField typeLength MinimumLength MaximumDescription
Token IDdata3838 - Identifier of the native token. -
Amountdata3232 - Amount of native tokens of the given Token ID. -
-
-
Account IDdata3232Unique identifier of the account, which is the BLAKE2b-256 hash of the Output ID that created it. Account Address = Account Address Type || Account ID
State Indexdata44A counter that must increase by 1 every time the account is state transitioned.
State Metadata Lengthdata22Length of the following State Metadata field.
State Metadatadata08192Metadata that can only be changed by the state controller.
Foundry Counterdata44A counter that denotes the number of foundries created by this account.
Unlock Conditions Countdata11The number of unlock conditions following.
Unlock Conditions atMostOneOfEach -
- State Controller Address Unlock Condition - - - - - - - - - - - - - - - - - - - -
NameField typeLength MinimumLength MaximumDescription
Unlock Condition Typedata11 - Set to value 4 to denote an State Controller Address Unlock Condition. -
Address -
- Ed25519 Address - - - - - - - - - - - - - - - - - - - - - - -
NameField typeLength MinimumLength MaximumDescription
Address Typedata11 - Set to value 0 to denote an Ed25519 Address. -
PubKeyHashdata3232The raw bytes of the Ed25519 address which is a BLAKE2b-256 hash of the Ed25519 public key.
-
-
- Account Address - - - - - - - - - - - - - - - - - - - - - - -
NameField typeLength MinimumLength MaximumDescription
Address Typedata11 - Set to value 8 to denote an Account Address. -
Account IDdata3232The raw bytes of the Account ID which is the BLAKE2b-256 hash of the outputID that created it.
-
-
- NFT Address - - - - - - - - - - - - - - - - - - - - - - -
NameField typeLength MinimumLength MaximumDescription
Address Typedata11 - Set to value 16 to denote an NFT Address. -
NFT IDdata3232The raw bytes of the NFT ID which is the BLAKE2b-256 hash of the outputID that created it.
-
-
-
-
- Governor Address Unlock Condition - - - - - - - - - - - - - - - - - - - -
NameField typeLength MinimumLength MaximumDescription
Unlock Condition Typedata11 - Set to value 5 to denote an Governor Address Unlock Condition. -
Address -
- Ed25519 Address - - - - - - - - - - - - - - - - - - - - - - -
NameField typeLength MinimumLength MaximumDescription
Address Typedata11 - Set to value 0 to denote an Ed25519 Address. -
PubKeyHashdata3232The raw bytes of the Ed25519 address which is a BLAKE2b-256 hash of the Ed25519 public key.
-
-
- Account Address - - - - - - - - - - - - - - - - - - - - - - -
NameField typeLength MinimumLength MaximumDescription
Address Typedata11 - Set to value 8 to denote an Account Address. -
Account IDdata3232The raw bytes of the Account ID which is the BLAKE2b-256 hash of the outputID that created it.
-
-
- NFT Address - - - - - - - - - - - - - - - - - - - - - - -
NameField typeLength MinimumLength MaximumDescription
Address Typedata11 - Set to value 16 to denote an NFT Address. -
NFT IDdata3232The raw bytes of the NFT ID which is the BLAKE2b-256 hash of the outputID that created it.
-
-
-
-
Features Countdata11The number of features following.
Features atMostOneOfEach -
- Sender Feature -
- Identifies the validated sender of the output. -
- - - - - - - - - - - - - - - - - - - -
NameField typeLength MinimumLength MaximumDescription
Feature Typedata11 - Set to value 0 to denote a Sender Feature. -
Sender oneOf -
- Ed25519 Address - - - - - - - - - - - - - - - - - - - - - - -
NameField typeLength MinimumLength MaximumDescription
Address Typedata11 - Set to value 0 to denote an Ed25519 Address. -
PubKeyHashdata3232The raw bytes of the Ed25519 address which is a BLAKE2b-256 hash of the Ed25519 public key.
-
-
- Account Address - - - - - - - - - - - - - - - - - - - - - - -
NameField typeLength MinimumLength MaximumDescription
Address Typedata11 - Set to value 8 to denote an Account Address. -
Account IDdata3232The raw bytes of the Account ID which is the BLAKE2b-256 hash of the outputID that created it.
-
-
- NFT Address - - - - - - - - - - - - - - - - - - - - - - -
NameField typeLength MinimumLength MaximumDescription
Address Typedata11 - Set to value 16 to denote an NFT Address. -
NFT IDdata3232The raw bytes of the NFT ID which is the BLAKE2b-256 hash of the outputID that created it.
-
-
-
-
- Metadata Feature -
- Defines metadata (arbitrary binary data) that will be stored in the output. -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameField typeLength MinimumLength MaximumDescription
Feature Typedata11 - Set to value 2 to denote a Metadata Feature. -
Data Lengthdata22 - Length of the following data field in bytes. -
Datadata18192Binary data.
-
-
- Block Issuer Feature -
- Contains the public keys to verify block signatures and allows for unbonding the issuer deposit. -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameField typeLength MinimumLength MaximumDescription
Feature Typedata11 - Set to value 4 to denote a Block Issuer Feature. -
Expiry Slotdata88The slot index at which the issuer deposit can be unlocked.
Block Issuer Keys Countdata11 - The number of Block Issuer Keys. -
Block Issuer Keys anyOf -
- Ed25519 Public Key - - - - - - - - - - - - - - - - - - - - - - -
NameField typeLength MinimumLength MaximumDescription
Public Key Typeblock_issuer_key11 - Set to value 0 to denote an Ed25519 Public Key. -
Public Keyblock_issuer_key3232The raw bytes of the Ed25519 public key.
-
-
-
-
- Staking Feature -
- Stakes IOTA coins to become eligible for committee selection, validate the network and receive Mana rewards. -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameField typeLength MinimumLength MaximumDescription
Feature Typestaking11 - Set to value 5 to denote a Staking Feature. -
Staked Amountstaking88The amount of IOTA coins that are locked and staked in the containing account.
Fixed Coststaking88The fixed cost of the validator, which it receives as part of its Mana rewards.
Start Epochstaking88The epoch index in which the staking started.
End Epochstaking88The epoch index in which the staking ends.
-
-
Immutable Features Countdata11The number of immutable features following. Immutable features are defined upon deployment of the UTXO state machine and are not allowed to change in any future state transition.
Immutable Features atMostOneOfEach -
- Issuer Feature -
- Identifies the validated issuer of the UTXO state machine. -
- - - - - - - - - - - - - - - - - - - -
NameField typeLength MinimumLength MaximumDescription
Feature Typedata11 - Set to value 1 to denote an Issuer Feature. -
Issuer oneOf -
- Ed25519 Address - - - - - - - - - - - - - - - - - - - - - - -
NameField typeLength MinimumLength MaximumDescription
Address Typedata11 - Set to value 0 to denote an Ed25519 Address. -
PubKeyHashdata3232The raw bytes of the Ed25519 address which is a BLAKE2b-256 hash of the Ed25519 public key.
-
-
- Account Address - - - - - - - - - - - - - - - - - - - - - - -
NameField typeLength MinimumLength MaximumDescription
Address Typedata11 - Set to value 8 to denote an Account Address. -
Account IDdata3232The raw bytes of the Account ID which is the BLAKE2b-256 hash of the outputID that created it.
-
-
- NFT Address - - - - - - - - - - - - - - - - - - - - - - -
NameField typeLength MinimumLength MaximumDescription
Address Typedata11 - Set to value 16 to denote an NFT Address. -
NFT IDdata3232The raw bytes of the NFT ID which is the BLAKE2b-256 hash of the outputID that created it.
-
-
-
-
- Metadata Feature -
- Defines metadata (arbitrary binary data) that will be stored in the output. -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameField typeLength MinimumLength MaximumDescription
Feature Typedata11 - Set to value 2 to denote a Metadata Feature. -
Data Lengthdata22 - Length of the following data field in bytes. -
Datadata18192Binary data.
-
-
+ Field + + Field type + + Length Minimum + + Length Maximum + + Description +
Unlock Condition Type + data + 11Set to value 4 to denote a State Controller Address Unlock Condition.
Address oneOf +
+ Ed25519 Address + + + + + +
Fields + + + + + + + + + + + + + + + + + + + + + + +
+ Field + + Field type + + Length Minimum + + Length Maximum + + Description +
Address Type + data + 11Set to value 0 to denote an Ed25519 Address.
PubKeyHash + data + 3232The raw bytes of the Ed25519 address which is the BLAKE2b-256 hash of the Ed25519 public key.
+
+
+
+ Account Address + + + + + +
Fields + + + + + + + + + + + + + + + + + + + + + + +
+ Field + + Field type + + Length Minimum + + Length Maximum + + Description +
Address Type + data + 11Set to value 8 to denote an Account Address.
Account ID + data + 3232The raw bytes of the Account ID which is the BLAKE2b-256 hash of the Output ID that created it.
+
+
+
+ NFT Address + + + + + +
Fields + + + + + + + + + + + + + + + + + + + + + + +
+ Field + + Field type + + Length Minimum + + Length Maximum + + Description +
Address Type + data + 11Set to value 16 to denote an NFT Address.
NFT ID + data + 3232The raw bytes of the NFT ID which is the BLAKE2b-256 hash of the Output ID that created it.
+
+
+
-
TODO: Update: v_byte Minimum477
TODO: Update: v_byte Maximum29641
-
+
+ +
+ Governor Address Unlock Condition +
Defines the Governor Address that owns this output. It can unlock the output with the proper Unlock in a transaction that governance transitions the account output.
+ + + + + +
Fields + + + + + + + + + + + + + + + + + + + +
+ Field + + Field type + + Length Minimum + + Length Maximum + + Description +
Unlock Condition Type + data + 11Set to value 5 to denote a Governor Address Unlock Condition.
Address oneOf +
+ Ed25519 Address + + + + + +
Fields + + + + + + + + + + + + + + + + + + + + + + +
+ Field + + Field type + + Length Minimum + + Length Maximum + + Description +
Address Type + data + 11Set to value 0 to denote an Ed25519 Address.
PubKeyHash + data + 3232The raw bytes of the Ed25519 address which is the BLAKE2b-256 hash of the Ed25519 public key.
+
+
+
+ Account Address + + + + + +
Fields + + + + + + + + + + + + + + + + + + + + + + +
+ Field + + Field type + + Length Minimum + + Length Maximum + + Description +
Address Type + data + 11Set to value 8 to denote an Account Address.
Account ID + data + 3232The raw bytes of the Account ID which is the BLAKE2b-256 hash of the Output ID that created it.
+
+
+
+ NFT Address + + + + + +
Fields + + + + + + + + + + + + + + + + + + + + + + +
+ Field + + Field type + + Length Minimum + + Length Maximum + + Description +
Address Type + data + 11Set to value 16 to denote an NFT Address.
NFT ID + data + 3232The raw bytes of the NFT ID which is the BLAKE2b-256 hash of the Output ID that created it.
+
+
+
+
+
+
Features Count + data + 11The number of features following.
Features atMostOneOfEach +
+ Sender Feature +
Identifies the validated sender of the output.
+ + + + + +
Fields + + + + + + + + + + + + + + + + + + + +
+ Field + + Field type + + Length Minimum + + Length Maximum + + Description +
Feature Type + data + 11Set to value 0 to denote a Sender Feature.
Sender oneOf +
+ Ed25519 Address + + + + + +
Fields + + + + + + + + + + + + + + + + + + + + + + +
+ Field + + Field type + + Length Minimum + + Length Maximum + + Description +
Address Type + data + 11Set to value 0 to denote an Ed25519 Address.
PubKeyHash + data + 3232The raw bytes of the Ed25519 address which is the BLAKE2b-256 hash of the Ed25519 public key.
+
+
+
+ Account Address + + + + + +
Fields + + + + + + + + + + + + + + + + + + + + + + +
+ Field + + Field type + + Length Minimum + + Length Maximum + + Description +
Address Type + data + 11Set to value 8 to denote an Account Address.
Account ID + data + 3232The raw bytes of the Account ID which is the BLAKE2b-256 hash of the Output ID that created it.
+
+
+
+ NFT Address + + + + + +
Fields + + + + + + + + + + + + + + + + + + + + + + +
+ Field + + Field type + + Length Minimum + + Length Maximum + + Description +
Address Type + data + 11Set to value 16 to denote an NFT Address.
NFT ID + data + 3232The raw bytes of the NFT ID which is the BLAKE2b-256 hash of the Output ID that created it.
+
+
+
+
+
+
+ Metadata Feature +
Defines metadata (arbitrary binary data) that will be stored in the output.
+ + + + + +
Fields + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Field + + Field type + + Length Minimum + + Length Maximum + + Description +
Feature Type + data + 11Set to value 2 to denote a Metadata Feature.
Data Length + data + 22Length of the following field.
Data + data + 38194Binary data. A leading uint16 denotes its length.
+
+
+
+ Block Issuer Feature +
Contains the public keys used to verify block signatures.
+ + + + + +
Fields + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Field + + Field type + + Length Minimum + + Length Maximum + + Description +
Feature Type + data + 11Set to value 4 to denote a Block Issuer Feature.
Expiry Slot + data + 88The slot index at which the Block Issuer Feature expires and can be removed.
Block Issuer Keys Count + data + 11The number of Block Issuer Keys.
Block Issuer Keys anyOf +
+ Block Issuer Key Ed25519 + + + + + +
Fields + + + + + + + + + + + + + + + + + + + + + + +
+ Field + + Field type + + Length Minimum + + Length Maximum + + Description +
Block Issuer Key Type + block_issuer_key + 11Set to value 0 to denote a Block Issuer Key Ed25519.
Public Key + block_issuer_key + 3232The raw bytes of the Ed25519 public key.
+
+
+
+
+
+
+ Staking Feature +
Stakes IOTA coins to become eligible for committee selection, validate the network and receive Mana rewards.
+ + + + + +
Fields + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Field + + Field type + + Length Minimum + + Length Maximum + + Description +
Feature Type + staking + 11Set to value 5 to denote a Staking Feature.
Staked Amount + staking + 88The amount of IOTA coins that are locked and staked in the containing account.
Fixed Cost + staking + 88The fixed cost of the validator, which it receives as part of its Mana rewards.
Start Epoch + staking + 88The epoch index in which the staking started.
End Epoch + staking + 88The epoch index in which the staking ends.
+
+
+
Immutable Features Count + data + 11The number of immutable features following. Immutable features are defined upon deployment of the UTXO state machine and are not allowed to change in any future state transition.
Immutable Features atMostOneOfEach +
+ Issuer Feature +
Identifies the validated issuer of the UTXO state machine.
+ + + + + +
Fields + + + + + + + + + + + + + + + + + + + +
+ Field + + Field type + + Length Minimum + + Length Maximum + + Description +
Feature Type + data + 11Set to value 1 to denote a Issuer Feature.
Issuer oneOf +
+ Ed25519 Address + + + + + +
Fields + + + + + + + + + + + + + + + + + + + + + + +
+ Field + + Field type + + Length Minimum + + Length Maximum + + Description +
Address Type + data + 11Set to value 0 to denote an Ed25519 Address.
PubKeyHash + data + 3232The raw bytes of the Ed25519 address which is the BLAKE2b-256 hash of the Ed25519 public key.
+
+
+
+ Account Address + + + + + +
Fields + + + + + + + + + + + + + + + + + + + + + + +
+ Field + + Field type + + Length Minimum + + Length Maximum + + Description +
Address Type + data + 11Set to value 8 to denote an Account Address.
Account ID + data + 3232The raw bytes of the Account ID which is the BLAKE2b-256 hash of the Output ID that created it.
+
+
+
+ NFT Address + + + + + +
Fields + + + + + + + + + + + + + + + + + + + + + + +
+ Field + + Field type + + Length Minimum + + Length Maximum + + Description +
Address Type + data + 11Set to value 16 to denote an NFT Address.
NFT ID + data + 3232The raw bytes of the NFT ID which is the BLAKE2b-256 hash of the Output ID that created it.
+
+
+
+
+
+
+ Metadata Feature +
Defines metadata (arbitrary binary data) that will be stored in the output.
+ + + + + +
Fields + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Field + + Field type + + Length Minimum + + Length Maximum + + Description +
Feature Type + data + 11Set to value 2 to denote a Metadata Feature.
Data Length + data + 22Length of the following field.
Data + data + 38194Binary data. A leading uint16 denotes its length.
+
+
+
+
v_byte MinimumTODO
v_byte MaximumTODO
### Notes From f3f09118702f973ef8c3cfe8557a30592ff374d7 Mon Sep 17 00:00:00 2001 From: Philipp Gackstatter Date: Fri, 22 Sep 2023 10:43:39 +0200 Subject: [PATCH 064/140] Update tips/TIP-0042/tip-0042.md Co-authored-by: /alex/ --- tips/TIP-0042/tip-0042.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tips/TIP-0042/tip-0042.md b/tips/TIP-0042/tip-0042.md index d0ecee5b4..a2b6dfb52 100644 --- a/tips/TIP-0042/tip-0042.md +++ b/tips/TIP-0042/tip-0042.md @@ -74,7 +74,7 @@ Next to block issuance, accounts are used for staking and delegation. Users can become a validator in the protocol. Other users increase a validator's consensus weight by delegating to a staking account of their choice. Staking and delegation have low barriers to entry, as anyone can participate in the validation and no minimum stake is required. Stakers need to lock their tokens in order to become validators, increasing the -committment to the security of the network. +commitment to the security of the network. The account's keys in unlock conditions can be rotated, while its Account ID stays the same. With its ability to own other outputs, this means an improvement for both the security as well as the user experience, as a single account can From 3b3c848c486e3b8ddc5b0a3e8b694f6c85282a83 Mon Sep 17 00:00:00 2001 From: Philipp Gackstatter Date: Fri, 22 Sep 2023 13:35:38 +0200 Subject: [PATCH 065/140] Update State Ctrl & Governor Addr Unlock Cond --- tips/TIP-0042/tip-0042.md | 742 +++++++++++++++++++++++++++++++++++++- 1 file changed, 740 insertions(+), 2 deletions(-) diff --git a/tips/TIP-0042/tip-0042.md b/tips/TIP-0042/tip-0042.md index d0ecee5b4..89e4565a5 100644 --- a/tips/TIP-0042/tip-0042.md +++ b/tips/TIP-0042/tip-0042.md @@ -214,6 +214,375 @@ only be carried out by the `State Controller Address`, hence the distinct unlock
+
+ Multi Address + + + + + + + + + + + + + + + +
+ Name + + Type + + Description +
Address Typeuint8Set to value 32 to denote a Multi Address.
Addresses anyOf +
+ Address with Weight + + + + + + + + + + + + + + + +
+ Name + + Type + + Description +
Address oneOf +
+ Ed25519 Address + + + + + + + + + + + + + + + + +
+ Name + + Type + + Description +
Address Typeuint8Set to value 0 to denote an Ed25519 Address.
PubKeyHashByteArray[32]The raw bytes of the Ed25519 address which is the BLAKE2b-256 hash of the Ed25519 public key.
+
+
+ Account Address + + + + + + + + + + + + + + + + +
+ Name + + Type + + Description +
Address Typeuint8Set to value 8 to denote an Account Address.
Account IDByteArray[32]The raw bytes of the Account ID which is the BLAKE2b-256 hash of the Output ID that created it.
+
+
+ NFT Address + + + + + + + + + + + + + + + + +
+ Name + + Type + + Description +
Address Typeuint8Set to value 16 to denote an NFT Address.
NFT IDByteArray[32]The raw bytes of the NFT ID which is the BLAKE2b-256 hash of the Output ID that created it.
+
+
Weightuint8The weight of the unlocked address.
+
+
+
+
+ Restricted Address + + + + + + + + + + + + + + + + + + + + +
+ Name + + Type + + Description +
Address Typeuint8Set to value 40 to denote a Restricted Address.
Address oneOf +
+ Ed25519 Address + + + + + + + + + + + + + + + + +
+ Name + + Type + + Description +
Address Typeuint8Set to value 0 to denote an Ed25519 Address.
PubKeyHashByteArray[32]The raw bytes of the Ed25519 address which is the BLAKE2b-256 hash of the Ed25519 public key.
+
+
+ Account Address + + + + + + + + + + + + + + + + +
+ Name + + Type + + Description +
Address Typeuint8Set to value 8 to denote an Account Address.
Account IDByteArray[32]The raw bytes of the Account ID which is the BLAKE2b-256 hash of the Output ID that created it.
+
+
+ NFT Address + + + + + + + + + + + + + + + + +
+ Name + + Type + + Description +
Address Typeuint8Set to value 16 to denote an NFT Address.
NFT IDByteArray[32]The raw bytes of the NFT ID which is the BLAKE2b-256 hash of the Output ID that created it.
+
+
+ Multi Address + + + + + + + + + + + + + + + +
+ Name + + Type + + Description +
Address Typeuint8Set to value 32 to denote a Multi Address.
Addresses anyOf +
+ Address with Weight + + + + + + + + + + + + + + + +
+ Name + + Type + + Description +
Address oneOf +
+ Ed25519 Address + + + + + + + + + + + + + + + + +
+ Name + + Type + + Description +
Address Typeuint8Set to value 0 to denote an Ed25519 Address.
PubKeyHashByteArray[32]The raw bytes of the Ed25519 address which is the BLAKE2b-256 hash of the Ed25519 public key.
+
+
+ Account Address + + + + + + + + + + + + + + + + +
+ Name + + Type + + Description +
Address Typeuint8Set to value 8 to denote an Account Address.
Account IDByteArray[32]The raw bytes of the Account ID which is the BLAKE2b-256 hash of the Output ID that created it.
+
+
+ NFT Address + + + + + + + + + + + + + + + + +
+ Name + + Type + + Description +
Address Typeuint8Set to value 16 to denote an NFT Address.
NFT IDByteArray[32]The raw bytes of the NFT ID which is the BLAKE2b-256 hash of the Output ID that created it.
+
+
Weightuint8The weight of the unlocked address.
+
+
+
+
Allowed Capabilities(uint8)ByteArrayBitflags expressed as a series of bytes. A leading uint8 denotes its length.
+
@@ -328,6 +697,375 @@ only be carried out by the `Governor Address`, hence the distinct unlock conditi
+
+ Multi Address + + + + + + + + + + + + + + + +
+ Name + + Type + + Description +
Address Typeuint8Set to value 32 to denote a Multi Address.
Addresses anyOf +
+ Address with Weight + + + + + + + + + + + + + + + +
+ Name + + Type + + Description +
Address oneOf +
+ Ed25519 Address + + + + + + + + + + + + + + + + +
+ Name + + Type + + Description +
Address Typeuint8Set to value 0 to denote an Ed25519 Address.
PubKeyHashByteArray[32]The raw bytes of the Ed25519 address which is the BLAKE2b-256 hash of the Ed25519 public key.
+
+
+ Account Address + + + + + + + + + + + + + + + + +
+ Name + + Type + + Description +
Address Typeuint8Set to value 8 to denote an Account Address.
Account IDByteArray[32]The raw bytes of the Account ID which is the BLAKE2b-256 hash of the Output ID that created it.
+
+
+ NFT Address + + + + + + + + + + + + + + + + +
+ Name + + Type + + Description +
Address Typeuint8Set to value 16 to denote an NFT Address.
NFT IDByteArray[32]The raw bytes of the NFT ID which is the BLAKE2b-256 hash of the Output ID that created it.
+
+
Weightuint8The weight of the unlocked address.
+
+
+
+
+ Restricted Address + + + + + + + + + + + + + + + + + + + + +
+ Name + + Type + + Description +
Address Typeuint8Set to value 40 to denote a Restricted Address.
Address oneOf +
+ Ed25519 Address + + + + + + + + + + + + + + + + +
+ Name + + Type + + Description +
Address Typeuint8Set to value 0 to denote an Ed25519 Address.
PubKeyHashByteArray[32]The raw bytes of the Ed25519 address which is the BLAKE2b-256 hash of the Ed25519 public key.
+
+
+ Account Address + + + + + + + + + + + + + + + + +
+ Name + + Type + + Description +
Address Typeuint8Set to value 8 to denote an Account Address.
Account IDByteArray[32]The raw bytes of the Account ID which is the BLAKE2b-256 hash of the Output ID that created it.
+
+
+ NFT Address + + + + + + + + + + + + + + + + +
+ Name + + Type + + Description +
Address Typeuint8Set to value 16 to denote an NFT Address.
NFT IDByteArray[32]The raw bytes of the NFT ID which is the BLAKE2b-256 hash of the Output ID that created it.
+
+
+ Multi Address + + + + + + + + + + + + + + + +
+ Name + + Type + + Description +
Address Typeuint8Set to value 32 to denote a Multi Address.
Addresses anyOf +
+ Address with Weight + + + + + + + + + + + + + + + +
+ Name + + Type + + Description +
Address oneOf +
+ Ed25519 Address + + + + + + + + + + + + + + + + +
+ Name + + Type + + Description +
Address Typeuint8Set to value 0 to denote an Ed25519 Address.
PubKeyHashByteArray[32]The raw bytes of the Ed25519 address which is the BLAKE2b-256 hash of the Ed25519 public key.
+
+
+ Account Address + + + + + + + + + + + + + + + + +
+ Name + + Type + + Description +
Address Typeuint8Set to value 8 to denote an Account Address.
Account IDByteArray[32]The raw bytes of the Account ID which is the BLAKE2b-256 hash of the Output ID that created it.
+
+
+ NFT Address + + + + + + + + + + + + + + + + +
+ Name + + Type + + Description +
Address Typeuint8Set to value 16 to denote an NFT Address.
NFT IDByteArray[32]The raw bytes of the NFT ID which is the BLAKE2b-256 hash of the Output ID that created it.
+
+
Weightuint8The weight of the unlocked address.
+
+
+
+
Allowed Capabilities(uint8)ByteArrayBitflags expressed as a series of bytes. A leading uint8 denotes its length.
+
@@ -411,7 +1149,7 @@ On protocol level, account unlocking is done using a new unlock type, called **A
Account Unlock -
Points to the unlock of a consumed account output.
+
Points to the unlock of a consumed Account Output.
@@ -433,7 +1171,7 @@ On protocol level, account unlocking is done using a new unlock type, called **A - +
Account Reference Unlock Index uint16Index of input and unlock corresponding to an account output.Index of input and unlock corresponding to an Account Output.
From 62fe779440d9535f78d8f48c4a97324913534f26 Mon Sep 17 00:00:00 2001 From: Philipp Gackstatter Date: Fri, 22 Sep 2023 13:38:39 +0200 Subject: [PATCH 066/140] Add new address types to Account Output --- tips/TIP-0042/tip-0042.md | 772 +++++++++++++++++++++++++++++++++++++- 1 file changed, 755 insertions(+), 17 deletions(-) diff --git a/tips/TIP-0042/tip-0042.md b/tips/TIP-0042/tip-0042.md index 89e4565a5..ac769adfa 100644 --- a/tips/TIP-0042/tip-0042.md +++ b/tips/TIP-0042/tip-0042.md @@ -1475,12 +1475,12 @@ metadata into the UTXO ledger. Mana uint64 - The amount of (stored) Mana held by the output. + The amount of Stored Mana held by the output. Native Tokens Count uint8 - The number of native tokens held by the output. + The number of different native tokens held by the output. Native Tokens optAnyOf @@ -1502,7 +1502,7 @@ metadata into the UTXO ledger. Token ID ByteArray[38] - Identifier of the native token. + Identifier of the native token. Its derivation is defined in TIP-44. Amount @@ -1642,6 +1642,375 @@ metadata into the UTXO ledger.
+
+ Multi Address + + + + + + + + + + + + + + + +
+ Name + + Type + + Description +
Address Typeuint8Set to value 32 to denote a Multi Address.
Addresses anyOf +
+ Address with Weight + + + + + + + + + + + + + + + +
+ Name + + Type + + Description +
Address oneOf +
+ Ed25519 Address + + + + + + + + + + + + + + + + +
+ Name + + Type + + Description +
Address Typeuint8Set to value 0 to denote an Ed25519 Address.
PubKeyHashByteArray[32]The raw bytes of the Ed25519 address which is the BLAKE2b-256 hash of the Ed25519 public key.
+
+
+ Account Address + + + + + + + + + + + + + + + + +
+ Name + + Type + + Description +
Address Typeuint8Set to value 8 to denote an Account Address.
Account IDByteArray[32]The raw bytes of the Account ID which is the BLAKE2b-256 hash of the Output ID that created it.
+
+
+ NFT Address + + + + + + + + + + + + + + + + +
+ Name + + Type + + Description +
Address Typeuint8Set to value 16 to denote an NFT Address.
NFT IDByteArray[32]The raw bytes of the NFT ID which is the BLAKE2b-256 hash of the Output ID that created it.
+
+
Weightuint8The weight of the unlocked address.
+
+
+
+
+ Restricted Address + + + + + + + + + + + + + + + + + + + + +
+ Name + + Type + + Description +
Address Typeuint8Set to value 40 to denote a Restricted Address.
Address oneOf +
+ Ed25519 Address + + + + + + + + + + + + + + + + +
+ Name + + Type + + Description +
Address Typeuint8Set to value 0 to denote an Ed25519 Address.
PubKeyHashByteArray[32]The raw bytes of the Ed25519 address which is the BLAKE2b-256 hash of the Ed25519 public key.
+
+
+ Account Address + + + + + + + + + + + + + + + + +
+ Name + + Type + + Description +
Address Typeuint8Set to value 8 to denote an Account Address.
Account IDByteArray[32]The raw bytes of the Account ID which is the BLAKE2b-256 hash of the Output ID that created it.
+
+
+ NFT Address + + + + + + + + + + + + + + + + +
+ Name + + Type + + Description +
Address Typeuint8Set to value 16 to denote an NFT Address.
NFT IDByteArray[32]The raw bytes of the NFT ID which is the BLAKE2b-256 hash of the Output ID that created it.
+
+
+ Multi Address + + + + + + + + + + + + + + + +
+ Name + + Type + + Description +
Address Typeuint8Set to value 32 to denote a Multi Address.
Addresses anyOf +
+ Address with Weight + + + + + + + + + + + + + + + +
+ Name + + Type + + Description +
Address oneOf +
+ Ed25519 Address + + + + + + + + + + + + + + + + +
+ Name + + Type + + Description +
Address Typeuint8Set to value 0 to denote an Ed25519 Address.
PubKeyHashByteArray[32]The raw bytes of the Ed25519 address which is the BLAKE2b-256 hash of the Ed25519 public key.
+
+
+ Account Address + + + + + + + + + + + + + + + + +
+ Name + + Type + + Description +
Address Typeuint8Set to value 8 to denote an Account Address.
Account IDByteArray[32]The raw bytes of the Account ID which is the BLAKE2b-256 hash of the Output ID that created it.
+
+
+ NFT Address + + + + + + + + + + + + + + + + +
+ Name + + Type + + Description +
Address Typeuint8Set to value 16 to denote an NFT Address.
NFT IDByteArray[32]The raw bytes of the NFT ID which is the BLAKE2b-256 hash of the Output ID that created it.
+
+
Weightuint8The weight of the unlocked address.
+
+
+
+
Allowed Capabilities(uint8)ByteArrayBitflags expressed as a series of bytes. A leading uint8 denotes its length.
+
@@ -1670,7 +2039,59 @@ metadata into the UTXO ledger. Address oneOf
- Ed25519 Address + Ed25519 Address + + + + + + + + + + + + + + + + +
+ Name + + Type + + Description +
Address Typeuint8Set to value 0 to denote an Ed25519 Address.
PubKeyHashByteArray[32]The raw bytes of the Ed25519 address which is the BLAKE2b-256 hash of the Ed25519 public key.
+
+
+ Account Address + + + + + + + + + + + + + + + + +
+ Name + + Type + + Description +
Address Typeuint8Set to value 8 to denote an Account Address.
Account IDByteArray[32]The raw bytes of the Account ID which is the BLAKE2b-256 hash of the Output ID that created it.
+
+
+ NFT Address - + - + - +
@@ -1686,17 +2107,17 @@ metadata into the UTXO ledger.
Address Type uint8Set to value 0 to denote an Ed25519 Address.Set to value 16 to denote an NFT Address.
PubKeyHashNFT ID ByteArray[32]The raw bytes of the Ed25519 address which is the BLAKE2b-256 hash of the Ed25519 public key.The raw bytes of the NFT ID which is the BLAKE2b-256 hash of the Output ID that created it.
- Account Address + Multi Address - + - - - + +
@@ -1712,17 +2133,121 @@ metadata into the UTXO ledger.
Address Type uint8Set to value 8 to denote an Account Address.Set to value 32 to denote a Multi Address.
Account IDByteArray[32]The raw bytes of the Account ID which is the BLAKE2b-256 hash of the Output ID that created it.Addresses anyOf +
+ Address with Weight + + + + + + + + + + + + + + + +
+ Name + + Type + + Description +
Address oneOf +
+ Ed25519 Address + + + + + + + + + + + + + + + + +
+ Name + + Type + + Description +
Address Typeuint8Set to value 0 to denote an Ed25519 Address.
PubKeyHashByteArray[32]The raw bytes of the Ed25519 address which is the BLAKE2b-256 hash of the Ed25519 public key.
+
+
+ Account Address + + + + + + + + + + + + + + + + +
+ Name + + Type + + Description +
Address Typeuint8Set to value 8 to denote an Account Address.
Account IDByteArray[32]The raw bytes of the Account ID which is the BLAKE2b-256 hash of the Output ID that created it.
+
+
+ NFT Address + + + + + + + + + + + + + + + + +
+ Name + + Type + + Description +
Address Typeuint8Set to value 16 to denote an NFT Address.
NFT IDByteArray[32]The raw bytes of the NFT ID which is the BLAKE2b-256 hash of the Output ID that created it.
+
+
Weightuint8The weight of the unlocked address.
+
+
- NFT Address + Restricted Address - + - - - + + + + + + +
@@ -1738,12 +2263,225 @@ metadata into the UTXO ledger.
Address Type uint8Set to value 16 to denote an NFT Address.Set to value 40 to denote a Restricted Address.
NFT IDByteArray[32]The raw bytes of the NFT ID which is the BLAKE2b-256 hash of the Output ID that created it.Address oneOf +
+ Ed25519 Address + + + + + + + + + + + + + + + + +
+ Name + + Type + + Description +
Address Typeuint8Set to value 0 to denote an Ed25519 Address.
PubKeyHashByteArray[32]The raw bytes of the Ed25519 address which is the BLAKE2b-256 hash of the Ed25519 public key.
+
+
+ Account Address + + + + + + + + + + + + + + + + +
+ Name + + Type + + Description +
Address Typeuint8Set to value 8 to denote an Account Address.
Account IDByteArray[32]The raw bytes of the Account ID which is the BLAKE2b-256 hash of the Output ID that created it.
+
+
+ NFT Address + + + + + + + + + + + + + + + + +
+ Name + + Type + + Description +
Address Typeuint8Set to value 16 to denote an NFT Address.
NFT IDByteArray[32]The raw bytes of the NFT ID which is the BLAKE2b-256 hash of the Output ID that created it.
+
+
+ Multi Address + + + + + + + + + + + + + + + +
+ Name + + Type + + Description +
Address Typeuint8Set to value 32 to denote a Multi Address.
Addresses anyOf +
+ Address with Weight + + + + + + + + + + + + + + + +
+ Name + + Type + + Description +
Address oneOf +
+ Ed25519 Address + + + + + + + + + + + + + + + + +
+ Name + + Type + + Description +
Address Typeuint8Set to value 0 to denote an Ed25519 Address.
PubKeyHashByteArray[32]The raw bytes of the Ed25519 address which is the BLAKE2b-256 hash of the Ed25519 public key.
+
+
+ Account Address + + + + + + + + + + + + + + + + +
+ Name + + Type + + Description +
Address Typeuint8Set to value 8 to denote an Account Address.
Account IDByteArray[32]The raw bytes of the Account ID which is the BLAKE2b-256 hash of the Output ID that created it.
+
+
+ NFT Address + + + + + + + + + + + + + + + + +
+ Name + + Type + + Description +
Address Typeuint8Set to value 16 to denote an NFT Address.
NFT IDByteArray[32]The raw bytes of the NFT ID which is the BLAKE2b-256 hash of the Output ID that created it.
+
+
Weightuint8The weight of the unlocked address.
+
+
+
+
Allowed Capabilities(uint8)ByteArrayBitflags expressed as a series of bytes. A leading uint8 denotes its length.
From 14f898d4cca5656346dcbef09ae2875a4523917f Mon Sep 17 00:00:00 2001 From: Philipp Gackstatter Date: Fri, 22 Sep 2023 13:47:02 +0200 Subject: [PATCH 067/140] Update storage deposit with new address types --- tips/TIP-0042/tip-0042.md | 1335 +++++++++++++++++++++++++++++++++---- 1 file changed, 1191 insertions(+), 144 deletions(-) diff --git a/tips/TIP-0042/tip-0042.md b/tips/TIP-0042/tip-0042.md index ac769adfa..78f88f0c0 100644 --- a/tips/TIP-0042/tip-0042.md +++ b/tips/TIP-0042/tip-0042.md @@ -2978,6 +2978,9 @@ The **current state** is defined as the **consumed account output**, while the * The storage deposit of Block Issuer Keys is higher than for other field types. Therefore, the storage deposit calculation of account outputs defines an additional corresponding field type. +| :warning: Preliminary values | +|------------------------------| + @@ -2988,14 +2991,14 @@ calculation of account outputs defines an additional corresponding field type. - + - +
Name
block_issuer_key A Block Issuer Key contained in a Block Issuer Feature.TODO: TBD100 (preliminary value for testing) A block issuer key needs to be kept in-memory for the efficient processing of incoming blocks and cannot be offloaded to disc.
staking Any field contained in a Staking Feature.TODO: TBD100 (preliminary value for testing) Staking requires additional bookkeeping in nodes for committee selection and mana rewards tracking.
@@ -3024,9 +3027,6 @@ The following table shows the Account Output including the possible fields and t Length Maximum - - Description - OutputID @@ -3035,7 +3035,6 @@ The following table shows the Account Output including the possible fields and t 34 34 - The ID of the output. Block ID (included) @@ -3044,7 +3043,6 @@ The following table shows the Account Output including the possible fields and t 40 40 - The ID of the block in which the transaction payload that created this output was included. Slot Booked @@ -3053,7 +3051,6 @@ The following table shows the Account Output including the possible fields and t 8 8 - The index of the slot in which the transaction that created it was booked. Slot Created @@ -3062,7 +3059,6 @@ The following table shows the Account Output including the possible fields and t 8 8 - The index of the slot in which the transaction was created. @@ -3084,9 +3080,6 @@ The following table shows the Account Output including the possible fields and t Length Maximum - - Description - Output Type @@ -3095,7 +3088,6 @@ The following table shows the Account Output including the possible fields and t 1 1 - Set to value 4 to denote an Account Output. Amount @@ -3104,7 +3096,6 @@ The following table shows the Account Output including the possible fields and t 8 8 - The amount of IOTA coins held by the output. Mana @@ -3113,7 +3104,6 @@ The following table shows the Account Output including the possible fields and t 8 8 - The amount of (stored) Mana held by the output. Native Tokens Count @@ -3122,7 +3112,6 @@ The following table shows the Account Output including the possible fields and t 1 1 - The number of native tokens held by the output. Native Tokens optAnyOf @@ -3147,9 +3136,6 @@ The following table shows the Account Output including the possible fields and t Length Maximum - - Description - Token ID @@ -3158,7 +3144,6 @@ The following table shows the Account Output including the possible fields and t 38 38 - Identifier of the native token. Amount @@ -3167,7 +3152,6 @@ The following table shows the Account Output including the possible fields and t 32 32 - Amount of native tokens of the given Token ID. @@ -3183,7 +3167,6 @@ The following table shows the Account Output including the possible fields and t 32 32 - Unique identifier of the account, which is the BLAKE2b-256 hash of the Output ID that created it. Account Address = Account Address Type || Account ID. State Index @@ -3192,7 +3175,6 @@ The following table shows the Account Output including the possible fields and t 4 4 - A counter that must increase by 1 every time the account is state transitioned. State Metadata Length @@ -3201,16 +3183,14 @@ The following table shows the Account Output including the possible fields and t 2 2 - Length of the following field. State Metadata data - 2 - 8194 - Metadata that can only be changed by the state controller. A leading uint16 denotes its length. + 0 + 8192 Foundry Counter @@ -3219,7 +3199,6 @@ The following table shows the Account Output including the possible fields and t 4 4 - A counter that denotes the number of foundries created by this account. Unlock Conditions Count @@ -3228,7 +3207,6 @@ The following table shows the Account Output including the possible fields and t 1 1 - The number of unlock conditions following. Unlock Conditions atMostOneOfEach @@ -3254,9 +3232,6 @@ The following table shows the Account Output including the possible fields and t Length Maximum - - Description - Unlock Condition Type @@ -3265,7 +3240,6 @@ The following table shows the Account Output including the possible fields and t 1 1 - Set to value 4 to denote a State Controller Address Unlock Condition. Address oneOf @@ -3290,9 +3264,6 @@ The following table shows the Account Output including the possible fields and t Length Maximum - - Description - Address Type @@ -3301,7 +3272,6 @@ The following table shows the Account Output including the possible fields and t 1 1 - Set to value 0 to denote an Ed25519 Address. PubKeyHash @@ -3310,7 +3280,6 @@ The following table shows the Account Output including the possible fields and t 32 32 - The raw bytes of the Ed25519 address which is the BLAKE2b-256 hash of the Ed25519 public key. @@ -3337,9 +3306,6 @@ The following table shows the Account Output including the possible fields and t Length Maximum - - Description - Address Type @@ -3348,7 +3314,6 @@ The following table shows the Account Output including the possible fields and t 1 1 - Set to value 8 to denote an Account Address. Account ID @@ -3357,7 +3322,6 @@ The following table shows the Account Output including the possible fields and t 32 32 - The raw bytes of the Account ID which is the BLAKE2b-256 hash of the Output ID that created it. @@ -3384,9 +3348,6 @@ The following table shows the Account Output including the possible fields and t Length Maximum - - Description - Address Type @@ -3395,7 +3356,6 @@ The following table shows the Account Output including the possible fields and t 1 1 - Set to value 16 to denote an NFT Address. NFT ID @@ -3404,7 +3364,595 @@ The following table shows the Account Output including the possible fields and t 32 32 - The raw bytes of the NFT ID which is the BLAKE2b-256 hash of the Output ID that created it. + + + + + + +
+ Multi Address + + + + + +
Fields + + + + + + + + + + + + + + + + + +
+ Field + + Field type + + Length Minimum + + Length Maximum +
Address Type + data + 11
Addresses anyOf +
+ Address with Weight + + + + + +
Fields + + + + + + + + + + + + + + + + + +
+ Field + + Field type + + Length Minimum + + Length Maximum +
Address oneOf +
+ Ed25519 Address + + + + + +
Fields + + + + + + + + + + + + + + + + + + + +
+ Field + + Field type + + Length Minimum + + Length Maximum +
Address Type + data + 11
PubKeyHash + data + 3232
+
+
+
+ Account Address + + + + + +
Fields + + + + + + + + + + + + + + + + + + + +
+ Field + + Field type + + Length Minimum + + Length Maximum +
Address Type + data + 11
Account ID + data + 3232
+
+
+
+ NFT Address + + + + + +
Fields + + + + + + + + + + + + + + + + + + + +
+ Field + + Field type + + Length Minimum + + Length Maximum +
Address Type + data + 11
NFT ID + data + 3232
+
+
+
Weight + data + 11
+
+
+
+
+
+
+ Restricted Address + + + + @@ -3439,9 +3987,6 @@ The following table shows the Account Output including the possible fields and t - @@ -3450,7 +3995,6 @@ The following table shows the Account Output including the possible fields and t - @@ -3475,9 +4019,6 @@ The following table shows the Account Output including the possible fields and t - @@ -3486,7 +4027,6 @@ The following table shows the Account Output including the possible fields and t - @@ -3495,7 +4035,6 @@ The following table shows the Account Output including the possible fields and t -
Fields + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Field + + Field type + + Length Minimum + + Length Maximum +
Address Type + data + 11
Address oneOf +
+ Ed25519 Address + + + + + +
Fields + + + + + + + + + + + + + + + + + + + +
+ Field + + Field type + + Length Minimum + + Length Maximum +
Address Type + data + 11
PubKeyHash + data + 3232
+
+
+
+ Account Address + + + + + +
Fields + + + + + + + + + + + + + + + + + + + +
+ Field + + Field type + + Length Minimum + + Length Maximum +
Address Type + data + 11
Account ID + data + 3232
+
+
+
+ NFT Address + + + + + +
Fields + + + + + + + + + + + + + + + + + + + +
+ Field + + Field type + + Length Minimum + + Length Maximum +
Address Type + data + 11
NFT ID + data + 3232
+
+
+
+ Multi Address + + + + + +
Fields + + + + + + + + + + + + + + + + + +
+ Field + + Field type + + Length Minimum + + Length Maximum +
Address Type + data + 11
Addresses anyOf +
+ Address with Weight + + + + + +
Fields + + + + + + + + + + + + + + + + + +
+ Field + + Field type + + Length Minimum + + Length Maximum +
Address oneOf +
+ Ed25519 Address + + + + + +
Fields + + + + + + + + + + + + + + + + + + + +
+ Field + + Field type + + Length Minimum + + Length Maximum +
Address Type + data + 11
PubKeyHash + data + 3232
+
+
+
+ Account Address + + + + + +
Fields + + + + + + + + + + + + + + + + + + + +
+ Field + + Field type + + Length Minimum + + Length Maximum +
Address Type + data + 11
Account ID + data + 3232
+
+
+
+ NFT Address + + + + + +
Fields + + + + + + + + + + + + + + + + + + + +
+ Field + + Field type + + Length Minimum + + Length Maximum +
Address Type + data + 11
NFT ID + data + 3232
+
+
+
Weight + data + 11
+
+
+
+
+
+
Allowed Capabilities Length + data + 11
Allowed Capabilities + data + 01
Length Maximum - Description -
Unlock Condition Type 1 1Set to value 5 to denote a Governor Address Unlock Condition.
Address oneOf Length Maximum - Description -
Address Type 1 1Set to value 0 to denote an Ed25519 Address.
PubKeyHash 32 32The raw bytes of the Ed25519 address which is the BLAKE2b-256 hash of the Ed25519 public key.
@@ -3522,9 +4061,6 @@ The following table shows the Account Output including the possible fields and t Length Maximum - - Description - Address Type @@ -3533,7 +4069,6 @@ The following table shows the Account Output including the possible fields and t 1 1 - Set to value 8 to denote an Account Address. Account ID @@ -3542,7 +4077,6 @@ The following table shows the Account Output including the possible fields and t 32 32 - The raw bytes of the Account ID which is the BLAKE2b-256 hash of the Output ID that created it. @@ -3569,9 +4103,6 @@ The following table shows the Account Output including the possible fields and t Length Maximum - - Description - Address Type @@ -3580,7 +4111,6 @@ The following table shows the Account Output including the possible fields and t 1 1 - Set to value 16 to denote an NFT Address. NFT ID @@ -3589,7 +4119,595 @@ The following table shows the Account Output including the possible fields and t 32 32 - The raw bytes of the NFT ID which is the BLAKE2b-256 hash of the Output ID that created it. + + + + + +
+
+ Multi Address + + + + + +
Fields + + + + + + + + + + + + + + + + + +
+ Field + + Field type + + Length Minimum + + Length Maximum +
Address Type + data + 11
Addresses anyOf +
+ Address with Weight + + + + + +
Fields + + + + + + + + + + + + + + + + + +
+ Field + + Field type + + Length Minimum + + Length Maximum +
Address oneOf +
+ Ed25519 Address + + + + + +
Fields + + + + + + + + + + + + + + + + + + + +
+ Field + + Field type + + Length Minimum + + Length Maximum +
Address Type + data + 11
PubKeyHash + data + 3232
+
+
+
+ Account Address + + + + + +
Fields + + + + + + + + + + + + + + + + + + + +
+ Field + + Field type + + Length Minimum + + Length Maximum +
Address Type + data + 11
Account ID + data + 3232
+
+
+
+ NFT Address + + + + + +
Fields + + + + + + + + + + + + + + + + + + + +
+ Field + + Field type + + Length Minimum + + Length Maximum +
Address Type + data + 11
NFT ID + data + 3232
+
+
+
Weight + data + 11
+
+
+
+
+
+
+ Restricted Address + + + + @@ -3612,7 +4730,6 @@ The following table shows the Account Output including the possible fields and t - @@ -3638,9 +4755,6 @@ The following table shows the Account Output including the possible fields and t - @@ -3649,7 +4763,6 @@ The following table shows the Account Output including the possible fields and t - @@ -3674,9 +4787,6 @@ The following table shows the Account Output including the possible fields and t - @@ -3685,7 +4795,6 @@ The following table shows the Account Output including the possible fields and t - @@ -3694,7 +4803,6 @@ The following table shows the Account Output including the possible fields and t -
Fields + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Field + + Field type + + Length Minimum + + Length Maximum +
Address Type + data + 11
Address oneOf +
+ Ed25519 Address + + + + + +
Fields + + + + + + + + + + + + + + + + + + + +
+ Field + + Field type + + Length Minimum + + Length Maximum +
Address Type + data + 11
PubKeyHash + data + 3232
+
+
+
+ Account Address + + + + + +
Fields + + + + + + + + + + + + + + + + + + + +
+ Field + + Field type + + Length Minimum + + Length Maximum +
Address Type + data + 11
Account ID + data + 3232
+
+
+
+ NFT Address + + + + + +
Fields + + + + + + + + + + + + + + + + + + + +
+ Field + + Field type + + Length Minimum + + Length Maximum +
Address Type + data + 11
NFT ID + data + 3232
+
+
+
+ Multi Address + + + + + +
Fields + + + + + + + + + + + + + + + + + +
+ Field + + Field type + + Length Minimum + + Length Maximum +
Address Type + data + 11
Addresses anyOf +
+ Address with Weight + + + + + +
Fields + + + + + + + + + + + + + + + + + +
+ Field + + Field type + + Length Minimum + + Length Maximum +
Address oneOf +
+ Ed25519 Address + + + + + +
Fields + + + + + + + + + + + + + + + + + + + +
+ Field + + Field type + + Length Minimum + + Length Maximum +
Address Type + data + 11
PubKeyHash + data + 3232
+
+
+
+ Account Address + + + + + +
Fields + + + + + + + + + + + + + + + + + + + +
+ Field + + Field type + + Length Minimum + + Length Maximum +
Address Type + data + 11
Account ID + data + 3232
+
+
+
+ NFT Address + + + + + +
Fields + + + + + + + + + + + + + + + + + + + +
+ Field + + Field type + + Length Minimum + + Length Maximum +
Address Type + data + 11
NFT ID + data + 3232
+
+
+
Weight + data + 11
+
+
+
+
+
+
Allowed Capabilities Length + data + 11
Allowed Capabilities + data + 01
1 1The number of features following.
Features atMostOneOfEach Length Maximum - Description -
Feature Type 1 1Set to value 0 to denote a Sender Feature.
Sender oneOf Length Maximum - Description -
Address Type 1 1Set to value 0 to denote an Ed25519 Address.
PubKeyHash 32 32The raw bytes of the Ed25519 address which is the BLAKE2b-256 hash of the Ed25519 public key.
@@ -3721,9 +4829,6 @@ The following table shows the Account Output including the possible fields and t Length Maximum - - Description - Address Type @@ -3732,7 +4837,6 @@ The following table shows the Account Output including the possible fields and t 1 1 - Set to value 8 to denote an Account Address. Account ID @@ -3741,7 +4845,6 @@ The following table shows the Account Output including the possible fields and t 32 32 - The raw bytes of the Account ID which is the BLAKE2b-256 hash of the Output ID that created it. @@ -3768,9 +4871,6 @@ The following table shows the Account Output including the possible fields and t Length Maximum - - Description - Address Type @@ -3779,7 +4879,6 @@ The following table shows the Account Output including the possible fields and t 1 1 - Set to value 16 to denote an NFT Address. NFT ID @@ -3788,7 +4887,6 @@ The following table shows the Account Output including the possible fields and t 32 32 - The raw bytes of the NFT ID which is the BLAKE2b-256 hash of the Output ID that created it. @@ -3823,9 +4921,6 @@ The following table shows the Account Output including the possible fields and t Length Maximum - - Description - Feature Type @@ -3834,7 +4929,6 @@ The following table shows the Account Output including the possible fields and t 1 1 - Set to value 2 to denote a Metadata Feature. Data Length @@ -3843,16 +4937,14 @@ The following table shows the Account Output including the possible fields and t 2 2 - Length of the following field. Data data - 3 - 8194 - Binary data. A leading uint16 denotes its length. + 1 + 8192 @@ -3880,9 +4972,6 @@ The following table shows the Account Output including the possible fields and t Length Maximum - - Description - Feature Type @@ -3891,7 +4980,6 @@ The following table shows the Account Output including the possible fields and t 1 1 - Set to value 4 to denote a Block Issuer Feature. Expiry Slot @@ -3900,7 +4988,6 @@ The following table shows the Account Output including the possible fields and t 8 8 - The slot index at which the Block Issuer Feature expires and can be removed. Block Issuer Keys Count @@ -3909,7 +4996,6 @@ The following table shows the Account Output including the possible fields and t 1 1 - The number of Block Issuer Keys. Block Issuer Keys anyOf @@ -3934,9 +5020,6 @@ The following table shows the Account Output including the possible fields and t Length Maximum - - Description - Block Issuer Key Type @@ -3945,7 +5028,6 @@ The following table shows the Account Output including the possible fields and t 1 1 - Set to value 0 to denote a Block Issuer Key Ed25519. Public Key @@ -3954,7 +5036,6 @@ The following table shows the Account Output including the possible fields and t 32 32 - The raw bytes of the Ed25519 public key. @@ -3989,9 +5070,6 @@ The following table shows the Account Output including the possible fields and t Length Maximum - - Description - Feature Type @@ -4000,7 +5078,6 @@ The following table shows the Account Output including the possible fields and t 1 1 - Set to value 5 to denote a Staking Feature. Staked Amount @@ -4009,7 +5086,6 @@ The following table shows the Account Output including the possible fields and t 8 8 - The amount of IOTA coins that are locked and staked in the containing account. Fixed Cost @@ -4018,7 +5094,6 @@ The following table shows the Account Output including the possible fields and t 8 8 - The fixed cost of the validator, which it receives as part of its Mana rewards. Start Epoch @@ -4027,7 +5102,6 @@ The following table shows the Account Output including the possible fields and t 8 8 - The epoch index in which the staking started. End Epoch @@ -4036,7 +5110,6 @@ The following table shows the Account Output including the possible fields and t 8 8 - The epoch index in which the staking ends. @@ -4052,7 +5125,6 @@ The following table shows the Account Output including the possible fields and t 1 1 - The number of immutable features following. Immutable features are defined upon deployment of the UTXO state machine and are not allowed to change in any future state transition. Immutable Features atMostOneOfEach @@ -4078,9 +5150,6 @@ The following table shows the Account Output including the possible fields and t Length Maximum - - Description - Feature Type @@ -4089,7 +5158,6 @@ The following table shows the Account Output including the possible fields and t 1 1 - Set to value 1 to denote a Issuer Feature. Issuer oneOf @@ -4114,9 +5182,6 @@ The following table shows the Account Output including the possible fields and t Length Maximum - - Description - Address Type @@ -4125,7 +5190,6 @@ The following table shows the Account Output including the possible fields and t 1 1 - Set to value 0 to denote an Ed25519 Address. PubKeyHash @@ -4134,7 +5198,6 @@ The following table shows the Account Output including the possible fields and t 32 32 - The raw bytes of the Ed25519 address which is the BLAKE2b-256 hash of the Ed25519 public key. @@ -4161,9 +5224,6 @@ The following table shows the Account Output including the possible fields and t Length Maximum - - Description - Address Type @@ -4172,7 +5232,6 @@ The following table shows the Account Output including the possible fields and t 1 1 - Set to value 8 to denote an Account Address. Account ID @@ -4181,7 +5240,6 @@ The following table shows the Account Output including the possible fields and t 32 32 - The raw bytes of the Account ID which is the BLAKE2b-256 hash of the Output ID that created it. @@ -4208,9 +5266,6 @@ The following table shows the Account Output including the possible fields and t Length Maximum - - Description - Address Type @@ -4219,7 +5274,6 @@ The following table shows the Account Output including the possible fields and t 1 1 - Set to value 16 to denote an NFT Address. NFT ID @@ -4228,7 +5282,6 @@ The following table shows the Account Output including the possible fields and t 32 32 - The raw bytes of the NFT ID which is the BLAKE2b-256 hash of the Output ID that created it. @@ -4263,9 +5316,6 @@ The following table shows the Account Output including the possible fields and t Length Maximum - - Description - Feature Type @@ -4274,7 +5324,6 @@ The following table shows the Account Output including the possible fields and t 1 1 - Set to value 2 to denote a Metadata Feature. Data Length @@ -4283,16 +5332,14 @@ The following table shows the Account Output including the possible fields and t 2 2 - Length of the following field. Data data - 3 - 8194 - Binary data. A leading uint16 denotes its length. + 1 + 8192 @@ -4306,11 +5353,11 @@ The following table shows the Account Output including the possible fields and t v_byte Minimum - TODO + 527 v_byte Maximum - TODO + 455989 From 1139334934b6fee5171fad94b849d66c0321cef7 Mon Sep 17 00:00:00 2001 From: Philipp Gackstatter Date: Fri, 22 Sep 2023 16:01:01 +0200 Subject: [PATCH 068/140] Add min account for implicit account deposit --- tips/TIP-0042/tip-0042.md | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/tips/TIP-0042/tip-0042.md b/tips/TIP-0042/tip-0042.md index 0f74ee0df..c24037281 100644 --- a/tips/TIP-0042/tip-0042.md +++ b/tips/TIP-0042/tip-0042.md @@ -5384,14 +5384,24 @@ converted to a regular account. To create an implicit account, a Basic Output is created on the output side of a transaction and the `Address` in the `Address Unlock Condition` is set to an address of type _Implicit Account Creation Address_. +- Let `Min Block Issuer Account Amount` be the amount of IOTA coins required to cover the storage deposit for a minimal + Account Output that contains a Block Issuer Feature. To calculate this amount, calculate the storage deposit of an + account with all required fields set and which fulfills the following conditions: + - `Native Tokens Count` must be `0`. + - `State Metadata` must be empty. + - `State Controller Address Unlock Condition` and `Governor Address Unlock Condition` must contain an _Ed25519 + Address_. + - `Features Count` must be `1`. + - A _Block Issuer Feature_ must be present with `Block Issuer Keys Count == 1` and a block issuer key of type _Block + Issuer Key Ed25519_. + - `Immutable Features Count` must be `0`. - If an output in a transaction contains an unlock condition with an implicit account address, that output is referred to as an `Implicit Account`, and the transaction is valid only if all of the following conditions hold: - The `Implicit Account` is of type `Basic Output`. - The `Implicit Account`'s `Unlock Conditions Count == 1`. - The unlock condition on the `Implicit Account` is of type `Address Unlock Condition`. - The `Implicit Account`'s `Native Tokens Count == 0`. - - It must hold for the `Amount` of the `Implicit Account`: - `Amount >= Storage Deposit of Minimal Account Output with Block Issuer Feature` (TODO: Calculate) + - It must hold for the `Amount` of the `Implicit Account`: `Amount >= Min Block Issuer Account Amount`. - It must hold for the `Mana` on the `Implicit Account`: `Mana >= RMC Min * factor` (TODO: Define factor). ### Conversion Semantic Transaction Validation Rules From 0129cfd33192f940d703541e09ef25679e15a696 Mon Sep 17 00:00:00 2001 From: Philipp Gackstatter Date: Fri, 22 Sep 2023 16:24:33 +0200 Subject: [PATCH 069/140] Add block issuer feature migration procedure --- tips/TIP-0042/tip-0042.md | 35 +++++++++++++++++++++++++++++++++-- 1 file changed, 33 insertions(+), 2 deletions(-) diff --git a/tips/TIP-0042/tip-0042.md b/tips/TIP-0042/tip-0042.md index c24037281..1e44ff98a 100644 --- a/tips/TIP-0042/tip-0042.md +++ b/tips/TIP-0042/tip-0042.md @@ -29,7 +29,9 @@ replaces: TIP-18 - [Staking Feature](#staking-feature) 6. [Account Output](#account-output) 7. [Implicit Account](#implicit-account) -8. [Copyright](#copyright) +8. [Migration](#migration) +9. [Rationale & Alternatives](#rationale--alternatives) +10. [Copyright](#copyright) # Summary @@ -2979,7 +2981,7 @@ The storage deposit of Block Issuer Keys is higher than for other field types. T calculation of account outputs defines an additional corresponding field type. | :warning: Preliminary values | -|------------------------------| +| ---------------------------- | @@ -5430,6 +5432,35 @@ implicit accounts as well, as defined below. An implicit account can issue a block by using the public key from which the implicit account creation address was derived as a block issuer key. +# Migration + +## Alias to Account Conversion + +_Alias Outputs_ in Stardust-based networks are converted to _Account Outputs_. Account Outputs' BIC balance is set to +`0`. + +## Block Issuer Accounts + +Since IOTA 2.0 requires Accounts with a Block Issuer Feature to issue blocks and Stardust-based networks do not have +these, a migration procedure is required so the network can be bootstrapped. Users can add a serialized Block Issuer +Feature to an _Alias Output_ which is converted to an _Account Output_ with a Block Issuer Feature and the Metadata +Feature is removed from the output. This transition is only done if all of the following conditions hold: + +- the _Alias Output_'s `Amount` is at least `Block Issuer Account Amount`. It is calculated in the same way as + `Min Block Issuer Account Amount` defined in + [Implicit Account (Creation Semantic Transaction Validation Rules)](#creation-semantic-transaction-validation-rules), + except that the `Block Issuer Keys Count` of the output for the deposit calculation must be set to the value of the + `Block Issuer Keys Count` read from the serialized Block Issuer Feature in the to-be-converted _Alias Output_. +- The serialized Block Issuer Feature is prefixed with the ascii-encoded string `BlockIssuerFeature`, which is + `[0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x49, 0x73, 0x73, 0x75, 0x65, 0x72, 0x46, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65]` in hex + encoding, expressed as a list in JSON. +- The Block Issuer Feature must pass syntactic validation. +- It is recommended to set the `Expiry Slot` in the Block Issuer Feature sufficiently far into the future. Note that the + slot set as `Expiry Slot` is relative to the start of the network, which starts at slot `1`. (TODO: Validate whether + network starts at `1`.) + +If not all conditions hold, the Alias is converted to an Account Output with its Metadata Feature untouched. + # Rationale & Alternatives ## Implicit Accounts From 7b9ed5e582adc522e42659174d55a98361fd0003 Mon Sep 17 00:00:00 2001 From: Philipp Gackstatter Date: Fri, 22 Sep 2023 17:00:51 +0200 Subject: [PATCH 070/140] Rephrase `Expiry Slot` recommendation --- tips/TIP-0042/tip-0042.md | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/tips/TIP-0042/tip-0042.md b/tips/TIP-0042/tip-0042.md index 1e44ff98a..079095191 100644 --- a/tips/TIP-0042/tip-0042.md +++ b/tips/TIP-0042/tip-0042.md @@ -5455,12 +5455,11 @@ Feature is removed from the output. This transition is only done if all of the f `[0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x49, 0x73, 0x73, 0x75, 0x65, 0x72, 0x46, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65]` in hex encoding, expressed as a list in JSON. - The Block Issuer Feature must pass syntactic validation. -- It is recommended to set the `Expiry Slot` in the Block Issuer Feature sufficiently far into the future. Note that the - slot set as `Expiry Slot` is relative to the start of the network, which starts at slot `1`. (TODO: Validate whether - network starts at `1`.) If not all conditions hold, the Alias is converted to an Account Output with its Metadata Feature untouched. +Note: It is recommended to set the `Expiry Slot` to the maximum value of a `uint64`. + # Rationale & Alternatives ## Implicit Accounts @@ -5472,6 +5471,8 @@ requirement being owned funds in an output. TODO: Justify initial Mana deposit. +TODO: Describe utility of max `uint64` values for `Expiry Slot` and `End Epoch`. + # Copyright Copyright and related rights waived via [CC0](https://creativecommons.org/publicdomain/zero/1.0/). From 36f41a8fd3b4eb4842697f527ba3207ef4328044 Mon Sep 17 00:00:00 2001 From: Philipp Gackstatter Date: Fri, 22 Sep 2023 17:12:06 +0200 Subject: [PATCH 071/140] Update Block Issuer Key types --- tips/TIP-0042/tip-0042.md | 39 ++++++++++++++++++++++++++++++++++----- 1 file changed, 34 insertions(+), 5 deletions(-) diff --git a/tips/TIP-0042/tip-0042.md b/tips/TIP-0042/tip-0042.md index 079095191..61ea5ab3b 100644 --- a/tips/TIP-0042/tip-0042.md +++ b/tips/TIP-0042/tip-0042.md @@ -1302,7 +1302,7 @@ account is locked to that account.
Block Issuer Keys anyOf
- Block Issuer Key Ed25519 + Block Issuer Key Ed25519 Public Key - + @@ -2667,7 +2667,7 @@ metadata into the UTXO ledger.
@@ -1318,7 +1318,7 @@ account is locked to that account.
Block Issuer Key Type uint8Set to value 0 to denote a Block Issuer Key Ed25519.Set to value 0 to denote a Block Issuer Key Ed25519 Public Key.
Public KeyBlock Issuer Keys anyOf
- Block Issuer Key Ed25519 + Block Issuer Key Ed25519 Public Key - + @@ -5430,7 +5430,36 @@ implicit accounts as well, as defined below. ### Implicit Account Block Issuance An implicit account can issue a block by using the public key from which the implicit account creation address was -derived as a block issuer key. +derived as a block issuer key. A separate block issuer key type is reserved for that, which is however never used in +transactions directly. + +
+ Block Issuer Key Ed25519 Address +
A block issuer key for issuing blocks from implicit accounts.
+
+
@@ -2683,7 +2683,7 @@ metadata into the UTXO ledger.
Block Issuer Key Type uint8Set to value 0 to denote a Block Issuer Key Ed25519.Set to value 0 to denote a Block Issuer Key Ed25519 Public Key.
Public Key
+ + + + + + + + + + + + + + + +
+ Name + + Type + + Description +
Block Issuer Key Typeuint8Set to value 1 to denote a Block Issuer Key Ed25519 Address.
PubKeyHashByteArray[32]The raw bytes of the Implicit Account Creation Address which is the BLAKE2b-256 hash of the Ed25519 public key.
# Migration From 3eb5066d595fab0be0ea5d94579c7b19d6c9ffe1 Mon Sep 17 00:00:00 2001 From: Philipp Gackstatter Date: Tue, 26 Sep 2023 13:34:31 +0200 Subject: [PATCH 072/140] Update tips/TIP-0042/tip-0042.md Co-authored-by: Thibault Martinez --- tips/TIP-0042/tip-0042.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tips/TIP-0042/tip-0042.md b/tips/TIP-0042/tip-0042.md index 61ea5ab3b..7ec6e330d 100644 --- a/tips/TIP-0042/tip-0042.md +++ b/tips/TIP-0042/tip-0042.md @@ -5413,7 +5413,7 @@ containing a transaction that consumes the implicit account on the input side an output side. Since an implicit account can issue blocks, some of the requirements of a block issuer account apply to implicit accounts as well, as defined below. -- The account ID of an `Implicit Account` is refered to as `Implicit Account ID` and is the BLAKE2b-256 hash of the +- The account ID of an `Implicit Account` is referred to as `Implicit Account ID` and is the BLAKE2b-256 hash of the Output ID of the Basic Output that represents the `Implicit Account`. - If a transaction contains an input with an unlock condition containing an implicit account address, the transaction is only valid if all of the following conditions hold: From a6af39084dc6d3fc14264bfa75b792aac768d98b Mon Sep 17 00:00:00 2001 From: Philipp Gackstatter Date: Tue, 26 Sep 2023 13:35:18 +0200 Subject: [PATCH 073/140] Add missing Staking Feature in allowed features --- tips/TIP-0042/tip-0042.md | 1 + 1 file changed, 1 insertion(+) diff --git a/tips/TIP-0042/tip-0042.md b/tips/TIP-0042/tip-0042.md index 7ec6e330d..9ad1f2906 100644 --- a/tips/TIP-0042/tip-0042.md +++ b/tips/TIP-0042/tip-0042.md @@ -2906,6 +2906,7 @@ metadata into the UTXO ledger. - Sender Feature - Metadata Feature - Block Issuer Feature + - Staking Feature - It must hold true that `0` ≤ `Immutable Features Count` ≤ `2`. - `Feature Type` of a Feature in `Immutable Features` must define on of the following types: - Issuer Feature From 7dfe9fff8065c20bcdd6c2c4749b511c4ad0c855 Mon Sep 17 00:00:00 2001 From: Philipp Gackstatter Date: Tue, 26 Sep 2023 13:57:03 +0200 Subject: [PATCH 074/140] Motivate implicit accounts & add address type def --- tips/TIP-0042/tip-0042.md | 43 ++++++++++++++++++++++++++++++++------- 1 file changed, 36 insertions(+), 7 deletions(-) diff --git a/tips/TIP-0042/tip-0042.md b/tips/TIP-0042/tip-0042.md index 9ad1f2906..dbf68d22a 100644 --- a/tips/TIP-0042/tip-0042.md +++ b/tips/TIP-0042/tip-0042.md @@ -5376,11 +5376,41 @@ The following table shows the Account Output including the possible fields and t ## Implicit Account -TODO: Describe motivation for this feature. +Accounts face a bootstrapping problem since users +need to own an Account with a _Block Issuer Feature_ in order to issue blocks, but cannot create it themselves, since +they cannot issue blocks yet. While users are always reliant on third-parties onboarding users into the network, an implicit account simplifies this onboarding. An _Implicit Account_ is defined as a Basic Output owned by a special address type, the _Implicit Account Creation Address_. The implicit accounts only purpose and functionality is to be converted to a regular account. -An _Implicit Account_ is defined as a Basic Output owned by an _Implicit Account Creation Address_, defined in -[TIP-50](../TIP-0050/tip-0050.md#implicit-account-creation-address). Its only purpose and functionality is to be -converted to a regular account. +Firstly, most third-parties sending funds to users use the simplest possible way to do so, that is, Basic Outputs, be it exchanges or users creation a simple value transaction in a wallet. +Secondly, even if third parties are willing to create regular accounts for users, they would additionally have to request block issuer keys from the user, which they would add to a Block Issuer Feature in the newly created Account, in order for the new owner to be able to issue blocks with it. + +Implicit Accounts address both of these issues. Third-parties can easily create implicit accounts for a user, without even being aware of it, if that user simply hands them an _Implicit Account Creation Address_ instead of another address type. +An implicit account has an implicitly defined Block Issuer Key, corresponding to the address itself. Thus implicit accounts can issue blocks by signing blocks with the private key corresponding to the public key from which the _Implicit Account Creation Address_ was derived. + +Thus, since implicit accounts are much easier to create than a regular account, and are sufficient to create a full account from, without having to rely on a third party, the barrier to entry for the network is lowered. + +The _Implicit Account Creation Address_ is defined as follows: + + + + + + + + + + + + + + + + + +
NameTypeDescription
Address Typeuint8 + Set to value 24 to denote an Implicit Account Creation Address. +
PubKeyHashByteArray[32]The raw bytes of the Implicit Account Creation Address which is the BLAKE2b-256 hash of the Ed25519 public key.
+ +An _Implicit Account Creation Address_ is structurally the same as an _Ed25519 Address_, except for the _Address Type_, and thus also backed by an Ed25519 key pair. ### Creation Semantic Transaction Validation Rules @@ -5388,8 +5418,8 @@ To create an implicit account, a Basic Output is created on the output side of a `Address Unlock Condition` is set to an address of type _Implicit Account Creation Address_. - Let `Min Block Issuer Account Amount` be the amount of IOTA coins required to cover the storage deposit for a minimal - Account Output that contains a Block Issuer Feature. To calculate this amount, calculate the storage deposit of an - account with all required fields set and which fulfills the following conditions: + Account Output that contains a Block Issuer Feature. To calculate this amount, the storage deposit of an + account with all required fields set is taken and which fulfills the following conditions: - `Native Tokens Count` must be `0`. - `State Metadata` must be empty. - `State Controller Address Unlock Condition` and `Governor Address Unlock Condition` must contain an _Ed25519 @@ -5405,7 +5435,6 @@ To create an implicit account, a Basic Output is created on the output side of a - The unlock condition on the `Implicit Account` is of type `Address Unlock Condition`. - The `Implicit Account`'s `Native Tokens Count == 0`. - It must hold for the `Amount` of the `Implicit Account`: `Amount >= Min Block Issuer Account Amount`. - - It must hold for the `Mana` on the `Implicit Account`: `Mana >= RMC Min * factor` (TODO: Define factor). ### Conversion Semantic Transaction Validation Rules From 17c66f320959b0ba6fc6a143004a38f96d627414 Mon Sep 17 00:00:00 2001 From: Philipp Gackstatter Date: Tue, 26 Sep 2023 13:59:35 +0200 Subject: [PATCH 075/140] Apply formatting --- tips/TIP-0042/tip-0042.md | 32 +++++++++++++++++++++----------- 1 file changed, 21 insertions(+), 11 deletions(-) diff --git a/tips/TIP-0042/tip-0042.md b/tips/TIP-0042/tip-0042.md index dbf68d22a..34565f0c4 100644 --- a/tips/TIP-0042/tip-0042.md +++ b/tips/TIP-0042/tip-0042.md @@ -5376,17 +5376,26 @@ The following table shows the Account Output including the possible fields and t ## Implicit Account -Accounts face a bootstrapping problem since users -need to own an Account with a _Block Issuer Feature_ in order to issue blocks, but cannot create it themselves, since -they cannot issue blocks yet. While users are always reliant on third-parties onboarding users into the network, an implicit account simplifies this onboarding. An _Implicit Account_ is defined as a Basic Output owned by a special address type, the _Implicit Account Creation Address_. The implicit accounts only purpose and functionality is to be converted to a regular account. +Accounts face a bootstrapping problem since users need to own an Account with a _Block Issuer Feature_ in order to issue +blocks, but cannot create it themselves, since they cannot issue blocks yet. While users are always reliant on +third-parties onboarding users into the network, an implicit account simplifies this onboarding. An _Implicit Account_ +is defined as a Basic Output owned by a special address type, the _Implicit Account Creation Address_. The implicit +accounts only purpose and functionality is to be converted to a regular account. -Firstly, most third-parties sending funds to users use the simplest possible way to do so, that is, Basic Outputs, be it exchanges or users creation a simple value transaction in a wallet. -Secondly, even if third parties are willing to create regular accounts for users, they would additionally have to request block issuer keys from the user, which they would add to a Block Issuer Feature in the newly created Account, in order for the new owner to be able to issue blocks with it. +Firstly, most third-parties sending funds to users use the simplest possible way to do so, that is, Basic Outputs, be it +exchanges or users creation a simple value transaction in a wallet. Secondly, even if third parties are willing to +create regular accounts for users, they would additionally have to request block issuer keys from the user, which they +would add to a Block Issuer Feature in the newly created Account, in order for the new owner to be able to issue blocks +with it. -Implicit Accounts address both of these issues. Third-parties can easily create implicit accounts for a user, without even being aware of it, if that user simply hands them an _Implicit Account Creation Address_ instead of another address type. -An implicit account has an implicitly defined Block Issuer Key, corresponding to the address itself. Thus implicit accounts can issue blocks by signing blocks with the private key corresponding to the public key from which the _Implicit Account Creation Address_ was derived. +Implicit Accounts address both of these issues. Third-parties can easily create implicit accounts for a user, without +even being aware of it, if that user simply hands them an _Implicit Account Creation Address_ instead of another address +type. An implicit account has an implicitly defined Block Issuer Key, corresponding to the address itself. Thus implicit +accounts can issue blocks by signing blocks with the private key corresponding to the public key from which the +_Implicit Account Creation Address_ was derived. -Thus, since implicit accounts are much easier to create than a regular account, and are sufficient to create a full account from, without having to rely on a third party, the barrier to entry for the network is lowered. +Thus, since implicit accounts are much easier to create than a regular account, and are sufficient to create a full +account from, without having to rely on a third party, the barrier to entry for the network is lowered. The _Implicit Account Creation Address_ is defined as follows: @@ -5410,7 +5419,8 @@ The _Implicit Account Creation Address_ is defined as follows:
-An _Implicit Account Creation Address_ is structurally the same as an _Ed25519 Address_, except for the _Address Type_, and thus also backed by an Ed25519 key pair. +An _Implicit Account Creation Address_ is structurally the same as an _Ed25519 Address_, except for the _Address Type_, +and thus also backed by an Ed25519 key pair. ### Creation Semantic Transaction Validation Rules @@ -5418,8 +5428,8 @@ To create an implicit account, a Basic Output is created on the output side of a `Address Unlock Condition` is set to an address of type _Implicit Account Creation Address_. - Let `Min Block Issuer Account Amount` be the amount of IOTA coins required to cover the storage deposit for a minimal - Account Output that contains a Block Issuer Feature. To calculate this amount, the storage deposit of an - account with all required fields set is taken and which fulfills the following conditions: + Account Output that contains a Block Issuer Feature. To calculate this amount, the storage deposit of an account with + all required fields set is taken and which fulfills the following conditions: - `Native Tokens Count` must be `0`. - `State Metadata` must be empty. - `State Controller Address Unlock Condition` and `Governor Address Unlock Condition` must contain an _Ed25519 From 2d0af01194e1c1779297473afeaf1eca63d5d5e0 Mon Sep 17 00:00:00 2001 From: Philipp Gackstatter Date: Tue, 26 Sep 2023 14:23:38 +0200 Subject: [PATCH 076/140] Def VBytes for implicit account creation addr --- tips/TIP-0042/tip-0042.md | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/tips/TIP-0042/tip-0042.md b/tips/TIP-0042/tip-0042.md index 34565f0c4..a37514984 100644 --- a/tips/TIP-0042/tip-0042.md +++ b/tips/TIP-0042/tip-0042.md @@ -5422,14 +5422,11 @@ The _Implicit Account Creation Address_ is defined as follows: An _Implicit Account Creation Address_ is structurally the same as an _Ed25519 Address_, except for the _Address Type_, and thus also backed by an Ed25519 key pair. -### Creation Semantic Transaction Validation Rules +### Storage Deposit -To create an implicit account, a Basic Output is created on the output side of a transaction and the `Address` in the -`Address Unlock Condition` is set to an address of type _Implicit Account Creation Address_. - -- Let `Min Block Issuer Account Amount` be the amount of IOTA coins required to cover the storage deposit for a minimal - Account Output that contains a Block Issuer Feature. To calculate this amount, the storage deposit of an account with - all required fields set is taken and which fulfills the following conditions: +- The storage deposit of an _Implicit Account Creation Address_ defines a dedicated VByte Offset. It is equal to the + VBytes required for a minimal Account Output that contains a Block Issuer Feature. To calculate this amount, the + VBytes of an account with all required fields set is taken and which fulfills the following conditions: - `Native Tokens Count` must be `0`. - `State Metadata` must be empty. - `State Controller Address Unlock Condition` and `Governor Address Unlock Condition` must contain an _Ed25519 @@ -5438,13 +5435,18 @@ To create an implicit account, a Basic Output is created on the output side of a - A _Block Issuer Feature_ must be present with `Block Issuer Keys Count == 1` and a block issuer key of type _Block Issuer Key Ed25519_. - `Immutable Features Count` must be `0`. + +### Creation Semantic Transaction Validation Rules + +To create an implicit account, a Basic Output is created on the output side of a transaction and the `Address` in the +`Address Unlock Condition` is set to an address of type _Implicit Account Creation Address_. + - If an output in a transaction contains an unlock condition with an implicit account address, that output is referred to as an `Implicit Account`, and the transaction is valid only if all of the following conditions hold: - The `Implicit Account` is of type `Basic Output`. - The `Implicit Account`'s `Unlock Conditions Count == 1`. - The unlock condition on the `Implicit Account` is of type `Address Unlock Condition`. - The `Implicit Account`'s `Native Tokens Count == 0`. - - It must hold for the `Amount` of the `Implicit Account`: `Amount >= Min Block Issuer Account Amount`. ### Conversion Semantic Transaction Validation Rules From 8b945f65760cab0ebb84cc3622dbd7e984f0b476 Mon Sep 17 00:00:00 2001 From: Philipp Gackstatter Date: Tue, 26 Sep 2023 16:48:22 +0200 Subject: [PATCH 077/140] Clarify Ed25519 PubKey in Block Issuer Key name --- tips/TIP-0042/tip-0042.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/tips/TIP-0042/tip-0042.md b/tips/TIP-0042/tip-0042.md index a37514984..55a86eaf7 100644 --- a/tips/TIP-0042/tip-0042.md +++ b/tips/TIP-0042/tip-0042.md @@ -2667,7 +2667,7 @@ metadata into the UTXO ledger.
Block Issuer Keys anyOf
- Block Issuer Key Ed25519 Public Key + Ed25519 Public Key Block Issuer Key - + @@ -5004,7 +5004,7 @@ The following table shows the Account Output including the possible fields and t
@@ -2683,7 +2683,7 @@ metadata into the UTXO ledger.
Block Issuer Key Type uint8Set to value 0 to denote a Block Issuer Key Ed25519 Public Key.Set to value 0 to denote an Ed25519 Public Key Block Issuer Key.
Public KeyBlock Issuer Keys anyOf
- Block Issuer Key Ed25519 + Ed25519 Public Key Block Issuer Key From e603f19729ecfa7e8acc5a8872205d75755c388e Mon Sep 17 00:00:00 2001 From: Philipp Gackstatter Date: Tue, 26 Sep 2023 18:02:49 +0200 Subject: [PATCH 078/140] Add rationale for implicit account creation addr --- tips/TIP-0042/tip-0042.md | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/tips/TIP-0042/tip-0042.md b/tips/TIP-0042/tip-0042.md index 55a86eaf7..631a62fa5 100644 --- a/tips/TIP-0042/tip-0042.md +++ b/tips/TIP-0042/tip-0042.md @@ -5540,6 +5540,15 @@ rather than Account Outputs. This leaves them unable to issue blocks since an Ac required to do so. Implicit Accounts give those users a permissionless way to create their account with the only requirement being owned funds in an output. +Implicit Account Creation Address is a separate type of address rather than a +[capability](../TIP-0050/tip-0050.md#capability-flags) because it implies many of the capability flags but also has +additional non-trivial transaction validation rules that don't fit together with the other boolean flags that are only +concerned about one aspect of transaction validity. It would also have implications for address validity. For instance, +it would be invalid for an NFT Address to have the flag for implicit account creation set. Other capability flags do not +have implications for address validity. Moreover, the implicit account creation address can only be used in a very +limited context, i.e. within an Address Unlock Condition in a Basic Output. These reasons warrant a separate address +type. + TODO: Justify initial Mana deposit. TODO: Describe utility of max `uint64` values for `Expiry Slot` and `End Epoch`. From 49ba5b19a587dfc223bffb119b1037805f9faa12 Mon Sep 17 00:00:00 2001 From: Philipp Gackstatter Date: Tue, 26 Sep 2023 18:03:46 +0200 Subject: [PATCH 079/140] Move notes on account tx validity --- tips/TIP-0042/tip-0042.md | 22 ++++++++++------------ 1 file changed, 10 insertions(+), 12 deletions(-) diff --git a/tips/TIP-0042/tip-0042.md b/tips/TIP-0042/tip-0042.md index 631a62fa5..32e9112eb 100644 --- a/tips/TIP-0042/tip-0042.md +++ b/tips/TIP-0042/tip-0042.md @@ -2976,6 +2976,16 @@ The **current state** is defined as the **consumed account output**, while the * - When Issuer Feature is present in an output and explicit `Account ID` is zeroed out, an input with `Address` field that corresponds to `Issuer` must be unlocked in the transaction. +### Notes + +- Governor Address Unlock Condition field is made mandatory for now to help formal verification. When the same + entity is defined for state and governance controllers, the output is self governed. Later, for compression reasons, + it is possible to make the governance controller optional and define a self-governed account as one that does not have + the governance Governor Address Unlock Condition set. +- Indexers and node plugins shall map the account address of the output derived with `Account ID` to the regular + address -> output mapping table, so that given an Account Address, its most recent unspent account + output can be retrieved. + ## Storage Deposit Calculation The storage deposit of Block Issuer Keys is higher than for other field types. Therefore, the storage deposit @@ -5364,16 +5374,6 @@ The following table shows the Account Output including the possible fields and t
Fields
-### Notes - -- Governor Address Unlock Condition field is made mandatory for now to help formal verification. When the same - entity is defined for state and governance controllers, the output is self governed. Later, for compression reasons, - it is possible to make the governance controller optional and define a self-governed account as one that does not have - the governance Governor Address Unlock Condition set. -- Indexers and node plugins shall map the account address of the output derived with `Account ID` to the regular - address -> output mapping table, so that given an Account Address, its most recent unspent account - output can be retrieved. - ## Implicit Account Accounts face a bootstrapping problem since users need to own an Account with a _Block Issuer Feature_ in order to issue @@ -5549,8 +5549,6 @@ have implications for address validity. Moreover, the implicit account creation limited context, i.e. within an Address Unlock Condition in a Basic Output. These reasons warrant a separate address type. -TODO: Justify initial Mana deposit. - TODO: Describe utility of max `uint64` values for `Expiry Slot` and `End Epoch`. # Copyright From 1be56388742689a6a906e39292b193b5e23f99ae Mon Sep 17 00:00:00 2001 From: Philipp Gackstatter Date: Wed, 27 Sep 2023 10:33:18 +0200 Subject: [PATCH 080/140] Remove Immutable Acc Addr UC to move to TIP-44 --- tips/TIP-0042/tip-0042.md | 68 --------------------------------------- 1 file changed, 68 deletions(-) diff --git a/tips/TIP-0042/tip-0042.md b/tips/TIP-0042/tip-0042.md index 32e9112eb..503ae6bb1 100644 --- a/tips/TIP-0042/tip-0042.md +++ b/tips/TIP-0042/tip-0042.md @@ -22,7 +22,6 @@ replaces: TIP-18 4. [Unlock Conditions](#unlock-conditions) - [State Controller Address Unlock Condition](#state-controller-address-unlock-condition) - [Governor Address Unlock Condition](#governor-address-unlock-condition) - - [Immutable Account Address Unlock Condition](#immutable-account-address-unlock-condition) - [Account Locking & Unlocking](#account-locking--unlocking) 5. [Features](#features) - [Block Issuer Feature](#block-issuer-feature) @@ -1074,73 +1073,6 @@ only be carried out by the `Governor Address`, hence the distinct unlock conditi The additional constraints are defined in [Account Output Design](#account-output) section. -## Immutable Account Address Unlock Condition - -An unlock condition defined for chain constrained UTXOs that can only be unlocked by a permanent Account Address. - -Output unlocking is functionally equivalent to an Address Unlock Condition with an Account Address, -however there are additional transition constraints: the next state of the UTXO machine must have the same Immutable -Account Address Unlock Condition. - -
- Immutable Account Address Unlock Condition -
Defines the permanent Account Address that owns this output.
-
- - - - - - - - - - - - - - - -
- Name - - Type - - Description -
Unlock Condition Typeuint8Set to value 6 to denote an Immutable Account Address Unlock Condition.
Address oneOf -
- Account Address - - - - - - - - - - - - - - - - -
- Name - - Type - - Description -
Address Typeuint8Set to value 8 to denote an Account Address.
Account IDByteArray[32]The raw bytes of the Account ID which is the BLAKE2b-256 hash of the Output ID that created it.
-
-
- -### Additional semantic transaction validation rules: - -- The output must be unlocked with an [Account Unlock](#account-unlock-semantic-validation). -- The next state of the UTXO state machine must have the same Immutable Account Address Unlock Condition defined. - ### Account Locking & Unlocking A transaction may consume a (non-account) output that belongs to an Account Address by state transitioning the From dc06bbab5277e1425eb37bffc884221b1e0a32b1 Mon Sep 17 00:00:00 2001 From: Philipp Gackstatter Date: Wed, 27 Sep 2023 10:37:46 +0200 Subject: [PATCH 081/140] Fix typo --- tips/TIP-0042/tip-0042.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tips/TIP-0042/tip-0042.md b/tips/TIP-0042/tip-0042.md index 503ae6bb1..932a6e51c 100644 --- a/tips/TIP-0042/tip-0042.md +++ b/tips/TIP-0042/tip-0042.md @@ -5323,7 +5323,7 @@ with it. Implicit Accounts address both of these issues. Third-parties can easily create implicit accounts for a user, without even being aware of it, if that user simply hands them an _Implicit Account Creation Address_ instead of another address type. An implicit account has an implicitly defined Block Issuer Key, corresponding to the address itself. Thus implicit -accounts can issue blocks by signing blocks with the private key corresponding to the public key from which the +accounts can issue blocks by signing them with the private key corresponding to the public key from which the _Implicit Account Creation Address_ was derived. Thus, since implicit accounts are much easier to create than a regular account, and are sufficient to create a full From 637a01cb5f92260d5c3971eb0b4823b23b1dbe18 Mon Sep 17 00:00:00 2001 From: Philipp Gackstatter Date: Thu, 28 Sep 2023 14:31:38 +0200 Subject: [PATCH 082/140] Fix account field name in transition rules --- tips/TIP-0042/tip-0042.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tips/TIP-0042/tip-0042.md b/tips/TIP-0042/tip-0042.md index 932a6e51c..5e62595f4 100644 --- a/tips/TIP-0042/tip-0042.md +++ b/tips/TIP-0042/tip-0042.md @@ -2873,7 +2873,7 @@ The **current state** is defined as the **consumed account output**, while the * - The `State Index` must be incremented by 1. - The unlock must correspond to the `Address` of State Controller Address Unlock Condition. - State transition can only change the following fields in the next state: - - `IOTA Amount`, + - `Amount`, - `Native Tokens`, - `State Index`, - `State Metadata`, From a6b68d88f552361f065721aaf88a23efb7f39cd3 Mon Sep 17 00:00:00 2001 From: Philipp Gackstatter Date: Fri, 29 Sep 2023 11:35:21 +0200 Subject: [PATCH 083/140] Update Block Issuer Key names --- tips/TIP-0042/tip-0042.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/tips/TIP-0042/tip-0042.md b/tips/TIP-0042/tip-0042.md index 5e62595f4..ea801ec3f 100644 --- a/tips/TIP-0042/tip-0042.md +++ b/tips/TIP-0042/tip-0042.md @@ -1234,7 +1234,7 @@ account is locked to that account.
Block Issuer Keys anyOf
- Block Issuer Key Ed25519 Public Key + Ed25519 Public Key Block Issuer Key - + @@ -5408,7 +5408,7 @@ derived as a block issuer key. A separate block issuer key type is reserved for transactions directly.
- Block Issuer Key Ed25519 Address + Ed25519 Public Key Hash Block Issuer Key
A block issuer key for issuing blocks from implicit accounts.
@@ -1250,7 +1250,7 @@ account is locked to that account.
Block Issuer Key Type uint8Set to value 0 to denote a Block Issuer Key Ed25519 Public Key.Set to value 0 to denote an Ed25519 Public Key Block Issuer Key.
Public Key
@@ -5426,7 +5426,7 @@ transactions directly. - + From 1bdcedd64542d87260cf42d946b56a498a2e2d25 Mon Sep 17 00:00:00 2001 From: Philipp Gackstatter Date: Fri, 29 Sep 2023 12:49:32 +0200 Subject: [PATCH 084/140] Finalize Implicit Account rules --- tips/TIP-0042/tip-0042.md | 75 ++++++++++++++++++++++----------------- 1 file changed, 42 insertions(+), 33 deletions(-) diff --git a/tips/TIP-0042/tip-0042.md b/tips/TIP-0042/tip-0042.md index ea801ec3f..b79ae020c 100644 --- a/tips/TIP-0042/tip-0042.md +++ b/tips/TIP-0042/tip-0042.md @@ -5323,8 +5323,8 @@ with it. Implicit Accounts address both of these issues. Third-parties can easily create implicit accounts for a user, without even being aware of it, if that user simply hands them an _Implicit Account Creation Address_ instead of another address type. An implicit account has an implicitly defined Block Issuer Key, corresponding to the address itself. Thus implicit -accounts can issue blocks by signing them with the private key corresponding to the public key from which the -_Implicit Account Creation Address_ was derived. +accounts can issue blocks by signing them with the private key corresponding to the public key from which the _Implicit +Account Creation Address_ was derived. Thus, since implicit accounts are much easier to create than a regular account, and are sufficient to create a full account from, without having to rely on a third party, the barrier to entry for the network is lowered. @@ -5356,54 +5356,64 @@ and thus also backed by an Ed25519 key pair. ### Storage Deposit -- The storage deposit of an _Implicit Account Creation Address_ defines a dedicated VByte Offset. It is equal to the - VBytes required for a minimal Account Output that contains a Block Issuer Feature. To calculate this amount, the - VBytes of an account with all required fields set is taken and which fulfills the following conditions: - - `Native Tokens Count` must be `0`. - - `State Metadata` must be empty. - - `State Controller Address Unlock Condition` and `Governor Address Unlock Condition` must contain an _Ed25519 - Address_. - - `Features Count` must be `1`. - - A _Block Issuer Feature_ must be present with `Block Issuer Keys Count == 1` and a block issuer key of type _Block - Issuer Key Ed25519_. - - `Immutable Features Count` must be `0`. +- The storage deposit of an _Implicit Account Creation Address_ defines a dedicated Storage Score Offset: + `Storage Score Offset Implicit Account Creation Address`. It is designed to match the Storage Score required for a + minimal Account Output that contains a Block Issuer Feature when contained in a Basic Output. To calculate this + offset, the following Storage Scores are calculated: + - Let `Storage Score Offset Implicit Account Creation Address` be + `Account Output Score - Basic Output Score + Ed25519 Address Score`, where: + - Let `Account Output Score` be the storage score of an Account Output which fulfills the following conditions: + - `Native Tokens Count == 0`. + - `State Metadata` must be empty. + - `State Controller Address Unlock Condition` and `Governor Address Unlock Condition` must contain an _Ed25519 + Address_. + - `Features Count == 1`. + - A _Block Issuer Feature_ must be present with `Block Issuer Keys Count == 1` and a block issuer key of type + _Block Issuer Key Ed25519_. + - `Immutable Features Count == 0`. + - Let `Basic Output Score` be the storage score of a Basic Output which fulfills the following conditions: + - `Native Tokens Count == 0`. + - `Unlock Conditions Count == 1`. + - The unlock condition is of type `Address Unlock Condition` and contains an `Ed25519 Address`. + - `Features Count == 0`. + - Let `Ed25519 Address Score` be the storage score of an `Ed25519 Address`. ### Creation Semantic Transaction Validation Rules To create an implicit account, a Basic Output is created on the output side of a transaction and the `Address` in the `Address Unlock Condition` is set to an address of type _Implicit Account Creation Address_. -- If an output in a transaction contains an unlock condition with an implicit account address, that output is referred - to as an `Implicit Account`, and the transaction is valid only if all of the following conditions hold: +- If an output in a transaction contains an unlock condition with an _Implicit Account Creation Address_, that output is + referred to as an `Implicit Account`, and the transaction is valid only if all of the following conditions hold: - The `Implicit Account` is of type `Basic Output`. - The `Implicit Account`'s `Unlock Conditions Count == 1`. - The unlock condition on the `Implicit Account` is of type `Address Unlock Condition`. - The `Implicit Account`'s `Native Tokens Count == 0`. + - The `Implicit Account`'s `Features Count == 0`. ### Conversion Semantic Transaction Validation Rules To convert an implicit account to an account, a block can be issued using the implicit account as the block issuer, containing a transaction that consumes the implicit account on the input side and creates an account output on the output side. Since an implicit account can issue blocks, some of the requirements of a block issuer account apply to -implicit accounts as well, as defined below. +implicit accounts as well, as defined below. The conversion of an implicit account is a combination of regular account +creation and block issuer feature transition. - The account ID of an `Implicit Account` is referred to as `Implicit Account ID` and is the BLAKE2b-256 hash of the Output ID of the Basic Output that represents the `Implicit Account`. - If a transaction contains an input with an unlock condition containing an implicit account address, the transaction is only valid if all of the following conditions hold: - A valid `Account` Output is created on the output side, for which all of the following conditions hold: - - The `Account ID` of the `Account` must be set to the `Implicit Account ID`. - - The `Account` must have a Block Issuer Feature. - - It must hold that the value of the `Mana` on the `Explicit Account` is at least the value of the `Mana` on the - `Implicit Account` plus the Potential Mana generated by the `Implicit Account`. - - A _Commitment Input_ is present. - - A _Block Issuance Credit Input_ is present whose _Account ID_ equals the `Implicit Account ID`. - - The transaction is invalid if the `Implicit Account` has negative Block Issuance Credit whose value is taken from - the _Block Issuance Credit Input_. + - The account must be a valid account creation, except that the `Account ID` of the `Account` must be set to the + `Implicit Account ID` instead of being zeroed out. + - The `Account` must have a Block Issuer Feature and it must pass semantic validation as if the implicit account + contained a Block Issuer Feature with its `Expiry Slot` set to the maximum value of slot indices and the feature + was transitioned. + - No other Implicit Account Creation Address is present on the input side of the transaction. ### Implicit Account Block Issuance -An implicit account can issue a block by using the public key from which the implicit account creation address was +An implicit account can issue blocks by using the public key from which the implicit account creation address was derived as a block issuer key. A separate block issuer key type is reserved for that, which is however never used in transactions directly. @@ -5449,19 +5459,18 @@ these, a migration procedure is required so the network can be bootstrapped. Use Feature to an _Alias Output_ which is converted to an _Account Output_ with a Block Issuer Feature and the Metadata Feature is removed from the output. This transition is only done if all of the following conditions hold: -- the _Alias Output_'s `Amount` is at least `Block Issuer Account Amount`. It is calculated in the same way as - `Min Block Issuer Account Amount` defined in - [Implicit Account (Creation Semantic Transaction Validation Rules)](#creation-semantic-transaction-validation-rules), - except that the `Block Issuer Keys Count` of the output for the deposit calculation must be set to the value of the - `Block Issuer Keys Count` read from the serialized Block Issuer Feature in the to-be-converted _Alias Output_. +- The _Alias Output_'s `Amount` is at least `Rent Parameters::Storage Cost * Account Output Score`, with the latter + defined in [Implicit Account (Storage Deposit)](#storage-deposit), except that the `Block Issuer Keys Count` of the + output for the deposit calculation must be set to the value of the `Block Issuer Keys Count` read from the serialized + Block Issuer Feature in the to-be-converted _Alias Output_. - The serialized Block Issuer Feature is prefixed with the ascii-encoded string `BlockIssuerFeature`, which is `[0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x49, 0x73, 0x73, 0x75, 0x65, 0x72, 0x46, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65]` in hex encoding, expressed as a list in JSON. - The Block Issuer Feature must pass syntactic validation. -If not all conditions hold, the Alias is converted to an Account Output with its Metadata Feature untouched. +If not all conditions hold, the converted Account Output will contain the Metadata Feature untouched. -Note: It is recommended to set the `Expiry Slot` to the maximum value of a `uint64`. +Note: It is recommended to set the `Expiry Slot` to the maximum value of a `uint32`. # Rationale & Alternatives @@ -5481,7 +5490,7 @@ have implications for address validity. Moreover, the implicit account creation limited context, i.e. within an Address Unlock Condition in a Basic Output. These reasons warrant a separate address type. -TODO: Describe utility of max `uint64` values for `Expiry Slot` and `End Epoch`. +TODO: Describe utility of max `uint32` values for `Expiry Slot` and `End Epoch`. # Copyright From 1b9339d73b6a8a3b0fd3f61654e42e3472b47a93 Mon Sep 17 00:00:00 2001 From: Philipp Gackstatter Date: Fri, 29 Sep 2023 15:23:52 +0200 Subject: [PATCH 085/140] Use protocol parameter Token Supply in amount rule --- tips/TIP-0042/tip-0042.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tips/TIP-0042/tip-0042.md b/tips/TIP-0042/tip-0042.md index b79ae020c..0b11178e4 100644 --- a/tips/TIP-0042/tip-0042.md +++ b/tips/TIP-0042/tip-0042.md @@ -2820,8 +2820,8 @@ metadata into the UTXO ledger. ### Output Syntactic Validation -- `Amount` field must fulfill the dust protection requirements and must not be `0`. -- `Amount` field must be ≤ `Max IOTA Supply`. +- `Amount` field must fulfill the [storage deposit requirements](../TIP-0047/tip-0047.md) and must not be `0`. +- `Amount` field must be ≤ `Token Supply`. - `Native Tokens Count` must not be greater than `Max Native Tokens Count`. - `Native Tokens` must be lexicographically sorted based on `Token ID`. - Each Native Token must be unique in the set of `Native Tokens` based on its `Token ID`. No duplicates are From 1c976738ea010da53af73cf0a8167de07f24e4ef Mon Sep 17 00:00:00 2001 From: Philipp Gackstatter Date: Wed, 4 Oct 2023 15:33:57 +0200 Subject: [PATCH 086/140] Remove Native Tokens --- tips/TIP-0042/tip-0042.md | 1299 +++++-------------------------------- 1 file changed, 147 insertions(+), 1152 deletions(-) diff --git a/tips/TIP-0042/tip-0042.md b/tips/TIP-0042/tip-0042.md index 0b11178e4..9f0185f43 100644 --- a/tips/TIP-0042/tip-0042.md +++ b/tips/TIP-0042/tip-0042.md @@ -1412,1012 +1412,122 @@ metadata into the UTXO ledger. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Block Issuer Key Type uint8Set to value 1 to denote a Block Issuer Key Ed25519 Address.Set to value 1 to denote an Ed25519 Public Key Hash Block Issuer Key.
PubKeyHashThe amount of Stored Mana held by the output.
Native Tokens Countuint8The number of different native tokens held by the output.
Native Tokens optAnyOf -
- Native Token - - - - - - - - - - - - - - - - -
- Name - - Type - - Description -
Token IDByteArray[38]Identifier of the native token. Its derivation is defined in TIP-44.
Amountuint256Amount of native tokens of the given Token ID.
-
-
Account IDByteArray[32]Unique identifier of the account, which is the BLAKE2b-256 hash of the Output ID that created it. Account Address = Account Address Type || Account ID.
State Indexuint32A counter that must increase by 1 every time the account is state transitioned.
State Metadata(uint16)ByteArrayMetadata that can only be changed by the state controller. A leading uint16 denotes its length.
Foundry Counteruint32A counter that denotes the number of foundries created by this account.
Unlock Conditions Countuint8The number of unlock conditions following.
Unlock Conditions atMostOneOfEach -
- State Controller Address Unlock Condition -
Defines the State Controller Address that owns this output. It can unlock the output with the proper Unlock in a transaction that state transitions the account output.
- - - - - - - - - - - - - - - -
- Name - - Type - - Description -
Unlock Condition Typeuint8Set to value 4 to denote a State Controller Address Unlock Condition.
Address oneOf -
- Ed25519 Address - - - - - - - - - - - - - - - - -
- Name - - Type - - Description -
Address Typeuint8Set to value 0 to denote an Ed25519 Address.
PubKeyHashByteArray[32]The raw bytes of the Ed25519 address which is the BLAKE2b-256 hash of the Ed25519 public key.
-
-
- Account Address - - - - - - - - - - - - - - - - -
- Name - - Type - - Description -
Address Typeuint8Set to value 8 to denote an Account Address.
Account IDByteArray[32]The raw bytes of the Account ID which is the BLAKE2b-256 hash of the Output ID that created it.
-
-
- NFT Address - - - - - - - - - - - - - - - - -
- Name - - Type - - Description -
Address Typeuint8Set to value 16 to denote an NFT Address.
NFT IDByteArray[32]The raw bytes of the NFT ID which is the BLAKE2b-256 hash of the Output ID that created it.
-
-
- Multi Address - - - - - - - - - - - - - - - -
- Name - - Type - - Description -
Address Typeuint8Set to value 32 to denote a Multi Address.
Addresses anyOf -
- Address with Weight - - - - - - - - - - - - - - - -
- Name - - Type - - Description -
Address oneOf -
- Ed25519 Address - - - - - - - - - - - - - - - - -
- Name - - Type - - Description -
Address Typeuint8Set to value 0 to denote an Ed25519 Address.
PubKeyHashByteArray[32]The raw bytes of the Ed25519 address which is the BLAKE2b-256 hash of the Ed25519 public key.
-
-
- Account Address - - - - - - - - - - - - - - - - -
- Name - - Type - - Description -
Address Typeuint8Set to value 8 to denote an Account Address.
Account IDByteArray[32]The raw bytes of the Account ID which is the BLAKE2b-256 hash of the Output ID that created it.
-
-
- NFT Address - - - - - - - - - - - - - - - - -
- Name - - Type - - Description -
Address Typeuint8Set to value 16 to denote an NFT Address.
NFT IDByteArray[32]The raw bytes of the NFT ID which is the BLAKE2b-256 hash of the Output ID that created it.
-
-
Weightuint8The weight of the unlocked address.
-
-
-
-
- Restricted Address - - - - - - - - - - - - - - - - - - - - -
- Name - - Type - - Description -
Address Typeuint8Set to value 40 to denote a Restricted Address.
Address oneOf -
- Ed25519 Address - - - - - - - - - - - - - - - - -
- Name - - Type - - Description -
Address Typeuint8Set to value 0 to denote an Ed25519 Address.
PubKeyHashByteArray[32]The raw bytes of the Ed25519 address which is the BLAKE2b-256 hash of the Ed25519 public key.
-
-
- Account Address - - - - - - - - - - - - - - - - -
- Name - - Type - - Description -
Address Typeuint8Set to value 8 to denote an Account Address.
Account IDByteArray[32]The raw bytes of the Account ID which is the BLAKE2b-256 hash of the Output ID that created it.
-
-
- NFT Address - - - - - - - - - - - - - - - - -
- Name - - Type - - Description -
Address Typeuint8Set to value 16 to denote an NFT Address.
NFT IDByteArray[32]The raw bytes of the NFT ID which is the BLAKE2b-256 hash of the Output ID that created it.
-
-
- Multi Address - - - - - - - - - - - - - - - -
- Name - - Type - - Description -
Address Typeuint8Set to value 32 to denote a Multi Address.
Addresses anyOf -
- Address with Weight - - - - - - - - - - - - - - - -
- Name - - Type - - Description -
Address oneOf -
- Ed25519 Address - - - - - - - - - - - - - - - - -
- Name - - Type - - Description -
Address Typeuint8Set to value 0 to denote an Ed25519 Address.
PubKeyHashByteArray[32]The raw bytes of the Ed25519 address which is the BLAKE2b-256 hash of the Ed25519 public key.
-
-
- Account Address - - - - - - - - - - - - - - - - -
- Name - - Type - - Description -
Address Typeuint8Set to value 8 to denote an Account Address.
Account IDByteArray[32]The raw bytes of the Account ID which is the BLAKE2b-256 hash of the Output ID that created it.
-
-
- NFT Address - - - - - - - - - - - - - - - - -
- Name - - Type - - Description -
Address Typeuint8Set to value 16 to denote an NFT Address.
NFT IDByteArray[32]The raw bytes of the NFT ID which is the BLAKE2b-256 hash of the Output ID that created it.
-
-
Weightuint8The weight of the unlocked address.
-
-
-
-
Allowed Capabilities(uint8)ByteArrayBitflags expressed as a series of bytes. A leading uint8 denotes its length.
-
-
-
-
- Governor Address Unlock Condition -
Defines the Governor Address that owns this output. It can unlock the output with the proper Unlock in a transaction that governance transitions the account output.
- - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + +
- Name - - Type - - Description -
Unlock Condition Typeuint8Set to value 5 to denote a Governor Address Unlock Condition.
Address oneOf -
- Ed25519 Address - - - - - - - - - - - - - - - - -
- Name - - Type - - Description -
Address Typeuint8Set to value 0 to denote an Ed25519 Address.
PubKeyHashByteArray[32]The raw bytes of the Ed25519 address which is the BLAKE2b-256 hash of the Ed25519 public key.
-
-
- Account Address - - - - - - - - - - - - - - - - -
- Name - - Type - - Description -
Address Typeuint8Set to value 8 to denote an Account Address.
Account IDByteArray[32]The raw bytes of the Account ID which is the BLAKE2b-256 hash of the Output ID that created it.
-
-
- NFT Address - - - - - - - - - - - - - - - - -
- Name - - Type - - Description -
Address Typeuint8Set to value 16 to denote an NFT Address.
NFT IDByteArray[32]The raw bytes of the NFT ID which is the BLAKE2b-256 hash of the Output ID that created it.
-
-
- Multi Address - - - - - - - - - - - - - - - -
- Name - - Type - - Description -
Address Typeuint8Set to value 32 to denote a Multi Address.
Addresses anyOf -
- Address with Weight - - - - - - - - - - - - - - - -
- Name - - Type - - Description -
Address oneOf -
- Ed25519 Address - - - - - - - - - - - - - - - - -
- Name - - Type - - Description -
Address Typeuint8Set to value 0 to denote an Ed25519 Address.
PubKeyHashByteArray[32]The raw bytes of the Ed25519 address which is the BLAKE2b-256 hash of the Ed25519 public key.
-
-
- Account Address - - - - - - - - - - - - - - - - -
- Name - - Type - - Description -
Address Typeuint8Set to value 8 to denote an Account Address.
Account IDByteArray[32]The raw bytes of the Account ID which is the BLAKE2b-256 hash of the Output ID that created it.
-
-
- NFT Address - - - - - - - - - - - - - - - - -
- Name - - Type - - Description -
Address Typeuint8Set to value 16 to denote an NFT Address.
NFT IDByteArray[32]The raw bytes of the NFT ID which is the BLAKE2b-256 hash of the Output ID that created it.
-
-
Weightuint8The weight of the unlocked address.
-
-
-
-
- Restricted Address - - - - - - - - - - - - - - - - - - - - -
- Name - - Type - - Description -
Address Typeuint8Set to value 40 to denote a Restricted Address.
Address oneOf -
- Ed25519 Address - - - - - - - - - - - - - - - - -
- Name - - Type - - Description -
Address Typeuint8Set to value 0 to denote an Ed25519 Address.
PubKeyHashByteArray[32]The raw bytes of the Ed25519 address which is the BLAKE2b-256 hash of the Ed25519 public key.
-
-
- Account Address - - - - - - - - - - - - - - - - -
- Name - - Type - - Description -
Address Typeuint8Set to value 8 to denote an Account Address.
Account IDByteArray[32]The raw bytes of the Account ID which is the BLAKE2b-256 hash of the Output ID that created it.
-
-
- NFT Address - - - - - - - - - - - - - - - - -
- Name - - Type - - Description -
Address Typeuint8Set to value 16 to denote an NFT Address.
NFT IDByteArray[32]The raw bytes of the NFT ID which is the BLAKE2b-256 hash of the Output ID that created it.
-
-
- Multi Address - - - - - - - - - - - - - - - -
- Name - - Type - - Description -
Address Typeuint8Set to value 32 to denote a Multi Address.
Addresses anyOf -
- Address with Weight - - - - - - - - - - - - - - - -
- Name - - Type - - Description -
Address oneOf -
- Ed25519 Address - - - - - - - - - - - - - - - - -
- Name - - Type - - Description -
Address Typeuint8Set to value 0 to denote an Ed25519 Address.
PubKeyHashByteArray[32]The raw bytes of the Ed25519 address which is the BLAKE2b-256 hash of the Ed25519 public key.
-
-
- Account Address - - - - - - - - - - - - - - - - -
- Name - - Type - - Description -
Address Typeuint8Set to value 8 to denote an Account Address.
Account IDByteArray[32]The raw bytes of the Account ID which is the BLAKE2b-256 hash of the Output ID that created it.
-
-
- NFT Address - - - - - - - - - - - - - - - - -
- Name - - Type - - Description -
Address Typeuint8Set to value 16 to denote an NFT Address.
NFT IDByteArray[32]The raw bytes of the NFT ID which is the BLAKE2b-256 hash of the Output ID that created it.
-
-
Weightuint8The weight of the unlocked address.
-
-
-
-
Allowed Capabilities(uint8)ByteArrayBitflags expressed as a series of bytes. A leading uint8 denotes its length.
+
Account IDByteArray[32]Unique identifier of the account, which is the BLAKE2b-256 hash of the Output ID that created it. Account Address = Account Address Type || Account ID.
State Indexuint32A counter that must increase by 1 every time the account is state transitioned.
State Metadata(uint16)ByteArrayMetadata that can only be changed by the state controller. A leading uint16 denotes its length.
Foundry Counteruint32A counter that denotes the number of foundries created by this account.
Unlock Conditions Countuint8The number of unlock conditions following.
Unlock Conditions atMostOneOfEach +
+ State Controller Address Unlock Condition +
Defines the State Controller Address that owns this output. It can unlock the output with the proper Unlock in a transaction that state transitions the account output. Defined in TIP-42 (State Controller Address Unlock Condition).
+ + + + + + + + + + + + + + + +
+ Name + + Type + + Description +
Unlock Condition Typeuint8Set to value 4 to denote a State Controller Address Unlock Condition.
Address oneOf +
+ Ed25519 Address +
An Address derived from an Ed25519 Public Key. Defined in TIP-38 (Ed25519 Address).
+
+
+ Account Address +
An Address derived from an Account ID which can be unlocked by unlocking the corresponding Account. Defined in TIP-38 (Account Address).
+
+
+ NFT Address +
An Address derived from an NFT ID which can be unlocked by unlocking the corresponding NFT. Defined in TIP-38 (NFT Address).
+
+
+ Multi Address +
Defines a Multi Address that consists of addresses with weights and a threshold value. The Multi Address can be unlocked if the cumulative weight of all unlocked addresses is equal to or exceeds the threshold. Defined in TIP-52 (Multi Address).
+
+
+ Restricted Address +
An address that contains another address and allows for configuring its capabilities. Defined in TIP-50 (Restricted Address).
+
+
+
+
+ Governor Address Unlock Condition +
Defines the Governor Address that owns this output. It can unlock the output with the proper Unlock in a transaction that governance transitions the account output. Defined in TIP-42 (Governor Address Unlock Condition).
+ + + + + + + + + + + + + + @@ -2435,7 +1545,7 @@ metadata into the UTXO ledger.
+ Name + + Type + + Description +
Unlock Condition Typeuint8Set to value 5 to denote a Governor Address Unlock Condition.
Address oneOf +
+ Ed25519 Address +
An Address derived from an Ed25519 Public Key. Defined in TIP-38 (Ed25519 Address).
+
+
+ Account Address +
An Address derived from an Account ID which can be unlocked by unlocking the corresponding Account. Defined in TIP-38 (Account Address).
+
+
+ NFT Address +
An Address derived from an NFT ID which can be unlocked by unlocking the corresponding NFT. Defined in TIP-38 (NFT Address).
+
+
+ Multi Address +
Defines a Multi Address that consists of addresses with weights and a threshold value. The Multi Address can be unlocked if the cumulative weight of all unlocked addresses is equal to or exceeds the threshold. Defined in TIP-52 (Multi Address).
+
+
+ Restricted Address +
An address that contains another address and allows for configuring its capabilities. Defined in TIP-50 (Restricted Address).
Sender Feature -
Identifies the validated sender of the output.
+
Identifies the validated sender of the output. Defined in TIP-38 (Sender Feature).
@@ -2540,7 +1592,7 @@ metadata into the UTXO ledger.
Metadata Feature -
Defines metadata (arbitrary binary data) that will be stored in the output.
+
Defines metadata (arbitrary binary data) that will be stored in the output. Defined in TIP-38 (Metadata Feature).
@@ -2458,81 +1568,23 @@ metadata into the UTXO ledger.
Ed25519 Address - - - - - - - - - - - - - - - - -
- Name - - Type - - Description -
Address Typeuint8Set to value 0 to denote an Ed25519 Address.
PubKeyHashByteArray[32]The raw bytes of the Ed25519 address which is the BLAKE2b-256 hash of the Ed25519 public key.
+
An Address derived from an Ed25519 Public Key. Defined in TIP-38 (Ed25519 Address).
Account Address - - - - - - - - - - - - - - - - -
- Name - - Type - - Description -
Address Typeuint8Set to value 8 to denote an Account Address.
Account IDByteArray[32]The raw bytes of the Account ID which is the BLAKE2b-256 hash of the Output ID that created it.
+
An Address derived from an Account ID which can be unlocked by unlocking the corresponding Account. Defined in TIP-38 (Account Address).
NFT Address - - - - - - - - - - - - - - - - -
- Name - - Type - - Description -
Address Typeuint8Set to value 16 to denote an NFT Address.
NFT IDByteArray[32]The raw bytes of the NFT ID which is the BLAKE2b-256 hash of the Output ID that created it.
+
An Address derived from an NFT ID which can be unlocked by unlocking the corresponding NFT. Defined in TIP-38 (NFT Address).
+
+
+ Multi Address +
Defines a Multi Address that consists of addresses with weights and a threshold value. The Multi Address can be unlocked if the cumulative weight of all unlocked addresses is equal to or exceeds the threshold. Defined in TIP-52 (Multi Address).
+
+
+ Restricted Address +
An address that contains another address and allows for configuring its capabilities. Defined in TIP-50 (Restricted Address).
@@ -2567,7 +1619,7 @@ metadata into the UTXO ledger.
Block Issuer Feature -
Contains the public keys used to verify block signatures.
+
Contains the public keys used to verify block signatures. Defined in TIP-42 (Block Issuer Feature).
- + @@ -2600,6 +1652,7 @@ metadata into the UTXO ledger.
@@ -2583,7 +1635,7 @@ metadata into the UTXO ledger.
Feature Type uint8Set to value 4 to denote a Block Issuer Feature.Set to value 5 to denote a Block Issuer Feature.
Expiry Slot
Ed25519 Public Key Block Issuer Key +
A Block Issuer Key derived from an Ed25519 Public Key. Defined in TIP-42 (Ed25519 Public Key Block Issuer Key).
@@ -2630,7 +1683,7 @@ metadata into the UTXO ledger.
Staking Feature -
Stakes IOTA coins to become eligible for committee selection, validate the network and receive Mana rewards.
+
Stakes IOTA coins to become eligible for committee selection, validate the network and receive Mana rewards. Defined in TIP-42 (Staking Feature).
- + @@ -2682,7 +1735,7 @@ metadata into the UTXO ledger.
@@ -2646,7 +1699,7 @@ metadata into the UTXO ledger.
Feature Type uint8Set to value 5 to denote a Staking Feature.Set to value 6 to denote a Staking Feature.
Staked Amount
Issuer Feature -
Identifies the validated issuer of the UTXO state machine.
+
Identifies the validated issuer of the UTXO state machine. Defined in TIP-38 (Issuer Feature).
@@ -2787,7 +1782,7 @@ metadata into the UTXO ledger.
Metadata Feature -
Defines metadata (arbitrary binary data) that will be stored in the output.
+
Defines metadata (arbitrary binary data) that will be stored in the output. Defined in TIP-38 (Metadata Feature).
@@ -2705,81 +1758,23 @@ metadata into the UTXO ledger.
Ed25519 Address - - - - - - - - - - - - - - - - -
- Name - - Type - - Description -
Address Typeuint8Set to value 0 to denote an Ed25519 Address.
PubKeyHashByteArray[32]The raw bytes of the Ed25519 address which is the BLAKE2b-256 hash of the Ed25519 public key.
+
An Address derived from an Ed25519 Public Key. Defined in TIP-38 (Ed25519 Address).
Account Address - - - - - - - - - - - - - - - - -
- Name - - Type - - Description -
Address Typeuint8Set to value 8 to denote an Account Address.
Account IDByteArray[32]The raw bytes of the Account ID which is the BLAKE2b-256 hash of the Output ID that created it.
+
An Address derived from an Account ID which can be unlocked by unlocking the corresponding Account. Defined in TIP-38 (Account Address).
NFT Address - - - - - - - - - - - - - - - - -
- Name - - Type - - Description -
Address Typeuint8Set to value 16 to denote an NFT Address.
NFT IDByteArray[32]The raw bytes of the NFT ID which is the BLAKE2b-256 hash of the Output ID that created it.
+
An Address derived from an NFT ID which can be unlocked by unlocking the corresponding NFT. Defined in TIP-38 (NFT Address).
+
+
+ Multi Address +
Defines a Multi Address that consists of addresses with weights and a threshold value. The Multi Address can be unlocked if the cumulative weight of all unlocked addresses is equal to or exceeds the threshold. Defined in TIP-52 (Multi Address).
+
+
+ Restricted Address +
An address that contains another address and allows for configuring its capabilities. Defined in TIP-50 (Restricted Address).
@@ -622,450 +195,23 @@ only be carried out by the `Governor Address`, hence the distinct unlock conditi @@ -1218,7 +364,7 @@ account is locked to that account. - + @@ -1235,6 +381,7 @@ account is locked to that account.
From 318559c8ef857f81230d835d59c8f9cf18ed871f Mon Sep 17 00:00:00 2001 From: Philipp Gackstatter Date: Wed, 4 Oct 2023 15:37:17 +0200 Subject: [PATCH 087/140] Update Staking & Block Issuer Feature numbers --- tips/TIP-0042/tip-0042.md | 879 +------------------------------------- 1 file changed, 13 insertions(+), 866 deletions(-) diff --git a/tips/TIP-0042/tip-0042.md b/tips/TIP-0042/tip-0042.md index 9f0185f43..e6c42b7c7 100644 --- a/tips/TIP-0042/tip-0042.md +++ b/tips/TIP-0042/tip-0042.md @@ -139,450 +139,23 @@ only be carried out by the `State Controller Address`, hence the distinct unlock
Ed25519 Address - - - - - - - - - - - - - - - - -
- Name - - Type - - Description -
Address Typeuint8Set to value 0 to denote an Ed25519 Address.
PubKeyHashByteArray[32]The raw bytes of the Ed25519 address which is the BLAKE2b-256 hash of the Ed25519 public key.
+
An Address derived from an Ed25519 Public Key. Defined in TIP-38 (Ed25519 Address).
Account Address - - - - - - - - - - - - - - - - -
- Name - - Type - - Description -
Address Typeuint8Set to value 8 to denote an Account Address.
Account IDByteArray[32]The raw bytes of the Account ID which is the BLAKE2b-256 hash of the Output ID that created it.
+
An Address derived from an Account ID which can be unlocked by unlocking the corresponding Account. Defined in TIP-38 (Account Address).
NFT Address - - - - - - - - - - - - - - - - -
- Name - - Type - - Description -
Address Typeuint8Set to value 16 to denote an NFT Address.
NFT IDByteArray[32]The raw bytes of the NFT ID which is the BLAKE2b-256 hash of the Output ID that created it.
+
An Address derived from an NFT ID which can be unlocked by unlocking the corresponding NFT. Defined in TIP-38 (NFT Address).
Multi Address - - - - - - - - - - - - - - - -
- Name - - Type - - Description -
Address Typeuint8Set to value 32 to denote a Multi Address.
Addresses anyOf -
- Address with Weight - - - - - - - - - - - - - - - -
- Name - - Type - - Description -
Address oneOf -
- Ed25519 Address - - - - - - - - - - - - - - - - -
- Name - - Type - - Description -
Address Typeuint8Set to value 0 to denote an Ed25519 Address.
PubKeyHashByteArray[32]The raw bytes of the Ed25519 address which is the BLAKE2b-256 hash of the Ed25519 public key.
-
-
- Account Address - - - - - - - - - - - - - - - - -
- Name - - Type - - Description -
Address Typeuint8Set to value 8 to denote an Account Address.
Account IDByteArray[32]The raw bytes of the Account ID which is the BLAKE2b-256 hash of the Output ID that created it.
-
-
- NFT Address - - - - - - - - - - - - - - - - -
- Name - - Type - - Description -
Address Typeuint8Set to value 16 to denote an NFT Address.
NFT IDByteArray[32]The raw bytes of the NFT ID which is the BLAKE2b-256 hash of the Output ID that created it.
-
-
Weightuint8The weight of the unlocked address.
-
-
+
Defines a Multi Address that consists of addresses with weights and a threshold value. The Multi Address can be unlocked if the cumulative weight of all unlocked addresses is equal to or exceeds the threshold. Defined in TIP-52 (Multi Address).
Restricted Address - - - - - - - - - - - - - - - - - - - - -
- Name - - Type - - Description -
Address Typeuint8Set to value 40 to denote a Restricted Address.
Address oneOf -
- Ed25519 Address - - - - - - - - - - - - - - - - -
- Name - - Type - - Description -
Address Typeuint8Set to value 0 to denote an Ed25519 Address.
PubKeyHashByteArray[32]The raw bytes of the Ed25519 address which is the BLAKE2b-256 hash of the Ed25519 public key.
-
-
- Account Address - - - - - - - - - - - - - - - - -
- Name - - Type - - Description -
Address Typeuint8Set to value 8 to denote an Account Address.
Account IDByteArray[32]The raw bytes of the Account ID which is the BLAKE2b-256 hash of the Output ID that created it.
-
-
- NFT Address - - - - - - - - - - - - - - - - -
- Name - - Type - - Description -
Address Typeuint8Set to value 16 to denote an NFT Address.
NFT IDByteArray[32]The raw bytes of the NFT ID which is the BLAKE2b-256 hash of the Output ID that created it.
-
-
- Multi Address - - - - - - - - - - - - - - - -
- Name - - Type - - Description -
Address Typeuint8Set to value 32 to denote a Multi Address.
Addresses anyOf -
- Address with Weight - - - - - - - - - - - - - - - -
- Name - - Type - - Description -
Address oneOf -
- Ed25519 Address - - - - - - - - - - - - - - - - -
- Name - - Type - - Description -
Address Typeuint8Set to value 0 to denote an Ed25519 Address.
PubKeyHashByteArray[32]The raw bytes of the Ed25519 address which is the BLAKE2b-256 hash of the Ed25519 public key.
-
-
- Account Address - - - - - - - - - - - - - - - - -
- Name - - Type - - Description -
Address Typeuint8Set to value 8 to denote an Account Address.
Account IDByteArray[32]The raw bytes of the Account ID which is the BLAKE2b-256 hash of the Output ID that created it.
-
-
- NFT Address - - - - - - - - - - - - - - - - -
- Name - - Type - - Description -
Address Typeuint8Set to value 16 to denote an NFT Address.
NFT IDByteArray[32]The raw bytes of the NFT ID which is the BLAKE2b-256 hash of the Output ID that created it.
-
-
Weightuint8The weight of the unlocked address.
-
-
-
-
Allowed Capabilities(uint8)ByteArrayBitflags expressed as a series of bytes. A leading uint8 denotes its length.
+
An address that contains another address and allows for configuring its capabilities. Defined in TIP-50 (Restricted Address).
Ed25519 Address - - - - - - - - - - - - - - - - -
- Name - - Type - - Description -
Address Typeuint8Set to value 0 to denote an Ed25519 Address.
PubKeyHashByteArray[32]The raw bytes of the Ed25519 address which is the BLAKE2b-256 hash of the Ed25519 public key.
+
An Address derived from an Ed25519 Public Key. Defined in TIP-38 (Ed25519 Address).
Account Address - - - - - - - - - - - - - - - - -
- Name - - Type - - Description -
Address Typeuint8Set to value 8 to denote an Account Address.
Account IDByteArray[32]The raw bytes of the Account ID which is the BLAKE2b-256 hash of the Output ID that created it.
+
An Address derived from an Account ID which can be unlocked by unlocking the corresponding Account. Defined in TIP-38 (Account Address).
NFT Address - - - - - - - - - - - - - - - - -
- Name - - Type - - Description -
Address Typeuint8Set to value 16 to denote an NFT Address.
NFT IDByteArray[32]The raw bytes of the NFT ID which is the BLAKE2b-256 hash of the Output ID that created it.
+
An Address derived from an NFT ID which can be unlocked by unlocking the corresponding NFT. Defined in TIP-38 (NFT Address).
Multi Address - - - - - - - - - - - - - - - -
- Name - - Type - - Description -
Address Typeuint8Set to value 32 to denote a Multi Address.
Addresses anyOf -
- Address with Weight - - - - - - - - - - - - - - - -
- Name - - Type - - Description -
Address oneOf -
- Ed25519 Address - - - - - - - - - - - - - - - - -
- Name - - Type - - Description -
Address Typeuint8Set to value 0 to denote an Ed25519 Address.
PubKeyHashByteArray[32]The raw bytes of the Ed25519 address which is the BLAKE2b-256 hash of the Ed25519 public key.
-
-
- Account Address - - - - - - - - - - - - - - - - -
- Name - - Type - - Description -
Address Typeuint8Set to value 8 to denote an Account Address.
Account IDByteArray[32]The raw bytes of the Account ID which is the BLAKE2b-256 hash of the Output ID that created it.
-
-
- NFT Address - - - - - - - - - - - - - - - - -
- Name - - Type - - Description -
Address Typeuint8Set to value 16 to denote an NFT Address.
NFT IDByteArray[32]The raw bytes of the NFT ID which is the BLAKE2b-256 hash of the Output ID that created it.
-
-
Weightuint8The weight of the unlocked address.
-
-
+
Defines a Multi Address that consists of addresses with weights and a threshold value. The Multi Address can be unlocked if the cumulative weight of all unlocked addresses is equal to or exceeds the threshold. Defined in TIP-52 (Multi Address).
Restricted Address - - - - - - - - - - - - - - - - - - - - -
- Name - - Type - - Description -
Address Typeuint8Set to value 40 to denote a Restricted Address.
Address oneOf -
- Ed25519 Address - - - - - - - - - - - - - - - - -
- Name - - Type - - Description -
Address Typeuint8Set to value 0 to denote an Ed25519 Address.
PubKeyHashByteArray[32]The raw bytes of the Ed25519 address which is the BLAKE2b-256 hash of the Ed25519 public key.
-
-
- Account Address - - - - - - - - - - - - - - - - -
- Name - - Type - - Description -
Address Typeuint8Set to value 8 to denote an Account Address.
Account IDByteArray[32]The raw bytes of the Account ID which is the BLAKE2b-256 hash of the Output ID that created it.
-
-
- NFT Address - - - - - - - - - - - - - - - - -
- Name - - Type - - Description -
Address Typeuint8Set to value 16 to denote an NFT Address.
NFT IDByteArray[32]The raw bytes of the NFT ID which is the BLAKE2b-256 hash of the Output ID that created it.
-
-
- Multi Address - - - - - - - - - - - - - - - -
- Name - - Type - - Description -
Address Typeuint8Set to value 32 to denote a Multi Address.
Addresses anyOf -
- Address with Weight - - - - - - - - - - - - - - - -
- Name - - Type - - Description -
Address oneOf -
- Ed25519 Address - - - - - - - - - - - - - - - - -
- Name - - Type - - Description -
Address Typeuint8Set to value 0 to denote an Ed25519 Address.
PubKeyHashByteArray[32]The raw bytes of the Ed25519 address which is the BLAKE2b-256 hash of the Ed25519 public key.
-
-
- Account Address - - - - - - - - - - - - - - - - -
- Name - - Type - - Description -
Address Typeuint8Set to value 8 to denote an Account Address.
Account IDByteArray[32]The raw bytes of the Account ID which is the BLAKE2b-256 hash of the Output ID that created it.
-
-
- NFT Address - - - - - - - - - - - - - - - - -
- Name - - Type - - Description -
Address Typeuint8Set to value 16 to denote an NFT Address.
NFT IDByteArray[32]The raw bytes of the NFT ID which is the BLAKE2b-256 hash of the Output ID that created it.
-
-
Weightuint8The weight of the unlocked address.
-
-
-
-
Allowed Capabilities(uint8)ByteArrayBitflags expressed as a series of bytes. A leading uint8 denotes its length.
+
An address that contains another address and allows for configuring its capabilities. Defined in TIP-50 (Restricted Address).
Feature Type uint8Set to value 4 to denote a Block Issuer Feature.Set to value 5 to denote a Block Issuer Feature.
Expiry Slot
Ed25519 Public Key Block Issuer Key +
A Block Issuer Key derived from an Ed25519 Public Key. Defined in TIP-42 (Ed25519 Public Key Block Issuer Key).
- + From 8b582d9d8517c53a9dfb6c3a1ee3611948ccc574 Mon Sep 17 00:00:00 2001 From: Philipp Gackstatter Date: Mon, 16 Oct 2023 11:48:17 +0100 Subject: [PATCH 088/140] Replace "derive" wording for block issuer key --- tips/TIP-0042/tip-0042.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tips/TIP-0042/tip-0042.md b/tips/TIP-0042/tip-0042.md index e6c42b7c7..4b3482f70 100644 --- a/tips/TIP-0042/tip-0042.md +++ b/tips/TIP-0042/tip-0042.md @@ -381,7 +381,7 @@ account is locked to that account. - + From c389e6ac7b039dbef4882a37ece6127028787fae Mon Sep 17 00:00:00 2001 From: Philipp Gackstatter Date: Tue, 28 Nov 2023 15:13:50 +0100 Subject: [PATCH 122/140] Update tips/TIP-0042/tip-0042.md Co-authored-by: Thibault Martinez --- tips/TIP-0042/tip-0042.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tips/TIP-0042/tip-0042.md b/tips/TIP-0042/tip-0042.md index c198b7b03..0dcc3de43 100644 --- a/tips/TIP-0042/tip-0042.md +++ b/tips/TIP-0042/tip-0042.md @@ -1027,7 +1027,7 @@ creation and block issuer feature transition. - The account ID of an `Implicit Account` is referred to as `Implicit Account ID` and is the BLAKE2b-256 hash of the Output ID of the Basic Output that represents the `Implicit Account`. -- If a transaction contains an input with an unlock condition containing an implicit account address, the transaction is +- If a transaction contains an input with an address unlock condition containing an implicit account address, the transaction is only valid if all of the following conditions hold: - A valid `Account` Output is created on the output side, for which all of the following conditions hold: - The account must be a valid account creation, except that the `Account ID` of the `Account` must be set to the From 13604b747ef661c92b13f398fb94ab101a0f654e Mon Sep 17 00:00:00 2001 From: Philipp Gackstatter Date: Thu, 21 Dec 2023 14:02:40 +0100 Subject: [PATCH 123/140] Add storage score test vector --- tips/TIP-0042/tip-0042.md | 80 ++++++++++++++++++++++++++++++++++++++- 1 file changed, 78 insertions(+), 2 deletions(-) diff --git a/tips/TIP-0042/tip-0042.md b/tips/TIP-0042/tip-0042.md index 0dcc3de43..761e089da 100644 --- a/tips/TIP-0042/tip-0042.md +++ b/tips/TIP-0042/tip-0042.md @@ -1027,8 +1027,8 @@ creation and block issuer feature transition. - The account ID of an `Implicit Account` is referred to as `Implicit Account ID` and is the BLAKE2b-256 hash of the Output ID of the Basic Output that represents the `Implicit Account`. -- If a transaction contains an input with an address unlock condition containing an implicit account address, the transaction is - only valid if all of the following conditions hold: +- If a transaction contains an input with an address unlock condition containing an implicit account address, the + transaction is only valid if all of the following conditions hold: - A valid `Account` Output is created on the output side, for which all of the following conditions hold: - The account must be a valid account creation, except that the `Account ID` of the `Account` must be set to the `Implicit Account ID` instead of being zeroed out. @@ -1145,6 +1145,82 @@ indices. The max value can be used to express that such features do not have an Typically, one would want to set these features to not expire and only reduce the value to the closest possible one, once removal of the feature is desired. +# Test Vectors + +The protocol parameters used in the following test vectors are the same as in +[TIP-49 (Protocol Parameters Hash)](../TIP-0049/tip-0049.md#protocol-parameters-hash). + +## Storage Score + +The following test vector shows the calculation of the storage score according to [TIP-47](../TIP-0047/tip-0047.md). + +Account Output (json-encoded): + +```json +{ + "type": 1, + "amount": "200000000", + "mana": "333000000", + "accountId": "0xe8494fe353f99783d3771c78798e1e839e649310513770fc6dc974fe53cf1a86", + "foundryCounter": 0, + "unlockConditions": [ + { + "type": 0, + "address": { + "type": 0, + "pubKeyHash": "0xed1484f4d1f7d8c037087fed661dd92faccae1eed3c01182d6fdd6828cea144a" + } + } + ], + "features": [ + { + "type": 6, + "expirySlot": 888, + "blockIssuerKeys": [ + { + "type": 0, + "publicKey": "0x9e05a32eafedefd40298e24ad4f8c334580187f7e9afbd9da13b5ba4007dd1b5" + }, + { + "type": 0, + "publicKey": "0xa504844f7a0df2c5101d31696593b309040f8660d41035aba508f24c00668b21" + } + ] + }, + { + "type": 7, + "stakedAmount": "150000000", + "fixedCost": "400", + "startEpoch": 25, + "endEpoch": 4294967295 + } + ], + "immutableFeatures": [ + { + "type": 0, + "address": { + "type": 0, + "pubKeyHash": "0xed1484f4d1f7d8c037087fed661dd92faccae1eed3c01182d6fdd6828cea144a" + } + }, + { + "type": 2, + "entries": { + "iota": "0x322e30" + } + } + ] +} +``` + +Account Output (hex-encoded binary serialization): + +``` +0x0100c2eb0b00000000402dd91300000000e8494fe353f99783d3771c78798e1e839e649310513770fc6dc974fe53cf1a8600000000010000ed1484f4d1f7d8c037087fed661dd92faccae1eed3c01182d6fdd6828cea144a02067803000002009e05a32eafedefd40298e24ad4f8c334580187f7e9afbd9da13b5ba4007dd1b500a504844f7a0df2c5101d31696593b309040f8660d41035aba508f24c00668b210780d1f00800000000900100000000000019000000ffffffff020000ed1484f4d1f7d8c037087fed661dd92faccae1eed3c01182d6fdd6828cea144a020104696f74610300322e30 +``` + +Account Output Storage Score: `621`. + # Copyright Copyright and related rights waived via [CC0](https://creativecommons.org/publicdomain/zero/1.0/). From b2216b5b4d79c8eed22df907a86aa8bc01059c31 Mon Sep 17 00:00:00 2001 From: Philipp Gackstatter Date: Mon, 15 Jan 2024 13:17:57 +0100 Subject: [PATCH 124/140] Clarify block issuance credit < 0 behavior --- tips/TIP-0042/tip-0042.md | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/tips/TIP-0042/tip-0042.md b/tips/TIP-0042/tip-0042.md index 761e089da..3d08ca579 100644 --- a/tips/TIP-0042/tip-0042.md +++ b/tips/TIP-0042/tip-0042.md @@ -149,11 +149,15 @@ always need to be one _Account Unlock_ referencing a greater index. ## Block Issuer Feature -The presence of a Block Issuer Feature on an account signals that this account can issue blocks - it is an -_issuer account_. This feature defines the public keys with which a signature to burn Mana from the containing account's -Block Issuance Credit can be verified. The feature is locked to the account to disincentivize malicious behavior when -issuing blocks. The feature can be unlocked with an expiration mechanism. Any Mana generated or stored by an issuer -account is locked to that account. +The presence of a _Block Issuer Feature_ on an account signals that this account can issue blocks - it is a _block +issuer account_. This feature defines the public keys with which signatures on blocks can be verified. A block issued +from this account with a verified signature will burn Mana from the account's Block Issuance Credit (BIC) balance. If +the balance becomes negative, the account is locked, meaning its output cannot be spent and it can no longer be used to +issue blocks. Once locked, an account can only be unlocked by allotting enough Mana to the account's BIC balance for it +to become non-negative again. Because the account itself cannot issue such a transaction, the block containing the +alloting transaction must be issued by another account. The feature can only be removed with an expiration mechanism in +order to disincentivize malicious behavior when issuing blocks. Any Mana generated or stored by an issuer account is +locked to that account.
Block Issuer Feature From 6fbb3db860dfdf04c5f7a1747aa6495167bde74b Mon Sep 17 00:00:00 2001 From: Philipp Gackstatter Date: Wed, 17 Jan 2024 16:25:48 +0100 Subject: [PATCH 125/140] Move sender feature to mutable features --- tips/TIP-0042/tip-0042.md | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/tips/TIP-0042/tip-0042.md b/tips/TIP-0042/tip-0042.md index 3d08ca579..72739834b 100644 --- a/tips/TIP-0042/tip-0042.md +++ b/tips/TIP-0042/tip-0042.md @@ -1177,6 +1177,13 @@ Account Output (json-encoded): } ], "features": [ + { + "type": 0, + "address": { + "type": 0, + "pubKeyHash": "0xed1484f4d1f7d8c037087fed661dd92faccae1eed3c01182d6fdd6828cea144a" + } + }, { "type": 6, "expirySlot": 888, @@ -1200,13 +1207,6 @@ Account Output (json-encoded): } ], "immutableFeatures": [ - { - "type": 0, - "address": { - "type": 0, - "pubKeyHash": "0xed1484f4d1f7d8c037087fed661dd92faccae1eed3c01182d6fdd6828cea144a" - } - }, { "type": 2, "entries": { @@ -1220,7 +1220,7 @@ Account Output (json-encoded): Account Output (hex-encoded binary serialization): ``` -0x0100c2eb0b00000000402dd91300000000e8494fe353f99783d3771c78798e1e839e649310513770fc6dc974fe53cf1a8600000000010000ed1484f4d1f7d8c037087fed661dd92faccae1eed3c01182d6fdd6828cea144a02067803000002009e05a32eafedefd40298e24ad4f8c334580187f7e9afbd9da13b5ba4007dd1b500a504844f7a0df2c5101d31696593b309040f8660d41035aba508f24c00668b210780d1f00800000000900100000000000019000000ffffffff020000ed1484f4d1f7d8c037087fed661dd92faccae1eed3c01182d6fdd6828cea144a020104696f74610300322e30 +0x0100c2eb0b00000000402dd91300000000e8494fe353f99783d3771c78798e1e839e649310513770fc6dc974fe53cf1a8600000000010000ed1484f4d1f7d8c037087fed661dd92faccae1eed3c01182d6fdd6828cea144a030000ed1484f4d1f7d8c037087fed661dd92faccae1eed3c01182d6fdd6828cea144a067803000002009e05a32eafedefd40298e24ad4f8c334580187f7e9afbd9da13b5ba4007dd1b500a504844f7a0df2c5101d31696593b309040f8660d41035aba508f24c00668b210780d1f00800000000900100000000000019000000ffffffff01020104696f74610300322e30 ``` Account Output Storage Score: `621`. From cd930efb2ce60f658a1b519a9b8e8d84feb85e46 Mon Sep 17 00:00:00 2001 From: Philipp Gackstatter Date: Wed, 24 Jan 2024 15:18:39 +0100 Subject: [PATCH 126/140] Remove Ed25519 Public Key Block Issuer Key --- tips/TIP-0042/tip-0042.md | 56 ++++++++++----------------------------- 1 file changed, 14 insertions(+), 42 deletions(-) diff --git a/tips/TIP-0042/tip-0042.md b/tips/TIP-0042/tip-0042.md index 72739834b..b63cf1e72 100644 --- a/tips/TIP-0042/tip-0042.md +++ b/tips/TIP-0042/tip-0042.md @@ -194,7 +194,7 @@ locked to that account.
- + @@ -653,7 +653,7 @@ outputs that are locked under _Account Address_ and it keeps track of controlled - + @@ -665,7 +665,7 @@ outputs that are locked under _Account Address_ and it keeps track of controlled - + @@ -1043,37 +1043,9 @@ creation and block issuer feature transition. ### Implicit Account Block Issuance -An implicit account can issue blocks by using the public key from which the implicit account creation address was -derived as a block issuer key. A separate block issuer key type is reserved for that, which is however never used in -transactions directly. - -
- Ed25519 Public Key Hash Block Issuer Key -
A block issuer key for issuing blocks from implicit accounts.
-
-
@@ -1345,7 +492,7 @@ which they were selected to participate in the validator committee.
Feature Type uint8Set to value 5 to denote a Staking Feature.Set to value 6 to denote a Staking Feature.
Staked Amount
Ed25519 Public Key Block Issuer Key -
A Block Issuer Key derived from an Ed25519 Public Key. Defined in TIP-42 (Ed25519 Public Key Block Issuer Key).
+
A Block Issuer Key backed by an Ed25519 Public Key. Defined in TIP-42 (Ed25519 Public Key Block Issuer Key).
@@ -799,7 +799,7 @@ metadata into the UTXO ledger.
Ed25519 Public Key Block Issuer Key -
A Block Issuer Key derived from an Ed25519 Public Key. Defined in TIP-42 (Ed25519 Public Key Block Issuer Key).
+
A Block Issuer Key backed by an Ed25519 Public Key. Defined in TIP-42 (Ed25519 Public Key Block Issuer Key).
- + From 0283f31141391f72730aad8dc4848d0854a73c9e Mon Sep 17 00:00:00 2001 From: Philipp Gackstatter Date: Tue, 17 Oct 2023 15:47:47 +0100 Subject: [PATCH 091/140] Add Storage score for staking & block issuer feat --- tips/TIP-0042/tip-0042.md | 200 ++++++++++++++++++++------------------ 1 file changed, 106 insertions(+), 94 deletions(-) diff --git a/tips/TIP-0042/tip-0042.md b/tips/TIP-0042/tip-0042.md index b1faadf4e..9382e66be 100644 --- a/tips/TIP-0042/tip-0042.md +++ b/tips/TIP-0042/tip-0042.md @@ -294,58 +294,6 @@ Block Issuance Credit can be verified. The feature is locked to the account to d issuing blocks. The feature can be unlocked with an expiration mechanism. Any mana generated or stored by an issuer account is locked to that account. -### Additional syntactic transaction validation rule - -- The following conditions must all hold: - - `Block Issuer Key Count >= 1`. - - `Block Issuer Key Count <= 128`. - - Each key in `Block Issuer Keys` must be unique based on the concatenation of its `Public Key Type` and `Public Key`. - No duplicates are allowed. - - Each key in `Block Issuer Keys` must be lexicographically ordered based on the concatenation of its - `Public Key Type` and `Public Key`. - -### Additional semantic transaction validation rule - -- Let `Past Bounded Slot Index` be given by `Commitment Index + Max Committable Age` where `Commitment Index` is the - slot index of the commitment input. -- When a _Block Issuer Feature_ is present in an account on the input or output side of a transaction, the transaction - that contains this output is valid, if and only if: - - A _Commitment Input_ is present. - - A _Block Issuance Credit Input_ is present whose `Account ID` equals that of the account being state transitioned. -- When a Block Issuer Feature is present in an account input, the transaction is invalid if that account has - negative Block Issuance Credit, whose value is taken from the _Block Issuance Credit Input_. -- When a Block Issuer Feature is present in an account output and it was not present in the account input, or the - account output represents the initial state of its UTXO state machine, the transaction that contains the account - output is valid, if the following condition holds: - - `Expiry Slot >= Past Bounded Slot Index`. -- When a Block Issuer Feature is present in an account output, the transaction that contains this output is - valid, only if the following condition for Mana in the transaction holds for the account containing the feature: - `TotalManaIn - AccountIn >= TotalManaOut - AccountOut`, where: - - `TotalManaIn` is the sum of all mana on the input side of the transaction. - - `TotalManaOut` is the sum of all mana on the output side of the transaction. - - `AccountIn = AccountIn_potential + AccountIn_stored`. - - `AccountOut = AccountOut_allotted + AccountOut_stored + AccountOut_locked`. - - `AccountIn_potential` is the decayed potential Mana generated by the `Amount` of the account input. - - `AccountIn_stored` is the decayed stored Mana of the account input. - - `AccountOut_allotted` is the amount of Mana allotted to the account. - - `AccountOut_stored` is the amount of Mana stored in the account. - - `AccountOut_locked` is the amount of Mana locked into outputs for which each output satisfies all of the following - conditions: - - The output has a Timelock Unlock Condition containing a - `Slot Index >= Past Bounded Slot Index + Maximum Committable Age`. - - The output has an Address Unlock Condition with the `Account Address` variant containing the input - account's address. -- When a Block Issuer Feature is present in an account input containing `Expiry Slot >= Commitment Index` the - transaction that contains the account output is valid, if all of the following conditions for the account output hold: - - The account is not destroyed on the output side and retains its Block Issuer Feature. - - If either of the following conditions hold: - - The value of `Expiry Slot` on the account output matches the value of `Expiry Slot` on the account input. - - `Expiry Slot >= Past Bounded Slot Index` -- When a Block Issuer Feature is present in an account input with `Expiry Slot < Commitment Index`, the - transaction that contains the corresponding account output is valid, if either of the following conditions hold: - - `Expiry Slot >= Past Bounded Slot Index` - - The Block Issuer Feature is removed in the account output or the account is destroyed. -
Block Issuer Feature
Contains the public keys used to verify block signatures.
@@ -411,6 +359,66 @@ account is locked to that account.
From f414f9f153d4efafa78aa6663dffbae3b13c4dcf Mon Sep 17 00:00:00 2001 From: Philipp Gackstatter Date: Mon, 16 Oct 2023 13:19:57 +0100 Subject: [PATCH 089/140] Add native token migration notice --- tips/TIP-0042/tip-0042.md | 1 + 1 file changed, 1 insertion(+) diff --git a/tips/TIP-0042/tip-0042.md b/tips/TIP-0042/tip-0042.md index 4b3482f70..56438c0b2 100644 --- a/tips/TIP-0042/tip-0042.md +++ b/tips/TIP-0042/tip-0042.md @@ -47,6 +47,7 @@ strict extension of the functionality of the Alias Output. - Rename "Alias" to "Account". - Add `Mana` field to the `Account`. +- Remove `Native Tokens` field. See [TIP-38 (Native Token Migration)](../TIP-0038/tip-0038.md#native-token-migration) for migration details. - Add _Block Issuer Feature_. - Mana owned by an account with a _Block Issuer Feature_ is bound to that account and can only be moved out with a delay. From 50299e8633b6d6593673009992b744cdee256a2d Mon Sep 17 00:00:00 2001 From: Philipp Gackstatter Date: Tue, 17 Oct 2023 14:49:47 +0100 Subject: [PATCH 090/140] Set new Account Output type prefix --- tips/TIP-0042/tip-0042.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tips/TIP-0042/tip-0042.md b/tips/TIP-0042/tip-0042.md index 56438c0b2..b1faadf4e 100644 --- a/tips/TIP-0042/tip-0042.md +++ b/tips/TIP-0042/tip-0042.md @@ -547,7 +547,7 @@ metadata into the UTXO ledger.
Output Type uint8Set to value 4 to denote an Account Output.Set to value 1 to denote an Account Output.
Amount
+### Additional syntactic transaction validation rule + +- The following conditions must all hold: + - `Block Issuer Key Count >= 1`. + - `Block Issuer Key Count <= 128`. + - Each key in `Block Issuer Keys` must be unique based on the concatenation of its `Public Key Type` and `Public Key`. + No duplicates are allowed. + - Each key in `Block Issuer Keys` must be lexicographically ordered based on the concatenation of its + `Public Key Type` and `Public Key`. + +### Additional semantic transaction validation rule + +- Let `Past Bounded Slot Index` be given by `Commitment Index + Max Committable Age` where `Commitment Index` is the + slot index of the commitment input. +- When a _Block Issuer Feature_ is present in an account on the input or output side of a transaction, the transaction + that contains this output is valid, if and only if: + - A _Commitment Input_ is present. + - A _Block Issuance Credit Input_ is present whose `Account ID` equals that of the account being state transitioned. +- When a Block Issuer Feature is present in an account input, the transaction is invalid if that account has + negative Block Issuance Credit, whose value is taken from the _Block Issuance Credit Input_. +- When a Block Issuer Feature is present in an account output and it was not present in the account input, or the + account output represents the initial state of its UTXO state machine, the transaction that contains the account + output is valid, if the following condition holds: + - `Expiry Slot >= Past Bounded Slot Index`. +- When a Block Issuer Feature is present in an account output, the transaction that contains this output is + valid, only if the following condition for Mana in the transaction holds for the account containing the feature: + `TotalManaIn - AccountIn >= TotalManaOut - AccountOut`, where: + - `TotalManaIn` is the sum of all mana on the input side of the transaction. + - `TotalManaOut` is the sum of all mana on the output side of the transaction. + - `AccountIn = AccountIn_potential + AccountIn_stored`. + - `AccountOut = AccountOut_allotted + AccountOut_stored + AccountOut_locked`. + - `AccountIn_potential` is the decayed potential Mana generated by the `Amount` of the account input. + - `AccountIn_stored` is the decayed stored Mana of the account input. + - `AccountOut_allotted` is the amount of Mana allotted to the account. + - `AccountOut_stored` is the amount of Mana stored in the account. + - `AccountOut_locked` is the amount of Mana locked into outputs for which each output satisfies all of the following + conditions: + - The output has a Timelock Unlock Condition containing a + `Slot Index >= Past Bounded Slot Index + Maximum Committable Age`. + - The output has an Address Unlock Condition with the `Account Address` variant containing the input + account's address. +- When a Block Issuer Feature is present in an account input containing `Expiry Slot >= Commitment Index` the + transaction that contains the account output is valid, if all of the following conditions for the account output hold: + - The account is not destroyed on the output side and retains its Block Issuer Feature. + - If either of the following conditions hold: + - The value of `Expiry Slot` on the account output matches the value of `Expiry Slot` on the account input. + - `Expiry Slot >= Past Bounded Slot Index` +- When a Block Issuer Feature is present in an account input with `Expiry Slot < Commitment Index`, the + transaction that contains the corresponding account output is valid, if either of the following conditions hold: + - `Expiry Slot >= Past Bounded Slot Index` + - The Block Issuer Feature is removed in the account output or the account is destroyed. + +### Storage Score + +A Block Issuer Feature incurs additional computational cost in order to maintain the block issuer keys of an account and due to having to keep them in memory. Due to this, such a feature has an additional storage score offset. The offset of the feature is the sum of offsets of each contained key: + +- If the contained key is of type `Ed25519 Public Key Block Issuer Key`, the offset is `Storage Score Offset Ed25519 Block Issuer Key`. + +`Rent Parameters` are defined in [TIP-49](../TIP-0049/tip-0049.md). + ## Staking Feature The presence of a Staking Feature on an account signals that this account wants to participate in the validation @@ -427,6 +435,49 @@ Feature whose `End Epoch` is the current one or has passed, it is no longer cons Feature can be removed or updated. In the same transaction, the staker may claim their Mana Rewards for all epochs in which they were selected to participate in the validator committee. +
+ Staking Feature +
Stakes IOTA coins to become eligible for committee selection, validate the network and receive Mana rewards.
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Name + + Type + + Description +
Feature Typeuint8Set to value 6 to denote a Staking Feature.
Staked Amountuint64The amount of IOTA coins that are locked and staked in the containing account.
Fixed Costuint64The fixed cost of the validator, which it receives as part of its Mana rewards.
Start Epochuint64The epoch index in which the staking started.
End Epochuint64The epoch index in which the staking ends.
+ ### Additional semantic transaction validation rule - Let `Future Bounded Epoch Index` be the epoch index corresponding to the slot index given by @@ -474,48 +525,9 @@ which they were selected to participate in the validator committee. - The Mana amount on the input side of the transaction is increased by at most the amount defined in [TIP-40 (Validator Rewards)](../TIP-0040/tip-0040.md#validator-rewards). -
- Staking Feature -
Stakes IOTA coins to become eligible for committee selection, validate the network and receive Mana rewards.
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- Name - - Type - - Description -
Feature Typeuint8Set to value 6 to denote a Staking Feature.
Staked Amountuint64The amount of IOTA coins that are locked and staked in the containing account.
Fixed Costuint64The fixed cost of the validator, which it receives as part of its Mana rewards.
Start Epochuint64The epoch index in which the staking started.
End Epochuint64The epoch index in which the staking ends.
+### Storage Score + +A Staking Feature incurs additional computational cost in order to compute the total stake of a validator. Due to this, such a feature has an additional storage score offset, the `Rent Parameters::Storage Score Offset Staking Feature` as defined in [TIP-49](../TIP-0049/tip-0049.md). # Account Output From 26f8873f1253f274bb98f129bb3b37793a0094e1 Mon Sep 17 00:00:00 2001 From: Philipp Gackstatter Date: Tue, 17 Oct 2023 16:39:11 +0100 Subject: [PATCH 092/140] Update Implicit Acc Creation Addr Storage Score --- tips/TIP-0042/tip-0042.md | 30 +++++++++++++++++------------- 1 file changed, 17 insertions(+), 13 deletions(-) diff --git a/tips/TIP-0042/tip-0042.md b/tips/TIP-0042/tip-0042.md index 9382e66be..530737fb7 100644 --- a/tips/TIP-0042/tip-0042.md +++ b/tips/TIP-0042/tip-0042.md @@ -47,7 +47,8 @@ strict extension of the functionality of the Alias Output. - Rename "Alias" to "Account". - Add `Mana` field to the `Account`. -- Remove `Native Tokens` field. See [TIP-38 (Native Token Migration)](../TIP-0038/tip-0038.md#native-token-migration) for migration details. +- Remove `Native Tokens` field. See [TIP-38 (Native Token Migration)](../TIP-0038/tip-0038.md#native-token-migration) + for migration details. - Add _Block Issuer Feature_. - Mana owned by an account with a _Block Issuer Feature_ is bound to that account and can only be moved out with a delay. @@ -413,9 +414,12 @@ account is locked to that account. ### Storage Score -A Block Issuer Feature incurs additional computational cost in order to maintain the block issuer keys of an account and due to having to keep them in memory. Due to this, such a feature has an additional storage score offset. The offset of the feature is the sum of offsets of each contained key: +A Block Issuer Feature incurs additional computational cost in order to maintain the block issuer keys of an account and +due to having to keep them in memory. Due to this, such a feature has an additional storage score offset. The offset of +the feature is the sum of offsets of each contained key: -- If the contained key is of type `Ed25519 Public Key Block Issuer Key`, the offset is `Storage Score Offset Ed25519 Block Issuer Key`. +- If the contained key is of type `Ed25519 Public Key Block Issuer Key`, the offset is + `Storage Score Offset Ed25519 Block Issuer Key`. `Rent Parameters` are defined in [TIP-49](../TIP-0049/tip-0049.md). @@ -527,7 +531,9 @@ which they were selected to participate in the validator committee. ### Storage Score -A Staking Feature incurs additional computational cost in order to compute the total stake of a validator. Due to this, such a feature has an additional storage score offset, the `Rent Parameters::Storage Score Offset Staking Feature` as defined in [TIP-49](../TIP-0049/tip-0049.md). +A Staking Feature incurs additional computational cost in order to compute the total stake of a validator. Due to this, +such a feature has an additional storage score offset, the `Rent Parameters::Storage Score Offset Staking Feature` as +defined in [TIP-49](../TIP-0049/tip-0049.md). # Account Output @@ -3509,15 +3515,14 @@ The _Implicit Account Creation Address_ is defined as follows: An _Implicit Account Creation Address_ is structurally the same as an _Ed25519 Address_, except for the _Address Type_, and thus also backed by an Ed25519 key pair. -### Storage Deposit +### Storage Score -- The storage deposit of an _Implicit Account Creation Address_ defines a dedicated Storage Score Offset: +- An _Implicit Account Creation Address_ defines a dedicated Storage Score Offset: `Storage Score Offset Implicit Account Creation Address`. It is designed to match the Storage Score required for a - minimal Account Output that contains a Block Issuer Feature when contained in a Basic Output. To calculate this - offset, the following Storage Scores are calculated: - - Let `Storage Score Offset Implicit Account Creation Address` be - `Account Output Score - Basic Output Score + Ed25519 Address Score`, where: - - Let `Account Output Score` be the storage score of an Account Output which fulfills the following conditions: + minimal Account Output that contains a Block Issuer Feature when contained in a Basic Output. This offset is derived + from protocol parameters and other computed outputs: + - Let `Storage Score Offset Implicit Account Creation Address` be `Account Output Score - Basic Output Score`, where: + - `Account Output Score` is the storage score of an Account Output which fulfills the following conditions: - `Native Tokens Count == 0`. - `State Metadata` must be empty. - `State Controller Address Unlock Condition` and `Governor Address Unlock Condition` must contain an _Ed25519 @@ -3526,12 +3531,11 @@ and thus also backed by an Ed25519 key pair. - A _Block Issuer Feature_ must be present with `Block Issuer Keys Count == 1` and a block issuer key of type _Block Issuer Key Ed25519_. - `Immutable Features Count == 0`. - - Let `Basic Output Score` be the storage score of a Basic Output which fulfills the following conditions: + - `Basic Output Score` is the storage score of a Basic Output which fulfills the following conditions: - `Native Tokens Count == 0`. - `Unlock Conditions Count == 1`. - The unlock condition is of type `Address Unlock Condition` and contains an `Ed25519 Address`. - `Features Count == 0`. - - Let `Ed25519 Address Score` be the storage score of an `Ed25519 Address`. ### Creation Semantic Transaction Validation Rules From b02cc78943532bf1db581df59afc8f867ad7e227 Mon Sep 17 00:00:00 2001 From: Philipp Gackstatter Date: Tue, 17 Oct 2023 16:48:47 +0100 Subject: [PATCH 093/140] Fix broken intradoc link --- tips/TIP-0042/tip-0042.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tips/TIP-0042/tip-0042.md b/tips/TIP-0042/tip-0042.md index 530737fb7..efe77eb31 100644 --- a/tips/TIP-0042/tip-0042.md +++ b/tips/TIP-0042/tip-0042.md @@ -3619,7 +3619,7 @@ Feature to an _Alias Output_ which is converted to an _Account Output_ with a Bl Feature is removed from the output. This transition is only done if all of the following conditions hold: - The _Alias Output_'s `Amount` is at least `Rent Parameters::Storage Cost * Account Output Score`, with the latter - defined in [Implicit Account (Storage Deposit)](#storage-deposit), except that the `Block Issuer Keys Count` of the + defined in [Implicit Account (Storage Score)](#storage-score-2), except that the `Block Issuer Keys Count` of the output for the deposit calculation must be set to the value of the `Block Issuer Keys Count` read from the serialized Block Issuer Feature in the to-be-converted _Alias Output_. - The serialized Block Issuer Feature is prefixed with the ascii-encoded string `BlockIssuerFeature`, which is From 77a03cb0529994eb2125e70a3e99cf63bdeaf16a Mon Sep 17 00:00:00 2001 From: Philipp Gackstatter Date: Tue, 17 Oct 2023 17:04:54 +0100 Subject: [PATCH 094/140] Revert "Update Implicit Acc Creation Addr Storage Score" This reverts commit 26f8873f1253f274bb98f129bb3b37793a0094e1. --- tips/TIP-0042/tip-0042.md | 30 +++++++++++++----------------- 1 file changed, 13 insertions(+), 17 deletions(-) diff --git a/tips/TIP-0042/tip-0042.md b/tips/TIP-0042/tip-0042.md index efe77eb31..14f0130c9 100644 --- a/tips/TIP-0042/tip-0042.md +++ b/tips/TIP-0042/tip-0042.md @@ -47,8 +47,7 @@ strict extension of the functionality of the Alias Output. - Rename "Alias" to "Account". - Add `Mana` field to the `Account`. -- Remove `Native Tokens` field. See [TIP-38 (Native Token Migration)](../TIP-0038/tip-0038.md#native-token-migration) - for migration details. +- Remove `Native Tokens` field. See [TIP-38 (Native Token Migration)](../TIP-0038/tip-0038.md#native-token-migration) for migration details. - Add _Block Issuer Feature_. - Mana owned by an account with a _Block Issuer Feature_ is bound to that account and can only be moved out with a delay. @@ -414,12 +413,9 @@ account is locked to that account. ### Storage Score -A Block Issuer Feature incurs additional computational cost in order to maintain the block issuer keys of an account and -due to having to keep them in memory. Due to this, such a feature has an additional storage score offset. The offset of -the feature is the sum of offsets of each contained key: +A Block Issuer Feature incurs additional computational cost in order to maintain the block issuer keys of an account and due to having to keep them in memory. Due to this, such a feature has an additional storage score offset. The offset of the feature is the sum of offsets of each contained key: -- If the contained key is of type `Ed25519 Public Key Block Issuer Key`, the offset is - `Storage Score Offset Ed25519 Block Issuer Key`. +- If the contained key is of type `Ed25519 Public Key Block Issuer Key`, the offset is `Storage Score Offset Ed25519 Block Issuer Key`. `Rent Parameters` are defined in [TIP-49](../TIP-0049/tip-0049.md). @@ -531,9 +527,7 @@ which they were selected to participate in the validator committee. ### Storage Score -A Staking Feature incurs additional computational cost in order to compute the total stake of a validator. Due to this, -such a feature has an additional storage score offset, the `Rent Parameters::Storage Score Offset Staking Feature` as -defined in [TIP-49](../TIP-0049/tip-0049.md). +A Staking Feature incurs additional computational cost in order to compute the total stake of a validator. Due to this, such a feature has an additional storage score offset, the `Rent Parameters::Storage Score Offset Staking Feature` as defined in [TIP-49](../TIP-0049/tip-0049.md). # Account Output @@ -3515,14 +3509,15 @@ The _Implicit Account Creation Address_ is defined as follows: An _Implicit Account Creation Address_ is structurally the same as an _Ed25519 Address_, except for the _Address Type_, and thus also backed by an Ed25519 key pair. -### Storage Score +### Storage Deposit -- An _Implicit Account Creation Address_ defines a dedicated Storage Score Offset: +- The storage deposit of an _Implicit Account Creation Address_ defines a dedicated Storage Score Offset: `Storage Score Offset Implicit Account Creation Address`. It is designed to match the Storage Score required for a - minimal Account Output that contains a Block Issuer Feature when contained in a Basic Output. This offset is derived - from protocol parameters and other computed outputs: - - Let `Storage Score Offset Implicit Account Creation Address` be `Account Output Score - Basic Output Score`, where: - - `Account Output Score` is the storage score of an Account Output which fulfills the following conditions: + minimal Account Output that contains a Block Issuer Feature when contained in a Basic Output. To calculate this + offset, the following Storage Scores are calculated: + - Let `Storage Score Offset Implicit Account Creation Address` be + `Account Output Score - Basic Output Score + Ed25519 Address Score`, where: + - Let `Account Output Score` be the storage score of an Account Output which fulfills the following conditions: - `Native Tokens Count == 0`. - `State Metadata` must be empty. - `State Controller Address Unlock Condition` and `Governor Address Unlock Condition` must contain an _Ed25519 @@ -3531,11 +3526,12 @@ and thus also backed by an Ed25519 key pair. - A _Block Issuer Feature_ must be present with `Block Issuer Keys Count == 1` and a block issuer key of type _Block Issuer Key Ed25519_. - `Immutable Features Count == 0`. - - `Basic Output Score` is the storage score of a Basic Output which fulfills the following conditions: + - Let `Basic Output Score` be the storage score of a Basic Output which fulfills the following conditions: - `Native Tokens Count == 0`. - `Unlock Conditions Count == 1`. - The unlock condition is of type `Address Unlock Condition` and contains an `Ed25519 Address`. - `Features Count == 0`. + - Let `Ed25519 Address Score` be the storage score of an `Ed25519 Address`. ### Creation Semantic Transaction Validation Rules From 768e9df9c4865ccdf8a2189576b6ff3fb9e739af Mon Sep 17 00:00:00 2001 From: Philipp Gackstatter Date: Tue, 17 Oct 2023 17:05:50 +0100 Subject: [PATCH 095/140] Rename implicit account storage score header --- tips/TIP-0042/tip-0042.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tips/TIP-0042/tip-0042.md b/tips/TIP-0042/tip-0042.md index 14f0130c9..9750a41ab 100644 --- a/tips/TIP-0042/tip-0042.md +++ b/tips/TIP-0042/tip-0042.md @@ -3509,7 +3509,7 @@ The _Implicit Account Creation Address_ is defined as follows: An _Implicit Account Creation Address_ is structurally the same as an _Ed25519 Address_, except for the _Address Type_, and thus also backed by an Ed25519 key pair. -### Storage Deposit +### Storage Score - The storage deposit of an _Implicit Account Creation Address_ defines a dedicated Storage Score Offset: `Storage Score Offset Implicit Account Creation Address`. It is designed to match the Storage Score required for a From f05af681b26ca80fa45bf64c61c0172461c9f244 Mon Sep 17 00:00:00 2001 From: Philipp Gackstatter Date: Mon, 23 Oct 2023 12:32:24 +0100 Subject: [PATCH 096/140] Remove storage deposit table --- tips/TIP-0042/tip-0042.md | 2388 ------------------------------------- 1 file changed, 2388 deletions(-) diff --git a/tips/TIP-0042/tip-0042.md b/tips/TIP-0042/tip-0042.md index 9750a41ab..9a9983a21 100644 --- a/tips/TIP-0042/tip-0042.md +++ b/tips/TIP-0042/tip-0042.md @@ -1073,2394 +1073,6 @@ The **current state** is defined as the **consumed account output**, while the * address -> output mapping table, so that given an Account Address, its most recent unspent account output can be retrieved. -## Storage Deposit Calculation - -The storage deposit of Block Issuer Keys is higher than for other field types. Therefore, the storage deposit -calculation of account outputs defines an additional corresponding field type. - -| :warning: Preliminary values | -| ---------------------------- | - - - - - - - - - - - - - - - - - - - - -
NameDescriptionWeightReasoning
block_issuer_keyA Block Issuer Key contained in a Block Issuer Feature.100 (preliminary value for testing)A block issuer key needs to be kept in-memory for the efficient processing of incoming blocks and cannot be - offloaded to disc.
stakingAny field contained in a Staking Feature.100 (preliminary value for testing)Staking requires additional bookkeeping in nodes for committee selection and mana rewards tracking.
- -The following table shows the Account Output including the possible fields and their specific weight. - -
- Account Output -
Describes an account in the ledger that can be controlled by the state and governance controllers.
-
- - - - - - - - - - - - - - - - - -
Offset - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- Field - - Field type - - Length Minimum - - Length Maximum -
OutputID - key - 3434
Block ID (included) - data - 4040
Slot Booked - data - 88
Slot Created - data - 88
-
Fields - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- Field - - Field type - - Length Minimum - - Length Maximum -
Output Type - data - 11
Amount - data - 88
Mana - data - 88
Native Tokens Count - data - 11
Native Tokens optAnyOf -
- Native Token - - - - - -
Fields - - - - - - - - - - - - - - - - - - - -
- Field - - Field type - - Length Minimum - - Length Maximum -
Token ID - data - 3838
Amount - data - 3232
-
-
-
Account ID - data - 3232
State Index - data - 44
State Metadata Length - data - 22
State Metadata - data - 08192
Foundry Counter - data - 44
Unlock Conditions Count - data - 11
Unlock Conditions atMostOneOfEach -
- State Controller Address Unlock Condition -
Defines the State Controller Address that owns this output. It can unlock the output with the proper Unlock in a transaction that state transitions the account output.
- - - - - -
Fields - - - - - - - - - - - - - - - - - -
- Field - - Field type - - Length Minimum - - Length Maximum -
Unlock Condition Type - data - 11
Address oneOf -
- Ed25519 Address - - - - - -
Fields - - - - - - - - - - - - - - - - - - - -
- Field - - Field type - - Length Minimum - - Length Maximum -
Address Type - data - 11
PubKeyHash - data - 3232
-
-
-
- Account Address - - - - - -
Fields - - - - - - - - - - - - - - - - - - - -
- Field - - Field type - - Length Minimum - - Length Maximum -
Address Type - data - 11
Account ID - data - 3232
-
-
-
- NFT Address - - - - - -
Fields - - - - - - - - - - - - - - - - - - - -
- Field - - Field type - - Length Minimum - - Length Maximum -
Address Type - data - 11
NFT ID - data - 3232
-
-
-
- Multi Address - - - - - -
Fields - - - - - - - - - - - - - - - - - -
- Field - - Field type - - Length Minimum - - Length Maximum -
Address Type - data - 11
Addresses anyOf -
- Address with Weight - - - - - -
Fields - - - - - - - - - - - - - - - - - -
- Field - - Field type - - Length Minimum - - Length Maximum -
Address oneOf -
- Ed25519 Address - - - - - -
Fields - - - - - - - - - - - - - - - - - - - -
- Field - - Field type - - Length Minimum - - Length Maximum -
Address Type - data - 11
PubKeyHash - data - 3232
-
-
-
- Account Address - - - - - -
Fields - - - - - - - - - - - - - - - - - - - -
- Field - - Field type - - Length Minimum - - Length Maximum -
Address Type - data - 11
Account ID - data - 3232
-
-
-
- NFT Address - - - - - -
Fields - - - - - - - - - - - - - - - - - - - -
- Field - - Field type - - Length Minimum - - Length Maximum -
Address Type - data - 11
NFT ID - data - 3232
-
-
-
Weight - data - 11
-
-
-
-
-
-
- Restricted Address - - - - - -
Fields - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- Field - - Field type - - Length Minimum - - Length Maximum -
Address Type - data - 11
Address oneOf -
- Ed25519 Address - - - - - -
Fields - - - - - - - - - - - - - - - - - - - -
- Field - - Field type - - Length Minimum - - Length Maximum -
Address Type - data - 11
PubKeyHash - data - 3232
-
-
-
- Account Address - - - - - -
Fields - - - - - - - - - - - - - - - - - - - -
- Field - - Field type - - Length Minimum - - Length Maximum -
Address Type - data - 11
Account ID - data - 3232
-
-
-
- NFT Address - - - - - -
Fields - - - - - - - - - - - - - - - - - - - -
- Field - - Field type - - Length Minimum - - Length Maximum -
Address Type - data - 11
NFT ID - data - 3232
-
-
-
- Multi Address - - - - - -
Fields - - - - - - - - - - - - - - - - - -
- Field - - Field type - - Length Minimum - - Length Maximum -
Address Type - data - 11
Addresses anyOf -
- Address with Weight - - - - - -
Fields - - - - - - - - - - - - - - - - - -
- Field - - Field type - - Length Minimum - - Length Maximum -
Address oneOf -
- Ed25519 Address - - - - - -
Fields - - - - - - - - - - - - - - - - - - - -
- Field - - Field type - - Length Minimum - - Length Maximum -
Address Type - data - 11
PubKeyHash - data - 3232
-
-
-
- Account Address - - - - - -
Fields - - - - - - - - - - - - - - - - - - - -
- Field - - Field type - - Length Minimum - - Length Maximum -
Address Type - data - 11
Account ID - data - 3232
-
-
-
- NFT Address - - - - - -
Fields - - - - - - - - - - - - - - - - - - - -
- Field - - Field type - - Length Minimum - - Length Maximum -
Address Type - data - 11
NFT ID - data - 3232
-
-
-
Weight - data - 11
-
-
-
-
-
-
Allowed Capabilities Length - data - 11
Allowed Capabilities - data - 01
-
-
-
-
-
-
- Governor Address Unlock Condition -
Defines the Governor Address that owns this output. It can unlock the output with the proper Unlock in a transaction that governance transitions the account output.
- - - - - -
Fields - - - - - - - - - - - - - - - - - -
- Field - - Field type - - Length Minimum - - Length Maximum -
Unlock Condition Type - data - 11
Address oneOf -
- Ed25519 Address - - - - - -
Fields - - - - - - - - - - - - - - - - - - - -
- Field - - Field type - - Length Minimum - - Length Maximum -
Address Type - data - 11
PubKeyHash - data - 3232
-
-
-
- Account Address - - - - - -
Fields - - - - - - - - - - - - - - - - - - - -
- Field - - Field type - - Length Minimum - - Length Maximum -
Address Type - data - 11
Account ID - data - 3232
-
-
-
- NFT Address - - - - - -
Fields - - - - - - - - - - - - - - - - - - - -
- Field - - Field type - - Length Minimum - - Length Maximum -
Address Type - data - 11
NFT ID - data - 3232
-
-
-
- Multi Address - - - - - -
Fields - - - - - - - - - - - - - - - - - -
- Field - - Field type - - Length Minimum - - Length Maximum -
Address Type - data - 11
Addresses anyOf -
- Address with Weight - - - - - -
Fields - - - - - - - - - - - - - - - - - -
- Field - - Field type - - Length Minimum - - Length Maximum -
Address oneOf -
- Ed25519 Address - - - - - -
Fields - - - - - - - - - - - - - - - - - - - -
- Field - - Field type - - Length Minimum - - Length Maximum -
Address Type - data - 11
PubKeyHash - data - 3232
-
-
-
- Account Address - - - - - -
Fields - - - - - - - - - - - - - - - - - - - -
- Field - - Field type - - Length Minimum - - Length Maximum -
Address Type - data - 11
Account ID - data - 3232
-
-
-
- NFT Address - - - - - -
Fields - - - - - - - - - - - - - - - - - - - -
- Field - - Field type - - Length Minimum - - Length Maximum -
Address Type - data - 11
NFT ID - data - 3232
-
-
-
Weight - data - 11
-
-
-
-
-
-
- Restricted Address - - - - - -
Fields - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- Field - - Field type - - Length Minimum - - Length Maximum -
Address Type - data - 11
Address oneOf -
- Ed25519 Address - - - - - -
Fields - - - - - - - - - - - - - - - - - - - -
- Field - - Field type - - Length Minimum - - Length Maximum -
Address Type - data - 11
PubKeyHash - data - 3232
-
-
-
- Account Address - - - - - -
Fields - - - - - - - - - - - - - - - - - - - -
- Field - - Field type - - Length Minimum - - Length Maximum -
Address Type - data - 11
Account ID - data - 3232
-
-
-
- NFT Address - - - - - -
Fields - - - - - - - - - - - - - - - - - - - -
- Field - - Field type - - Length Minimum - - Length Maximum -
Address Type - data - 11
NFT ID - data - 3232
-
-
-
- Multi Address - - - - - -
Fields - - - - - - - - - - - - - - - - - -
- Field - - Field type - - Length Minimum - - Length Maximum -
Address Type - data - 11
Addresses anyOf -
- Address with Weight - - - - - -
Fields - - - - - - - - - - - - - - - - - -
- Field - - Field type - - Length Minimum - - Length Maximum -
Address oneOf -
- Ed25519 Address - - - - - -
Fields - - - - - - - - - - - - - - - - - - - -
- Field - - Field type - - Length Minimum - - Length Maximum -
Address Type - data - 11
PubKeyHash - data - 3232
-
-
-
- Account Address - - - - - -
Fields - - - - - - - - - - - - - - - - - - - -
- Field - - Field type - - Length Minimum - - Length Maximum -
Address Type - data - 11
Account ID - data - 3232
-
-
-
- NFT Address - - - - - -
Fields - - - - - - - - - - - - - - - - - - - -
- Field - - Field type - - Length Minimum - - Length Maximum -
Address Type - data - 11
NFT ID - data - 3232
-
-
-
Weight - data - 11
-
-
-
-
-
-
Allowed Capabilities Length - data - 11
Allowed Capabilities - data - 01
-
-
-
-
-
-
Features Count - data - 11
Features atMostOneOfEach -
- Sender Feature -
Identifies the validated sender of the output.
- - - - - -
Fields - - - - - - - - - - - - - - - - - -
- Field - - Field type - - Length Minimum - - Length Maximum -
Feature Type - data - 11
Sender oneOf -
- Ed25519 Address - - - - - -
Fields - - - - - - - - - - - - - - - - - - - -
- Field - - Field type - - Length Minimum - - Length Maximum -
Address Type - data - 11
PubKeyHash - data - 3232
-
-
-
- Account Address - - - - - -
Fields - - - - - - - - - - - - - - - - - - - -
- Field - - Field type - - Length Minimum - - Length Maximum -
Address Type - data - 11
Account ID - data - 3232
-
-
-
- NFT Address - - - - - -
Fields - - - - - - - - - - - - - - - - - - - -
- Field - - Field type - - Length Minimum - - Length Maximum -
Address Type - data - 11
NFT ID - data - 3232
-
-
-
-
-
-
- Metadata Feature -
Defines metadata (arbitrary binary data) that will be stored in the output.
- - - - - -
Fields - - - - - - - - - - - - - - - - - - - - - - - - - -
- Field - - Field type - - Length Minimum - - Length Maximum -
Feature Type - data - 11
Data Length - data - 22
Data - data - 18192
-
-
-
- Block Issuer Feature -
Contains the public keys used to verify block signatures.
- - - - - -
Fields - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- Field - - Field type - - Length Minimum - - Length Maximum -
Feature Type - data - 11
Expiry Slot - data - 88
Block Issuer Keys Count - data - 11
Block Issuer Keys anyOf -
- Ed25519 Public Key Block Issuer Key - - - - - -
Fields - - - - - - - - - - - - - - - - - - - -
- Field - - Field type - - Length Minimum - - Length Maximum -
Block Issuer Key Type - block_issuer_key - 11
Public Key - block_issuer_key - 3232
-
-
-
-
-
-
- Staking Feature -
Stakes IOTA coins to become eligible for committee selection, validate the network and receive Mana rewards.
- - - - - -
Fields - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- Field - - Field type - - Length Minimum - - Length Maximum -
Feature Type - staking - 11
Staked Amount - staking - 88
Fixed Cost - staking - 88
Start Epoch - staking - 88
End Epoch - staking - 88
-
-
-
Immutable Features Count - data - 11
Immutable Features atMostOneOfEach -
- Issuer Feature -
Identifies the validated issuer of the UTXO state machine.
- - - - - -
Fields - - - - - - - - - - - - - - - - - -
- Field - - Field type - - Length Minimum - - Length Maximum -
Feature Type - data - 11
Issuer oneOf -
- Ed25519 Address - - - - - -
Fields - - - - - - - - - - - - - - - - - - - -
- Field - - Field type - - Length Minimum - - Length Maximum -
Address Type - data - 11
PubKeyHash - data - 3232
-
-
-
- Account Address - - - - - -
Fields - - - - - - - - - - - - - - - - - - - -
- Field - - Field type - - Length Minimum - - Length Maximum -
Address Type - data - 11
Account ID - data - 3232
-
-
-
- NFT Address - - - - - -
Fields - - - - - - - - - - - - - - - - - - - -
- Field - - Field type - - Length Minimum - - Length Maximum -
Address Type - data - 11
NFT ID - data - 3232
-
-
-
-
-
-
- Metadata Feature -
Defines metadata (arbitrary binary data) that will be stored in the output.
- - - - - -
Fields - - - - - - - - - - - - - - - - - - - - - - - - - -
- Field - - Field type - - Length Minimum - - Length Maximum -
Feature Type - data - 11
Data Length - data - 22
Data - data - 18192
-
-
-
-
v_byte Minimum527
v_byte Maximum455989
- ## Implicit Account Accounts face a bootstrapping problem since users need to own an Account with a _Block Issuer Feature_ in order to issue From 988e4a415730c7c96415a6d90b416661f34309ea Mon Sep 17 00:00:00 2001 From: Philipp Gackstatter Date: Mon, 23 Oct 2023 12:33:15 +0100 Subject: [PATCH 097/140] Remove manually added Table of Contents GitHub and the Wiki both auto-generate a ToC, so it's unnecessary to maintain it. --- tips/TIP-0042/tip-0042.md | 19 ------------------- 1 file changed, 19 deletions(-) diff --git a/tips/TIP-0042/tip-0042.md b/tips/TIP-0042/tip-0042.md index 9a9983a21..0dfd44fb6 100644 --- a/tips/TIP-0042/tip-0042.md +++ b/tips/TIP-0042/tip-0042.md @@ -14,24 +14,6 @@ requires: TIP-21, TIP-22, TIP-38, TIP-45 and TIP-47 replaces: TIP-18 --- -# Table of Contents - -1. [Summary](#summary) -2. [Motivation](#motivation) -3. [Building Blocks](#building-blocks) -4. [Unlock Conditions](#unlock-conditions) - - [State Controller Address Unlock Condition](#state-controller-address-unlock-condition) - - [Governor Address Unlock Condition](#governor-address-unlock-condition) - - [Account Locking & Unlocking](#account-locking--unlocking) -5. [Features](#features) - - [Block Issuer Feature](#block-issuer-feature) - - [Staking Feature](#staking-feature) -6. [Account Output](#account-output) -7. [Implicit Account](#implicit-account) -8. [Migration](#migration) -9. [Rationale & Alternatives](#rationale--alternatives) -10. [Copyright](#copyright) - # Summary The account is the central component of the IOTA 2.0 ledger that enables: @@ -45,7 +27,6 @@ strict extension of the functionality of the Alias Output. ## Summary of changes compared to TIP-18 -- Rename "Alias" to "Account". - Add `Mana` field to the `Account`. - Remove `Native Tokens` field. See [TIP-38 (Native Token Migration)](../TIP-0038/tip-0038.md#native-token-migration) for migration details. - Add _Block Issuer Feature_. From 0f9a68fb3ec0d5a9ea0fa3792ebbdfa6875ce589 Mon Sep 17 00:00:00 2001 From: Philipp Gackstatter Date: Mon, 23 Oct 2023 12:33:53 +0100 Subject: [PATCH 098/140] Capitalize "Mana" --- tips/TIP-0042/tip-0042.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/tips/TIP-0042/tip-0042.md b/tips/TIP-0042/tip-0042.md index 0dfd44fb6..af45cd393 100644 --- a/tips/TIP-0042/tip-0042.md +++ b/tips/TIP-0042/tip-0042.md @@ -272,7 +272,7 @@ always need to be one _Account Unlock_ referencing a greater index. The presence of a Block Issuer Feature on an account signals that this account can issue blocks - it is an _issuer account_. This feature defines the public keys with which a signature to burn Mana from the containing account's Block Issuance Credit can be verified. The feature is locked to the account to disincentivize malicious behavior when -issuing blocks. The feature can be unlocked with an expiration mechanism. Any mana generated or stored by an issuer +issuing blocks. The feature can be unlocked with an expiration mechanism. Any Mana generated or stored by an issuer account is locked to that account.
@@ -367,8 +367,8 @@ account is locked to that account. - When a Block Issuer Feature is present in an account output, the transaction that contains this output is valid, only if the following condition for Mana in the transaction holds for the account containing the feature: `TotalManaIn - AccountIn >= TotalManaOut - AccountOut`, where: - - `TotalManaIn` is the sum of all mana on the input side of the transaction. - - `TotalManaOut` is the sum of all mana on the output side of the transaction. + - `TotalManaIn` is the sum of all Mana on the input side of the transaction. + - `TotalManaOut` is the sum of all Mana on the output side of the transaction. - `AccountIn = AccountIn_potential + AccountIn_stored`. - `AccountOut = AccountOut_allotted + AccountOut_stored + AccountOut_locked`. - `AccountIn_potential` is the decayed potential Mana generated by the `Amount` of the account input. From 31042418f5eb25863fb69703bd490d2128f34191 Mon Sep 17 00:00:00 2001 From: Philipp Gackstatter Date: Mon, 23 Oct 2023 12:34:28 +0100 Subject: [PATCH 099/140] Replace "IOTA tokens" -> "IOTA coins" --- tips/TIP-0042/tip-0042.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tips/TIP-0042/tip-0042.md b/tips/TIP-0042/tip-0042.md index af45cd393..6374ed72b 100644 --- a/tips/TIP-0042/tip-0042.md +++ b/tips/TIP-0042/tip-0042.md @@ -19,7 +19,7 @@ replaces: TIP-18 The account is the central component of the IOTA 2.0 ledger that enables: - Issuance of blocks by burning Mana. -- Staking IOTA tokens for the validation of the network. +- Staking IOTA coins for the validation of the network. - Secure ownership of all digital assets on the ledger. It was originally defined as the Alias Output in [TIP-18](../TIP-0018/tip-0018.md). The Account Output represents a @@ -49,7 +49,7 @@ ledger. Accounts are the central component of the IOTA 2.0 ledger and are central to the goal of digital autonomy. In DLTs, one can distinguish between natural and synthetic actors. Natural actors are those that directly benefit from utilizing the ledger and thus have a natural incentive to participate, while synthetic actors do not and instead need to be -artificially incentivized to participate. Accounts enable natural actors to accumulate Mana from their IOTA tokens and +artificially incentivized to participate. Accounts enable natural actors to accumulate Mana from their IOTA coins and burn it to issue blocks, making the network feeless for token holders. Account owners can therefore be their own block issuers rather than having to depend on a synthetic actor to publish their block, thus contributing to digital autonomy. From 521ccb853928e98896c76137cdfa95621846f6d2 Mon Sep 17 00:00:00 2001 From: Philipp Gackstatter Date: Mon, 23 Oct 2023 12:35:51 +0100 Subject: [PATCH 100/140] Point proto params to TIP-49 --- tips/TIP-0042/tip-0042.md | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/tips/TIP-0042/tip-0042.md b/tips/TIP-0042/tip-0042.md index 6374ed72b..76933379d 100644 --- a/tips/TIP-0042/tip-0042.md +++ b/tips/TIP-0042/tip-0042.md @@ -72,10 +72,9 @@ ownership of digital assets. Data types and subschemas used throughout this TIP are defined in [TIP-21](../TIP-0021/tip-0021.md). -## Global Protocol Parameters +## Protocol Parameters -Global protocol parameters used throughout this TIP are defined in [TIP-22 (IOTA)](../TIP-0022/tip-0022.md) and -[TIP-32 (Shimmer)](../TIP-0032/tip-0032.md). +Protocol parameters used throughout this TIP are defined in [TIP-49](../TIP-0049/tip-0049.md). ## Transaction Payload From 62a9cee8a4533910251a8b22efde5860379d002f Mon Sep 17 00:00:00 2001 From: Philipp Gackstatter Date: Mon, 23 Oct 2023 12:36:09 +0100 Subject: [PATCH 101/140] Format Markdown --- tips/TIP-0042/tip-0042.md | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/tips/TIP-0042/tip-0042.md b/tips/TIP-0042/tip-0042.md index 76933379d..3fb9d1b02 100644 --- a/tips/TIP-0042/tip-0042.md +++ b/tips/TIP-0042/tip-0042.md @@ -28,7 +28,8 @@ strict extension of the functionality of the Alias Output. ## Summary of changes compared to TIP-18 - Add `Mana` field to the `Account`. -- Remove `Native Tokens` field. See [TIP-38 (Native Token Migration)](../TIP-0038/tip-0038.md#native-token-migration) for migration details. +- Remove `Native Tokens` field. See [TIP-38 (Native Token Migration)](../TIP-0038/tip-0038.md#native-token-migration) + for migration details. - Add _Block Issuer Feature_. - Mana owned by an account with a _Block Issuer Feature_ is bound to that account and can only be moved out with a delay. @@ -393,9 +394,12 @@ account is locked to that account. ### Storage Score -A Block Issuer Feature incurs additional computational cost in order to maintain the block issuer keys of an account and due to having to keep them in memory. Due to this, such a feature has an additional storage score offset. The offset of the feature is the sum of offsets of each contained key: +A Block Issuer Feature incurs additional computational cost in order to maintain the block issuer keys of an account and +due to having to keep them in memory. Due to this, such a feature has an additional storage score offset. The offset of +the feature is the sum of offsets of each contained key: -- If the contained key is of type `Ed25519 Public Key Block Issuer Key`, the offset is `Storage Score Offset Ed25519 Block Issuer Key`. +- If the contained key is of type `Ed25519 Public Key Block Issuer Key`, the offset is + `Storage Score Offset Ed25519 Block Issuer Key`. `Rent Parameters` are defined in [TIP-49](../TIP-0049/tip-0049.md). @@ -507,7 +511,9 @@ which they were selected to participate in the validator committee. ### Storage Score -A Staking Feature incurs additional computational cost in order to compute the total stake of a validator. Due to this, such a feature has an additional storage score offset, the `Rent Parameters::Storage Score Offset Staking Feature` as defined in [TIP-49](../TIP-0049/tip-0049.md). +A Staking Feature incurs additional computational cost in order to compute the total stake of a validator. Due to this, +such a feature has an additional storage score offset, the `Rent Parameters::Storage Score Offset Staking Feature` as +defined in [TIP-49](../TIP-0049/tip-0049.md). # Account Output From 6fa4b1fdd665bbf7dc892fdee72d85693906bd31 Mon Sep 17 00:00:00 2001 From: Philipp Gackstatter Date: Mon, 23 Oct 2023 13:00:22 +0100 Subject: [PATCH 102/140] Update authors --- tips/TIP-0042/tip-0042.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tips/TIP-0042/tip-0042.md b/tips/TIP-0042/tip-0042.md index 3fb9d1b02..dd7185ff1 100644 --- a/tips/TIP-0042/tip-0042.md +++ b/tips/TIP-0042/tip-0042.md @@ -4,7 +4,7 @@ title: IOTA 2.0 UTXO Accounts description: Defines the IOTA 2.0 Account used to issue blocks onto the network author: Philipp Gackstatter (@PhilippGackstatter) , Andrew Cullen (@cyberphysic4l) - , Levente Pap (@lzpap) + discussions-to: TODO status: Draft type: Standards From 5240329616ebbcf1027db7b2bd067b17ca6769f4 Mon Sep 17 00:00:00 2001 From: Philipp Gackstatter Date: Mon, 23 Oct 2023 18:06:29 +0100 Subject: [PATCH 103/140] Update title and description --- tips/TIP-0042/tip-0042.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tips/TIP-0042/tip-0042.md b/tips/TIP-0042/tip-0042.md index dd7185ff1..7de6ecf06 100644 --- a/tips/TIP-0042/tip-0042.md +++ b/tips/TIP-0042/tip-0042.md @@ -1,7 +1,7 @@ --- tip: 42 -title: IOTA 2.0 UTXO Accounts -description: Defines the IOTA 2.0 Account used to issue blocks onto the network +title: Account Output Type +description: Defines the IOTA 2.0 Account used to issue blocks onto the network and stake IOTA coins author: Philipp Gackstatter (@PhilippGackstatter) , Andrew Cullen (@cyberphysic4l) From 2c67e59dc98331412c645eae5fc04123d049408b Mon Sep 17 00:00:00 2001 From: Philipp Gackstatter Date: Fri, 27 Oct 2023 09:09:34 +0100 Subject: [PATCH 104/140] Add note on impl acc cr. addr storage score calc --- tips/TIP-0042/tip-0042.md | 1 + 1 file changed, 1 insertion(+) diff --git a/tips/TIP-0042/tip-0042.md b/tips/TIP-0042/tip-0042.md index 7de6ecf06..5a239b0b9 100644 --- a/tips/TIP-0042/tip-0042.md +++ b/tips/TIP-0042/tip-0042.md @@ -1130,6 +1130,7 @@ and thus also backed by an Ed25519 key pair. - The unlock condition is of type `Address Unlock Condition` and contains an `Ed25519 Address`. - `Features Count == 0`. - Let `Ed25519 Address Score` be the storage score of an `Ed25519 Address`. + - Note: This is currently `0` but is added here for completeness in case this value changes in the future. ### Creation Semantic Transaction Validation Rules From e7be0da8baf3bb778f4584d05457a2f815f3e011 Mon Sep 17 00:00:00 2001 From: Philipp Gackstatter Date: Tue, 31 Oct 2023 08:26:43 +0100 Subject: [PATCH 105/140] Add link to `Total Mana {In,Out}` --- tips/TIP-0042/tip-0042.md | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/tips/TIP-0042/tip-0042.md b/tips/TIP-0042/tip-0042.md index 5a239b0b9..ef3e5fda5 100644 --- a/tips/TIP-0042/tip-0042.md +++ b/tips/TIP-0042/tip-0042.md @@ -366,9 +366,11 @@ account is locked to that account. - `Expiry Slot >= Past Bounded Slot Index`. - When a Block Issuer Feature is present in an account output, the transaction that contains this output is valid, only if the following condition for Mana in the transaction holds for the account containing the feature: - `TotalManaIn - AccountIn >= TotalManaOut - AccountOut`, where: - - `TotalManaIn` is the sum of all Mana on the input side of the transaction. - - `TotalManaOut` is the sum of all Mana on the output side of the transaction. + `Total Mana In - AccountIn >= Total Mana Out - AccountOut`, where: + - `Total Mana In` is the sum of all Mana on the input side of the transaction. + - `Total Mana Out` is the sum of all Mana on the output side of the transaction. + - Both `Total Mana In` and `Total Mana Out` are calculated as defined in + [TIP-39 (Mana Transaction Validation Rules)](../TIP-0039/tip-0039.md#mana-transaction-validation-rules). - `AccountIn = AccountIn_potential + AccountIn_stored`. - `AccountOut = AccountOut_allotted + AccountOut_stored + AccountOut_locked`. - `AccountIn_potential` is the decayed potential Mana generated by the `Amount` of the account input. From 685315d4a42bee32784c644fb60586c903788c22 Mon Sep 17 00:00:00 2001 From: Philipp Gackstatter Date: Tue, 31 Oct 2023 14:45:19 +0100 Subject: [PATCH 106/140] Make var names consistent --- tips/TIP-0042/tip-0042.md | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/tips/TIP-0042/tip-0042.md b/tips/TIP-0042/tip-0042.md index ef3e5fda5..a97e3d9c2 100644 --- a/tips/TIP-0042/tip-0042.md +++ b/tips/TIP-0042/tip-0042.md @@ -366,18 +366,18 @@ account is locked to that account. - `Expiry Slot >= Past Bounded Slot Index`. - When a Block Issuer Feature is present in an account output, the transaction that contains this output is valid, only if the following condition for Mana in the transaction holds for the account containing the feature: - `Total Mana In - AccountIn >= Total Mana Out - AccountOut`, where: + `Total Mana In - Account In >= Total Mana Out - Account Out`, where: - `Total Mana In` is the sum of all Mana on the input side of the transaction. - `Total Mana Out` is the sum of all Mana on the output side of the transaction. - Both `Total Mana In` and `Total Mana Out` are calculated as defined in [TIP-39 (Mana Transaction Validation Rules)](../TIP-0039/tip-0039.md#mana-transaction-validation-rules). - - `AccountIn = AccountIn_potential + AccountIn_stored`. - - `AccountOut = AccountOut_allotted + AccountOut_stored + AccountOut_locked`. - - `AccountIn_potential` is the decayed potential Mana generated by the `Amount` of the account input. - - `AccountIn_stored` is the decayed stored Mana of the account input. - - `AccountOut_allotted` is the amount of Mana allotted to the account. - - `AccountOut_stored` is the amount of Mana stored in the account. - - `AccountOut_locked` is the amount of Mana locked into outputs for which each output satisfies all of the following + - `Account In = Account In_potential + Account In_stored`. + - `Account Out = Account Out_allotted + Account Out_stored + Account Out_locked`. + - `Account In_potential` is the decayed potential Mana generated by the `Amount` of the account input. + - `Account In_stored` is the decayed stored Mana of the account input. + - `Account Out_allotted` is the amount of Mana allotted to the account. + - `Account Out_stored` is the amount of Mana stored in the account. + - `Account Out_locked` is the amount of Mana locked into outputs for which each output satisfies all of the following conditions: - The output has a Timelock Unlock Condition containing a `Slot Index >= Past Bounded Slot Index + Maximum Committable Age`. From 3516304ac88b4a5521bd933fe153cd2db8d9ab5c Mon Sep 17 00:00:00 2001 From: Philipp Gackstatter Date: Tue, 31 Oct 2023 16:18:01 +0100 Subject: [PATCH 107/140] Remove State Index, Metadata & Ctrl + Governor --- tips/TIP-0042/tip-0042.md | 285 +++++--------------------------------- 1 file changed, 33 insertions(+), 252 deletions(-) diff --git a/tips/TIP-0042/tip-0042.md b/tips/TIP-0042/tip-0042.md index a97e3d9c2..3b2dac07e 100644 --- a/tips/TIP-0042/tip-0042.md +++ b/tips/TIP-0042/tip-0042.md @@ -81,129 +81,9 @@ Protocol parameters used throughout this TIP are defined in [TIP-49](../TIP-0049 [TIP-45](../TIP-0045/tip-0045.md) is the basis for output validation in this TIP. -# Unlock Conditions +# Account Locking & Unlocking -New output features that introduce unlocking conditions, that is, they define constraints on how the output can be -unlocked and spent, are grouped under the field Unlock Conditions. - -Each output **must not contain more than one unlock condition of each type** and not all unlock condition types are -supported for each output type. - -## State Controller Address Unlock Condition - -An unlock condition defined solely for Account Output. It is functionally equivalent to an Address Unlock -Condition, however there are additional transition constraints defined for the Account UTXO state machine that can -only be carried out by the `State Controller Address`, hence the distinct unlock condition type. - -
- State Controller Address Unlock Condition -
Defines the State Controller Address that owns this output. It can unlock the output with the proper Unlock in a transaction that state transitions the account output.
-
- - - - - - - - - - - - - - - -
- Name - - Type - - Description -
Unlock Condition Typeuint8Set to value 4 to denote a State Controller Address Unlock Condition.
Address oneOf -
- Ed25519 Address -
An Address derived from an Ed25519 Public Key. Defined in TIP-38 (Ed25519 Address).
-
-
- Account Address -
An Address derived from an Account ID which can be unlocked by unlocking the corresponding Account. Defined in TIP-38 (Account Address).
-
-
- NFT Address -
An Address derived from an NFT ID which can be unlocked by unlocking the corresponding NFT. Defined in TIP-38 (NFT Address).
-
-
- Multi Address -
Defines a Multi Address that consists of addresses with weights and a threshold value. The Multi Address can be unlocked if the cumulative weight of all unlocked addresses is equal to or exceeds the threshold. Defined in TIP-52 (Multi Address).
-
-
- Restricted Address -
An address that contains another address and allows for configuring its capabilities. Defined in TIP-50 (Restricted Address).
-
-
- -The additional constraints are defined in [Account Output Design](#account-output) section. - -## Governor Address Unlock Condition - -An unlock condition defined solely for Account Output. It is functionally equivalent to an Address Unlock -Condition, however there are additional transition constraints defined for the Account UTXO state machine that can -only be carried out by the `Governor Address`, hence the distinct unlock condition type. - -
- Governor Address Unlock Condition -
Defines the Governor Address that owns this output. It can unlock the output with the proper Unlock in a transaction that governance transitions the account output.
-
- - - - - - - - - - - - - - - -
- Name - - Type - - Description -
Unlock Condition Typeuint8Set to value 5 to denote a Governor Address Unlock Condition.
Address oneOf -
- Ed25519 Address -
An Address derived from an Ed25519 Public Key. Defined in TIP-38 (Ed25519 Address).
-
-
- Account Address -
An Address derived from an Account ID which can be unlocked by unlocking the corresponding Account. Defined in TIP-38 (Account Address).
-
-
- NFT Address -
An Address derived from an NFT ID which can be unlocked by unlocking the corresponding NFT. Defined in TIP-38 (NFT Address).
-
-
- Multi Address -
Defines a Multi Address that consists of addresses with weights and a threshold value. The Multi Address can be unlocked if the cumulative weight of all unlocked addresses is equal to or exceeds the threshold. Defined in TIP-52 (Multi Address).
-
-
- Restricted Address -
An address that contains another address and allows for configuring its capabilities. Defined in TIP-50 (Restricted Address).
-
-
- -The additional constraints are defined in [Account Output Design](#account-output) section. - -### Account Locking & Unlocking - -A transaction may consume a (non-account) output that belongs to an Account Address by state transitioning the +A transaction may consume an output that belongs to an Account Address by transitioning the account output with the matching `Account ID`. This serves the exact same purpose as providing a signature to unlock an output locked under a private key backed address, such as Ed25519 Addresses. @@ -259,11 +139,11 @@ always need to be one _Account Unlock_ referencing a greater index. #### Account Unlock Semantic Validation - The address of the unlocking condition of the input being unlocked must be an Account Address. -- The index `i` of the Account Unlock is the index of the input in the transaction that it unlocks. +- The index `i` of the _Account Unlock_ is the index of the input in the transaction that it unlocks. `Account Reference Unlock Index` must be < `i`. - `Account Reference Unlock Index` defines a previous input of the transaction and its unlock. This input must be an - Account Output with `Account ID` that refers to the Account Address being unlocked. -- The referenced Account Output must be unlocked for state transition. + _Account Output_ with `Account ID` that refers to the _Account Address_ being unlocked. +- The referenced _Account Output_ must be unlocked. # Features @@ -357,7 +237,7 @@ account is locked to that account. - When a _Block Issuer Feature_ is present in an account on the input or output side of a transaction, the transaction that contains this output is valid, if and only if: - A _Commitment Input_ is present. - - A _Block Issuance Credit Input_ is present whose `Account ID` equals that of the account being state transitioned. + - A _Block Issuance Credit Input_ is present whose `Account ID` equals that of the account being transitioned. - When a Block Issuer Feature is present in an account input, the transaction is invalid if that account has negative Block Issuance Credit, whose value is taken from the _Block Issuance Credit Input_. - When a Block Issuer Feature is present in an account output and it was not present in the account input, or the @@ -519,18 +399,15 @@ defined in [TIP-49](../TIP-0049/tip-0049.md). # Account Output -The Account Output is a specific implementation of a UTXO state machine. `Account ID`, the unique identifier of +The _Account Output_ is a specific implementation of a UTXO state machine. `Account ID`, the unique identifier of an instance of the deployed state machine, is generated deterministically by the protocol and is not allowed to change -in any future state transitions. +in any future transitions. -Account Output represents an account in the ledger with two control levels and a permanent Account -Address. The account owns other outputs that are locked under Account Address. The account keeps track of -state transitions (`State Index` counter), controlled foundries (`Foundry Counter`) and anchors the layer 2 state as -metadata into the UTXO ledger. +An _Account Output_ represents an account in the ledger with a permanent _Account Address_. The account owns other outputs that are locked under _Account Address_ and it keeps track of controlled foundries (`Foundry Counter`).
Account Output -
Describes an account in the ledger that can be controlled by the state and governance controllers.
+
Describes an account in the ledger which can be used to issue blocks or stake for validation.
@@ -564,16 +441,6 @@ metadata into the UTXO ledger. - - - - - - - - - - @@ -588,8 +455,8 @@ metadata into the UTXO ledger.
ByteArray[32] Unique identifier of the account, which is the BLAKE2b-256 hash of the Output ID that created it. Account Address = Account Address Type || Account ID.
State Indexuint32A counter that must increase by 1 every time the account is state transitioned.
State Metadata(uint16)ByteArrayMetadata that can only be changed by the state controller. A leading uint16 denotes its length.
Foundry Counter uint32Unlock Conditions atMostOneOfEach
- State Controller Address Unlock Condition -
Defines the State Controller Address that owns this output. It can unlock the output with the proper Unlock in a transaction that state transitions the account output. Defined in TIP-42 (State Controller Address Unlock Condition).
+ Address Unlock Condition +
Defines the Address that owns this output. It can unlock the output with the proper Unlock in a transaction. Defined in TIP-38 (Address Unlock Condition).
- - - - - - -
@@ -605,54 +472,7 @@ metadata into the UTXO ledger.
Unlock Condition Type uint8Set to value 4 to denote a State Controller Address Unlock Condition.
Address oneOf -
- Ed25519 Address -
An Address derived from an Ed25519 Public Key. Defined in TIP-38 (Ed25519 Address).
-
-
- Account Address -
An Address derived from an Account ID which can be unlocked by unlocking the corresponding Account. Defined in TIP-38 (Account Address).
-
-
- NFT Address -
An Address derived from an NFT ID which can be unlocked by unlocking the corresponding NFT. Defined in TIP-38 (NFT Address).
-
-
- Multi Address -
Defines a Multi Address that consists of addresses with weights and a threshold value. The Multi Address can be unlocked if the cumulative weight of all unlocked addresses is equal to or exceeds the threshold. Defined in TIP-52 (Multi Address).
-
-
- Restricted Address -
An address that contains another address and allows for configuring its capabilities. Defined in TIP-50 (Restricted Address).
-
-
-
-
- Governor Address Unlock Condition -
Defines the Governor Address that owns this output. It can unlock the output with the proper Unlock in a transaction that governance transitions the account output. Defined in TIP-42 (Governor Address Unlock Condition).
- - - - - - - - - - + @@ -965,15 +785,9 @@ metadata into the UTXO ledger. - `Amount` field must fulfill the [storage deposit requirements](../TIP-0047/tip-0047.md) and must not be `0`. - `Amount` field must be ≤ `Token Supply`. -- `Native Tokens Count` must not be greater than `Max Native Tokens Count`. -- `Native Tokens` must be lexicographically sorted based on `Token ID`. -- Each Native Token must be unique in the set of `Native Tokens` based on its `Token ID`. No duplicates are - allowed. -- `Amount` of any Native Token must not be `0`. -- It must hold true that `Unlock Conditions Count` = `2`. +- It must hold true that `Unlock Conditions Count = 1`. - `Unlock Condition Type` of an Unlock Condition must define one of the following types: - - State Controller Address Unlock Condition - - Governor Address Unlock Condition + - Address Unlock Condition - Unlock Conditions must be sorted in ascending order based on their `Unlock Condition Type`. - Syntactic validation of all present unlock conditions must pass. - It must hold true that `0` ≤ `Features Count` ≤ `4`. @@ -989,18 +803,14 @@ metadata into the UTXO ledger. - Features must be sorted in ascending order based on their `Feature Type` both in `Features` and `Immutable Features` fields. - Syntactic validation of all present features must pass. -- When `Account ID` is zeroed out, `State Index` and `Foundry Counter` must be `0`. -- `length(State Metadata)` must not be greater than `Max Metadata Length`. -- `Address` of State Controller Address Unlock Condition and `Address` of Governor Address Unlock - Condition must be different from the account address derived from `Account ID`. +- When `Account ID` is zeroed out `Foundry Counter` must be `0`. +- `Address` of _Address Unlock Condition_ must be different from the account address derived from `Account ID`. ## Additional Transaction Semantic Validation Rules - Explicit `Account ID`: `Account ID` is taken as the value of the `Account ID` field in the account output. -- Implicit `Account ID`: When an account output is consumed as an input in a transaction and `Account ID` field is - zeroed out while `State Index` and `Foundry Counter` are zero, take the BLAKE2b-256 hash of the `Output ID` of the - input as `Account ID`. Note that "implicit" here only refers to the account ID and has no relationship to the implicit - account concept. +- Implicit `Account ID`: When an account output is consumed as an input in a transaction and the `Account ID` field is + zeroed out, take the BLAKE2b-256 hash of the `Output ID` of the input as `Account ID`. Note that _implicit_ here only refers to the account ID and has no relationship to the implicit account concept. - For every non-zero explicit `Account ID` on the output side there must be a corresponding account on the input side. The corresponding account has the explicit or implicit `Account ID` equal to that of the account on the output side. @@ -1008,43 +818,19 @@ metadata into the UTXO ledger. Whenever an account output is consumed in a transaction, it means that the account is transitioned into its next state. The **current state** is defined as the **consumed account output**, while the **next state** is defined as the -**account output with the same explicit `AccountID` on the output side**. There are two types of transitions: -`state transition` and `governance transition`. - -- State transition: - - A state transition is identified by an incremented `State Index`. - - The `State Index` must be incremented by 1. - - The unlock must correspond to the `Address` of State Controller Address Unlock Condition. - - State transition can only change the following fields in the next state: - - `Amount`, - - `Native Tokens`, - - `State Index`, - - `State Metadata`, - - `Foundry Counter`, - - `Sender Feature` in `Features` and - - `Staking Feature` in `Features`. - - `Foundry Counter` field must increase by the number of foundry outputs created in the transaction that map to - `Account ID`. The `Serial Number` fields of the created foundries must be the set of natural numbers that cover the - open-ended interval between the previous and next values of the `Foundry Counter` field in the account output. - - The created foundry outputs must be sorted in the list of outputs by their `Serial Number`. Note, that any foundry - that maps to `Account ID` and has a `Serial Number` that is less or equal to the `Foundry Counter` of the input - account is ignored when it comes to sorting. - - Newly created foundries in the transaction that map to different accounts can be interleaved when it comes to - sorting. -- Governance transition: - - A governance transition is identified by an unchanged `State Index` in next state. If there is no account output on - the output side with a corresponding explicit `Account ID`, the account is being destroyed. The next state is the - empty state. - - The unlock must correspond to the `Address` of Governor Address Unlock Condition. - - Governance transition must only change the following fields: - - `Address` of State Controller Address Unlock Condition, - - `Address` of Governor Address Unlock Condition, - - `Metadata Feature`, `Sender Feature`, `Block Issuer Feature` in `Features`. - - The `Metadata Feature` is optional, the governor can put additional info about the chain here, for example chain - name, fee structure, supported VMs, list of access nodes, etc., anything that helps clients to fetch info (i.e. - account balances) about the layer 2 network. -- When a consumed account output has Features defined in `Immutable Features` and a corresponding account output - on the output side, `Immutable Features` is not allowed to change. +**account output with the same explicit `AccountID` on the output side**. + +A transaction that transitions an account is only valid if all of the following conditions hold: + +- `Foundry Counter` field must increase by the number of foundry outputs created in the transaction that map to + `Account ID`. The `Serial Number` fields of the created foundries must be the set of natural numbers that cover the + open-ended interval between the previous and next values of the `Foundry Counter` field in the account output. +- The created foundry outputs must be sorted in the list of outputs by their `Serial Number`. Note, that any foundry + that maps to `Account ID` and has a `Serial Number` that is less or equal to the `Foundry Counter` of the input + account is ignored when it comes to sorting. +- Newly created foundries in the transaction that map to different accounts can be interleaved when it comes to sorting. +- When a consumed account output has _Features_ defined in `Immutable Features` and a corresponding account output on + the output side, `Immutable Features` is not allowed to change. ### Created Outputs @@ -1053,10 +839,6 @@ The **current state** is defined as the **consumed account output**, while the * ### Notes -- Governor Address Unlock Condition field is made mandatory for now to help formal verification. When the same - entity is defined for state and governance controllers, the output is self governed. Later, for compression reasons, - it is possible to make the governance controller optional and define a self-governed account as one that does not have - the governance Governor Address Unlock Condition set. - Indexers and node plugins shall map the account address of the output derived with `Account ID` to the regular address -> output mapping table, so that given an Account Address, its most recent unspent account output can be retrieved. @@ -1120,8 +902,7 @@ and thus also backed by an Ed25519 key pair. - Let `Account Output Score` be the storage score of an Account Output which fulfills the following conditions: - `Native Tokens Count == 0`. - `State Metadata` must be empty. - - `State Controller Address Unlock Condition` and `Governor Address Unlock Condition` must contain an _Ed25519 - Address_. + - `Address Unlock Condition` must contain an _Ed25519 Address_. - `Features Count == 1`. - A _Block Issuer Feature_ must be present with `Block Issuer Keys Count == 1` and a block issuer key of type _Block Issuer Key Ed25519_. From f7cc7d9915d279fd971f99867df857ab19a62c5c Mon Sep 17 00:00:00 2001 From: Philipp Gackstatter Date: Thu, 2 Nov 2023 16:57:41 +0100 Subject: [PATCH 108/140] Add `Anchor Address` in `Account Output` --- tips/TIP-0042/tip-0042.md | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/tips/TIP-0042/tip-0042.md b/tips/TIP-0042/tip-0042.md index 3b2dac07e..3672bed4f 100644 --- a/tips/TIP-0042/tip-0042.md +++ b/tips/TIP-0042/tip-0042.md @@ -489,6 +489,10 @@ An _Account Output_ represents an account in the ledger with a permanent _Accoun NFT Address
An Address derived from an NFT ID which can be unlocked by unlocking the corresponding NFT. Defined in TIP-38 (NFT Address).
+
+ Anchor Address +
An Address derived from an Anchor ID which can be unlocked by unlocking the corresponding Anchor. Defined in TIP-38 (Anchor Address).
+
Multi Address
Defines a Multi Address that consists of addresses with weights and a threshold value. The Multi Address can be unlocked if the cumulative weight of all unlocked addresses is equal to or exceeds the threshold. Defined in TIP-52 (Multi Address).
@@ -546,6 +550,10 @@ An _Account Output_ represents an account in the ledger with a permanent _Accoun NFT Address
An Address derived from an NFT ID which can be unlocked by unlocking the corresponding NFT. Defined in TIP-38 (NFT Address).
+
+ Anchor Address +
An Address derived from an Anchor ID which can be unlocked by unlocking the corresponding Anchor. Defined in TIP-38 (Anchor Address).
+
Multi Address
Defines a Multi Address that consists of addresses with weights and a threshold value. The Multi Address can be unlocked if the cumulative weight of all unlocked addresses is equal to or exceeds the threshold. Defined in TIP-52 (Multi Address).
@@ -736,6 +744,10 @@ An _Account Output_ represents an account in the ledger with a permanent _Accoun NFT Address
An Address derived from an NFT ID which can be unlocked by unlocking the corresponding NFT. Defined in TIP-38 (NFT Address).
+
+ Anchor Address +
An Address derived from an Anchor ID which can be unlocked by unlocking the corresponding Anchor. Defined in TIP-38 (Anchor Address).
+
Multi Address
Defines a Multi Address that consists of addresses with weights and a threshold value. The Multi Address can be unlocked if the cumulative weight of all unlocked addresses is equal to or exceeds the threshold. Defined in TIP-52 (Multi Address).
From 1e53077cd3834ed994e98fbc781d0144250e6a66 Mon Sep 17 00:00:00 2001 From: Philipp Gackstatter Date: Thu, 2 Nov 2023 17:02:27 +0100 Subject: [PATCH 109/140] Update Implicit Acc Creation Addr type prefix --- tips/TIP-0042/tip-0042.md | 42 +++++++++++++++++++++++---------------- 1 file changed, 25 insertions(+), 17 deletions(-) diff --git a/tips/TIP-0042/tip-0042.md b/tips/TIP-0042/tip-0042.md index 3672bed4f..00f909464 100644 --- a/tips/TIP-0042/tip-0042.md +++ b/tips/TIP-0042/tip-0042.md @@ -880,24 +880,32 @@ account from, without having to rely on a third party, the barrier to entry for The _Implicit Account Creation Address_ is defined as follows: +
+ Implicit Account Creation Address +
Defines an address on which an Implicit Account is created when it receives a Basic Output.
+
- Name - - Type - - Description -
Unlock Condition Typeuint8Set to value 5 to denote a Governor Address Unlock Condition.Set to value 0 to denote an Address Unlock Condition.
Address oneOf
- - - - - - - - - - - - - - - + + + + + + + + + + + + + + +
NameTypeDescription
Address Typeuint8 - Set to value 24 to denote an Implicit Account Creation Address. -
PubKeyHashByteArray[32]The raw bytes of the Implicit Account Creation Address which is the BLAKE2b-256 hash of the Ed25519 public key.
+ Name + + Type + + Description +
Address Typeuint8Set to value 32 to denote an Implicit Account Creation Address.
PubKeyHashByteArray[32]The raw bytes of the Implicit Account Creation Address which is the BLAKE2b-256 hash of the Ed25519 public key.
An _Implicit Account Creation Address_ is structurally the same as an _Ed25519 Address_, except for the _Address Type_, From c0b1ecf5692a14078fa2aca3c979b0dae04df04f Mon Sep 17 00:00:00 2001 From: Philipp Gackstatter Date: Thu, 2 Nov 2023 17:05:21 +0100 Subject: [PATCH 110/140] Remove non-existant link to block issuer key --- tips/TIP-0042/tip-0042.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tips/TIP-0042/tip-0042.md b/tips/TIP-0042/tip-0042.md index 00f909464..b485b8f9d 100644 --- a/tips/TIP-0042/tip-0042.md +++ b/tips/TIP-0042/tip-0042.md @@ -191,7 +191,7 @@ account is locked to that account.
Ed25519 Public Key Block Issuer Key -
A Block Issuer Key backed by an Ed25519 Public Key. Defined in TIP-42 (Ed25519 Public Key Block Issuer Key).
+
A Block Issuer Key backed by an Ed25519 Public Key.
- + @@ -676,7 +708,7 @@ outputs that are locked under _Account Address_ and it keeps track of controlled - + @@ -763,7 +795,7 @@ outputs that are locked under _Account Address_ and it keeps track of controlled
Metadata Feature -
Defines metadata (arbitrary binary data) that will be stored in the output. Defined in TIP-38 (Metadata Feature).
+
Defines a map of key-value pairs that is stored in the output. Defined in TIP-38 (Metadata Feature).
@@ -628,7 +628,7 @@ An _Account Output_ represents an account in the ledger with a permanent _Accoun
Ed25519 Public Key Block Issuer Key -
A Block Issuer Key backed by an Ed25519 Public Key. Defined in TIP-42 (Ed25519 Public Key Block Issuer Key).
+
A Block Issuer Key backed by an Ed25519 Public Key.
- + @@ -320,7 +320,7 @@ which they were selected to participate in the validator committee. - + @@ -569,7 +569,7 @@ outputs that are locked under _Account Address_ and it keeps track of controlled
Metadata Feature -
Defines metadata (arbitrary binary data) that will be stored in the output. Defined in TIP-38 (Metadata Feature).
+
Defines a map of key-value pairs that is stored in the output. Defined in TIP-38 (Metadata Feature).
From 7e8ca399e52c8b91f88653d62aed49488fbf7cc5 Mon Sep 17 00:00:00 2001 From: Philipp Gackstatter Date: Fri, 3 Nov 2023 10:33:01 +0100 Subject: [PATCH 111/140] Add address type -> bech32 encoding table --- tips/TIP-0042/tip-0042.md | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/tips/TIP-0042/tip-0042.md b/tips/TIP-0042/tip-0042.md index b485b8f9d..edf13d254 100644 --- a/tips/TIP-0042/tip-0042.md +++ b/tips/TIP-0042/tip-0042.md @@ -878,7 +878,13 @@ Account Creation Address_ was derived. Thus, since implicit accounts are much easier to create than a regular account, and are sufficient to create a full account from, without having to rely on a third party, the barrier to entry for the network is lowered. -The _Implicit Account Creation Address_ is defined as follows: +The following table shows the mapping from the address type of the **first byte** to the address type: + +| Address | Type Byte as `uint8` | Bech32 Encoded | +| ------------- | -------------------- | -------------- | +| Implicit Account Creation Address | 32 | iota1**y**... | + +The following table shows the serialization of an _Implicit Account Creation Address_:
Implicit Account Creation Address From a552cdc23dac6fae1722a412d4d7422996ac3020 Mon Sep 17 00:00:00 2001 From: Philipp Gackstatter Date: Fri, 3 Nov 2023 10:43:11 +0100 Subject: [PATCH 112/140] Format markdown --- tips/TIP-0042/tip-0042.md | 22 ++++++++++++---------- 1 file changed, 12 insertions(+), 10 deletions(-) diff --git a/tips/TIP-0042/tip-0042.md b/tips/TIP-0042/tip-0042.md index edf13d254..7737e358d 100644 --- a/tips/TIP-0042/tip-0042.md +++ b/tips/TIP-0042/tip-0042.md @@ -83,9 +83,9 @@ Protocol parameters used throughout this TIP are defined in [TIP-49](../TIP-0049 # Account Locking & Unlocking -A transaction may consume an output that belongs to an Account Address by transitioning the -account output with the matching `Account ID`. This serves the exact same purpose as providing a signature to unlock an -output locked under a private key backed address, such as Ed25519 Addresses. +A transaction may consume an output that belongs to an Account Address by transitioning the account output with +the matching `Account ID`. This serves the exact same purpose as providing a signature to unlock an output locked under +a private key backed address, such as Ed25519 Addresses. On protocol level, account unlocking is done using a new unlock type, called **Account Unlock**. @@ -399,11 +399,12 @@ defined in [TIP-49](../TIP-0049/tip-0049.md). # Account Output -The _Account Output_ is a specific implementation of a UTXO state machine. `Account ID`, the unique identifier of -an instance of the deployed state machine, is generated deterministically by the protocol and is not allowed to change -in any future transitions. +The _Account Output_ is a specific implementation of a UTXO state machine. `Account ID`, the unique identifier of an +instance of the deployed state machine, is generated deterministically by the protocol and is not allowed to change in +any future transitions. -An _Account Output_ represents an account in the ledger with a permanent _Account Address_. The account owns other outputs that are locked under _Account Address_ and it keeps track of controlled foundries (`Foundry Counter`). +An _Account Output_ represents an account in the ledger with a permanent _Account Address_. The account owns other +outputs that are locked under _Account Address_ and it keeps track of controlled foundries (`Foundry Counter`).
Account Output @@ -822,7 +823,8 @@ An _Account Output_ represents an account in the ledger with a permanent _Accoun - Explicit `Account ID`: `Account ID` is taken as the value of the `Account ID` field in the account output. - Implicit `Account ID`: When an account output is consumed as an input in a transaction and the `Account ID` field is - zeroed out, take the BLAKE2b-256 hash of the `Output ID` of the input as `Account ID`. Note that _implicit_ here only refers to the account ID and has no relationship to the implicit account concept. + zeroed out, take the BLAKE2b-256 hash of the `Output ID` of the input as `Account ID`. Note that _implicit_ here only + refers to the account ID and has no relationship to the implicit account concept. - For every non-zero explicit `Account ID` on the output side there must be a corresponding account on the input side. The corresponding account has the explicit or implicit `Account ID` equal to that of the account on the output side. @@ -880,8 +882,8 @@ account from, without having to rely on a third party, the barrier to entry for The following table shows the mapping from the address type of the **first byte** to the address type: -| Address | Type Byte as `uint8` | Bech32 Encoded | -| ------------- | -------------------- | -------------- | +| Address | Type Byte as `uint8` | Bech32 Encoded | +| --------------------------------- | -------------------- | -------------- | | Implicit Account Creation Address | 32 | iota1**y**... | The following table shows the serialization of an _Implicit Account Creation Address_: From 77f06c13decc42a267587301447333fb3cbee2de Mon Sep 17 00:00:00 2001 From: Philipp Gackstatter Date: Fri, 3 Nov 2023 11:12:21 +0100 Subject: [PATCH 113/140] Add Can destroy Account Outputs tx cap flag rule --- tips/TIP-0042/tip-0042.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/tips/TIP-0042/tip-0042.md b/tips/TIP-0042/tip-0042.md index 7737e358d..50266babe 100644 --- a/tips/TIP-0042/tip-0042.md +++ b/tips/TIP-0042/tip-0042.md @@ -845,6 +845,9 @@ A transaction that transitions an account is only valid if all of the following - Newly created foundries in the transaction that map to different accounts can be interleaved when it comes to sorting. - When a consumed account output has _Features_ defined in `Immutable Features` and a corresponding account output on the output side, `Immutable Features` is not allowed to change. +- If there is no corresponding Account Output with the same _Account ID_ on the output side, the Account is being + destroyed. The transaction is invalid if an Account Output is burned and the _Can destroy Account Outputs_ flag in the + _Transaction Capabilities_ is **unset**. ### Created Outputs From 40fa0d8e35d3f0b6e239638f3ebe8ced6c55051d Mon Sep 17 00:00:00 2001 From: Philipp Gackstatter Date: Wed, 8 Nov 2023 13:41:31 +0100 Subject: [PATCH 114/140] Remove `Amount <= Token Supply` check --- tips/TIP-0042/tip-0042.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tips/TIP-0042/tip-0042.md b/tips/TIP-0042/tip-0042.md index 50266babe..dc49b9db7 100644 --- a/tips/TIP-0042/tip-0042.md +++ b/tips/TIP-0042/tip-0042.md @@ -796,8 +796,8 @@ outputs that are locked under _Account Address_ and it keeps track of controlled ### Output Syntactic Validation -- `Amount` field must fulfill the [storage deposit requirements](../TIP-0047/tip-0047.md) and must not be `0`. -- `Amount` field must be ≤ `Token Supply`. +- `Amount` field must not be `0`. +- `Amount` field must fulfill the [storage deposit requirements](../TIP-0047/tip-0047.md). - It must hold true that `Unlock Conditions Count = 1`. - `Unlock Condition Type` of an Unlock Condition must define one of the following types: - Address Unlock Condition From 2a3084665c1b14b690d3dbff7bab6c4b926fee75 Mon Sep 17 00:00:00 2001 From: Philipp Gackstatter Date: Wed, 8 Nov 2023 15:43:18 +0100 Subject: [PATCH 115/140] Remove `Amount` rules (moved to TIP-45) --- tips/TIP-0042/tip-0042.md | 2 -- 1 file changed, 2 deletions(-) diff --git a/tips/TIP-0042/tip-0042.md b/tips/TIP-0042/tip-0042.md index dc49b9db7..bb28bf17e 100644 --- a/tips/TIP-0042/tip-0042.md +++ b/tips/TIP-0042/tip-0042.md @@ -796,8 +796,6 @@ outputs that are locked under _Account Address_ and it keeps track of controlled ### Output Syntactic Validation -- `Amount` field must not be `0`. -- `Amount` field must fulfill the [storage deposit requirements](../TIP-0047/tip-0047.md). - It must hold true that `Unlock Conditions Count = 1`. - `Unlock Condition Type` of an Unlock Condition must define one of the following types: - Address Unlock Condition From 1f6c41952668cf17fbdea79985bbf0c67761fe13 Mon Sep 17 00:00:00 2001 From: Philipp Gackstatter Date: Thu, 9 Nov 2023 10:24:05 +0100 Subject: [PATCH 116/140] Remove non-existent fields in storage score calc --- tips/TIP-0042/tip-0042.md | 3 --- 1 file changed, 3 deletions(-) diff --git a/tips/TIP-0042/tip-0042.md b/tips/TIP-0042/tip-0042.md index bb28bf17e..41af7c831 100644 --- a/tips/TIP-0042/tip-0042.md +++ b/tips/TIP-0042/tip-0042.md @@ -929,15 +929,12 @@ and thus also backed by an Ed25519 key pair. - Let `Storage Score Offset Implicit Account Creation Address` be `Account Output Score - Basic Output Score + Ed25519 Address Score`, where: - Let `Account Output Score` be the storage score of an Account Output which fulfills the following conditions: - - `Native Tokens Count == 0`. - - `State Metadata` must be empty. - `Address Unlock Condition` must contain an _Ed25519 Address_. - `Features Count == 1`. - A _Block Issuer Feature_ must be present with `Block Issuer Keys Count == 1` and a block issuer key of type _Block Issuer Key Ed25519_. - `Immutable Features Count == 0`. - Let `Basic Output Score` be the storage score of a Basic Output which fulfills the following conditions: - - `Native Tokens Count == 0`. - `Unlock Conditions Count == 1`. - The unlock condition is of type `Address Unlock Condition` and contains an `Ed25519 Address`. - `Features Count == 0`. From 78adbb4c8a10f44f1f4cecb720836321a0e86370 Mon Sep 17 00:00:00 2001 From: Philipp Gackstatter Date: Fri, 10 Nov 2023 10:41:23 +0100 Subject: [PATCH 117/140] Features in implicit accounts, mk rules syntactic --- tips/TIP-0042/tip-0042.md | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/tips/TIP-0042/tip-0042.md b/tips/TIP-0042/tip-0042.md index 41af7c831..baeb955ce 100644 --- a/tips/TIP-0042/tip-0042.md +++ b/tips/TIP-0042/tip-0042.md @@ -941,7 +941,7 @@ and thus also backed by an Ed25519 key pair. - Let `Ed25519 Address Score` be the storage score of an `Ed25519 Address`. - Note: This is currently `0` but is added here for completeness in case this value changes in the future. -### Creation Semantic Transaction Validation Rules +### Creation Syntactic Transaction Validation Rules To create an implicit account, a Basic Output is created on the output side of a transaction and the `Address` in the `Address Unlock Condition` is set to an address of type _Implicit Account Creation Address_. @@ -951,8 +951,6 @@ To create an implicit account, a Basic Output is created on the output side of a - The `Implicit Account` is of type `Basic Output`. - The `Implicit Account`'s `Unlock Conditions Count == 1`. - The unlock condition on the `Implicit Account` is of type `Address Unlock Condition`. - - The `Implicit Account`'s `Native Tokens Count == 0`. - - The `Implicit Account`'s `Features Count == 0`. ### Conversion Semantic Transaction Validation Rules From e4871b668bb15b43c4c2e432decaebc4aa15d04b Mon Sep 17 00:00:00 2001 From: Philipp Gackstatter Date: Fri, 10 Nov 2023 11:12:36 +0100 Subject: [PATCH 118/140] Add rationale for implicit account features --- tips/TIP-0042/tip-0042.md | 29 ++++++++++++++++++++++++++++- 1 file changed, 28 insertions(+), 1 deletion(-) diff --git a/tips/TIP-0042/tip-0042.md b/tips/TIP-0042/tip-0042.md index baeb955ce..7cfafb662 100644 --- a/tips/TIP-0042/tip-0042.md +++ b/tips/TIP-0042/tip-0042.md @@ -1051,7 +1051,34 @@ have implications for address validity. Moreover, the implicit account creation limited context, i.e. within an Address Unlock Condition in a Basic Output. These reasons warrant a separate address type. -TODO: Describe utility of max `uint32` values for `Expiry Slot` and `End Epoch`. +### Allowed Unlock Conditions and Features + +Features in implicit accounts are allowed to enable more seamless implicit account creation. The more permutations of +Unlock Conditions and Features are allowed in Implicit Accounts, the more seamless implicit account creation becomes. +None of the Basic Output features are problematic in implicit accounts, hence they are allowed. + +On the other hand, Storage Deposit Return, Timelock and Expiration Unlock Conditions are not useful for implicit account +creation, so they are disallowed: + +- Storage Deposit Return: Having to return the funds on an implicit account to the sender means the full account that + needs to be transitioned to, must be funded by other means. In a typical onboarding scenario these funds do not exist, + so SDRUC would only make it more complicated to create the full account. +- Timelock: Would be harmless, but timelocks are not permitted on full accounts either. It would be odd to be able to + use the implicit account to issue blocks (because the accounts ledger does not respect the timelock) but not be able + to do the implicit account conversion until the timelock expires. +- Expiration: To fulfil syntactic rules, the `Return Address` would not be an implicit account creation address, but + some other regular address. Then for the `Address`, the Basic Output would be an implicit account, but for the + `Return Address` it would be a regular output, which is very undesirable behavior, since the `Return Address` would + not have to respect the account-locked mana rules, which would open an attack vector. + +## Expiry Slot and End Epoch + +One recurring pattern that applies to Staking and Block Issuer Features is the use of the maximum value of slot or epoch +indices. The max value can be used to express that such features do not have an expiration set, applying to the +`End Epoch` and `Expiry Slot`, respectively. + +Typically, one would want to set these features to not expire and only reduce the value to the closest possible one, +once removal of the feature is desired. # Copyright From 073d807e1d47b563359833bce53fbbca713a9160 Mon Sep 17 00:00:00 2001 From: Philipp Gackstatter Date: Mon, 20 Nov 2023 12:48:57 +0100 Subject: [PATCH 119/140] Update feat type prefixes, replace metadata feat --- tips/TIP-0042/tip-0042.md | 88 +++++++++++++++++++++++++++++++++------ 1 file changed, 76 insertions(+), 12 deletions(-) diff --git a/tips/TIP-0042/tip-0042.md b/tips/TIP-0042/tip-0042.md index 7cfafb662..98c490641 100644 --- a/tips/TIP-0042/tip-0042.md +++ b/tips/TIP-0042/tip-0042.md @@ -174,7 +174,7 @@ account is locked to that account.
Feature Type uint8Set to value 5 to denote a Block Issuer Feature.Set to value 6 to denote a Block Issuer Feature.
Expiry Slot
Feature Type uint8Set to value 6 to denote a Staking Feature.Set to value 7 to denote a Staking Feature.
Staked Amount
- - - + + + + + + +
@@ -588,9 +588,41 @@ outputs that are locked under _Account Address_ and it keeps track of controlled Set to value 2 to denote a Metadata Feature.
Data(uint16)ByteArrayBinary data. A leading uint16 denotes its length.Entries Countuint8The number of entries in the map.
Entries anyOf +
+ Metadata Entry +
A map entry consisting of a string key and an arbitrary byte value.
+ + + + + + + + + + + + + + + + +
+ Name + + Type + + Description +
Key(uint8)ByteArrayA string which may only consist of ASCII characters. A leading uint8 denotes its length.
Value(uint16)ByteArrayAn array of arbitrary binary data. A leading uint16 denotes its length.
+
+
@@ -612,7 +644,7 @@ outputs that are locked under _Account Address_ and it keeps track of controlled
Feature Type uint8Set to value 5 to denote a Block Issuer Feature.Set to value 6 to denote a Block Issuer Feature.
Expiry Slot
Feature Type uint8Set to value 6 to denote a Staking Feature.Set to value 7 to denote a Staking Feature.
Staked Amount
- - - + + + + + + +
@@ -782,9 +814,41 @@ outputs that are locked under _Account Address_ and it keeps track of controlled Set to value 2 to denote a Metadata Feature.
Data(uint16)ByteArrayBinary data. A leading uint16 denotes its length.Entries Countuint8The number of entries in the map.
Entries anyOf +
+ Metadata Entry +
A map entry consisting of a string key and an arbitrary byte value.
+ + + + + + + + + + + + + + + + +
+ Name + + Type + + Description +
Key(uint8)ByteArrayA string which may only consist of ASCII characters. A leading uint8 denotes its length.
Value(uint16)ByteArrayAn array of arbitrary binary data. A leading uint16 denotes its length.
+
+
From 2db67baa89c19ce186801b5074107a9c76719b67 Mon Sep 17 00:00:00 2001 From: Philipp Gackstatter Date: Mon, 20 Nov 2023 15:02:24 +0100 Subject: [PATCH 120/140] Make `Amount >= Staked Amount` check syntactic --- tips/TIP-0042/tip-0042.md | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/tips/TIP-0042/tip-0042.md b/tips/TIP-0042/tip-0042.md index 98c490641..1bbdbf3d9 100644 --- a/tips/TIP-0042/tip-0042.md +++ b/tips/TIP-0042/tip-0042.md @@ -220,7 +220,7 @@ account is locked to that account.
-### Additional syntactic transaction validation rule +### Additional Transaction Syntactic Validation Rules - The following conditions must all hold: - `Block Issuer Key Count >= 1`. @@ -230,7 +230,7 @@ account is locked to that account. - Each key in `Block Issuer Keys` must be lexicographically ordered based on the concatenation of its `Public Key Type` and `Public Key`. -### Additional semantic transaction validation rule +### Additional Transaction Semantic Validation Rules - Let `Past Bounded Slot Index` be given by `Commitment Index + Max Committable Age` where `Commitment Index` is the slot index of the commitment input. @@ -344,7 +344,11 @@ which they were selected to participate in the validator committee.
-### Additional semantic transaction validation rule +### Additional Transaction Syntactic Validation Rules + +- The `Amount` in the containing account output satisfies `Amount >= Staked Amount`. + +### Additional Transaction Semantic Validation Rules - Let `Future Bounded Epoch Index` be the epoch index corresponding to the slot index given by `Commitment Index + Min Committable Age` where `Commitment Index` is the slot index of the commitment input. @@ -359,14 +363,12 @@ which they were selected to participate in the validator committee. - When a _Staking Feature_ is present in an account output on the output side of a transaction and it was not present on the input side, the transaction that contains this output is valid, if and only if all of the following conditions hold: - - The `Amount` in the containing account output satisfies `Amount >= Staked Amount`. - `Start Epoch` must be set to `Past Bounded Epoch Index`. - `End Epoch` satisfies `End Epoch >= Past Bounded Epoch Index + Staking Unbonding Period`. - When a _Staking Feature_ is present in an account output on the input side of a transaction, the transaction that contains this input is valid, if and only if all of the following conditions hold: - If `Future Bounded Epoch Index <= End Epoch`, all of the following conditions must hold: - A _Staking Feature_ must be present on the corresponding account on the output side of the transaction. - - The `Amount` in the containing account output satisfies `Amount >= Staked Amount`. - The fields `Staked Amount`, `Start Epoch` and `Fixed Cost` on the feature on the input and the feature on the output side match. - One of the following conditions hold: @@ -384,7 +386,6 @@ which they were selected to participate in the validator committee. [TIP-40 (Validator Rewards)](../TIP-0040/tip-0040.md#validator-rewards). - All of the following conditions hold: - A _Staking Feature_ must be present on the corresponding account on the output side of the transaction. - - The `Amount` in the containing account output satisfies `Amount >= Staked Amount`. - `Start Epoch` is set to `Past Bounded Epoch Index`. - `End Epoch` satisfies `End Epoch >= Past Bounded Epoch Index + Staking Unbonding Period`. - A _Reward Input_ must be present whose `Index` references the account input. From c932091a784f924de69b46e7e696af3eb4f3e021 Mon Sep 17 00:00:00 2001 From: Philipp Gackstatter Date: Mon, 27 Nov 2023 10:24:42 +0100 Subject: [PATCH 121/140] Update tips/TIP-0042/tip-0042.md Co-authored-by: Thibault Martinez --- tips/TIP-0042/tip-0042.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tips/TIP-0042/tip-0042.md b/tips/TIP-0042/tip-0042.md index 1bbdbf3d9..c198b7b03 100644 --- a/tips/TIP-0042/tip-0042.md +++ b/tips/TIP-0042/tip-0042.md @@ -178,7 +178,7 @@ account is locked to that account.
Expiry Slotuint64uint32 The slot index at which the Block Issuer Feature expires and can be removed.
Block Issuer Keys anyOf
- Ed25519 Public Key Block Issuer Key + Ed25519 Public Key Hash Block Issuer Key
A Block Issuer Key backed by an Ed25519 Public Key.
@@ -211,12 +211,12 @@ locked to that account. - + - + - +
Block Issuer Key Type uint8Set to value 0 to denote an Ed25519 Public Key Block Issuer Key.Set to value 0 to denote an Ed25519 Public Key Hash Block Issuer Key.
Public KeyPubKeyHash ByteArray[32]The raw bytes of the Ed25519 public key.The raw bytes of the BLAKE2b-256 hash of the corresponding Ed25519 public key.
@@ -618,7 +618,7 @@ outputs that are locked under _Account Address_ and it keeps track of controlled
Key (uint8)ByteArrayA string which may only consist of ASCII characters. A leading uint8 denotes its length.A string which may only consist of printable ASCII characters. A leading uint8 denotes its length.
Value
Expiry Slotuint64uint32 The slot index at which the Block Issuer Feature expires and can be removed.
Block Issuer Keys anyOf
- Ed25519 Public Key Block Issuer Key + Ed25519 Public Key Hash Block Issuer Key
A Block Issuer Key backed by an Ed25519 Public Key.
@@ -682,12 +682,12 @@ outputs that are locked under _Account Address_ and it keeps track of controlled - + - + - +
Block Issuer Key Type uint8Set to value 0 to denote an Ed25519 Public Key Block Issuer Key.Set to value 0 to denote an Ed25519 Public Key Hash Block Issuer Key.
Public KeyPubKeyHash ByteArray[32]The raw bytes of the Ed25519 public key.The raw bytes of the BLAKE2b-256 hash of the corresponding Ed25519 public key.
@@ -844,7 +844,7 @@ outputs that are locked under _Account Address_ and it keeps track of controlled
Key (uint8)ByteArrayA string which may only consist of ASCII characters. A leading uint8 denotes its length.A string which may only consist of printable ASCII characters. A leading uint8 denotes its length.
Value
- - - - - - - - - - - - - - - -
- Name - - Type - - Description -
Block Issuer Key Typeuint8Set to value 1 to denote an Ed25519 Public Key Hash Block Issuer Key.
PubKeyHashByteArray[32]The raw bytes of the Implicit Account Creation Address which is the BLAKE2b-256 hash of the Ed25519 public key.
+An implicit account can issue blocks by using the `PubKeyHash` of the _Implicit Account Creation Address_ itself as an +_Ed25519 Public Key Hash Block Issuer Key_. Therefore, the block's signature must contain the public key from which the +`PubKeyHash` was derived from and the signature must be computed from the corresponding private key. # Migration From 15ccddcbfd3e36a2931294bcc53f45625b1fba2e Mon Sep 17 00:00:00 2001 From: Philipp Gackstatter Date: Wed, 24 Jan 2024 15:30:55 +0100 Subject: [PATCH 127/140] Update Block Issuer Feature description --- tips/TIP-0042/tip-0042.md | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/tips/TIP-0042/tip-0042.md b/tips/TIP-0042/tip-0042.md index b63cf1e72..152ecc07d 100644 --- a/tips/TIP-0042/tip-0042.md +++ b/tips/TIP-0042/tip-0042.md @@ -150,14 +150,15 @@ always need to be one _Account Unlock_ referencing a greater index. ## Block Issuer Feature The presence of a _Block Issuer Feature_ on an account signals that this account can issue blocks - it is a _block -issuer account_. This feature defines the public keys with which signatures on blocks can be verified. A block issued -from this account with a verified signature will burn Mana from the account's Block Issuance Credit (BIC) balance. If -the balance becomes negative, the account is locked, meaning its output cannot be spent and it can no longer be used to -issue blocks. Once locked, an account can only be unlocked by allotting enough Mana to the account's BIC balance for it -to become non-negative again. Because the account itself cannot issue such a transaction, the block containing the -alloting transaction must be issued by another account. The feature can only be removed with an expiration mechanism in -order to disincentivize malicious behavior when issuing blocks. Any Mana generated or stored by an issuer account is -locked to that account. +issuer account_. This feature defines the public keys or key hashes which must match the public keys or their hashes +provided in block signatures. A block issued from a block issuer account with a matching block issuer key and a verified +signature will cause Mana to be burned from the account's Block Issuance Credit (BIC) balance. If the balance becomes +negative, the account is locked, meaning its output cannot be spent and it can no longer be used to issue blocks. Once +locked, an account can only be unlocked by allotting enough Mana to the account's BIC balance for it to become +non-negative again. Because the account itself cannot issue such a transaction, the block containing the alloting +transaction must be issued by another account. The feature can only be removed with an expiration mechanism in order to +disincentivize malicious behavior when issuing blocks. Any Mana generated or stored by an issuer account is locked to +that account.
Block Issuer Feature From 96261ca2ffc50b5912cfe3db7459e9912d6d0cfc Mon Sep 17 00:00:00 2001 From: Philipp Gackstatter Date: Thu, 25 Jan 2024 09:51:52 +0100 Subject: [PATCH 128/140] Reword `Block Issuer Keys` comparison criteria --- tips/TIP-0042/tip-0042.md | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/tips/TIP-0042/tip-0042.md b/tips/TIP-0042/tip-0042.md index 152ecc07d..9ac06d006 100644 --- a/tips/TIP-0042/tip-0042.md +++ b/tips/TIP-0042/tip-0042.md @@ -230,10 +230,9 @@ that account. - The following conditions must all hold: - `Block Issuer Key Count >= 1`. - `Block Issuer Key Count <= 128`. - - Each key in `Block Issuer Keys` must be unique based on the concatenation of its `Public Key Type` and `Public Key`. - No duplicates are allowed. - - Each key in `Block Issuer Keys` must be lexicographically ordered based on the concatenation of its - `Public Key Type` and `Public Key`. + - The `Block Issuer Keys` must be lexically ordered and unique, both based on the following comparison criteria: + - `Block Issuer Key Type` as the first criteria for all Block Issuer Keys. + - `PubKeyHash` as the second criteria for _Ed25519 Public Key Hash Block Issuer Keys_. ### Additional Transaction Semantic Validation Rules From f103b6ae35613e7928677e201af176cada2f0f1c Mon Sep 17 00:00:00 2001 From: Philipp Gackstatter Date: Thu, 25 Jan 2024 09:53:41 +0100 Subject: [PATCH 129/140] Fix typo in Block Issuer Key*s* --- tips/TIP-0042/tip-0042.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tips/TIP-0042/tip-0042.md b/tips/TIP-0042/tip-0042.md index 9ac06d006..c276e12ff 100644 --- a/tips/TIP-0042/tip-0042.md +++ b/tips/TIP-0042/tip-0042.md @@ -228,8 +228,8 @@ that account. ### Additional Transaction Syntactic Validation Rules - The following conditions must all hold: - - `Block Issuer Key Count >= 1`. - - `Block Issuer Key Count <= 128`. + - `Block Issuer Keys Count >= 1`. + - `Block Issuer Keys Count <= 128`. - The `Block Issuer Keys` must be lexically ordered and unique, both based on the following comparison criteria: - `Block Issuer Key Type` as the first criteria for all Block Issuer Keys. - `PubKeyHash` as the second criteria for _Ed25519 Public Key Hash Block Issuer Keys_. From ddaadc1876dc656232bf6bb7833ab1e601f2219c Mon Sep 17 00:00:00 2001 From: Philipp Gackstatter Date: Thu, 25 Jan 2024 09:57:52 +0100 Subject: [PATCH 130/140] Update Block Issuer Feature description --- tips/TIP-0042/tip-0042.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/tips/TIP-0042/tip-0042.md b/tips/TIP-0042/tip-0042.md index c276e12ff..bab9b6e4a 100644 --- a/tips/TIP-0042/tip-0042.md +++ b/tips/TIP-0042/tip-0042.md @@ -162,7 +162,7 @@ that account.
Block Issuer Feature -
Contains the public keys used to verify block signatures.
+
Contains the keys with which the account can create block signatures.
@@ -215,7 +215,7 @@ that account. - + @@ -633,7 +633,7 @@ outputs that are locked under _Account Address_ and it keeps track of controlled
Block Issuer Feature -
Contains the public keys used to verify block signatures. Defined in TIP-42 (Block Issuer Feature).
+
Contains the keys with which the account can create block signatures. Defined in TIP-42 (Block Issuer Feature).
Set to value 0 to denote an Ed25519 Public Key Hash Block Issuer Key.
PubKeyHashPub Key Hash ByteArray[32] The raw bytes of the BLAKE2b-256 hash of the corresponding Ed25519 public key.
- + @@ -980,7 +980,7 @@ The following table shows the serialization of an _Implicit Account Creation Add - + From c05f675c67384a86c2e7a357ff21f7d4accaeb24 Mon Sep 17 00:00:00 2001 From: Philipp Gackstatter Date: Thu, 25 Jan 2024 10:02:31 +0100 Subject: [PATCH 131/140] Properly space `Pub Key Hash` --- tips/TIP-0042/tip-0042.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/tips/TIP-0042/tip-0042.md b/tips/TIP-0042/tip-0042.md index bab9b6e4a..e19979a9e 100644 --- a/tips/TIP-0042/tip-0042.md +++ b/tips/TIP-0042/tip-0042.md @@ -232,7 +232,7 @@ that account. - `Block Issuer Keys Count <= 128`. - The `Block Issuer Keys` must be lexically ordered and unique, both based on the following comparison criteria: - `Block Issuer Key Type` as the first criteria for all Block Issuer Keys. - - `PubKeyHash` as the second criteria for _Ed25519 Public Key Hash Block Issuer Keys_. + - `Pub Key Hash` as the second criteria for _Ed25519 Public Key Hash Block Issuer Keys_. ### Additional Transaction Semantic Validation Rules @@ -1043,9 +1043,9 @@ creation and block issuer feature transition. ### Implicit Account Block Issuance -An implicit account can issue blocks by using the `PubKeyHash` of the _Implicit Account Creation Address_ itself as an +An implicit account can issue blocks by using the `Pub Key Hash` of the _Implicit Account Creation Address_ itself as an _Ed25519 Public Key Hash Block Issuer Key_. Therefore, the block's signature must contain the public key from which the -`PubKeyHash` was derived from and the signature must be computed from the corresponding private key. +`Pub Key Hash` was derived from and the signature must be computed from the corresponding private key. # Migration From 419c9a34b745a02ff81500135fc5b98db28e3487 Mon Sep 17 00:00:00 2001 From: Philipp Gackstatter Date: Thu, 25 Jan 2024 12:03:37 +0100 Subject: [PATCH 132/140] Update test vector with pub key hash block iss key --- tips/TIP-0042/tip-0042.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/tips/TIP-0042/tip-0042.md b/tips/TIP-0042/tip-0042.md index e19979a9e..ff1269cde 100644 --- a/tips/TIP-0042/tip-0042.md +++ b/tips/TIP-0042/tip-0042.md @@ -1162,11 +1162,11 @@ Account Output (json-encoded): "blockIssuerKeys": [ { "type": 0, - "publicKey": "0x9e05a32eafedefd40298e24ad4f8c334580187f7e9afbd9da13b5ba4007dd1b5" + "pubKeyHash": "0x295409de79016133647d4078cb01618a4ba018eb74ff613138d8ff8dc05de73c" }, { "type": 0, - "publicKey": "0xa504844f7a0df2c5101d31696593b309040f8660d41035aba508f24c00668b21" + "pubKeyHash": "0x868f4c6ef7b5b1d55838cbfb8ae4f3a9776c53cdd3e3d33000094d72acab5a2f" } ] }, @@ -1192,7 +1192,7 @@ Account Output (json-encoded): Account Output (hex-encoded binary serialization): ``` -0x0100c2eb0b00000000402dd91300000000e8494fe353f99783d3771c78798e1e839e649310513770fc6dc974fe53cf1a8600000000010000ed1484f4d1f7d8c037087fed661dd92faccae1eed3c01182d6fdd6828cea144a030000ed1484f4d1f7d8c037087fed661dd92faccae1eed3c01182d6fdd6828cea144a067803000002009e05a32eafedefd40298e24ad4f8c334580187f7e9afbd9da13b5ba4007dd1b500a504844f7a0df2c5101d31696593b309040f8660d41035aba508f24c00668b210780d1f00800000000900100000000000019000000ffffffff01020104696f74610300322e30 +0x0100c2eb0b00000000402dd91300000000e8494fe353f99783d3771c78798e1e839e649310513770fc6dc974fe53cf1a8600000000010000ed1484f4d1f7d8c037087fed661dd92faccae1eed3c01182d6fdd6828cea144a030000ed1484f4d1f7d8c037087fed661dd92faccae1eed3c01182d6fdd6828cea144a06780300000200295409de79016133647d4078cb01618a4ba018eb74ff613138d8ff8dc05de73c00868f4c6ef7b5b1d55838cbfb8ae4f3a9776c53cdd3e3d33000094d72acab5a2f0780d1f00800000000900100000000000019000000ffffffff01020104696f74610300322e30 ``` Account Output Storage Score: `621`. From b1c8377d476590d554161d4d5c900488cedc7793 Mon Sep 17 00:00:00 2001 From: Philipp Gackstatter Date: Mon, 29 Jan 2024 14:37:34 +0100 Subject: [PATCH 133/140] Fix outdated Rent Params reference & typos --- tips/TIP-0042/tip-0042.md | 30 ++++++++++++++++-------------- 1 file changed, 16 insertions(+), 14 deletions(-) diff --git a/tips/TIP-0042/tip-0042.md b/tips/TIP-0042/tip-0042.md index ff1269cde..4103f9b6a 100644 --- a/tips/TIP-0042/tip-0042.md +++ b/tips/TIP-0042/tip-0042.md @@ -22,8 +22,8 @@ The account is the central component of the IOTA 2.0 ledger that enables: - Staking IOTA coins for the validation of the network. - Secure ownership of all digital assets on the ledger. -It was originally defined as the Alias Output in [TIP-18](../TIP-0018/tip-0018.md). The Account Output represents a -strict extension of the functionality of the Alias Output. +Its successor is the Alias Output, defined in [TIP-18](../TIP-0018/tip-0018.md). However, its functionality is +effectively split between the Account Output and the [Anchor Output](../TIP-0054/tip-0054.md). ## Summary of changes compared to TIP-18 @@ -155,7 +155,7 @@ provided in block signatures. A block issued from a block issuer account with a signature will cause Mana to be burned from the account's Block Issuance Credit (BIC) balance. If the balance becomes negative, the account is locked, meaning its output cannot be spent and it can no longer be used to issue blocks. Once locked, an account can only be unlocked by allotting enough Mana to the account's BIC balance for it to become -non-negative again. Because the account itself cannot issue such a transaction, the block containing the alloting +non-negative again. Because the account itself cannot issue such a transaction, the block containing the allotting transaction must be issued by another account. The feature can only be removed with an expiration mechanism in order to disincentivize malicious behavior when issuing blocks. Any Mana generated or stored by an issuer account is locked to that account. @@ -284,10 +284,10 @@ A Block Issuer Feature incurs additional computational cost in order to maintain due to having to keep them in memory. Due to this, such a feature has an additional storage score offset. The offset of the feature is the sum of offsets of each contained key: -- If the contained key is of type `Ed25519 Public Key Block Issuer Key`, the offset is - `Storage Score Offset Ed25519 Block Issuer Key`. +- If the contained key is of type `Ed25519 Public Key Hash Block Issuer Key`, the offset is + `Storage Score Parameters::Offset Ed25519 Block Issuer Key`. -`Rent Parameters` are defined in [TIP-49](../TIP-0049/tip-0049.md). +`Storage Score Parameters` are defined in [TIP-49](../TIP-0049/tip-0049.md). ## Staking Feature @@ -399,8 +399,8 @@ which they were selected to participate in the validator committee. ### Storage Score A Staking Feature incurs additional computational cost in order to compute the total stake of a validator. Due to this, -such a feature has an additional storage score offset, the `Rent Parameters::Storage Score Offset Staking Feature` as -defined in [TIP-49](../TIP-0049/tip-0049.md). +such a feature has an additional storage score offset, the `Storage Score Parameters::Offset Staking Feature` as defined +in [TIP-49](../TIP-0049/tip-0049.md). # Account Output @@ -1051,8 +1051,10 @@ _Ed25519 Public Key Hash Block Issuer Key_. Therefore, the block's signature mus ## Alias to Account Conversion -_Alias Outputs_ in Stardust-based networks are converted to _Account Outputs_. Account Outputs' BIC balance is set to -`0`. +TODO: Describe when Alias Outputs are converted to Accounts and Anchor Outputs, respectively. + +~~_Alias Outputs_ in Stardust-based networks are converted to _Account Outputs_. Account Outputs' BIC balance is set to +`0`.~~ ## Block Issuer Accounts @@ -1061,10 +1063,10 @@ these, a migration procedure is required so the network can be bootstrapped. Use Feature to an _Alias Output_ which is converted to an _Account Output_ with a Block Issuer Feature and the Metadata Feature is removed from the output. This transition is only done if all of the following conditions hold: -- The _Alias Output_'s `Amount` is at least `Rent Parameters::Storage Cost * Account Output Score`, with the latter - defined in [Implicit Account (Storage Score)](#storage-score-2), except that the `Block Issuer Keys Count` of the - output for the deposit calculation must be set to the value of the `Block Issuer Keys Count` read from the serialized - Block Issuer Feature in the to-be-converted _Alias Output_. +- The _Alias Output_'s `Amount` is at least `Storage Score Parameters::Storage Cost * Account Output Score`, with the + latter defined in [Implicit Account (Storage Score)](#storage-score-2), except that the `Block Issuer Keys Count` of + the output for the deposit calculation must be set to the value of the `Block Issuer Keys Count` read from the + serialized Block Issuer Feature in the to-be-converted _Alias Output_. - The serialized Block Issuer Feature is prefixed with the ascii-encoded string `BlockIssuerFeature`, which is `[0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x49, 0x73, 0x73, 0x75, 0x65, 0x72, 0x46, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65]` in hex encoding, expressed as a list in JSON. From 2a1e1a0191fad0451f6362245b6eb43476eab65b Mon Sep 17 00:00:00 2001 From: Philipp Gackstatter Date: Mon, 29 Jan 2024 16:36:32 +0100 Subject: [PATCH 134/140] Update tips/TIP-0042/tip-0042.md Co-authored-by: Thibault Martinez --- tips/TIP-0042/tip-0042.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tips/TIP-0042/tip-0042.md b/tips/TIP-0042/tip-0042.md index 4103f9b6a..47b6fc063 100644 --- a/tips/TIP-0042/tip-0042.md +++ b/tips/TIP-0042/tip-0042.md @@ -22,7 +22,7 @@ The account is the central component of the IOTA 2.0 ledger that enables: - Staking IOTA coins for the validation of the network. - Secure ownership of all digital assets on the ledger. -Its successor is the Alias Output, defined in [TIP-18](../TIP-0018/tip-0018.md). However, its functionality is +Its predecessor is the Alias Output, defined in [TIP-18](../TIP-0018/tip-0018.md). However, its functionality is effectively split between the Account Output and the [Anchor Output](../TIP-0054/tip-0054.md). ## Summary of changes compared to TIP-18 From 5c5f0140853d318bc121d5879022ea3e522ef82e Mon Sep 17 00:00:00 2001 From: Philipp Gackstatter Date: Fri, 2 Feb 2024 14:09:03 +0100 Subject: [PATCH 135/140] Describe account-bound Mana collateral mechanism --- tips/TIP-0042/tip-0042.md | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/tips/TIP-0042/tip-0042.md b/tips/TIP-0042/tip-0042.md index 4103f9b6a..61009ffd9 100644 --- a/tips/TIP-0042/tip-0042.md +++ b/tips/TIP-0042/tip-0042.md @@ -158,7 +158,11 @@ locked, an account can only be unlocked by allotting enough Mana to the account' non-negative again. Because the account itself cannot issue such a transaction, the block containing the allotting transaction must be issued by another account. The feature can only be removed with an expiration mechanism in order to disincentivize malicious behavior when issuing blocks. Any Mana generated or stored by an issuer account is locked to -that account. +that account and can only be transferred by moving it into an Output owned by that account with a sufficiently long +Timelock Unlock Condition. Once that expires, the Mana can be moved anywhere. This two-step process is needed such that +accounts with a large amount of Mana, who can issue a high number of blocks, do not overspend their BIC balance and move +the Mana out of the account before the account would be locked. The account-bound Mana is thus used as a collateral to +disincentivize account owners to overspend their BIC.
Block Issuer Feature From f42e625626fabbb00d93d76d902ce3cdb6056ba7 Mon Sep 17 00:00:00 2001 From: Philipp Gackstatter Date: Fri, 2 Feb 2024 14:15:01 +0100 Subject: [PATCH 136/140] Clarify negative BIC check --- tips/TIP-0042/tip-0042.md | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/tips/TIP-0042/tip-0042.md b/tips/TIP-0042/tip-0042.md index 61009ffd9..e6689a0bd 100644 --- a/tips/TIP-0042/tip-0042.md +++ b/tips/TIP-0042/tip-0042.md @@ -240,14 +240,16 @@ disincentivize account owners to overspend their BIC. ### Additional Transaction Semantic Validation Rules -- Let `Past Bounded Slot Index` be given by `Commitment Index + Max Committable Age` where `Commitment Index` is the - slot index of the commitment input. - When a _Block Issuer Feature_ is present in an account on the input or output side of a transaction, the transaction that contains this output is valid, if and only if: - A _Commitment Input_ is present. - A _Block Issuance Credit Input_ is present whose `Account ID` equals that of the account being transitioned. +- Let `Commitment Index` be the slot index of the _Commitment Input_. +- Let `Past Bounded Slot Index` be given by `Commitment Index + Max Committable Age`. - When a Block Issuer Feature is present in an account input, the transaction is invalid if that account has - negative Block Issuance Credit, whose value is taken from the _Block Issuance Credit Input_. + negative Block Issuance Credit. + - The BIC of the account is obtained by resolving the _Account ID_ in the _Block Issuance Credit Input_ to the + account's BIC balance at the time of the commitment identified by _Commitment ID_ from the _Commitment Input_. - When a Block Issuer Feature is present in an account output and it was not present in the account input, or the account output represents the initial state of its UTXO state machine, the transaction that contains the account output is valid, if the following condition holds: From d467f856794fd21aafafa4919405a163e6b52dea Mon Sep 17 00:00:00 2001 From: Philipp Gackstatter Date: Fri, 16 Feb 2024 13:57:53 +0800 Subject: [PATCH 137/140] Clarify the input side requirement --- tips/TIP-0042/tip-0042.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/tips/TIP-0042/tip-0042.md b/tips/TIP-0042/tip-0042.md index 3e53b96ff..b12a8f3df 100644 --- a/tips/TIP-0042/tip-0042.md +++ b/tips/TIP-0042/tip-0042.md @@ -370,9 +370,9 @@ which they were selected to participate in the validator committee. - When a _Staking Feature_ is present in an account output on the output side of a transaction, the transaction that contains this output is valid, if and only if all of the following conditions hold: - A _Block Issuer Feature_ must be present in the account. -- When a _Staking Feature_ is present in an account output on the output side of a transaction and it was not present on - the input side, the transaction that contains this output is valid, if and only if all of the following conditions - hold: +- When a _Staking Feature_ is present in an account output on the output side of a transaction and the feature was not + present on the input side, the transaction that contains this output is valid, if and only if all of the following + conditions hold: - `Start Epoch` must be set to `Past Bounded Epoch Index`. - `End Epoch` satisfies `End Epoch >= Past Bounded Epoch Index + Staking Unbonding Period`. - When a _Staking Feature_ is present in an account output on the input side of a transaction, the transaction that From dad97f5d3825f87715c5388da625ee9f07fdf362 Mon Sep 17 00:00:00 2001 From: Philipp Gackstatter Date: Fri, 1 Mar 2024 15:16:48 +0800 Subject: [PATCH 138/140] Add Signer UID and Unlocking for Impl Acc Cr Addr --- tips/TIP-0042/tip-0042.md | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/tips/TIP-0042/tip-0042.md b/tips/TIP-0042/tip-0042.md index b12a8f3df..f7ae642e6 100644 --- a/tips/TIP-0042/tip-0042.md +++ b/tips/TIP-0042/tip-0042.md @@ -956,6 +956,8 @@ Account Creation Address_ was derived. Thus, since implicit accounts are much easier to create than a regular account, and are sufficient to create a full account from, without having to rely on a third party, the barrier to entry for the network is lowered. +### Implicit Account Creation Address + The following table shows the mapping from the address type of the **first byte** to the address type: | Address | Type Byte as `uint8` | Bech32 Encoded | @@ -995,7 +997,18 @@ The following table shows the serialization of an _Implicit Account Creation Add An _Implicit Account Creation Address_ is structurally the same as an _Ed25519 Address_, except for the _Address Type_, and thus also backed by an Ed25519 key pair. -### Storage Score +#### Signer UID + +The Signer UID of an _Implicit Account Creation Address_ is the `Pub Key Hash`. + +#### Unlocking + +The address `Address` in a given input at index `Input Index` is unlocked in a transaction if and only if: + +- The `Unlock` in `Unlocks` at `Input Index` is a semantically valid _Unlock_ and is itself or points to a _Signature + Unlock_ whose _Signer UID_ matches the _Signer UID_ of the `Address`. + +#### Storage Score - The storage deposit of an _Implicit Account Creation Address_ defines a dedicated Storage Score Offset: `Storage Score Offset Implicit Account Creation Address`. It is designed to match the Storage Score required for a From 91012a117c211c5eddaf5e95824d4400104535bc Mon Sep 17 00:00:00 2001 From: Philipp Gackstatter Date: Tue, 5 Mar 2024 09:53:00 +0800 Subject: [PATCH 139/140] Require commitment input syntactically --- tips/TIP-0042/tip-0042.md | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/tips/TIP-0042/tip-0042.md b/tips/TIP-0042/tip-0042.md index f7ae642e6..53ba36750 100644 --- a/tips/TIP-0042/tip-0042.md +++ b/tips/TIP-0042/tip-0042.md @@ -237,12 +237,15 @@ disincentivize account owners to overspend their BIC. - The `Block Issuer Keys` must be lexically ordered and unique, both based on the following comparison criteria: - `Block Issuer Key Type` as the first criteria for all Block Issuer Keys. - `Pub Key Hash` as the second criteria for _Ed25519 Public Key Hash Block Issuer Keys_. + - A _Commitment Input_ must be present in the transaction. ### Additional Transaction Semantic Validation Rules - When a _Block Issuer Feature_ is present in an account on the input or output side of a transaction, the transaction - that contains this output is valid, if and only if: + is valid only if: - A _Commitment Input_ is present. +- When a _Block Issuer Feature_ is present in an account on the input side of a transaction, the transaction is valid + only if: - A _Block Issuance Credit Input_ is present whose `Account ID` equals that of the account being transitioned. - Let `Commitment Index` be the slot index of the _Commitment Input_. - Let `Past Bounded Slot Index` be given by `Commitment Index + Max Committable Age`. @@ -357,6 +360,7 @@ which they were selected to participate in the validator committee. ### Additional Transaction Syntactic Validation Rules - The `Amount` in the containing account output satisfies `Amount >= Staked Amount`. +- A _Commitment Input_ must be present in the transaction. ### Additional Transaction Semantic Validation Rules @@ -364,19 +368,19 @@ which they were selected to participate in the validator committee. `Commitment Index + Min Committable Age` where `Commitment Index` is the slot index of the commitment input. - Let `Past Bounded Epoch Index` be the epoch index corresponding to the slot index given by `Commitment Index + Max Committable Age` where `Commitment Index` is the slot index of the commitment input. -- When a _Staking Feature_ is present in an account output on the input or output side of a transaction, the transaction - that contains this output is valid, if and only if: +- When a _Staking Feature_ is present in an account output on the input side of a transaction, the transaction that + contains this output is valid only if: - A _Commitment Input_ is present. - When a _Staking Feature_ is present in an account output on the output side of a transaction, the transaction that - contains this output is valid, if and only if all of the following conditions hold: + contains this output is valid only if all of the following conditions hold: - A _Block Issuer Feature_ must be present in the account. - When a _Staking Feature_ is present in an account output on the output side of a transaction and the feature was not - present on the input side, the transaction that contains this output is valid, if and only if all of the following - conditions hold: + present on the input side, the transaction that contains this output is valid only if all of the following conditions + hold: - `Start Epoch` must be set to `Past Bounded Epoch Index`. - `End Epoch` satisfies `End Epoch >= Past Bounded Epoch Index + Staking Unbonding Period`. - When a _Staking Feature_ is present in an account output on the input side of a transaction, the transaction that - contains this input is valid, if and only if all of the following conditions hold: + contains this input is valid only if all of the following conditions hold: - If `Future Bounded Epoch Index <= End Epoch`, all of the following conditions must hold: - A _Staking Feature_ must be present on the corresponding account on the output side of the transaction. - The fields `Staked Amount`, `Start Epoch` and `Fixed Cost` on the feature on the input and the feature on the From 20a3b3a2e44ce28297945b3a381cc9cbc4aae058 Mon Sep 17 00:00:00 2001 From: Philipp Gackstatter Date: Thu, 7 Mar 2024 14:44:31 +0800 Subject: [PATCH 140/140] Make Block Issuer Feature requirement syntactic --- tips/TIP-0042/tip-0042.md | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/tips/TIP-0042/tip-0042.md b/tips/TIP-0042/tip-0042.md index 53ba36750..33dff9c92 100644 --- a/tips/TIP-0042/tip-0042.md +++ b/tips/TIP-0042/tip-0042.md @@ -360,6 +360,7 @@ which they were selected to participate in the validator committee. ### Additional Transaction Syntactic Validation Rules - The `Amount` in the containing account output satisfies `Amount >= Staked Amount`. +- A _Block Issuer Feature_ must be present in the account. - A _Commitment Input_ must be present in the transaction. ### Additional Transaction Semantic Validation Rules @@ -371,9 +372,6 @@ which they were selected to participate in the validator committee. - When a _Staking Feature_ is present in an account output on the input side of a transaction, the transaction that contains this output is valid only if: - A _Commitment Input_ is present. -- When a _Staking Feature_ is present in an account output on the output side of a transaction, the transaction that - contains this output is valid only if all of the following conditions hold: - - A _Block Issuer Feature_ must be present in the account. - When a _Staking Feature_ is present in an account output on the output side of a transaction and the feature was not present on the input side, the transaction that contains this output is valid only if all of the following conditions hold:
@@ -685,7 +685,7 @@ outputs that are locked under _Account Address_ and it keeps track of controlled Set to value 0 to denote an Ed25519 Public Key Hash Block Issuer Key.
PubKeyHashPub Key Hash ByteArray[32] The raw bytes of the BLAKE2b-256 hash of the corresponding Ed25519 public key.
Set to value 32 to denote an Implicit Account Creation Address.
PubKeyHashPub Key Hash ByteArray[32] The raw bytes of the Implicit Account Creation Address which is the BLAKE2b-256 hash of the Ed25519 public key.