Transaction Size
Transaction size is used to calculate the mass value of the transaction to evaluate it against various network limits. It is also used in the dust calculation algorithm.
How input estimated serialized size is calculated
transaction_estimated_serialized_size()
produces the estimated size of a transaction in some
serialization. This has to be deterministic, but not necessarily accurate, since
it's only used as the size component in the transaction and block mass limit
calculation.
#![allow(unused)] fn main() { pub fn transaction_estimated_serialized_size(tx: &Transaction) -> u64 { let mut size: u64 = 0; size += 2; // Tx version (u16) size += 8; // Number of inputs (u64) let inputs_size: u64 = tx.inputs.iter().map(transaction_input_estimated_serialized_size).sum(); size += inputs_size; size += 8; // number of outputs (u64) let outputs_size: u64 = tx.outputs.iter().map(transaction_output_estimated_serialized_size).sum(); size += outputs_size; size += 8; // lock time (u64) size += SUBNETWORK_ID_SIZE as u64; size += 8; // gas (u64) size += HASH_SIZE as u64; // payload hash size += 8; // length of the payload (u64) size += tx.payload.len() as u64; size } const HASH_SIZE:usize = 32; // 36 + 8 + <signature script length> + 8 fn transaction_input_estimated_serialized_size(input: &TransactionInput) -> u64 { let mut size = 0; size += outpoint_estimated_serialized_size(); size += 8; // length of signature script (u64) size += input.signature_script.len() as u64; size += 8; // sequence (u64) size } // 32 + 4 = 36 const fn outpoint_estimated_serialized_size() -> u64 { let mut size: u64 = 0; size += HASH_SIZE as u64; // Previous tx ID size += 4; // Index (u32) size } // 8 + 2 + 8 + <script_public_key length> pub fn transaction_output_estimated_serialized_size(output: &TransactionOutput) -> u64 { let mut size: u64 = 0; size += 8; // value (u64) size += 2; // output.ScriptPublicKey.Version (u16) size += 8; // length of script public key (u64) size += output.script_public_key.script().len() as u64; size } }