當前位置:首頁 » 股票資訊 » 哈希謎題
擴展閱讀
海通證券看股票 2025-05-03 00:55:16
股票賬戶能買的哪些etf 2025-05-03 00:36:03

哈希謎題

發布時間: 2023-02-05 03:29:06

㈠ 誰能用pascal 解出 這道題

4M...200W
哈希。

㈡ 深入了解區塊鏈的共識機制及演算法原理

所謂「共識機制」,是通過特殊節點的投票,在很短的時間內完成對交易的驗證和確認;對一筆交易,如果利益不相乾的若干個節點能夠達成共識,我們就可以認為全網對此也能夠達成共識。再通俗一點來講,如果中國一名微博大V、美國一名虛擬幣玩家、一名非洲留學生和一名歐洲旅行者互不相識,但他們都一致認為你是個好人,那麼基本上就可以斷定你這人還不壞。

要想整個區塊鏈網路節點維持一份相同的數據,同時保證每個參與者的公平性,整個體系的所有參與者必須要有統一的協議,也就是我們這里要將的共識演算法。比特幣所有的節點都遵循統一的協議規范。協議規范(共識演算法)由相關的共識規則組成,這些規則可以分為兩個大的核心:工作量證明與最長鏈機制。所有規則(共識)的最終體現就是比特幣的最長鏈。共識演算法的目的就是保證比特幣不停地在最長鏈條上運轉,從而保證整個記賬系統的一致性和可靠性。

區塊鏈中的用戶進行交易時不需要考慮對方的信用、不需要信任對方,也無需一個可信的中介機構或中央機構,只需要依據區塊鏈協議即可實現交易。這種不需要可信第三方中介就可以順利交易的前提是區塊鏈的共識機制,即在互不了解、信任的市場環境中,參與交易的各節點出於對自身利益考慮,沒有任何違規作弊的動機、行為,因此各節點會主動自覺遵守預先設定的規則,來判斷每一筆交易的真實性和可靠性,並將檢驗通過的記錄寫入到區塊鏈中。各節點的利益各不相同,邏輯上將它們沒有合謀欺騙作弊的動機產生,而當網路中有的節點擁有公共信譽時,這一點尤為明顯。區塊鏈技術運用基於數學原理的共識演算法,在節點之間建立「信任」網路,利用技術手段從而實現一種創新式的信用網路。

目前區款連行業內主流的共識演算法機制包含:工作量證明機制、權益證明機制、股份授權證明機制和Pool驗證池這四大類。

工作量證明機制即對於工作量的證明,是生成要加入到區塊鏈中的一筆新的交易信息(即新區塊)時必須滿足的要求。在基於工作量證明機制構建的區塊鏈網路中,節點通過計算隨機哈希散列的數值解爭奪記賬權,求得正確的數值解以生成區塊的能力是節點算力的具體表現。工作量證明機制具有完全去中心化的優點,在以工作量證明機制為共識的區塊鏈中,節點可以自由進出。大家所熟知的比特幣網路就應用工作量證明機制來生產新的貨幣。然而,由於工作量證明機制在比特幣網路中的應用已經吸引了全球計算機大部分的算力,其他想嘗試使用該機制的區塊鏈應用很難獲得同樣規模的算力來維持自身的安全。同時,基於工作量證明機制的挖礦行為還造成了大量的資源浪費,達成共識所需要的周期也較長,因此該機制並不適合商業應用。

2012年,化名Sunny King的網友推出了Peercoin,該加密電子貨幣採用工作量證明機制發行新幣,採用權益證明機制維護網路安全,這是權益證明機制在加密電子貨幣中的首次應用。與要求證明人執行一定量的計算工作不同,權益證明要求證明人提供一定數量加密貨幣的所有權即可。權益證明機制的運作方式是,當創造一個新區塊時,礦工需要創建一個「幣權」交易,交易會按照預先設定的比例把一些幣發送給礦工本身。權益證明機制根據每個節點擁有代幣的比例和時間,依據演算法等比例地降低節點的挖礦難度,從而加快了尋找隨機數的速度。這種共識機制可以縮短達成共識所需的時間,但本質上仍然需要網路中的節點進行挖礦運算。因此,PoS機制並沒有從根本上解決PoW機制難以應用於商業領域的問題。

股份授權證明機制是一種新的保障網路安全的共識機制。它在嘗試解決傳統的PoW機制和PoS機制問題的同時,還能通過實施科技式的民主抵消中心化所帶來的負面效應。

股份授權證明機制與董事會投票類似,該機制擁有一個內置的實時股權人投票系統,就像系統隨時都在召開一個永不散場的股東大會,所有股東都在這里投票決定公司決策。基於DPoS機制建立的區塊鏈的去中心化依賴於一定數量的代表,而非全體用戶。在這樣的區塊鏈中,全體節點投票選舉出一定數量的節點代表,由他們來代理全體節點確認區塊、維持系統有序運行。同時,區塊鏈中的全體節點具有隨時罷免和任命代表的權力。如果必要,全體節點可以通過投票讓現任節點代表失去代表資格,重新選舉新的代表,實現實時的民主。

股份授權證明機制可以大大縮小參與驗證和記賬節點的數量,從而達到秒級的共識驗證。然而,該共識機制仍然不能完美解決區塊鏈在商業中的應用問題,因為該共識機制無法擺脫對於代幣的依賴,而在很多商業應用中並不需要代幣的存在。

Pool驗證池基於傳統的分布式一致性技術建立,並輔之以數據驗證機制,是目前區塊鏈中廣泛使用的一種共識機制。

Pool驗證池不需要依賴代幣就可以工作,在成熟的分布式一致性演算法(Pasox、Raft)基礎之上,可以實現秒級共識驗證,更適合有多方參與的多中心商業模式。不過,Pool驗證池也存在一些不足,例如該共識機制能夠實現的分布式程度不如PoW機制等

