區塊鏈技術驅動金融

前言 區塊鏈技術驅動金融 18.5.21

  • 本書是學習區塊鏈技術金融書籍讀書筆記

原版前言部分

前言部分:通往比特幣的漫長道路
在通往比特幣路上,一個個加密支付系統更新迭代,其中貝寶(PayPal)倖存,因爲其及時糾正了最初想在移動設備上進行加密支付這一想法。node

  • 傳統金融體系

政府和貨幣出現以前,物物交易。難點在於協調。以後出現:信用、現金體系。
信用體系:相似於人情之類的。
現金體系:購買,閉環交易。git

  • 網絡信用卡弊端

貝寶交易:中介式結構風格。即買賣家之間存在一箇中介公司。
優勢:不需給賣家提供信用卡信息、我的信息,規避了安全風險、避免泄露我的隱私。
缺點:買賣家沒法直接交流,增長複雜性。算法

中介支付最先在1994年,第一家虛擬公司成立。可是因爲其溝通只能經過電子郵件,用戶有90天拒付期,3個月以後賣家才能收到貨款。
20世紀90年代,出現了安全電子交易協議(SET)。在SET體系中,用戶在網絡購物時,用戶瀏覽器會將交易和信用卡加密存儲在電腦上的應用程序裏,只有中介能解密這些信息。支付時只有中介解密買家信息與商家交易信息進行對比,只有一致狀況下才批准支付。
SET體系行之有效緣由:它的認證機制。認證就是把加密過的身份,即公鑰與現實身份鏈接起來。網絡現金公司和SET體系認爲:安全性比操做的便捷性更重要。數據庫

可是其認證機制相似報稅同樣繁瑣,故不少用戶拒絕使用要求終端客戶端認證的系統。比特幣巧妙的避開了這一難題,無須用戶真實身份,經過公鑰自己來辨別用戶身份。編程

  • 從信用到(加密)現金

對比信用,現金體系須要啓動自循環,規避了賣家拒不償還債務風險。
另外兩個優點是:第一更好的確保了用戶的匿名性。第二是支持線下交易。bootstrap

但比特幣沒有以上兩個特色,但具有兩個相似的功能:
一是匿名性比不上現金。涉及到比特幣匿名性問題。
二是並不徹底支持線下交易,優勢是不須要中央處理器,依賴點對點網絡。數組

1983年,David Chaum 提出把加密技術運用於現金上想法。我可經過數字簽名發送電子紙條,但涉及到雙重支付難題。Chaum提出解決方案是:我給你一張紙條,你記錄下它序列號(不讓我看見),而後我簽名,不須要知道它的序列號。這也就是密碼學裏面的盲籤。瀏覽器

與其預防雙重支付,不如檢測雙重支付。所以,Chaum與兩位密碼學專家提出了一種複雜的加密機制:發行方在電子貨幣中以加密方式嵌入你的我的信息,除了你本人,包括銀行在內的任何人都沒法解密。用電子貨幣消費時:接收方隨機跳遠一部分密碼要求你解密,而且將之記錄下來,但這一部分解密內容不足以暴露你的身份。安全

可是這一機制須要完善,好比以後相關出現的梅克爾樹和零知識驗證。
Chaum的數字現金技術得到了幾項專利,特別時它使用的盲籤技術。其中幾位常常在」網絡朋克「的郵件組裏互動的密碼專家另闢蹊徑。著名的中本聰第一次向全世界宣戰比特幣系統就在一個郵件組裏,前身就是網絡朋克。服務器

數字現金技術失敗的緣由。主要在於它沒能說服銀行和商家使用它。所以,最終敗給了信用卡公司。

  • 憑空發行貨幣

要想創造出一種自由浮動而且具備真實價值的虛擬貨幣,必需要設計出某種稀缺性的東西。虛擬世界,虛擬貨幣只有在須要花一段時間解決了必定的數學計算或謎題以後方可生成,這樣就保證了稀缺性。
比特幣的挖礦就是這樣的。

  • 把一切信息都記錄在數據庫帳本中

區塊鏈是比特幣的另外一項關機按技術,它像一個數據庫帳本,安全記錄全部的比特幣交易信息。
區塊鏈理論基礎由來已久,可追溯到哈勃(Haber)和斯托爾內塔(Stornetta)在1991年發表的一系列論文。提出的是一種能夠安全地對數據文件進行時間戳記錄的方法。時間戳是爲了記錄文件建立的大概時間,而且能夠準確反映文件建立的前後順序:若是一份文件比另一份更早建立,能夠從時間戳看出來。時間戳的安全性體如今:文件的時間戳一旦生成,沒法更改。

關於他們提出的協議:
①用戶發送文件時,其設計的體系可以像用戶提供時間戳服務。
②服務器收到文件時,會用當時時間和指向以前文件的連接或指針做爲簽名,來簽名改文件併產生包含簽名信息的認證。指針這裏指的是一串數據,若是該數據更改,指針自動失效。
注:要想對一份文件進行認證,時間戳服務器必須包括指向之氣那文件認證的哈希指針,當前時間和文件內容自己,並用這三條信息來對文件進行簽名。
✔該協議實現的效果:每份文件的認證都確保了上一份文件內容的完整性。事實上,反覆運用,每次認證基本上都保證了這個認證點以前的全部文件和認證的完整性。

隨後發表的論文提出了一個提高效率方案:沒必要單獨連接各個文件,直接把它們集合成塊,在一條鏈中連接整個塊。每一個塊裏,文件經過樹狀結構而非線性結構的方式相互連接。
優勢:減小了在整個系統中查找特別文件所需的工做量。這一數據結構造成了比特幣區塊鏈的框架。詳情參見第三章。

比特幣將其進行改進,用一種相似於哈希現金的協議來下降在區塊鏈裏增添塊的速度。
①第一點:比特幣體系經過一羣未被認證過的節點,即礦工來記錄時間,經過每一個礦工來記錄塊的信息。任何人均可經過解決數學計算,新建塊,成爲一名礦工。
②第二點:比特幣捨棄了簽名,只依靠哈希指針來確保數據結構的完整性。
③第三點:真正的時間戳對比特幣不是很重要,整個系統的意義在於根據前後順序記錄交易信息,並確保它不能被篡改。事實上,比特幣不按固定時間表產生。
比特幣從根本上融合了用數學計算來控制新幣的產生和用安全的時間戳來記錄交易信息並防止雙重支付這兩種思路。

比特幣以前,有B幣和比特黃金。其區別是:
①後者能夠經過數學計算直接創造貨幣。任何人均可以解題,答案自己就是貨幣。而比特幣體系中解決數學計算並不構成貨幣,只是確保區塊鏈安全,間接地在有限時間裏創造新貨幣。
②後者靠時間戳給貨幣的創造和轉帳簽名,而比特幣不須要被認證過的時間戳,只是用時間戳來保存區塊和交易的前後順序。
③後者在服務器和節點對數據庫帳本的記錄不符時,沒有提供一個明確的解決方案。
④後者都不是正式發佈的體系。B幣是一篇發表在郵件組的文件中提出的,比特黃金是在幾篇博文中提出的。不像比特幣白皮書,沒有給出詳細設定或成都源代碼。

  • 關於中本聰的猜想

中本聰:比特幣創造者化名。

 

第一章 密碼學及加密貨幣概述

法訂貨幣,相似央行的機構控制貨幣供給+實體貨幣上加防僞標識。可是仍然能夠僞造。
加密數字貨幣需採起安全措施以及防止混淆。
兩者不一樣在於:後者安全規則須要徹底經過技術手段,前者則是依賴於中央機構。
本章主要介紹密碼學中的哈希算法(Hash)和數字簽名(digital signature)技術。二者對構建一個加密數字貨幣系統很是關鍵。後面章節介紹:零知識驗證。

1.1 密碼學哈希函數

哈希函數
哈希函數是一個數學函數,有如下三個特性:
①輸入可爲任意大小的字符串
②產生固定大小的輸出。本章假設輸出大小爲256位。
③能進行有效計算即對於特定的輸入字符串,在合理時間內,能夠計算出哈希函數的輸出。對應n位的字符串,其哈希值計算的複雜度爲O(n)。
哈希表
基於哈希函數,建立的數據結構。
因爲專一加密的哈希函數,要使哈希函數達到密碼安全,需知足:
①碰撞阻力 collision-resistance
②隱祕性 hiding
③謎題友好 puzzle-friendliness

特性1 碰撞阻力

碰撞☞:對於兩個不一樣的輸入,產生相同的輸出。
對於哈希函數H(·),沒人能找到碰撞(不表示不存在碰撞),則稱該函數具備碰撞阻力。
x,y是兩個不一樣輸入,但有H(x) = H(y),說明這個函數是哈希碰撞的
注:經過計數論證可證實碰撞的確存在。哈希函數輸入空間無限(包含全部長度的任意字符串),輸出空間有限(只包含特定固定長度的字符串),所以必定會有輸入字符串映射到相同的輸出字符串。實際上根據歌巢原理可知必然會有大量可能的輸入被映射到任意特定輸出。對於加密的哈希函數,有些方法是能保證找到碰撞的。
輸出256位大小的哈希函數,選擇2^256 + 1個不一樣數值,由於輸入大於輸出,必將產生碰撞。
生日悖論是僅僅經過檢驗可能輸出數量的平方根次數,便能答題找到碰撞。
優勢:這個碰撞檢測算法對於每一個哈希函數都有效。
缺點:計算須要花費很長很長時間。

