【精通比特幣】摘記

weixin_33912246發表於2018-05-28
閱讀物件 :《精通比特幣》主要面向程式設計師。本書將會告訴你加密貨幣的原理、使用方法,以及如何開發與之相關的軟體。

經典必讀,隨著時間和參與深度的不同,每一次的閱讀都是認知的升級!

一、大自然中的社群組織結構

  • “切葉蟻”,在蟻群中不存在中央集權體制或領導。
  • 群落中數百萬成員所展現的高度智慧且複雜的行為是社會網路中的個體互動這一性質的凸顯。
  • 大自然向我們證明,去中心化體制具有彈性並能創造出意想不到的複雜性和難以想象的精妙,而不需要中央集權體制、 等級制度或複雜的組織結構。
  • 去中心化 ,可理解為去中介化。
比特幣網路正是這樣一個高度複雜的去中心化的可信網路,能夠支撐無數財務流程。

像蟻群一樣,比特幣的彈性網路是一個由眾多遵循簡單準則的簡單節點所組成的彈性網路,這些簡單的 節點準則聚合在一起可以完成驚人的事情,而不需要任何中樞協調。


二、基礎概念

比特幣

“比特幣”既可以指這種虛擬貨幣單位,也指比特幣網路或者網路節點使用的比特幣軟體。

區塊

一個區塊就是若干交易資料的集合,它會被標記上時間戳和之前一個區塊的獨特標記。區塊頭經過雜湊運算後會生成一份工作量證明,從而驗證區塊中的交易。有效的區塊經過全網路的共識後會被追加到主區塊鏈中。

確認

當一項交易被區塊收錄時,我們可以說它有一次確認。礦工們在此區塊之後每再產生一個區塊,此項交易的確認數就再 加一。當確認數達到六及以上時,通常認為這筆交易比較安全並難以逆轉。

難度

整個網路會通過調整“難度”這個變數來控制生成工作量證明所需要的計算力。

礦工

礦工指通過不斷重複雜湊運算來產生工作量證明的各網路節點。

網路

比特幣網路是一個由若干節點組成的用以廣播交易資訊和資料區塊的P2P網路。

工作量證明

工作量證明指通過有效計算得到的一小塊資料。具體到比特幣,礦工必須要在滿足全網目標難度的情況下求解SHA256 演算法。

獎勵

每一個新區塊中都有一定量新創造的比特幣用來獎勵算出工作量證明的礦工。現階段每一區塊有25比特幣的獎勵。

特點
  • 它具有快捷、安全、無國界的特性。

  • 擁有金鑰是使用比特幣的唯一條件,這讓控制權完全掌握在每個人手中.

  • 比特幣是一個分散式的點對點網路系統。因此沒有“中央”伺服器,也沒有中央發行機構。

  • 本質上,挖礦把央行的貨幣發行和結算功能進行分散式,用全球化的算力競爭來取代對中央發行機構的需求。

  • 比特幣協議還規定,每四年新幣的開採量減半,從長期來看,比特幣是一種通貨緊縮貨幣。

  • 作為一個開發者,我看比特幣之於貨幣就像看到當年的網際網路,一個通過分散式計算來傳播價值和保障數字資產所有權的網路

  • 加密數字簽名能夠使一個使用者簽署一項能夠提供其資產所有權證明的 數字資產或數字交易

  • 比特幣正是這樣的系統,設計完全去中心化,不被任何中央政權或中央點控 制,這樣的貨幣系統是不會遭受攻擊,也不會變得腐敗。

比特幣錢包
比特幣錢包只包含私鑰而不是比特幣。每一個使用者有一個包含多個私鑰的錢包。錢包中包含成對的私鑰和公鑰。

使用者用這些私鑰來簽名交易,從而證明它們擁有交易的輸出(也就是其中的比特幣)。比特幣是以交易輸出的形式來儲存在區塊鏈中(通常記為vout或txout)。