這里主要講解區塊鏈工作量證明機制的一些演算法原理以及比特幣網路是如何證明自己的工作量的,希望大家能夠對共識演算法有一個基本的認識。

工作量證明系統的主要特徵是客戶端要做一定難度的工作來得到一個結果,驗證方則很容易通過結果來檢查客戶端是不是做了相應的工作。這種方案的一個核心特徵是不對稱性:工作對於請求方是適中中的,對於驗證方是易於驗證的。它與驗證碼不同,驗證碼是易於被人類解決而不是易於被計算機解決。

下圖所示的為工作量證明流程。

舉個例子,給個一個基本的字元創「hello,world!」,我們給出的工作量要求是,可以在這個字元創後面添加一個叫做nonce(隨機數)的整數值,對變更後(添加nonce)的字元創進行SHA-256運算,如果得到的結果(一十六進制的形式表示)以「0000」開頭的,則驗證通過。為了達到這個工作量證明的目標,需要不停地遞增nonce值,對得到的字元創進行SHA-256哈希運算。按照這個規則,需要經過4251次運算,才能找到前導為4個0的哈希散列。

通過這個示例我們對工作量證明機制有了一個初步的理解。有人或許認為如果工作量證明只是這樣一個過程,那是不是只要記住nonce為4521使計算能通過驗證就行了,當然不是了,這只是一個例子。

下面我們將輸入簡單的變更為」Hello,World!+整數值」,整數值取1~1000,也就是說將輸入變成一個1~1000的數組:Hello,World!1;Hello,World!2;...;Hello,World!1000。然後對數組中的每一個輸入依次進行上面的工作量證明—找到前導為4個0的哈希散列。

由於哈希值偽隨機的特性,根據概率論的相關知識容易計算出,預計要進行2的16次方次數的嘗試,才能得到前導為4個0的哈希散列。而統計一下剛剛進行的1000次計算的實際結果會發現,進行計算的平均次數為66958次,十分接近2的16次方(65536)。在這個例子中,數學期望的計算次數實際就是要求的「工作量」,重復進行多次的工作量證明會是一個符合統計學規律的概率事件。

統計輸入的字元創與得到對應目標結果實際使用的計算次數如下:

對於比特幣網路中的任何節點,如果想生成一個新的區塊加入到區塊鏈中,則必須解決出比特幣網路出的這道謎題。這道題的關鍵要素是工作量證明函數、區塊及難度值。工作量證明函數是這道題的計算方法,區塊是這道題的輸入數據,難度值決定了解這道題的所需要的計算量。

比特幣網路中使用的工作量證明函數正是上文提及的SHA-256。區塊其實就是在工作量證明環節產生的。曠工通過不停地構造區塊數據,檢驗每次計算出的結果是否滿足要求的工作量,從而判斷該區塊是不是符合網路難度。區塊頭即比特幣工作量證明函數的輸入數據。

難度值是礦工們挖掘的重要參考指標,它決定了曠工需要經過多少次哈希運算才能產生一個合法的區塊。比特幣網路大約每10分鍾生成一個區塊,如果在不同的全網算力條件下,新區塊的產生基本都保持這個速度,難度值必須根據全網算力的變化進行調整。總的原則即為無論挖礦能力如何,使得網路始終保持10分鍾產生一個新區塊。

難度值的調整是在每個完整節點中獨立自動發生的。每隔2016個區塊,所有節點都會按照統一的格式自動調整難度值,這個公式是由最新產生的2016個區塊的花費時長與期望時長(按每10分鍾產生一個取款,則期望時長為20160分鍾)比較得出來的,根據實際時長一期望時長的比值進行調整。也就是說,如果區塊產生的速度比10分鍾快,則增加難度值;反正,則降低難度值。用公式來表達如下:

新難度值=舊難度值*(20160分鍾/過去2016個區塊花費時長)。

工作量證明需要有一個目標值。比特幣工作量證明的目標值(Target)的計算公式如下:

目標值=最大目標值/難度值,其中最大目標值為一個恆定值

目標值的大小與難度值成反比,比特幣工作量證明的達成就是礦中計算出來的區塊哈希值必須小於目標值。

我們也可以將比特幣工作量的過程簡單的理解成,通過不停變更區塊頭(即嘗試不同nonce值)並將其作為輸入,進行SHA-256哈希運算,找出一個有特定格式哈希值的過程(即要求有一定數量的前導0),而要求的前導0個數越多,難度越大。

可以把比特幣將這道工作量證明謎題的步驟大致歸納如下:

該過程可以用下圖表示:

比特幣的工作量證明,就是我們俗稱「挖礦」所做的主要工作。理解工作量證明機制,將為我們進一步理解比特幣區塊鏈的共識機制奠定基礎。

㈢ 比特幣掌握在開發者手裡

