From: ThomasV Date: Thu, 18 Oct 2012 15:05:56 +0000 (+0400) Subject: add two new RPCs: transaction.get_merkle and block.get_header X-Git-Url: https://git.novaco.in/?p=electrum-server.git;a=commitdiff_plain;h=755075f90ff5a9304bb9f8b6efe17c54846a4b1a add two new RPCs: transaction.get_merkle and block.get_header --- diff --git a/backends/abe/__init__.py b/backends/abe/__init__.py index 745493c..7155d78 100644 --- a/backends/abe/__init__.py +++ b/backends/abe/__init__.py @@ -380,6 +380,76 @@ class AbeStore(Datastore_class): return status + def get_block_header(self, block_height): + out = self.safe_sql(""" + SELECT + block_hash, + block_version, + block_hashMerkleRoot, + block_nTime, + block_nBits, + block_nNonce, + block_height, + prev_block_hash, + block_id + FROM chain_summary + WHERE block_height = %d AND in_longest = 1"""%block_height) + + if not out: raise BaseException("block not found") + row = out[0] + (block_hash, block_version, hashMerkleRoot, nTime, nBits, nNonce, height,prev_block_hash, block_id) \ + = ( self.hashout_hex(row[0]), int(row[1]), self.hashout_hex(row[2]), int(row[3]), int(row[4]), int(row[5]), int(row[6]), self.hashout_hex(row[7]), int(row[8]) ) + + out = {"block_height":block_height, "version":block_version, "prev_block_hash":prev_block_hash, + "merkle_root":hashMerkleRoot, "timestamp":nTime, "bits":nBits, "nonce":nNonce} + return out + + + def get_tx_merkle(self, tx_hash): + + out = self.safe_sql(""" + SELECT block_tx.block_id FROM tx + JOIN block_tx on tx.tx_id = block_tx.tx_id + JOIN chain_summary on chain_summary.block_id = block_tx.block_id + WHERE tx_hash='%s' AND in_longest = 1"""%tx_hash) + block_id = out[0] + + # get the block header + out = self.safe_sql(""" + SELECT + block_hash, + block_version, + block_hashMerkleRoot, + block_nTime, + block_nBits, + block_nNonce, + block_height, + prev_block_hash, + block_height + FROM chain_summary + WHERE block_id = %d AND in_longest = 1"""%block_id) + + if not out: raise BaseException("block not found") + row = out[0] + (block_hash, block_version, hashMerkleRoot, nTime, nBits, nNonce, height, prev_block_hash, block_height) \ + = ( self.hashout_hex(row[0]), int(row[1]), self.hashout_hex(row[2]), int(row[3]), int(row[4]), int(row[5]), int(row[6]), self.hashout_hex(row[7]), int(row[8]) ) + + merkle = [] + # list all tx inputs in block + for row in self.safe_sql(""" + SELECT DISTINCT tx_id, tx_pos, tx_hash + FROM txin_detail + WHERE block_id = ? + ORDER BY tx_pos""", (block_id,)): + tx_id, tx_pos, tx_hash = row + merkle.append(tx_hash) + + out = {"block_height":block_height, "version":block_version, "prev_block":prev_block_hash, + "merkle_root":hashMerkleRoot, "timestamp":nTime, "bits":nBits, "nonce":nNonce, "merkle":merkle} + return out + + + def memorypool_update(store): @@ -489,11 +559,27 @@ class BlockchainProcessor(Processor): error = str(e) + ': ' + address print "error:", error + elif method == 'blockchain.block.get_header': + try: + height = params[0] + result = self.store.get_block_header( height ) + except BaseException, e: + error = str(e) + ': %d'% height + print "error:", error + elif method == 'blockchain.transaction.broadcast': txo = self.store.send_tx(params[0]) print "sent tx:", txo result = txo + elif method == 'blockchain.transaction.get_merkle': + try: + tx_hash = params[0] + result = self.store.get_tx_merkle(tx_hash ) + except BaseException, e: + error = str(e) + ': ' + tx_hash + print "error:", error + else: error = "unknown method:%s"%method