當前位置:編程學習大全網 - 源碼下載 - 比特幣之挖礦與***識(二)

比特幣之挖礦與***識(二)

比特幣***識機制的第三步是通過網絡中的每個節點獨立校驗每個新區塊。當新區塊在網絡中傳播時,每壹個節點在將它 轉發到其節點之前,會進行壹系列的測試去驗證它。這確保了只有有效的區塊會在網絡中傳播。

獨立校驗還確保了誠實 的礦工生成的區塊可以被納入到區塊鏈中,從而獲得獎勵。行為不誠實的礦工所產生的區塊將被拒絕,這不但使他們失 去了獎勵,而且也浪費了本來可以去尋找工作量證明解的機會,因而導致其電費虧損。

當壹個節點接收到壹個新的區塊,它將對照壹個長長的標準清單對該區塊進行驗證,若沒有通過驗證,這個區塊將被拒 絕。這些標準可以在比特幣核心客戶端的CheckBlock函數和CheckBlockHead函數中獲得

它包括:

為什麽礦工不為他們自己記錄壹筆交易去獲得數以千計的比特幣?

這 是因為每壹個節點根據相同的規則對區塊進行校驗。壹個無效的coinbase交易將使整個區塊無效,這將導致該區塊被拒 絕,因此,該交易就不會成為總賬的壹部分。礦工們必須構建壹個完美的區塊,基於所有節點***享的規則,並且根據正 確工作量證明的解決方案進行挖礦,他們要花費大量的電力挖礦才能做到這壹點。如果他們作弊,所有的電力和努力都 會浪費。這就是為什麽獨立校驗是去中心化***識的重要組成部分。

比特幣去中心化的***識機制的最後壹步是將區塊集合至有最大工作量證明的鏈中。壹旦壹個節點驗證了壹個新的區塊, 它將嘗試將新的區塊連接到到現存的區塊鏈,將它們組裝起來。

節點維護三種區塊:第壹種是連接到主鏈上的,第二種是從主鏈上產生分支的(備用鏈),最後壹種是在已知鏈中沒有 找到已知父區塊的。在驗證過程中,壹旦發現有不符合標準的地方,驗證就會失敗,這樣區塊會被節點拒絕,所以也不 會加入到任何壹條鏈中。

任何時候,主鏈都是累計了最多難度的區塊鏈。在壹般情況下,主鏈也是包含最多區塊的那個鏈,除非有兩個等長的鏈 並且其中壹個有更多的工作量證明。主鏈也會有壹些分支,這些分支中的區塊與主鏈上的區塊互為“兄弟”區塊。這些區 塊是有效的,但不是主鏈的壹部分。 保留這些分支的目的是如果在未來的某個時刻它們中的壹個延長了並在難度值上超 過了主鏈,那麽後續的區塊就會引用它們。

如果節點收到了壹個有效的區塊,而在現有的區塊鏈中卻未找到它的父區塊,那麽這個區塊被認為是“孤塊”。孤塊會被 保存在孤塊池中,直到它們的父區塊被節點收到。壹旦收到了父區塊並且將其連接到現有區塊鏈上,節點就會將孤塊從 孤塊池中取出,並且連接到它的父區塊,讓它作為區塊鏈的壹部分。當兩個區塊在很短的時間間隔內被挖出來,節點有 可能會以相反的順序接收到它們,這個時候孤塊現象就會出現。

選擇了最大難度的區塊鏈後,所有的節點最終在全網範圍內達成***識。隨著更多的工作量證明被添加到鏈中,鏈的暫時性差異最終會得到解決。挖礦節點通過“投票”來選擇它們想要延長的區塊鏈,當它們挖出壹個新塊並且延長了壹個鏈, 新塊本身就代表它們的投票。

因為區塊鏈是去中心化的數據結構,所以不同副本之間不能總是保持壹致。區塊有可能在不同時間到達不同節點,導致節點有不同的區塊鏈全貌。

解決的辦法是,每壹個節點總是選擇並嘗試延長代表累計了最大工作量證明的區塊鏈,也就 是最長的或最大累計工作的鏈(greatest cumulative work chain)。節點通過累加鏈上的每個區塊的工作量,得到建立這個鏈所要付出的工作量證明的總量。只要所有的節點選擇最長累計工作的區塊鏈,整個比特幣網絡最終會收斂到壹致的狀態。分叉即在不同區塊鏈間發生的臨時差異,當更多的區塊添加到了某個分叉中,這個問題便會迎刃而解。

提示由於全球網絡中的傳輸延遲,本節中描述的區塊鏈分叉自動會發生。

