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'))
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))
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))
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"))
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'))