mirror of
https://github.com/dashpay/dash.git
synced 2024-12-27 04:52:59 +01:00
ca7ee7c278
3bd8db80d8d335ab63ece4f110b0fadd562e80b7 [validation] fix comments in CheckInputScripts() (John Newbery)
6f6465cefcd599c89c00f7b51f42a4b87a5ffb0b scripted-diff: [validation] Rename CheckInputs to CheckInputScripts (John Newbery)
Pull request description:
CheckInputs() used to check no double spends, scripts & sigs and amounts. Since
832e074
, the double spend and amount checks
have been moved to CheckTxInputs(), and CheckInputs() now just validates
input scripts. Rename the function to CheckInputScripts().
Also fix incorrect comments.
ACKs for top commit:
MarcoFalke:
re-ACK 3bd8db80d8d335ab63ece4f110b0fadd562e80b7, did the rebase myself, checked the scripted diff 👡
promag:
ACK 3bd8db80d8d335ab63ece4f110b0fadd562e80b7 :trollface:
Tree-SHA512: 7b3f8597d210492798fb784ee8ea47ea6377519111190161c7cc34a967509013f4337304f52e9bedc97b7710de7b0ff8880e08cd7f867754567f82e7b02c794c
162 lines
6.4 KiB
Python
Executable File
162 lines
6.4 KiB
Python
Executable File
#!/usr/bin/env python3
|
|
# Copyright (c) 2015-2016 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 BIP65 (CHECKLOCKTIMEVERIFY).
|
|
|
|
Test that the CHECKLOCKTIMEVERIFY soft-fork activates at (regtest) block height
|
|
1351.
|
|
"""
|
|
|
|
from test_framework.blocktools import create_coinbase, create_block, create_transaction
|
|
from test_framework.messages import CTransaction, msg_block, ToHex
|
|
from test_framework.mininode import P2PInterface
|
|
from test_framework.script import CScript, OP_1NEGATE, OP_CHECKLOCKTIMEVERIFY, OP_DROP, CScriptNum
|
|
from test_framework.test_framework import BitcoinTestFramework
|
|
from test_framework.util import (
|
|
assert_equal,
|
|
assert_raises_rpc_error,
|
|
hex_str_to_bytes,
|
|
)
|
|
|
|
from io import BytesIO
|
|
|
|
CLTV_HEIGHT = 1351
|
|
|
|
|
|
def cltv_invalidate(tx):
|
|
'''Modify the signature in vin 0 of the tx to fail CLTV
|
|
|
|
Prepends -1 CLTV DROP in the scriptSig itself.
|
|
|
|
TODO: test more ways that transactions using CLTV could be invalid (eg
|
|
locktime requirements fail, sequence time requirements fail, etc).
|
|
'''
|
|
tx.vin[0].scriptSig = CScript([OP_1NEGATE, OP_CHECKLOCKTIMEVERIFY, OP_DROP] +
|
|
list(CScript(tx.vin[0].scriptSig)))
|
|
|
|
def cltv_validate(node, tx, height):
|
|
'''Modify the signature in vin 0 of the tx to pass CLTV
|
|
Prepends <height> CLTV DROP in the scriptSig, and sets
|
|
the locktime to height'''
|
|
tx.vin[0].nSequence = 0
|
|
tx.nLockTime = height
|
|
|
|
# Need to re-sign, since nSequence and nLockTime changed
|
|
signed_result = node.signrawtransactionwithwallet(ToHex(tx))
|
|
new_tx = CTransaction()
|
|
new_tx.deserialize(BytesIO(hex_str_to_bytes(signed_result['hex'])))
|
|
|
|
new_tx.vin[0].scriptSig = CScript([CScriptNum(height), OP_CHECKLOCKTIMEVERIFY, OP_DROP] +
|
|
list(CScript(new_tx.vin[0].scriptSig)))
|
|
return new_tx
|
|
|
|
|
|
class BIP65Test(BitcoinTestFramework):
|
|
def set_test_params(self):
|
|
self.num_nodes = 1
|
|
self.extra_args = [[
|
|
'-whitelist=noban@127.0.0.1',
|
|
'-dip3params=9000:9000',
|
|
'-par=1', # Use only one script thread to get the exact reject reason for testing
|
|
'-acceptnonstdtxn=1', # cltv_invalidate is nonstandard
|
|
]]
|
|
self.setup_clean_chain = True
|
|
self.rpc_timeout = 120
|
|
|
|
def test_cltv_info(self, *, is_active):
|
|
assert_equal(
|
|
next(s for s in self.nodes[0].getblockchaininfo()['softforks'] if s['id'] == 'bip65'),
|
|
{
|
|
"id": "bip65",
|
|
"version": 4,
|
|
"reject": {
|
|
"status": is_active
|
|
}
|
|
},
|
|
)
|
|
|
|
def skip_test_if_missing_module(self):
|
|
self.skip_if_no_wallet()
|
|
|
|
def run_test(self):
|
|
self.nodes[0].add_p2p_connection(P2PInterface())
|
|
|
|
self.test_cltv_info(is_active=False)
|
|
|
|
self.log.info("Mining %d blocks", CLTV_HEIGHT - 2)
|
|
self.coinbase_txids = [self.nodes[0].getblock(b)['tx'][0] for b in self.nodes[0].generate(CLTV_HEIGHT - 2)]
|
|
self.nodeaddress = self.nodes[0].getnewaddress()
|
|
|
|
self.log.info("Test that an invalid-according-to-CLTV transaction can still appear in a block")
|
|
|
|
spendtx = create_transaction(self.nodes[0], self.coinbase_txids[0],
|
|
self.nodeaddress, amount=1.0)
|
|
cltv_invalidate(spendtx)
|
|
spendtx.rehash()
|
|
|
|
tip = self.nodes[0].getbestblockhash()
|
|
block_time = self.nodes[0].getblockheader(tip)['mediantime'] + 1
|
|
block = create_block(int(tip, 16), create_coinbase(CLTV_HEIGHT - 1), block_time)
|
|
block.nVersion = 3
|
|
block.vtx.append(spendtx)
|
|
block.hashMerkleRoot = block.calc_merkle_root()
|
|
block.solve()
|
|
|
|
self.test_cltv_info(is_active=False)
|
|
self.nodes[0].p2p.send_and_ping(msg_block(block))
|
|
self.test_cltv_info(is_active=False) # Not active as of current tip, but next block must obey rules
|
|
assert_equal(self.nodes[0].getbestblockhash(), block.hash)
|
|
|
|
self.log.info("Test that blocks must now be at least version 4")
|
|
tip = block.sha256
|
|
block_time += 1
|
|
block = create_block(tip, create_coinbase(CLTV_HEIGHT), block_time)
|
|
block.nVersion = 3
|
|
block.solve()
|
|
|
|
with self.nodes[0].assert_debug_log(expected_msgs=['{}, bad-version(0x00000003)'.format(block.hash)]):
|
|
self.nodes[0].p2p.send_and_ping(msg_block(block))
|
|
assert_equal(int(self.nodes[0].getbestblockhash(), 16), tip)
|
|
self.nodes[0].p2p.sync_with_ping()
|
|
|
|
self.log.info("Test that invalid-according-to-cltv transactions cannot appear in a block")
|
|
block.nVersion = 4
|
|
|
|
spendtx = create_transaction(self.nodes[0], self.coinbase_txids[1],
|
|
self.nodeaddress, amount=1.0)
|
|
cltv_invalidate(spendtx)
|
|
spendtx.rehash()
|
|
|
|
# First we show that this tx is valid except for CLTV by getting it
|
|
# rejected from the mempool for exactly that reason.
|
|
assert_raises_rpc_error(-26, 'non-mandatory-script-verify-flag (Negative locktime)', self.nodes[0].sendrawtransaction, spendtx.serialize().hex(), 0)
|
|
|
|
# Now we verify that a block with this transaction is also invalid.
|
|
block.vtx.append(spendtx)
|
|
block.hashMerkleRoot = block.calc_merkle_root()
|
|
block.solve()
|
|
|
|
with self.nodes[0].assert_debug_log(expected_msgs=['CheckInputScripts on {} failed with non-mandatory-script-verify-flag (Negative locktime)'.format(block.vtx[-1].hash)]):
|
|
self.nodes[0].p2p.send_and_ping(msg_block(block))
|
|
assert_equal(int(self.nodes[0].getbestblockhash(), 16), tip)
|
|
self.nodes[0].p2p.sync_with_ping()
|
|
|
|
self.log.info("Test that a version 4 block with a valid-according-to-CLTV transaction is accepted")
|
|
spendtx = cltv_validate(self.nodes[0], spendtx, CLTV_HEIGHT - 1)
|
|
spendtx.rehash()
|
|
|
|
block.vtx.pop(1)
|
|
block.vtx.append(spendtx)
|
|
block.hashMerkleRoot = block.calc_merkle_root()
|
|
block.solve()
|
|
|
|
self.test_cltv_info(is_active=False) # Not active as of current tip, but next block must obey rules
|
|
self.nodes[0].p2p.send_and_ping(msg_block(block))
|
|
self.test_cltv_info(is_active=True) # Active as of current tip
|
|
assert_equal(int(self.nodes[0].getbestblockhash(), 16), block.sha256)
|
|
|
|
|
|
if __name__ == '__main__':
|
|
BIP65Test().main()
|