可是:咱們已經證實,世界上沒有哈希函數具備防碰撞特性。咱們實踐中所依賴的加密的哈希函數僅僅是暫未成功找到碰撞的函數,暫且選擇相信這些具備哈希阻力。好比MD5哈希函數找到了碰撞,已經逐漸被淘汰。
應用:信息摘要部分
基於前提:哈希函數H具備碰撞阻力,x,y是兩個不一樣輸入,則能夠假設輸出不一樣。
該論證能夠將哈希輸出做爲信息摘要。
例子是:愛麗絲上傳了很大的文件,如何能在以後下載肯定她下載的文件和她上傳的文件相同。
ⅰ整個文件本地存儲,再對比。麻煩且上傳無心義。
ⅱ無碰撞哈希函數解決這個問題,愛麗絲只須要記住原文件哈希值,下載文件後,計算下載文件的哈希值與之相比。相同,則是。
此處:哈希函數對於一個信息生成固定長度的摘要或生成了總結。

特性2 隱祕性

隱祕性保證:若只知哈希函數的y=H(x),沒有可行的辦法算出輸入值x。
爲實現隱祕性:x的取值需來自一個很是普遍的集合。避免被反解出。
隱祕性哈希函數H具備隱祕性。若是:當其輸入r選自一個高階最小熵的機率分佈,在給定H(r||x)條件下來肯定x是不可行的。(雙豎線||爲鏈接符號,表明把一系列事件、事情聯繫起來)
信息論中最小熵是用戶測試結果可預見性的手段。高階最小熵比較直觀的描述了分佈的分散程度。
應用:承諾
想作的事情稱爲承諾。
該處承諾是個數字化過程:選定一個數字,裝進信封,放到人人可見桌上,這樣則說明你對信封裏數字作出了承諾,打開信封前對他人是祕密,打開以後,來展現承諾數值。

承諾協議:一個承諾協議方案由兩個算法構成。
①承諾函數將信息和一個臨時隨機數做爲輸入,輸出就是一個承諾。
②驗證函數將某個承諾輸出、臨時隨機數及信息做爲輸入。對比。
須要由兩個安全特性:隱祕性和約束性。
此處書中第10頁有具體介紹。
如何執行承諾方案,經過加密的哈希函數:生成一個256位的臨時隨機數等。詳情參見書。

特性3 謎題友好

謎題友好:若是對於任意n位輸出值y,假定k選自高階最小熵分佈,若是沒法找到一個可行的方法,在2^n小不少時間內找到x,保證H(k||x)=y成立,那麼咱們稱哈希函數H爲謎題友好。
應用:搜索謎題
搜索謎題構成:
一個哈希函數H。
從高階最小熵分佈選出的一個取值,id(稱爲謎題ID)
目標集合Y。
該謎題的解決方法爲一個解,x,知足如下公式:
H(id||x) ∈ Y

安全哈希算法
安全哈希算法Secure Hash Algorithm 256 簡稱 SHA-256
SHA-256主要被比特幣世界採用。
要求哈希函數能夠任意長度輸入,只要咱們創建一個用於固定長度輸入的哈希函數,經過通常方法,能夠將接受固定長度的哈希函數轉化爲可接受任意長度輸入的哈希函數。該過程稱爲MD變換。SHA-256是採用這種變換方法的經常使用哈希函數之一。
壓縮函數:通用術語中,這種基礎型,可用於固定長度,具有碰撞阻力的哈希函數被稱爲壓縮函數。
經驗證:若是基本壓縮函數具備碰撞阻力的特性,那經過轉換而生成的哈希函數也具備碰撞阻力。
MD變換
壓縮函數帶入長度爲m的輸入值,產生長度短一些爲n的輸出值。哈希函數的輸入(可爲任意大小)被分爲長度爲m-n的區塊。
MD轉換過程:將每一個區塊與以前區塊的輸出一塊兒帶入壓縮函數,輸出長度變爲(m-n)+n=m=壓縮函數的輸入長度。對於第一個區塊而言,需選取一個初始向量。每次調用哈希函數,這個數字都會被再次使用,實踐中可直接在標準文檔中找到它。最後一個區塊的輸出就是返回的結果。
SHA-256利用壓縮函數,把768位的輸入壓縮成一個256位的輸出,每個區塊的大小是256位。

SHA-256工做原理
SHA-256工做原理

 

未完待續。2018.5.21 22:50
接着。2018.5.22 7:17
哈希函數建模
事實證實,要肯定一系列哈希函數特性以全面達成可證安全極度困難,本書中主要是選出在比特幣和其餘加密數字貨幣中,對哈希函數使用方式很重要的三個特性。即便在這個範圍內,並非全部這些特性對哈希函數的每一次使用都有必要。好比:謎題友好旨在比特幣採礦中具備重要性

1.2 哈希指針及數據結構

哈希指針hash pointer:一種數據結構。即一個指向數據存儲位置及其位置數據的哈希值的指針。
哈希與普通指針相比:普通指針只能告訴數據存儲的位置,哈希指針能夠告訴數據存儲的位置+給你一種方式來驗證數據沒有被篡改過。

哈希指針
哈希指針

 

1.2.1 區塊鏈

區塊鏈block chain:經過哈希指針構建一個鏈表的數據結構。
普通鏈表:有一系列區塊,每一個a區塊既有數據也有一個指向上一個區塊的指針。
區塊鏈中,上一個區塊指針被置換爲哈希指針(所以每一個區塊能告訴上一個區塊的的值在哪裏+該值的摘要=驗證那個值沒有改變)

區塊鏈
區塊鏈

應用:防篡改日誌
創建一個存儲不少數據的日誌數據結構,能將數據附加到日誌末尾。若是想要篡改日誌前面的數據,能夠被檢測到。
分析以下:
若是對手要篡改區塊鏈中間的數據,目的是讓只記得區塊鏈頭部哈希指針的人沒法檢測到篡改行爲。
①對手會改變某區塊k的數據,所以區塊k+1的哈希值(即整個區塊k的哈希值)將不會匹配。(由於哈希函數具備碰撞阻力,故可肯定新的哈希值與改變後的內容不會匹配)
結果:可檢測到區塊k中的新數據及區塊k+1的哈希指針的不一致性。
②對手繼續試圖經過篡改下一個區塊的哈希值掩蓋此次篡改。
結果:到達鏈表的頭部時,這個策略失敗。(即只要將鏈表頭部的哈希指針存儲到對手沒法改動的地方,對手篡改任何區塊,都會被檢測到)
防篡改日誌
防篡改日誌

總之,對手想篡改區塊鏈中任意地方的數據,爲保證內容一致,必須篡改全部的哈希指針直至最開始的地方。可是,最終也由於不能篡改鏈表頭部的指針而失敗。僅經過記住一個哈希指針,就基本記住了整個鏈表的防篡改哈希值。所以可搭建一個包含不少區塊的區塊鏈網絡。
創世區塊:鏈表頭部的哈希指針

 

1.2.3 梅克爾樹

梅克爾樹 Merkle trees:使用哈希指針的二叉樹。
數據結構:
①全部的數據區塊被兩兩分組,指向這些數據區塊的指針被存儲在上一層的父節點中。
②這些父節點再次被兩兩分組,指向父節點的指針被存儲在上一層的父節點中。
③持續反覆。
④最後達到樹的根節點。

梅克爾樹
梅克爾樹

經過記住樹最前面的哈希指針,如同區塊鏈同樣,僅僅經過記住頂部的哈希指針,任何企圖篡改任何數據的行爲都會被檢測到。

 

應用:隸屬證實
梅克爾樹的另外一個特色:能夠實現簡潔的隸屬證實。(這點與區塊鏈不一樣)
原理:爲了證實某個數據區塊來自一個梅克爾樹,只需找到該數據區塊到根節點的路徑。
詳情參見書18頁。

梅克爾樹隸屬證實內容
梅克爾樹隸屬證實內容

 

非隸屬證實:
有了排序梅克爾樹,可在一個對數複雜度的條件下驗證某一個數據區塊並不是來自梅克爾樹。
證實某個特定區塊不屬於梅克爾樹,經過展現被驗證區塊以前+以後的區塊路徑便可。
①若是以前以後兩個區塊在樹上連續,則被驗證區塊與該梅克爾樹之間爲非隸屬關係
②在兩個條目之間,隸屬於梅克爾樹。

總結:可在任何以指針爲基礎的數據結構中使用哈希指針,只要數據結構不存在循環。(若是存在循環,將不能使全部哈希值獲得匹配,由於沒有一個根節點讓咱們追溯)

1.3 數字簽名

數字簽名 digital dignatures 被認爲是對紙上手寫簽名的數字模擬。須要有兩個特性要求:
①可本身製做本身簽名,但任何看到它的人均可驗證其有效性
②但願簽名只與某一特定文件發生聯繫,所以該簽名不能用於代表你贊成或支持另外一份不一樣的文件。
(對於手寫簽名,這條就是確保別人不能將你的簽名從一份文件上扯下來粘貼到另外一份文件末尾)

數字簽名方案:其中generateKeys和sign可採用隨機算法。

⑴ (sk,pk) := generateKeys(keysize) 
generateKeys方法把keysize做爲輸入:產生一對公鑰和私鑰。
私鑰sk:被安全保存,用來簽名一段消息。
公鑰pk:任何人均可找到,拿着它能夠用來驗證你的簽名。
⑵ sig := sign(sk,message) 
簽名過程就是把一段消息和私鑰做爲一個輸入
對於消息輸出是簽名。
⑶ isValid := verify(pk,message,sig)
驗證過程經過把一段消息+簽名消息與公鑰做爲輸入
返回結果爲真:證實簽名屬實。
返回結果爲假:證實簽名消息爲假。

