Specs
Consensus Protocol
Codec IDβ
Some data is prepended with a codec ID (unt16) that denotes how the data should be deserialized. Right now, the only valid codec ID is 0 (0x00 0x00).
Inputsβ
Inputs to Coreth Atomic Transactions are either an EVMInput from this chain or a TransferableInput (which contains a SECP256K1TransferInput) from another chain. The EVMInput will be used in ExportTx to spend funds from this chain, while the TransferableInput will be used to import atomic UTXOs from another chain.
EVM Inputβ
Input type that specifies an EVM account to deduct the funds from as part of an ExportTx.
What EVM Input Containsβ
An EVM Input contains an address, amount, assetID, and nonce.
Addressis the EVM address from which to transfer funds.Amountis the amount of the asset to be transferred (specified in nAVAX for AVAX and the smallest denomination for all other assets).AssetIDis the ID of the asset to transfer.Nonceis the nonce of the EVM account exporting funds.
Gantt EVM Input Specificationβ
Proto EVM Input Specificationβ
EVM Input Exampleβ
Let's make an EVM Input:
Address: 0x8db97c7cece249c2b98bdc0226cc4c2a57bf52fcAmount: 2000000AssetID: 0x000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1fNonce: 0
Transferable Inputβ
Transferable Input wraps a SECP256K1TransferInput. Transferable inputs describe a specific UTXO with a provided transfer input.
What Transferable Input Containsβ
A transferable input contains a TxID, UTXOIndex AssetID and an Input.
TxIDis a 32-byte array that defines which transaction this input is consuming an output from.UTXOIndexis an int that defines which utxo this input is consuming in the specified transaction.AssetIDis a 32-byte array that defines which asset this input references.Inputis aSECP256K1TransferInput, as defined below.
Gantt Transferable Input Specificationβ
Proto Transferable Input Specificationβ
Transferable Input Exampleβ
Let's make a transferable input:
TxID: 0x6613a40dcdd8d22ea4aa99a4c84349056317cf550b6685e045e459954f258e59UTXOIndex: 1AssetID: 0xdbcf890f77f49b96857648b72b77f9f82937f28a68704af05da0dc12ba53f2dbInput: "Example SECP256K1 Transfer Input from below"
SECP256K1 Transfer Inputβ
A secp256k1 transfer input allows for spending an unspent secp256k1 transfer output.
What SECP256K1 Transfer Input Containsβ
A secp256k1 transfer input contains an Amount and AddressIndices.
TypeIDis the ID for this input type. It is0x00000005.Amountis a long that specifies the quantity that this input should be consuming from the UTXO. Must be positive. Must be equal to the amount specified in the UTXO.AddressIndicesis a list of unique ints that define the private keys that are being used to spend the UTXO. Each UTXO has an array of addresses that can spend the UTXO. Each int represents the index in this address array that will sign this transaction. The array must be sorted low to high.
Gantt SECP256K1 Transfer Input Specificationβ
Proto SECP256K1 Transfer Input Specificationβ
SECP256K1 Transfer Input Exampleβ
Let's make a payment input with:
TypeId: 5Amount: 500000000000AddressIndices: [0]
Outputsβ
Outputs to Coreth Atomic Transactions are either an EVMOutput to be added to the balance of an address on this chain or a TransferableOutput (whcih contains a SECP256K1TransferOutput) to be moved to another chain.
The EVM Output will be used in ImportTx to add funds to this chain, while the TransferableOutput will be used to export atomic UTXOs to another chain.
EVM Outputβ
Output type specifying a state change to be applied to an EVM account as part of an ImportTx.
What EVM Output Containsβ
An EVM Output contains an address, amount, and assetID.
Addressis the EVM address that will receive the funds.Amountis the amount of the asset to be transferred (specified in nAVAX for AVAX and the smallest denomination for all other assets).AssetIDis the ID of the asset to transfer.
Gantt EVM Output Specificationβ
Proto EVM Output Specificationβ
EVM Output Exampleβ
Let's make an EVM Output:
Address: 0x0eb5ccb85c29009b6060decb353a38ea3b52cd20Amount: 500000000000AssetID: 0xdbcf890f77f49b96857648b72b77f9f82937f28a68704af05da0dc12ba53f2db
Transferable Outputβ
Transferable outputs wrap a SECP256K1TransferOutput with an asset ID.
What Transferable Output Containsβ
A transferable output contains an AssetID and an Output which is a SECP256K1TransferOutput.
AssetIDis a 32-byte array that defines which asset this output references.Outputis aSECP256K1TransferOutputas defined below.
Gantt Transferable Output Specificationβ
Proto Transferable Output Specificationβ
Transferable Output Exampleβ
Let's make a transferable output:
AssetID: 0xdbcf890f77f49b96857648b72b77f9f82937f28a68704af05da0dc12ba53f2dbOutput: "Example SECP256K1 Transfer Output from below"
SECP256K1 Transfer Outputβ
A secp256k1 transfer output allows for sending a quantity of an asset to a collection of addresses after a specified unix time.
What SECP256K1 Transfer Output Containsβ
A secp256k1 transfer output contains a TypeID, Amount, Locktime, Threshold, and Addresses.
TypeIDis the ID for this output type. It is0x00000007.Amountis a long that specifies the quantity of the asset that this output owns. Must be positive.Locktimeis a long that contains the unix timestamp that this output can be spent after. The unix timestamp is specific to the second.Thresholdis an int that names the number of unique signatures required to spend the output. Must be less than or equal to the length ofAddresses. IfAddressesis empty, must be 0.Addressesis a list of unique addresses that correspond to the private keys that can be used to spend this output. Addresses must be sorted lexicographically.
Gantt SECP256K1 Transfer Output Specificationβ
Proto SECP256K1 Transfer Output Specificationβ
SECP256K1 Transfer Output Exampleβ
Let's make a secp256k1 transfer output with:
TypeID: 7Amount: 1000000Locktime: 0Threshold: 1Addresses:0x66f90db6137a78f76b3693f7f2bc507956dae563
Atomic Transactionsβ
Atomic Transactions are used to move funds between chains. There are two types ImportTx and ExportTx.
ExportTxβ
ExportTx is a transaction to export funds from Coreth to a different chain.
What ExportTx Containsβ
An ExportTx contains an typeID, networkID, blockchainID, destinationChain, inputs, and exportedOutputs.
typeIDis an int that the type for an ExportTx. The typeID for an exportTx is 1.networkIDis an int that defines which Avalanche network this transaction is meant to be issued to. This could refer to mainnet, fuji, etc. and is different than the EVM's network ID.blockchainIDis a 32-byte array that defines which blockchain this transaction was issued to.destinationChainis a 32-byte array that defines which blockchain this transaction exports funds to.inputsis an array of EVM Inputs to fund the ExportTx.exportedOutputsis an array of TransferableOutputs to be transferred todestinationChain.
Gantt ExportTx Specificationβ
ExportTx Exampleβ
Let's make an EVM Output:
TypeID:1NetworkID:12345BlockchainID:0x91060eabfb5a571720109b5896e5ff00010a1cfe6b103d585e6ebf27b97a1735DestinationChain:0xd891ad56056d9c01f18f43f58b5c784ad07a4a49cf3d1f11623804b5cba2c6bfInputs:"Example EVMInput as defined above"
Exportedoutputs:"Example TransferableOutput as defined above"
ImportTxβ
ImportTx is a transaction to import funds to Coreth from another chain.
What ImportTx Containsβ
An ImportTx contains an typeID, networkID, blockchainID, destinationChain, importedInputs, and Outs.
typeIDis an int that the type for an ImportTx. The typeID for anImportTxis 0.networkIDis an int that defines which Avalanche network this transaction is meant to be issued to. This could refer to mainnet, fuji, etc. and is different than the EVM's network ID.blockchainIDis a 32-byte array that defines which blockchain this transaction was issued to.sourceChainis a 32-byte array that defines which blockchain from which to import funds.importedInputsis an array of TransferableInputs to fund the ImportTx.Outsis an array of EVM Outputs to be imported to this chain.
Gantt ImportTx Specificationβ
ImportTx Exampleβ
Let's make an ImportTx:
TypeID:0NetworkID:12345BlockchainID:0x91060eabfb5a571720109b5896e5ff00010a1cfe6b103d585e6ebf27b97a1735SourceChain:0xd891ad56056d9c01f18f43f58b5c784ad07a4a49cf3d1f11623804b5cba2c6bfImportedInputs:"Example TransferableInput as defined above"
Outs:"Example EVMOutput as defined above"
Credentialsβ
Credentials have one possible type: SECP256K1Credential. Each credential is paired with an Input. The order of the credentials match the order of the inputs.
SECP256K1 Credentialβ
A secp256k1 credential contains a list of 65-byte recoverable signatures.
What SECP256K1 Credential Containsβ
TypeIDis the ID for this type. It is0x00000009.Signaturesis an array of 65-byte recoverable signatures. The order of the signatures must match the input's signature indices.
Gantt SECP256K1 Credential Specificationβ
Proto SECP256K1 Credential Specificationβ
SECP256K1 Credential Exampleβ
Let's make a payment input with:
TypeID: 9signatures:0x0acccf47a820549a84428440e2421975138790e41be262f7197f3d93faa26cc8741060d743ffaf025782c8c86b862d2b9febebe7d352f0b4591afbd1a737f8a30010199dbf
Signed Transactionβ
A signed transaction contains an unsigned AtomicTx and credentials.
What Signed Transaction Containsβ
A signed transaction contains a CodecID, AtomicTx, and Credentials.
CodecIDThe only current valid codec id is00 00.AtomicTxis an atomic transaction, as described above.Credentialsis an array of credentials. Each credential corresponds to the input at the same index in the AtomicTx
Gantt Signed Transaction Specificationβ
Proto Signed Transaction Specificationβ
Signed Transaction Exampleβ
Let's make a signed transaction that uses the unsigned transaction and credential from the previous examples.
CodecID:0UnsignedTx:0x000000000000303991060eabfb5a571720109b5896e5ff00010a1cfe6b103d585e6ebf27b97a1735d891ad56056d9c01f18f43f58b5c784ad07a4a49cf3d1f11623804b5cba2c6bf000000016613a40dcdd8d22ea4aa99a4c84349056317cf550b6685e045e459954f258e5900000001dbcf890f77f49b96857648b72b77f9f82937f28a68704af05da0dc12ba53f2db00000005000000746a5288000000000100000000000000010eb5ccb85c29009b6060decb353a38ea3b52cd20000000746a528800dbcf890f77f49b96857648b72b77f9f82937f28a68704af05da0dc12ba53f2dbCredentials0x00000009000000010acccf47a820549a84428440e2421975138790e41be262f7197f3d93faa26cc8741060d743ffaf025782c8c86b862d2b9febebe7d352f0b4591afbd1a737f8a300
UTXOβ
A UTXO is a standalone representation of a transaction output.
What UTXO Containsβ
A UTXO contains a CodecID, TxID, UTXOIndex, AssetID, and Output.
CodecIDThe only validCodecIDis00 00TxIDis a 32-byte transaction ID. Transaction IDs are calculated by taking sha256 of the bytes of the signed transaction.UTXOIndexis an int that specifies which output in the transaction specified byTxIDthat this utxo was created by.AssetIDis a 32-byte array that defines which asset this utxo references.Outputis the output object that created this utxo. The serialization of Outputs was defined above.
Gantt UTXO Specificationβ
Proto UTXO Specificationβ
UTXO Exampleβ
Letβs make a UTXO from the signed transaction created above:
CodecID:0TxID:0xf966750f438867c3c9828ddcdbe660e21ccdbb36a9276958f011ba472f75d4e7UTXOIndex: 0 = 0x00000000AssetID:0x000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1fOutput:"Example EVMOutput as defined above"
Last updated