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()
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值