咱們要求兩個性質有效:即有效簽名能夠經過驗證和簽名不可僞造。
① 有效簽名能夠經過驗證:verify(pk,message,sign(sk,message))==true
② 簽名不可僞造

驗證第一條性質:我用個人密鑰sk簽署一條消息後,有人使用個人公鑰pk驗證關於同一條消息的簽名,該簽名必須證明爲正確。

驗證第二條性質:不可爲造性 要求計算上不可能僞造簽名。不可僞造性遊戲:對手和挑戰者一塊兒玩。若是對手可在一個沒有見過的消息上進行簽名,對手贏。反之,挑戰者贏。證實這個數字簽名方案不可僞造。

實踐中的考量
算法概念轉化爲現實中可執行的數字簽名機制,考慮問題不少。
ⅰ不少簽名算法是隨機的,則須要隨機性的良好來源
ⅱ 信息大小 。
解決方法是:對信息的哈希值進行簽署,使用輸出值爲256位的加密的哈希函數,將信息的哈希值做爲信息摘要,哈希函數具備碰撞阻力,所以這種方式是安全的。後面還有一種方法是能夠對哈希指針進行簽署。

1.3.1 橢圓曲線數字簽名算法
橢圓曲線數字簽名算法 ECDSA:比特幣使用的數字簽名方案。(ECDSA是美國政府的標準,是DSA電子簽名算法利用了橢圓曲線的升級版)
注:比特幣使用ECDSA算法,而非標準橢圓曲線"secp 256k1"。

相關參數介紹:
我的密鑰:256位。
公鑰(未壓縮):512位。
公鑰(壓縮):257位。
待簽名信息:256位。
簽名:512位。
注:雖然ECDSA只能簽署256位的信息,但實際上信息在簽署以前老是已經通過哈希壓縮。所以,任何大小的信息都能被有效簽署。

使用ECDSA,確保隨機性良好來源相當重要。不良來源可能會致使密鑰信息的泄露。但ECDSA很古怪,即你若僅在生成簽名時使用了不良隨機,而你使用的密鑰天衣無縫,你的我的密鑰仍是由可能泄露。(這是DSA的古怪之處,並不針對橢圓曲線)。
若是我的密鑰泄露,對手就可僞造你的簽名。
加密貨幣即加密技術
比特幣沒有使用任何加密術,由於沒有加密的須要。不少技術(好比承諾方案)在某種程度上隱藏信息,可是這與加密術不一樣。

1.4 公鑰即身份

從數字簽名模式中拿出一個公共驗證密鑰,並將其一我的或一個系統參與者的身份對等。若是一條消息的簽名被公鑰pk正確驗證,則可認爲pk就是在表達這條信息。從這個角度,公鑰就是身份,讓某人能爲pk身份發聲,必須知道相應的密鑰sk。
結果:可隨時制定新的身份。
實踐中,你可能會使用pk的哈希做爲你的身份(由於公鑰很大)。驗證時候須要兩點:(1)你的身份確實是pk的哈希(2)信息能通過公鑰pk驗證。

去中心化身份管理
公鑰和私鑰的體系,幫助咱們引入去中心化的身份管理的概念。想要新的身份,可隨機生成一個,想要多少就生成多少。事實上,這就是比特幣對待身份的方式。這些身份在比特幣語言中被稱爲地址,地址其實就是公鑰的哈希值。
注:比特幣系統中,你不須要明確地註冊或揭露你的真實姓名,可是你的行爲模式自己多是可識別的。

1.5 兩種簡單的加密貨幣

密碼術到加密貨幣。
1.5.1 高飛幣
高飛幣 GoofyCoin:想到的最簡單的加密貨幣。僅有兩個規則即:制定高飛能夠隨時建立新幣 和 這個新建立的幣都屬於他。
詳情參加書27頁。

高飛幣交易
高飛幣交易

總結:高飛幣規則是
①高飛能夠經過簽署聲明來表示他使用惟一的貨幣編號來建立一個新幣
②幣的全部人能夠經過簽署聲明表示」將這個幣轉給X「(其中X爲公鑰),將其轉給另外一個。
③任何人均可驗證一隻幣的有效性,跟隨哈希指針追溯到它是由高飛建立,並驗證過程當中全部簽名。
隱患是:雙重支付。事實上雙重支付是任何加密貨幣須要解決的主要問題之一,但高飛幣並無解決這個問題,所以不安全,不適合做爲加密貨幣。

 

1.5.2 財奴幣
解決雙重支付問題,涉及到財奴幣ScroogeCoin。
財奴幣是以高飛幣爲基礎建立的,但在數據結構方面更復雜。

第一個概念:
一個叫財奴的指定實體將負責公佈包含全部發生過的交易歷史記錄的僅增帳目(保證了寫入這個帳目的任何數據都會永久保留下來)。
若項目真的僅增,則經過要求全部的交易在被接受前都寫入項目,即可預防雙重支付。
如何執行這個僅增功能?財奴建立一個區塊鏈(造成一系列數據塊,每一個數據塊中都包含一次交易,實踐中優化的作法就是把屢次交易放在同一個區塊中,好比比特幣,每一個區塊包含交易的ID和內容+上一個區塊的哈希指針),進行數字簽名(針對最後一個哈希指針),最後將簽名和區塊鏈一塊兒發佈。

財奴幣系統中的區塊鏈
財奴幣系統中的區塊鏈

哪一種交易做數?只有在財奴簽名的區塊鏈的交易財算數。
爲何財奴簽署每一個區塊還需一個帶哈希指針的區塊鏈?保證僅增特性。財奴可能會試圖增長或移除交易記錄。

 

財奴幣中有兩種交易。
第一種:造幣CreateCoins
基於高飛創造新幣的程序,將其擴展便可在一次交易中建立多個幣量。(造幣交易創造了多個不一樣個數量和歸屬於不一樣擁有者的新貨幣,稱爲虛擬貨幣ID即指該次交易中交易ID和貨幣序號的組合)詳情參見書30頁。
第二種:付幣PayCoins
消耗幣,建立具備相同總值的新幣,新幣可能屬於不一樣的人(公鑰),交易必須由一個支付該幣的人來進行簽署。知足如下四個條件,付幣交易有效:
⑴被消耗的幣爲有效貨幣,即在以前交易中建立的
⑵被消耗的幣在以前交易沒被消耗掉,即不是雙重支出
⑶本次交易產生的幣值=消耗的幣值量,即只有財奴才能夠建立新幣。
⑷本次交易被消耗的全部幣均有其全部者的有效簽署。
注意:直至發佈以前,即便知足前三條件,仍然多是一個被雙重支付搶佔的交易。

財奴幣核心問題
工做原理是:人們能夠看見哪些幣是有效的。防止雙重支付。
問題是:中心化。

寫於2018.5.22 12:53

第二章 比特幣如何作到去中心化

本章目的是讓你對去中心化由一個通盤的認識,以及對比特幣運做機制有所瞭解,最終知道爲何比特幣確實是安全的。

2.1 中心化與去中心化

互聯網就是一個著名的去中心化系統。早期是在AOL記憶ComputerServe(美國最大的在線信息服務機構之一)等圍牆花園式信息服務體系的競爭中,逐漸變得愈來愈風行。
電子郵件實質也是一種簡單郵件傳輸協議STMP的去中心化系統。
中心化與去中心化並不是水火不容,沒有一個系統是徹底中心化或者徹底去中心化的。雖然比特幣系統是去中心化的,但比特幣交易所(一個可將比特幣轉換爲其餘貨幣的平臺)、錢包軟件以及用戶管理比特幣的軟件,能夠是去中心化的或去中心化的。
比特幣如何作到去中心化?
問題1:誰在維護交易帳本?
問題2:誰有權利批准哪一個交易是正當有效的?
問題3:誰在製造新的比特幣?
問題4:誰在制定系統變化規則?
問題5:比特幣是如何取得交易價值的?

2.2 分佈式共識

共識:consensus
分佈式共識:distributed consensus
比特幣是個點對點的系統。

分佈式共識協議:在一個有n個節點的系統中,每個節點都有一個輸入值,其中一些節點具備故障,甚至是惡意的。一個分佈式共識協議有如下兩個屬性:
①輸入值的停止須經全部誠實節點來肯定
②這個輸入值必須由城市節點來生成
例子:當Alice向Bob付款的時候,Alice須要向整個比特幣點對點網絡進行廣播。

廣播交易
廣播交易


注:Bob在Alice廣播時不必定在以上網絡中,可是Bob是否運行節點並不影響他收到愛麗絲轉給他的比特幣。

 

比特幣網絡裏,節點要達成怎樣的共識呢?
⑴比特幣體系中,在任什麼時候點,全部在點對點網絡上的節點都有包含一系列區塊的總賬本,每一個區塊中都包含了已經被全部節點達成共識的交易清單。
⑵可是,每一個節點還有一堆沒有被打包進入區塊的交易(網絡節點已經被通知、交易已經發生,可是尚未被寫進區塊的交易)。網絡節點對於這些交易還沒達成共識,故每一個節點都有一個略有差別、尚待確認的交易池。實際中,點對點網絡不完美,因此有些節點聽到了交易,有些則沒有聽到。

