mirror of
https://github.com/bitcoin/bitcoin.git
synced 2025-01-25 10:43:19 -03:00
962ea5c525
c534c08710
[test/crypto] Add FSChaCha20Poly1305 AEAD python implementation (stratospher)c2a458f1c2
[test/crypto] Add FSChaCha20 python implementation (stratospher)c4ea5f6288
[test/crypto] Add RFC 8439's ChaCha20Poly1305 AEAD (stratospher)9fc6e0355e
[test/crypto] Add Poly1305 python implementation (stratospher)fec2ca6c9a
[test/crypto] Use chacha20_block function in `data_to_num3072` (stratospher)0cde60da3a
[test/crypto] Add ChaCha20 python implementation (stratospher)69d3f50ab6
[test/crypto] Add HMAC-based Key Derivation Function (HKDF) (stratospher)08a4a56cbc
[test] Move test framework crypto functions to crypto/ (stratospher) Pull request description: split off from #24748 to keep commits related to cryptography and functional test framework changes separate. This PR adds python implementation and unit tests for HKDF, ChaCha20, Poly1305, ChaCha20Poly1305 AEAD, FSChaCha20 and FSChaCha20Poly1305 AEAD. They're based oncc177ab7bc/bip-0324/reference.py
for easy review. ACKs for top commit: sipa: utACKc534c08710
achow101: ACKc534c08710
theStack: re-ACKc534c08710
Tree-SHA512: 08a0a422d2937eadcf0edfede37e535e6bc4c2e4b192441bbf9bc26dd3f03fa3388effd22f0527c55af173933d0b50e5b2b3d36f2b62d0aca3098728ef06970e
80 lines
3 KiB
Python
Executable file
80 lines
3 KiB
Python
Executable file
#!/usr/bin/env python3
|
|
# Copyright (c) 2020-2022 The Bitcoin Core developers
|
|
# Distributed under the MIT software license, see the accompanying
|
|
# file COPYING or http://www.opensource.org/licenses/mit-license.php.
|
|
"""Test UTXO set hash value calculation in gettxoutsetinfo."""
|
|
|
|
import struct
|
|
|
|
from test_framework.messages import (
|
|
CBlock,
|
|
COutPoint,
|
|
from_hex,
|
|
)
|
|
from test_framework.crypto.muhash import MuHash3072
|
|
from test_framework.test_framework import BitcoinTestFramework
|
|
from test_framework.util import assert_equal
|
|
from test_framework.wallet import MiniWallet
|
|
|
|
class UTXOSetHashTest(BitcoinTestFramework):
|
|
def set_test_params(self):
|
|
self.num_nodes = 1
|
|
self.setup_clean_chain = True
|
|
|
|
def test_muhash_implementation(self):
|
|
self.log.info("Test MuHash implementation consistency")
|
|
|
|
node = self.nodes[0]
|
|
wallet = MiniWallet(node)
|
|
mocktime = node.getblockheader(node.getblockhash(0))['time'] + 1
|
|
node.setmocktime(mocktime)
|
|
|
|
# Generate 100 blocks and remove the first since we plan to spend its
|
|
# coinbase
|
|
block_hashes = self.generate(wallet, 1) + self.generate(node, 99)
|
|
blocks = list(map(lambda block: from_hex(CBlock(), node.getblock(block, False)), block_hashes))
|
|
blocks.pop(0)
|
|
|
|
# Create a spending transaction and mine a block which includes it
|
|
txid = wallet.send_self_transfer(from_node=node)['txid']
|
|
tx_block = self.generateblock(node, output=wallet.get_address(), transactions=[txid])
|
|
blocks.append(from_hex(CBlock(), node.getblock(tx_block['hash'], False)))
|
|
|
|
# Serialize the outputs that should be in the UTXO set and add them to
|
|
# a MuHash object
|
|
muhash = MuHash3072()
|
|
|
|
for height, block in enumerate(blocks):
|
|
# The Genesis block coinbase is not part of the UTXO set and we
|
|
# spent the first mined block
|
|
height += 2
|
|
|
|
for tx in block.vtx:
|
|
for n, tx_out in enumerate(tx.vout):
|
|
coinbase = 1 if not tx.vin[0].prevout.hash else 0
|
|
|
|
# Skip witness commitment
|
|
if (coinbase and n > 0):
|
|
continue
|
|
|
|
data = COutPoint(int(tx.rehash(), 16), n).serialize()
|
|
data += struct.pack("<i", height * 2 + coinbase)
|
|
data += tx_out.serialize()
|
|
|
|
muhash.insert(data)
|
|
|
|
finalized = muhash.digest()
|
|
node_muhash = node.gettxoutsetinfo("muhash")['muhash']
|
|
|
|
assert_equal(finalized[::-1].hex(), node_muhash)
|
|
|
|
self.log.info("Test deterministic UTXO set hash results")
|
|
assert_equal(node.gettxoutsetinfo()['hash_serialized_3'], "d1c7fec1c0623f6793839878cbe2a531eb968b50b27edd6e2a57077a5aed6094")
|
|
assert_equal(node.gettxoutsetinfo("muhash")['muhash'], "d1725b2fe3ef43e55aa4907480aea98d406fc9e0bf8f60169e2305f1fbf5961b")
|
|
|
|
def run_test(self):
|
|
self.test_muhash_implementation()
|
|
|
|
|
|
if __name__ == '__main__':
|
|
UTXOSetHashTest().main()
|