《比特幣:端對端電子現金系統》(Bitcoin: A Peer-to-Peer Electronic Cash System)I

AndyLin
Taipei Ethereum Meetup
May 30, 2017

--

隨著比特幣今年暴漲,開始看到有更多人對用區塊鏈技術實現的加密貨幣產生興趣,所以就趁著連假把比特幣發明人-中本聰於 2008 年發表的比特幣白皮書重新翻譯,提供給大家參考!此篇為論文的前半部分,下半部分在下一篇

白皮書的內容為當初中本聰建構比特幣時的架構,現今的比特幣系統與白皮書有部分出入,詳情可參考比特幣網站及相關論壇。

若內容有任何錯誤或疑問,非常歡迎大家指正及回饋:)

《Bitcoin: A Peer-to-Peer Electronic Cash System》

— Satoshi Nakamoto

零、 摘要

一個完全以端對端(peer-to-peer)技術實現的電子現金系統,讓雙方不必透過金融機構,而可以直接從某一方傳送給另一方來進行線上支付。如果仍需要透過可信第三方來避免雙重支付(double-spending,又稱「雙花攻擊」),數位簽章(digital signature)就失去作為解決方案的優勢了。我們提出了一個端對端的網路來解決雙重支付的問題,這個網路透過以下方式對每一筆交易做時間戳記(timestamp),也就是將每一筆交易經過雜湊(hash)運算後加到由「基於雜湊的工作量證明」(hash-based-proof-work)組成的一條不斷延伸的鏈(chain)上。除非重新完成所有工作量證明,這些紀錄將不能被更改。

最長鏈不僅作為一連串事件的見證,也證明了它是來自於很大的 CPU 算力。只要多數的 CPU 算力都由不會聯合攻擊網路的節點(node)所控制的話,誠實的節點就會產生一條最長且超越其他攻擊者的鏈。這個網路本身需要的基礎建設很少,訊息會依據最大努力原則(best effort basis)廣播出去,而節點可自由選擇離開或重新加入網路,並且會承認最長的工作量證明鏈作為節點離開時所發生的交易事件之證明。

ㄧ、介紹

網際網路的商業應用幾乎都依賴金融機構作為處理電子支付的可信第三方。雖然這樣的系統能處理大多數的交易,但以信任為基礎的模式仍有其固有的弱點。由於金融機構出面調解爭議是無可避免的,因此完全不可逆的交易並非實際可行。因為調解成本而提高的交易成本,將會有最小的實際交易規模限制、切斷日常小額支付的可能,也由於不支持不可撤銷的支付,對不可以撤銷的服務進行支付將需要更大的成本。因為交易有被撤銷的可能,對信任的需求將變得更廣泛。商家對於其客戶會更加謹慎,因此會向他們索取完全不必要的個人資訊。有一定比例的詐騙被視為是無法避免的。這些成本及支付的不確定性在使用實體貨幣時皆可避免,但不需透過可信第三方作為通訊渠道的支付機制並不存在。

我們所需要的是一個以加密證明取代信任的電子支付系統,且允許任何有意願的雙方能夠直接交易,而不需要透過可信第三方。運算不可逆(computaionally impractical to reverse)的交易可以避免賣家受騙,而例行的托管機制則可以輕易地保護買家。在這篇論文中,我們透過一個端對端的分散式時間戳記伺服器,產生按時間排序之交易的運算證明,來解決雙重支付的問題。只要誠實節點能夠共同合作去控制比攻擊者們更大的 CPU 算力,這個系統就會是安全的。

二、交易(Transactions)

我們定義一個電子貨幣為一條由數位簽章串成的鏈。每位貨幣的擁有者透過對前一個交易及下一位擁有者的公開金鑰(public key)簽署一個雜湊的數位簽章,並將之加到貨幣尾端的方式來將貨幣轉移給下一位擁有者。收款者可以透過檢查簽章來驗證該鏈的擁有者。

交易(Transactions)

這個過程的問題在於收款者無法驗證其中一位擁有者是否對貨幣進行雙重支付。一般的解法是導入一個可信的中央權威機構或是造幣廠,來確認每一筆交易是否雙重支付。在每一筆交易之後,貨幣必須送回造幣廠以發行新貨幣,並且只有直接從造幣廠發行的貨幣才會被相信沒有被雙重支付。然而,這種解法的問題在於整個貨幣系統的命運都仰賴在負責造幣的公司,就像每筆交易都必須透過銀行一樣。

我們需要有一個方法讓收款者知道前一位擁有者並沒有簽署更早的交易。對實際應用而言,因為我們只在意最早發生的交易,因此不需在意後續企圖雙重支付的交易。確認交易存在的唯一方法是知道所有的交易。在以造幣廠為基礎的模式中,造幣廠必須知道所有交易並且決定哪一筆交易最早抵達。為了在沒有可信第三方的情況下達到這個目的,交易必須被公告出來,並且需要有一個系統讓所有參與者在他們接收交易的順序上達成共識。在每次交易時,收款者都需要有該交易是被大多數節點同意為最早被接收者的證據。

三、時間戳記伺服器(Timestamp Server)

