「火星公開課」第182期 |格密鏈創始人陳智罡:重溫比特幣白皮書
要點速覽:
1.黎曼猜想對公鑰密碼沒有直接的任何威脅,對區塊鏈的安全也沒有任何影響。
2.目前量子計算機的發展還處於非常原始階段,不會對區塊鏈安全造成威脅。
3.工作量證明就是不斷的取一個隨機數去求解區塊的雜湊值,沒有捷徑可言,就是不斷的嘗試,不斷的計算。
4.新交易在廣播過程中,未必需要到達全部的節點。只要它們能夠到達大多數的節點,那麼這些新交易很快會出現在鏈上的一個新區塊中。
5.時間戳為什麼能夠解決雙花問題?因為要形成一個唯一的不可更改的交易記錄賬本。
6.任何東西有需求才有價值,或者大家認可也會產生價值。比特幣還是有需求的,所以也會產生價值。
9月23日20:00,格密鏈創始人陳智罡做客「火星財經創始學習群」,圍繞“重溫比特幣白皮書”這一主題,與輪值群主亞洲區塊鏈學會會長蔡志川進行了深度對話,內容涵蓋黎曼猜想以及比特幣白皮書關於雙花問題、時間戳、工作量證明等的詮釋。
陳智罡表示,黎曼猜想早在1859年就提出,而公鑰密碼是在70年代末提出的,至今沒有相關論文顯示黎曼猜想會對破解RSA有什麼直接效果,也不會對區塊鏈安全造成影響。
據陳智罡介紹,在比特幣白皮書中,交易的內容就是付款人將該幣支付給收款人, 為了證明付款人能夠將該幣支付給收款人,必須說明四個問題:1.該幣屬於付款人;2.付款人同意將該幣支付給收款人;3.付款地址必須是收款人的地址;4.該幣沒有被雙花。
以下為陳智罡分享原文,由火星財經(微信:hxcj24h)整理:
一、黎曼猜想對公鑰密碼沒有任何直接威脅
蔡志川: 關於黎曼猜想的新聞被炒得轟轟烈烈,都快趕超山竹的威力了!這黎曼猜想據說可能被證明。這個問題真的會對數學界表示很大影響嗎?
陳智罡: 這個問題我剛好在喜馬拉雅的節目“區塊鏈雜談”裡講過了。黎曼猜想精確的刻畫了某個數之前有多少個素數,以及素數之間的距離,但是它並不會導致新的因數分解演算法。
最近由於黎曼猜想可能會被證明,網上充滿了討論,甚至波及到了區塊鏈。有新聞說如果黎曼猜想被證實的話,將危及公鑰密碼學的安全。由於網際網路上使用的都是公鑰密碼,所以網際網路也都不安全了。更具體的猜測是,由於黎曼猜想和素數有關,所以RSA密碼體質將會被攻破。
以上猜測搞得人心惶惶,皆因大家的好奇心,說來也是好事。一個數學界的新聞能讓大家如此關注。我也查了國外一些網站的說法。
由於我是搞密碼學的,又涉足區塊鏈界,所以有些群友不斷在問我。為此我以我的理解及所查的資料,對以上說法進行正本清源。首先我說結論:
第一,黎曼猜想早在1859年就提出,而我們用的公鑰密碼是在70年代末提出的。所以,如果黎曼猜想會對破解RSA加密演算法有什麼幫助的話,一定會早有論文提出。然而,至今為止也沒有看到有相關論文顯示黎曼猜想會對破解RSA有什麼直接效果。
第二,區塊鏈上用的密碼演算法只有兩個:雜湊函式和數字簽名。雜湊函式和素數沒有關係,所以和黎曼猜想沒有關係。數字簽名使用的是橢圓曲線上的方案,所以與大整數分解沒有關係,從而和黎曼猜想也沒有關係。
所以, 黎曼猜想對公鑰密碼沒有直接的任何威脅,對區塊鏈的安全也沒有任何影響。
為了讓大家更好地理解上述結論,我們先來解釋一下什麼是黎曼猜想。要說清黎曼猜想,首先得說素數。素數在自然數中是一種特別的數,它只能被1和自己整除。說白了,素數沒有因子,就像一個人沒有後代(比喻略顯不恰當)。素數的這種孤零零的特性,使得它是整個自然數的“基石”。因為它不能再被分解了,所以只能去構造其他數。因此有個結論,每個自然數都可以唯一地分解成有限個素數的乘積,而且素數的個數是無限的。
素數如此特別,數學家們試圖搞清楚如何判斷一個數是素數。給你一個小的數,例如7,你很容易判斷它是素數。但是當給你一個很大的數字時,判斷一個數是否為素數,是需要方法的。由此產生了素數判定的演算法。
為了更好地理解素數,數學家們在 19 世紀便不再嘗試預測素數的精確位置,轉而將素數的現象視為一個整體。這種分析的方法就是黎曼所擅長的,他著名的猜想也由此得出。
為了理解素數是如何分佈的,高斯給出了一個素數計數函式 π(x) ,它能夠給出某個數之前的素數的數量(即有多少個素數)。隨後,高斯(和勒讓德獨立地)提出了素數定理:當x增長到無窮大時,素數計數函式 π(x) 會近似於 x/ln(x) 函式。這意味著前x個整數中連續素數之間的平均間隙約為 ln(x)。換句話說可以用x/ln(x)近似π(x)。
陳智罡:然後又出現了對數積分函式 Li(x),數學家發現 Li(x)能夠比x/ln(x)更好的近似π(x),說明 Li(x) 能夠更好的刻畫素數的個數。
然而,素數定理所預測的分佈規律與實際仍然有所偏差,而且時大時小。這一切引起了黎曼的注意。
1859年,年僅33歲的黎曼發表了論文《論小於已知數的素數個數》。在該文章中,黎曼定義了一個函式:黎曼 zeta 函式。在論文中黎曼給出了一個推測:黎曼 zeta 函式的所有非平凡零點可能都全部位於實部等於1/2的直線上。具體內容各位可以忽略。那麼黎曼 zeta 函式的非平凡零點有什麼用呢?
黎曼用Li(x)以及zeta 函式的非平凡零點,給出了自己的素數定理,即更準確地估計數字 x 以內有多少個素數。這一精確的刻畫素數個數的定理,讓黎曼大放光彩。到此為止,我們說了黎曼猜想是什麼?簡而言之,就是給出了數字 x 以內更精確的素數個數的公式。
這就是黎曼給出的公式,第二項中x 的 ρ 次冪的ρ就是黎曼 zeta 函式非平凡零點。這就是黎曼 zeta 函式非平凡零點的意義所在,這就是關於黎曼猜想在數學領域上的意義。
有人曾經問希爾伯特,如果500年後能重回人間,他最希望瞭解的事情是什麼?希爾伯特回答說:我想知道,黎曼猜想解決了沒有。數學最重要的任務首先搞清楚自然數的規律。然而到現在,對素數的規律也沒有摸清楚。
二、黎曼猜想對RSA造成影響無相關依據
蔡志川: 是的,密碼學對區塊鏈的重要性不容置疑,那這黎曼猜想的證明會不會對RSA造成影響呢?
陳智罡: RSA所基於的困難問題是“大整數分解困難問題”。即給你一個大的整數,對其分解為素數之積是困難的。這是RSA加密演算法的安全性基礎。
目前對大整數分解用的方法主要是數域篩法,但是這些方法都不能有效的分解大整數。黎曼猜想是巨集觀上對素數的分佈有個判斷,它不能直接求素數,也不能對一個整數進行素數分解。RSA和大整數分解有密切關係。
目前根據文獻,黎曼猜想對於生成素數,例如RSA中的金鑰生成演算法,是有幫助的,但是對於整數分解演算法並沒有直接的提升,所以不會對RSA加密體質有任何影響。
大家一定要區分素數檢測和整數分解是兩回事。很多人都認為是一回事,這是產生錯誤的根源。
對於黎曼猜想的證明,大家更多的認為可能會對數域的結構有個更好的認知。從某些方面,可能會對密碼學有所啟示。
黎曼猜想早在1859年就提出,而我們用的公鑰密碼是在70年代末提出的。所以,如果黎曼猜想會對破解RSA加密演算法有什麼幫助的話,一定會早有論文提出。然而,至今為止也沒有看到有相關論文顯示黎曼猜想會對破解RSA有什麼直接效果。
區塊鏈上用的密碼演算法只有兩個:雜湊函式和數字簽名。雜湊函式和素數沒有關係,所以和黎曼猜想沒有關係。數字簽名使用的是橢圓曲線上的方案,所以與大整數分解沒有關係,從而和黎曼猜想也沒有關係。
蔡志川: 說到這裡,想起另一個偉大的技術突破量子技術,那陳教授能說說量子計算機的出現會不會對區塊鏈造成巨大威脅呢?
陳智罡: 理論上量子演算法能夠加速對大整數的分解,所以對基於大整數分解的RSA是有很大威脅的,對於雜湊函式也有一定的威脅,但是隻要把雜湊函式的位數提高,就可以抵抗目前的量子演算法攻擊。對於橢圓曲線上的加密演算法,量子演算法也是有一定的優勢的。
因此理論上,量子演算法會對區塊鏈的安全有一定的影響。但是,實際上, 目前量子計算機的發展還處於非常非常原始的階段,根本不足以執行實際的演算法,所以量子計算機不會對目前區塊鏈的安全造成威脅 。
另外,抗量子密碼演算法已經比較成熟了,例如格密碼。目前美國的NIST組織正在制定抗量子密碼的標準,第一輪候選方案的徵集已經篩選出69個。主要是兩類演算法:數字簽名,加密演算法。一共有5類體制,如下圖:
我研究的就是格密碼,它基於的困難問題是幾何問題——尋找最短向量,目前是抗量子的。
三、“比特幣裡面沒有幣,而只有交易”
蔡志川: 非常感謝陳博士的解惑,那下面我們讓陳博士帶我們來重溫比特幣白皮書吧!之前看過很多版本的比特幣的白皮書,感覺很多翻譯都有問題。
陳智罡: 是的,這也是我覺得有必要和大家重溫的原因之一。現在市場趨冷,正是技術精進之時。目前市面上的比特幣白皮書翻譯有些錯誤和誤解,例如在交易這節裡,第一句話就翻譯錯了,We define an electronic coin as a chain of digital signatures。
上面這句話的意思是:在比特幣系統中,一個數字貨幣被看作是由數字簽名構成的鏈。而數字簽名是幹什麼的?是用於對交易的簽名,所以一個數字貨幣被看作是由交易構成的鏈。
比特幣系統是一個點對點的數字貨幣系統,所以在該系統中“幣”是一個非常重要的概念。
蔡志川: 那是如何在系統中體現幣呢?
陳智罡: 幣是在交易中流動的。每一次交易,幣就從一個人的手中轉移到另外一個人的手中,不斷迴圈流動。
根據上面的定義,在比特幣系統中,一個數字貨幣被看作是一個由交易構成的鏈,該鏈反映了該幣的每一次交易。注意,這裡的鏈與區塊鏈不是一個意思。
這就是為什麼經常說,比特幣裡面沒有幣,而只有交易的原因。在比特幣系統中,所有體現幣的地方,都用該幣的最近一次交易來代替說明。
蔡志川: 那麼如何能夠保證付款人能夠將該幣支付給收款人呢?
陳智罡: 這需要知道數字簽名的功能是什麼。數字簽名功能有三個:第一,證明該訊息來自於傳送者,該功能稱為認證;第二,傳送者不能否認自己發過該訊息,該功能稱為不可抵賴;第三,傳送的訊息在傳輸的過程中沒有改變,該功能稱為訊息的完整性。
那麼交易的內容是什麼呢?交易的內容就是:付款人將該幣支付給收款人。 為了證明付款人能夠將該幣支付給收款人,必須說明四個問題:1.該幣屬於付款人;2.付款人同意將該幣支付給收款人;3.付款地址必須是收款人的地址;4.該幣沒有被雙花。
那麼如何保證上面的前三點的呢?白皮書緊接著說:Each owner transfers the coin to the next by digitally signing a hash of the previous transaction and the public key of the next owner and adding these to the end of the coin.
就是付款人(數字貨幣的所屬人)通過將上一筆交易以及收款人的公鑰(即收款地址)進行雜湊函式計算,然後對該雜湊值進行數字簽名,最後將簽名附在該幣的後面,以達到證明付款人能夠將該幣支付給收款人的目的。
為什麼付款人要對上一筆交易簽名呢?因為要保證該幣屬於付款人(幣的所屬權)。由於比特幣系統中,幣是由交易體現的,所以該幣應該是之前由某人支付給了當前付款人(即產生了一筆交易),也就是追溯幣的來源,從而說明該幣屬於付款人。如果不能追溯到該幣的上一筆交易,則無法說明該幣屬於當前付款人。公鑰在這裡代表收款人的地址。對上一筆交易和公鑰進行雜湊計算,是為了縮短簽名內容的長度。
緊接著白皮書說:A payee can verify the signatures to verify the chain of ownership.即收款人通過驗證數字簽名來達到驗證幣的所屬權的目的。
緊接著白皮書說:The problem of course is the payee can't verify that one of the owners did not double-spend the coin.
前面說了,為了證明付款人能夠將該幣支付給收款人,必須說明四個問題,前三個問題都有了著落,而第四個問題“該幣沒有被雙花”卻沒有說如何解決。即收款人無法驗證在這些交易中,該幣沒有被雙花。
A common solution is to introduce a trusted central authority, or mint, that checks every transaction for double spending. After each transaction, the coin must be returned to the mint to issue a new coin, and only coins issued directly from the mint are trusted not to be double-spent. The problem with this solution is that the fate of the entire money system depends on the company running the mint, with every transaction having to go through them, just like a bank.
四、如何破解雙花問題
蔡志川: 那比特幣白皮書是如何闡述解決雙花的呢?
陳智罡: 解決雙花問題的一個通常解決辦法是引入一個可信的中心,或者貨幣發行方,通過它們檢查每一筆交易。每次交易完後,貨幣發行方從付款人那裡減掉相應的貨幣,並且從收款人那裡增加相應的新幣。只有通過貨幣發行方發行的貨幣才被認為沒有被雙花的。顯然這種解決方法使得整個貨幣系統依賴於一箇中心,即貨幣發行方,就像我們現在的銀行,每一筆交易都是由它來處理。
We need a way for the payee to know that the previous owners did not sign any earlier transactions. For our purposes, the earliest transaction is the one that counts, so we don't care about later attempts to double-spend. The only way to confirm the absence of a transaction is to be aware of all transactions. In the mint based model, the mint was aware of all transactions and decided which arrived first. To accomplish this without a trusted party, transactions must be publicly announced [1], and we need a system for participants to agree on a single history of the order in which they were received. The payee needs proof that at the time of each transaction, the majority of nodes agreed it was the first received.
所以我們需要一種方法讓收款人知道,在此之前該幣並沒有被雙花過。雙花什麼意思?就是該幣被當前付款人使用後,又被付款人第二次使用。
從交易角度來說,對當前付款人該幣產生了2筆交易,這兩幣交易是有先後順序的。第一筆交易是合法的,而第2筆交易就是雙花,是非法的。
理解到這個層次,才能對白皮書中的這句話理解:For our purposes, the earliest transaction is the one that counts, so we don't care about later attempts to double-spend. 即對當前付款人來說,該幣產生的第一次交易(最早的一筆交易)才是我們關注的,因為這筆交易是合法交易。而對於該幣產生的後面交易都屬於雙花,所以並不需要關注(因為這些雙花交易都是要被廢掉的)。
注意這裡的語境都是對當前付款人來說的,即該幣的所屬人。很多翻譯都是直接按照字面意思翻譯,讀者會讀起來感到莫名其妙,前詞不達後語。
為此,我們必須知道交易的先後順序,這樣才能確定每一筆交易是否合法或者雙花,從而把不該存在的交易剔除。就是這句話的含義:The only way to confirm the absence of a transaction is to be aware of all transactions.
這句話很多人不能夠理解。確實單從字面上很難理解其含義。緊接著白皮書對比了中心化系統下采用的方法。在基於中心化的貨幣發行方的模型下,貨幣發行方知道所有的交易,從而可以判斷交易的先後順序,故而避免雙花。
而在去中心化環境下,由於沒有中心,如何形成一個唯一的且交易具有先後順序 的賬本呢?方法是交易在系統內公開廣播,從而讓所有參與者都知道交易。
光是知道交易是不夠的,關鍵是對交易的順序達成一致共識。因此需要構建一個系統,讓系統內的所有參與者能夠對交易的先後順序達成共識(注意這裡再次說明交易的先後順序是多麼重要。為什麼重要?因為可以解決雙花。為什麼能夠解決雙花?因為可以確定該幣的第一筆交易)。即系統內每個參與者手上都具有唯一的相同的交易鏈(避免了交易鏈的不一致)。
收款人需要證實他收到的每一筆交易都是系統內大多數節點認可的不是雙花的交易,即在此之前對該收款人來說,該幣沒有被花費過,即第一筆交易。所有這一切都是為了解決雙花問題。注意上面只是提出了需求(因此需要構建一個系統……),並沒有給出如何做到對交易順序達成一致共識的方法。
五、關於時間戳
蔡志川: 那又是如何對交易的先後順序達成一致共識呢?
陳智罡: 這裡需要清楚什麼是時間戳。這也是比特幣白皮書裡非常重要的概念,但是這個概念並沒有在普羅大眾中所知。
前面指出為了解決雙花問題,需要系統能夠對交易的先後順序達成一致共識。但是如何做並沒有說。顯然順序和時間有關,那麼在系統內如何體現時間呢?
首先要清楚什麼是時間戳。時間戳就是為某個文件的時間提供證明。在某些商務場合很重要,例如籤合同,時間是具有法律意義的。在電子文件環境下要提供時間戳,需要保證兩件事情:一是文件沒有被修改;二是為該文件新增的時間戳具有信用背書,也就是需要一個可信的第三方機構來發布時間戳。
第一點可以通過對文件的雜湊來解決;第二點如果在可以有中心化的場景,可以通過專業的可信第三方提供時間戳服務。但是現在是點對點的去中心化環境,如何提供時間戳呢?所以白皮書這節的第一句話,就說為了提出解決方案,我們先從時間戳服務說起:The solution we propose begins with a timestamp server.
緊接著白皮書解釋瞭如何提供時間戳:A timestamp server works by taking a hash of a block of items to be timestamped and widely publishing the hash, such as in a newspaper or Usenet post.
時間戳服務可以通過計算區塊資料的雜湊值,並且廣而告之該雜湊值,例如刊登在報紙或者其它媒體上來提供。上述方法通過雜湊解決了資料的不可篡改性,通過報紙等媒體解決了時間性。因為報紙等媒體是按照時間發行,具有時間特徵的。而且雜湊值一旦在報紙等公開媒體釋出,其時間和雜湊值就牢牢繫結無法更改了,被永遠記錄在媒體上。從而實現了分散式時間戳的目的(即不需要一個可信的機構來發布時間戳)。
所以白皮書緊接著說:The timestamp proves that the data must have existed at the time, obviously, in order to get into the hash. Each timestamp includes the previous timestamp in its hash, forming a chain, with each additional timestamp reinforcing the ones before it.
顯然通過計算區塊資料的雜湊值來提供時間戳服務,該時間戳證明了區塊資料在某個時間的存在性。
在計算區塊的雜湊時,包含了前一區塊的時間戳,從而形成了一個鏈條,即每一個區塊的時間戳都包含了它之前區塊的時間戳。
通俗的講,前面所有區塊的特徵都被遺傳到了後面的時間戳中。如果想篡改某一個區塊的時間戳,必須篡改其後的所有時間戳才可以。這是一個非常好的特性,使得時間戳鏈條越長,安全性越好。
陳智罡:從而時間戳鏈條越長,就越能增強前面時間戳的不可篡改性。因為要花更大的代價去篡改其後的所有時間戳。這就是這句話的本質含義Each timestamp includes the previous timestamp in its hash, forming a chain, with each additional timestamp reinforcing the ones before it.
目前的中文版都沒有對背後的意思進行解讀,這是需要功力的。如果不對比特幣系統有深入的理解,很難讀懂其白皮書。
整個白皮書一環套一環,很緊湊,很簡潔,但是也造成了理解上的困難。相信經過我們這樣的深入解析,會讓您豁然開朗。
六、時間戳本質上就是一個雜湊鏈
蔡志川: 聽完陳教授講解,確實時間戳很重要。那麼時間戳和雜湊值之間是什麼樣的關係呢?
陳智罡: 上述論述的時間戳本質上就是一個雜湊鏈,而且每個雜湊值都被打了時間戳的一個鏈。要在點對點的分散式環境下,實現該時間戳是需要一種新機制的。這裡存在一個問題,雜湊只是解決了資料不可篡改的目的,如何和時間掛上鉤呢?
這裡非常重要,可以通過可信的第三方來提供時間戳服務,也可以把雜湊值記錄在報紙等公開的媒體上。但是現在是一個點對點的網路,即不存在中心化的第三方。那麼如何體現可信時間這個概念呢?
由於是點對點的網路,所以時間必須是隨機的由網路中的某個節點提供。如果不是隨機的,就不能體現點對點網路的去中心化特徵,時間就可能被提供者控制。
有些人可能會想,那就由隨機選定的節點提供時間就可以了。這樣做不能保證時間的真實性(因為可能會被篡改),因為不能保證每個節點都是誠實的。
那麼既要保證時間提供者的隨機性,又不能讓提供者直接提供時間,這不是矛盾嗎?如何解決呢?
辦法總是人想出來了的。中本聰想的辦法是通過事件來體現時間,即把事件和時間關聯起來。就像把雜湊值記錄在報紙上一樣。只要事件是隨機的,那麼完成該事件就意味著在某個時間完成了該事件,從而體現了時間,關鍵是體現了交易的先後順序。
七、如何實現時間戳
蔡志川: 陳教授您解釋了這麼多時間戳的概念,那麼如何實現時間戳呢?
陳智罡: 白皮書在工作量證明機制裡,第一句話就點明瞭目的。為了在點對點的去中心化環境下實現分散式時間戳服務,我們使用類似於Adam在Hashcash中提出的一個工作量證明系統,而不是使用報紙或者新聞組這樣的方法。所以後面全部圍繞著如何具體實現上節的時間戳。
由於是在點對點的環境下,所以該時間戳是一個分散式時間戳。下面討論的就是分散式時間戳實現的方法,是對上節時間戳概念的落實。
為什麼要實現時間戳呢?因為要解決雙花問題。 時間戳為什麼能夠解決雙花問題呢?因為要形成一個唯一的不可更改的交易記錄賬本。 注意Hashcash也是一個電子現金系統,是由Adam提出的。中本聰受到該系統的啟發,並且在白皮書中引用了該論文。
此外,上面說了不使用在上節說的報紙或者新聞組來實現時間戳。那麼通過什麼方法來實現呢?白皮書上說了,通過一個叫“工作量證明”的方法。
蔡志川: "工作量證明”這個概念在白皮書裡是如何講的呢?希望聽到原汁原味的。
陳智罡: 什麼是工作量證明呢?白皮書給出了說明:The proof-of-work involves scanning for a value that when hashed, such as with SHA-256, the hash begins with a number of zero bits. The average work required is exponential in the number of zero bits required and can be verified by executing a single hash.
工作量證明就是求解一個雜湊值(例如通過SHA-256求解雜湊值),要求該雜湊值的最高位含有若干個0。平均情況下,該工作量與0的個數呈指數級關係,即雜湊值中0的個數的增加將會讓求解工作量呈指數級增長。而驗證該雜湊值的正確性可以通過執行雜湊函式來進行。
上面說明了工作量證明的難度,即求解滿足要求的雜湊值所花費的時間,與雜湊值的最高位含有多少個0有直接關係。這樣就把工作量證明與時間掛上了鉤。那麼具體如何實現工作量證明呢?白皮書緊接著說了:
For our timestamp network, we implement the proof-of-work by incrementing a nonce in the block until a value is found that gives the block's hash the required zero bits. Once the CPU effort has been expended to make it satisfy the proof-of-work, the block cannot be changed without redoing the work. As later blocks are chained after it, the work to change the block would include redoing all the blocks after it.
蔡志川: 那我接著問,通過工作量證明機制如何實現時間戳的呢?
陳智罡: 為了構建我們的時間戳網路,我們需要實現工作量證明機制,而該機制是通過不斷遞增一個區塊中的隨機數,直到發現一個滿足要求的區塊雜湊值。
所以, 工作量證明就是不斷的取一個隨機數去求解區塊的雜湊值,沒有捷徑可言,就是不斷的嘗試,不斷的計算。 一旦CPU的算力用於完成了工作量證明,即發現了一個滿足要求的雜湊值,也就是找到了放到區塊中的那個隨機數,則如果想改變該區塊中的資料的話,必須再做同樣的事情,即花費CPU的算力去完成工作量證明。
陳智罡:如果該區塊後面又有新的區塊,則改變該區塊中的資料所花費的工作量將包括後面的所有區塊,所以工作量大大增加。
看到這裡,是不是想到了時間戳服務那節所說的:如果想篡改某一個區塊的時間戳,必須篡改其後的所有時間戳才可以。而這裡恰好通過工作量證明機制實現了時間戳服務。至此,你清楚了嗎?工作量證明機制是幹嘛的?
八、工作量證明機制的本質則是一CPU一票
蔡志川: 陳教授確實分析的很到位,有種醍醐灌頂的感覺。“工作量證明”機制是不是還解決了如何確定大多數的問題?
陳智罡: 工作量證明機制還有另外一個特性,緊接著白皮書說到:The proof-of-work also solves the problem of determining representation in majority decision making. If the majority were based on one-IP-address-one-vote, it could be subverted by anyone able to allocate many IPs. Proof-of-work is essentially one-CPU-one-vote. The majority decision is represented by the longest chain, which has the greatest proof-of-work effort invested in it. If a majority of CPU power is controlled by honest nodes, the honest chain will grow the fastest and outpace any competing chains. To modify a past block, an attacker would have to redo the proof-of-work of the block and all blocks after it and then catch up with and surpass the work of the honest nodes. We will show later that the probability of a slower attacker catching up diminishes exponentially as subsequent blocks are added.
工作量證明機制還解決了誰是大多數的問題。如果決定大多數的方式是基於IP地址的,即一IP地址一票,則該機制將被能夠分配大量IP地址的人所破壞。 而工作量證明機制的本質則是一 CPU 一票。 大多數人的決定被表達為最長的鏈,因為最長的鏈包含了最大的工作量。如果大多數的CPU為誠實的節點控制,那麼誠實的鏈條將以最快的速度延長,並超越其他的競爭鏈條。
如果想要對以往的區塊進行修改,攻擊者必須完成該區塊以及其後所有區塊的工作量證明,然後才能趕上和超越誠實節點的工作量。我們將在後面說明,當隨後的塊不斷增加時,一個較慢的攻擊者追趕上的概率將呈指數級遞減。
To compensate for increasing hardware speed and varying interest in running nodes over time, the proof-of-work difficulty is determined by a moving average targeting an average number of blocks per hour. If they're generated too fast, the difficulty increases.
隨著時間的推移,為了應對硬體速度的日益增長以及網路中各個節點參與的不同利益,工作量證明的難度以平均每小時出塊數作為波動平均值。如果每小時的出塊數太快,將增加工作量證明的難度。
九、比特幣網路執行的6個步驟
蔡志川: 那麼比特幣網路到底是如何具體執行的呢?
陳智罡: 白皮書前面說了,為了構造一個分散式時間戳,需要對一個區塊去求解滿足要求的雜湊值。求解雜湊值時,唯一可以調整的引數是隨機數(nounce)。交易就存放在這個區塊裡。那麼問題就來了,各個節點是如何收到交易的呢?如何把交易放到區塊裡呢?所有這一切都是依賴於網際網路的。這節就講了交易如何在網路中的傳播以及如何形成區塊。
比特幣網路執行的步驟如下:1.新的交易通過全網向所有節點廣播;2.每一個節點將收到的新的交易資訊放入一個區塊中;3. 每個節點都為自己的區塊執行工作量證明,以發現一個滿足難度要求的雜湊值;4.當一個節點發現了一個滿足難度要求的雜湊值,它就向全網進行廣播該區塊;5.當且僅當包含在該區塊中的所有交易都是有效的且之前沒有雙花過,其他節點才接受承認該區塊;6.其他節點接受該區塊後,就在該區塊之後製造新的區塊以延長該鏈條,並將被接受區塊的雜湊值寫入新區塊中前一區塊雜湊值(previous hash )的位置。
上述過程把交易的傳播和塊的形成,描述的非常簡潔和清楚。由於網路的傳播是有時延的,如果兩個節點同時廣播自己的區塊,那麼有些節點可能收到的是這個區塊,另外節點可能收到的是另一個區塊,那麼就會造成鏈的分叉。
十、如何解決分叉問題
蔡志川: 再問一下,分叉是如何解決的呢?
陳智罡: 白皮書緊接著說:Nodes always consider the longest chain to be the correct one and will keep working on extending it. If two nodes broadcast different versions of the next block simultaneously, some nodes may receive one or the other first. In that case, they work on the first one they received, but save the other branch in case it becomes longer. The tie will be broken when the next proof- of-work is found and one branch becomes longer; the nodes that were working on the other branch will then switch to the longer one.
所有節點都將最長的鏈條視為正確的鏈條,並在最長的鏈條上繼續工作從而延長它。如果有兩個節點同時廣播了不同的新區塊,那麼先收到哪個新區塊,對於有些節點是有差異的。在此情況下,節點將在自己收到的第一個新區塊上進行工作,但也會保留另外一個產生分叉的鏈,以防後者變成最長的鏈。當下一個新區塊誕生後,其中一個鏈將會被延長,從而分叉的局面被打破。而在另一條鏈上的節點將轉移到最長鏈上工作。
到這裡有個問題,原本以為節點不知道除了自己工作的鏈以外還有其它的分支鏈。但是從上面的敘述可知,當出現分叉的時候,節點會知道有分叉出現的,而且還會儲存另外的分叉鏈,以備將來轉換。
十一、新交易在廣播過程中未必需要到達全部節點
蔡志川: 交易在網路中的廣播,是不是必須所有節點都收到後才可能被裝入到新區塊中(注意新區塊誕生的方法)?同樣,新區塊的廣播是不是所有節點都必須收到才可以,如果新區塊在傳播過程中丟失了,有的節點沒收到怎麼辦?
陳智罡: New transaction broadcasts do not necessarily need to reach all nodes. As long as they reach many nodes, they will get into a block before long. Block broadcasts are also tolerant of dropped messages. If a node does not receive a block, it will request it when it receives the next block and realizes it missed one.
新交易在廣播過程中,未必需要到達全部的節點。只要它們能夠到達大多數的節點,那麼這些新交易很快會出現在鏈上的一個新區塊中。 為什麼呢?因為大多數節點收到了新交易,那麼節點挖出區塊的概率也會以極大的可能落到大多數節點中的某個節點。所以很快該新交易就會出現在鏈上。如果挖出區塊的節點碰巧不在這些大多數節點中,那麼該新交易就不會出現在鏈上的新區塊中。但是同樣以極大的概率出現在下一個新區塊中。
而區塊的廣播對於傳播過程中丟失區塊也具有容錯能力。如果一個節點沒有收到新區塊,那麼該節點在收到新區塊之後的區塊到來時,將會發現自己缺少前一個區塊,從而會請求接收那個缺少的區塊。
以上給出了交易和區塊在網路中廣播可能出現的一些情況及對策。但是細節並沒有講到,只是給出了大致的框架。如果學過計算機網路原理,對以上的過程就不會陌生。根據一些資料顯示,比特幣網路採用的是P2P網路架構,節點之間連線使用的是TCP協議。TCP協議是一種面向連線的可靠協議,它具有處理網路丟包、重傳、校驗等功能。
十二、比特幣系統的激勵機制
蔡志川: 回答非常清楚,另外比特幣系統是如何發行幣的呢?因為沒有中心了。
陳智罡: 通過前面知道,新區塊的誕生是需要耗費CPU的資源以及電力成本的。只有這樣比特幣網路才能執行下去。而這一切都是在點對點去中心化環境下開展的,即一切都是節點自願參與的。因此,為了維持網路的長治久安,必須有相應的獎勵才可以。
By convention, the first transaction in a block is a special transaction that starts a new coin owned by the creator of the block. This adds an incentive for nodes to support the network, and provides a way to initially distribute coins into circulation, since there is no central authority to issue them. The steady addition of a constant of amount of new coins is analogous to gold miners expending resources to add gold to circulation. In our case, it is CPU time and electricity that is expended.
我們約定,每個區塊的第一筆交易是一個特殊的交易。該交易產生一枚新幣獎勵給該區塊創造者,即礦工。給挖礦節點的獎勵主要是為了維持網路的執行,以及在網路中發行新幣進行流通。這樣做是因為網路中沒有中央機構去發行貨幣。
這種將一定數量的新幣穩定新增到貨幣系統中的方法,類似於黃金開採者耗費資源去開採黃金並將其輸入到流通領域。而在我們系統中,耗費的是CPU的時間和電力。
除了挖礦的激勵外,還有交易費的激勵。下面白皮書說到:The incentive can also be funded with transaction fees. If the output value of a transaction is less than its input value, the difference is a transaction fee that is added to the incentive value of the block containing the transaction. Once a predetermined number of coins have entered circulation, the incentive can transition entirely to transaction fees and be completely inflation free.
另外一個激勵的來源則是交易費(transaction fees)。如果某筆交易的輸出值小於輸入值,那麼差額就是交易費,該交易費將被增加到該區塊的激勵值中。一旦一定數量的電子貨幣進入到流通領域,則激勵將完全轉換為依靠交易費。而且此時由於貨幣數量穩定,使得系統將完全免於通貨膨脹。
The incentive may help encourage nodes to stay honest. If a greedy attacker is able to assemble more CPU power than all the honest nodes, he would have to choose between using it to defraud people by stealing back his payments, or using it to generate new coins. He ought to find it more profitable to play by the rules, such rules that favour him with more new coins than everyone else combined, than to undermine the system and the validity of his own wealth.
激勵機制除了能夠維持網路的執行,鼓勵礦工積極幹活,也有助於鼓勵節點保持誠實。如果有一個貪婪的攻擊者能夠調集比所有誠實節點加起來還要多的CPU計算力,那麼他就面臨一個選擇:要麼用於挖礦以獲得新幣獎勵,要麼用於雙花詐騙交易方。他應該發現,如果按照規則行事則更有利可圖,例如挖取更多的新幣,而不是破壞這個系統以及自身財富的合法性。
從激勵這節,我們知道了新幣是如何進入流通領域的,貨幣總量是固定的。除了挖礦可以激勵,交易費也是一種激勵。這讓我想起支付寶這樣的第三方,我們在使用時並不需要付交易費,因為有支付寶這樣的中心機構來管理執行。但是在去中心化的點對點網路,由於沒有中心參與管理,所以一切都得靠節點自願,激勵就顯得很重要。從另外一個角度說,似乎中心化的管理更方便,使用者也不需要手續費。但是就是被中心牢牢控制了。所以有得必有失。
蔡志川: 您如何看待比特幣的價值?
陳智罡:任何東西有需求才有價值,或者大家認可也會產生價值。比特幣還是有需求的,所以也會產生價值。 具體價值個人不好判斷,但是具國外專家推測,比特幣5年內要麼歸0,要麼價值25萬美元。這個要靠大家判斷。如果達成統一共識,那麼就會產生相應的價值。
嘉賓簡介
陳智罡 / 格密鏈創始人
密碼學教授,英國Royal Holloway, University of London訪問學者。中科院資訊保安國家重點實驗室客座研究員,亞洲區塊鏈學會榮譽學術顧問。
對話發起人
於佳寧博士 / 火幣大學校長
中國人民大學經濟學博士,現任火幣大學校長、中國通訊工業協會區塊鏈專委會副主任委員、中國國際經濟技術合作促進會區塊鏈技術與應用工委副祕書長、中國計算機學會區塊鏈專業委員會委員,原工業和資訊化部資訊中心工業經濟研究所所長,《2018年中國區塊鏈產業白皮書》編委會主任。
蔡志川博士 / 亞洲區塊鏈學會會長
亞洲區塊鏈學會會長,香港區塊鏈資產管理有限公司總裁,世界區塊鏈商學院客席教授、英國劍橋大學區塊鏈商業應用講座講師,被譽為香港區塊鏈首席代言人。
文章宣告:本文根據「火星財經創始學習群」嘉賓分享內容整理,不代表火星財經立場,轉載須在文章標題後註明“文章來源:火星財經(微信:hxcj24h)”。