6
6
from test_framework .mininode import *
7
7
from test_framework .test_framework import BitcoinTestFramework
8
8
from test_framework .util import *
9
+ import re
9
10
import time
10
11
from test_framework .blocktools import create_block , create_coinbase
11
12
21
22
VB_TOP_BITS = 0x20000000
22
23
VB_UNKNOWN_BIT = 27 # Choose a bit unassigned to any deployment
23
24
25
+ WARN_UNKNOWN_RULES_MINED = "Unknown block versions being mined! It's possible unknown rules are in effect"
26
+ WARN_UNKNOWN_RULES_ACTIVE = "unknown new rules activated (versionbit {})" .format (VB_UNKNOWN_BIT )
27
+ VB_PATTERN = re .compile ("^Warning.*versionbit" )
28
+
24
29
# TestNode: bare-bones "peer". Used mostly as a conduit for a test to sending
25
30
# p2p messages to a node, generating the messages in the main testing logic.
26
31
class TestNode (NodeConnCB ):
@@ -65,16 +70,12 @@ def __init__(self):
65
70
self .num_nodes = 1
66
71
67
72
def setup_network (self ):
68
- self .nodes = []
69
73
self .alert_filename = os .path .join (self .options .tmpdir , "alert.txt" )
70
74
# Open and close to create zero-length file
71
- with open (self .alert_filename , 'w' ) as f :
75
+ with open (self .alert_filename , 'w' ) as _ :
72
76
pass
73
- self .node_options = ["-debug" , "-logtimemicros=1" , "-alertnotify=echo %s >> \" " + self .alert_filename + "\" " ]
74
- self .nodes .append (start_node (0 , self .options .tmpdir , self .node_options ))
75
-
76
- import re
77
- self .vb_pattern = re .compile ("^Warning.*versionbit" )
77
+ self .extra_args = [["-debug" , "-logtimemicros=1" , "-alertnotify=echo %s >> \" " + self .alert_filename + "\" " ]]
78
+ self .nodes = start_nodes (self .num_nodes , self .options .tmpdir , self .extra_args )
78
79
79
80
# Send numblocks blocks via peer with nVersionToUse set.
80
81
def send_blocks_with_version (self , peer , numblocks , nVersionToUse ):
@@ -83,7 +84,7 @@ def send_blocks_with_version(self, peer, numblocks, nVersionToUse):
83
84
block_time = self .nodes [0 ].getblockheader (tip )["time" ]+ 1
84
85
tip = int (tip , 16 )
85
86
86
- for i in range (numblocks ):
87
+ for _ in range (numblocks ):
87
88
block = create_block (tip , create_coinbase (height + 1 ), block_time )
88
89
block .nVersion = nVersionToUse
89
90
block .solve ()
@@ -96,7 +97,7 @@ def send_blocks_with_version(self, peer, numblocks, nVersionToUse):
96
97
def test_versionbits_in_alert_file (self ):
97
98
with open (self .alert_filename , 'r' ) as f :
98
99
alert_text = f .read ()
99
- assert (self . vb_pattern .match (alert_text ))
100
+ assert (VB_PATTERN .match (alert_text ))
100
101
101
102
def run_test (self ):
102
103
# Setup the p2p connection and start up the network thread.
@@ -122,8 +123,10 @@ def run_test(self):
122
123
# Fill rest of period with regular version blocks
123
124
self .nodes [0 ].generate (VB_PERIOD - VB_THRESHOLD + 1 )
124
125
# Check that we're not getting any versionbit-related errors in
125
- # getinfo()
126
- assert (not self .vb_pattern .match (self .nodes [0 ].getinfo ()["errors" ]))
126
+ # get*info()
127
+ assert (not VB_PATTERN .match (self .nodes [0 ].getinfo ()["errors" ]))
128
+ assert (not VB_PATTERN .match (self .nodes [0 ].getmininginfo ()["errors" ]))
129
+ assert (not VB_PATTERN .match (self .nodes [0 ].getnetworkinfo ()["warnings" ]))
127
130
128
131
# 3. Now build one period of blocks with >= VB_THRESHOLD blocks signaling
129
132
# some unknown bit
@@ -132,8 +135,10 @@ def run_test(self):
132
135
# Might not get a versionbits-related alert yet, as we should
133
136
# have gotten a different alert due to more than 51/100 blocks
134
137
# being of unexpected version.
135
- # Check that getinfo() shows some kind of error.
136
- assert (len (self .nodes [0 ].getinfo ()["errors" ]) != 0 )
138
+ # Check that get*info() shows some kind of error.
139
+ assert (WARN_UNKNOWN_RULES_MINED in self .nodes [0 ].getinfo ()["errors" ])
140
+ assert (WARN_UNKNOWN_RULES_MINED in self .nodes [0 ].getmininginfo ()["errors" ])
141
+ assert (WARN_UNKNOWN_RULES_MINED in self .nodes [0 ].getnetworkinfo ()["warnings" ])
137
142
138
143
# Mine a period worth of expected blocks so the generic block-version warning
139
144
# is cleared, and restart the node. This should move the versionbit state
@@ -142,20 +147,21 @@ def run_test(self):
142
147
stop_node (self .nodes [0 ], 0 )
143
148
wait_bitcoinds ()
144
149
# Empty out the alert file
145
- with open (self .alert_filename , 'w' ) as f :
150
+ with open (self .alert_filename , 'w' ) as _ :
146
151
pass
147
- self .nodes [ 0 ] = start_node ( 0 , self .options .tmpdir , [ "-debug" , "-logtimemicros=1" , "-alertnotify=echo %s >> \" " + self .alert_filename + " \" " ] )
152
+ self .nodes = start_nodes ( self . num_nodes , self .options .tmpdir , self .extra_args )
148
153
149
154
# Connecting one block should be enough to generate an error.
150
155
self .nodes [0 ].generate (1 )
151
- assert (len (self .nodes [0 ].getinfo ()["errors" ]) != 0 )
156
+ assert (WARN_UNKNOWN_RULES_ACTIVE in self .nodes [0 ].getinfo ()["errors" ])
157
+ assert (WARN_UNKNOWN_RULES_ACTIVE in self .nodes [0 ].getmininginfo ()["errors" ])
158
+ assert (WARN_UNKNOWN_RULES_ACTIVE in self .nodes [0 ].getnetworkinfo ()["warnings" ])
152
159
stop_node (self .nodes [0 ], 0 )
153
160
wait_bitcoinds ()
154
161
self .test_versionbits_in_alert_file ()
155
162
156
163
# Test framework expects the node to still be running...
157
- self .nodes [0 ] = start_node (0 , self .options .tmpdir , ["-debug" , "-logtimemicros=1" , "-alertnotify=echo %s >> \" " + self .alert_filename + "\" " ])
158
-
164
+ self .nodes = start_nodes (self .num_nodes , self .options .tmpdir , self .extra_args )
159
165
160
166
if __name__ == '__main__' :
161
167
VersionBitsWarningTest ().main ()
0 commit comments