概述
1.数据逻辑: 从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,
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所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复