示例#1
0
文件: Chain.py 项目: Coinaaa/abe
    def parse_decoded_txout_script(chain, decoded):
        if deserialize.match_decoded(decoded, SCRIPT_ADDRESS_TEMPLATE):
            pubkey_hash = decoded[2][1]
            if len(pubkey_hash) == PUBKEY_HASH_LENGTH:
                return SCRIPT_TYPE_ADDRESS, pubkey_hash

        elif deserialize.match_decoded(decoded, SCRIPT_PUBKEY_TEMPLATE):
            pubkey = decoded[0][1]
            return SCRIPT_TYPE_PUBKEY, pubkey

        elif deserialize.match_decoded(decoded, SCRIPT_P2SH_TEMPLATE):
            script_hash = decoded[1][1]
            assert len(script_hash) == PUBKEY_HASH_LENGTH
            return SCRIPT_TYPE_P2SH, script_hash

        elif deserialize.match_decoded(decoded, SCRIPT_BURN_TEMPLATE):
            return SCRIPT_TYPE_BURN, None

        elif len(decoded) >= 4 and decoded[-1][0] == opcodes.OP_CHECKMULTISIG:
            # cf. bitcoin/src/script.cpp:Solver
            n = decoded[-2][0] + 1 - opcodes.OP_1
            m = decoded[0][0] + 1 - opcodes.OP_1
            if 1 <= m <= n <= MAX_MULTISIG_KEYS and len(decoded) == 3 + n and \
                    all([ decoded[i][0] <= opcodes.OP_PUSHDATA4 for i in range(1, 1+n) ]):
                return SCRIPT_TYPE_MULTISIG, \
                    { "m": m, "pubkeys": [ decoded[i][1] for i in range(1, 1+n) ] }

        # Namecoin overrides this to accept name operations.
        return SCRIPT_TYPE_UNKNOWN, decoded
示例#2
0
    def parse_decoded_txout_script(chain, decoded):
        if deserialize.match_decoded(decoded, SCRIPT_ADDRESS_TEMPLATE):
            pubkey_hash = decoded[2][1]
            if len(pubkey_hash) == PUBKEY_HASH_LENGTH:
                return SCRIPT_TYPE_ADDRESS, pubkey_hash

        elif deserialize.match_decoded(decoded, SCRIPT_PUBKEY_TEMPLATE):
            pubkey = decoded[0][1]
            return SCRIPT_TYPE_PUBKEY, pubkey

        elif deserialize.match_decoded(decoded, SCRIPT_P2SH_TEMPLATE):
            script_hash = decoded[1][1]
            assert len(script_hash) == PUBKEY_HASH_LENGTH
            return SCRIPT_TYPE_P2SH, script_hash

        elif deserialize.match_decoded(decoded, SCRIPT_BURN_TEMPLATE):
            return SCRIPT_TYPE_BURN, None

        elif len(decoded) >= 4 and decoded[-1][0] == opcodes.OP_CHECKMULTISIG:
            # cf. bitcoin/src/script.cpp:Solver
            n = decoded[-2][0] + 1 - opcodes.OP_1
            m = decoded[0][0] + 1 - opcodes.OP_1
            if 1 <= m <= n <= MAX_MULTISIG_KEYS and len(decoded) == 3 + n and \
                    all([ decoded[i][0] <= opcodes.OP_PUSHDATA4 for i in range(1, 1+n) ]):
                return SCRIPT_TYPE_MULTISIG, \
                    { "m": m, "pubkeys": [ decoded[i][1] for i in range(1, 1+n) ] }

        # Namecoin overrides this to accept name operations.
        return SCRIPT_TYPE_UNKNOWN, decoded
示例#3
0
def get_multichain_op_drop_data(script):
    """
    Get OP DROP data.
    :param script: script byte data
    :return:
    """
    try:
        decoded = [x for x in deserialize.script_GetOp(script)]
    except Exception:
        return None
    data = None
    if deserialize.match_decoded(decoded, Chain.SCRIPT_MULTICHAIN_TEMPLATE):
        data = decoded[5][1]
    elif deserialize.match_decoded(decoded, Chain.SCRIPT_MULTICHAIN_P2SH_TEMPLATE):
        data = decoded[3][1] # 4th element contains the OP_DROP data.
    return data
示例#4
0
def get_multichain_op_drop_data(script):
    """
    Get OP DROP data.
    :param script: script byte data
    :return:
    """
    try:
        decoded = [x for x in deserialize.script_GetOp(script)]
    except Exception:
        return None
    data = None
    if deserialize.match_decoded(decoded, Chain.SCRIPT_MULTICHAIN_TEMPLATE):
        data = decoded[5][1]
    elif deserialize.match_decoded(decoded,
                                   Chain.SCRIPT_MULTICHAIN_P2SH_TEMPLATE):
        data = decoded[3][1]  # 4th element contains the OP_DROP data.
    return data
