示例#1
0
def merge():
    script = bytearray()

    script.append(Config.getIntValue("SCRIPT_VERSION"))
    script.append(Opcodes.alias('MERGE', True))

    return DataType.serialize(script)
示例#2
0
def verifyAtomicSwapLock():
    script = bytearray()

    script.append(Config.getIntValue("SCRIPT_VERSION"))
    script.append(Opcodes.alias('CHECKATOMICSWAPLOCKVERIFY', True))

    return DataType.serialize(script)
示例#3
0
def verifyMultiSignature():
    script = bytearray()

    script.append(Config.getIntValue("SCRIPT_VERSION"))
    script.append(Opcodes.alias('CHECKMULTISIGVERIFY', True))

    return DataType.serialize(script)
示例#4
0
 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
示例#5
0
 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
示例#6
0
    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
示例#7
0
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)
示例#8
0
 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
示例#9
0
    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()