/ test / functional / mempool_datacarrier.py
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()