全部的節點如何對一個區塊達成共識呢?
詳情參加書41頁。
達成共識幾個技術上的問題:
⑴達成共識通常是個難題,有些節點會死機或者根本就是惡意節點。
⑵就比特幣而言,點對點網絡不完美,並不是全部對應的節點是兩兩相連的,互聯網連接的不良可能會形成網絡問題,要執行一個全部節點都參與的共識協議彷佛並不現實。
⑶因爲交易信息是分佈在整個互聯網上的,信息傳遞會有嚴重延遲。
延遲與全球時間
比特幣協議達成共識時必須直面兩大障礙:
①是不完美網絡,好比信息延遲和節點死機
②是某些故意搞破壞的節點。
嚴重網絡延遲的一個後果是:節點之間沒有一個統一的全球時間的概念。並不是全部的節點都能根據每一個交易的時間戳來達成交易時間共識。

2.2.1 不可能性結論
在全球時間上的不統一,給共識協議算法帶來了不少限制。
典型案例就是拜占庭將軍問題(Byzantine Generals Problem):
拜占庭是東羅馬帝國的首都,它的軍隊分紅多個師,每一個師都由一個將軍統領。這些將軍經過信使進行交流,來達成一個共同做戰方案。有些將軍多是叛徒,想故意破壞這個過程,會形成忠誠的將軍也沒法達成一個統一的做戰計劃。
如何解決這個問題呢?
實際上,就是讓忠誠的將軍在可能有叛徒誤導的狀況下依然能達成統一做戰方案。然而事實證實,叛徒數量超過1/3,這個難題將沒法克服。
Fisher-Lynch-Paterson不可能結果指出:在必定的條件下(包括節點行爲具備肯定性特徵),甚至在只有一個缺陷的過程當中,達成共識都是不可能的。(這個關於不可能性的一個結論)
Paxos算法協議:①Paxos算法能作到不產生不一致的結果②可是它妥協是,在必定條件下(雖然不常見),該協議會死機卡住,從而沒法繼續運行。(這個是某些文獻提到的一個共識協議)

2.2.2 打破傳統上的假設
不可能性結論都是在一些特定模式下才成立,結論是針對分佈式數據庫的研究。但對於比特幣,其自己打破了不少原來分佈式數據庫所作的假設。目前對共識的研究,比特幣實際比理論狀況要好不少。
比特幣打破了哪些經典模型得哪些假設呢?
⑴比特幣引入了獎勵概念。獎勵對於分佈式共識協議是個全新概念,所以能夠說比特幣只是在特訂貨幣系統下解決了分佈式共識問題。
⑵比特幣體系包含隨機性這個概念。比特幣的共識算法極大程度的依賴於隨機性。比特幣不糾結於規定共識裏的起點終點,並且共識是經過一段較長的時間而達成的。

2.3 使用區塊鏈達成沒有身份的共識

與傳統分佈式共識算法不一樣,比特幣中的每一個節點並無一個穩定的、長期的身份。
身份缺失的緣由:
①點對點網絡,沒有亂造節點即女巫攻擊 sybil attack現象
②化名制 pseudonymity。(比特幣仍舊不能保證真正的匿名,比特幣特性也沒強迫必須用真是身份來加入)
基於安全上的便利,有真實身份會讓設計變得容易。然而,並無。但能夠用一個理論假設來彌補。

2.3.1 隱性共識
對隨意節點選擇的假設可讓隱性共識inplicit consensus成爲可能。
共識協議裏有多個回合,每一個回合對應着區塊鏈裏的一個塊。每一個回合裏,一個隨機節點會被選中,這個節點能夠提議該鏈的下一個區塊。
無共識算法,爲避免隨機選出節點是惡意的,經過隱性共識的方法選中:其餘節點經過隱性地接受或拒絕前面這個被隨機選擇出來的節點。若是接受則繼續在這個塊以後接龍下去;若是拒絕則忽略這個新的區塊而選擇前一曾經接受的區塊繼續接龍下去。
節點選擇哪一塊來繼續接龍?比特幣共識算法簡化版
假設可任意選擇一個節點,這些節點都不會受到女巫攻擊影響。
①新的交易被廣播到全部節點上
②每一個節點都將新的交易放入區塊
③每一個回合,一個隨機的節點能夠廣播它的區塊
④其餘節點能夠選擇接受這個區塊,前提是若是區塊裏的交易都是正當的即有真的簽名
⑤節點們可把以上區塊的哈希值放進本身的區塊裏來表示它們對那個新區塊的承認。
驗證這個共識算法有效
竊取比特幣愛麗絲不可以竊取屬於另外一個用戶,不受她控制的地址裏的比特幣。由於若數字簽名機制安全,愛麗絲沒法僞造比特幣擁有者的簽名。
拒絕服務攻擊Alice不喜歡Bob,拒絕提供服務給Bob。儘管Bob的交易沒有被放入Alice所提議的下一個區塊,只須要等到下一個誠實節點發起區塊的時候,他的交易記錄就會被放進這個區塊裏。
雙重支付攻擊假設Alice是Bob網店顧客,而且已經一個由誠實節點發起包含表明Alice向Bob支付交易在內的區塊。(該交易是個數據結構,包含Alice數字簽名+付給Bob的公鑰即地址的指令+一個哈希值)
注:該哈希值是個指針指向先前一筆交易的輸出,就是比特幣來源。
詳情參見書48頁,此處較爲複雜。

雙重支付攻擊
雙重支付攻擊


雙重支付攻擊是否成功?取決於最後哪一個區塊被歸入長期的共識鏈。
什麼決定哪一個區塊被歸入?誠實節點會遵照最長有效分支後延展規則,在哪一個分支後面延展?沒有明確答案。(兩個分支長度同樣,區別在於最後一個區塊,然而兩個區塊都有效,所以選擇決定了雙重支付攻擊是否成功)技術角度而言,兩筆交易徹底一致而且有效。
實踐中,節點利用點對點網絡中最先聽到的區塊這種起方式的方法依舊存在問題,好比網絡延遲,最早聽到的不必定是最先被創造出來的。假設包含Alice-Bob交易區塊的鏈若是被網絡徹底遺忘,則成爲一個孤塊orphan block。
Bob角度而言,Bobby在Alice廣播交易時,操做草率,在網上完成檢查程序並容許Alice下載軟件,這叫零驗證交易 zero confirmation transaction。結果會更糟。爲了保護本身免受雙重支付攻擊,應該多等待。

Bob角度看待雙重支付
Bob角度看待雙重支付

 

總結:一個交易獲得的確認越多,被歸入長期共識鏈的機率越大。由於誠實節點老是選擇延展最長的共識鏈。事實證實,雙重支付攻擊成功的機率隨着確認的數目的增長而指數級下降。比特幣生態系統中,常見的方法是等待6個確認。而防止不正當交易徹底使用的是密碼學的方法,被共識所增強,防止雙重支付攻擊徹底依賴於共識,密碼學不起任何做用,由於共識能決定哪一個被放進長期共識鏈。

區別兩種哈希指針
區塊內用來表示接在以前哪一個區塊後面的哈希指針
在交易裏的一個或多個用來指向以前交易裏說明比特幣來源的哈希指針。

2.4 獎勵機制與工做量證實

以貨幣爲單位獎勵那些表現誠實的節點。
2.4.1 獎勵一:區塊獎勵
比特幣中由兩種不一樣的獎勵機制:區塊獎勵和交易費。
根據比特幣規則,建立區塊的節點能夠在這個區塊中加入一筆特別的交易(該交易就是一個造幣的交易相似於財奴幣裏面的造幣,節點可指定這筆交易的接收地址,一般會選擇一個屬於本身的地址,能夠將這個看做是節點在共識鏈上進行建立區塊服務的報酬)。
寫本書時候,區塊獎勵金額定在25個比特幣。每生成210000個區塊,金額就會減半。最終數量是2100萬,大約到2140年就發完了。可是這個系統仍舊能夠運行,由於區塊獎勵只是比特幣獎勵機制之一。
注:獎勵只有當區塊鏈最終被歸入長期共識鏈纔會實現。這是新比特幣被容許創造出來的惟一途徑。

2.4.1 獎勵二:交易費
比特幣的第二個獎勵機制。
任何交易的製造者均可以選擇讓交易輸出值比輸入值小。第一個建立區塊把交易放進區塊鏈的人能夠取得這個差額,做爲交易費。
若是你是一個節點,正在建立一個包含200筆交易的區塊,那麼這200筆交易的交易費將會被付到你放在區塊內的那個地址。
2.4.2 挖礦與工做量證實
描述共識機制時候還有一個問題沒有解答。
⑴咱們要你相信這樣一個假設:咱們能隨機選取一個節點
⑵因獎勵那些節點而產生的新問題:你們分一杯羹成爲一個節點來得到這些獎勵,那麼系統就會不穩定
⑶基於第二個問題,可能會有攻擊者建立大量的女巫節點來嘗試顛覆整個共識過程。
解決辦法:工做量證實 proof of work:把隨機選取節點改成根據節點佔有某種資源的比例來選取節點,但願這種資源是沒有人能壟斷的。好比這個資源是計算能力,稱爲權益證實proof of stake。
雖然比特幣沒有使用,可是權益證實也是另外一種合格的模式,被其他加密貨幣所使用。
工做量證實:容許節點用其計算能力來互相競爭,計算能力的比例決定了節點被自動選中的機率。

未完待續 2018.5.22 19:53 跑步去啦,回來繼續
繼續更新2018.5.23 21:50

比特幣是用哈希函數解謎來證實工做量的。
繼續更新2018.5.24 9:11

