--- title: sig-locked-single-deposit-colored tags: RFC, draft --- + Feature name: `sig-locked-single-deposit-colored` + Start date: 2020-07-14 + RFC PR: [iotaledger/protocol-rfcs#0000](https://github.com/iotaledger/protocol-rfcs/pull/0) # Summary This RFC introduces colored coins to the IOTA protocol by the addition of a new `Output Type` for the `Output` of a `Signed Transaction Payload` defined in https://hackmd.io/1KwmdoqAT4-J7yuuas6ZUQ. It allows IOTA tokens to be unlocked by a signature while marking them with a certain "color". # Motivation Colored coins are tokens that are marked to represent and manage real world assets. This opens up a whole new range of use cases as assets managed by IOTA tokens are secure, transparent and immutable. They are very generic and can virtually represent any kind of asset: with colored coins, one can prove ownership of stocks, bonds, real estate, precious metals, currencies, other crypto-currencies... # Detailed design This new locking mechanism, `SigLockedSingleDepositColored (OutputType = SIG_LOCK_COLORED)` can be seen as an extension of `SigLockedSingleDeposit (OutputType = SIG_LOCK)` as they share a similar layout and the same unlock type based on signatures, the `Signature Unlock Block`. However, it does not replace `SigLockedSingleDeposit` as it is still needed to move uncolored token. The main implication of this addition is that when previously a balance was just an amount, it is now a combination of an amount and its corresponding color. ``` ColoredBalance = {amount: uint64, color: Color} ``` Where a color is simply a sequence of bytes that can be handled by the user with the help of commands and which is retained when being transferred. ``` Color = Array<byte>[32] ``` ## Layout The layout is straightforward and very similar to the `SigLockedSingleDeposit` layout. Two new fields are added to manage the color of tokens. <table> <tr> <td><b>Name<b></td> <td><b>Type</b></td> <td><b>Description</b></td> </tr> <tr> <td>Output Type</td> <td>varint</td> <td> Set to <strong>value 1</strong> to denote a <i>SigLockedSingleDepositColored</i>. </td> </tr> <tr> <td>Address (oneOf)</td> <td colspan="2"> <details> <summary>WOTS Address</summary> <table> <tr> <td><b>Name<b></td> <td><b>Type</b></td> <td><b>Description</b></td> </tr> <tr> <td>Address Type</td> <td>varint</td> <td> Set to <strong>value 0</strong> to denote a <i>WOTS Address</i>. </td> </tr> <tr> <td>Address</td> <td>ByteArray[49]</td> <td>The T5B1 encoded WOTS address.</td> </tr> </table> </details> <details> <summary>Ed25519 Address</summary> <table> <tr> <td><b>Name<b></td> <td><b>Type</b></td> <td><b>Description</b></td> </tr> <tr> <td>Address Type</td> <td>varint</td> <td> Set to <strong>value 1</strong> to denote an <i>Ed25519 Address</i>. </td> </tr> <tr> <td>Address</td> <td>ByteArray[32]</td> <td>The raw bytes of the Ed25519 address which is a BLAKE2b-256 hash of the Ed25519 public key.</td> </tr> </table> </details> </td> </tr> <tr> <td>Amount</td> <td>uint64</td> <td>The amount of tokens to deposit with this <i>SigLockedSingleDepositColored</i> output.</td> </tr> <tr> <td>Operation</td> <td>varint</td> <td>The color operation to apply on the tokens.</td> </tr> <tr> <td>Color</td> <td>Array<bytes>[32]</td> <td>Optional color depending on the operation.</td> </tr> </table> ## Operations The currently available color operations are: - `MINT` - Type = `0`; - Used to create (or "mint") new colored coins; - Sets the color of the tokens to the Transaction ID; - Only works on un-colored tokens; - Does not require the color field; - `MOVE` - Type = `1`; - Simply moves tokens of a given color; - Only one color can be moved per output; - Requires the color field; - `UNCOLOR` - Type = `2`; - Resets the color of the tokens; - Requires the color field; ## Validation All validations rules of `Message`, `Signed Transaction` and `Signature Unlock Block` are still relevant. In addition, a transaction is valid, if it only spends colors in the amounts that were available in the used inputs. ### Syntactic Validation All of the following assertions must be true: - `Output Type` field should be `1` to denote `SigLockedSingleDepositColored`; - `Address` field should follow the same validation rules as in `SigLockedSingleDeposit`; - `Address Type` field must either be `0` or `1` to denote a `WOTS` address or an `Ed25519` address; - If `WOTS`, `Address` field bytes must be valid T5B1 bytes; - `Amount` field must be > 0; - `Operation` field must be either `0`, `1` or `2` to denote operation `MINT`, `MOVE` or `UNCOLOR`; - `Color` field must not be present on a `MINT` operation; - `Color` field must be present on a `MOVE` or `UNCOLOR` operation; ### Semantic Validation - For `MOVE`, the total amount of tokens per color in the inputs must exactly match the total tokens per color on the outputs; # Drawbacks - Necessarily comes with increased complexity by adding new logic; - Affects not only IOTA nodes but also clients and wallets; - Requires more disk space; # Rationale and alternatives Colored coins are not a core protocol feature but still a nice feature to have for real world use cases and adoption. It is then not mandatory and added to the IOTA protocol with a new output type. # Unresolved questions - Are there any more validation rules that comes with the introduction of colored coins ? - How does `UNCOLOR` works with inputs with different colors ? - Can we move colored tokens with `SigLockedSingleDeposit` ?