數字金鑰
  • 比特幣的所有權是通過數字金鑰、比特幣地址和數字簽名來確立的

  • 只有有效的數字金鑰才能產生有效的數字簽名。

  • 私鑰的格式:私鑰可以以許多不同的格式表示,所有這些都對應於相同的256位的數字。

  • 素數冪和橢圓曲線乘法,這些數學函式都是不可逆的,就是說很容易向一個方向計算,但不可以向相反方向倒推。

  • 比特幣正是使用橢圓曲線乘法作為其公鑰加密的基礎演算法。

  • 私鑰->橢圓曲線相乘->公鑰->雜湊函式(單向)->比特幣地址。

  • E52CED330AC530EDCC32C8FFC6A526AEDD
    比特幣私鑰空間的大小是2256,這是一個非常大的數字。用十進位制表示的話,大約是1077,而可見宇宙被估計只含有1080個原子。

  • 橢圓曲線加密法是一種基於離散對數問題的非對稱(或公鑰)加密法,可以用對橢圓曲線上的點進行加法或乘法運算來表達。

比特幣地址
  • 比特幣地址是一個由數字和字母組成的字串,可以與任何想給你比特幣的人分享。由公鑰(一個同樣由數字和字母組成的字串)生成的比特幣地址以數字“1”開頭。
  • 比特幣地址可由公鑰經過單向的加密雜湊演算法得到。雜湊演算法是一種單向函式,接收任意長度的輸入產生指紋摘要。加密雜湊函式在比特幣中被廣泛使用:比特幣地址、指令碼地址以及在挖礦中的工作量證明演算法。
  • Base58Check格式的比特幣地址
助記碼詞彙
  • 助記碼詞彙是英文單詞序列代表(編碼)用作種子對應所確定性錢包的隨機數。單詞的序列足以重新建立種子,並且從種子那裡重新創造錢包以及所有私鑰。
  • 確定性,或者“種子”錢包包含通過使用單項離散方程而可從公共的種子生成的私鑰。

三、比特幣代表數十年的密碼學和分散式系統的巔峰之作

彙集了四個關鍵的創新 點,比特幣由這些構成:
  • 一個去中心化的點對點網路(比特幣協議)
  • 一個公共的交易賬簿(區塊鏈)
  • 一個去中心化的數學的和確定性的貨幣發行(分散式挖礦)
  • 一個去中心化的交易驗證系統(交易指令碼)
比特幣系統依賴於完全透明的數學原理它已經蔓延到了分散式計算、經濟學、計量經濟學領域。
  • 中本聰的此項發明,對“拜占庭將軍”問題也是一個可行的解決方案,這是一個在分散式計算中未曾解決的問題
簡單來說,這個問題包括了試圖通過在一個不可靠、具有潛在威脅的網路中,通過資訊交流來達成一個行動協議 共識。中本聰的解決方案是使用工作量證明的概念在沒有中央信任機構下達成共識,這代表了分散式計算的科學 突破,並已經超越了貨幣廣泛的適用性。它可以用來達成去中心化的網路共識來公正選舉、彩票、資產登記,以 及數字化公證等等。

四、比特幣挖礦

  • 挖礦在比特幣系統中起著兩個作用:
  • 挖礦在構建區塊時會創造新的比特幣,和一箇中央銀行印發新的紙幣很類似。每個區塊創造的比特幣數量是固定的,隨時間會漸漸減少。
  • 挖礦建立信任。挖礦確保只有在包含交易的區塊上貢獻了足夠的計算量後,這些交易才被確認。區塊越多,花費的計算量越大,意味著更多的信任。
  • 而比特幣中的 "謎題" 是基於雜湊加密演算法的,其展現了相似的特性:非對稱地,它解起來困難而驗證很容易,並且它的困難度可以調整。
