Beispiel #1
0
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")
Beispiel #2
0
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]))
Beispiel #3
0
def simple_addition_unlocking_script(nsum, n2, n1):
    assert (n1 + n2 == nsum)
    return bytes([op_number(n1)])
Beispiel #4
0
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])
Beispiel #5
0
        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)