URI: 
       tImplement blockchain.transaction.get_merkle - obelisk - Electrum server using libbitcoin as its backend
  HTML git clone https://git.parazyd.org/obelisk
   DIR Log
   DIR Files
   DIR Refs
   DIR README
   DIR LICENSE
       ---
   DIR commit 41f60ddbf3c1206d910918959361957948d2bcc3
   DIR parent 183262b72ecf87b10446f75068cb4b5f4668108e
  HTML Author: parazyd <parazyd@dyne.org>
       Date:   Wed,  7 Apr 2021 19:39:29 +0200
       
       Implement blockchain.transaction.get_merkle
       
       Diffstat:
         M electrumobelisk/protocol.py         |      30 ++++++++++++++++++++++++++++--
       
       1 file changed, 28 insertions(+), 2 deletions(-)
       ---
   DIR diff --git a/electrumobelisk/protocol.py b/electrumobelisk/protocol.py
       t@@ -16,6 +16,7 @@
        # along with this program.  If not, see <http://www.gnu.org/licenses/>.
        import asyncio
        import json
       +from binascii import unhexlify
        
        from electrumobelisk.merkle import merkle_branch
        from electrumobelisk.util import (
       t@@ -239,7 +240,32 @@ class ElectrumProtocol(asyncio.Protocol):  # pylint: disable=R0904,R0902
                return
        
            async def blockchain_transaction_get_merkle(self, query):
       -        return
       +        if "params" not in query or len(query["params"]) != 2:
       +            return {"error": "malformed request"}
       +        tx_hash = query["params"][0]
       +        height = query["params"][1]
       +
       +        if not is_hash256_str(tx_hash):
       +            return {"error": "tx_hash is not a txid"}
       +        if not is_non_negative_integer(height):
       +            return {"error": "height is not a block height"}
       +
       +        _ec, hashes = await self.bx.fetch_block_transaction_hashes(height)
       +        if _ec and _ec != 0:
       +            self.log.debug("Got error: %s", repr(_ec))
       +            return {"error": "request corrupted"}
       +
       +        # Decouple from tuples
       +        hashes = [i[0] for i in hashes]
       +        tx_pos = hashes.index(unhexlify(tx_hash)[::-1])
       +        branch = merkle_branch(hashes, tx_pos)
       +
       +        res = {
       +            "block_height": int(height),
       +            "pos": int(tx_pos),
       +            "merkle": branch,
       +        }
       +        return {"result": res}
        
            async def blockchain_transaction_from_pos(self, query):  # pylint: disable=R0911
                if "params" not in query or len(query["params"]) < 2:
       t@@ -264,7 +290,7 @@ class ElectrumProtocol(asyncio.Protocol):  # pylint: disable=R0904,R0902
                    return {"error": "index not in block"}
        
                # Decouple from tuples
       -        hashes = [i[0] for i in hashes] 
       +        hashes = [i[0] for i in hashes]
                txid = safe_hexlify(hashes[tx_pos][::-1])
        
                if not merkle: