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
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
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)
def popAsInt(self): return DataType.bytesToInt(self.pop())