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()