Bitcoin Transaction: GraphViz block diagram (.dot) source

KS implementation details

License: CC-BY-SA-4.0

This page hosts a formal specification of Bitcoin Transaction using Kaitai Struct. This specification can be automatically translated into a variety of programming languages to get a parsing library.

GraphViz block diagram source

bitcoin_transaction.dot

digraph {
	rankdir=LR;
	node [shape=plaintext];
	subgraph cluster__bitcoin_transaction {
		label="BitcoinTransaction";
		graph[style=dotted];

		bitcoin_transaction__seq [label=<<TABLE BORDER="0" CELLBORDER="1" CELLSPACING="0">
			<TR><TD BGCOLOR="#E0FFE0">pos</TD><TD BGCOLOR="#E0FFE0">size</TD><TD BGCOLOR="#E0FFE0">type</TD><TD BGCOLOR="#E0FFE0">id</TD></TR>
			<TR><TD PORT="version_pos">0</TD><TD PORT="version_size">4</TD><TD>u4le</TD><TD PORT="version_type">version</TD></TR>
			<TR><TD PORT="num_vins_pos">4</TD><TD PORT="num_vins_size">1</TD><TD>u1</TD><TD PORT="num_vins_type">num_vins</TD></TR>
			<TR><TD PORT="vins_pos">5</TD><TD PORT="vins_size">...</TD><TD>Vin</TD><TD PORT="vins_type">vins</TD></TR>
			<TR><TD COLSPAN="4" PORT="vins__repeat">repeat num_vins times</TD></TR>
			<TR><TD PORT="num_vouts_pos">...</TD><TD PORT="num_vouts_size">1</TD><TD>u1</TD><TD PORT="num_vouts_type">num_vouts</TD></TR>
			<TR><TD PORT="vouts_pos">...</TD><TD PORT="vouts_size">...</TD><TD>Vout</TD><TD PORT="vouts_type">vouts</TD></TR>
			<TR><TD COLSPAN="4" PORT="vouts__repeat">repeat num_vouts times</TD></TR>
			<TR><TD PORT="locktime_pos">...</TD><TD PORT="locktime_size">4</TD><TD>u4le</TD><TD PORT="locktime_type">locktime</TD></TR>
		</TABLE>>];
		subgraph cluster__vout {
			label="BitcoinTransaction::Vout";
			graph[style=dotted];

			vout__seq [label=<<TABLE BORDER="0" CELLBORDER="1" CELLSPACING="0">
				<TR><TD BGCOLOR="#E0FFE0">pos</TD><TD BGCOLOR="#E0FFE0">size</TD><TD BGCOLOR="#E0FFE0">type</TD><TD BGCOLOR="#E0FFE0">id</TD></TR>
				<TR><TD PORT="amount_pos">0</TD><TD PORT="amount_size">8</TD><TD>u8le</TD><TD PORT="amount_type">amount</TD></TR>
				<TR><TD PORT="script_len_pos">8</TD><TD PORT="script_len_size">1</TD><TD>u1</TD><TD PORT="script_len_type">script_len</TD></TR>
				<TR><TD PORT="script_pub_key_pos">9</TD><TD PORT="script_pub_key_size">script_len</TD><TD></TD><TD PORT="script_pub_key_type">script_pub_key</TD></TR>
			</TABLE>>];
		}
		subgraph cluster__public_key {
			label="BitcoinTransaction::PublicKey";
			graph[style=dotted];

			public_key__seq [label=<<TABLE BORDER="0" CELLBORDER="1" CELLSPACING="0">
				<TR><TD BGCOLOR="#E0FFE0">pos</TD><TD BGCOLOR="#E0FFE0">size</TD><TD BGCOLOR="#E0FFE0">type</TD><TD BGCOLOR="#E0FFE0">id</TD></TR>
				<TR><TD PORT="type_pos">0</TD><TD PORT="type_size">1</TD><TD>u1</TD><TD PORT="type_type">type</TD></TR>
				<TR><TD PORT="x_pos">1</TD><TD PORT="x_size">32</TD><TD></TD><TD PORT="x_type">x</TD></TR>
				<TR><TD PORT="y_pos">33</TD><TD PORT="y_size">32</TD><TD></TD><TD PORT="y_type">y</TD></TR>
			</TABLE>>];
		}
		subgraph cluster__vin {
			label="BitcoinTransaction::Vin";
			graph[style=dotted];

			vin__seq [label=<<TABLE BORDER="0" CELLBORDER="1" CELLSPACING="0">
				<TR><TD BGCOLOR="#E0FFE0">pos</TD><TD BGCOLOR="#E0FFE0">size</TD><TD BGCOLOR="#E0FFE0">type</TD><TD BGCOLOR="#E0FFE0">id</TD></TR>
				<TR><TD PORT="txid_pos">0</TD><TD PORT="txid_size">32</TD><TD></TD><TD PORT="txid_type">txid</TD></TR>
				<TR><TD PORT="output_id_pos">32</TD><TD PORT="output_id_size">4</TD><TD>u4le</TD><TD PORT="output_id_type">output_id</TD></TR>
				<TR><TD PORT="script_len_pos">36</TD><TD PORT="script_len_size">1</TD><TD>u1</TD><TD PORT="script_len_type">script_len</TD></TR>
				<TR><TD PORT="script_sig_pos">37</TD><TD PORT="script_sig_size">script_len</TD><TD>ScriptSignature</TD><TD PORT="script_sig_type">script_sig</TD></TR>
				<TR><TD PORT="end_of_vin_pos">...</TD><TD PORT="end_of_vin_size">4</TD><TD>FF FF FF FF</TD><TD PORT="end_of_vin_type">end_of_vin</TD></TR>
			</TABLE>>];
		}
		subgraph cluster__script_signature {
			label="BitcoinTransaction::ScriptSignature";
			graph[style=dotted];

			script_signature__seq [label=<<TABLE BORDER="0" CELLBORDER="1" CELLSPACING="0">
				<TR><TD BGCOLOR="#E0FFE0">pos</TD><TD BGCOLOR="#E0FFE0">size</TD><TD BGCOLOR="#E0FFE0">type</TD><TD BGCOLOR="#E0FFE0">id</TD></TR>
				<TR><TD PORT="sig_stack_len_pos">0</TD><TD PORT="sig_stack_len_size">1</TD><TD>u1</TD><TD PORT="sig_stack_len_type">sig_stack_len</TD></TR>
				<TR><TD PORT="der_sig_pos">1</TD><TD PORT="der_sig_size">...</TD><TD>DerSignature</TD><TD PORT="der_sig_type">der_sig</TD></TR>
				<TR><TD PORT="sig_type_pos">...</TD><TD PORT="sig_type_size">1</TD><TD>u1→SighashType</TD><TD PORT="sig_type_type">sig_type</TD></TR>
				<TR><TD PORT="pubkey_stack_len_pos">...</TD><TD PORT="pubkey_stack_len_size">1</TD><TD>u1</TD><TD PORT="pubkey_stack_len_type">pubkey_stack_len</TD></TR>
				<TR><TD PORT="pubkey_pos">...</TD><TD PORT="pubkey_size">65</TD><TD>PublicKey</TD><TD PORT="pubkey_type">pubkey</TD></TR>
			</TABLE>>];
		}
		subgraph cluster__der_signature {
			label="BitcoinTransaction::DerSignature";
			graph[style=dotted];

			der_signature__seq [label=<<TABLE BORDER="0" CELLBORDER="1" CELLSPACING="0">
				<TR><TD BGCOLOR="#E0FFE0">pos</TD><TD BGCOLOR="#E0FFE0">size</TD><TD BGCOLOR="#E0FFE0">type</TD><TD BGCOLOR="#E0FFE0">id</TD></TR>
				<TR><TD PORT="sequence_pos">0</TD><TD PORT="sequence_size">1</TD><TD>30</TD><TD PORT="sequence_type">sequence</TD></TR>
				<TR><TD PORT="sig_len_pos">1</TD><TD PORT="sig_len_size">1</TD><TD>u1</TD><TD PORT="sig_len_type">sig_len</TD></TR>
				<TR><TD PORT="sep_1_pos">2</TD><TD PORT="sep_1_size">1</TD><TD>02</TD><TD PORT="sep_1_type">sep_1</TD></TR>
				<TR><TD PORT="sig_r_len_pos">3</TD><TD PORT="sig_r_len_size">1</TD><TD>u1</TD><TD PORT="sig_r_len_type">sig_r_len</TD></TR>
				<TR><TD PORT="sig_r_pos">4</TD><TD PORT="sig_r_size">sig_r_len</TD><TD></TD><TD PORT="sig_r_type">sig_r</TD></TR>
				<TR><TD PORT="sep_2_pos">...</TD><TD PORT="sep_2_size">1</TD><TD>02</TD><TD PORT="sep_2_type">sep_2</TD></TR>
				<TR><TD PORT="sig_s_len_pos">...</TD><TD PORT="sig_s_len_size">1</TD><TD>u1</TD><TD PORT="sig_s_len_type">sig_s_len</TD></TR>
				<TR><TD PORT="sig_s_pos">...</TD><TD PORT="sig_s_size">sig_s_len</TD><TD></TD><TD PORT="sig_s_type">sig_s</TD></TR>
			</TABLE>>];
		}
	}
	bitcoin_transaction__seq:vins_type -> vin__seq [style=bold];
	bitcoin_transaction__seq:num_vins_type -> bitcoin_transaction__seq:vins__repeat [color="#404040"];
	bitcoin_transaction__seq:vouts_type -> vout__seq [style=bold];
	bitcoin_transaction__seq:num_vouts_type -> bitcoin_transaction__seq:vouts__repeat [color="#404040"];
	vout__seq:script_len_type -> vout__seq:script_pub_key_size [color="#404040"];
	vin__seq:script_len_type -> vin__seq:script_sig_size [color="#404040"];
	vin__seq:script_sig_type -> script_signature__seq [style=bold];
	script_signature__seq:der_sig_type -> der_signature__seq [style=bold];
	script_signature__seq:pubkey_type -> public_key__seq [style=bold];
	der_signature__seq:sig_r_len_type -> der_signature__seq:sig_r_size [color="#404040"];
	der_signature__seq:sig_s_len_type -> der_signature__seq:sig_s_size [color="#404040"];
}