Python 如何将JSON树结构转换为merkle树

Python 如何将JSON树结构转换为merkle树,python,python-3.x,blockchain,merkle-tree,hashtree,Python,Python 3.x,Blockchain,Merkle Tree,Hashtree,我正在运行一个web服务器,在那里我接收JSON格式的数据,并计划将其存储在NoSQL数据库中。以下是一个例子: data_example = { "key1": "val1", "key2": [1, 2, 3], "key3": { "subkey1": "subval1", . . }

我正在运行一个web服务器,在那里我接收JSON格式的数据,并计划将其存储在NoSQL数据库中。以下是一个例子:

data_example = {
    "key1": "val1",
    "key2": [1, 2, 3],
    "key3": {
        "subkey1": "subval1",
        .
        .
        }
      }
我曾想过使用Merkle树来表示我的数据,因为JSON也是一种类似树的结构

本质上,我想做的是将数据存储在(或作为)一个更安全的分散式树状结构中。许多实体将有权从中创建、读取、更新或删除(CRUD)记录。理想情况下,这些CRUD操作需要从网络中的其他实体进行验证,这些实体也将保存数据库的副本。就像区块链一样

我遇到了一个设计/概念问题,我试图理解如何将JSON转换为Merkle树结构。这是我的节点类:

class Node:
    """ class that represents a node in a merkle tree"""
    def __init__(data):
          self.data = data
          self.hash = self.calculate_some_hash()  # based on the data or based on its child nodes

我对这个概念/设计感兴趣,因为我不知道它是如何工作的。知道如何在Merkle树中保存/存储我的数据\u示例对象吗?(可能吗?

您可以创建一个Merkle树,方法是首先将字典转换为类对象形式,然后递归遍历该树,对子节点散列的总和进行散列。由于Merkle树需要单个根节点,因此在最顶层具有多个键的任何输入词典都应成为空根节点的子词典(默认键为
None
):


输出:

MTree(-1231139208667999673, [MTree(-8069796171680625903, 'val1'), MTree(6, [MTree(1, 1), MTree(2, 2), MTree(3, 3)]), MTree(-78872064628455629, [MTree(-8491910191379857244, 'subval1'), MTree(1818926376495655970, 'subval2'), MTree(1982425731828357743, 'subval3')])]) 
MTree(1039734050960246293, [MTree(5730292134016089818, 'newVal1'), MTree(6, [MTree(1, 1), MTree(2, 2), MTree(3, 3)]), MTree(-78872064628455629, [MTree(-8491910191379857244, 'subval1'), MTree(1818926376495655970, 'subval2'), MTree(1982425731828357743, 'subval3')])])

使用有效负载中的内容更新树:

tree.update_tree({"key1": "newVal1"})
输出:

MTree(-1231139208667999673, [MTree(-8069796171680625903, 'val1'), MTree(6, [MTree(1, 1), MTree(2, 2), MTree(3, 3)]), MTree(-78872064628455629, [MTree(-8491910191379857244, 'subval1'), MTree(1818926376495655970, 'subval2'), MTree(1982425731828357743, 'subval3')])]) 
MTree(1039734050960246293, [MTree(5730292134016089818, 'newVal1'), MTree(6, [MTree(1, 1), MTree(2, 2), MTree(3, 3)]), MTree(-78872064628455629, [MTree(-8491910191379857244, 'subval1'), MTree(1818926376495655970, 'subval2'), MTree(1982425731828357743, 'subval3')])])

一个聪明的方法来建造这棵树,谢谢!但是,在这种情况下,如何使用CRUD操作来修改我的结构?假设我将收到一个带有有效载荷的更新请求:{“KEY1”:“NealVal1”}如何更新树中节点的值?所提出的解决方案也不考虑嵌套对象或嵌套对象列表,因为列表将使用String(@)BasiLISK直接转换为字符串,请参阅我最近的编辑。