13 Test behavior of -maxuploadtarget. 15 * Verify that getdata requests for old blocks (>1week) are dropped 16 if uploadtarget has been reached. 17 * Verify that getdata requests for recent blocks are respecteved even 18 if uploadtarget has been reached. 19 * Verify that the upload counters are reset after 24 hours. 26 NodeConnCB.__init__(self)
44 message.block.calc_sha256()
89 parser.add_option(
"--testbinary", dest=
"testbinary",
90 default=os.getenv(
"DASHD",
"dashd"),
91 help=
"dashd binary to test")
99 self.
nodes.append(
start_node(0, self.options.tmpdir, [
"-debug",
"-maxuploadtarget=200",
"-blockmaxsize=999000"]))
105 if len(self.
utxo) < 14:
106 self.
utxo = node.listunspent()
110 inputs.append({
"txid" : t[
"txid"],
"vout" : t[
"vout"]})
111 remchange = t[
"amount"] - Decimal(
"0.001000")
112 outputs[address]=remchange
116 rawtx = node.createrawtransaction(inputs, outputs)
118 newtx = newtx + self.
txouts 119 newtx = newtx + rawtx[94:]
121 signresult = node.signrawtransaction(newtx,
None,
None,
"NONE")
122 txid = node.sendrawtransaction(signresult[
"hex"],
True)
130 old_time = int(time.time() - 2*60*60*24*7)
145 test_nodes[i].add_connection(connections[i])
148 [x.wait_for_verack()
for x
in test_nodes]
157 old_block_size = self.
nodes[0].
getblock(big_old_block,
True)[
'size']
158 big_old_block = int(big_old_block, 16)
168 new_block_size = self.
nodes[0].
getblock(big_new_block)[
'size']
169 big_new_block = int(big_new_block, 16)
175 getdata_request.inv.append(
CInv(2, big_old_block))
177 max_bytes_per_day = 200*1024*1024
178 daily_buffer = 144 * MAX_BLOCK_SIZE
179 max_bytes_available = max_bytes_per_day - daily_buffer
180 success_count = max_bytes_available // old_block_size
184 for i
in xrange(success_count):
185 test_nodes[0].send_message(getdata_request)
186 test_nodes[0].sync_with_ping()
187 assert_equal(test_nodes[0].block_receive_map[big_old_block], i+1)
193 test_nodes[0].send_message(getdata_request)
194 test_nodes[0].wait_for_disconnect()
196 print "Peer 0 disconnected after downloading old block too many times" 201 getdata_request.inv = [
CInv(2, big_new_block)]
202 for i
in xrange(200):
203 test_nodes[1].send_message(getdata_request)
204 test_nodes[1].sync_with_ping()
205 assert_equal(test_nodes[1].block_receive_map[big_new_block], i+1)
207 print "Peer 1 able to repeatedly download new block" 210 getdata_request.inv = [
CInv(2, big_old_block)]
211 test_nodes[1].send_message(getdata_request)
212 test_nodes[1].wait_for_disconnect()
215 print "Peer 1 disconnected after trying to download old block" 217 print "Advancing system time on node to clear counters..." 222 test_nodes[2].sync_with_ping()
223 test_nodes[2].send_message(getdata_request)
224 test_nodes[2].sync_with_ping()
225 assert_equal(test_nodes[2].block_receive_map[big_old_block], 1)
227 print "Peer 2 able to download old block" 229 [c.disconnect_node()
for c
in connections]
232 print "Restarting nodes with -whitelist=127.0.0.1" 234 self.
nodes[0] =
start_node(0, self.options.tmpdir, [
"-debug",
"-whitelist=127.0.0.1",
"-maxuploadtarget=1",
"-blockmaxsize=999000"])
243 test_nodes[i].add_connection(connections[i])
246 [x.wait_for_verack()
for x
in test_nodes]
249 getdata_request.inv = [
CInv(2, big_new_block)]
251 test_nodes[1].send_message(getdata_request)
252 test_nodes[1].sync_with_ping()
253 assert_equal(test_nodes[1].block_receive_map[big_new_block], i+1)
255 getdata_request.inv = [
CInv(2, big_old_block)]
256 test_nodes[1].send_message(getdata_request)
257 test_nodes[1].wait_for_disconnect()
260 print "Peer 1 still connected after trying to download old block (whitelisted)" 262 [c.disconnect_node()
for c
in connections]
264 if __name__ ==
'__main__':
def on_getdata(self, conn, message)
def on_pong(self, conn, message)
def mine_full_block(self, node, address)
UniValue getblock(const UniValue ¶ms, bool fHelp)
def add_options(self, parser)
def wait_until(predicate, attempts=float('inf'), timeout=float('inf'))
UniValue getnewaddress(const UniValue ¶ms, bool fHelp)
def on_block(self, conn, message)
def on_inv(self, conn, message)
def initialize_chain_clean(test_dir, num_nodes)
def sync_with_ping(self, timeout=30)
def start_node(i, dirname, extra_args=None, rpchost=None, timewait=None, binary=None)
def add_connection(self, conn)
UniValue generate(const UniValue ¶ms, bool fHelp)
def send_message(self, message)
def wait_for_disconnect(self)
UniValue getbestblockhash(const UniValue ¶ms, bool fHelp)
UniValue getpeerinfo(const UniValue ¶ms, bool fHelp)
UniValue setmocktime(const UniValue ¶ms, bool fHelp)
def assert_equal(thing1, thing2)
def wait_for_verack(self)