區塊鏈基礎知識梳理(1)
寫在前面
筆者查詢、借鑒了一些資料,看過不少介紹區塊鏈的文章,發現很多文章雖然寫得不錯,但不或多或少會不太適合小白初步了解區塊鏈和位元幣的相關原理,本文旨在通過對位元幣相關機制的介紹,詳細說明區塊鏈的原理和基礎內容,當然,筆者也是剛剛接觸區塊鏈不久,難免會有一些錯誤的理解,還望讀者斧正,全文共計7500字,通過提問和舉例的方式詳細地介紹了位元幣和區塊鏈的相關機制,希望能給大家帶來幫助,
引入:(位元幣)
有個與世隔絕的村子,村子里沒有流通的紙幣,大家通過記賬的方式進行交易,一開始村民進行交易的時候都會把這筆交易記錄下來,當做憑證,村子里的每個人都會在賬目上記錄村子中每條交易資訊,但這么一來,每個人的賬本上都會有除了自己的交易資訊以外的大量其他與自己無關的交易資訊,同時大家也不太愿意花費自己的時間精力和存盤空間記錄他人的賬目,為了減輕大家的作業量,大家決定暫且由村長擔任記賬先生對村子里產生的每一筆交易資訊進行記錄,按照日期每天生成一個賬本,每個賬本都記錄著當天內產生的交易的相關資訊,村長記錄后每天定時定點公布賬單,供大家核對和檢查,村民們核對無誤以后,每個人都會將當日的賬本抄一份自己保留,
顯然,這很像中心化的管理,類似于我們銀行的操作模式,
(1)然而,新的問題來了,村長一直花時間和精力給大家記賬,沒有收益怎么辦?
村民們想了個好辦法,在每次產生交易的程序中,需要為此次交易支付一定的手續費(假設為1元),這個手續費將給予村里的記賬人,
(2)隨著村子的發展,村子的日交易數量逐漸變多,記賬人的收益越來越多,其他人發現記賬有利可圖,認為一直讓一個人記賬不公平,也想參與記賬作業,那要怎么選取記賬人呢?
為了公平地選取記賬人,村民們每天早上擲骰子,根據點數決定誰來記當天的賬,其他人只要核對一下,沒問題就抄寫下來,此處村民們選取記賬人的規則就稱為“共識機制”,確保每個人都有參與記賬的機會,同時,村子里每天會產生一個賬單,每天的賬單其實就是一個區塊,區塊中記錄著當天的交易資訊,而每天的賬單末尾會記錄當天每個村民的交易結余(即每個人還剩多少錢),前一天的交易結余在新一天的賬本中將會作為當日的交易數額(即你有多少錢),通過前一天的交易結余和當天的交易數額以及相鄰的日期等關系就可以串聯起各個賬單(區塊),即為“鏈”,
(3)如果這時候有人想要挪用村里的公款,雖然他不用直接篡改賬本上的資訊(因為大家都會確認賬本上的資訊),但是可以燒掉賬本中的一部分內容,這樣別人就查不出來了,回頭只要告訴大家這是不小心碰到蠟燭,別人也沒什么辦法,如何防止這種事情的發生?
是每個人都擁有一本自己的賬本,任何一個人改動了賬本都必須要告知所有其他人,其他人會在自己的賬本上同樣地記上一筆,如果有人發現新改動的賬目不對,可以拒絕接受,到了最后,以大多數人都一致的賬目表示為準,所以即便是有人真的不小心損壞了一部分賬本的內容,只要找到其他的人去重新復制一份來就行了,
(4)有些村民離賬本公布的地點比較遠或者當天沒時間去核對賬本該怎么辦?
相鄰的村民可以互相抄寫當天的賬本(即鄰居之間相互抄寫賬本),也叫做區塊鏈的路由,此處的村民的相互抄寫可以看作是點對點交流,而村民可以看作一個普通節點,
通過上述描述,我們可以知道區塊鏈有以下特點:
1.難以篡改 2.P2P 3.每個節點都有打包的權利(共識機制) 4.去中心化
進一步說明:
更進一步說明區塊鏈,首先以位元幣舉例,假設有A、B、C、D四個節點,每個節點都會在賬本上記錄四個節點間發生的交易的相關資訊,
同理,會引出以下問題:
(1)為什么每個節點都要記賬?
因為記賬有獎勵,每筆交易需要繳納手續費(比銀行低得多),同時每次記賬打包的人,都會獲得一定的位元幣獎勵(打包獎勵),
2018年,中本聰在一開始發明這個機制的時候,設定的是每10分鐘產生一次區塊,即會每十分鐘會選取一個記賬人,并將這10分鐘產生的交易內手續費和50個位元幣用于獎勵打包的人(記賬人),獎勵的打包費(50個位元幣每四年減少一半,即到2012年以后打包費變為25位元幣,2016年以后打包費變為12.5,以此類推,總計會產生2100萬個位元幣作為打包費,在打包費無限接近0以后,將通過收取手續費獎勵打包人)
(2)這么多節點都記錄了賬單,以誰的賬單為準?
這就涉及我們之前所說的記賬人選取機制,即“共識機制”,只不過此處的共識機制會比較復雜,在位元幣中,各個節點需要通過做“數學題”的方式爭奪記賬權,即為Pow(作業量證明的方式)我們將做題的程序稱為挖礦,誰先做出這道“數學題”,誰就有權利記賬,同時我們把挖礦的人叫做礦工,
“數學題”原理:
此處的“數學題”需要用到哈希函式的知識,以哈希函式中的SHA256為例說明,我們可以將任何字串(小到幾kb的字串,大到10G的電影)輸入SHA256函式中,其輸出結果為唯一的256位的二進制序列(比如輸入為LR即SHA(LR),其輸出即為10001000.....等32位數的唯一的二進制數,當稍微改變輸入值,輸入位LR1即(LR1),其輸出將會有很大變動,即稍微改變輸入的值,將會使得輸出值有巨大變化)
哈希函式正向計算容易,反向計算困難,即為單向函式,舉個例子,對于下面的函式:
知道X未知數,求Y很容易,但知道Y,要求X就很困難,實際上哈希函式還要比所舉例子復雜得多(感興趣可以去看看密碼學相關資料了解具體操作程序,此處僅需知道無論大小如何的字串輸入至哈希函式以后,輸出會得到獨一無二的長度固定的二進制字串)
回到我們之前說的數學題,首先我們得了解區塊的結構,如圖所示,區塊包括區塊頭和區塊體,此處暫且不需要理會區塊體內的具體內容,我們先看到區塊頭,我們的數學題很大一部分來自于區塊頭,
此處的數學題為每個節點有一個字串,字串內容為:
字串=前一個區塊的塊頭+賬單(默克爾根)+時間戳+……(此處僅列舉一部分)+亂數
數學題要求輸入為SHA256(SHA256(字串)),輸出結果為前n位為0的二進制數(序列),即
Hash=SHA256(SHA256(字串))=前n位為0的二進制序列
由字串的組成可知,僅有亂數可以改變,其他部分的內容都是確定的,而因為哈希函式的單向性,很難從輸出結果推算出輸入結果,因此僅能通過改變亂數的數值,逐個暴力計算(盲猜),使輸出滿足所需條件,雖然不同的節點的時間戳、默克爾根(賬單)等資訊可能不同,但總的來說,計算能力越強,也有能力算出所需的二進制序列,
此外,可以通過調整難度,即改變n的值以此確保每10分鐘內必定會產生一個區塊,位元幣一開始設定的n=66,當然會隨著礦機數量的增多(單位時間內運算總數增多)而適當調高題目難度,保證在指定時間內能產生區塊,
(3)如何防偽?(如何證明某個交易資訊說由某個人發起的,某條轉賬新的付款人是A而不是B,如何確保交易資訊不被偽造)
傳統的方式身份認證方式是以簽字(看字跡),指紋,瞳孔(獨一無二的生物特征)等方式進行身份認證,然而,在互聯網中,這些都可以直接進行復制偽造,此時我們需要引入“數字簽名”的概念,
而在計算機世界中,保證數字簽名不被偽造是通過數字摘要和非對稱加密實作的,舉個位元幣中交易的例子:假如現在A發起一筆位元幣轉賬,需要先將該交易進行數字摘要,縮短成一段字串,然后用自己的私鑰對摘要進行加密,形成數字簽名,完成后,需要將交易資訊(包括收款方的地址)和數字簽名一起廣播給記錄“賬本的人”也就是礦工,礦工用A的公鑰進行驗證,如果驗證成功,說明該筆交易確實是A發出的,且資訊未被更改,是完整的,
此處涉及數字簽名需要運用到數字摘要和非對稱加密的知識,現在逐一介紹:
數字摘要
技術用于對所要傳輸的資料進行運算生成資訊摘要,它并不是一種加密機制,但卻能產生資訊的數字”指紋”,它的目的是確保資料沒有被修改或變化,保證資訊的完整性不被破壞,說直白點就是將資料進行hash編碼,它在數字簽名中的作用就是增加被偽造的難度,就好比有些人故意把字要寫的龍鳳鳳舞,目的就是很難讓他人偽造,
在介紹非對稱加密前需要首先介紹對稱加密,
對稱加密
舉個例子:現在A(未成年)想跟他的朋友B想聊一個比較敏感的話題,但是他怕他的老媽會翻看他的手機,要是讓她知道自己跟別人聊這種話題肯定會挨罵,于是A就和朋友B約定好A將中文先翻譯成英文再發過去,然后他那邊可以使用微信翻譯將英文翻譯成中文,這樣即使老媽看到了也無所謂,因為她根本看不懂英語,于是A跟他的朋友B便聊了起來,當A將中文通過翻譯軟體轉換成英文后,發給B,他的朋友B再利用翻譯軟體將英文轉化為中文即可正常讀取你發送的資訊即如圖所示:
如圖所示,無論加密(A將中文資訊翻譯成英文)還是解謎(B將英文資訊翻譯成中文)都運用到了翻譯工具(即一方通過密鑰將資訊加密以后,把密文傳給另一方,另一方通過這個相同的密鑰對密文進行解密)
對稱加密是比較好理解的,將一個密鑰通過加密演算法對明文進行運算得到一個密文,使用同樣的密鑰作為解密演算法的輸入對密文進行解密即可得到原文,如下圖所示:
從這里我們可以看出對稱加密有幾個要素,分別是明文、加密演算法、密鑰、密文以及解密演算法,明文即原始資料,密鑰與明文一起作為加密演算法的輸入,是將明文進行打亂的規則,當然它也是跟密文一起作為解密演算法的輸入,密文自然就是加密演算法得到的結果,
但這么做有缺陷,如果A的老媽使用了微信翻譯將發送出去的英文翻譯成中文她不就看懂了嗎?對的,這就是對稱加密的缺陷,一旦被人拿到了密鑰(在對稱加密中,密鑰就是加解密的規則),那么A發送出去的密文將輕而易舉被人破解,那么有什么方法做到即使一個人的密鑰被盜竊了,最起碼保證A發給其他人發送密文不被破解?就是說即使A的老媽獲取到了你的密鑰,但她仍然無法破解你發送出去的資訊,只有他的朋友B才能查看A發送給他的資訊,這個就是我們要講的非對稱加密,
非對稱加密
在非對稱加密中,不管是資訊的發送方還是資訊的接收方都有一對屬于自己的公鑰和密鑰,公鑰顧名思義就是可以公開,而私鑰就是只能自己看,不能給別人拿到,接著發送方會將資訊進行數字摘要并使用接收方的公鑰進行加密,然后再使用自己的私鑰對數字摘要進行加密,接收方收到加密后的資訊跟加密串,用 發送方的公鑰(因為公鑰是公開的)來解密加密串,得到原始的數字摘要,然后對使用自己的私鑰進行解密的資訊進行摘要后的結果進行比對,如果一致,說明該檔案確實是該發送方發過來的,并且檔案內容沒有被修改過,
非對稱加密如何運用到身份認證中呢?
還是以A給B發資訊為例:A使用他的朋友B的公鑰對你的資訊進行加密,并且對資訊進行數字摘要,然后使用A自己的私鑰對摘要進行加密,即數字簽名,然后將數字簽名和加密后的資訊一起發送給B,B接收到資訊后,先使用A的公鑰對數字簽名進行解密,證明該資訊確實是A發送過來的而不是別人發送過來的(因為可以成功用A的公鑰解密,所以可以說明是A發來的資訊),然后再使用自己的私鑰(B的私鑰)對加密后的資訊進行解密(注意這里只有B的私鑰才能解密資訊,其他人都不可以,即使是A本人也不能解密,所以就算是A的老媽拿到了A的私鑰也沒辦法破解該資訊),然后對該資訊使用同樣的演算法進行數字摘要,如果得到的摘要跟A發送過來的摘要一致,則說明資訊在傳遞的程序中沒有被修改過,(詳情如圖)
回到區塊鏈的防偽:
還是以A要給B發資訊為例,此處A要給B轉100個BTC(位元幣),首先A先將此條交易進行哈希運算處理得到一穿256位的二進制序列,此處稱為數字摘要1,之后再利用A的私鑰對數字摘要1進行加密,稱為密文1,之后將加密以后的密文1以及A的公鑰、A給B轉100個BTC的資訊廣播于其他節點,其他節點收到資訊后,使用A的公鑰對密文1進行解密,得到數字摘要1,同時對“A給B轉100個BTC”這條資訊進行哈希運算,得到數字摘要2,對比數字摘要1和數字摘要2,如果兩個數字摘要完全相同,即可說明此條資訊是A發出的,“A給B轉100個BTC”這條資訊真實完整且未被篡改,(詳情如圖)
此時我們已經做到了防偽造,那么如何防止雙重支付呢?
(雙重支付:即壞人拿一份錢當兩分錢使用,即A只有10個BTC,但A同一時間向全網廣播向C和B分別轉了10個BTC,因為網路延時,其他的節點收到這兩條資訊的時間可能不同,我們該如何防止不同節點確認了不同的交易資訊而產生雙重支付問題呢?)
此處首先要說明位元幣的交易程序:
1.付款人簽署交易單
付款人需要輸入自己的位元幣地址以及收款方的位元幣地址,還要輸入轉賬位元幣的個數,如5個位元幣,然后付款方會發送一個請求給收款方(以P2P的形式發送),在發送這個請求之前付款人會先加上收款人的公鑰和交易資訊,然后再用自己的私鑰加密整個請求,并把自己的公鑰標記在這個請求上,這里需要注意的是付款人不僅要將這個請求發給收款方,還需要以P2P的方式廣播出去告訴其他網路節點,讓所有節點都接收到這個請求, 舉個例子Alice要給Bob轉賬5個位元幣,那么Alice首先要詢問Bob的標識字串(位元幣地址),例如是“ABCDEFG”,同時Alice也有一個標識字串例如是“HIJKLMN”,然后Alice寫一張單子,內容為“HILKLMN支付5位元幣給ABCDEFG”,然后用自己的保密印章(私鑰)蓋一個章,將這張單子交給Bob,
2.收款人確認單據簽署人
收款人收到這個請求后拿著付款人的公鑰進行解密,如果能解密則說明付款人確實是擁有這個私鑰的,進而說明這筆賬是從付款人轉過來的,還可以得到收款人的公鑰(因為上面已經講了付款人會將收款人的公鑰跟交易資訊進行加密)說明這筆賬確實是轉給收款人的,
3.確認付款人余額
通過上面的步驟是可以確定這筆賬確實是付款人發起的,但是沒辦法有效的確認付款人是否真的有足夠的余額進行轉賬(畢竟現在沒有一個中心機構進行認證),所以這個時候就需要礦工來進行確認,這是因為在位元幣的世界里是沒有余額這個概念的,我們在位元幣錢包里看到的“余額”不是我們所理解的余額,它其實是UTXO(意思是未花費的交易輸出,這個打算在第五篇講),驗證付款方是否有余額這個作業通常由礦工來做,而收款方不需要做這個作業,只需要驗證這個請求是否是付款人發起的即可,
PS:如何檢查余額?
實際上,區塊鏈在創立的程序中,交易資訊被大多數節點接收且成功打包到公鏈后才可確認交易資訊(即確認賬款到賬),在交易程序中,比如A要給B轉10個BTC,其他節點會到公鏈上的區塊中查找有關A的交易資訊,并計算出A的“余額”,如果余額大于等于轉賬值,即接受該交易資訊,反之拒絕該交易資訊,我們把余額檢查的程序叫做“追溯”,交易資訊被其他節點拒絕即無法被記入各個節點的賬本中,那么就沒法被打包加入區塊中,
A同時向其他節點廣播向B和C分別轉賬了10BTC的時候(假設A只有10BTC),這兩條交易資訊可能會因為網路延時被記錄到兩個不同的節點中,但這些節點只有一個節點可以打包記賬,因此一旦一個節點獲得記賬權被打包記賬,那么剩下的節點的區塊則會被丟棄,即接受了另一條交易資訊的區塊則被丟棄,因此只有一條交易資訊會被確認,同時A的余額會被修改(即可A剩余BTC為0),則交易池中的另一個交易資訊會因余額不足而不能被節點接收,
(4)如何防止篡改?
按照之前所說的,我們已經了解了如何防止篡改,即無法偽造他人的交易資訊,但還有一個問題,怎么防止壞人修改(刪減)自己之前在某一區塊的交易資訊呢?
首先引入最長鏈原則,正如前文所說的,礦工們通過挖礦的方式爭取記賬權,如果出現兩個礦工同時挖出一個符合條件的區塊的情況(稱為分叉),該如何處理呢?
在某一時刻有兩個礦工同時算出亂數(即獲得記賬權),那么這個時候便會出現一種情況,即一條主鏈叉開變成兩條叉鏈,每條鏈沿著各自的方向延伸下去,如下圖所示:
之所以會出現這種情況是因為每個礦工在開始挖新的區塊之前都會先把上一個區塊復制過來,然后接上這個區塊進行下一個區塊的挖礦作業,而現在在全網中的同一時刻有兩個符合條件的區塊,同時算出這道“數學題”的兩個礦工會向全網廣播自己解出了題目,那么由于距離的遠近(P2P網路,可以理解成有延時),礦工找到的區塊是不一樣的(雖然這兩個區塊都是符合條件的區塊,但他們可能因為距離解出結點的大小不同而接收到不同的區塊),所以有一些礦工會拿到紅色的區塊進行下面的挖礦作業,而有一些礦工會拿到綠色的區塊進行挖礦作業,這就勢必導致上圖所示的情況,這種情況叫分叉,
位元幣則設定了一種機制,即短鏈服從長鏈,首先區塊是由礦工挖出來的,礦工進行挖礦就需要礦機(顯卡),而不同的礦機具有不同的算力(每秒運算多少次),也就是說每個礦工的計算能力是不一樣的,那么,就會出現一種情況,即兩條鏈中會有一條鏈的算力要比另一條鏈大,因此這條鏈的增長速度就會比另一條鏈要快,也就是這條鏈會比另一條鏈長,這時你可能會說那如果兩條鏈的算力一直保持一樣呢?這種情況是不可能會出現的,在短時間內是可能的,但一段時間后這種平衡勢必會被打破,比如有新的礦機出來(新的礦機算力一般都比較高),那么就會有礦工去購買來替換舊的礦機,這就會導致算力不平衡,
但其中一條鏈超過另外一條鏈時,這時全網中就會出現一條最長鏈,那么礦工在進行新的打包區塊作業的時候會把最長鏈全部復制過來,再在這條鏈的基礎上繼續挖礦,當所有礦工都這樣做的時候那么這條鏈就會成為一條主鏈,而另外一條鏈就會被拋棄掉,如下圖所示,紅鏈將會成為主鏈(公鏈),而綠色的鏈將會被廢棄,重新被放入交易池中,等待打包,
其實可以想成“加賽”,如果兩個礦工同一時間挖到礦,其身邊的節點因為網路的延時會對挖出來的區塊進行站隊,站隊后繼續挖礦,誰能挖出下一個礦使得該鏈上的區塊更多(使得該鏈更長),就以誰的鏈為準,當其他礦工發現有比自己所在的鏈還要長的鏈以后,就會放棄自己現在所在的鏈,轉而到較長鏈上站隊,一般而言,6個區塊內即可分出勝負(即可比較出哪條鏈較長,以哪條鏈為準),
如果礦工執意要在那條短鏈上進行挖礦呢?如果這個礦工聰明一點的話他就知道這么做是吃力不討好的,因為一旦他所在的鏈最后沒有成為主鏈的話,他在這條連上挖到的位元幣都會歸零,他之前所做的作業都白費的,所以一般不會去做這種事,
所以,如何篡改交易資訊呢?
如果有個礦工要篡改資訊,他需要擁有比其他所以礦工更多CPU算力(51%攻擊),那么,這個51%攻擊是什么實作的?
假設一個場景,A用100位元幣向B購買一樣商品,步驟如下:
(1)A支付給B 100BTC;
(2)B收到100BTC確認收款后發貨(一般認為6次確認后交易就不可逆轉);
(3)A隨即創建另一筆交易,將同樣的10BTC支付給自己,
如圖所示,A想要撤銷第一筆交易,不用花錢就得到B的商品,為了達到這個目的,A進行了雙重支付,將同樣的100BTC支付給B和自己,在正常的位元幣網路中,一旦第一筆交易經過6次確認后就幾乎不可更改,后續的交易資料將繼續打包成新的區塊依次鏈接下去,可是,如果A用戶擁有51%的算力,情況將會發生有趣的變化,A可以實作雙重支付的目的,即該礦工需要擁有比其他人更多的算力,在現有的鏈條上,打包出比現有主鏈更長的分叉,讓全網公認自己的鏈條是主鏈,
51%攻擊能帶來的收益是非常有限的,只能做到:
1、修改自己的交易記錄,如雙重支付 2、阻止確認部分或全部交易
而下面這些即使是51%攻擊也沒法做到的:
1、憑空生成位元幣; 2、修改每個區塊產生的位元幣數量,
然而,當該礦工掌握了全網51%的算力,他將被迫進行選擇,是通過欺詐以偷回其支付的款項(即雙花攻擊),還是通過(獲取)生成的新貨幣,他應當會發現,按照規則行事更加有利可圖,這樣的規則有利于他比其他聯合起來的每一個人獲取更多的新貨幣,亦優于破壞系統以及損害自己擁有財富的有效性,
寫在最后
有關區塊鏈的知識還有很多,包括共識機制、智能合約、簡單支付驗證(SPV)等內容,之后會逐一補充,如有疑問,歡迎交流,
參考資料:
(1)https://blog.csdn.net/weixin_37504041/article/details/92798560
(2)https://blog.csdn.net/weixin_37504041/article/details/79872329
(3)https://zhuanlan.zhihu.com/p/96314968
(4)https://blog.csdn.net/weixin_37504041/article/details/80070410
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/168127.html
標籤:其他
