我是靠谱客的博主 单纯蜡烛,最近开发中收集的这篇文章主要介绍BTC学习知识点总结3 -- cache_handler,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

1.数据逻辑:

  • 从new_tx_handler --> redis的数据 中取出数据 --> cache_handler --> redis --> entity_info --> mongo
  • 从new_tx_handler --> redis的数据 中取出数据 --> cache_handler --> redis --> entity_base --> redis持久化
  • 从new_tx_handler --> redis的数据 中取出数据 --> cache_handler -->redis --> kafka -- >cache_waiter(容纳,回退)
    2.原理
    cache_handler:用于缓存最新的,验证数少于阈值的块,并且当出现更长链时,需要将对应的块存入数据库,并回退入到数据库中的不被认可的块。具体的做法为在redis中设置一个先进先出队列,队列长度为指定阈值,出队数据做校验,判断是否和链上数据一致,如果不一致,则删除transaction库中的对应交易,并重入正确交易,回退addr_info中的数据,并对正确的块叠加增量。
    3.回退
    如果发生校验错误,意味着对应块的数据需要回退。回退完成后对应块替换原本的缓存块继续执行后续的几次的校验。
    new tx回退:直接将更新块的数据覆盖到数据库,并删除原本的缓存块中没有出现在更新块中的交易,并校验交易数正确性。
    addr info回退:地址信息回退,逆操作原本缓存块的交易数,地址余额,地址输入输出等,然后将更新块的对应统计数据写入数据库,注意并发一致性问题。
    entity base,entity info不进行回退处理,统一比线上延迟6个块。
    4.代码剖析:
    bch 和 btc 的 fetcher 参数有些不同,所以分开写fetcher,



  1. 验证一个块的正确性。
    async def check_block(self, block):
        """
        校验方法为判断交易数和交易id是否一致。
        如果不一致,返回新块和旧快数据,更新new tx 和 addr info数据库。

        :param: block: newtx块数据
        :return: [boolean, 新块数据,旧块数据],
        如果布尔值为True(表示块数据正确),则新旧块数据为None
        """
        rpc_block = await self.fetch.get_block_data_by_height(block['block_number'])
        if not rpc_block:
            raise Exception(f"rpc failed found block {block['block_number']}.")
        rpc_txids = set([tx['txid'] for tx in rpc_block['tx']])
        new_txids = set([tx['txid'] for tx in block['transactions']])
        if len(rpc_txids) == len(new_txids) and len(rpc_txids - new_txids) == 0:  # 数据        正确
            return True, None, None
        worker = NewTxWorker(rpc_block, self.fetch, MongoDatabase(config.MONGO_URI, config.MONGO_DB))
        await worker.deal()
        rpc_new_tx_block = worker.get_new_tx_block()

最后

以上就是单纯蜡烛为你收集整理的BTC学习知识点总结3 -- cache_handler的全部内容,希望文章能够帮你解决BTC学习知识点总结3 -- cache_handler所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(48)

评论列表共有 0 条评论

立即
投稿
返回
顶部