コード例 #1
0
    def from_human(cls, data):
        hex_str = []
        d = data.split()
        while 1:
            if len(d) == 0:
                break
            word = d[0]
            d = d[1:]

            if word.startswith('PUSHDATA'):
                continue

            opcode = OPCODES_BY_NAME.get(word)
            if opcode:
                hex_str.append(hex(opcode)[2:])
                continue

            # data to be pushed
            pushdata = word

            try:
                i = int(pushdata, 16)
                if pushdata.startswith('0x'):
                    pushdata = pushdata[2:]
                if len(pushdata) % 2 != 0:
                    pushdata = ''.join(['0', pushdata])
            except Exception:
                pushdata = word.encode('hex')
            hex_str.append(push_script(pushdata))

        hex_str = ''.join(hex_str)
        return cls(hex_str.decode('hex'))
コード例 #2
0
ファイル: script.py プロジェクト: aesedepece/hashmal
    def from_human(cls, data):
        hex_str = []
        d = data.split()
        while 1:
            if len(d) == 0:
                break
            word = d[0]
            d = d[1:]

            if word.startswith('PUSHDATA'):
                continue

            opcode = OPCODES_BY_NAME.get(word)
            if opcode:
                hex_str.append(hex(opcode)[2:])
                continue

            # data to be pushed
            pushdata = word

            try:
                i = int(pushdata, 16)
                if pushdata.startswith('0x'):
                    pushdata = pushdata[2:]
                if len(pushdata) % 2 != 0:
                    pushdata = ''.join(['0', pushdata])
            except Exception:
                pushdata = word.encode('hex')
            hex_str.append(push_script(pushdata))

        hex_str = ''.join(hex_str)
        return cls(hex_str.decode('hex'))
コード例 #3
0
def from_string(string):

    # TODO: this should probably go in a util package.
    def ishex(s):
        return set(s).issubset(set('0123456789abcdefABCDEF'))

    r = []

    # Create an opcodes_by_name table with both OP_ prefixed names and
    # shortened ones with the OP_ dropped.
    opcodes_by_name = {}
    for name, code in OPCODES_BY_NAME.items():
        opcodes_by_name[name] = code
        opcodes_by_name[name[3:]] = code

    for word in string.split():
        if word.isdigit() or (word[0] == '-' and word[1:].isdigit()):
            r.append(CScript([int(word)]))
        elif ishex(word):
            word_bytes = unhexlify(word.encode('utf8'))
            push_code = bytes([len(word_bytes)])
            r.append(push_code + word_bytes)

        elif len(word) >= 2 and word[0] == "'" and word[-1] == "'":
            r.append(CScript([bytes(word[1:-1].encode('utf8'))]))
        elif word in opcodes_by_name:
            r.append(CScript([opcodes_by_name[word]]))
        else:
            raise ValueError("Error parsing script: %r" % string)

    return CScript(b''.join(r))
コード例 #4
0
ファイル: parsing.py プロジェクト: ionelmc/coinop-py
def from_string(string):
    def ishex(s):
        return set(s).issubset(set('0123456789abcdefABCDEF'))

    r = []

    # Create an opcodes_by_name table with both OP_ prefixed names and
    # shortened ones with the OP_ dropped.
    opcodes_by_name = {}
    for name, code in OPCODES_BY_NAME.items():
        opcodes_by_name[name] = code
        opcodes_by_name[name[3:]] = code

    for word in string.split():
        if word.isdigit() or (word[0] == '-' and word[1:].isdigit()):
            r.append(CScript([long(word)]))
        elif ishex(word):
            word_bytes = unhexlify(word.encode('utf8'))
            push_code = chr(len(word_bytes))
            r.append(push_code + word_bytes)

        elif len(word) >= 2 and word[0] == "'" and word[-1] == "'":
            r.append(CScript([bytes(word[1:-1].encode('utf8'))]))
        elif word in opcodes_by_name:
            r.append(CScript([opcodes_by_name[word]]))
        else:
            raise ValueError("Error parsing script: %r" % string)

    return CScript(b''.join(r))
コード例 #5
0
ファイル: script.py プロジェクト: mtrajano/hashmal
    def from_human(cls, data):
        hex_str = []
        d = data.split()
        while 1:
            if len(d) == 0:
                break
            word = d[0]
            d = d[1:]

            if word.startswith("PUSHDATA"):
                continue

            found = False
            accepted_forms = [word]
            try:
                a = int(word)
            except ValueError:
                accepted_forms.append("".join(["OP_", word]))

            # e.g. "OP_DUP" and "DUP" are both valid
            for i in accepted_forms:
                opcode = OPCODES_BY_NAME.get(i)
                if opcode:
                    found = True
                    hex_str.append(hex(opcode)[2:])
            if found:
                continue

            # data to be pushed
            pushdata = word

            try:
                i = int(pushdata, 16)
                if pushdata.startswith("0x"):
                    pushdata = pushdata[2:]
                if len(pushdata) % 2 != 0:
                    pushdata = "".join(["0", pushdata])
            except Exception:
                pushdata = word.encode("hex")
            hex_str.append(push_script(pushdata))

        hex_str = "".join(hex_str)
        return cls(hex_str.decode("hex"))
コード例 #6
0
    def from_human(cls, data):
        hex_str = []
        d = data.split()
        while 1:
            if len(d) == 0:
                break
            word = d[0]
            d = d[1:]

            if word.startswith('PUSHDATA'):
                continue

            found = False
            accepted_forms = [word]
            try:
                a = int(word)
            except ValueError:
                accepted_forms.append(''.join(['OP_', word]))

            # e.g. "OP_DUP" and "DUP" are both valid
            for i in accepted_forms:
                opcode = OPCODES_BY_NAME.get(i)
                if opcode:
                    found = True
                    hex_str.append(hex(opcode)[2:])
            if found:
                continue

            # data to be pushed
            pushdata = word

            try:
                i = int(pushdata, 16)
                if pushdata.startswith('0x'):
                    pushdata = pushdata[2:]
                if len(pushdata) % 2 != 0:
                    pushdata = ''.join(['0', pushdata])
            except Exception:
                pushdata = word.encode('hex')
            hex_str.append(push_script(pushdata))

        hex_str = ''.join(hex_str)
        return cls(hex_str.decode('hex'))