URI: 
       tImplement cp_height in blobkchain.block.header - 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 d0c8d65eaffa26fd3c770be28d02c9893be57dbb
   DIR parent f78a1145bcf900e25178a49314fef0147ddc65c0
  HTML Author: parazyd <parazyd@dyne.org>
       Date:   Tue, 13 Apr 2021 00:33:46 +0200
       
       Implement cp_height in blobkchain.block.header
       
       This needs further review for correctness.
       
       Diffstat:
         M obelisk/protocol.py                 |      35 +++++++++++++++++++++++++-------
       
       1 file changed, 28 insertions(+), 7 deletions(-)
       ---
   DIR diff --git a/obelisk/protocol.py b/obelisk/protocol.py
       t@@ -22,7 +22,7 @@ import json
        from binascii import unhexlify
        
        from obelisk.errors import ERRORS
       -from obelisk.merkle import merkle_branch
       +from obelisk.merkle import merkle_branch, merkle_branch_and_root
        from obelisk.util import (
            bh2u,
            block_to_header,
       t@@ -208,7 +208,6 @@ class ElectrumProtocol(asyncio.Protocol):  # pylint: disable=R0904,R0902
                """
                if "params" not in query or len(query["params"]) < 1:
                    return ERRORS["invalidparams"]
       -        # TODO: cp_height
                index = query["params"][0]
                cp_height = query["params"][1] if len(query["params"]) == 2 else 0
        
       t@@ -216,12 +215,34 @@ class ElectrumProtocol(asyncio.Protocol):  # pylint: disable=R0904,R0902
                    return ERRORS["invalidparams"]
                if not is_non_negative_integer(cp_height):
                    return ERRORS["invalidparams"]
       +        if cp_height != 0 and not index <= cp_height:
       +            return ERRORS["invalidparams"]
        
       -        _ec, data = await self.bx.fetch_block_header(index)
       -        if _ec and _ec != 0:
       -            self.log.debug("Got error: %s", repr(_ec))
       -            return ERRORS["internalerror"]
       -        return {"result": safe_hexlify(data)}
       +        if cp_height == 0:
       +            _ec, header = await self.bx.fetch_block_header(index)
       +            if _ec and _ec != 0:
       +                self.log.debug("Got error: %s", repr(_ec))
       +                return ERRORS["internalerror"]
       +            return {"result": safe_hexlify(header)}
       +
       +        cp_headers = []
       +        # headers up to and including cp_height
       +        for i in range(index, cp_height + 1):
       +            _ec, data = await self.bx.fetch_block_header(i)
       +            if _ec and _ec != 0:
       +                self.log.debug("Got error: %s", repr(_ec))
       +                return ERRORS["internalerror"]
       +            cp_headers.append(data)
       +
       +        # TODO: Review
       +        branch, root = merkle_branch_and_root(cp_headers, 0)
       +        return {
       +            "result": {
       +                "branch": [safe_hexlify(i) for i in branch],
       +                "header": safe_hexlify(cp_headers[0]),
       +                "root": safe_hexlify(root),
       +            }
       +        }
        
            async def blockchain_block_headers(self, writer, query):  # pylint: disable=W0613
                """Method: blockchain.block.headers