區塊中的挖礦交易記錄
  • 平均每10分鐘,礦工會將自上一個區塊以來發生的所有交易生成一個新的區塊。新交易不斷地從使用者錢包和應用流入比特幣網路。

  • 交易被加進新區塊時,以交易費用高的優先以及其它的一些規則進行排序。

  • 隨著時間變長,這個區塊鏈的高度也隨之增長,每個區塊和整個鏈的計算複雜度也隨之增加。


五、 比特幣交易簡介

比特幣客戶端的三種主要形式
  • 完整客戶端
  • 輕量級客戶端
  • 線上客戶端

比特幣客戶端的選擇,取決於使用者想要管理資金的數目。

客戶端錢包
  • 錢包是多個地址和解鎖資金金鑰的簡單集合
  • 每筆交易你都可以使用不同的地址,這有利於提高 隱私的安全性。使用者可建立地址的數量幾乎不受限制。
  • 出售某種產品或服務來換取比特幣。如果你是個程式設計師,可以出售你的程式設計技能
  • 新建立的比特幣錢包地址,需要發生一筆交易,才能成為在眾多的比特幣地址之一。一旦該地址接受了一筆交易,就會變成全網所知的地址之一,然後就能查詢到可用餘額了。
比特幣交易的理解
  • 簡單來說,每一筆交易包含一個或多個“輸入”,輸入是針對一個比特幣賬號的負債。
  • 這筆交易的另一面,有一個或多個“輸出”,被當成信用點數記入到比特幣賬戶中。這些輸入和輸出的總額(負債和信 用)不需要相等
  • 交易是將錢從交易輸入移至輸出。輸入是指錢幣的來源,通常是之前一筆交易的輸出。交易的輸出則是通過關聯 一個金鑰的方式將錢賦予一個新的所有者。目的金鑰被稱為是安全鎖(Encumbrance)。這樣就給資金強加了一 個要求:有簽名才能在以後的交易中贖回資金。一筆交易的輸出可以被當做另一筆新交易的輸入,這樣隨著錢從 一個地址被移動到另一個地址的同時形成了一條所有權鏈。
常見的交易形式
  • 最常見的交易形式是從一個地址到另一個地址的簡單支付,這種交易也常常包含給支付者的“找零”。一般交易有一個輸 入和兩個輸出。
  • 集合多個輸入到一個輸出的模式。像這樣的交易有時由錢包應用產生來清理許多在支付過程收到的小數額的找零。
  • 在比特幣賬簿中常見的交易形式是將一個輸入分配給多個輸出,這類交易有時被商業實體用作分配資金,例如給多個僱員發工資的情形。
交易的構建
  • 交易的建立和簽名可以離線操作,不用連線比特幣網路。
  • 交易的廣播才需要處於聯網狀態,只有在執行交易時才需要將交易傳送到網路。
獲取正確的輸入
  • 大多數錢包應用維護著一個含有用錢包自己金鑰鎖定
    的“未消費交易輸出”小型資料庫。
  • 完整客戶端含有整個區塊鏈中所有交易的所有未消費輸出副本。
  • 完整客戶端佔太大的硬碟空間,所以大多數錢包使用輕量級的客戶端,只儲存使用者自己的未消費輸出。
將交易放到總賬簿中
  • 交易必須要被傳送到比特幣網路中以成為分散式賬簿(區塊鏈)的一部分
交易的傳送
  • 比特幣網路是由參與的比特幣客戶端聯接幾個其他比特幣客戶端組成的P2P網路。比特幣網路的目的是將交易和區塊傳播給所有參與者

  • 任何比特幣網路節點(其它客戶端)收到一個之前沒見過的有效交易時會立刻將它轉發給聯接到自身的其它節點。

  • 一個對比特幣交易的常見誤解是它們必須要等10分鐘後被確認加進一個新區塊,或等60分鐘以得到六次確認後才是有效的。雖然這些確認可以確保交易已被整個網路接受,但對於像一杯咖啡這樣的小額商品來說就沒有必要等待那麼長時間了。一個商家可以免確認來接受比特幣小額支付。

  • 交易ID在交易確認之前並不權威。區塊鏈中找不到交易雜湊值並不意味著此筆交易沒有進行。這被稱作“交易延展性”,因為交易雜湊值在區塊確認之前是可以更改的。在確認之後txid是不變且權威的。

  • createrawtransaction 命令產生了一個原始十六進位制字串,其中編碼了這筆交易的諸多細節。decoderawtransaction 命令來解碼這個字串。