從一個最基礎的概念來說,比特幣是一個數字化文件或者一個賬單,這個賬單包含了用戶的名字和資產,人們通過改變這個賬單來交換財產和金錢。當鮑勃賣給卡羅爾一個價值5.2bitcoins的割草機,鮑勃的資產多出來5.2個比特幣,卡羅爾的賬戶少掉5.2個比特幣。沒有黃金或者政府發行的貨幣來支持比特幣這些數字。鮑勃願意交易他現實生活中的割草機,用這種賬單里的高級數字,是因為他相信其他人也會相信這個系統。
那麼誰來維護這個賬單並且確定沒有人在欺詐?比特幣的一個目的就是避免任何集中控制的系統,所以每一個參與維護的人都維護他們自己的賬單的副本。這樣所導致的一個令人驚奇的結果就是,每個人都能看到其他人的財產,盡管真實的系統里緊緊使用了數字賬號而沒有名字,但是這也提供了一定程度上的匿名性。
如果每一個人都維護他們自己的賬單,那麼當比特幣發送的時候,所有的賬單是如何保持同步的呢?從一個最基本的點出發,當你想要發送比特幣的時候,你簡單的告訴其他人,通過廣播一條包括了你的賬戶號碼,接受者的賬戶號碼,以及要轉移的比特幣的數量。在整個比特幣網路世界中的人會更新他們的賬單信息。
這里需要說明一點,我描述比特幣如何工作的動力來自於幫助維護系統的那些礦工。但是你也可以使用這個系統去發送比特幣,而不用去維護賬單。
賬戶安全
如果發送比特幣是如此的簡單,簡單到只需要用一些賬戶去創建信息,那麼什麼來阻止一個賊,愛麗絲,用鮑勃的賬號來花掉鮑勃的比特幣呢?就好像驗證紙上面的簽名,比特幣要求一種數字簽名,用來證明發送者是賬戶的真正擁有者,但是與紙上的簽名對比,它是建立在數學演算法上的。
當一個新的賬號被創建,同時會出現一個私鑰通過數學演算法鏈接到賬戶號碼。如果你已經聽說過了比特幣錢包,這些秘鑰都是在它裡面保存的,也就是允許你創建數字簽名的地方。
為了創建一個數字簽名,一個私鑰和一個交易的文本信息將會被輸入一個特殊的密碼哈希函數。另外一個函數會允許其他人檢查這個數字簽名,確定它是由賬戶的真正擁有者創建的,並且適用於特定的一筆交易。
不像是手寫簽名驗證,這些數字簽名不能被復制,不能被重復使用在未來,對每一筆交易來說,數字簽名也都是獨一無二的。
將交易記錄排序
好吧,現在我們知道數字簽名證明了具體是誰發送了比特幣,但是它不能證明的是何時發送的,這將轉變成一個很大的問題。

在我們傳統的銀行業系統當中,如果愛麗絲寫了兩張支票,但是只有足夠的錢去兌現其中一張,那麼銀行會給第一個試圖去兌換支票的人支付現金,會拒絕第二個試圖這么做的人,因為愛麗絲的賬戶將會被取空。
所以這些支票的順序是危險的,因為它會決定誰應該得到支付。不幸的是,在比特幣的世界中,次序是很難被決定的東西,與傳統行業完全不同的是,全世界都是獨一無二的個體。網路延遲會導致交易以不同的順序,到達不同的地點,並且騙子可以在時間戳上面撒謊。
兩個接受者可能同時會認為他們的交易是第一個,然後發送商品,世界上這將允許愛麗絲花她的錢兩次!比特幣阻止這種行為通過提供一種方法讓整個網路去決定交易的順序該如何進行。
當新的交易記錄被創建出來,他們進入到一個未確定交易的池子里。並且從這里,他們被打包到一個巨大的鏈條里,同時固定了他們的順序。
為了選擇哪個交易應該排在下一個,一種數學運氣被包含在當中。參與者選擇一個未確認的交易,並且開始試圖去解決特殊的數學謎題,這謎題將會將她鏈接到區塊鏈的最末端。第一個找到答案的人會獲勝,並且會講他們選擇的交易記錄放在鏈條的下一個(解釋一下這個實際上這些是同一批的交易)。
那麼這個鏈接的問題在哪呢?它是基於一種叫做密碼哈希的特殊函數。名字聽起來很可怕,但它只是混合了它的輸入並且輸出一個數字,但是它同時又是特別的因為它是不可逆的。除了做出大量的猜測,沒有簡單的辦法從一個輸出推出創建出它的輸入信息。並且人們在比特幣的世界中,一直給這個函數提供隨機的數字,直到輸出值與一個特定的值所匹配。
除了一個隨機的猜想,你也可以從未確定的池中和鏈條中輸入一個交易,去試圖改變哈希函數的輸出值。
避免不誠實的賬單
所以類似彩票的運氣提供給整個世界一種方法,去決定哪個交易應該排在下一個,但是它背後的數學演算法同時也幫助確認每個人都在過去的交易信息上達成了一致。
假定你現在第一次進入比特幣的網路,並且要求一個交易信息鏈條的拷貝,去追上進度,但是你接收到好幾個不同的版本,那麼你應該信任哪一個版本呢?
理論上,你應該相信大多數人都在使用的那一個版本,但是要決定這東西在互聯網上是非常難的。是什麼在阻止一個單獨的人瘋狂的投票幾百萬次呢?比特幣阻止這個通過要求人們解決數學謎題,才能投票。這就導致了任何一個投票都必須耗費計算機算力(晶元算力),使得單獨的個人或者團體不太可能會負擔得起壓倒性優勢的投票權和壓倒性優勢的算力。

之前所描述的交易信息排序程序,實際上提供了一個投票系統。區塊鏈末尾的地方會出現分歧,所以每一個猜測都實際上是在給鏈條投票,但是這些投票是如何全部統計的呢?
因為密碼哈希函數已經精確的定義了財產,你可以看到任何給定的答案和估計出將解出它將會花費多少次猜想,就好像估計拋硬幣一連串出現一百次人頭,反動硬幣的次數要多少下一樣。所以在區塊鏈當中的鏈接不僅僅是將交易排序,同時也發揮了有效的投票統計作用,使得看到哪一條鏈是大多數人所使用的,變的簡單。
創建比特幣
最後,比特幣是如何被創建的?每次當有人贏得了類似彩票的運氣猜測,下一個交易區塊將會加入到區塊鏈當中,同時,新的比特幣將會被憑空創造出來,並且獎勵給解決出數學謎題的賬戶。
解決這些問題被通俗的稱為「挖礦」,這就解釋了錢是如何進入系統的,但是數學謎題的最主要目的還是為了確定每個人的賬單的一致性。系統簡單的提供了一個便捷的方法,去隨機的分配金錢到這個世界上。實際上,大約到2140年左右,就不會有更多的比特幣被創造出來了,到那時候,參與者將會僅僅賺取被添加在每一筆交易上的交易費用。

