obelisk

Electrum server using libbitcoin as its backend
git clone https://git.parazyd.org/obelisk
Log | Files | Refs | README | LICENSE

commit cfe0a0a83174c3c6630a321b8932c253119fade4
parent 4eb88b8f6066b303e804ad0212645dae3d6ae124
Author: parazyd <parazyd@dyne.org>
Date:   Mon, 19 Apr 2021 11:35:14 +0200

zeromq/history4: Mitigate bug when duplicate transactions appear.

This is not a very efficient solution, but it's the best I can do now.
I also added the problematic scripthash in the test suite.

Diffstat:
Mobelisk/zeromq.py | 9++++++++-
Mtests/test_electrum_protocol.py | 3+++
2 files changed, 11 insertions(+), 1 deletion(-)

diff --git a/obelisk/zeromq.py b/obelisk/zeromq.py @@ -380,7 +380,14 @@ class Client: correlated_points = Client.__correlate(points) # self.log.debug("history points: %s", points) # self.log.debug("history correlated: %s", correlated_points) - return error_code, self._sort_correlated_points(correlated_points) + + # BUG: In libbitcoin v4 sometimes transactions mess up and double + # The following is not a very efficient solution + correlated = [ + i for n, i in enumerate(correlated_points) + if i not in correlated_points[n + 1:] + ] + return error_code, self._sort_correlated_points(correlated) @staticmethod def _sort_correlated_points(points): diff --git a/tests/test_electrum_protocol.py b/tests/test_electrum_protocol.py @@ -140,6 +140,7 @@ async def test_scripthash_get_balance(protocol, writer, method): params = [ ["c036b0ff3ad79662cd517cd5fe1fa0af07377b9262d16f276f11ced69aaa6921"], ["92dd1eb7c042956d3dd9185a58a2578f61fee91347196604540838ccd0f8c08c"], + ["b97b504af8fcf94a47d3ae5a346d38220f0751732d9b89a413568bfbf4b36ec6"], ] for i in params: expect = get_expect(method, i) @@ -150,6 +151,7 @@ async def test_scripthash_get_balance(protocol, writer, method): async def test_scripthash_get_history(protocol, writer, method): params = [ ["c036b0ff3ad79662cd517cd5fe1fa0af07377b9262d16f276f11ced69aaa6921"], + ["b97b504af8fcf94a47d3ae5a346d38220f0751732d9b89a413568bfbf4b36ec6"], ] for i in params: expect = get_expect(method, i) @@ -161,6 +163,7 @@ async def test_scripthash_listunspent(protocol, writer, method): params = [ ["c036b0ff3ad79662cd517cd5fe1fa0af07377b9262d16f276f11ced69aaa6921"], ["92dd1eb7c042956d3dd9185a58a2578f61fee91347196604540838ccd0f8c08c"], + ["b97b504af8fcf94a47d3ae5a346d38220f0751732d9b89a413568bfbf4b36ec6"], ] for i in params: # Blockstream is broken here and doesn't return in ascending order.