def test_p2sh() -> None: # https://medium.com/@darosior/bitcoin-raw-transactions-part-2-p2sh-94df206fee8d network = "mainnet" address = "37k7toV1Nv4DfmQbmZ8KuZDQCYK9x5KpzP" script_pub_key = serialize([ "OP_2DUP", "OP_EQUAL", "OP_NOT", "OP_VERIFY", "OP_SHA1", "OP_SWAP", "OP_SHA1", "OP_EQUAL", ]) assert script_pub_key.hex() == "6e879169a77ca787" assert address == b58.p2sh(script_pub_key, network) script_hash = hash160(script_pub_key) assert ("p2sh", script_hash, network) == b58.h160_from_address(address) assert ("p2sh", script_hash, network) == b58.h160_from_address(" " + address + " ") assert script_hash.hex() == "4266fc6f2c2861d7fe229b279a79803afca7ba34" script_sig: List[Command] = ["OP_HASH160", script_hash.hex(), "OP_EQUAL"] serialize(script_sig)
def test_p2sh() -> None: # self-consistency pub_key = "02 cc71eb30d653c0c3163990c47b976f3fb3f37cccdcbedb169a1dfef58bbfbfaf" redeem_script = ScriptPubKey.p2pkh(pub_key).script payload = hash160(redeem_script) script_pub_key = serialize(["OP_HASH160", payload, "OP_EQUAL"]) assert_p2sh(script_pub_key) assert script_pub_key == ScriptPubKey.p2sh(redeem_script).script assert ("p2sh", payload) == type_and_payload(script_pub_key) # base58 address network = "mainnet" addr = b58.p2sh(redeem_script, network) assert addr == address(script_pub_key, network) assert addr == b58.address_from_h160("p2sh", payload, network) # back from the address to the script_pub_key assert script_pub_key == ScriptPubKey.from_address(addr).script assert network == ScriptPubKey.from_address(addr).network # documented test case: https://learnmeabitcoin.com/guide/p2sh payload = bytes.fromhex("748284390f9e263a4b766a75d0633c50426eb875") script_pub_key = bytes.fromhex("a914") + payload + bytes.fromhex("87") assert_p2sh(script_pub_key) addr = "3CK4fEwbMP7heJarmU4eqA3sMbVJyEnU3V" assert addr == address(script_pub_key, network) assert script_pub_key == ScriptPubKey.from_address(addr).script assert network == ScriptPubKey.from_address(addr).network err_msg = "missing final OP_EQUAL" with pytest.raises(BTClibValueError, match=err_msg): assert_p2sh(script_pub_key[:-1] + b"\x40") err_msg = "missing leading OP_HASH160" with pytest.raises(BTClibValueError, match=err_msg): assert_p2sh(b"\x40" + script_pub_key[1:]) err_msg = "invalid redeem script hash length marker: " with pytest.raises(BTClibValueError, match=err_msg): assert_p2sh(script_pub_key[:1] + b"\x40" + script_pub_key[2:])
def test_bip67() -> None: "BIP67 test vectors https://en.bitcoin.it/wiki/BIP_0067" data_folder = path.join(path.dirname(__file__), "_data") filename = path.join(data_folder, "bip67_test_vectors.json") with open(filename, "r") as file_: # json.dump(test_vectors, f, indent=4) test_vectors = json.load(file_) m = 2 for i in test_vectors: keys, addr = test_vectors[i] script_pub_key = ScriptPubKey.p2ms(m, keys, lexi_sort=True).script assert is_p2ms(script_pub_key) assert address(script_pub_key) == "" script_type, payload = type_and_payload(script_pub_key) assert script_type == "p2ms" assert payload == script_pub_key[:-1] errmsg = f"Test vector #{i}" assert addr == b58.p2sh(script_pub_key), errmsg