㈣ 關於比特幣的謎題(完結)

你可曾想過: 為什麼礦機算力越大越好?(既然是解數學題那為什麼不是拼誰的演算法厲害啊喂!) 比特幣的數量總和為什麼是2100萬? 比特幣盜竊是怎麼回事? 我不玩比特幣,就真的與比特幣無關了嗎…… 🤔️

關於大眾不再感到陌生的比特幣,背後還有許多巧妙之處。本文介紹了比特幣的基本原理和主要原則,並結合對部分技術細節的剖析,來對上述的一些疑問作出解答。全文較長,約7000字,閱讀時間約為22分鍾,建議收藏後閱讀😁

文章可以分成以下幾個部分:

* 比特幣先驗知識

        -- 密碼學相關

        -- 比特幣重要概念

* 交易的生命周期

* 區塊鏈的構成

* 區塊鏈的生長

         -- 「挖礦」的數學本質

         -- 「礦工」的收益

* 比特幣的共識機制

          -- 比特幣的去中心化共識

          -- 「最長鏈優先」原則

* 比特幣安全性

比特幣作為第一個去中心化的數字貨幣,其設計中運用了不少的密碼學相關知識,主要包括非對稱加密技術、哈希函數等等。理解這些密碼學知識,能幫助我們更好地理解比特幣中的一些概念及規則。

以下是比特幣的一些定義及概念解說,了解過的小夥伴們可以直接跳過~

在比特幣這個創新的支付網路中,一個交易的生命周期大概可以分為幾個階段:創建、傳播和被驗證交織、被打包進區塊記錄到區塊鏈中、獲得更多的確認。圖1對這幾個階段做出了示意。

註:

1⃣️一個支付方A在發起一個比特幣交易時,會使用自己的私鑰對交易信息的哈希值進行簽名。因此A向全網廣播的內容除了交易信息之外,還有自己的公鑰信息、對消息的簽名。其他礦工只要利用A的公鑰即可對這個交易進行驗證,判斷是否真的由A創建。

2⃣️」交易傳播和交易驗證「交替意味著 各個節點基於一定的規則獨立驗證每個交易(共識基礎1) , 一個節點只有認為這個交易有效才會把它繼續傳播出去。

比特幣的底層技術是區塊鏈。區塊鏈系統是一種分布式共識系統,區塊鏈網路中所有的參與節點將就交易的狀態達成一致。

區塊鏈到底是什麼呢?你可以把它理解成一種分布式的交易的共享賬本,以區塊為基本單位鏈接在一起。交易信息將被整理並打包記錄在區塊中。每一個區塊,包含區塊頭,以及緊跟其後的交易列表。區塊頭包含3個區塊元數據集合:前序區塊哈希(嚴格來說是前序區塊頭哈希,因為只有區塊頭被用於哈希運算)、元數據集(包括難度、時間戳、隨機數等)、一個基於加密哈希來高效概括區塊中所有交易的默克爾樹(merkle tree)。了解這個結構,將幫助我們更好地理解挖礦的數學本質。

你可能聽說過「挖礦」這個詞,或者聽說眾人爭相購買挖礦機器來發家致富。但讓人疑惑的是:都說打包區塊的本質是解數學難題,但單憑那些看似簡陋的機器嗡嗡嗡瘋狂耗費電力,就能確保自己解出比特幣難題的勝率高了嗎?比特幣技術原理中,礦工們解決的數學題,難道是一個暴力破解題?

看了一圈,發現礦工們解決的題,還真有點暴力破解的意思,每次嘗試解題的過程幾乎都是茫茫然、去碰運氣的。拼的是誰足夠幸運,也拼誰算的足夠快;算的快了么,試錯次數多,自然勝算也就大了。

解題的背景是這樣的—— 挖礦節點通過基於工作量證明演算法(Proof-of-Work,POW)的證明運算,獨立將交易匯聚到新區塊中(共識基礎2)。 當礦工從網路中接收到一個新的區塊的時候,他發現自己已經在上一輪競爭中失敗了,所以立即開始新區塊的挖礦過程。為了創建一個新的區塊,他從內存池中選擇交易來填充區塊(加入區塊的第一筆交易是一個「鑄幣交易」,3.2節會給出詳相關細節)。接下來是填充欄位來創建區塊頭(包括前序區塊的區塊頭哈希、交易的默克爾樹(Merkel樹)、時間戳、難度目標值、隨機數),然後開始計算這個新區塊的工作量證明。

這個計算的過程簡單來說是對區塊頭部進行兩次sha256運算,得到一個RESULT,如果這個RESULT滿足特定要求,這個人才能算是算對了、才有權利去記賬。滿足要求的RESULT被稱為「工作量證明」(中本聰論文中稱為「proof of work」)。

關於這個計算過程,強調以下幾點:

第一,區塊頭部,包含了前序區塊頭部的哈希、本區塊交易信息的默克爾樹、時間戳、難度目標值、隨機數等信息(見圖2)。

第二,哈希運算具有「知道y,無法推出使得h(x)=y成立的x」、「即使輸入只改變一點點,輸出也會差很多」、「利用任意長度的數據作為輸入,生成一個固定長度的確定結果」的特性。所以大家也不知道什麼樣子的輸入才能產生自己想要的結果,礦工只能不斷嘗試。