六、比特幣交易詳解

比特幣交易是比特幣系統中最重要的部分。根據比特幣系統的設計原理,系統中任何其他的部分都是為了確保比特幣交易可以被生成、能在比特幣網路中得以傳播和通過驗證,並最終新增入全球比特幣交易總賬簿(比特幣區塊鏈)。

比特幣交易的本質是資料結構,這些資料結構中含有比特幣交易參與者價值轉移的相關資訊。比特幣區塊鏈是全球複式記賬總賬簿,每個比特幣交易都是在比特幣區塊鏈上的一個公開記錄。在這一章,我們將會剖析比特幣交易的多種形式、所包含的資訊、如何被建立、如何被驗證以及如何成為所有比特幣交易永久記錄的一部分。

三大過程:
  • 交易建立
  • 交易簽名
  • 交易廣播提交
建立比特幣交易
  • 比特幣交易可以被任何人線上上或線下建立,即便建立這筆交易的人不是這個賬戶的授權簽字人。
  • 比如,一個負責應付賬款的櫃員在處理應付票據時可能會需要CEO簽名。相似地,這個負責應付賬款的櫃員可以建立比特幣交易,然後讓CEO對它進行數字簽名,從而使之有效。
  • 是比特幣交易指定以往的一筆交易作為其資金來源,而不是一個特定賬戶。
廣播交易至比特幣網路
  • 比特幣網路是一個點對點網路,這意味著每一個比特幣節點都連線到一些其他的比特幣節點(這些其他的節點是在啟動點對點協議時被發現的)。整個比特幣網路形成了一個鬆散地連線、且沒有固定拓撲或任何結構的“蛛網”——這使得所有節點的地位都是同等的。

  • 交易是經過簽名且不含任何機密資訊、私鑰或密碼

  • 因為比特幣將金錢變成了一種資料結構,所以在本質上是不可能阻止任何人建立並執行比特幣交易的。

交易的輸出和輸入
  • 比特幣交易的基本單位是未經使用的一個交易輸出,簡稱UTXO
  • UTXO是不能再分割、被所有者鎖住或記錄於區塊鏈中的並被整個網路識別成貨幣單位的一定量的比特幣貨幣。
  • 一個使用者的比特幣會被當作UTXO分散到數百個交易和數百個區塊中。實際上,並不存在儲存比特幣地址或賬戶餘額的地點,只有被所有者鎖住的、分散的UTXO。
  • “一個使用者的比特幣餘額”,這個概念是一個通過比特幣錢包應用建立的派生之物。比特幣錢包通過掃描區塊鏈並聚合所有屬於該使用者的UTXO來計算該使用者的餘額。
  • 在比特幣的世界裡既沒有賬戶,也沒有餘額,只有分散到區塊鏈裡的UTXO。
  • Coinbase交易,每個區塊中的首個交易。
交易費
  • 交易費可當作是為了包含(挖礦)一筆交易到下一個區塊中的一種鼓勵,也可當作是對於欺詐交易和任何種類的系統濫用,在每一筆交易上通過徵收一筆小成本的稅而造成的一種妨礙。交易費被挖出這個區塊的礦工得到,並且記錄在這個交易的區塊鏈中。

  • 交易費被作為輸入減輸出的餘量,交易費 = 求和(所有輸入) - 求和(所有輸出)。

