def fill_from_rpc(self, data): '''Convert getblocktemplate result into BlockTemplate instance''' #txhashes = [None] + [ binascii.unhexlify(t['hash']) for t in data['transactions'] ] txhashes = [None] + [ util.ser_uint256(int(t['hash'], 16)) for t in data['transactions'] ] mt = merkletree.MerkleTree(txhashes) if settings.COINDAEMON_Reward == 'POW': coinbase = CoinbaseTransactionPOW(self.timestamper, self.coinbaser, data['coinbasevalue'], data['coinbaseaux']['flags'], data['height'], settings.COINBASE_EXTRAS) else: coinbase = CoinbaseTransactionPOS(self.timestamper, self.coinbaser, data['coinbasevalue'], data['coinbaseaux']['flags'], data['height'], settings.COINBASE_EXTRAS, data['curtime']) self.height = data['height'] self.nVersion = data['version'] self.hashPrevBlock = int(data['previousblockhash'], 16) self.nBits = int(data['bits'], 16) self.hashMerkleRoot = 0 self.nTime = 0 self.nNonce = 0 if settings.COINDAEMON_ALGO == 'heavy': self.nMaxvote = 1024 self.nReward = data['reward'] if data.has_key('maxvote'): self.nMaxvote = data['maxvote'] self.vtx = [ coinbase, ] for tx in data['transactions']: t = halfnode.CTransaction() t.deserialize(StringIO.StringIO(binascii.unhexlify(tx['data']))) self.vtx.append(t) self.curtime = data['curtime'] self.timedelta = self.curtime - int(self.timestamper.time()) self.merkletree = mt self.target = util.uint256_from_compact(self.nBits) # Reversed prevhash self.prevhash_bin = binascii.unhexlify( util.reverse_hash(data['previousblockhash'])) self.prevhash_hex = "%064x" % self.hashPrevBlock self.broadcast_args = self.build_broadcast_args()
def fill_from_rpc(self, data): '''Convert getblocktemplate result into BlockTemplate instance''' commitment = None txids = [] hashes = [None] + [ util.ser_uint256(int(t['hash'], 16)) for t in data['transactions'] ] try: txids = [None] + [ util.ser_uint256(int(t['txid'], 16)) for t in data['transactions'] ] mt = merkletree.MerkleTree(txids) except KeyError: mt = merkletree.MerkleTree(hashes) wmt = merkletree.MerkleTree(hashes).withFirst( binascii.unhexlify( '0000000000000000000000000000000000000000000000000000000000000000' )) self.witness = SHA256.new(SHA256.new(wmt + witness_nonce).digest()).digest() commitment = b'\x6a' + struct.pack( ">b", len(self.witness) + len(witness_magic)) + witness_magic + self.witness try: default_witness = data['default_witness_commitment'] commitment_check = binascii.unhexlify(default_witness) if (commitment != commitment_check): print( "calculated witness does not match supplied one! This block probably will not be accepted!" ) commitment = commitment_check except KeyError: pass self.witness = commitment[6:] if settings.COINDAEMON_Reward == 'POW': coinbase = CoinbaseTransactionPOW(self.timestamper, self.coinbaser, data['coinbasevalue'], data['coinbaseaux']['flags'], data['height'], commitment, settings.COINBASE_EXTRAS) else: coinbase = CoinbaseTransactionPOS(self.timestamper, self.coinbaser, data['coinbasevalue'], data['coinbaseaux']['flags'], data['height'], commitment, settings.COINBASE_EXTRAS, data['curtime']) self.height = data['height'] self.nVersion = data['version'] self.hashPrevBlock = int(data['previousblockhash'], 16) self.nBits = int(data['bits'], 16) self.hashMerkleRoot = 0 self.nTime = 0 self.nNonce = 0 self.vtx = [ coinbase, ] for tx in data['transactions']: t = TxBlob() t.deserialize(binascii.unhexlify(tx['data'])) self.vtx.append(t) self.curtime = data['curtime'] self.timedelta = self.curtime - int(self.timestamper.time()) self.merkletree = mt self.target = util.uint256_from_compact(self.nBits) # Reversed prevhash self.prevhash_bin = binascii.unhexlify( util.reverse_hash(data['previousblockhash'])) self.prevhash_hex = "%064x" % self.hashPrevBlock self.broadcast_args = self.build_broadcast_args()