Add test for superfluous witness record in deserialization
This commit is contained in:
parent
25b0786581
commit
cc556e4a30
1 changed files with 29 additions and 0 deletions
|
@ -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()
|
||||
|
|
Loading…
Reference in a new issue