任何一個提議並建立區塊的節點想要製造下一塊,該節點必須找到一個臨時隨機數。臨時隨機數須要知足:
H(nonce || prev_hash||tx||tx||...||tx) < target
一個區塊一般包含:
①該節點提議的一系列交易。
②一個指向前序區塊的哈希指針。(該指針只是文本中的字符串,該哈希值做爲在網絡上請求其餘節點尋找區塊的ID,讓獲取這個區塊以後驗證它)。
③一個臨時隨機數。(爲提升發現符合要求的臨時隨機數的難度,把包含臨時隨機數在內的整個區塊的哈希值組合在一塊兒,輸出結果是一種特定的形式。若哈希函數符合謎題友好特性,惟一解法就是試足夠多的臨時隨機數,直到成功)

比特幣系統徹底實現去中心化的方式:哈希函數解謎以及工做量證實的辦法,能夠徹底捨棄採起那種隨機選取節點的辦法。這些節點競爭哈希函數解謎過程當中一直相互獨立,若一個節點正好發現一個臨時隨機數能夠知足要求,便可提議建立下一個區塊。

2.4.3 哈希謎題特性:難於計算
哈希謎題有三個重要特性:難於計算、可參數化成本、易於證明。
特性一:要有必定的難度。其實難度其實是隨時間而改變的。
注:不停嘗試解哈希謎題的過程,即比特幣挖礦,參與挖礦的節點被稱爲礦工。技術上每一個人均可以稱爲礦工,可是挖礦的高成本致使了挖礦生態系統需消耗大量能量。

2.4.3 哈希謎題特性:可參數化成本
特性二:但願成本是能夠經過參數來變化的,而非一個固定值。
比特幣的點對點網絡裏:每產生2016個區塊後,全部節點都會自動從新計算目標區域相對於整個輸出範圍的比例大小,使後續的區塊產生的時間間隔約爲10min.(若區塊產生的間隔過小,形成不少低效率,致使失去許多優化上的好處,故間隔是個固定值,雖然理想間隔意見仍然不統一)
注:任何一個礦工,找到下一個區塊的機率是其控制的計算力佔整個全球計算力的比例。
總結:只要以計算能力爲權重的大多數礦工,遵循比特幣協議(是誠實的),則比特幣中的大量攻擊就都沒有可能發生。
礦工行爲的兩種行爲模式:博弈論觀點認爲最大的問題是礦工默認的行爲是不是一種「那什均衡」(Nash equilibrium)
伯努利試驗Beroulli trial:解哈希謎題是機率性的,經過一個個去試臨時隨機數。結果只有兩種,連續試驗下,每種結果發生的機率是固定的。
泊松過程 Poisson process:節點屢次嘗試臨時隨機數的伯努利試驗是一個離散機率過程,可用泊松過程的連續機率過程近似表示。

發現下一個區塊所需時間的機率密度函數
發現下一個區塊所需時間的機率密度函數


對於特定的礦工:發現下一區塊的平均時間=10min/佔所有計算力的比例

 

2.4.3 哈希謎題特性:易於證明
第三個特性:證明一個節點正確地計算了工做量證實很容易。任何節點或礦工,均可以迅速地證明其餘礦工找到的區塊符合工做量證實的規定。

本章總結:
挖礦成本:如何計算出挖礦是否賺錢。

若是:挖礦成本>挖礦成本  則:礦工賺錢
條件:
挖礦獎勵=區塊獎勵+交易費 
挖礦成本=硬件成本+運營成本(電費、空調費等)

複雜之處分析:
①硬件投資固定,電費隨時間變化。
②礦工獲得的獎勵取決於發現區塊的速度=硬件的能力+計算力佔全球計算能力的比例。
③挖礦產生的成本一般爲美圓和其餘貨幣,涉及到比特幣匯率。
④假設礦工誠實地遵照協議,但礦工也可採用其他策略。

不存在1比特幣
比特幣沒有固定面額,沒有」1比特幣「說法,比特幣是交易輸出,目前能夠精確到小數點後8位,可能地最小价值是0.000 000 01 BTC,稱之爲一箇中本聰。

一個交易被放進區塊鏈
一個交易被放進區塊鏈,說明這筆交易已經被確認過了不少次(次數不固定,6爲經常使用次數,確認越多,越容易確信)。但常常有一些孤塊(致使緣由是這個區塊可能包含一個不正當交易或試圖雙重支付或網絡延遲)或沒有進入共識鏈的區塊。

哈希謎題與挖礦
礦工是決定參與創造新區塊競爭的特殊類型節點。若其餘礦工繼續在他們的區塊上搭建,則他們努力的回報是新造的比特幣(新區塊獎勵)+已經存在的比特幣(交易費)。

比特幣深度使用了分佈式共識的概念
傳統中,有個共識過程來決訂貨幣的匯率。
比特幣裏,由區塊鏈來完成對帳本狀況的共識,即你擁有多少比特幣的算法是依賴共識的。比特幣點對點網絡,區塊鏈中記錄的全部愛麗絲地址上擁有的比特幣數量總額。擁有比特幣就是其餘節點對給定的一方擁有這些比特幣的共識。
比特幣規則改變有兩種:軟分叉與硬分叉。

啓動加密貨幣
自舉過程bootstrapping
比特幣系統裏有三個想法:區塊鏈的安全性、挖礦生態系統的健康程度、貨幣的價值在相互做用。

51%攻擊
若是共識失敗,並存在一個在比特幣網絡裏實際掌握了絕大部分挖礦能力的51%攻擊者。
攻擊者能夠從現存的地址裏偷幣嗎?不行,除非有能推翻加密方法。這裏可能會出現分叉狀況。
51%攻擊者能夠壓制其餘交易嗎?不能,即便成功,你們也都知道發生了攻擊。
攻擊者能夠改變區塊獎勵嗎?不能,這是對系統規則的改動,其餘節點不會輕易承認區塊獎勵提升,故他沒法使用這些區塊。
攻擊者會摧毀你們對比特幣信心嗎?若是有一方控制了51%哈希算力,即便沒發動攻擊,你們也可能會對比特幣失去信心。

結於 2018.5.24 10:37

第三章 比特幣的運行機制

本章詳細介紹如何創建貨幣系統、如何獎勵礦工

3.1 比特幣的交易

比特幣交易的過程就是不停地創造區塊地過程。
簡單模式的帳簿
創建一個以帳戶爲核心的系統,能夠創造新的幣並放入某人的帳號,而後能夠轉給他人。

基於帳戶的帳簿
基於帳戶的帳簿


缺點:任何人若是想要確認一筆交易是否真實,就必須跟蹤每個帳戶的餘額。雖然能夠增長數據字段來更新交易後的帳戶餘額,但這增長了記帳的工做量。
與比特幣相似的基於交易的帳本
相似於:財奴幣。
每一個交易都有一個輸入值和輸出值。
輸入值可當作將被消耗掉的幣(這些幣是前一個交易創造出來的)
輸出值當作是在本次交易中創造出來的幣。
鑄造新幣時,只會創造新幣,不會消費舊幣。(只有輸出,沒有輸入)
每一個交易都有一個獨一無二的ID。

與比特幣相似的基於交易的帳本
與比特幣相似的基於交易的帳本

 

地址轉換
相似於財奴幣,一個交易中輸出的幣,不存在只消費部分狀況,要麼在另外一個交易中被徹底消費掉,要麼一個都不被消費。好比:該轉換中Alice的8個幣能夠轉換到另外一個由Alice全部的地址,即地址轉換。

有效驗證
使用哈希指針,好比覈查Alice引用的交易輸出,從Alice所引用的交易開始覈查到帳本上最新記錄的交易便可(不需從帳本創建之初的交易開始覈查),不需增長額外的數據結構。

資金合併
發起一個交易,交易裏有多個輸入和一個輸出,輸出的地址爲發起人地址。

共同支付
發起一個交易,交易裏有多個輸入和一個輸出,輸出的地址爲收款方的地址,多個輸入所引用的「上一筆交易」的輸出地址不一樣,須要多個簽名:好比1的簽名和2的簽名。

交易語法
比特幣在網絡上傳輸的數據結構都是一串字符。一個比特幣交易分紅三部分:元數據、一系列的輸入、一系列的輸出。
元數據 存放一些內部處理的信息:包含這筆交易的規模、輸入的數量、輸出的數量、此筆交易的哈希值(即交易的獨一無二的ID)。咱們可用哈希指針指向ID。鎖定時間lock_time。

元數據
元數據


