理解區塊鏈中的不變性

鏈客,專爲開發者而生,有問必答!算法

此文章來自鏈客區塊鏈技術問答社區,未經容許拒絕轉載。
在這裏插入圖片描述編程

不變性一詞已經成爲了區塊鏈的同義詞。字典將不變性定義爲「不可變性」。該詞指的是區塊鏈的特徵,即寫入區塊鏈的任何數據都不能被更改或修改。安全

如何更好地理解它呢?咱們能夠將其與谷歌電子表格進行比較。後者具備行和列,您能夠隨時添加、編輯或刪除這些行和列。而當您在區塊鏈中輸入任何數據時,除非達成一致協議,不然您不能改動這些數據。所以,雖然區塊鏈中的數據不是100%不可變的,可是須要更改它是很是複雜的。編程語言

區塊鏈中不變性是什麼意思?函數

若是區塊鏈非徹底不可觸摸,爲何它被稱爲不可變?爲了不混淆和誤解,咱們須要討論兩個與不可變性密切相關的單詞——防篡改和篡改明顯。區塊鏈

當某些東西被篡改明顯時,每一個人都會注意到每個小變化和修改。另外一方面,防篡改意味着物體確實是沒法觸及的。要找到防篡改的東西是不可能的,由於幾乎全部的東西都容易發生變化。然而,有些東西極難被改變。this

牙膏就是一個例子。當有人從牙膏管裏擠出牙膏時,不管你多麼努力地想把管子恢復到原來的狀態,都是困難的。spa

這就是防篡改的意義所在。雖然你能夠觸摸或改變一些東西,但這很難作到,由於已經作過的改變是很是明顯的。區塊鏈也是同樣; 所以,咱們能夠說區塊鏈是防篡改而不是篡改明顯。所以,存儲在區塊鏈中的任何數據都被認爲是安全合法的。圖片

區塊鏈中不變性是如何工做?事務

既然咱們已經肯定了區塊鏈是不可變的,由於若是被篡改它會出現很明顯的證據,那麼下一個問題是: 區塊鏈在多大程度上是不可變的?

爲了理解不變性是如何工做的,咱們必須討論哈希。哈希是一組建立數字簽名(也稱爲校驗和)的數學操做。它的工做原理相似於您的真實簽名,可是您將數字簽名附加到任何數字數據上,而不是紙上。

大多數現代編程語言都有各類散列函數。其中之一是安全哈希算法2或SHA-2。在這個哈希函數下,有更多類型的實現,其中最流行的是SHA-256。嘗試輸入一組字節,哈希函數將產生惟一的校驗和。

做爲一個例子,讓咱們使用這三行Python代碼,它能夠訪問SHA-256和其餘SHA-2實現。使用這個算法,咱們將輸入字符串「this is magic」。

import hashlib

h = hashlib.sha256(‘this is magic…’)

h.hexdigest()

‘49240b3cc693fd281422bbcabb5f207ae2

這個hashlib將提供一個由64個字符組成的字符串——很少也很多。不管您的輸入是大是小,它都將生成具備相同字符數的校驗和。爲了證實這一點,讓咱們輸入一個更長的字符串:

h = hashlib.sha256(‘humpty dumpty sat on a wall, humpty dumpty had a great fall’)

h.hexdigest()

‘518e3f99fb2b26b4613c8597b371d11543

若是計算校驗和,總共是64個字符,可是校驗和是唯一的。唯一性是哈希函數最顯著的屬性之一。所以,即便您計算兩個看起來相同的文件,當您計算它們的數字簽名或校驗和時,您也會發現是否有任何不一樣。即便變化很小並且您看不到它,可是哈希不會說謊,它會告訴您差別。

在第一個哈希輸入「this is magic…」中,校驗和是「49240b3cc693fd281422bbcabb5f207ae2a390003534989fb55080799ee08d8c」。

若是你在句子中再加一個句號,就會獲得另外一個結果。計算:

h = hashlib。sha256(this is magic.... ')

h.hexdigest ()

「6 c3e6636db1eb2fa8fcf8d4fdbf33bff4129ccb985c24848ef25311d506dde73」

經過向字符串添加一個額外的字符(句點),它產生了一個不一樣的哈希輸出。哈希輸出的另外一個迷人的特性是「計算上不可能」返回並肯定是哪一種輸入影響了這個唯一的輸出。

即便你要求經驗豐富的開發人員找出建立的輸入值,他們也會告訴你這是不可能的。另外一方面,若是你要求同一個開發人員從「this is magic ...」字符串中給你一個SHA-256簽名,他將爲你提供相同的值。

區塊鏈上的事實有多安全有效?

區塊鏈由連接數據塊組成,建立一個鏈。每一個塊由多個事務或事實組成。軟件將計算每一個塊的校驗和。饋入計算的數據包含大量信息,其中包括前一個塊和當前塊的校驗和。這些因素都將包含在新塊的計算中,這就是爲何重寫區塊鏈幾乎是不可能的。

每次有一個新事務時,它都會直接進入一個事務池,等待被寫入區塊鏈。若是有足夠的交易,比特幣節點將處理每筆交易以建立一個新的塊,而後將其添加到鏈中。這些將成爲區塊鏈中的永久記錄。

區塊鏈中的校驗和格式以零開頭。每次記錄校驗和並將其添加到區塊鏈時,都會向散列輸出添加更多的零。若是有人想要更改區塊鏈的歷史記錄並添加一個新的事務,那麼他必須回到Block 1並計算一個全新的Block 1散列輸出。這樣的過程將須要大量的計算能力以及時間、金錢和精力。

相關文章
相關標籤/搜索