位元幣中的資料結構 區塊鏈學習筆記2

2021-09-21 18:51:31 字數 2545 閱讀 9023

merkle tree

位元幣中的資料結構裡用到的重要概念是雜湊指標hash pointers

普通的指標指儲存的是某個結構體在記憶體中的位置。

p是指向某結構體的指標,那麼p裡面存放的就是該結構體在記憶體中的起始位置。

雜湊指標除了要存位址之外,還要儲存這個結構體的雜湊值 h() 。

這樣做的好處是,這個指標不但能夠有這個結構體的位置資訊,還能夠驗證這個結構體裡面的內容有沒有被篡改,因為我們儲存了它的雜湊值。

位元幣中乙個最基本的資料結構就是區塊鏈,區塊鏈是什麼呢,就是乙個乙個區塊組成的鍊錶。

區塊鏈和普通鍊錶的區別是什麼呢?

乙個區別就是用雜湊指標代替了普通指標。

最前面的區塊是第乙個區塊,創世紀區塊genesis block,最近乙個區塊是最近產生的區塊 most recent block。每乙個區塊前面都有乙個hash pointer。

這種資料結構的好處是什麼?

是整個區塊一起取雜湊。我們通過這樣的資料結構可以實現tamper-evident log防篡改日誌。

比如說有乙個人篡改了區塊鏈中的某乙個內容,會有怎樣的結果?

篡改內容的後面乙個雜湊指標就對不上,後面乙個雜湊指標改了,在後面的也要改。所以我只要儲存最後乙個雜湊值,我就能保證前面的所有資料都沒有被篡改。

普通鍊錶我們可以改變其中乙個元素而不會對其他區塊有影響。區塊鏈是牽一發動全身,我只要儲存最後乙個雜湊值,就能保證整條區塊鏈是完整的。我們只需要儲存最近的幾千個區塊資料就行了,不需要儲存整條區塊,用到的時候問別人要就行了。

有些節點可能是惡意的,所以我們要驗證,我們算一下別人給我們的區塊的雜湊值跟我們儲存的雜湊值是否相等就可以了。

位元幣中的另外乙個資料結構是merkle tree。大家可能沒有聽說過merkle tree ,但是聽說過binary tree。這兩者有什麼區別呢?

乙個區別就是用雜湊指標代替了普通指標。

這就是一棵merkle tree

最下面的一層是data blocks

上面的都是雜湊指標

兩兩結合取雜湊,一層層推上去,最後根節點也取雜湊叫做根雜湊值root hash

只要記住對根節點取雜湊的雜湊值,整個結構的數值都能保護。

位元幣中各個區塊之間用雜湊指標連線在一起,每個區塊所包含的交易組織成merkle tree的形式。底層的這個data blocks的每個塊其實是個交易tx (transaction)。

每個區塊可以分為兩部分,塊頭和塊身。

block header

block body

merkle tree 有什麼用呢?

提供merkle proof

位元幣中的節點有兩種,乙個是全節點,乙個是輕節點。

比如說手機上的位元幣錢包就是輕節點,它只儲存block header。那麼輕節點怎麼知道交易是否被存到區塊鏈中了呢?這時候就要用到merkle proof。

從交易節點追溯到根節點,這條就叫做merkle proof。

假設輕節點想知道黃色這個交易tx是否被包含在merkle tree中,怎麼做呢?

首先綠的雜湊值跟紅色雜湊值拼接,算出上一層綠色的雜湊值,再跟紅色雜湊值拼接,以此類推,算出根雜湊值,全節點把這個雜湊值跟根節點的雜湊值進行比較就可以證明。

輕節點只要從下往上驗證,只要沿途的雜湊值都是正確的就行了。輕節點只有block header,查的時候只能差交易這一條鏈上的雜湊值,只需要驗證有資料的部分的雜湊值即可。

這個證明過程是否有一點不太安全?

因為我們驗證的過程只能驗交易所在的鏈條,這其實給修改提供了一定的自由度。

這裡面就用到了collision resistance性質。修改交易內容其實就是在人為做雜湊碰撞。

這種證明也叫做 proof of membership,或者叫 proof of inclusion

對於輕節點來說,你發給我乙個merkle proof,我要驗證他,時間複雜度是多少?

那麼proof of non-memberships 的時間複雜度是多少?

是線性的時間複雜度。

我們想找的這個交易可能出現在葉節點的任何位置。但是如果我們對這個葉節點的內容取雜湊值,按照雜湊值的大小從小到大排序,這時候就有乙個好的排序方法,我要查的交易先算出雜湊值,然後就找這個雜湊值在葉節點中的位置,把相鄰的兩個葉節點都算進去,這樣向上所有的雜湊值都是正確的就一定能保證交易在原來的merkle tree 中。

這種排好序的叫做sorted merkle tree。位元幣中並沒有用到這種排序的merkle tree,因為位元幣中不需要進行不存在證明,沒有這種硬性需求。

除了這兩種結構之外,雜湊指標還能用在什麼地方呢?

那麼有環的結構會有什麼問題呢?

區塊鏈 位元幣與區塊鏈學習

什麼是位元幣 位元幣是中本聰2009年提出的乙個點對點的數字加密貨幣系統。但是,這個定義背後的內涵和外延非常豐富。遠不是這一句話能夠概括的。我們可以從多種不同的視角,不同的方面,不同的層次去看它,看到不一樣的東西。打個比方,就像乙個建築物,可以從物理,力學,建築學,文化,社會等等角度去看它,都可以看...

區塊鏈技術與應用(二) 位元幣的資料結構

位元幣資料結構中最重要的概念就是雜湊指標。普通指標儲存的是某個結構體在記憶體中的位址,而雜湊指標,除了要存位址之外,還要存整個結構體的雜湊值。位元幣資料結構如下 genesis block 創世區塊 most recent block 最近建立的區塊 如圖 每個區塊都包含指向前乙個區塊的雜湊指標。最...

區塊鏈1 0應用 位元幣學習

位元幣是乙份數字檔案,裡面記錄著賬戶和金額,也就是數字賬本。檔案的副本被儲存在位元幣網路的每一台電腦中。單獨看這些數字檔案不具有任何價值,它之所以具有價值,是因為人們信任位元幣,人們自願用它交易真實貨物或者購買服務。去中心化 decentralization,在乙個分布有眾多節點的系統中,每個節點都...