第三,前面說到,區塊頭哈希值需要滿足一個特定要求才能成為工作量證明——小於某一閾值,或者說哈希值含有給定前綴。閾值的大小求和挖礦難度有關:挖礦難度是一個動態參數,其值越大,則閾值越小,說明哈希值符合要求的概率更小,礦工每次計算能成為工作量證明的概率越小。比特幣有一個自我調節過程——通過對現有的挖礦算力情況進行估算,來對應調整挖礦難度,可以保證區塊鏈每十分鍾出一個塊,達到控制發行速度的目的。(這個過程的基本思想類似產品筆試的數據估算題,根據「一個提供、一個需要「的思路去構造一個等式,然後求解等式一邊的一個因子;想了解挖礦難度系統和調整方式的同學可以進一步查閱~)

綜合以上三點來看,為了產生工作量證明,用戶基本上會通過調整隨機數來碰運氣(因為其他欄位基本不變)、進行多次運算直至符合要求,別無他法。如此一看,隨機數就具有「幸運數字」的意味了。因此,平均來講,誰計算的能力越強(嘗試的次數越多),就更有希望打包塊。

你可能會想,礦工這么心甘情願地消耗算力去維護區塊鏈,是受到怎樣的利益驅使呢?簡單來說,礦工的收益來源有二:1、計算出工作量證明,創造一個新區塊所獲得的新幣獎勵;2、記賬礦工費。

當礦工找到工作量證明、打包一個新區塊,並把區塊傳送給他的所有對等節點。 每一個挖礦節點都獨立驗證新區塊、把合格的新區塊整合進區塊鏈(共識基礎3) ,並把這個區塊繼續傳給自己的對等節點。結果是,只有經過驗證的區塊才會在網路當中廣泛傳播,保證了誠實礦工挖出的新區塊能被區塊鏈所接納。挖礦成功的個體節點或集體節點,可以同時獲得新幣獎勵和記賬礦工費。

新幣獎勵類似於貨幣的發行,其遵循規則是,第一個四年每一個新區塊產生50btc,第二個四年每一個新區塊產生25btc,第三個四年每個新區塊產生12.5btc,如此周期指數遞減。按照等比數列求和可知,到2140年,比特幣產生的總和約為21000000(所以說比特幣數量有限,天生緊縮)。屆時,不再隨區塊的產生增加新的比特幣,礦工不再擁有第一項收益。但現實中,由於挖礦成本高昂,挖礦成功的往往是是一個礦池的所有參與者。收益被分給礦池地址,礦池按照組內算力貢獻比例來分攤收益的。

記賬礦工費又稱交易費用,以交易輸入和交易輸出之間的差值的形式存在;一個區塊的總交易費用是對加入區塊的所有交易的(交易輸入-交易輸出)求和。一般來說,礦工費越高的交易,會越快被處理。而礦工費在這里起到兩個作用,一個是獎勵礦工,另一個是防止主鏈濫用(防止大家發送交易垃圾信息,因為提出交易是有一定代價的)。

礦工的收益以什麼樣的形式被驗證呢?這里不得不提到 「鑄幣交易」 。每個計算機節點在進行工作量證明計算之前加入區塊的第一筆交易,正是「鑄幣交易」。這個交易從無到有生成比特幣,其金額是新幣獎勵與記賬礦工費的總和,被支付到挖礦礦工自己的比特幣地址。如果礦工找到了一個工作量證明使區塊有效,他就贏得了這個獎勵,因為他構造的「鑄幣交易」生效了。

關於鑄幣交易和「新幣獎勵」,之前有一個讀者問我:一個礦工把自己挖到新區塊的消息公布出去,他的工作量證明 不會被別人剽竊 嗎?

個人認為,至少「鑄幣交易」能防止這件事情發生。讓我們來重申一下計算工作量證明的過程——一個礦工E在新區塊里加入了獎賞自己的「鑄幣交易」,並利用時間戳、前序區塊頭哈希、隨機數、本區塊交易的merkle樹等信息計算出一個符合要求的工作量證明。

在這個過程中,merkle樹啥樣子,取決於包括「鑄幣交易」在內的本區塊所有交易信息。因此可以把鑄幣交易視為工作量證明的間接變數之一。那麼,即使其他人拿到了E的工作量證明,這個工作量證明也是帶有E的印記的、與獎賞E的鑄幣交易相關的,別人根本無法納為己用。

你還可以通過設想以下的場景來加深對共識基礎2「挖礦節點通過基於工作量證明演算法的證明運算,獨立將交易匯聚到新區塊中」的理解。

為什麼一個挖出新區塊的礦工不悄悄使個心眼,在創建區塊之初就把鑄幣交易的金額設成1000BTC呢?原因在於每個節點都是基於相同的規則來獨立驗證區塊的。礦工必須創建完美的、符合公共規則的、正確依據工作量證明方法的區塊;而一個無效的鑄幣交易會導致整個區塊無效,並被其他節點拒絕,永遠無法成為賬本的一部分。可以預想,為了生成這個工作量證明,礦工們已經投入了巨大的算力和電量去挖礦,如果涉嫌欺詐而被否決,其為挖礦付出成本都付諸東流。

綜上所述,礦工不能冒領他人的獎勵,而拿到獎勵的礦工也必須只能拿取符合規定的數額。

   比特幣的卓越之處,在於建立了一種去中心化的自發共識。這種共識是自發產生的,是成千上萬在網路中遵循著共同規則的節點,在非同步交互中形成的,不依賴於任何中央機構的調解和干涉。

   關於比特幣的4項主要共識基礎,本文在講解對應細節時有提及,下面做一個整合:

     這四個過程相輔相成、互相作用,形成了自發的全網共識,促使全網節點組合出可信、公開、權威的總賬。  

你可能會想,比特幣是一個去中心化的、基於大眾信任的、依靠眾人力量運轉的一個東西。萬一有一部分礦工被壞人收買了咋辦呢?「51%攻擊」指的又是什麼?比特幣交易所要求的「6個確認」又是怎麼回事?

