コード例 #1
0
ファイル: test_btcrelay.py プロジェクト: zhihua1607/btcrelay
    def testVerifyTxInitialParent(self):
        forkPrevHash = 0x000000000000000006a320d752b46b532ec0f3f815c5dae467aff5715a6e579e
        forkPrevNum = 363730
        self.c.setInitialParent(forkPrevHash, forkPrevNum, 1)

        # store 6 blocks, which equals the 6 confirmations required by verifyTx()
        with open('test/headers/fork/20150704/6headers.bin') as dataFile:
            for i in range(6):
                blockHeaderBytes = dataFile.read(80)
                res = self.c.storeBlockHeader(blockHeaderBytes)
                assert res == i+1+forkPrevNum
        assert self.c.getChainWork() == 49402014931*6 + 1

        txInBlockZero = argsForVerifyTx(*self.tx1ofBlock363730())
        with pytest.raises(tester.TransactionFailed):
            self.c.helperVerifyHash__(*txInBlockZero)
コード例 #2
0
ファイル: test_btcrelay.py プロジェクト: zhihua1607/btcrelay
    def testVerifySuccessAfterReorg(self):
        forkGrandParent = 0x000000000000000011e40c5deb1a1e3438b350ea3db3fa2dedd285db9650a6e6
        forkPrevHash = 0x000000000000000006a320d752b46b532ec0f3f815c5dae467aff5715a6e579e
        forkPrevNum = 363730
        self.c.setInitialParent(forkGrandParent, forkPrevNum-1, 1)

        forkPrevHashHeader = "03000000e6a65096db85d2ed2dfab33dea50b338341e1aeb5d0ce411000000000000000098420532fa55a0bca5f043f8f8f16a2b73761e822178692cb99ced039e2a32a0ea3f97558e4116183a9cc34a"
        assert self.c.storeBlockHeader(forkPrevHashHeader.decode('hex')) == forkPrevNum

        # insert the 6 blocks from the fork that will be orphaned
        fakeb1 = 0
        fakeb6 = 0

        with open('test/headers/fork/20150704/6headers.bin') as dataFile:
            for i in range(1, 7):
                blockHeaderBytes = dataFile.read(80)
                res = self.c.storeBlockHeader(blockHeaderBytes)

                fakeb1 = dblSha256Flip(blockHeaderBytes) if i==1 else fakeb1
                fakeb6 = dblSha256Flip(blockHeaderBytes) if i==6 else fakeb6

                # print('@@@@ chain score: ' + str(self.c.getChainWork()))
                assert res == i+forkPrevNum

        chainWork = self.c.getChainWork()
        assert chainWork == 49402014931*7 + 1  # 1 is the initial score

        #
        # fakeB1 is within6confirms so should NOT verify
        #
        txIndex = 1
        fakeB1 = 0x00000000000000000c28e23330c29046f19e817fe8fe039f4044b2b2882aef53
        fakeTxB1 = 0x3f637aff97a70c89dd279fe14dbd45fda00fe22027f7937d43737464baa247a7
        # Ran this offline since 99 txs in fake 363731
        # merkleProof = merkle_prove('3f637aff97a70c89dd279fe14dbd45fda00fe22027f7937d43737464baa247a7')
        merkleProof = {'siblings': ['54a0adf1fa1645aece159cc08593c2302b032e6e0cb5ab437df7134f1cbb59db', 'd27b7c208f92e9ac0caa6d2011cf09271c25a2a63a4a1df4dee5f451ca47b680', '626a0941ee37afccd19015a429f96df232f9ff54c350fc760ba3a13ae3efd609', '64fd56ba7d5f5e3f7d3e9f3c98a6b6ff487e22ddb64aeecddf5eb048db516b17', 'c6ef6fe56abb6d1cbbe042bf1fb304bb708a1f05a4805c451e3680b671c01a7d', '30b0f61f406f37346f002d9eed518dd22aed68c111c3e6543d013703813f2662', '26ec8b0a87da3335f773c35c308c85867733f7e93c185c164aab3f9d3e42730a', '31535344a3d72372df8321540c38f58881d6e49b0b64a69a9bf2b80fa4e31c0f', '96e441b6876b3f72394b4c1e5e4f851df4ba4cd186801879b13873183bbb1968', 'c23c775e159c2af628e4a90d4657557b2cb15212e0ef3b23caf1187e8d779646', 'c6a1286ef43a26b5f9bed22ddad0d9fcae79fb380bdeb43236e8f41e1deab13f'], 'hash': u'3f637aff97a70c89dd279fe14dbd45fda00fe22027f7937d43737464baa247a7', 'header': {'nonce': 992806987, 'hash': u'00000000000000000c28e23330c29046f19e817fe8fe039f4044b2b2882aef53', 'timestamp': 1435977973, 'merkle_root': u'cf159bb2dc81a0237359fa31606aa89ae8b9abd0e08e8e86e5cb6c42fc2b8622', 'version': 3, 'prevhash': u'000000000000000006a320d752b46b532ec0f3f815c5dae467aff5715a6e579e', 'bits': 404111758}}
        assert int(merkleProof['hash'], 16) == fakeTxB1
        assert int(merkleProof['header']['hash'], 16) == fakeB1


        eventArr = []
        self.s.block.log_listeners.append(lambda x: eventArr.append(self.c._translator.listen(x)))

        argsArr = argsForVerifyTx(merkleProof, txIndex)
        res = self.c.helperVerifyHash__(*argsArr)
        assert eventArr == [{'_event_type': 'VerifyTransaction',
            'txHash': argsArr[0],
            'returnCode': self.ERR_CHAIN
            }]
        eventArr.pop()
        assert res == self.ERR_CHAIN

        # verifyTx should only return 1 for b0
        txInBlockZero = argsForVerifyTx(*self.tx1ofBlock363730())
        assert self.c.helperVerifyHash__(*txInBlockZero) == 1
        eventArr.pop()  # pop the VerifyTransaction success event

        assert fakeb6 == self.c.getBlockchainHead()

        #
        # insert the blocks that will cause reorg as main chain
        #
        headers = [
            "030000009e576e5a71f5af67e4dac515f8f3c02e536bb452d720a306000000000000000022862bfc426ccbe5868e8ee0d0abb9e89aa86a6031fa597323a081dcb29b15cff54897558e4116184b082d3b",
            "0300000053ef2a88b2b244409f03fee87f819ef14690c23033e2280c00000000000000009e90b9ad092c3f37393f163f70fcc054cbc7dc38210f213840fa9cf9791493b3954997558e4116186d536b51",
            "03000000d691c32ec84e22c0b9c8fbec184c0ec5f113b16e21e04212000000000000000092ccf4a5399e2436948a6917471135340a51967704bff3c55e57f5f0af6ca7d4275397558e411618d0abe918",
            "03000000eea345978c6b095148670d6128e1cc9069ac6bb3075c35060000000000000000b00ecf72f6d247a60eca5fc70d760939139cc0bc008d483c90b43e22596e0ed1dc5497558e41161884e655a3",
            "0300000036191cd0a5e5b1f04dec4cbb97170883fa621013e18a35150000000000000000d8f418aa2714981e26938ccd1620649a5c6fbe839eabc133ac0fac49deafe7dcb75597558e41161810d85d32",
            "03000000deab448a286a2873fcb3eac032aa1fbb13b7c96a3f24950600000000000000005df3fffaf0b0d3db741bf96cbf35830e3497f0634c819779281b4a2e5d301d65cd5697558e411618983a2772",

            "0300000033c784021ffbbdfff3bea3b4b9a7caa7f4f8c60713f7bc0300000000000000006e28294eb3195a9fe49845bd090bd69afe1e2b9301a8da1c27fd14a819d86da9a25797558e4116181625905a"
        ]
        blockHeaderBytes = map(lambda x: x.decode('hex'), headers)
        for i in range(6):  # only 6 blocks first
            res = self.c.storeBlockHeader(blockHeaderBytes[i])
            # print('@@@@ real chain score: ' + str(self.c.getChainWork()))
            assert res == i+1+forkPrevNum
            eventArr.pop()  # pop the StoreHeader success event

        assert self.c.getChainWork() == chainWork  # chainWork should not change
        assert self.c.getBlockchainHead() == dblSha256Flip(blockHeaderBytes[-2])

        txInBlockOne = argsForVerifyTx(*self.tx1ofBlock363731())
        assert self.c.helperVerifyHash__(*txInBlockOne) == self.ERR_CONFIRMATIONS
        assert eventArr == [{'_event_type': 'VerifyTransaction',
            'txHash': txInBlockOne[0],
            'returnCode': self.ERR_CONFIRMATIONS
            }]
        eventArr.pop()


        # b0 should still verify
        assert self.c.helperVerifyHash__(*txInBlockZero) == 1

        # add another header and b1 should now verify
        assert self.c.storeBlockHeader(blockHeaderBytes[-1]) == 363737
        assert self.c.helperVerifyHash__(*txInBlockOne) == 1

        # b0 should still verify
        assert self.c.helperVerifyHash__(*txInBlockZero) == 1
