CTx

class blsct.CTx(tx_ins: list[TxIn], tx_outs: list[TxOut], change_addr: SubAddr | None = None)

Represents a confidential transaction. Also known as CMutableTransaction on the C++ side.

>>> from blsct import ChildKey, DoublePublicKey, OutPoint, PublicKey, Scalar, SubAddr, SubAddrId, TokenId, CTX_ID_SIZE, CTx, CTxId, TxIn, TxOut
>>> import secrets
>>> num_tx_in = 1
>>> num_tx_out = 1
>>> default_fee = 200000
>>> fee = (num_tx_in + num_tx_out) * default_fee
>>> out_amount = 10000
>>> in_amount = fee + out_amount
>>> ctx_id = CTxId.deserialize(secrets.token_hex(32))
>>> out_point = OutPoint(ctx_id)
>>> gamma = 100
>>> spending_key = Scalar()
>>> token_id = TokenId()
>>> tx_in = TxIn(in_amount, gamma, spending_key, token_id, out_point)
>>> sub_addr = SubAddr.from_double_public_key(DoublePublicKey())
>>> tx_out = TxOut(sub_addr, out_amount, 'navio')
>>> # The fee is size-based, so the input over-funds it: pay the change to
>>> # an address you own.
>>> change_addr = SubAddr.from_double_public_key(DoublePublicKey())
>>> ctx = CTx([tx_in], [tx_out], change_addr)
>>> ctx_ins = ctx.get_ctx_ins()
>>> for i in range(ctx_ins.size()):
...   ctx_in = ctx_ins.at(i)
...   print(f"prev_out_hash: {ctx_in.get_prev_out_hash()}")
...   print(f"script_sig: {ctx_in.get_script_sig()}")
...   print(f"sequence: {ctx_in.get_sequence()}")
...   print(f"script_witness: {ctx_in.get_script_witness()}")
...
prev_out_hash: CTxId(9194a7eaafe70c6f623eef4740c934f569b8a7f0a246ce4377c34a5bb9a6f126)
script_sig: Script(0000000000008f676000000000006b67400000000000726720000000)
sequence: 4294967295
script_witness: Script(0000000000008f676000000000006b67400000000000726720000000)
>>> ctx_outs = ctx.get_ctx_outs()
>>> for i in range(ctx_outs.size()):
...   ctx_out = ctx_outs.at(i)
...   print(f"value: {ctx_out.get_value()}")
...   print(f"script_pub_key: {ctx_out.get_script_pub_key()}")
...   print(f"blsct_data.spending_key: {ctx_out.get_spending_key()}")
...   print(f"blsct_data.ephemeral_key: {ctx_out.get_ephemeral_key()}")
...   print(f"blsct_data.blinding_key: {ctx_out.get_blinding_key()}")
...   print(f"blsct_data.view_tag: {ctx_out.get_view_tag()}")
...   rp = ctx_out.get_range_proof()
...   print(f"blsct_data.range_proof.A: {rp.get_A()}")
...   print(f"blsct_data.range_proof.A_wip: {rp.get_A_wip()}")
...   print(f"blsct_data.range_proof.B: {rp.get_B()}")
...   print(f"blsct_data.range_Proof.r_prime: {rp.get_r_prime()}")
...   print(f"blsct_data.range_proof.s_prime: {rp.get_s_prime()}")
...   print(f"blsct_data.range_proof.delta_prime: {rp.get_delta_prime()}")
...   print(f"blsct_data.range_proof.alpha_hat: {rp.get_alpha_hat()}")
...   print(f"blsct_data.range_proof.tau_x: {rp.get_tau_x()}")
...   print(f"token_id: token={ctx_out.get_token_id().token()}, subid={tx_out.get_token_id().subid()}")
...   print(f"vector_predicate: {ctx_out.get_vector_predicate()}")
...
value: 0
script_pub_key: Script(51000000000000000000000000000000000000000000000000000000)
blsct_data.spending_key: Scalar(2db08363ad3374035953866a054d5501da26aefbe55b4566d5e28a8bd1c3c051)
blsct_data.ephemeral_key: Point(b56c69fa701103d7228d365f4405ac81ca91dc7c4fe439e700289da87ca60d370680f1e03e64109bbce546028be38515)
blsct_data.blinding_key: BlindingKey(1f8947367d5a91d84b6e743072e55424b57b66e9030d84bc4d2c1f0f69633f29)
blsct_data.view_tag: 31130
blsct_data.range_proof.A: Point(a70ec0dfc74dc592c94e6a142824520af6aa42501cbd3700abc7fb8ef05b1b9da808a0f4eabf8a8a59eed227276a9339)
blsct_data.range_proof.A_wip: Point(afe823eeca1b6c81f781e96f016d9d3679b7808f7f6940a012a28c49e5e3230b8ab64ffaa5ca50d7577d193fd3b7fa47)
blsct_data.range_proof.B: Point(a93f76c421f03eef9744d232cc2d0c818830b7962db32350b23695107840f83ff2a976a4dd71abbb97fbb0d220d23921)
blsct_data.range_Proof.r_prime: Scalar(28383d7f0279a9d57da02f9cd763c2fd2ac3af13267c36da251ce4b1aeebaec7)
blsct_data.range_proof.s_prime: Scalar(164ba1cf029e24b9e8ef462ad741371f89e71ca7db5226f1bf331e18c55ac06b)
blsct_data.range_proof.delta_prime: Scalar(452a82bdb8e035d53e6e45b92bdd3d49fb68045f15f0b3dbd97df60ae3a84c1e)
blsct_data.range_proof.alpha_hat: Scalar(385ebad68297e142a0aa2e83897799df7a08adf0e8e23046884eb3ad041ea7bd)
blsct_data.range_proof.tau_x: Scalar(6b537c1670116d3a7518b45b1b9ba5608ed1b597ea40f018390e19e0cb0b0507)
token_id: token=0, subid=18446744073709551615
vector_predicate:
value: 0
script_pub_key: Script(51000000f5000000c000000020000000a00000040000800080000004)
blsct_data.spending_key: Scalar(24848b6f0958cf217783f48f260366e0e0c2ccda954a0188e83381c61bf33902)
blsct_data.ephemeral_key: Point(800bfdedb0bee4dcf6f56309a8c6c566a57c12f77f0f2320243c672c7529451598b327f0fe58df8bbd655014620fcd8a)
blsct_data.blinding_key: BlindingKey(4c1258acd66282b7ccc627f7f65e27faac425bfd0001a40100000000ffffffff)
blsct_data.view_tag: 21881
blsct_data.range_proof.A: Point(8731fba528d2461adc510c2cea6538cb4c31869448ee04f83665aa24a83c6a79aff088893d908ad7df4236e8c10a7ed1)
blsct_data.range_proof.A_wip: Point(b739df1c0a90ec625e155b2a371eaf20c87b0e9e1f354d233793553a61b472b804d1504640db589aec88faba42842798)
blsct_data.range_proof.B: Point(8c1598246f94d52ce83b441eeaff84850f962a21ad2613740ccf21d1b032465070381ad8481bc245f25c2a61a535e5fc)
blsct_data.range_Proof.r_prime: Scalar(1de1c43d513ce5096bbdda19ca6ac1543cdad4bfb7bef9fcfdefa75ea9a48a88)
blsct_data.range_proof.s_prime: Scalar(71f2f4ef98c06db856707d00063ae8ec4056e65c752dff7a43202e02879eda82)
blsct_data.range_proof.delta_prime: Scalar(5a8ce55526ff2b178b85d113086fa666311002368e34cd4fa577018436049d88)
blsct_data.range_proof.alpha_hat: Scalar(6c99352423c2ff98671fdc97fefc00dc427022c88bab93acf1a5ed2d28311d26)
blsct_data.range_proof.tau_x: Scalar(4193251795eaf35243e68c9fef5dd7cafd3c34bcc0422c5c5b8f825c56767546)
token_id: token=0, subid=18446744073709551615
vector_predicate:
value: 292125
script_pub_key: Script(6a00000000000000ac00000000007400000000000000000001000000)
blsct_data.spending_key: Scalar(4c1258acd66282b7ccc627f7f65e27faac425bfd0001a40100000000ffffffff)
blsct_data.ephemeral_key: Point(c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000)
blsct_data.blinding_key: BlindingKey(4c1258acd66282b7ccc627f7f65e27faac425bfd0001a40100000000ffffffff)
blsct_data.view_tag: 0
blsct_data.range_proof.A: Point(c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000)
blsct_data.range_proof.A_wip: Point(c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000)
blsct_data.range_proof.B: Point(c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000)
blsct_data.range_Proof.r_prime: Scalar(0)
blsct_data.range_proof.s_prime: Scalar(0)
blsct_data.range_proof.delta_prime: Scalar(0)
blsct_data.range_proof.alpha_hat: Scalar(0)
blsct_data.range_proof.tau_x: Scalar(0)
token_id: token=0, subid=18446744073709551615
vector_predicate: 03b8d499d518e3b451b71cfab4d84bf885f46252aed7dc6d9dddc743cd3c996b5f0518596d5292a02980426512f7a31555
>>> ser = ctx.serialize()
>>> deser = CTx.deserialize(ser)
>>> ser == deser.serialize()
True
classmethod deserialize(hex: str) → Self

Deserialize a transaction from a hexadecimal string.

get_ctx_id() → CTxId

Get the transaction ID.

get_ctx_ins() → CTxIns

Get the list of CTxIns.

get_ctx_outs() → CTxOuts

Get the list of CTxOuts.

serialize() → str

Serialize the transaction to a hexadecimal string.