輸入 全部輸入排成一個序列,每一個輸入的格式都同樣。輸入須要明確說明以前一筆交易的某個輸出:
包括以前那筆交易的哈希值,讓其稱爲指向那個特定交易的哈希指針
包括以前交易輸出的索引和一個簽名(咱們必須有簽名證實咱們有資格去支配這筆比特幣

輸入
輸入

 

輸出 全部輸出排成一個序列,每一個輸出的內容分紅兩部分:
全部輸出的金額之和必須 <= 輸入的金額之和
輸出的總金額 < 輸入的總金額 時, 輸入的總金額-輸出的總金額=交易費(支付給這筆交易記帳的礦工)
每一個輸出都要和一個特定的公鑰(地址)對應,故scriptPubkey是個比特幣腳本(公鑰的哈希值,指令集合)。

輸出
輸出

 

3.2 比特幣的腳本

每一個交易輸出肯定了一個公鑰,同時指定了一個腳本。
交易輸出描述:憑藉哈希值爲X的公鑰,以及這個公鑰全部者的簽名,才能夠得到這筆資金
誰來執行這個腳本?交易的輸入包括了腳本,只有把交易的輸入腳本和上一筆交易的輸出腳本串聯起來,串聯腳本必須被成功地執行後纔可獲取資金。

輸入輸出腳本範例
輸入輸出腳本範例

 

比特幣腳本語言
爲比特幣開發的,在比特幣中叫作」腳本「。
比特幣腳本語言內生地支持加密操做,有目的性地指令用來計算哈希值和檢驗簽名。
腳本語言是堆棧式地,每一個指令只被執行一次,線性沒法循環。
不是圖靈完備的,不能隨意運行強大函數功能。
注:圖靈完備即語言有能力隨意地執行強大的函數。
詳情參見75頁。
腳本執行只有兩個結果:成功或者失敗。

部分指令
部分指令

 

執行一個腳本
指令有兩種:數據指令(把數據推到堆棧的最上面)和工做碼指令(OP開頭 用堆棧頂部的數據做爲輸入值)。

比特幣腳本執行堆棧狀態圖
比特幣腳本執行堆棧狀態圖


在比特幣中,咱們只對整個交易進行簽名。

 

銷燬證實
銷燬證實 proof of burn 用於銷燬比特幣(防止資金被贖回)。使用OP_RETURN腳本拋出錯誤,其後指令都不會執行

支付給腳本的哈希值
比特幣的工做機制要求幣的發送者必須在交易時明確指定腳本。可是平常生活中會顯得很複雜,如何解決?比特幣使用:收款方告訴付款方請把比特幣支付給某個腳本地址,腳本的哈希值是XX,取款時候我會提供上述哈希值對應的腳本,同時提供數據經過腳本的驗證。付款方經過P2SH便可實現簡單付款。
注:P2SH腳本只是對堆棧最頂層的數據進行哈希計算,檢驗與給定哈希值一致時再執行特殊覈驗:將堆棧最頂層的數據從新解讀爲一系列指令,而後將其做爲腳本運行一次,同時,堆棧中的其餘數據做爲腳本的輸入值。

3.3 比特幣腳本的應用

第三方支付交易
利用MULTISIG(多重簽名)來實現。三我的之中只有兩個簽名以後,資金纔可被支走。可是涉及到狀況即是發生糾紛時,由第三方判斷完成支付仍是撤銷支付。

綠色地址
綠色地址:green addresses
問題描述:Alice想要轉帳給Bob(不在線),故Bob沒法經過查看區塊鏈的更新來確認轉帳是否完成。通常一個交易須要得到6次確認,時間約爲1h,這對於買賣東西或者不在線不實用。
解決:第三方銀行(多是個交易所or其餘的金融媒介)。銀行保證它不會雙重支付這個比特幣,Bob相信,可是這是現實世界中銀行的保證,故Bob只要相信銀行便可。可是,若是銀行出現雙重支付事件,則人們不會相信他。如今,人們認爲過度信任」銀行「是由風險的。

高效小額支付
高效小額支付efficient micro-payments
例子:Alice先發起一個MULTISIG交易,把可能花費的最大金額轉到MULTISIG地址。愛麗絲用流量時候,每隔一分鐘簽名一次,向Bob支付這分鐘產生的費用,剩下的錢轉給本身,直到掛機爲止(目前這些交易只有Alice簽名)。掛機以後,Alice再也不支付費用,Bob在Alice的最後一個交易簽名,把它放入區塊鏈,而,最後一個交易會一次性向Bob支付全部的流量費,把剩餘的幣還給Alice(Alice單獨簽名的交易不會進入區塊鏈,會被丟棄)。這些都是」雙重支付「,可是運轉正常狀況下,Bob只會在最後一個交易上簽名。
假如Bob沒有在最後一個交易簽名,那麼Alice將會失去全部轉入的比特幣。可利用鎖定時間來解決這個問題。
鎖定時間
小額支付協議開始以前,須約定退全款(可是退款行爲被鎖定,鎖定時間到了爲止)鎖定時間t到了,Bob還沒在最後一個交易上簽名的話,Alice能夠經過退款收回全部的比特幣。(t就是lock_time:告知礦工,需等待t時間以後才能把這筆交易記入區塊鏈)
智能合約
智能合約 smart contracts 即不一樣於須要經過法律或者仲裁機構來保護執行的普通合約,是比特幣系統裏能夠用技術手段來強制執行的合約。

3.4 比特幣的區塊

把大量交易組織起來放入一個區塊,獲得的哈希鏈更短,極大提升了驗證區塊鏈數據結構的效率。
區塊鏈將兩個基於哈希值的數據結構結合起來:
⑴是區塊的哈希鏈,每個區塊都有一個區塊頭部,裏面有一個哈希指針指向上一個區塊。
⑵是樹狀數據結構,以樹狀結構把全部交易的哈希值進行排列存儲即梅克爾樹。爲了證實某個交易在某個區塊內,能夠經過樹內路徑來進行搜索,樹的長度就是區塊內所包含的交易數目。
區塊頭部
區塊頭部還包含了相關挖礦謎題相關的信息
區塊頭部的哈希函數必須以一大堆0開頭纔有效
區塊頭部還包含:一個礦工能夠修改的臨時隨機數,一個時間戳,一個點數(用來表示找到這個區塊的難度)
區塊頭部是挖礦過程當中惟一哈希值化的要驗證一個區塊的鏈,只要檢查區塊頭部便可。

區塊頭部惟一的交易數據就是交易樹的樹根」mrkl_root「
每一個區塊的梅克爾樹上都有一個幣基交易,相似於財奴幣中的造幣交易。幣基交易創造新的比特幣,特色是:
①永遠只有一個單一的輸入和單一的輸出
②交易不消耗以前交易輸出的比特幣,故沒有指針指向」上一個交易「
③輸出值目前是:25個幣多點點 = 礦工的挖礦收入=獎勵的25個幣+全部交易的交易手續費。

3.5 比特幣網絡

比特幣網絡是一個點對點網絡,全部節點都平等,運行在TCP網絡上,有一個隨意的拓撲結構,每一個節點和其餘的隨機節點相連。只要一個節點由3h沒有音訊,則會慢慢被其餘節點忘記。
加入網絡的好處是爲了維護區塊鏈,發起交易時候,經過泛洪flooding算法完成的(或者稱爲八卦gossip協議)。

例子:Alice轉帳給Bob,客戶端發起一個交易,把這筆交易告訴全部與她客戶端節點相連的節點。節點接收到一個交易信息後,會把交易放入交易池(交易池裏的交易還未被打包進區塊鏈),若是交易池中已經存在(經過交易的哈希值查詢)該交易就不會將它再次傳播(確保泛洪協議會自動終結)。
如何覈驗節點接收到的新交易信息?①交易驗證(驗證交易在當前的區塊鏈中是有效的,節點會針對每一個前序交易的輸出運行覈驗腳本,確保腳本的返回值都爲真)②檢查是否有雙重支付③檢查這筆交易信息是否是已經被本節點接收過④節點只會接收和傳遞在白名單上的標準腳本。

競態條件race condition:網絡延遲會致使當有雙重攻擊時候,衆多節點會對哪個交易應該被歸入區塊鏈產生分歧。對於比特幣,打包下一個區塊的礦工會打破這個僵局(決定哪一個交易會最終打包進這個區塊)。

零驗證交易和費用替代策略replace-by-free
零驗證交易:一旦交易在網絡中廣播,接收方就當即接收交易。該交易不是用來預防重複支付的,因爲礦工的缺省行爲是把最早接收到的交易放入交易池,故零驗證交易很難實現重複交易。
費用替代策略:13年礦工的缺省行爲變成了費用替代策略。節點遇到有衝突的交易時,會把交易手續費更高的交易放進本身的交易池,把手續費更低的替換出去。

存儲空間需求
徹底有效的節點必須永久在線,這樣才能接收到全部的交易數據。
徹底有效節點必須維護在交易中產生的交易的輸出,未被消費掉的比特幣的完整列表。

輕量節點
輕量節點neightweight nodes:除徹底有效節點以外的另外一種節點。也叫輕客戶端或簡單付款驗證simple payment verification SPV。
一個SPV節點的安全等級遠不如全節點。
詳情參加92頁。

3.6 限制與優化

比特幣的整體數量與記帳獎勵極可能永遠都不會改變。
關於比特幣系統的交易處理能力,區塊大小有硬性規定,每一個區塊大小限定在1MB,每一個交易大約是250字節,故每塊最多容納4000個交易。平均每隔10min,有一個礦工得到記帳權利,故每秒鐘稚只能處理7個交易。
限制二是比特幣用的密碼算法。比特幣使用的簽名算法是ESDSA(一種secp256k1的橢圓曲線數字簽名算法)。

修訂協議
如何修訂比特幣協議並引入一些新特性呢?發佈新版本,但咱們沒法假定全部的節點都會更新版本。協議修訂會產生兩種類型結果:硬分叉和軟分叉。
硬分叉:運行新協議的節點認定爲有效的區塊,會被運行舊版協議的節點認定爲無效。致使最長的區塊鏈分支包含的某些區塊會被老節點認定爲無效區塊,從而老節點會認爲其餘纔是最長有效的區塊鏈分支,並一直擴展直到它們有新版本。硬分叉致使原先鏈分裂爲2個,而且不會再合併,只要老節點不更新版本,就永遠的被排除在另外一條鏈外。

軟分叉:加入新的特性,讓現有的核驗規則更加嚴格。老的節點會接收全部的區塊,新的節點會拒絕一些。
如今假定絕大部分節點都更新了新版協議並執行新的規則(老節點不會執行新規則,新節點數量要足夠多才可以競爭最長的鏈)。老節點可能會挖到一些包含一些在新規則下沒法覈驗經過的交易的無效區塊,所以老節點知道它們覈驗有效的區塊不被別的節點接收,故老節點的礦工會去更新協議。若新節點用它們區塊擴展了老節點的分支,則老節點也會轉而擴展這個分支。
好比:P2SH就是軟分叉經典例子。(一個有效的P2SH交易也可覈驗經過由於它只驗證這個哈希值跟前一筆交易輸出哈希值是否是同樣而已,並不知道還要進一步檢驗腳本是否合法)依賴新節點進行覈驗:腳本自己真的能夠獲取到前一個交易輸出的幣。

寫於2018.5.23 17:26

第四章 如何儲存和使用比特幣

要使用比特幣,必需要知道:一些公共信息(記錄在區塊鏈上的內容包括該比特幣的識別信息、幣值信息等)和一些私密信息(比特幣持有人的私鑰)。
公共信息能夠隨時調取,可是私鑰須要好好保存。儲存比特幣其實就是如何保存和管理比特幣私鑰
儲存與管理私鑰有三個目標:可獲取性、安全性、便利性。不一樣的管理方法就是對這三個目標進行權衡。

4.1 簡單的本地儲存

本地設備
最簡單的鑰匙管理:把比特幣存放在本地設備上。
分析:可獲取性或安全性都不太好,平常花銷很方便,但極易遺失或被盜。

比特幣錢包軟件
本地存放比特幣,通常選擇使用比特幣錢包軟件(一個管理比特幣和私鑰信息並讓用戶方便使用的一個應用軟件)。錢包就是一個接口,告訴你錢包裏面有多少比特幣。

編碼解碼:Base58編碼與二維碼
要使用或接收比特幣,須要與對方交換比特幣送達的地址。目前有兩種主流的方式將地址加密:字符串、QR碼。
ⅰ 爲了給地址賦予一個字符串,把密鑰的字節從二進制字符轉換爲Base58法。Base58記號法用一個包含58個字符的字符集來編碼。
ⅱ一個QR碼錶明一個真實的比特幣地址,錢包應用會把QR碼自動轉換成表明比特幣地址的字節。

虛榮地址
將地址轉換成一些人能識別的字符。
地址都是經過哈希計算產生的隨機字符串,如何得到指定的呢?只能不停重複生成私鑰,直到私鑰中包含所但願出現的字符串。這樣的地址稱爲虛榮地址。
虛榮地址的加速生成。詳情參加104頁。

4.2 熱儲存與冷儲存

熱儲存
把比特幣放在你的我的電腦裏就像把錢放在錢包裏帶着。(很方便但不安全)
冷儲存
離線,把比特幣鎖在其他地方。(相對安全保險但不方便)

熱儲存直到冷儲存的地址,隨時可給冷儲存轉帳。冷儲存上線,就可接收到區塊鏈的轉帳信息,並可隨時處理這些比特幣。
如何管理?私密性和其他考慮,採用不一樣地址(地址有不一樣密鑰)收款,把比特幣從熱儲存轉到冷儲存時候使用新的冷儲存地址。

但冷儲存不上線,如何能找到這樣的地址?
直接方法是讓冷儲存一次性生成一批地址,並把地址列表發給熱儲存,熱儲存能夠依次使用這些地址。

法一:分層肯定性錢包
使用一個分層肯定性錢包hierarchical deterministic wallet。
該方法讓冷儲存端製造無限制的地址數量,經過一個短暫的一次性的交換讓熱儲存知曉全部的地址。使用密碼學技巧。生成一個被稱爲地址生成信息的東西,就可生成一系列地址。生成私鑰生成信息。就可生成一系列私鑰。密碼學中:對於每一個i,第i個地址和第i個私鑰相匹配。
比特幣的電子簽名算法ECDSA支持分層密鑰。即冷儲存端生成任意多個密鑰,熱儲存端生成相應的地址。

分層肯定性錢包
分層肯定性錢包


注:冷儲存端生成和保存私鑰生成信息和地址生成信息,而後將地址生成信息一次性轉給熱儲存端。熱儲存端要給冷儲存端轉帳時,按次序生成新的地址。冷存儲端上線後,也會按順序生成地址,而後查收相應地址收到的款項,直到某一地址沒有收款位置。若是冷儲存須要向熱存儲端轉帳,它就會按順序生成私鑰序列。

 

法二:大腦錢包
大腦錢包brain walle:經過一個密鑰就可支取比特幣。
主要原理:用一個可預測的算法把一個口令變成一對公鑰/私鑰。
可是這個很不安全,一旦猜到你的口令,能夠偷走你大腦錢包裏全部私鑰。若是忘記口令,則完蛋。
如何設置安全口令?使用自動程序生成一個80位的數字,將其轉換爲口令。實際操做中,能夠使用密鑰延展來讓生成密鑰速度變慢。

法三:紙錢包
把密鑰印在紙上,將紙鎖在保險箱裏。可經過兩種方法爲公私鑰匙編碼:二維碼與base58碼。

法四:防損硬件
使用防損硬件tamper-resistant device用來保存密鑰或生成密鑰。

4.3 密鑰分存和密鑰共享

未完待續 2018.5.24 18:39
繼續閱讀 2018.5.25 10:07

密碼學上:密鑰分存技術能夠使密鑰的可獲取性和安全性都獲得提升。

4.3.1 密鑰分存方法
密鑰被分爲N個片斷,只要得到其中K個片斷,便可將原密鑰從新還原。若是獲取片斷<K,則不行。將密鑰轉換成若干子密鑰。

例子:
假定N=2,K=2 即將把原密鑰轉換爲2個子密鑰。
假設原密鑰爲S(S爲很大數字好比有128位)
隨機產生另外一個128位數字R(做爲其中1個子密鑰),另外一個爲:S⊕R即密文(⊕爲異或符號)。
將R與S⊕R保存在兩個不一樣地方。

當N=K時:對於以前地K-1個子密鑰,生成N-1個不一樣隨機數,最後一個子密鑰=原密鑰⊕其餘N-1個子密鑰
注:把密鑰簡單地切分爲若干片斷不可取,一個片斷就會透露密鑰信息,並不須要全部片斷便可猜出。

4.3.1 密鑰分存:如何生成子密鑰
方法:①把S標記在Y軸(0,S),通過該點畫一直線,斜率隨機。
②在該線上挑點,要多少有多少。③獲得N個子密鑰,而且K=2.

密鑰分存
密鑰分存

 

:S(原密鑰)被編碼成一個大的整數,斜率隨機。斜率上點爲子密鑰,S(鏈接任何兩個點延長與Y軸交點)。故只有一個點,沒法得到S。

擴展:咱們能夠用任何的K與N(K<N)實現密鑰分存。

分析:密鑰分存數學原理
圖4.4 採用一條直線進行密鑰分存。代數中:直線就是自由度爲1的多項式。若K=3 利用拋物線實現,拋物線自由度爲2的多項式。

數學上:拉格朗日公式代表,若是要回歸一條自由度爲K-1曲線,至少須要K個點。
故:咱們最多能夠承受N-K個子密鑰被泄露。

 

密鑰分存數學原理
密鑰分存數學原理


注意:若使用自由度爲K-1的曲線上的若干點進行密鑰分存,則還原原密鑰至少需獲得K個點的數據。

 

4.3.2 門限密碼:threshold cryptography
密鑰分存依舊存在問題:密鑰分存以後,要用原密鑰簽名必須取得子密鑰將其還原成原密鑰,該過程不安全可能會被黑客侵入盜取密鑰。
克服密鑰單點保存的缺陷方法一:門限簽名

如何解決?經過密碼學
門限簽名技術:子密鑰儲存在不一樣設備中,以去中心化方式還原原密鑰。
門限簽名將一個密鑰切分紅不一樣片斷,分別儲存,在交易簽名時不需還原原密鑰。
多重簽名是比特幣腳本的特性,把一個比特幣帳戶的控制權交給多個密鑰來共同保護帳戶安全。
門限簽名與多重簽名都能克服密鑰單點保存的缺陷。

例子
使用雙重安全機制的電子錢包(N=2,K=2),若兩個密鑰分別存在電腦和手機上,可在電腦上發起付款(電腦會生成一個簽名片斷髮送到手機),手機提示付款信息等待你確認。
若你確認,手機利用它的子密鑰完成整個簽名而後廣播到區塊鏈上。

4.3.3 多重簽名:multisignatures
克服密鑰單點保存的缺陷方法二:多重簽名
多重簽名:經過比特幣腳本,把一個比特幣帳戶的控制權交給多個密鑰(而非密鑰分存),這些密鑰保存在不一樣地點分別生成簽名。

4.4 在線錢包和交易所

4.4.1 在線錢包
在線錢包信息儲存在雲端,可經過網頁或手機應用來讀取。
15年初,比較流行的在線錢包服務是比特幣基地公司Coinbase和區塊鏈信息公司blockchain,info。
優勢:方便。
缺點:風險。因爲網站儲存密鑰,雖然一般狀況下使用密碼保護密鑰,可是萬一工做人員或者黑客入侵就能夠竊取。

4.4.2 比特幣交易所
傳統銀行:存錢,銀行答應在你提款時候給你錢,存錢期間銀行一般會把錢用於投資。
比特幣交易所:交易所可辦理比特幣存款,承諾往後按照你要求把錢(比特幣、法幣)還錢。
注意:交易所只是修改了和你的合約,不須要在區塊鏈裏把比特幣從一個地址轉爲另外一個地址。故交易先後,比特幣沒有真正在區塊鏈中移動,只有你與銀行合約變化。
優勢:交易把比特幣經濟和法幣經濟相結合,自由轉換。
缺點:風險。

交易所和銀行面臨同樣的風險,主要包括三大類。
風險一:擠兌(你們同時去銀行提款,銀行錢不夠)
風險二:銀行自己就是一個旁氏騙局(不斷借新還舊)
風險三:黑客入侵(有人甚至是僱員)
倒閉的交易所包括門頭溝(Mt.Gox)。

4.4.3 銀行監管、準備金證實、負債證實
銀行監管:政府對銀行進行監管,政府首先要求銀行有一個最低準備金要求,並在必要時爲銀行或儲蓄者提供保護。

準備金證實proof of reserve:比特幣交易所或其餘提供比特幣管理服務的機構,能夠使用準備金證實的密碼學技術向儲戶證實他們留存了一部分儲備金。

準備金證實:
(1)證實你有多少準備金。交易所只需發起一筆向本身轉帳的交易,轉帳金額=公佈的準備金金額便可。
(2)證實出具準備金證實的人至少知曉該私鑰(即便不是私鑰全部者)
注意:
準備金證實只能說明擁有這筆比特幣的人願意參與準備金證實的過程,即準備金只是證實了某人(交易所)能夠控制這一筆錢
只能證實下限金額即證實某人有多少準備金。

繼續更新 2018.5.26 9:10
負債證實 proof of liabilities:利用梅克爾樹(一棵哈希值構成的二叉樹)來證實存款規模。

 

負債證實
負債證實
交易所構建完梅克爾樹:把根節點的哈希指針和根節點的存款金額字段進行加密簽名,而後在網絡上廣播。
交易所須要聲明全部儲戶均可以對應到葉節點上,且存款數據無錯。

用戶覈實:
1)子樹根節點的哈希指針和存款金額字段,與交易所廣播的值一致。
2)子樹根節點遍歷到葉節點,每一個節點對應的哈希值確實是其所指向的子節點的哈希值。
3)每一個葉節點對應的客戶帳號信息都是正確的。
4)每一個節點的存款金額字段=與其最相近的子節點的存款金額之和。

 