コード例 #3
0
ファイル: test_btcrelay.py プロジェクト: zhihua1607/btcrelay
    def testTwiceReorg(self):
        # we want to store real headers from 363729 so that at 363735 we
        # can verify a tx in 363730 (which requires examining 363729, and
        # will raise TransactionFailed unless 363729 has been stored)
        forkGrandParent = 0x000000000000000011e40c5deb1a1e3438b350ea3db3fa2dedd285db9650a6e6
        forkPrevHash = 0x000000000000000006a320d752b46b532ec0f3f815c5dae467aff5715a6e579e
        forkPrevNum = 363730
        self.c.setInitialParent(forkGrandParent, forkPrevNum-1, 1)

        forkPrevHashHeader = "03000000e6a65096db85d2ed2dfab33dea50b338341e1aeb5d0ce411000000000000000098420532fa55a0bca5f043f8f8f16a2b73761e822178692cb99ced039e2a32a0ea3f97558e4116183a9cc34a"
        assert self.c.storeBlockHeader(forkPrevHashHeader.decode('hex')) == forkPrevNum

        headers = [
            "030000009e576e5a71f5af67e4dac515f8f3c02e536bb452d720a306000000000000000022862bfc426ccbe5868e8ee0d0abb9e89aa86a6031fa597323a081dcb29b15cff54897558e4116184b082d3b",
            "0300000053ef2a88b2b244409f03fee87f819ef14690c23033e2280c00000000000000009e90b9ad092c3f37393f163f70fcc054cbc7dc38210f213840fa9cf9791493b3954997558e4116186d536b51",
            "03000000d691c32ec84e22c0b9c8fbec184c0ec5f113b16e21e04212000000000000000092ccf4a5399e2436948a6917471135340a51967704bff3c55e57f5f0af6ca7d4275397558e411618d0abe918",
            "03000000eea345978c6b095148670d6128e1cc9069ac6bb3075c35060000000000000000b00ecf72f6d247a60eca5fc70d760939139cc0bc008d483c90b43e22596e0ed1dc5497558e41161884e655a3",
            "0300000036191cd0a5e5b1f04dec4cbb97170883fa621013e18a35150000000000000000d8f418aa2714981e26938ccd1620649a5c6fbe839eabc133ac0fac49deafe7dcb75597558e41161810d85d32",

            "03000000deab448a286a2873fcb3eac032aa1fbb13b7c96a3f24950600000000000000005df3fffaf0b0d3db741bf96cbf35830e3497f0634c819779281b4a2e5d301d65cd5697558e411618983a2772",

            "0300000033c784021ffbbdfff3bea3b4b9a7caa7f4f8c60713f7bc0300000000000000006e28294eb3195a9fe49845bd090bd69afe1e2b9301a8da1c27fd14a819d86da9a25797558e4116181625905a"
        ]
        blockHeaderBytes = map(lambda x: x.decode('hex'), headers)
        for i in range(5):  # store only 5 blocks first
            res = self.c.storeBlockHeader(blockHeaderBytes[i])
            # print('@@@@ real chain score: ' + str(self.c.getChainWork()))
            assert res == i+1+forkPrevNum

        chainWork = self.c.getChainWork()
        assert chainWork == 49402014931*6 + 1  # 1 is the initial score

        #
        # store 5 'fake' blocks
        #
        with open('test/headers/fork/20150704/6headers.bin') as dataFile:
            for i in range(5):
                res = self.c.storeBlockHeader(dataFile.read(80))

                # print('@@@@ chain score: ' + str(self.c.getChainWork()))
                assert res == i+1+forkPrevNum

        assert self.c.getChainWork() == chainWork

        txInBlockZero = argsForVerifyTx(*self.tx1ofBlock363730())
        assert self.c.helperVerifyHash__(*txInBlockZero) == self.ERR_CONFIRMATIONS

        #
        # add 6th (fake) block and txInBlockZero should succeed verification
        #
        with open('test/headers/fork/20150704/6headers.bin') as dataFile:
            dataFile.seek(80*5)
            res = self.c.storeBlockHeader(dataFile.read(80))
            assert res == forkPrevNum + 6

        assert self.c.getChainWork() == 49402014931*7 + 1
        assert self.c.helperVerifyHash__(*txInBlockZero) == 1

        #
        # add newBlock6 with same difficulty as current block6
        # and txInBlockZero should still succeed verification
        #
        assert self.c.storeBlockHeader(blockHeaderBytes[-2]) == 363736
        assert self.c.getBlockchainHead() == dblSha256Flip(blockHeaderBytes[-2])
        assert self.c.helperVerifyHash__(*txInBlockZero) == 1

        txInBlockOne = argsForVerifyTx(*self.tx1ofBlock363731())
        assert self.c.helperVerifyHash__(*txInBlockOne) == self.ERR_CONFIRMATIONS

        #
        # add block7 and txInBlockOne should now succeed verification
        #
        assert self.c.storeBlockHeader(blockHeaderBytes[-1]) == 363737
        assert self.c.getBlockchainHead() == dblSha256Flip(blockHeaderBytes[-1])
        assert self.c.helperVerifyHash__(*txInBlockOne) == 1