Пример #1
0
def decode(buffer):
    decodedBuffer = b''
    if len(buffer) > 0:
        prefix = buffer[0]
        if prefix >= BYTE_PREFIX_START and prefix <= BYTE_PREFIX_END:
            decodedBuffer += DataType.intToBytes(prefix)
        elif prefix >= STRING_PREFIX_START and prefix <= STRING_PREFIX_END:
            offset = 1
            decodedBufferLen = None
            if prefix > STRING_55_LEN_MAX_RANGE:
                prefixLen = prefix - STRING_55_LEN_MAX_RANGE
                bufferLen = buffer[offset:offset + prefixLen]
                decodedBufferLen = DataType.bytesToInt(bufferLen)
                offset += prefixLen
            else:
                decodedBufferLen = prefix - STRING_PREFIX_START
            decodedBuffer += buffer[offset:offset + decodedBufferLen]
        elif prefix >= LIST_PREFIX_START and prefix <= LIST_PREFIX_END:
            decodedBuffer = []
            offset = 1
            decodedBufferLen = None
            if prefix > LIST_55_LEN_MAX_RANGE:
                prefixLen = prefix - LIST_55_LEN_MAX_RANGE
                bufferLen = buffer[offset:offset + prefixLen]
                decodedBufferLen = DataType.bytesToInt(bufferLen)
                offset += prefixLen
            else:
                decodedBufferLen = prefix - LIST_PREFIX_START
            buffer = buffer[offset:offset + decodedBufferLen]
            while len(buffer) > 0:
                tempBufferDecoded = decode(buffer)
                decodedBuffer.append(tempBufferDecoded)
                offset = 1
                prefix = buffer[0]
                if prefix >= BYTE_PREFIX_START and prefix <= BYTE_PREFIX_END:
                    decodedBufferLen = 0
                elif prefix >= STRING_PREFIX_START and prefix <= STRING_PREFIX_END:
                    if prefix > STRING_55_LEN_MAX_RANGE:
                        prefixLen = prefix - STRING_55_LEN_MAX_RANGE
                        bufferLen = buffer[offset:offset + prefixLen]
                        decodedBufferLen = DataType.bytesToInt(bufferLen)
                        offset += prefixLen
                    else:
                        decodedBufferLen = prefix - STRING_PREFIX_START
                elif prefix >= LIST_PREFIX_START and prefix <= LIST_PREFIX_END:
                    if prefix > LIST_55_LEN_MAX_RANGE:
                        prefixLen = prefix - LIST_55_LEN_MAX_RANGE
                        bufferLen = buffer[offset:offset + prefixLen]
                        decodedBufferLen = DataType.bytesToInt(bufferLen)
                        offset += prefixLen
                    else:
                        decodedBufferLen = prefix - LIST_PREFIX_START
                buffer = buffer[offset + decodedBufferLen:]
    return decodedBuffer
Пример #2
0
 def validateBlockBits(self, blockHeader, bits):
     currTarget = Bits.getTargetFromBits(bits)
     blockHeaderHash = Crypto.proofOfWorkHash(blockHeader)
     blockHeaderHashLong = DataType.bytesToInt(blockHeaderHash)
     if blockHeaderHashLong < currTarget:
         return True
     else:
         return False
Пример #3
0
 def checkmultisig(self):
     outputHash = self.transaction.hashOutput(self.input, self.output)
     threshold = DataType.bytesToInt(self.output.extraData)
     match = 0
     publicKeys = self.input.witness[::2]
     multiSigAddressBytes = bytearray()
     for publicKey in publicKeys:
         multiSigAddressBytes.extend(publicKey)
     multiSigAddress = Crypto.generateAddress(multiSigAddressBytes)
     if multiSigAddress == self.output.address:
         signatures = self.input.witness[1::2]
         for public, signature in zip(publicKeys, signatures):
             if Crypto.verify(public, signature, outputHash):
                 match += 1
     self.stack.append(match >= threshold)
Пример #4
0
 def popAsInt(self):
     return DataType.bytesToInt(self.pop())