示例#5
0
def get_multichain_op_drop_data(script):
    """
    Get OP DROP data.
    :param script: script byte data
    :return:
    """
    try:
        decoded = [x for x in deserialize.script_GetOp(script)]
    except Exception:
        return None
    data = None
    if deserialize.match_decoded(decoded, Chain.SCRIPT_MULTICHAIN_TEMPLATE):
        data = decoded[5][1]
    elif deserialize.match_decoded(decoded, Chain.SCRIPT_MULTICHAIN_P2SH_TEMPLATE):
        data = decoded[3][1]  # 4th element contains the OP_DROP data.
    elif deserialize.match_decoded(decoded, Chain.SCRIPT_MULTICHAIN_STREAM_ITEM_TEMPLATE):
        data = decoded[0][1]  # 1st element contains the creation txid OP_DROP data
    elif deserialize.match_decoded(decoded, Chain.SCRIPT_MULTICHAIN_STREAM_FORMATTED_ITEM_TEMPLATE):
        data = decoded[0][1]  # 1st element contains the creation txid OP_DROP data
    elif deserialize.match_decoded(decoded, Chain.SCRIPT_MULTICHAIN_STREAM_TEMPLATE):
        data = decoded[0][1]  # 1st element contains the OP_DROP data.
    elif deserialize.match_decoded(decoded, Chain.SCRIPT_MULTICHAIN_SPKN_TEMPLATE):
        data = decoded[0][1]  # 1st element contains the OP_DROP data.
    elif deserialize.match_decoded(decoded, Chain.SCRIPT_MULTICHAIN_FOLLOW_ON_ISSUANCE_METADATA_TEMPLATE):
        data = decoded[0][1]  # 1st element contains the OP_DROP data.
    elif len(decoded) >= 3 and decoded[-2][1] and decoded[-2][1].startswith("spkq"):
        data = decoded[-2][1] # element before last contains the OP_DROP data.
    return data
示例#6
0
def get_gamechain_op_drop_data(script):
    """
    Get OP DROP data.
    :param script: script byte data
    :return:
    """
    try:
        decoded = [x for x in deserialize.script_GetOp(script)]
    except Exception:
        return None
    data = None
    if deserialize.match_decoded(decoded, Chain.SCRIPT_GAMECHAIN_TEMPLATE):
        data = decoded[5][1]
    elif deserialize.match_decoded(decoded,
                                   Chain.SCRIPT_GAMECHAIN_P2SH_TEMPLATE):
        data = decoded[3][1]  # 4th element contains the OP_DROP data.
    elif deserialize.match_decoded(
            decoded, Chain.SCRIPT_GAMECHAIN_STREAM_ITEM_TEMPLATE):
        data = decoded[0][
            1]  # 1st element contains the creation txid OP_DROP data
    elif deserialize.match_decoded(decoded,
                                   Chain.SCRIPT_GAMECHAIN_STREAM_TEMPLATE):
        data = decoded[0][1]  # 1st element contains the OP_DROP data.
    elif deserialize.match_decoded(decoded,
                                   Chain.SCRIPT_GAMECHAIN_SPKN_TEMPLATE):
        data = decoded[0][1]  # 1st element contains the OP_DROP data.
    elif deserialize.match_decoded(
            decoded,
            Chain.SCRIPT_GAMECHAIN_FOLLOW_ON_ISSUANCE_METADATA_TEMPLATE):
        data = decoded[0][1]  # 1st element contains the OP_DROP data.
    return data
def get_multichain_op_drop_data(script):
    '''
    Get OP DROP data.
    :param script: script byte data
    :return:
    '''
    try:
        decoded = [x for x in deserialize.script_GetOp(script)]
    except Exception:
        return None
    data = None
    if deserialize.match_decoded(decoded, Chain.SCRIPT_MULTICHAIN_TEMPLATE):
        data = decoded[5][1]
    return data
示例#8
0
def get_multichain_op_drop_data(script):
    '''
    Get OP DROP data.
    :param script: script byte data
    :return:
    '''
    try:
        decoded = [x for x in deserialize.script_GetOp(script)]
    except Exception:
        return None
    data = None
    if deserialize.match_decoded(decoded, Chain.SCRIPT_MULTICHAIN_TEMPLATE):
        data = decoded[5][1]
    return data
示例#9
0
def get_gamechain_op_return_data(script):
    """
    Get OP_RETURN data.
    :param script: script byte data
    :return:
    """
    try:
        decoded = [x for x in deserialize.script_GetOp(script)]
    except Exception:
        return None
    data = None
    if deserialize.match_decoded(decoded,
                                 Chain.SCRIPT_GAMECHAIN_STREAM_TEMPLATE):
        data = decoded[3][1]  # 4th element contains the OP_RETURN data.
    return data
示例#10
0
def get_multichain_op_drop_data(script):
    """
    Get OP DROP data.
    :param script: script byte data
    :return:
    """
    try:
        decoded = [x for x in deserialize.script_GetOp(script)]
    except Exception:
        return None
    data = None
    if deserialize.match_decoded(decoded, Chain.SCRIPT_MULTICHAIN_TEMPLATE):
        data = decoded[5][1]
    elif deserialize.match_decoded(decoded, Chain.SCRIPT_MULTICHAIN_P2SH_TEMPLATE):
        data = decoded[3][1] # 4th element contains the OP_DROP data.
    elif deserialize.match_decoded(decoded, Chain.SCRIPT_MULTICHAIN_STREAM_ITEM_TEMPLATE):
        data = decoded[0][1] # 1st element contains the creation txid OP_DROP data
    elif deserialize.match_decoded(decoded, Chain.SCRIPT_MULTICHAIN_STREAM_TEMPLATE):
        data = decoded[0][1] # 1st element contains the OP_DROP data.
    elif deserialize.match_decoded(decoded, Chain.SCRIPT_MULTICHAIN_SPKN_TEMPLATE):
        data = decoded[0][1] # 1st element contains the OP_DROP data.
    elif deserialize.match_decoded(decoded, Chain.SCRIPT_MULTICHAIN_FOLLOW_ON_ISSUANCE_METADATA_TEMPLATE):
        data = decoded[0][1] # 1st element contains the OP_DROP data.
    return data