我們提出的解法先由時間戳記伺服器說起。時間戳記伺服器會將由很多項目(item)組成的區塊(block)經過雜湊運算後加上時間戳記,並且如同報紙或 Usenet 發送的方法將雜湊值進行廣播。時間戳記證明了資料在進行雜湊運算時就必然存在。每個時間戳記會將前一個時間戳記也一起進行雜湊運算,接續形成一條鏈,且每一個時間戳記都強化了前一個時間戳記。

時間戳記伺服器(Timestamp Server)

四、 工作量證明(Proof-of-Work)

為了在端對端的基礎上實現一個分散式時間戳記伺服器,我們需使用一個類似 Adam Back 提出的 Hashcash 技術的工作量證明系統,而非像報紙或 Usenet 的發送方法。工作量證明包括檢查由 SHA-256 之類的雜湊演算法計算出的雜湊值有多少前導位元為 0 。平均而言,隨著前導 0 位元的數目上升,所需之工作量將呈指數增加,且可藉由執行一次雜湊運算來驗證。

在我們的時間戳記網路中,我們藉由增加區塊的 nonce 值,直到和前導 0 位元的數量和 nonce 值相等的區塊雜湊值被找到為止,以此作為工作量證明。一旦 CPU 的算力大到能夠滿足工作量證明所需,除非重新去做運算工作否則該區塊無法被更改。而當某個區塊之後的區塊接連被接上鏈後,若想更改該區塊,則需要完成該區塊之後所有區塊的工作量。

工作量證明(Proof of Work)

工作量證明也解決了多數決代表的問題。如果多數是建立在一個 IP 位址對應一票的基礎上,則可能會被任何能擁有許多 IP 者所推翻。工作量證明本質上是一個 CPU 對應一票。多數決由最長鏈表示,因為最長鏈有最大的工作量證明。如果大多數的 CPU 算力被誠實節點所控制,則此誠實的鏈將會成長最快且超越任何競爭者的鏈。若要修改先前的區塊,攻擊者必須重新完成該區塊及該區塊之後所有區塊的工作量證明,並趕上且超越誠實節點的工作量。我們稍後會說明較慢的攻擊者趕上的機率會隨著後續的區塊增加而呈指數消減。

為了解決因為硬體速度的增加及節點參與網路的程度起伏之問題,工作量證明的難度是由每小時平均產生的區塊數量來決定。如果區塊產生的速度越快,則難度也會隨之增加。

五、網路(Network)

以下是網路運作的步驟:

  1. 新的交易會向所有節點廣播。
  2. 每個節點會蒐集新的交易到區塊中。
  3. 每個節點負責找到其區塊的一個困難的工作量證明。
  4. 當節點找到工作量證明後,會將區塊廣播給所有節點。
  5. 節點只有在區塊中的所有交易都有效且尚未被花費時,才會接受該區塊。
  6. 節點會使用已接納之區塊的雜湊值作為創造鏈上新區塊時的前一個雜湊值,來表示接受該區塊。

節點始終會認定最長鏈為正確的且持續擴展它。若有兩個節點同時廣播兩個不同版本的新區塊,部分節點可能會先接收到其中某一個。這時節點會處理先接收到的區塊,但也會保存另一條分支鏈以免它變成最長鏈。當下一個工作量證明被發現且其中一條鏈變成較長的鏈時,這樣的僵局就會被打破,而原本在另一條分支鏈上工作的節點會轉而處理較長的這條鏈。

新的交易並不一定要廣播給所有節點,只要這些交易廣播給足夠多的節點,不久後這些交易就會被整合進一個區塊。區塊的廣播同樣容許訊息丟失,若某個節點沒有接收到某個區塊,當該節點接收到下一個區塊時,就會知道它遺漏了一個區塊並且會產生對該區塊的請求。

六、 獎勵(Incentive)

按照慣例,區塊中的第一個交易比較特別,因為它啟動了一個由該區塊建立者所擁有的新貨幣。這激勵了節點去支持整個網路,且在沒有中央權威機構發行貨幣的情況下,提供了初期貨幣流通的方法。新貨幣數量的穩定增加和礦工為了增加黃金流通而耗費資源去挖礦類似。而在我們的案例中,耗費的資源是 CPU 運算時間和消耗的電力。

獎勵也可以來自於交易手續費。交易的輸入值減去輸出值即為交易的手續費,作為包含此交易的區塊之獎勵。一旦既定數量的貨幣進入流通,獎勵機制就可以完全依靠交易手續費且避免通貨膨脹。

獎勵機制也有助於鼓勵節點保持誠實。若有貪婪的攻擊者能擁有比所有誠實節點還要大的 CPU 算力,那麼攻擊者將面臨以下選擇:進行雙花攻擊來詐取之前的支付或是透過誠實工作來產生新貨幣。攻擊者會發現遵守規則會是比較有利的,因為比起破壞系統及自身財產的合法性,遵守規則能夠使攻擊者擁有更多的電子貨幣。

此篇為比特幣論文的前半部分,由於此篇為筆者首次翻譯論文,若語句不通順及措詞不精準,煩請讀者包含及不吝指正!謝謝:)

Translated in Traditional Chinese from bitcoin.org/bitcoin.pdf 
by @andylinee

--

--