message: Add test for superfluous witness record in deserialization
diff: @@ -36,6 +36,7 @@ from test_framework.messages import (
  ser_vector,
  sha256,
  uint256_from_str,
  + FromHex,
  )
  from test_framework.mininode import (
  P2PInterface,
  @@ -77,6 +78,7 @@ from test_framework.util import (
  disconnect_nodes,
  get_bip9_status,
  hex_str_to_bytes,
  + assert_raises_rpc_error,
  )
  # The versionbit bit used to signal activation of SegWit
  @@ -269,6 +271,7 @@ class SegWitTest(BitcoinTestFramework):
  self.test_non_standard_witness()
  self.test_upgrade_after_activation()
  self.test_witness_sigops()
  + self.test_superfluous_witness()
  # Individual tests
  @@ -2034,5 +2037,31 @@ class SegWitTest(BitcoinTestFramework):
  # TODO: test p2sh sigop counting
  + def test_superfluous_witness(self):
  + # Serialization of tx that puts witness flag to 1 always
  + def serialize_with_bogus_witness(tx):
  + flags = 1
  + r = b""
  + r += struct.pack("<i", tx.nVersion)
  + if flags:
  + dummy = []
  + r += ser_vector(dummy)
  + r += struct.pack("<B", flags)
  + r += ser_vector(tx.vin)
  + r += ser_vector(tx.vout)
  + if flags & 1:
  + if (len(tx.wit.vtxinwit) != len(tx.vin)):
  + # vtxinwit must have the same length as vin
  + tx.wit.vtxinwit = tx.wit.vtxinwit[:len(tx.vin)]
  + for i in range(len(tx.wit.vtxinwit), len(tx.vin)):
  + tx.wit.vtxinwit.append(CTxInWitness())
  + r += tx.wit.serialize()
  + r += struct.pack("<I", tx.nLockTime)
  + return r
  +
  + raw = self.nodes[0].createrawtransaction([{"txid":"00"*32, "vout":0}], {self.nodes[0].getnewaddress():1})
  + tx = FromHex(CTransaction(), raw)
  + assert_raises_rpc_error(-22, "TX decode failed", self.nodes[0].decoderawtransaction, serialize_with_bogus_witness(tx).hex())
  +
  if __name__ == '__main__':
  SegWitTest().main()
  