第五章 比特幣挖礦bitcoin mining

5.1 比特幣礦工的任務

要成爲礦工,必須加入比特幣網絡並與其餘節點相連。

創建連接以後,須要完成六個任務:

1)監聽交易廣播(驗證其簽名是正當有效的,交易輸出沒有被重複支付)

2)維護區塊鏈網絡和監聽新的區塊。

3)組裝一個備選區塊。(一旦擁有最新的所有區塊鏈數據備份,則能夠製造你本身的區塊)

4)找到一個讓你的區塊有效的隨機數。

5)但願你的區塊被全網接受。(即便找到一個區塊也不能保證該區塊會成爲共識鏈concensus chain的一部分。

6)利潤。若是其餘礦工接受了你的區塊,則你能夠得到利潤。若在該區塊裏的任何交易都有交易費,則全部交易費是礦工全部的。

礦工的任務可分爲兩類:

1)驗證交易和區塊。

比特幣網絡賴以生存和運轉的基礎,比特幣協議須要礦工的首要緣由。

2)和其餘礦工競爭,爭取能夠找到區塊並所以獲益。

不是比特幣網絡存在所必需的,是爲獎勵礦工去完成第一類任務而設置的。

綜上:兩個任務是使比特幣成爲一個數字貨幣的必要條件(礦工必須得到獎勵纔會去完成這些任務)

