Browse Source
0.147ba0a00
Testing: listsinceblock should not use orphan block height. (Karl-Johan Alm)ee5c1ce
Bug-fix: listsinceblock: use closest common ancestor when a block hash was provided for a chain that was not the main chain. (Karl-Johan Alm)
Wladimir J. van der Laan
8 years ago
3 changed files with 95 additions and 4 deletions
@ -0,0 +1,80 @@
@@ -0,0 +1,80 @@
|
||||
#!/usr/bin/env python3 |
||||
# Copyright (c) 2017 The Bitcoin Core developers |
||||
# Distributed under the MIT software license, see the accompanying |
||||
# file COPYING or http://www.opensource.org/licenses/mit-license.php. |
||||
|
||||
from test_framework.test_framework import BitcoinTestFramework |
||||
from test_framework.util import assert_equal |
||||
|
||||
class ListSinceBlockTest (BitcoinTestFramework): |
||||
|
||||
def __init__(self): |
||||
super().__init__() |
||||
self.setup_clean_chain = True |
||||
self.num_nodes = 4 |
||||
|
||||
def run_test (self): |
||||
''' |
||||
`listsinceblock` did not behave correctly when handed a block that was |
||||
no longer in the main chain: |
||||
|
||||
ab0 |
||||
/ \ |
||||
aa1 [tx0] bb1 |
||||
| | |
||||
aa2 bb2 |
||||
| | |
||||
aa3 bb3 |
||||
| |
||||
bb4 |
||||
|
||||
Consider a client that has only seen block `aa3` above. It asks the node |
||||
to `listsinceblock aa3`. But at some point prior the main chain switched |
||||
to the bb chain. |
||||
|
||||
Previously: listsinceblock would find height=4 for block aa3 and compare |
||||
this to height=5 for the tip of the chain (bb4). It would then return |
||||
results restricted to bb3-bb4. |
||||
|
||||
Now: listsinceblock finds the fork at ab0 and returns results in the |
||||
range bb1-bb4. |
||||
|
||||
This test only checks that [tx0] is present. |
||||
''' |
||||
|
||||
assert_equal(self.is_network_split, False) |
||||
self.nodes[2].generate(101) |
||||
self.sync_all() |
||||
|
||||
assert_equal(self.nodes[0].getbalance(), 0) |
||||
assert_equal(self.nodes[1].getbalance(), 0) |
||||
assert_equal(self.nodes[2].getbalance(), 50) |
||||
assert_equal(self.nodes[3].getbalance(), 0) |
||||
|
||||
# Split network into two |
||||
self.split_network() |
||||
assert_equal(self.is_network_split, True) |
||||
|
||||
# send to nodes[0] from nodes[2] |
||||
senttx = self.nodes[2].sendtoaddress(self.nodes[0].getnewaddress(), 1) |
||||
|
||||
# generate on both sides |
||||
lastblockhash = self.nodes[1].generate(6)[5] |
||||
self.nodes[2].generate(7) |
||||
print('lastblockhash=%s' % (lastblockhash)) |
||||
|
||||
self.sync_all() |
||||
|
||||
self.join_network() |
||||
|
||||
# listsinceblock(lastblockhash) should now include tx, as seen from nodes[0] |
||||
lsbres = self.nodes[0].listsinceblock(lastblockhash) |
||||
found = False |
||||
for tx in lsbres['transactions']: |
||||
if tx['txid'] == senttx: |
||||
found = True |
||||
break |
||||
assert_equal(found, True) |
||||
|
||||
if __name__ == '__main__': |
||||
ListSinceBlockTest().main() |
Loading…
Reference in new issue