這里首先要提到比特幣的一個規則「 最長鏈優先 」。意思是, 比特幣的賬單鏈在出現分叉的時候,每個礦工會獨立選擇長(累積了最多工作量證明)的鏈條,在上面繼續挖礦工作(共識基礎4) 。

這個原則主要涉及到兩個問題:

當有兩個礦工A和B同時挖礦成功(算出符合要求的數學答案)時,他們分別把自己計算出來的工作量證明作為下一個塊的前序區塊哈希,生成一個塊銜接到原有的鏈後面,由此出現了兩個分支。

這個時候,這兩個成功的礦工廣播了自己打包成功的消息。由於區塊鏈是一個去中心化的數據結構,區塊消息到達不同節點的時間點不一致,故不同的節點可能擁有不完全一樣的區塊鏈視圖——有的礦工會先收到A的消息,有的則先收到B的消息。為了解決這個問題,收到消息的礦工們遵循一個原則:選擇並嘗試延長最長的鏈。

因此,這兩條分支會各自成長一小段時間,直到他們的長度出現差異(不可能長度一直相同),比如說其中一條鏈的礦工們,更快地打包在支鏈後面又加上一塊。按照「最長鏈優先「的規則,較短的鏈會被拋棄,原本工作在短鏈上的礦工們都回到長鏈上工作。

換言之,分叉只是不同節點暫時的不一致現象,當新區塊被加入到其中某一分支時,最終收斂將解決這一個問題。[讀者可以思考一下,為什麼區塊鏈被設置成每十分鍾挖出來一個塊:如果時間短了,是不是就增加了分支產生的次數?如果時間長了,是不是交易結算的效率就太低了?]

雙重支付的本質其實也是區塊鏈的分叉,但這種分叉卻是「非自然惡意蓄謀」的產物。

我們假設小敏是密謀雙重支付的一方,她把自己僅有的10BTC先給小強、交換一塊黃金,待這條交易信息P被打包進區塊Q後,她從小強手中拿到了黃金。這時,小敏使了個心眼,她想偷偷抹去、篡改區塊Q上的交易信息P,「白嫖」這塊黃金。為了實現這樣的目的,根據「最長鏈優先」法則,小敏必須剔除該筆交易P後、重新進行結算工作,集中算力來形成分叉,並讓分叉以更快的增速超過並取代Q所在的主鏈。如果小敏確實能讓分叉更長,分叉就成為了主鏈,其他節點也會轉向新主鏈上繼續工作。這樣,小強付出了黃金,卻沒有收到這10個比特幣,「賠了夫人又折兵」。

在這個過程中,小敏需要和原鏈進行「抗爭」,使新分叉成為最長的主鏈,這被稱為「共識攻擊」。「共識攻擊」本質上是對下一區塊的爭奪,攻擊方越「強壯」、哈希算力越大,就越容易成功。

「共識攻擊「成功的可能性有多大呢?

大多數比特幣交易所規定,一個交易傳送到區塊鏈上後需要6個「確認」來完成驗證該筆交易。這一規定的根據是,假設意圖造假的礦工擁有10%的算力(挖礦成功概率0.1),那麼造假礦工要構造另一條偽鏈實施長度超越,必須至少成功挖礦6次。那麼原鏈被取代、被拋棄的概率約為0.1的6次方,趨近於0。你可以把比特幣理解為地質構造層,表層可能因為季節變換而有所改變,甚至可能被風颳走,但一旦深入到地下,地質層就能更加穩定、不受干擾。

而假設有一群擁有了51%算力的礦工,他們控制了一半以上的全網哈希算力,可以故意在區塊鏈中製造分叉、進行雙重支付交易 。但事實是,全網哈希算力的大量增加,個體礦工幾乎不可能控制哪怕1%的哈希算力了(但礦池帶來的算力集中化控制,存在一定的風險)。更何況,如果真有擁有如此強大算力的組織,他完全可以憑借自己強大的算力投入到挖礦中去獲取開發新區塊所獲的的比特幣獎勵,誠實挖礦比雙花更有利可圖。

盡管實際上並未出現51%攻擊的問題,但不可否認的是,算力的集中違背了比特幣去中心化這一初衷,並成為其繼續發展的一大隱患。

一個系統的安全性,往往取決於系統安全的最薄弱環節,這也就是所謂的「木桶原理「。與區塊鏈系統相關的安全性問題包括但不限於以下幾項:

(1)在區塊鏈上被廣泛使用的公鑰系統基本上是安全的,但量子演算法在理論上能夠破解公鑰系統;因此,區塊鏈的演算法安全性是相對的。

(2)區塊鏈協議本身存在邏輯缺陷,例如受到黑客攻擊的區塊鏈系統共識機制。

(3)所有數字貨幣系統高度依賴私鑰,私鑰在存儲、使用方面的安全性成為區塊鏈系統安全性中至關緊要的一環。

盡管區塊鏈是去中心化系統,但目前絕大多數數字交易所卻是中心化的,存在著人為安全漏洞及技術安全漏洞。這些數字交易所擁有存放大量加密貨幣的私鑰,這對於黑客來說無疑是最矚目的目標;只要黑客偷走了這些私鑰,就可以獲取到這些加密貨幣。

作者會繼續閱讀相關資料、不斷完善本文,目標是完成一篇通俗易懂的比特幣科普文章。:)

**本文系網上信息與個人理解的結合,如有偏差及誤讀,歡迎讀者指出。也歡迎給出關於文章結構上的指導~

㈤ 區塊鏈鼻祖比特幣之8:分叉帶來的雙花支付、51%攻擊與解決辦法

分叉

前面講到了比特幣通過區塊鏈+工作量證明的獨特設計來解決了時間順序,但是不能保證在同一時刻有兩個節點算出了正確的解,雖然這種可能性很低很低。這就帶來了區塊的分叉。

