def create_memo_script(prefix, content): ''' prefix (int): action code content (list of str) ''' prefix_bytes = prefix.to_bytes(2, 'big') if prefix in (MEMO_SET_PROFILE_NAME, MEMO_POST, MEMO_SET_PROFILE_TEXT, MEMO_SET_PROFILE_PICTURE, MEMO_POST_IN_TOPIC, MEMO_FOLLOW_TOPIC, MEMO_UNFOLLOW_TOPIC): return (bytes([OP_RETURN]) + push_data(prefix_bytes) + bytes().join(push_data(d.encode('utf-8')) for d in content)) elif prefix in (MEMO_REPLY, MEMO_LIKE_AND_TIP, MEMO_ADD_POLL_OPTION, MEMO_VOTE_IN_POLL): return ( bytes([OP_RETURN]) + push_data(prefix_bytes) + push_data(bytes.fromhex(content[0])[::-1]) + bytes().join(push_data(d.encode('utf-8')) for d in content[1:])) elif prefix in (MEMO_FOLLOW_USER, MEMO_UNFOLLOW_USER, MEMO_SEND_MONEY): return ( bytes([OP_RETURN]) + push_data(prefix_bytes) + push_data(bytes.fromhex(content[0])) + bytes().join(push_data(d.encode('utf-8')) for d in content[1:])) elif prefix == MEMO_CREATE_POLL: poll_type = op_number(content[0]) option_count = op_number(content[1]) return ( bytes([OP_RETURN]) + push_data(prefix_bytes) + bytes([poll_type, option_count]) + bytes().join(push_data(d.encode('utf-8')) for d in content[2:])) else: raise NullDataError("cannot serialize memo script")
def multisig_locking_script(pubkeys, m): ''' Returns m-of-n multisig locking script (also called redeem script). ''' n = len(pubkeys) if not 1 <= m <= n <= 3: raise ScriptError('{:d}-of-{:d} multisig script not possible'.format( m, n)) OP_m = op_number(m) OP_n = op_number(n) serpubkeys = bytes().join(push_data(pubkey.to_ser()) for pubkey in pubkeys) return (bytes([OP_m]) + serpubkeys + bytes([OP_n, OP_CHECKMULTISIG]))
def simple_addition_unlocking_script(nsum, n2, n1): assert (n1 + n2 == nsum) return bytes([op_number(n1)])
def simple_addition_locking_script(nsum, n2, n1=-1): ''' Simple addition locking script. ''' assert (n1 + n2 == nsum) | (n1 == -1) return bytes([op_number(n2), OP_ADD, op_number(nsum), OP_EQUAL])
raise ScriptError("cannot parse locking script") if __name__ == '__main__': import sys if sys.version_info < (3, 5): sys.exit("Error: Must be using Python 3.5 or higher") print("SHA-1 collision bounty") script = bytes([ OP_2DUP, OP_EQUAL, OP_NOT, OP_VERIFY, OP_SHA1, OP_SWAP, OP_SHA1, OP_EQUAL ]) address = Address.from_script(script) print("script", script.hex()) print("address", address.to_legacy()) script = bytes([op_number(3), OP_ADD, op_number(5), OP_EQUAL]) address = Address.from_script(script) print("script", script.hex()) print("address", address.to_legacy()) print("hash", address.h.hex()) # # P2MS address script = "5121032df7cde5c76b9d8dc36317c74952cc3fdc6d0afb30580ea3b63394497469d47a51ae" address = "m-" + sha256(script.encode('utf-8'))[:16].hex() print("script", script) print("P2MS address", address)