然而,倒三角形的區塊不會被丟棄。它被鏈接到星形鏈的父區塊,並形成備用鏈。雖然節點X認為自己已經正確選擇了獲勝鏈,但是它還會保存“丟失”鏈,使得“丟失”鏈如果可能最終“獲勝”,它還具有重新打包的所需的信息。

這是壹個鏈的重新***識,因為這些節點被迫修改他們對塊鏈的立場,把自己納入更長的鏈。任何從事延伸星形-倒三角形的礦工現在都將停止這項工作,因為他們的候選人是“孤兒”,因為他們的父母“倒三角形”不再是最長的連鎖。

“倒三角形”內的交易重新插入到內存池中用來包含在下壹個塊中,因為它們所在的塊不再位於主鏈中。

整個網絡重新回到單壹鏈狀態,星形-三角形-菱形,“菱形”成為鏈中的最後壹個塊。所有礦工立即開始研究以“菱形”為父區塊的候選塊,以擴展這條星形-三角形-菱形鏈。

從理論上來說,兩個區塊的分叉是有可能的,這種情況發生在因先前分叉而相互對立起來的礦工,又幾乎同時發現了兩個不同區塊的解。

然而,這種情況發生的幾率是很低的。單區塊分叉每周都會發生,而雙塊分叉則非常罕見。比特幣將區塊間隔設計為10分鐘,是在更快速的交易確認和更低的分叉概率間作出的妥協。更短的區塊產生間隔會讓交易清算更快地完成,也會導致更加頻繁地區塊鏈分叉。與之相對地,更長的間隔會減少分叉數量,卻會導致更長的清算時間。

2012年以來,比特幣挖礦發展出壹個解決區塊頭基本結構限制的方案。在比特幣的早期,礦工可以通過遍歷隨機數 (Nonce)獲得符合要求的hash來挖出壹個塊。

難度增長後,礦工經常在嘗試了40億個值後仍然沒有出塊。然而,這很容 易通過讀取塊的時間戳並計算經過的時間來解決。因為時間戳是區塊頭的壹部分,它的變化可以讓礦工用不同的隨機值 再次遍歷。當挖礦硬件的速度達到了4GH/秒,這種方法變得越來越困難,因為隨機數的取值在壹秒內就被用盡了。

當出現ASIC礦機並很快達到了TH/秒的hash速率後,挖礦軟件為了找到有效的塊, 需要更多的空間來儲存nonce值 。可以把時間戳延後壹點,但將來如果把它移動得太遠,會導致區塊變為無效。

區塊頭需要信息來源的壹個新的“變革”。解決方案是使用coinbase交易作為額外的隨機值來源,因為coinbase腳本可以儲存2-100字節的數據,礦工們開始使用這個空間作為額外隨機值的來源,允許他們去探索壹個大得多的區塊頭值範圍來找到有效的塊。這個coinbase交易包含在merkle樹中,這意味著任何coinbase腳本的變化將導致Merkle根的變化。

8個字節的額外隨機數,加上4個字節的“標準”隨機數,允許礦工每秒嘗試2^96(8後面跟28個零)種可能性而無需修改時間戳。如果未來礦工穿過了以上所有的可能性,他們還可以通過修改時間戳來解決。同樣,coinbase腳本中也有更多額外的空間可以為將來隨機數的擴展做準備。

比特幣的***識機制指的是,被礦工(或礦池)試圖使用自己的算力實行欺騙或破壞的難度很大,至少理論上是這樣。就像我們前面講的,比特幣的***識機制依賴於這樣壹個前提,那就是絕大多數的礦工,出於自己利益最大化的考慮,都會 通過誠實地挖礦來維持整個比特幣系統。然而,當壹個或者壹群擁有了整個系統中大量算力的礦工出現之後,他們就可以通過攻擊比特幣的***識機制來達到破壞比特幣網絡的安全性和可靠性的目的。

值得註意的是,***識攻擊只能影響整個區塊鏈未來的***識,或者說,最多能影響不久的過去幾個區塊的***識(最多影響過去10個塊)。而且隨著時間的推移,整個比特幣塊鏈被篡改的可能性越來越低。

理論上,壹個區塊鏈分叉可以變得很長,但實際上,要想實現壹個非常長的區塊鏈分叉需要的算力非常非常大,隨著整個比特幣區塊鏈逐漸增長,過去的區塊基本可以認為是無法被分叉篡改的。

同時,***識攻擊也不會影響用戶的私鑰以及加密算法(ECDSA)。

***識攻擊也 不能從其他的錢包那裏偷到比特幣、不簽名地支付比特幣、重新分配比特幣、改變過去的交易或者改變比特幣持有紀錄。***識攻擊能夠造成的唯壹影響是影響最近的區塊(最多10個)並且通過拒絕服務來影響未來區塊的生成。

***識攻擊的壹個典型場景就是“51%攻擊”。想象這麽壹個場景,壹群礦工控制了整個比特幣網絡51%的算力,他們聯合起來打算攻擊整個比特幣系統。由於這群礦工可以生成絕大多數的塊,他們就可以通過故意制造塊鏈分叉來實現“雙重支 付”或者通過拒絕服務的方式來阻止特定的交易或者攻擊特定的錢包地址。

區塊鏈分叉/雙重支付攻擊指的是攻擊者通過 不承認最近的某個交易,並在這個交易之前重構新的塊,從而生成新的分叉,繼而實現雙重支付。有了充足算力的保證,壹個攻擊者可以壹次性篡改最近的6個或者更多的區塊,從而使得這些區塊包含的本應無法篡改的交易消失。

值得註意的是,雙重支付只能在攻擊者擁有的錢包所發生的交易上進行,因為只有錢包的擁有者才能生成壹個合法的簽名用於雙重支付交易。攻擊者在自己的交易上進行雙重支付攻擊,如果可以通過使交易無效而實現對於不可逆轉的購買行為不予付款, 這種攻擊就是有利可圖的。

攻擊者Mallory在Carol的畫廊買了描繪偉大的中本聰的三聯組畫(The Great Fire),Mallory通過轉賬價值25萬美金的比特幣 與Carol進行交易。在等到壹個而不是六個交易確認之後,Carol放心地將這幅組畫包好,交給了Mallory。這時,Mallory 的壹個同夥,壹個擁有大量算力的礦池的人Paul,在這筆交易寫進區塊鏈的時候,開始了51%攻擊。

首先,Paul利用自己礦池的算力重新計算包含這筆交易的塊,並且在新塊裏將原來的交易替換成了另外壹筆交易(比如直接轉給了Mallory 的另壹個錢包而不是Carol的),從而實現了“雙重支付”。這筆“雙重支付”交易使用了跟原有交易壹致的UTXO,但收款人被替換成了Mallory的錢包地址。

然後,Paul利用礦池在偽造的塊的基礎上,又計算出壹個更新的塊,這樣,包含這 筆“雙重支付”交易的塊鏈比原有的塊鏈高出了壹個塊。到此,高度更高的分叉區塊鏈取代了原有的區塊鏈,“雙重支付”交 易取代了原來給Carol的交易,Carol既沒有收到價值25萬美金的比特幣,原本擁有的三幅價值連城的畫也被Mallory白白 拿走了。

在整個過程中,Paul礦池裏的其他礦工可能自始至終都沒有覺察到這筆“雙重支付”交易有什麽異樣,因為挖礦程序都是自動在運行,並且不會時時監控每壹個區塊中的每壹筆交易。

為了避免這類攻擊,售賣大宗商品的商家應該在交易得到全網的6個確認之後再交付商品。或者,商家應該使用第三方 的多方簽名的賬戶進行交易,並且也要等到交易賬戶獲得全網多個確認之後再交付商品。壹條交易的確認數越多,越難 被攻擊者通過51%攻擊篡改。

對於大宗商品的交易,即使在付款24小時之後再發貨,對買賣雙方來說使用比特幣支付也 是方便並且有效率的。而24小時之後,這筆交易的全網確認數將達到至少144個(能有效降低被51%攻擊的可能性)。

需要註意的是,51%攻擊並不是像它的命名裏說的那樣,攻擊者需要至少51%的算力才能發起,實際上,即使其擁有不 到51%的系統算力,依然可以嘗試發起這種攻擊。之所以命名為51%攻擊,只是因為在攻擊者的算力達到51%這個閾值 的時候,其發起的攻擊嘗試幾乎肯定會成功。

本質上來看,***識攻擊,就像是系統中所有礦工的算力被分成了兩組,壹 組為誠實算力,壹組為攻擊者算力,兩組人都在爭先恐後地計算塊鏈上的新塊,只是攻擊者算力算出來的是精心構造 的、包含或者剔除了某些交易的塊。因此,攻擊者擁有的算力越少,在這場決逐中獲勝的可能性就越小。

從另壹個角度 講,壹個攻擊者擁有的算力越多,其故意創造的分叉塊鏈就可能越長,可能被篡改的最近的塊或者或者受其控制的未來 的塊就會越多。壹些安全研究組織利用統計模型得出的結論是,算力達到全網的30%就足以發動51%攻擊了。全網算力的急劇增長已經使得比特幣系統不再可能被某壹個礦工攻擊,因為壹個礦工已經不可能占據全網哪怕的1%算 力。

待補充

待補充

  • 上一篇:3.產地-供應商-零售平臺(二)供應及驗貨標準
  • 下一篇:黑馬張三哥告訴我們什麽道理
  • copyright 2024編程學習大全網