diff options
| author | Max K <[email protected]> | 2019-07-14 19:35:30 +0200 |
|---|---|---|
| committer | GitHub <[email protected]> | 2019-07-14 19:35:30 +0200 |
| commit | cee13699a5676355487f8eb2d91985f63438eae4 (patch) | |
| tree | cf12be6180f950a25ee2ee7f3f2126542835d6e3 /test/functional/test_framework/auxpow_testing.py | |
| parent | Correct build and test net seed (diff) | |
| parent | Handle legacy v2 block at #66064 (diff) | |
| download | discoin-1.17-dev.tar.xz discoin-1.17-dev.zip | |
Merge pull request #1546 from rnicoll/1.17-auxpow1.17-dev
1.17 AuxPoW support
Diffstat (limited to 'test/functional/test_framework/auxpow_testing.py')
| -rw-r--r-- | test/functional/test_framework/auxpow_testing.py | 82 |
1 files changed, 82 insertions, 0 deletions
diff --git a/test/functional/test_framework/auxpow_testing.py b/test/functional/test_framework/auxpow_testing.py new file mode 100644 index 000000000..f1ef056b8 --- /dev/null +++ b/test/functional/test_framework/auxpow_testing.py @@ -0,0 +1,82 @@ +#!/usr/bin/env python3 +# Copyright (c) 2014-2018 Daniel Kraft +# Distributed under the MIT software license, see the accompanying +# file COPYING or http://www.opensource.org/licenses/mit-license.php. + +# Utility routines for auxpow that are needed specifically by the regtests. +# This is mostly about actually *solving* an auxpow block (with regtest +# difficulty) or inspecting the information for verification. + +import binascii + +from test_framework import auxpow + +def computeAuxpow (block, target, ok): + """ + Build an auxpow object (serialised as hex string) that solves + (ok = True) or doesn't solve (ok = False) the block. + """ + + (tx, header) = auxpow.constructAuxpow (block) + (header, _) = mineBlock (header, target, ok) + return auxpow.finishAuxpow (tx, header) + +def mineAuxpowBlock (node): + """ + Mine an auxpow block on the given RPC connection. This uses the + createauxblock and submitauxblock command pair. + """ + + def create (): + addr = node.getnewaddress () + return node.createauxblock (addr) + + return mineAuxpowBlockWithMethods (create, node.submitauxblock) + +def mineAuxpowBlockWithMethods (create, submit): + """ + Mine an auxpow block, using the given methods for creation and submission. + """ + + auxblock = create () + target = auxpow.reverseHex (auxblock['_target']) + apow = computeAuxpow (auxblock['hash'], target, True) + res = submit (auxblock['hash'], apow) + assert res + + return auxblock['hash'] + +def getCoinbaseAddr (node, blockHash): + """ + Extract the coinbase tx' payout address for the given block. + """ + + blockData = node.getblock (blockHash) + txn = blockData['tx'] + assert len (txn) >= 1 + + txData = node.getrawtransaction (txn[0], 1) + assert len (txData['vout']) >= 1 and len (txData['vin']) == 1 + assert 'coinbase' in txData['vin'][0] + + addr = txData['vout'][0]['scriptPubKey']['addresses'] + assert len (addr) == 1 + return addr[0] + +def mineBlock (header, target, ok): + """ + Given a block header, update the nonce until it is ok (or not) + for the given target. + """ + + data = bytearray (binascii.unhexlify (header)) + while True: + assert data[79] < 255 + data[79] += 1 + hexData = binascii.hexlify (data) + + blockhash = auxpow.doubleHashHex (hexData) + if (ok and blockhash < target) or ((not ok) and blockhash > target): + break + + return (hexData, blockhash) |