把交易費加到交易中
  • 交易的資料結構沒有交易費的欄位。相反地,交易費通過所有輸入的總和,以及所有輸出的總和之間的差來表示。從所有輸入中扣掉所有輸出之後的多餘的量會被礦工收集走。

  • 舉例來說,如果你消耗了一個20比特幣的UTXO來完成1比特幣的付款,你必須包含一筆19比特幣的找零回到你的錢包。否則,那剩下的19比特幣會被當作交易費,並且會被挖出你的交易到一個區塊中的礦工收走。儘管你會受到高優先順序的處理,並且讓一個礦工喜出望外,但這很可能不是你想要的。

  • Eugenia的錢包應用會通過測量交易的大小,乘以每千位元組需要的交易費,來計算適當的交易費。 交易費高不是因為交易金額大,而是因為交易的位元組數多。

交易鏈條和孤立交易
  • 當一條交易鏈被整個網路傳送時,他們並不能總是按照相同的順序到達目的地。
  • 子交易在父交易之前到達
  • 沒有父交易的交易池被稱作孤立交易池
  • 一旦接收到了父交易,所有與這個父交易建立的UTXO有關的孤塊會從池中釋放出來,遞迴地重新驗證,然後整條交易鏈就會被交易池包括進去,並等待著被區塊所挖走

七、比特幣網路

節點型別及分工
  • 每個比特幣節點都是路由、區塊鏈資料庫、挖礦、錢包服務的功能集合。
  • 一個全節點(full node)包含四個功能:錢包、礦工、完成區塊鏈、網路路由節點。
  • 1、SPV 簡易支付驗證節點(輕量級節點),沒有完整區塊鏈的拷貝。越來越多的使用者錢包是spv節點,尤其是執行於在智慧手機等資源有限裝置上的比特幣錢包應用上。
  • 2、挖礦節點:執行在特殊硬體裝置上的工作量證明(PROOF OF WORK) 演算法,以相互競爭的方式建立新區塊。
  • 3、核心客戶端 : 在比特幣P2P網路中,包含錢包、礦工、完整區塊鏈資料庫、網路路由節點。
  • 4、完整區塊鏈節點:在比特幣p2p網路中,包含完整區塊鏈以及網路路由節點。
  • 5、獨立礦工
網路發現
  • 當新的網路節點啟動後,為了能夠參與協同運作,它必須發現網路中的其他比特幣節點。新的網路節點必須發現至少一個網路中存在的節點並建立連線。
  • 節點通常採用TCP協議、使用8333埠
  • “種子節點(seed nodes)”:新節點是如何發現網路中的對等節點的呢?雖然比特幣網路中沒有特殊節點,但是客戶端會維持一個列表,那裡列出了那些長期穩定執行的節點。
  • 新節點並不一定需要與種子節點建立連線,
    但連線到種子節點的好處是可以通過種子節點來快速發現網路中的其他節點。
    -新接入的節點可以向它的相鄰節點傳送getaddr訊息,要求它們返回其已知對等節點的IP地址列表,通過這種方式,節點可以找到需連線到
    的對等節點,並向網路釋出它的訊息以便其他節點查詢。
交換“庫存清單”
  • 同步區塊鏈的過程從傳送version訊息開始,這是因為該訊息中含有的BestHeight欄位標示了一個節點當前的區塊鏈高度(區塊數量
  • 從傳送 getblocks訊息開始,收到一個inv響應,接著開始下載缺失的區塊庫存清單和區塊廣播協議。
簡易支付驗證 (SPV)節點
  • SPV節點只需下載區塊頭,而不用下載包含在每個區塊中的交易資訊

  • 簡易支付驗證是通過參考交易在區塊鏈中的深度,而不是高度,來驗證它們

  • 一個擁有完整區塊鏈的節點會構造一條驗證鏈,這條鏈是由沿著區塊鏈按時間倒序一直追溯到創世區塊的數千區塊及交易組成

  • 一個SPV節點會驗證所有區塊的鏈(但不是所有的交易),並且把區塊鏈和有關交易連結起來

相關網址

相關文章