message: test: Properly serialize BIP34 coinbase height
diff: @@ -22,13 +22,14 @@ from .messages import (
  ToHex,
  hash256,
  hex_str_to_bytes,
  - ser_string,
  ser_uint256,
  sha256,
  uint256_from_str,
  )
  from .script import (
  CScript,
  + CScriptNum,
  + CScriptOp,
  OP_0,
  OP_1,
  OP_CHECKMULTISIG,
  @@ -89,20 +90,14 @@ def add_witness_commitment(block, nonce=0):
  block.hashMerkleRoot = block.calc_merkle_root()
  block.rehash()
  -def serialize_script_num(value):
  - r = bytearray(0)
  - if value == 0:
  - return r
  - neg = value < 0
  - absvalue = -value if neg else value
  - while (absvalue):
  - r.append(int(absvalue & 0xff))
  - absvalue >>= 8
  - if r[-1] & 0x80:
  - r.append(0x80 if neg else 0)
  - elif neg:
  - r[-1] |= 0x80
  - return r
  +
  +def script_BIP34_coinbase_height(height):
  + if height <= 16:
  + res = CScriptOp.encode_op_n(height)
  + # Append dummy to increase scriptSig size above 2 (see bad-cb-length consensus rule)
  + return CScript([res, OP_1])
  + return CScript([CScriptNum(height)])
  +
  def create_coinbase(height, pubkey=None):
  """Create a coinbase transaction, assuming no miner fees.
  @@ -110,8 +105,7 @@ def create_coinbase(height, pubkey=None):
  If pubkey is passed in, the coinbase output will be a P2PK output;
  otherwise an anyone-can-spend output."""
  coinbase = CTransaction()
  - coinbase.vin.append(CTxIn(COutPoint(0, 0xffffffff),
  - ser_string(serialize_script_num(height)), 0xffffffff))
  + coinbase.vin.append(CTxIn(COutPoint(0, 0xffffffff), script_BIP34_coinbase_height(height), 0xffffffff))
  coinbaseoutput = CTxOut()
  coinbaseoutput.nValue = 50 * COIN
  halvings = int(height / 150) # regtest
  