雖然說幾乎同時有兩個節點計算出這一數學問題的可能性微乎其微,但是仍然存在這樣的可能性,所以分叉就以為著同一個區塊的後面可能會跟上兩個不同的區塊。

規則的打破一直要到下一個區塊被人解開。則會立即轉向最長的區塊,而那些短的區塊則會被拋棄。數學問題使得區塊很難被同時拆解。要連續發生多次更是困難。最終區塊鏈會穩定下來。也就是說所有人對最後幾個區塊順序達成共識。分叉意味著,譬如,若你的交易出現在較短的支鏈,它就會失去進入區塊鏈的位置。一般而言,只代表他會回到未確認交易池。然後被納入到下一個區塊。

比特幣網路如何解決分叉帶來的雙花支付

可惜,交易失去區塊位置的潛在可能,給了本來定序系統防範的重復支付攻擊機會。考慮下面的一個攻擊者A,其首先用自己的比特幣交換B節點的貨物,其立即又支付給自己。然後其通過努力的製造更長的鏈條來讓自己的支付替代掉B節點的支付,從而實現了雙重支付,B節點既得不到錢,還失去了貨物。

這時交易會退回到未確認池中,因為A節點已經利用參照同樣的input交易取而代之。節點就會認為Bob的交易無效。因為已使用掉。

你可能會猜測A節點會預先的計算出一支區塊鏈,然後抓住時機發布到網路。但是每個區塊的數學謎題阻擋了這個可能性。如前面所訴,解開區塊是猜測出一個隨機數的過程。一旦得出答案,解出的哈希值就會成為指紋一樣的區塊識別。只要區塊內容有一丁點變化,下一個區塊的參考值就會完全不同。此機制的結果就是無法在區塊鏈中置換區塊。在得到前一個區塊之前,下位區塊無法被解開。前一個區塊的指紋也是雜湊函數的引數之一。

同時,該工作量證明機制還解決了在集體投票表決時,誰是大多數的問題。如果決定大多數的方式是基於IP地址的,一IP地址一票,那麼如果有人擁有分配大量IP地址的權力,則該機制就被破壞了。而工作量證明機制的本質則是一CPU一票。「大多數」的決定表達為最長的鏈,因為最長的鏈包含了最大的工作量。如果大多數的CPU為誠實的節點控制,那麼誠實的鏈條將以最快的速度延長,並超越其他的競爭鏈條。如果想要對業已出現的區塊進行修改,攻擊者必須重新完成該區塊的工作量外加該區塊之後所有區塊的工作量,並最終趕上和超越誠實節點的工作量。我們將證明,設想一個較慢的攻擊者試圖趕上隨後的區塊,那麼其成功概率將呈指數化遞減。另一個問題是,硬體的運算速度在高速增長,而節點參與網路的程度則會有所起伏。為了解決這個問題,工作量證明的難度(the proof-of-work difficulty)將採用移動平均目標的方法來確定,即令難度指向令每小時生成區塊的速度為某一個預定的平均數。如果區塊生成的速度過快,那麼難度就會提高。

如果有一台超級電腦,能夠在區塊解題中獲勝?

即便是一台超級電腦,或者時幾百上千台電腦也很難贏得解一個區塊的勝利,因為競爭對手不是任一台電腦,而是整個比特幣網路。你可以用買彩票來比擬。操作千百台電腦,如同買了千百張彩票一樣。

51%攻擊是指的什麼

根據前面的例子,我們知道,要想有50%的概率領先其他人解題得到勝利,就需要掌握全網50%以上的算力。要連續領先他人解出區塊,掌握的運算能力還需要高得多。所以區塊鏈中的交易是受到數學競賽所保護。惡意用戶必須和整個網路較量。區塊連接建立的結果,使得在支鏈越前方的交易越安全。惡意的用戶必須在更長的時間贏過全網路,來達成重復支付,替換前面的區塊鏈。所以,系統只有支端末尾易受到重復支付攻擊。這也是為什麼系統建議多等幾個區塊,才能確認收款成功。

個人博客:https://dreamerjonson.com/

㈥ 區塊鏈和比特幣(一)

區塊鏈(Blockchain)是一種很早就被學界提出但近幾年才被比特幣帶火的一個概念。比特幣是基於區塊鏈技術的一種實現,比特幣是一種加密貨幣,或者叫數字貨幣也可以。我們先以比特幣入手談談比特幣是怎麼利用區塊鏈技術的。

假設06年世界盃決賽期間,兩個互相不認識的足球迷碰到了,義大利打法國,法國球迷說我們法蘭西有齊達內肯定贏你們義大利,義大利球迷不服氣說我們義大利是戰無不勝的,不信咱倆賭100歐元。現實世界裡,怎麼辦呢?

我之前講過我們搞計算機的,90%以上的時間都在處理異常情況,如果人類都很講信用的話,那這個世界可能就不是現在這樣了。秦國當年許給楚懷王那600里地就不是6里了,說不定統一中國的就是楚國了呢也說不定。如果把錢交到第三方手裡,萬一第三方也跑了怎麼辦?把錢私吞了。所以現實的陌生世界單靠一顆善良的心是靠不住的,必須有手段穩穩地保證這個承諾,法律契約等。如今很通用的做法是第三方要找權威機構,比如政府,銀行等,要麼找個有頭有臉的人或組織,歸根結底還是找個有公信力的機構或人。但一般情況下這個第三方肯定會「雁過拔毛」,收取一定比例的手續費。

那麼到底還有沒有辦法來解決這個難題呢?這就是比特幣最初設計的一個初衷,解決兩個陌生人之間的信任問題。

加密演算法 + 多人記賬

