mempool_datacarrier.py
1 #!/usr/bin/env python3 2 # Copyright (c) 2020-2022 The Bitcoin Core developers 3 # Distributed under the MIT software license, see the accompanying 4 # file COPYING or http://www.opensource.org/licenses/mit-license.php. 5 """Test datacarrier functionality""" 6 from test_framework.messages import ( 7 CTxOut, 8 MAX_OP_RETURN_RELAY, 9 ) 10 from test_framework.script import ( 11 CScript, 12 OP_RETURN, 13 ) 14 from test_framework.test_framework import BitcoinTestFramework 15 from test_framework.test_node import TestNode 16 from test_framework.util import assert_raises_rpc_error 17 from test_framework.wallet import MiniWallet 18 19 from random import randbytes 20 21 22 class DataCarrierTest(BitcoinTestFramework): 23 def set_test_params(self): 24 self.num_nodes = 4 25 self.extra_args = [ 26 [], 27 ["-datacarrier=0"], 28 ["-datacarrier=1", f"-datacarriersize={MAX_OP_RETURN_RELAY - 1}"], 29 ["-datacarrier=1", f"-datacarriersize=2"], 30 ] 31 32 def test_null_data_transaction(self, node: TestNode, data, success: bool) -> None: 33 tx = self.wallet.create_self_transfer(fee_rate=0)["tx"] 34 data = [] if data is None else [data] 35 tx.vout.append(CTxOut(nValue=0, scriptPubKey=CScript([OP_RETURN] + data))) 36 tx.vout[0].nValue -= tx.get_vsize() # simply pay 1sat/vbyte fee 37 38 tx_hex = tx.serialize().hex() 39 40 if success: 41 self.wallet.sendrawtransaction(from_node=node, tx_hex=tx_hex) 42 assert tx.rehash() in node.getrawmempool(True), f'{tx_hex} not in mempool' 43 else: 44 assert_raises_rpc_error(-26, "scriptpubkey", self.wallet.sendrawtransaction, from_node=node, tx_hex=tx_hex) 45 46 def run_test(self): 47 self.wallet = MiniWallet(self.nodes[0]) 48 49 # By default, only 80 bytes are used for data (+1 for OP_RETURN, +2 for the pushdata opcodes). 50 default_size_data = randbytes(MAX_OP_RETURN_RELAY - 3) 51 too_long_data = randbytes(MAX_OP_RETURN_RELAY - 2) 52 small_data = randbytes(MAX_OP_RETURN_RELAY - 4) 53 one_byte = randbytes(1) 54 zero_bytes = randbytes(0) 55 56 self.log.info("Testing null data transaction with default -datacarrier and -datacarriersize values.") 57 self.test_null_data_transaction(node=self.nodes[0], data=default_size_data, success=True) 58 59 self.log.info("Testing a null data transaction larger than allowed by the default -datacarriersize value.") 60 self.test_null_data_transaction(node=self.nodes[0], data=too_long_data, success=False) 61 62 self.log.info("Testing a null data transaction with -datacarrier=false.") 63 self.test_null_data_transaction(node=self.nodes[1], data=default_size_data, success=False) 64 65 self.log.info("Testing a null data transaction with a size larger than accepted by -datacarriersize.") 66 self.test_null_data_transaction(node=self.nodes[2], data=default_size_data, success=False) 67 68 self.log.info("Testing a null data transaction with a size smaller than accepted by -datacarriersize.") 69 self.test_null_data_transaction(node=self.nodes[2], data=small_data, success=True) 70 71 self.log.info("Testing a null data transaction with no data.") 72 self.test_null_data_transaction(node=self.nodes[0], data=None, success=True) 73 self.test_null_data_transaction(node=self.nodes[1], data=None, success=False) 74 self.test_null_data_transaction(node=self.nodes[2], data=None, success=True) 75 self.test_null_data_transaction(node=self.nodes[3], data=None, success=True) 76 77 self.log.info("Testing a null data transaction with zero bytes of data.") 78 self.test_null_data_transaction(node=self.nodes[0], data=zero_bytes, success=True) 79 self.test_null_data_transaction(node=self.nodes[1], data=zero_bytes, success=False) 80 self.test_null_data_transaction(node=self.nodes[2], data=zero_bytes, success=True) 81 self.test_null_data_transaction(node=self.nodes[3], data=zero_bytes, success=True) 82 83 self.log.info("Testing a null data transaction with one byte of data.") 84 self.test_null_data_transaction(node=self.nodes[0], data=one_byte, success=True) 85 self.test_null_data_transaction(node=self.nodes[1], data=one_byte, success=False) 86 self.test_null_data_transaction(node=self.nodes[2], data=one_byte, success=True) 87 self.test_null_data_transaction(node=self.nodes[3], data=one_byte, success=False) 88 89 90 if __name__ == '__main__': 91 DataCarrierTest().main()