在最下層,和哈希全部一種,大家把數值資料劃分小的數值資料塊,有某些地哈希和它對應著。不過往里提走,并非就單獨去運算根哈希,即使把鄰近的兩根哈希伴有成小個字串串,隨后運算這是字串串的哈希,其實每兩根哈希就懷孕生孩子生子,得出半個個”子哈希“。如最下層的哈希統計數是單數,那到后面不可避免造成有的單身哈希,此類情形就就單獨對它去哈希運算,這些也能夠得出它的子哈希。之后往里提推,一如既往是一種種的策略,不錯得出數量愈少的新特一級哈希,決定不可避免成型小棵下跌情況的樹,去了樹根的這是地位,這一帶就多余有的根哈希了,大家把它名為 Merkle Root。
Merkle Tree的小編接點的value是數據表格報告顯示聚集的象限測試數據表格報告顯示某些象限測試數據表格報告顯示HASH。
非小編點位的value是給出它接下整個的小編點位值,第二安裝Hashjava算法算出而給出的。
相對于OSNMA比喻,抉擇好幾個個16個胡特網絡分支的特殊化默克爾樹,16個胡特網絡分支主要對應著m0~m15,對mi去第一次哈希,則贏得X(0,i),那么樹從底以上,第0層的網絡分支流通量為16,第22層的網絡分支數為8,第2層的網絡分支數為4,其次層的網絡分支數為2,四、層網絡分支數為1,也是根網絡分支。以上那層,網絡分支數少半是是由于抉擇的都是個可以二叉樹。這其中mi的值是由公匙方式+公匙編號規則+公匙組合成,這也就鎖定來到osnma電原文中選用的加鎖百度算法的手機驗證。
OSNMA中采取默克爾樹嫁接退回來DSM-PKR師德皓大共秘鑰的認可,是經由hash不能夠逆和只需要播發4個時間加帶共公秘鑰你生成二維碼是1個時間,根據幾個時間就好提交對根時間的驗證。事實舉是1個例證就很輕易清楚了。
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)
第三方步將X(1,0)+X(1,1),而后對求和的數據信息進行sha-256操作流程,增值稅結局標注為X(2,0)
第4步將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實例
'''具體食用的情況下,不還要考量這么繁雜,直觀做另一個簡易化的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]