首先說加密演算法,這里又要我之前提過的非對稱加密,即公鑰私鑰。每個人都可以有一對或多對公鑰私鑰,但一個公鑰只能有對應的私鑰,反之亦然。其原理就是兩個非常大的質數(p和q)相乘得一個數字(n),如果要根據公鑰破解私鑰的話理論上必須暴力破解,算出這個數字是由哪兩個大質數相乘得來的。目前世界上沒有公布可以破解1024位以上的私鑰,所以採用1024或者2048甚至更長的私鑰是非常安全的。

那麼有了公鑰私鑰,我作為個人就可以用私鑰加密,然後發布公鑰,任何人都可以用我的公鑰解密來確定這就是我本人發布的東西。同理別人給我的轉賬我也可以用他的公鑰解密,從而判斷這個就是某人的身份,這也叫數字簽名。原理都是一樣的,都是加密演算法,利用數學歐拉公式,質數相乘等原理得到的。這是個非常偉大的演算法,叫RSA,由3個數學家提出,我們普通人只要理解到公鑰私鑰的概念和用處就好了。

之前傳統模式里,銀行或者政府機構都有自己單獨的賬本,比如張三轉給了李四100塊,那賬本里怎麼記?張三的賬戶里扣除100, 李四的賬戶里增加100,對吧?

多人賬本也是一樣的道理,只不過從之前的中心化機構變成了分布式,去中心化的多個機構甚至個人。好比李白給杜甫轉了100兩銀子,以前是財政部記賬,區塊鏈里則是唐太宗,楊玉環,張小靜,賀知章等多個人一起記賬,記到李太白轉給了杜子美100兩銀子,以此為證,後面附有李白的印章。這樣一來,有了多個賬本,想要篡改那就難於登天了,李白可以放心的轉給杜甫並且不擔心他會篡改金額或者抵賴。

這樣做就可以解決開始提到的球迷打賭的問題,但還有個問題,別人為什麼要幫我們記賬?

答案是有報酬,這符合人性,不然誰肯幫忙記一筆跟自己沒關系的賬呢?

但最終記賬的人有且只有一個,不然就要亂套了。

有好處的前提下,如何保證哪一個人來記賬呢?這里要涉及到一個數學知識,每個要記賬的人,其實也就是所謂的礦工他在記賬錢必須要解一個數學問題,這個數學問題沒有取巧的辦法,只能通過把數字帶入公式里硬算,演算法就是一個Hash(哈希)演算法,類似於算一串數字出來,礦工只可以猜,除此之外別無他法。而且目前比特幣里這個猜到的概率是萬億分之一,大概一台普通計算機要持續不斷的猜一年才可以猜出來這個數字。

但世界上有成千上萬台計算機,它們如果一起算的話速度會快很多,因為從概率上講肯定會有一個計算機算出來,現實情況也確實如此。看個比特幣真實的例子。

除此之外,還可以看到Miner(挖礦人)是誰, 這個塊里包含了多少比交易(Number of Transactions)。

如果這個礦工是個別有用心的人,他在算出來後,私自篡改轉賬記錄和金額怎麼辦?

A. 篡改交易記錄 / 金額

前面我們介紹了公私鑰加密技術,礦工本身理論上是沒有發款人或收款人的私鑰的,所以他篡改過的交易記錄在用正確的公鑰解密的時候會出錯,最終被認定為非法(這里作者本人不太確定是在什麼時間點做的鑒定,但確定這個記錄是可以被證偽的)。

B. 刪除交易記錄

假設一個場景,張三要在北京4環買一個兩室一廳的房子,但張三不想出這錢還想白占房子,想到了一種偷雞摸狗的辦法就是篡改交易記錄。理論上,在張三付款後,這個記錄產生但並未確認,記錄需要等到一個解出謎題的礦工來做,假設這個礦工是他自己人,他讓礦工把這條記錄抹掉,沒有問題。但做法有幾種:

眾所周知比特幣挖礦需要很長一段時間,因為要做提到很麻煩的數學題,現在這個周期大概是10分鍾所有,這是基於全世界幾十萬礦機同時滿負荷工作的前提下。也就是說每十分鍾有上萬筆交易會被統一確認並放到一個不可改變的區塊里,並且這幾十萬台礦機同時更新自己本地的記錄。

2.1 如果這筆交易剛生成,房東看到了,然後下一秒就把產權過戶給張三,那麼張三如果想篡改這個付款記錄他必須滿足幾個條件:

成功的難度取決於在篡改的記錄之後有多少塊被確認過的區塊。如果只有一個,那麼太簡單了,因為區塊鏈演算法默認礦工在發布新的區塊時,採用第一個收到且較長的區塊。所以這次修改後就一勞永逸,因為所有的賬本都會背同步,但也有一個問題,就是這次同步會被記錄,如果房東查不到賬,張三最終還是會被抓起來的。如果有很多個,比如張三轉賬完後,房東在確認轉賬後1小時才做的產權過戶,那麼張三就必須篡改之前差不多6塊左右的區塊信息,這個很麻煩,因為每一個區塊都會指向上一個區塊,並且每個區塊都會有一個摘要(Hash),這是當前區塊所有交易記錄的匯總。所以如果試圖修改一個很久前的區塊,那麼後面的區塊的摘要都會變掉,這就是哈希樹(MerkleTree)。其他節點是可以報告區塊鏈被篡改的信息的。這就要涉及到最重要的一點,經常有人提到的51%算力,就是說如果張三擁有了超過50%的賬本都承認這次修改,那麼其他節點按照演算法設計也會承認這次修改。不過,先不談世界上基本沒人可以同時做到以上兩點,就算做到了,如果有人對此有疑問,依然可以把系統強制修復,之前以太坊就出過類似的問題,結局是以太坊篡改了整個區塊,追回了被盜取的財產。 以太坊分叉事件 。

以上只是粗淺的介紹了應用區塊鏈技術實現的比特幣的特徵,它可以很好的實現公開,公正,中立和平等。世界上任意兩個陌生人可以依賴比特幣或者其他區塊鏈技術實現互相信任。