def merge(): script = bytearray() script.append(Config.getIntValue("SCRIPT_VERSION")) script.append(Opcodes.alias('MERGE', True)) return DataType.serialize(script)
def verifyAtomicSwapLock(): script = bytearray() script.append(Config.getIntValue("SCRIPT_VERSION")) script.append(Opcodes.alias('CHECKATOMICSWAPLOCKVERIFY', True)) return DataType.serialize(script)
def verifyMultiSignature(): script = bytearray() script.append(Config.getIntValue("SCRIPT_VERSION")) script.append(Opcodes.alias('CHECKMULTISIGVERIFY', True)) return DataType.serialize(script)
def isAtomicLock(self): if len(self.script) != Config.getIntValue('SCRIPT_ATOMIC_SWAP_LEN'): return False if self.script[0] != Config.getIntValue('SCRIPT_VERSION', False): return False if self.script[1] != Opcodes.alias('CHECKATOMICSWAPLOCKVERIFY', True): return False return True
def isMultiSig(self): if len(self.script) != Config.getIntValue('SCRIPT_MULTISIG_LEN'): return False if self.script[0] != Config.getIntValue('SCRIPT_VERSION', False): return False if self.script[1] != Opcodes.alias('CHECKMULTISIGVERIFY', True): return False return True
def verifyScript(self, transaction): for txOut in transaction.outputs: script = txOut.script if script == None or len(script) == 0: return False if txOut.hasExtScript(): if len(script) < Config.getIntValue('EXTENSION_SCRIPT_LEN'): return False if script[0] != Config.getIntValue('EXTENSION_SCRIPT_VERSION'): return False else: if len(script) > Config.getIntValue('SCRIPT_LEN'): return False if script[0] != Config.getIntValue('SCRIPT_VERSION', False): return False if script[1] == Opcodes.alias('MERGE', True): if len(script) != Config.getIntValue('SCRIPT_MERGE_LEN'): return False elif script[1] == Opcodes.alias('CHECKMULTISIGVERIFY', True): if len(script) != Config.getIntValue( 'SCRIPT_MULTISIG_LEN'): return False elif script[1] == Opcodes.alias('CHECKATOMICSWAPVERIFY', True): if len(script) != Config.getIntValue( 'SCRIPT_ATOMIC_SWAP_LEN'): return False elif script[1] == Opcodes.alias('CHECKATOMICSWAPLOCKVERIFY', True): if len(script) != Config.getIntValue( 'SCRIPT_ATOMIC_SWAP_LEN'): return False else: if script[1] != Opcodes.alias('DUP1'): return False if script[2] != Opcodes.alias('PUBADDR', True): return False if script[3] != Opcodes.alias('ADDRESS'): return False if script[4] != Opcodes.alias('EQ'): return False if script[5] != Opcodes.alias('VERIFY', True): return False if script[6] != Opcodes.alias('CHECKSIGVERIFY', True): return False return True
def verifySignature(): script = bytearray() script.append(Config.getIntValue("SCRIPT_VERSION")) script.append(Opcodes.alias('DUP1')) script.append(Opcodes.alias('PUBADDR', True)) script.append(Opcodes.alias('ADDRESS')) script.append(Opcodes.alias('EQ')) script.append(Opcodes.alias('VERIFY', True)) script.append(Opcodes.alias('CHECKSIGVERIFY', True)) return DataType.serialize(script)
def execute(self): success = False try: self.pc = 0 while self.pc < len(self.code): element = self.code[self.pc] self.currOpcode = Opcodes.fetch(element, self.override) self.gasRemaining -= self.currOpcode.gas print(self.currOpcode.method, self.currOpcode.code, self.pc, self.gasRemaining) if self.gasRemaining >= 0: method = getattr(self, self.currOpcode.method) method() self.step() else: self.pc = len(self.code) self.invalid = True if self.invalid: success = False else: if self.output.hasExtScript() or self.merge: _address = self.output.address if self.overrideAddress == None else self.overrideAddress _script = self.output.script if self.overrideScript == None else self.overrideScript _value = self.output.value if self.overrideValue == None else self.overrideValue if self.deploy and not self.merge: script = bytearray() script.append(Config.getIntValue("EXTENSION_SCRIPT_VERSION")) script.extend(_script) _script = DataType.serialize(script) if self.deploy or self.merge or self.localTx: # Output will be stored in the blockchain and not the UXTO self.output.store = False self.transaction.addInternalOutput(_address, _script, _value) self.transaction.gasRemaining = self.gasRemaining success = True if len(self.logs) > 0: key = self.persistentStorageKey + self.transaction.hash() PersistentStorage.add(key, self.logs, True) finally: if not self.readOnly: if success: PersistentStorage.commit(self.persistentStorageKey) else: PersistentStorage.rollback(self.persistentStorageKey) return success
def __init__(self, transaction, _input, output, readOnly, deploy, localTx): self.transaction = transaction self.input = _input self.output = output self.persistentStorageKey = output.address self.origin = output.address self.gasRemaining = self.transaction.gasLimit self.chainHeadBlock = Chain.getChain().getChainHeadBlock() self.chainHeadIndexBlock = Chain.getChain().getChainHeadIndexBlock() self.code = bytearray() self.data = bytearray() self.pc = None self.currOpcode = None self.stack = [] self.memory = bytearray() self.JUMPDEST = Opcodes.alias('JUMPDEST') self.readOnly = readOnly self.deploy = deploy self.localTx = localTx self.merge = False self.override = not output.hasExtScript() self.overrideAddress = None self.overrideScript = None self.overrideValue = None self.invalid = False self.logs = [] self.initialize()