尋找有效區塊

如何找到一個使區塊有效的隨機數?

區塊鏈主要有兩層基於哈希函數的結構:1)第一層在區塊鏈上,每一個區塊的頭部都有一個指針指向前一個區塊。2)第二層是在每個區塊裏,包括全部交易的梅克爾樹。

礦工首先須要從其交易池中選出一系列有效的交易而且編譯成梅克爾樹。(只要不超過每一個區塊隨機數的交易上限,能夠選擇編譯的交易數量)

礦工以後須要組裝出一個新的區塊,讓其頭部(有一個32位的隨機數區域)指向區塊鏈上的前一個區塊。(你須要不斷試臨時隨機數找到能使整個區塊的哈希值小於目標值(目標值特色是以零開頭的特定位數的數值))

隨機數試過全部32位可能的取值後,還沒找到一個有效的哈希值怎麼辦?

當你遍歷區塊頭部隨機數全部可能的取值後,能夠改變幣基(coin-base)裏的隨機數。(好比+1,而後再從新改變區塊頭部隨機數來尋找)

改變幣基裏的隨機數,整個梅克爾樹上交易的哈希值都會改變(幣基值的改變會向上傳遞)。

最終找到一對臨時的隨機數組合:頭部隨機數和幣基隨機數,用來產生符合哈希值要求的新區塊,宣佈,就有但願得到相應的區塊獎勵。

每一個人都在運算同一個謎題嗎?

每一個礦工都會把或多或少不一樣的交易用不一樣的次序來放進區塊內,所以不太可能走在徹底相同的一個區塊上進行計算。

就算兩個不一樣的礦工組建的區塊裏包含了相同的交易,這兩個區塊的哈希值也不一樣(幣基交易裏,礦工會寫本身的地址接收新鑄幣),除非兩個礦工共享公開密鑰。

只多是兩個礦工同在一個礦池,可是他們會互相通訊,確保使用不一樣的幣基臨時隨機數以免重複工做。

找到一個有效區塊很難嗎?很難。挖礦的目標區域,任何有效區塊的哈希值必須低於這個值。

決定難度

每挖出2016個區塊,挖礦難度會改變一次(約爲2周)。

難度的改變根據上2016個區塊的挖礦效率來決定的。即:

下一個難度=(上一個難度201610min)/產生上2016個區塊所花費的時間

5.2 挖礦所需硬件

礦工計算難度的核心在於對SHA-256哈希函數的運算。(SHA-256是一個通用的密碼學哈希函數,SHA是安全哈希算法)

SHA-256

SHA家族?

SHA-256中256表明有256位狀態和輸出。技術上,SHA-256是SHA-2函數家族中幾個密切相關的的函數成員之一,包括SHA-512(狀態位更大更安全)。SHA-1(160位輸出,目前認爲安全性不高)

SHA-256?是一個256位狀態機,被分割成8個32位字段,可最優化運行在32位硬件上。(32位模加法,右位移,設計思路來自簡單位的線形反饋移位寄存器)

下圖展現了一輪SHA-256的壓縮函數運算,一個完整的SHA-256運算要作64位這樣的迭代運算。參見146頁圖。

比特幣機制奇怪之處?比特幣機制下,爲獲得供其餘節點使用的哈希函數,實際上要求兩輪SHA-256運算,緣由不清楚。

CPU挖礦

第一代挖礦:電腦上經過CPU進行計算。(礦工知識簡單的按照線性的方式嘗試全部的臨時隨機數,在軟件中進行SHA-256運算,檢查結果確認是否找到一個有效區塊)

GPU挖礦

第二代挖礦:顯卡或者圖形處理器GPU挖礦。GPU有高吞吐量和高並行處理功能。顯卡的並行性設計使其具有不少算術邏輯單元ALU,能夠經過進行SHA-256運算。

2010年,OpenCL誕生,它可以使GPU進行非圖片處理類工做的通用語言。

缺點:

1)GPU大量的內置硬件進行圖形處理,對比特幣挖礦無用。

2)GPU沒有很好的冷卻處理設置。

3)GPU很是耗電。

現場可編程門陣列挖礦

2011年左右,用於現場可編程門列陣Field-Programma Gate Array 簡稱FPGA)硬件設計語言Verilog,第一次用於比特幣挖礦。

利用FPGA代替GPU進行挖礦。

工做原理:追求定製硬件的最佳性能同時,用戶可現場調試或者修改硬件參數。

優勢:

1)性能比GPU好,特別是數位操做。

2)FPGA易冷卻。

缺點:致使其只存在了幾個月,就應運而生ASIC

1)FPGA挖礦其實更加困難(一直在超頻使用),故常常看到各類報錯和故障。

2)優化FPGA的32位加法處理上十分困難(而這個在SHA-256中很是重要)

3)FPGA難購買。

專用集成電路技術挖礦

當今的挖礦市場主要被ASIC所主導,這些IC芯片被設計製造優化,就爲了比特幣挖礦這惟一目的。

考慮到礦機運行所需耗費的電力成本以及冷卻成本,大多數ASIC礦機都沒法靠挖礦賺回成本。

現在:專業挖礦的天下

書中引用了Bitfury的挖礦中心圖。

如何創建一個挖礦中心?首先須要具有:氣候(氣溫偏寒,節省冷卻費用)、電費、網絡接入速度。冷卻時比特幣挖礦最大的挑戰,其挖礦自己的耗電量,用單位面積來算要超過傳統的數據中心。

與挖金礦的類似之處

比特幣挖礦經歷了:從CPU到GPU,到FPGA,最後到如今的ASIC。

5.3 能源消耗和生態環保

根據熱力學裏的藍道爾原理,任何一個不可逆轉的計算都會消耗必定的能源,該計算也可被認爲是一種信息丟失的過程。原理之處:任何移位運算都會消耗必定量(k Tln 2)的焦耳,k是玻耳茲曼常數,T表明芯片以開爾文爲單位的溫度)。綜上: 每進行一個不可逆的數位運算都會消耗一個最小量的焦耳,能源是永遠不會被摧毀的,只會互相轉變。

相關文章
相關標籤/搜索