OP_HASH160, hash160, OP_EQUALの処理を追加する
else: stack.append(cmd) if len(cmds) == 3 and cmds[0] == 0xa9 \ and type(cmds[1]) == bytes and len(cmds[1]) == 20 \ and cmds[2] == 0x87: cmds.pop() if not op_hash160(stack): return False stack.append(h160) if not op_equal(stack): return False if not op_verify(stack): LOGGER.info('bad p2sh h160') return False redeem_script = encode_varint(len(cmd)) + cmd stream = ByteIO(redeem_script) cmds.extend(Script.parse(stream).cmds)
p2shの特徴は、RedeemScriptが長くともOP_PUSHDATA2の最大長520byteである点
複雑なロジックを定義するスクリプトにすることができる。
### p2shのアドレス
p2shアドレスを計算するには、p2pkhアドレスの計算方法と類似したプロセスを用いる
hash160の前にプレフィックスバイトを、末尾にチェックサムを追加する
メインネットのp2shはプレフィックスバイトに0x05、Base58のアドレスは3から始まる
テストネットのp2shのプレフィックスバイトに0xc4を使用するため、アドレスは2から始まる
from helper import encode_base58_checksum h160 = bytes.fromhex('74d691da1574e6b3c192ecfb52cc8984ee7b6c56') print(encode_base58_checksum(b'\x05' + h160))
$ python3 test.py
3CLoMMyuoDQTPRD3XYZtCvgvkadrAdvdXh
p2pkhとp2shのアドレス
def h160_to_p2pkh_address(h160, testnet=False): if testnet: prefix = b'\x6f' else: prefix = b'\x00' return encode_base58_checksum(prefix + h160) def h160_to_p2sh_address(h160, testnet=False): if testnet: prefix = b'\xc4' else: prefix = b'\x05' return encode_base58_checksum(prefix + h160)