在最表層,和哈希全部相同,我們公司的把的的數據分紅小的的的數據塊,有相關的地哈希和它分別。因為向下走,并不算真接去運算根哈希,并且把相距的倆個哈希重新命名排成個字節數組串,然后呢運算該字節數組串的哈希,這每倆個哈希就定婚生子,取得了了個”子哈希“。比如最表層的哈希個數是單數,那到還有根本出現了一家單身哈希,這是具體情況就真接對它實行哈希運算,所以說怎樣才能取得它的子哈希。因而向下推,即使是相同的原則,能能取得樹木更短的新一級哈希,終于根本形排成棵倒吊的樹,得到樹根的該方位,這那代就完剩一家根哈希了,我們公司的把它叫 Merkle Root。
Merkle Tree的葉片子域的value是資料數集的摸塊式資料也可以摸塊式資料HASH。
非小編進程的value是通過它下列所有的的小編進程值,接下來假設按照Hash計算公式方式計算公式而得來的。
而對于OSNMA并不是,采用半個個16個嫩葉組件的特殊化默克爾樹,16個嫩葉組件各分為相當于m0~m15,對mi展開一回哈希,則收獲X(0,i),以樹從底往里,第0層的組件金額為16,首位層的組件數為8,第2層的組件數為4,最后層的組件數為2,第三層組件數為1,也是根組件。往里一個,組件數少半是為了采用的都是個齊全二叉樹。但其中mi的值是由公匙型+公匙順序號+公匙構成,這也就鎖定進了osnma電選文使用的的文件加密神經網絡算法的手機驗證。
OSNMA中巧用默克爾樹銜接接收DSM-PKR師德皓大共秘鑰的檢驗,是經由hash不逆和只需要播發六個點位算上共同秘鑰本身轉換成某個點位,構成幾個點位能夠進行對根點位的校正。實際上舉某個典例就很更容易清楚了。
ICD中,MID是是用來指令當今播發的DSM-PKR中的公用秘鑰的代表相關,比如MID=0的時間,mi=公匙類型、+0+公匙,另一方面再播剛發X(0,1),X(1,1),X(2,1),X(3,1)。較驗的流程是這樣子的,
第一點步mi開展sha-256能夠 X(0,0)
2.步將X(0,0)+X(0,1),第三對結合的數據文件完成sha-256使用,所得的最終結果標上為X(1,0)
3、步將X(1,0)+X(1,1),其次對之和的數據庫做sha-256進行操作,增值稅報告記號為X(2,0)
第七步將X(2,0)+X(2,1),后來對累加的數據庫開始sha-256控制,增值稅沒想到標記圖片為X(3,0)
第十步將X(3,0)+X(3,1),然后呢對結合的的數據做sha-256運作,所述但是標記符號為X(4,0)
X(4,0)更是根頂點,與從保障免費下載的根頂點對其進行相對較只能清楚校正需不需要都可以憑借。
相當于其他的MID,只需要將具體步驟中的下表依照相當于數據表格中選出的通過替代,的流程就是一致的。
python實例
'''現實情況的使用的同時,不所需顧慮那麼麻煩,會做1個優化的merkleTree,才可以用在OSNMA的運轉。正因為OSNMA的merkleTree的建筑高度和結點數是放置的
'''
class OSNMAMerkleTree:
def __init__(self,hashFun):
self.hashFun = hashFun
self.allNodes=dict()#每個進程的數值選擇三個數字8指出,一款 指出層,然后個指出這一份的第幾條
self.leafm0_15=[]
self.InterNode=[[(0,1),(1,1),(2,1),(3,1)],#m0
[(0,0),(1,1),(2,1),(3,1)],#m1
[(0,3),(1,0),(2,1),(3,1)],#m2
[(0,2),(1,0),(2,1),(3,1)], [(0,5),(1,3),(2,0),(3,1)], [(0,4),(1,3),(2,0),(3,1)], [(0,7),(1,2),(2,0),(3,1)], [(0,6),(1,2),(2,0),(3,1)], [(0,9),(1,5),(2,3),(3,0)], [(0,8),(1,5),(2,3),(3,0)],[(0,11),(1,4),(2,3),(3,0)],#m10
[(0,10),(1,4),(2,3),(3,0)],#m11
[(0,13),(1,7),(2,2),(3,0)], [(0,12),(1,7),(2,2),(3,0)], [(0,15),(1,6),(2,2),(3,0)],[(0,14),(1,6),(2,2),(3,0)],#m15
] #只需要的構件表
def AddLayer(self,floorindex,nodeSize):
for i in range(nodeSize):
leftNodeValue=self.allNodes[(floorindex,index)] #贏得右面子點位資料
rightNodeValue=self.allNodes[(floorindex,index+1)]#完成左上方子端點統計資料
blocktmp=leftNodeValue+rightNodeValueself.allNodes.update({(floorindex+1,indexkey):self.hashFun(blocktmp).digest()})#計算方法父時間的動態數據
def GeneratorMerkleTree(self,data_blocks):
if not data_blocks:
return None
self.leafm0_15 = data_blocks
self.allNodes.clear()
floorindex=0 index =0for block in data_blocks:
self.allNodes.update({(floorindex,index):self.hashFun(block).digest()})
index+=1
self.AddLayer(0,8)
self.AddLayer(1,4)
self.AddLayer(2,2)
self.AddLayer(3,1)
#要先拿到代表的時間
def GetNodeValue(self,floor,index):
return self.allNodes[(floor,index)]
#提升mi對應著的四位接點
def GetMiNodes(self,miIndex=0):
Nodes=[]for i in range(4):
tmp=self.InterNode[miIndex][i]
nodedata=self.GetNodeValue(tmp[0],tmp[1])
Nodes.append(nodedata)return Nodes
def verifyRoot(self,mid,ITNS,leaf):
node = self.hashFun(leaf).digest()
for it_node in ITNS:
if mid % 2 == 0:
node = self.hashFun(node + it_node).digest()
else:
node = self.hashFun(it_node + node).digest()
mid = mid // 2
return node==self.allNodes[(4,0)]
#index為MID,mi為葉片頂點
def verifycalRoot(self,MID,mi):
x0i=self.hashFun(mi).digest()
for item in self.InterNode[MID]:
ifMID%2==0:
x0i=x0i+self.allNodes[item]
else:
x0i=self.allNodes[item]+x0i
MID =MID // 2
x0i=self.hashFun(x0i).digest()
return x0i
def showallnodes(self):
for i, v in self.allNodes.items():
print(i,v)
def getAllNodes(self):
return self.allNodes
def getleafi(self,i):
return self.leafm0_15[i]