URI: 
       ttest_verifier.py - electrum - Electrum Bitcoin wallet
  HTML git clone https://git.parazyd.org/electrum
   DIR Log
   DIR Files
   DIR Refs
   DIR Submodules
       ---
       ttest_verifier.py (2209B)
       ---
            1 # -*- coding: utf-8 -*-
            2 
            3 from electrum.bitcoin import hash_encode
            4 from electrum.transaction import Transaction
            5 from electrum.util import bfh
            6 from electrum.verifier import SPV, InnerNodeOfSpvProofIsValidTx
            7 
            8 from . import TestCaseForTestnet
            9 
           10 
           11 MERKLE_BRANCH = [
           12     'f2994fd4546086b21b4916b76cf901afb5c4db1c3ecbfc91d6f4cae1186dfe12',
           13     '6b65935528311901c7acda7db817bd6e3ce2f05d1c62c385b7caadb65fac7520']
           14 
           15 MERKLE_ROOT = '11dbac015b6969ea75509dd1250f33c04ec4d562c2d895de139a65f62f808254'
           16 
           17 VALID_64_BYTE_TX = ('0200000001cb659c5528311901a7aada7db817bd6e3ce2f05d1c62c385b7caad'
           18                     'b65fac75201234000000fabcdefa01abcd1234010000000405060708fabcdefa')
           19 assert len(VALID_64_BYTE_TX) == 128
           20 
           21 
           22 class VerifierTestCase(TestCaseForTestnet):
           23     # these tests are regarding the attack described in
           24     # https://lists.linuxfoundation.org/pipermail/bitcoin-dev/2018-June/016105.html
           25 
           26     def test_verify_ok_t_tx(self):
           27         """Actually mined 64 byte tx should not raise."""
           28         t_tx = Transaction(VALID_64_BYTE_TX)
           29         t_tx_hash = t_tx.txid()
           30         self.assertEqual(MERKLE_ROOT, SPV.hash_merkle_root(MERKLE_BRANCH, t_tx_hash, 3))
           31 
           32     def test_verify_fail_f_tx_odd(self):
           33         """Raise if inner node of merkle branch is valid tx. ('odd' fake leaf position)"""
           34         # first 32 bytes of T encoded as hash
           35         fake_branch_node = hash_encode(bfh(VALID_64_BYTE_TX[:64]))
           36         fake_mbranch = [fake_branch_node] + MERKLE_BRANCH
           37         # last 32 bytes of T encoded as hash
           38         f_tx_hash = hash_encode(bfh(VALID_64_BYTE_TX[64:]))
           39         with self.assertRaises(InnerNodeOfSpvProofIsValidTx):
           40             SPV.hash_merkle_root(fake_mbranch, f_tx_hash, 7)
           41 
           42     def test_verify_fail_f_tx_even(self):
           43         """Raise if inner node of merkle branch is valid tx. ('even' fake leaf position)"""
           44         # last 32 bytes of T encoded as hash
           45         fake_branch_node = hash_encode(bfh(VALID_64_BYTE_TX[64:]))
           46         fake_mbranch = [fake_branch_node] + MERKLE_BRANCH
           47         # first 32 bytes of T encoded as hash
           48         f_tx_hash = hash_encode(bfh(VALID_64_BYTE_TX[:64]))
           49         with self.assertRaises(InnerNodeOfSpvProofIsValidTx):
           50             SPV.hash_merkle_root(fake_mbranch, f_tx_hash, 6)