《精通比特幣》讀書筆記

一救军、快速術語檢索

  1. 比特幣地址:(例如:1DSrfJdB2AnWaFNgSbv3MZC2m74996JafV)由一串字符和數(shù)字組成舞萄,以阿拉伯數(shù)字“1”開頭屋匕。就像別人向你的email地址發(fā)送電子郵件一樣院刁,他可以通過你的比特幣地址向你發(fā)送比特幣渐白。
  2. 比特幣:既可以指這種虛擬貨幣單位尊浓,也指比特幣網(wǎng)絡或者網(wǎng)絡節(jié)點使用的比特幣軟件。
  3. 區(qū)塊:一個區(qū)塊就是若干交易數(shù)據(jù)的集合纯衍,它會被標記上時間戳和之前一個區(qū)塊的獨特標記栋齿。區(qū)塊頭經(jīng)過哈希運算后會生成一份工作量證明,從而驗證區(qū)塊中的交易。有效的區(qū)塊經(jīng)過全網(wǎng)絡的共識后會被追加到主區(qū)塊鏈中瓦堵。
  4. 區(qū)塊鏈是一串通過驗證的區(qū)塊基协,當中的每一個區(qū)塊都與上一個相連,一直連到創(chuàng)世區(qū)塊菇用。
  5. 交易確認:當一項交易被區(qū)塊收錄時澜驮,我們可以說它有一次確認。礦工們在此區(qū)塊之后每再產(chǎn)生一個區(qū)塊惋鸥,此項交易的確認數(shù)就再加一杂穷。當確認數(shù)達到六及以上時,通常認為這筆交易比較安全并難以逆轉卦绣。
  6. 難度:整個網(wǎng)絡會通過調(diào)整“難度”這個變量來控制生成工作量證明所需要的計算力耐量。
  7. 難度目標:使整個網(wǎng)絡的計算力大致每10分鐘產(chǎn)生一個區(qū)塊所需要的難度數(shù)值即為難度目標。
  8. 難度調(diào)整:整個網(wǎng)絡每產(chǎn)生2,106個區(qū)塊后會根據(jù)之前2,106個區(qū)塊的算力進行難度調(diào)整迎卤。
  9. 礦工費:交易的發(fā)起者通常會向網(wǎng)絡繳納一筆礦工費拴鸵,用以處理這筆交易。大多數(shù)的交易需要0.5毫比特幣的礦工費蜗搔。
  10. 礦工:指通過不斷重復哈希運算來產(chǎn)生工作量證明的各網(wǎng)絡節(jié)點劲藐。
  11. 比特幣網(wǎng)絡:是一個由若干節(jié)點組成的用以廣播交易信息和數(shù)據(jù)區(qū)塊的P2P網(wǎng)絡。
  12. 交易:簡單地說樟凄,交易指把比特幣從一個地址轉到另一個地址聘芜。更準確地說,一筆“交易”指一個經(jīng)過簽名運算的缝龄,表達價值轉移的數(shù)據(jù)結構汰现。每一筆“交易”都經(jīng)過比特幣網(wǎng)絡傳輸,由礦工節(jié)點收集并封包至區(qū)塊中叔壤,永久保存在區(qū)塊鏈某處瞎饲。
  13. 錢包:指保存比特幣地址和私鑰的軟件,可以用它來接受炼绘、發(fā)送嗅战、儲存你的比特幣。

二俺亮、介紹

什么是比特幣

  1. 不同于傳統(tǒng)貨幣驮捍,比特幣是完全虛擬的。它不但沒有實體脚曾,本質(zhì)上也沒有一種虛擬物品代表比特幣东且。
  2. 比特幣隱含在收發(fā)幣的轉賬記錄中。用戶只要有證明其控制權的密鑰本讥,用密鑰解鎖珊泳,就可以發(fā)送比特幣鲁冯。
  3. 這些密鑰通常存儲在計算機的數(shù)字錢包里。擁有密鑰是使用比特幣的唯一條件色查,這讓控制權完全掌握在每個人手中晓褪。
  4. 本質(zhì)上,挖礦把央行的貨幣發(fā)行和結算功能進行分布式综慎,用全球化的算力競爭來取代對中央發(fā)行機構的需求。
  5. 比特幣系統(tǒng)包含調(diào)節(jié)挖礦難度的協(xié)議勤庐。挖礦——在比特幣網(wǎng)絡中成功寫入一個區(qū)塊交易——的難度是動態(tài)調(diào)整的示惊,保證不管有多少礦工(多少CPU)挖礦,平均每10分鐘只有一個礦工成功愉镰。
  6. 比特幣協(xié)議還規(guī)定米罚,每四年新幣的開采量減半,同時限制比特幣的最終開采總量為2,100萬枚丈探。這樣录择,流通中的比特幣數(shù)量非常接近一條曲線,并將在2140年比特幣將達到2,100萬枚碗降。由于比特幣的開采速度隨時間遞減隘竭,從長期來看,比特幣是一種通貨緊縮貨幣讼渊。此外动看,不能通過“印刷”新比特幣來實現(xiàn)“通貨膨脹”。
  7. 比特幣由這些構成:
    • 一個去中心化的點對點網(wǎng)絡(比特幣協(xié)議)
    • 一個公共的交易賬簿(區(qū)塊鏈)
    • 一個去中心化的數(shù)學的和確定性的貨幣發(fā)行(分布式挖礦)
    • 一個去中心化的交易驗證系統(tǒng)(交易腳本)

比特幣錢包-客戶端

  1. 完整客戶端:
    • 一個完整客戶端爪幻,或稱“全節(jié)點”菱皆,是存儲所有比特幣交易的整個交易歷史(由每一個用戶完成的每一筆交易,曾經(jīng)所有的每一筆)的客戶端挨稿,管理用戶的錢包仇轻,并可以在比特幣網(wǎng)絡上直接開始交易。
    • 類似于一個獨立的電子郵件服務器奶甘,因為它處理著協(xié)議的各個方面篷店,而不依賴于任何其它的服務器或第三方服務。
  2. 輕量級客戶端
    • 一個輕量級客戶端存儲用戶的錢包甩十,但需要依賴第三方服務器才能進行比特幣交易船庇,才能接入比特幣網(wǎng)絡。
    • 輕量級客戶端不保存所有交易的完整副本侣监,因此必須信賴第三方的服務器來獲取交易確認鸭轮。
    • 這就類似于一個獨立的電子郵件客戶端,能夠通過郵箱服務器來訪問一個郵箱橄霉,因為它在網(wǎng)絡交流中依賴于一個第三方服務器窃爷。
  3. 在線客戶端
    • 在線客戶端通過網(wǎng)頁瀏覽器在第三方服務器上訪問和儲存該用戶的錢包邑蒋。
    • 這類似于在線郵件,因為它完全依賴于第三方服務器按厘。
  4. 移動客戶端
    • 智能手機的移動客戶端医吊,例如基于Android系統(tǒng),既可以作完整客戶端運行逮京,也可作為輕量級客戶端或在線客戶端卿堂。
    • 一些移動客戶端是與在線客戶端或桌面客戶端同步的,提供跨多個設備但有一個共同的資金源的多平臺錢包懒棉。
  5. 比特幣客戶端的選擇草描,取決于用戶想要管理資金的數(shù)目。一個完整的客戶端將為用戶提供最高級的管理和獨立性策严。這樣錢包的備份和安全責任就轉移到了用戶身上穗慕。另一種選擇是在線客戶端,其設置和使用是最簡單的妻导,但在線客戶端的取舍還在于需衡量第三方介入的風險逛绵,因為安全性和控制權是由用戶和網(wǎng)頁服務商所共同承擔的。如果一個在線錢包服務遭受了損失倔韭,就像已發(fā)生過的那樣术浪,用戶們可能會失去所有的資金。反過來看寿酌,如果用戶的一個完整客戶端沒有進行適當?shù)膫浞萏砺穑麄兛赡軙驗殡娔X的操作失誤而丟失他們的資金。

三份名、比特幣基本原理

概述

  1. 從千分之一比特幣(1毫比特幣)到一億分之一比特幣(1聰比特幣)碟联,比特幣網(wǎng)絡可以處理任意小額交易。在本書中僵腺,我們將用“比特幣”這個術語來表示任意數(shù)量的比特幣貨幣鲤孵,從最小單元(1聰)到可被挖出的所有比特幣總數(shù)(21,000,000)。
  2. 交易包含了每一筆被轉移的比特幣(輸入)的所有權證明辰如,它以所有者的數(shù)字簽名形式存在普监,并可以被任何人獨立驗證。
  3. 在比特幣術語中琉兜,“消費”指的是簽署一筆交易:轉移一筆以前交易的比特幣給以比特幣地址所標識的新所有者凯正。

比特幣交易

  1. 交易告知全網(wǎng):比特幣的持有者已授權把比特幣轉帳給其他人。而新持有者能夠再次授權豌蟋,轉移給該比特幣所有權鏈中的其他人廊散,產(chǎn)生另一筆交易來花掉這些比特幣,后面的持有者在花費比特幣也是用類似的方式梧疲。
  2. 交易形式
    • 最常見的交易形式是從一個地址到另一個地址的簡單支付允睹,這種交易也常常包含給支付者的“找零”
    • 另一種常見的交易形式是集合多個輸入到一個輸出的模式运准。這相當于現(xiàn)實生活中將很多硬幣和紙幣零錢兌換為一個大額面鈔。像這樣的交易有時由錢包應用產(chǎn)生來清理許多在支付過程收到的小數(shù)額的找零缭受。
    • 最后一種在比特幣賬簿中常見的交易形式是將一個輸入分配給多個輸出胁澳,即多個接收者(如圖2-7)的交易。這類交易有時被商業(yè)實體用作分配資金米者,例如給多個雇員發(fā)工資的情形韭畸。
  3. 交易的構建。比特幣交易建立和簽名時不用連接比特幣網(wǎng)絡蔓搞。只有在執(zhí)行交易時才需要將交易發(fā)送到網(wǎng)絡陆盘。
  4. 完整客戶端占太大的硬盤空間,所以大多數(shù)錢包使用輕量級的客戶端败明,只保存用戶自己的未消費輸出。如果錢包客戶端沒有某一未消費交易輸出太防,它可以通過不同的服務者提供的各種API或完整索引節(jié)點的JSON PRC API從比特幣網(wǎng)絡中拿到這一交易信息妻顶。
curl 'https://blockchain.info/unspent?active=1Cdid9KFAaatwczBwBttQcwXYCpvK8h7FK'

返回:
{
    "unspent_outputs":[

        {
            "tx_hash":"f2c245c38672a5d8fba5a5caa44dcef277a52e916a0603272f91286f2b052706",
            "tx_hash_big_endian":"0627052b6f28912f2703066a912ea577f2ce4da4caa5a5fbd8a57286c345c2f2",
            "tx_index":47854970,
            "tx_output_n": 1,
            "script":"76a9147f9b1a7fb68d60c536c2fd8aeaa53a8f3cc025a888ac",
            "value": 8450000,
            "value_hex": "0080efd0",
            "confirmations":217419
        },

        {
            "tx_hash":"0365fdc169b964ea5ad3219e12747e9478418fdc8abed2f5fe6d0205c96def29",
            "tx_hash_big_endian":"29ef6dc905026dfef5d2be8adc8f4178947e74129e21d35aea64b969c1fd6503",
            "tx_index":71083209,
            "tx_output_n": 0,
            "script":"76a9147f9b1a7fb68d60c536c2fd8aeaa53a8f3cc025a888ac",
            "value": 100000,
            "value_hex": "0186a0",
            "confirmations":161802
        },

        {
            "tx_hash":"d9717f774daab8d3dd470853204394c82e3c01097479575d6d2ee97d7b3bdfa1",
            "tx_hash_big_endian":"a1df3b7b7de92e6d5d57797409013c2ec8944320530847ddd3b8aa4d777f71d9",
            "tx_index":75974855,
            "tx_output_n": 0,
            "script":"76a9147f9b1a7fb68d60c536c2fd8aeaa53a8f3cc025a888ac",
            "value": 1000000,
            "value_hex": "0f4240",
            "confirmations":153961
        },

        {
            "tx_hash":"3f1df69df90d097981ca9c97ad8b6a32daed345565a433f8c8e472b2dab2ac79",
            "tx_hash_big_endian":"79acb2dab272e4c8f833a4655534edda326a8bad979cca8179090df99df61d3f",
            "tx_index":79887883,
            "tx_output_n": 1,
            "script":"76a9147f9b1a7fb68d60c536c2fd8aeaa53a8f3cc025a888ac",
            "value": 719787,
            "value_hex": "0afbab",
            "confirmations":148074
        },

        {
            "tx_hash":"417bdb6f5db3e830407f94d1a82d1667e738b19da3679b7263ebfb913394efdd",
            "tx_hash_big_endian":"ddef943391fbeb63729b67a39db138e767162da8d1947f4030e8b35d6fdb7b41",
            "tx_index":170905487,
            "tx_output_n": 0,
            "script":"76a9147f9b1a7fb68d60c536c2fd8aeaa53a8f3cc025a888ac",
            "value": 10000,
            "value_hex": "2710",
            "confirmations":67883
        },

        {
            "tx_hash":"d049d6039f9d1cb2625bac294d7465b4b1077bd5bc0e30e01e02b184db524c1f",
            "tx_hash_big_endian":"1f4c52db84b1021ee0300ebcd57b07b1b465744d29ac5b62b21c9d9f03d649d0",
            "tx_index":174630347,
            "tx_output_n": 0,
            "script":"76a9147f9b1a7fb68d60c536c2fd8aeaa53a8f3cc025a888ac",
            "value": 11100,
            "value_hex": "2b5c",
            "confirmations":65345
        },

        {
            "tx_hash":"b8a6470c7a38d0983effed00a3f75c74ba371da1387352f35d1df155851ea8d1",
            "tx_hash_big_endian":"d1a81e8555f11d5df3527338a11d37ba745cf7a300edff3e98d0387a0c47a6b8",
            "tx_index":175949432,
            "tx_output_n": 0,
            "script":"76a9147f9b1a7fb68d60c536c2fd8aeaa53a8f3cc025a888ac",
            "value": 10000,
            "value_hex": "2710",
            "confirmations":64439
        },

        {
            "tx_hash":"a2b9570e26e3991fc999c42dc8c6eea7b06514b61814da1a71b56c6ba2ae651c",
            "tx_hash_big_endian":"1c65aea26b6cb5711ada1418b61465b0a7eec6c82dc499c91f99e3260e57b9a2",
            "tx_index":175955161,
            "tx_output_n": 0,
            "script":"76a9147f9b1a7fb68d60c536c2fd8aeaa53a8f3cc025a888ac",
            "value": 10000,
            "value_hex": "2710",
            "confirmations":64430
        },

        {
            "tx_hash":"05230cb8cd8c6a3788ed41433dfdd68a1a608cc8feb3bc1c29d97ce84bec070e",
            "tx_hash_big_endian":"0e07ec4be87cd9291cbcb3fec88c601a8ad6fd3d4341ed88376a8ccdb80c2305",
            "tx_index":175955664,
            "tx_output_n": 0,
            "script":"76a9147f9b1a7fb68d60c536c2fd8aeaa53a8f3cc025a888ac",
            "value": 10000,
            "value_hex": "2710",
            "confirmations":64430
        }

    ]
}

查看交易詳細信息:

https://blockchain.info/tx/${tx_hash_big_endian}

創(chuàng)建交易輸出

  1. 交易的輸出會被創(chuàng)建成為一個包含這筆數(shù)額的腳本的形式,只能被引入這個腳本的一個解答后才能兌換蜒车。
  2. 簡單點說就是讳嘱,支付方的交易輸出會包含一個腳本,這個腳本說 “這個輸出誰能拿出一個簽名和接收方的公開地址匹配上酿愧,就支付給誰”沥潭。因為只有接收方錢包的私鑰可以匹配這個地址,所以只有接收方的錢包可以提供這個簽名以兌換這筆輸出嬉挡。因此支付方式會用需要接收方的簽名來包裝一個輸出钝鸽。
  3. 假如支付方的地址上,金額是0.10比特幣的輸出形式庞钢,而此次交易只需要支付0.015比特幣拔恰,就需要找0.085比特幣的零錢。支付方的錢包將自己的金額分成了兩個支付:一個給接收方基括,一個給自己颜懊。她可以在以后的交易里消費這筆零錢輸出。
  4. 最后风皿,為了讓這筆交易盡快地被網(wǎng)絡處理河爹,支付方的錢包會多付一小筆費用。這個不是明顯地包含在交易中的桐款,而是通過輸入和輸出的差值所隱含的咸这。這個差值會就被礦工當作交易費放到區(qū)塊的交易里,最終放進區(qū)塊鏈帳薄中魔眨。
  5. 支付方的錢包應用創(chuàng)建的交易大小為258字節(jié)炊苫,包含了金額未來所屬需要的全部信息裁厅。最后的最后,這個交易必須要被傳送到比特幣網(wǎng)絡中以成為分布式賬簿(區(qū)塊鏈)的一部分侨艾。

交易的傳送

  1. 比特幣網(wǎng)絡是由參與的比特幣客戶端聯(lián)接幾個其他比特幣客戶端組成的P2P網(wǎng)絡执虹。比特幣網(wǎng)絡的目的是將交易和區(qū)塊傳播給所有參與者。
  2. 錢包應用可以發(fā)送新的交易給其它任意一個已聯(lián)接到互聯(lián)網(wǎng)的比特幣客戶端唠梨。支付方的錢包不必直接連著接收方的比特幣錢包袋励。任何比特幣網(wǎng)絡節(jié)點(其它客戶端)收到一個之前沒見過的有效交易時會立刻將它轉發(fā)給聯(lián)接到自身的其它節(jié)點。因此当叭,這個交易迅速地從P2P網(wǎng)絡中傳播開來茬故,幾秒內(nèi)就能到達大多數(shù)節(jié)點。
  3. 接受者的錢包接收到支付方發(fā)過來的交易節(jié)點時蚁鳖,會立即確認交易是一個收入支付磺芭,因為它包含能用自己私鑰兌換的輸出。接收方的錢包應用也能夠獨立地用之前未消費輸入來確認這個交易是正確構建的醉箕,并且由于包含足夠交易費會被下一個區(qū)塊包含進去钾腺。這時接收方就可以以一個很小的風險假定這個交易會很快被加到區(qū)塊且被確認。
  4. 一個對比特幣交易的常見誤解是它們必須要等10分鐘后被確認加進一個新區(qū)塊讥裤,或等60分鐘以得到六次確認后才是有效的放棒。雖然這些確認可以確保交易已被整個網(wǎng)絡接受,但對于像一杯咖啡這樣的小額商品來說就沒有必要等待那么長時間了己英。一個商家可以免確認來接受比特幣小額支付间螟。這樣做的風險不比接受一個不是用有效身份證領取或沒有簽名的信用卡的風險更大,而后者是現(xiàn)在商家常做的事情损肛。

交易確認--挖礦

  1. 挖礦在比特幣系統(tǒng)中起著兩個作用:
    • 挖礦在構建區(qū)塊時會創(chuàng)造新的比特幣厢破,和一個中央銀行印發(fā)新的紙幣很類似。每個區(qū)塊創(chuàng)造的比特幣數(shù)量是固定的治拿,隨時間會漸漸減少
    • 挖礦創(chuàng)建信任溉奕。挖礦確保只有在包含交易的區(qū)塊上貢獻了足夠的計算量后再悼,這些交易才被確認抑党。區(qū)塊越多蛤售,花費的計算量越大韧涨,意味著更多的信任
    • 工作量證明算法指的用SHA256加密算法不斷地對區(qū)塊頭和一個隨機數(shù)字進行哈希計算涨缚,直到出現(xiàn)一個和預設值相匹配的解
  2. 網(wǎng)絡中產(chǎn)生的一筆交易直到成為整個比特幣大賬簿——區(qū)塊鏈的一部分時才會被確認有效蝙场。
  3. 平均每10分鐘巷送,礦工會將自上一個區(qū)塊以來發(fā)生的所有交易生成一個新的區(qū)塊衩匣。
  4. 新交易不斷地從用戶錢包和應用流入比特幣網(wǎng)絡未檩。當比特幣網(wǎng)絡上的節(jié)點看到這些交易時戴尸,會先將它們放到各自節(jié)點維護的一個臨時的未經(jīng)驗證的交易池中。當?shù)V工構建一個新區(qū)塊時冤狡,會將這些交易從這個交易池中拿出來放到這個新區(qū)塊中孙蒙,然后通過嘗試解決一個非常困難的問題(也叫工作量證明)以證明這個新區(qū)塊的合法性项棠。
  5. 交易被加進新區(qū)塊時,以交易費用高的優(yōu)先以及其它的一些規(guī)則進行排序挎峦。
  6. 礦工一旦從網(wǎng)絡上收到一個新區(qū)塊時香追,會意識到在這個區(qū)塊上的解題競賽已經(jīng)輸?shù)袅耍瑫R上開始下一個新區(qū)塊的挖掘工作坦胶。它會立刻將一些交易和這個新區(qū)塊的數(shù)字指紋放在一起開始構建下一個新區(qū)塊透典,并開始給它計算工作量證明。
  7. 每個礦工會在他的區(qū)塊中包含一個特殊的交易顿苇,將新生成的比特幣(當前每區(qū)塊為25比特幣)作為報酬支付到他自己的比特幣地址峭咒。如果他找到了使得新區(qū)塊有效的解法,他就會得到這筆報酬纪岁,因為這個新區(qū)塊被加入到了總區(qū)塊鏈中凑队,他添加的這筆報酬交易也會變成可消費的。
  8. 按慣例來說幔翰,一個區(qū)塊獲得六次以上“證明”時就被認為是不可撤銷的了漩氨,因為要撤銷和重建六個區(qū)塊需要巨量的計算。

四导匣、比特幣客戶端

  1. BitCoin,比特幣核心擁有交易賬簿(區(qū)塊鏈)的一份完整拷貝茸时,里面記錄了自2009年比特幣網(wǎng)絡被發(fā)明以來發(fā)生在比特幣網(wǎng)絡上的每一筆交易贡定。
  2. bitcoin源碼地址:https://github.com/bitcoin/bitcoin
  3. 帶有rc后綴的是預發(fā)行版本,可以用來測試可都。沒有后綴的穩(wěn)定版本可以直接在產(chǎn)品環(huán)境上運行缓待。
  4. 錢包相關一些命令:
    • bitcoin-cli getinfo 獲取bitcoin客戶端的狀態(tài)信息
    • bitcoin-cli encryptwallet ${password} 加密錢包
    • bitcoin-cli walletpassphrase ${password} ${time_in_seconds} 解密錢包,并且指定錢包被解密的時間渠牲,秒為單位
    • bitcoin-cli backupwallet wallet.backup 備份錢包旋炒,其中wallet.backup為備份的文件名
    • bitcoin-cli importwallet wallet.backup 重新加載備份文件
    • bitcoin-cli dumpwallet wallet.txt 將錢包轉儲為人類可讀的文本文件
  5. 地址相關基本命令:
    • 比特幣參考客戶端維護了一個地址池,地址池的大小可以用getinfo命令keypoolsize參數(shù)獲取签杈。這些地址是自動生成的瘫镇,可以被用作公開接收地址或零錢地址。
    • bitcoin-cli getnewaddress 獲得地址池中的一個地址
    • bitcoin-cli getreceivedbyaddress 1hvzSofGwT8cjb8JU7nBsCSfEVQX5u9CL 0 詢問bitcoind客戶端此地址已經(jīng)接收到的比特幣數(shù)額答姥,以及指定該數(shù)額要被加到余額中所需要的確認數(shù)铣除,其中本例中指定確認數(shù)為0。如果我們忽略這個命令后面的0鹦付,我們將只能在至少minconf個確認之后才能看到數(shù)額尚粘,minconf是想要某筆交易出現(xiàn)在余額中所設置的最少確認數(shù)。minconf設置在bitcoind配置文件指定敲长。
    • bitcoin-cli listtransactions 展示出來整個錢包接收到的交易
    • bitcoin-cli getaddressesbyaccount "" 列出整個錢包的所有地址
    • bitcoin-cli getbalance 顯示所有經(jīng)過至少minconf個確認的交易加和后的余額郎嫁”蹋“配置項“minconf”決定了交易在余額中體現(xiàn)的最少確認數(shù)。
    • bitcoin-cli gettransaction ${txid} 通過交易哈希值獲取一筆交易泽铛。txid在交易確認之前并不權威尚辑。區(qū)塊鏈中找不到交易哈希值并不意味著此筆交易沒有進行。這被稱作“交易延展性”厚宰,因為交易哈希值在區(qū)塊確認之前是可以更改的腌巾。在確認之后txid是不變且權威的。
    • 用gettransaction命令顯示的交易格式為簡化格式铲觉。若要得到整個交易代碼并且將之解碼澈蝙,我們將使用兩個命令:getrawtransactiondecoderawtransaction。第一撵幽,getrawtransaction把交易哈希值(txid)當做一個參數(shù)灯荧,并且把整個交易以一個“原始”的十六進制字符串的形式返回,而這也正是交易在比特幣網(wǎng)絡上存在的形式盐杂,要解碼這個十六進制字符串逗载,我們使用decoderawtransaction命令。復制粘貼這個十六進制字符串作為decoderawtransaction的第一個參數(shù)以將整個內(nèi)容解讀為JSON數(shù)據(jù)格式链烈。
    • 一旦我們接收到的交易以記錄在區(qū)塊中的方式被確認厉斟,gettransaction命令將返回附加信息,顯示包含交易的區(qū)塊的哈希值强衡。
    • 比特幣核心默認建立包含僅與用戶錢包相關交易的數(shù)據(jù)庫擦秽。若你想使用類似gettransaction的命令訪問所有交易,你需要配置比特幣核心去建立一個完整的交易索引漩勤,這個可以通過txindex選項實現(xiàn)感挥。在比特幣核心配置文件中將txindex賦值為1(通常在安裝目錄的.bitcoin/bitcoin.conf中可以找到)。一旦你改變了此參數(shù)越败,你需要重啟bitcoind触幼,并等待其重建索引。

探索區(qū)塊

  1. bitcoin-cli getblock ${block_hash}
  2. bitcoin-cli getblockhash ${高度} 我們同樣可以使用getblockhash命令通過區(qū)塊高度來檢索一個區(qū)塊究飞,這樣需要將區(qū)塊高度作為參數(shù)置谦,并返回那個區(qū)塊的區(qū)塊哈希值。bitcoin-cli getblockhash 0 獲得了“創(chuàng)世區(qū)塊”的區(qū)塊哈希值亿傅,這是被中本聰所挖的第一個區(qū)塊霉祸,高度為0

基于UTXO(未花費的交易輸出)的建立、簽名與提交

  1. bitcoin-cli listunspent 查看我們錢包中所有剩余的從之前交易中已確認的支出
  2. bitcoin-cli gettxout
  3. bitcoin-cli createrawtransaction '[{"txid" : "9ca8f969bd3ef5ec2a8685660fdbf7a8bd365524c2e1fc66c309acbae2c14ae3", "vout" : 0}]' '{"1LnfTndy3qzXGN19Jwscj1T8LR3MVe3JDb": 0.025, "1hvzSofGwT8cjb8JU7nBsCSfEVQX5u9CL": 0.0245}'

其他客戶端

  1. pycoin 是一款基于Python庫袱蜡,并可以支持比特幣密鑰的操作和交易的客戶端丝蹭,甚至可以支持編譯語言從而處理非標準交易。
  2. btcd是一款基于Go語言的全節(jié)點比特幣工具。目前奔穿,它通過使用精準的規(guī)則(包括bugs)镜沽,下載、驗證和服務區(qū)塊鏈贱田。它同時依靠新發(fā)掘出來的區(qū)塊來維持交易池缅茉,同時依賴沒有形成區(qū)塊的單獨交易。在縝密的規(guī)則以及檢查下男摧,確保了每筆獨立交易的安全蔬墩,并且可以過濾基于礦工需求的交易。btcd與bitcoind的一個主要區(qū)別是btcd不包含比特幣錢包的功能耗拓,其實這是一個精心的設計拇颅。這意味著你不能直接通過btcd進行比特幣交易。然而這項功能可以由正在研發(fā)的btcwallet與btcgui兩個項目提供乔询。另一個顯著的區(qū)別是btcd同時支持HTTP POST(比如bitcoind)與推薦使用的Websockets兩種通信協(xié)議的請求樟插。并且btcd的RPC連接默認設置為TLS-開啟。
  3. bitcoinj 一款全節(jié)點java客戶端和程序庫竿刁。

五黄锤、秘鑰、地址食拜、錢包

在比特幣交易的支付環(huán)節(jié)鸵熟,收件人的公鑰是通過其數(shù)字指紋表示的,稱為比特幣地址负甸,就像支票上的支付對象的名字(即“收款方”)流强。一般情況下,比特幣地址由一個公鑰生成并對應于這個公鑰惑惶。然而煮盼,并非所有比特幣地址都是公鑰短纵;他們也可以代表其他支付對象带污,譬如腳本。這樣一來香到,比特幣地址把收款方抽象起來了鱼冀。

私鑰和公鑰

  1. 一個比特幣錢包中包含一系列的密鑰對,每個密鑰對包括一個私鑰和一個公鑰悠就。私鑰(k)是一個數(shù)字千绪,通常是隨機選出的。有了私鑰梗脾,我們就可以使用<font color="red">橢圓曲線乘法</font>這個單向加密函數(shù)產(chǎn)生一個公鑰(K)荸型。
  2. 有了公鑰(K),我們就可以使用一個單向加密哈希函數(shù)生成比特幣地址(A)
  3. 在比特幣交易中炸茧,私鑰用于生成支付比特幣所必需的簽名以證明資金的所有權瑞妇。
  4. 私鑰必須始終保持機密稿静,因為一旦被泄露給第三方,相當于該私鑰保護之下的比特幣也拱手相讓了辕狰。
  5. 私鑰還必須進行備份改备,以防意外丟失,因為私鑰一旦丟失就難以復原蔓倍,其所保護的比特幣也將永遠丟失悬钳。
  6. 私鑰一般是256 bit
  7. 比特幣軟件使用操作系統(tǒng)底層的隨機數(shù)生成器來產(chǎn)生256位的熵(隨機性)。通常情況下偶翅,操作系統(tǒng)隨機數(shù)生成器由人工的隨機源進行初始化默勾,也可能需要通過幾秒鐘內(nèi)不停晃動鼠標等方式進行初始化倒堕。
  8. 私鑰可以是1和n-1之間的任何數(shù)字灾测,其中n是一個常數(shù)(n=1.158 * 1077,略小于2256)垦巴,并由比特幣所使用的橢圓曲線的階所定義(見4.1.5 橢圓曲線密碼學解釋)媳搪。要生成這樣的一個私鑰,我們隨機選擇一個256位的數(shù)字骤宣,并檢查它是否小于n-1秦爆。從編程的角度來看,一般是通過在一個密碼學安全的隨機源中取出一長串隨機字節(jié)憔披,對其使用SHA256哈希算法進行運算等限,這樣就可以方便地產(chǎn)生一個256位的數(shù)字。如果運算結果小于n-1芬膝,我們就有了一個合適的私鑰望门。否則,我們就用另一個隨機數(shù)再重復一次锰霜。
  9. 一定不要使用自己寫的代碼或使用編程語言內(nèi)建的簡易隨機數(shù)生成器來獲得一個隨機數(shù)筹误。我們建議讀者使用密碼學安全的偽隨機數(shù)生成器(CSPRNG),并且需要有一個來自具有足夠熵值的源的種子癣缅。使用隨機數(shù)發(fā)生器的程序庫時厨剪,需仔細研讀其文檔,以確保它是加密安全的友存。對CSPRNG的正確實現(xiàn)是密鑰安全性的關鍵所在祷膳。
  10. dumpprivkey命令會把私鑰以Base58校驗和編碼格式顯示,這種私鑰格式被稱為錢包導入格式(WIF屡立,Wallet Import Format)
  11. sx newkey -> 生成并顯示私鑰
  12. 比特幣地址A = RIPEMD160(SHA256( public key ))
  13. 通常用戶見到的比特幣地址是經(jīng)過“Base58Check”編碼的直晨,這種編碼使用了58個字符(一種Base58數(shù)字系統(tǒng))和校驗碼,提高了可讀性、避免歧義并有效防止了在地址轉錄和輸入中產(chǎn)生的錯誤勇皇。Base58Check編碼也被用于比特幣的其它地方奕巍,例如比特幣地址、私鑰儒士、加密的密鑰和腳本哈希中的止,用來提高可讀性和錄入的正確性。
  14. 最全面的比特幣Python庫是 Vitalik Buterin寫的pybitcointools

比特幣錢包

  1. 錢包是私鑰的容器着撩,通常通過有序文件或者簡單的數(shù)據(jù)庫實現(xiàn)诅福。另外一種制作私鑰的途徑是 確定性密鑰生成。在這里你可以用原先的私鑰拖叙,通過單向哈希函數(shù)來生成每一個新的私鑰氓润,并將新生成的密鑰按順序連接。只要你可以重新創(chuàng)建這個序列薯鳍,你只需要第一個私鑰(稱作種子咖气、主私鑰)來生成它們。

非確定性(隨機)錢包

  1. 在最早的一批比特幣客戶端中挖滤,錢包只是隨機生成的私鑰集合崩溪。這種類型的錢包被稱作零型非確定錢包。
  2. 舉個例子斩松,比特幣核心客戶端預先生成100個隨機私鑰伶唯,從最開始就生成足夠多的私鑰并且每把鑰匙只使用一次。這種類型的錢包有一個昵稱“Just a Bunch Of Keys(一堆私鑰)”簡稱JBOK惧盹。
  3. 這種錢包現(xiàn)在正在被確定性錢包替換乳幸,因為它們難以管理、備份以及導入钧椰。
  4. 隨機鑰匙的缺點就是如果你生成很多粹断,你必須保存它們所有的副本。這就意味著這個錢包必須被經(jīng)常性地備份嫡霞。每一把鑰匙都必須備份瓶埋,否則一旦錢包不可訪問時,錢包所控制的資金就付之東流秒际。
  5. 這種情況直接與避免地址重復使用的原則相沖突——每個比特幣地址只能用一次交易悬赏。地址通過關聯(lián)多重交易和對方的地址重復使用會減少隱私狡汉。

確定性(種子)錢包

  1. 確定性娄徊,或者“種子”錢包包含通過使用單項離散方程而可從公共的種子生成的私鑰。
  2. 種子是隨機生成的數(shù)字盾戴。這個數(shù)字也含有比如索引號碼或者可生成私鑰的“鏈碼”
  3. 在確定性錢包中寄锐,種子足夠收回所有的已經(jīng)產(chǎn)生的私鑰,所以只用在初始創(chuàng)建時的一個簡單備份就足以搞定。
  4. 種子也足夠讓錢包輸入或者輸出橄仆。這就很容易允許使用者的私鑰在錢包之間輕松轉移輸入剩膘。

助記碼詞匯

  1. 助記碼詞匯是英文單詞序列代表(編碼)用作種子對應所確定性錢包的隨機數(shù)。單詞的序列足以重新創(chuàng)建種子盆顾,并且從種子那里重新創(chuàng)造錢包以及所有私鑰怠褐。
  2. 助記碼代碼可以讓使用者復制錢包更容易一些,因為它們相比較隨機數(shù)字順序來說您宪,可以很容易地被讀出來并且正確抄寫
  3. BIP0039定義助記碼和種子的創(chuàng)建過程如下:
    • 1.創(chuàng)造一個128到256位的隨機順序(熵)
    • 2.提出SHA256哈希前幾位奈懒,就可以創(chuàng)造一個隨機序列的校驗和
    • 3.把校驗和加在隨機順序的后面
    • 4.把順序分解成11位的不同集合,并用這些集合去和一個預先已經(jīng)定義的2048個單詞字典做對應
    • 5.生成一個12至24個詞的助記碼

分層確定性錢包

  1. 分層確定性錢包包含從數(shù)結構所生成的鑰匙宪巨。這種母鑰匙可以生成子鑰匙的序列磷杏。這些子鑰匙又可以衍生出孫鑰匙,以此無窮類推捏卓。

高級密鑰和地址

加密私鑰(BIP0038)

  1. 私鑰必須保密
  2. BIP0038提出了一個通用標準极祸,使用一個口令加密私鑰并使用Base58Check對加密的私鑰進行編碼,這樣加密的私鑰就可以安全地保存在備份介質(zhì)里怠晴,安全地在錢包間傳輸遥金,保持密鑰在任何可能被暴露情況下的安全性。
  3. BIP0038加密方案是:
    • 輸入一個比特幣私鑰蒜田,通常使用WIF編碼過汰规,base58chek字符串的前綴“5”
    • 輸入一個長密碼作為口令,通常由多個單詞或一段復雜的數(shù)字字母字符串組成
    • BIP0038加密方案的輸出一個由base58check編碼過的加密私鑰物邑,前綴為6P
  4. 如果你看到一個6P開頭的的密鑰溜哮,這就意味著該密鑰是被加密過,并需要一個口令來轉換(解碼)該密鑰回到可被用在任何錢包WIF格式的私鑰(前綴為5)色解。
  5. 許多錢包APP現(xiàn)在能夠識別BIP0038加密過的私鑰茂嗓,會要求用戶提供口令解碼并導入密鑰。

P2SH (Pay-to-Script Hash)和多重簽名地址

  1. 傳統(tǒng)的比特幣地址從數(shù)字1開頭科阎,來源于公鑰述吸,而公鑰來源于私鑰。雖然任何人都可以將比特幣發(fā)送到一個1開頭的地址锣笨,但比特幣只能在通過相應的私鑰簽名和公鑰哈希值后才能消費蝌矛。
  2. 以數(shù)字3開頭的比特幣地址是P2SH地址,有時被錯誤的稱謂多重簽名或多重簽名地址错英。他們指定比特幣交易中受益人作為哈希的腳本入撒,而不是公鑰的所有者。
  3. 不同于P2PKH交易發(fā)送資金到傳統(tǒng)1開頭的比特幣地址椭岩,資金被發(fā)送到3開頭的地址時茅逮,需要的不僅僅是一個公鑰的哈希值璃赡,同時也需要一個私鑰簽名作為所有者證明。在創(chuàng)建地址的時候献雅,這些要求會被定義在腳本中碉考,所有對地址的輸入都會被這些要求阻隔。
  4. script hash = RIPEMD160(SHA256(script)) 腳本哈希的結果是由Base58Check編碼前綴為5的版本挺身、編碼后得到開頭為3的編碼地址侯谁。
  5. P2SH函數(shù)最常見的實現(xiàn)是用于多重簽名地址腳本迅涮。顧名思義蚣旱,底層腳本需要多個簽名來證明所有權,此后才能消費資金粮呢。設計比特幣多重簽名特性是需要從總共N個密鑰中需要M個簽名(也被稱為“閾值”)伍玖,被稱為M-N多簽名嫩痰,其中M是等于或小于N。

紙錢包

  1. 紙錢包是打印在紙張上的比特幣私鑰窍箍。有時紙錢包為了方便起見也包括對應的比特幣地址串纺,但這并不是必要的,因為地址可以從私鑰中導出椰棘。
  2. 紙錢包是一個非常有效的建立備份或者線下存儲比特幣(即冷錢包)的方式纺棺。作為備份機制,一個紙錢包可以提供安全性邪狞,以防在電腦硬盤損壞祷蝌、失竊或意外刪除的情況下造成密鑰的的丟失。
  3. 作為一個冷存儲的機制帆卓,如果紙錢包密鑰在線下生成并永久不在電腦系統(tǒng)中存儲巨朦,他們在應對黑客攻擊,鍵盤記錄器剑令,或其他在線電腦欺騙更有安全性糊啡。
  4. 一個更復雜的紙錢包存儲系統(tǒng)使用BIP0038加密的私鑰。打印在紙錢包上的這些私鑰被其所有者記住的一個口令保護起來吁津。沒有口令棚蓄,這些被加密過的密鑰也是毫無用處的。
  5. 雖然你可以多次存款到紙錢包中碍脏,但是你最好一次性提款梭依,一次性提取里面所有的資金。因為如果你提取的金額少于其中的金額的話典尾,會生成一個找零地址役拴。并且,你所用的電腦可能被病毒感染急黎,那么就有可能泄露私鑰扎狱。一次性提款可以減少私鑰泄露的風險,如果你所需的金額比較少勃教,那么請把余額找零到另一個紙錢包中淤击。

六、交易

比特幣交易的生命周期

  1. 一筆比特幣交易的生命周期起始于它被創(chuàng)建的那一刻故源,也就是誕生
    • 比特幣交易會被一個或者多個簽名加密污抬,這些簽名標志著對該交易指向的比特幣資金的使用許可。
    • 接下來绳军,比特幣交易被廣播到比特幣網(wǎng)絡中印机。在比特幣網(wǎng)絡中,每一個節(jié)點(比特幣交易參與者)驗證门驾、并將交易在網(wǎng)絡中進行廣播射赛,直到這筆交易被網(wǎng)絡中大多數(shù)節(jié)點接收。
    • 最終奶是,比特幣交易被一個挖礦節(jié)點驗證楣责,并被添加到區(qū)塊鏈上一個記錄著許多比特幣交易的區(qū)塊中。
  2. 比特幣交易可以被任何人在線上或線下創(chuàng)建聂沙,即便創(chuàng)建這筆交易的人不是這個賬戶的授權簽字人秆麸。類似于,一個負責應付賬款的柜員可以創(chuàng)建比特幣交易及汉,然后讓CEO對它進行數(shù)字簽名沮趣,從而使之有效。
  3. 一張支票是指定一個特定賬戶作為資金來源的坷随,但是比特幣交易指定以往的一筆交易作為其資金來源房铭,而不是一個特定賬戶。
  4. 一旦一筆比特幣交易被創(chuàng)建温眉,它會被資金所有者(們)簽名育叁。如果它是合法創(chuàng)建并簽名的,則該筆交易現(xiàn)在就是有效的芍殖,它包含了轉移這筆資金所需要的所有信息豪嗽。
  5. 最終,有效的比特幣交易必須能接入比特幣網(wǎng)絡豌骏,從而使之能被傳送龟梦,直至抵達下一個登記在公共總賬薄(區(qū)塊鏈)的挖礦節(jié)點窃躲。

廣播交易至比特幣網(wǎng)絡

  1. 首先计贰,一筆交易需要傳遞至比特幣網(wǎng)絡,才能被傳播蒂窒,也才能加入?yún)^(qū)塊鏈中躁倒。
  2. 本質(zhì)上荞怒,一筆比特幣交易只是300到400字節(jié)的數(shù)據(jù),而且它們必須被發(fā)送到成千上萬個比特幣節(jié)點中的任意一個秧秉。只要發(fā)送者能使用多于一個比特幣節(jié)點來確保這筆交易被傳播褐桌,那么發(fā)送者并不需要信任用來傳播該筆交易的單一節(jié)點。
  3. 比特幣交易因此可以通過未加密網(wǎng)絡(例如WiFi象迎、藍牙荧嵌、NFC、ChirP砾淌、條形碼或者復制粘貼至一個網(wǎng)頁表格)被發(fā)送到比特幣網(wǎng)絡啦撮。在一些極端情況下,一筆比特幣交易可以通過封包無線電汪厨、衛(wèi)星或“短波赃春、擴頻或跳頻以避免被偵測或阻塞通信的方式進行傳輸。一筆比特幣交易甚至可被編為文字信息中的表情符號并被發(fā)表到在線論壇劫乱,或被發(fā)送成一條短信或一條Skype聊天信息聘鳞。因為比特幣將金錢變成了一種數(shù)據(jù)結構,所以在本質(zhì)上是不可能阻止任何人創(chuàng)建并執(zhí)行比特幣交易的要拂。
  4. 一旦一筆比特幣交易被發(fā)送到任意一個連接至比特幣網(wǎng)絡的節(jié)點抠璃,這筆交易將會被該節(jié)點驗證。如果交易被驗證有效脱惰,該節(jié)點將會將這筆交易傳播到這個節(jié)點所連接的其他節(jié)點搏嗡;同時,交易發(fā)起者會收到一條表示交易有效并被接受的返回信息拉一。如果這筆交易被驗證為無效采盒,這個節(jié)點會拒絕接受這筆交易且同時返回給交易發(fā)起者一條表示交易被拒絕的信息。
  5. 為了避免垃圾信息的濫發(fā)蔚润、拒絕服務攻擊或其他針對比特幣系統(tǒng)的惡意攻擊磅氨,每一個節(jié)點在傳播每一筆交易之前均進行獨立驗證。 <font color='red'>一個異常交易所能到達的節(jié)點不會超過一個</font>嫡纠。

交易結構

  1. 一筆比特幣交易是一個含有輸入值和輸出值的數(shù)據(jù)結構烦租,該數(shù)據(jù)結構植入了將一筆資金從初始點(輸入值)轉移至目標地址(輸出值)的代碼信息。
  2. 比特幣交易的輸入值和輸出值與賬號或者身份信息無關除盏。應該將它們理解成一種被特定秘密信息鎖定的一定數(shù)量的比特幣叉橱。只有擁有者或知曉這個秘密信息的人可以解鎖。
  3. 字段:版本(4bytes者蠕,明確這筆交易參照的規(guī)則)窃祝、輸入量(1-9bytes,被包含的輸入的數(shù)量)踱侣、輸入(不定bytes粪小,一個或多個交易輸入)大磺、輸出量(1-9bytes,被包含的輸出的數(shù)量)探膊、輸出(不定bytes杠愧,一個或多個交易輸出)、時鐘時間(4bytes, 一個UNIX時間戳或區(qū)塊號)

交易的輸入和輸出

  1. 比特幣交易的基本單位是未經(jīng)使用的一個交易輸出突想,簡稱UTXO殴蹄。UTXO是不能再分割究抓、被所有者鎖住或記錄于區(qū)塊鏈中的并被整個網(wǎng)絡識別成貨幣單位的一定量的比特幣貨幣猾担。
  2. 實際上,并不存在儲存比特幣地址或賬戶余額的地點刺下,只有被所有者鎖住的绑嘹、分散的UTXO。
  3. “一個用戶的比特幣余額”橘茉,這個概念是一個通過比特幣錢包應用創(chuàng)建的派生之物工腋。比特幣錢包通過掃描區(qū)塊鏈并聚合所有屬于該用戶的UTXO來計算該用戶的余額。
  4. <font color='red'>在比特幣的世界里既沒有賬戶畅卓,也沒有余額擅腰,只有分散到區(qū)塊鏈里的UTXO</font>。一個UTXO可以是一“聰”的任意倍翁潘。
  5. 盡管UTXO可以是任意值趁冈,但只要它被創(chuàng)造出來了,就像不能被切成兩半的硬幣一樣不可再分了拜马。如果一個UTXO比一筆交易所需量大渗勘,它仍會被當作一個整體而消耗掉,但同時會在交易中生成零頭俩莽。大部分比特幣交易都會產(chǎn)生找零旺坠。
  6. 一筆比特幣交易可以有任意數(shù)值,但必須從用戶可用的UTXO中創(chuàng)建出來扮超。用戶不能再把UTXO進一步細分取刃,就像不能把一元紙幣撕開而繼續(xù)當貨幣使用一樣。用戶的錢包應用通常會從用戶可用的UTXO中選取多個可用的個體來拼湊出一個大于或等于一筆交易所需的比特幣量出刷。
  7. 被交易消耗的UTXO被稱為交易輸入蝉衣,由交易創(chuàng)建的UTXO被稱為交易輸出。通過這種方式巷蚪,一定量的比特幣價值在不同所有者之間轉移病毡,并在交易鏈中消耗和創(chuàng)建UTXO。一筆比特幣交易通過使用所有者的簽名來解鎖UTXO屁柏,并通過使用新的所有者的比特幣地址來鎖定并創(chuàng)建UTXO啦膜。
  8. 對于輸出和輸入鏈來說有送,有一個例外,它是一種特殊的交易類型僧家,稱為Coinbase交易雀摘。這是每個區(qū)塊中的首個交易。這種交易存在的原因是作為對挖礦的獎勵而產(chǎn)生全新的可用于支付的比特幣給“贏家”礦工八拱。這也就是為什么比特幣可以在挖礦過程中被創(chuàng)造出來阵赠。
  9. 交易輸出包含兩部分:
    • 一定量的比特幣,被命名為“聰”肌稻,是最小的比特幣單位清蚀;
    • 一個鎖定腳本,也被當作是“障礙”爹谭,提出支付輸出所必須被滿足的條件以“鎖住”這筆總額
  10. 交易輸出把用聰表示的一定數(shù)量的比特幣枷邪,和特定的定義了支付輸出所必須被滿足的條件的障礙,或者叫鎖定腳本诺凡,關聯(lián)到了一起东揣。在大多數(shù)情況下,鎖定腳本會把輸出鎖在一個特定的比特幣地址上腹泌,從而把一定數(shù)量的比特幣的所有權轉移到新的所有者上嘶卧。
  11. 交易輸入是指向UTXO的指針。它們指向特定的UTXO凉袱,并被交易哈希和在區(qū)塊鏈中記錄UTXO的序列號作為參考芥吟。
  12. 當用戶付款時,他的錢包通過選擇可用的UTXO來構造一筆交易绑蔫。比如說运沦,要支付0.015比特幣,錢包應用會選擇一個0.01 UTXO和一個0.005 UTXO配深,使用它們加在一起來得到想要的付款額携添。
  13. 一旦UTXO被選中烈掠,錢包會為每個UTXO生成包含簽名的解鎖腳本缸托,由此讓它們變得可以通過滿足鎖定腳本的條件來被支付左敌。錢包把這些UTXO作為參考,并且連同解鎖腳本一起作為輸入加到交易中俐镐。

交易費用

  1. 大多數(shù)交易包含交易費矫限,這是為了在網(wǎng)絡安全方面給比特幣礦工一種補償。大多數(shù)錢包自動計算并計入交易費。但是叼风,如果你編程構造交易取董,或者使用命令行接口,你必須手動計算并計入這些費用无宿。
  2. 交易費可當作是為了包含(挖礦)一筆交易到下一個區(qū)塊中的一種鼓勵茵汰,也可當作是對于欺詐交易和任何種類的系統(tǒng)濫用,在每一筆交易上通過征收一筆小成本的稅而造成的一種妨礙孽鸡。交易費被挖出這個區(qū)塊的礦工得到蹂午,并且記錄在這個交易的區(qū)塊鏈中。
  3. 交易費不足或者沒有交易費的交易可能會被推遲彬碱,基于盡力而為的原則在幾個區(qū)塊之后被處理豆胸,甚至可能根本不被處理溉卓。交易費不是強制的伏尼,而且沒有交易費的交易也許最終會被處理,但是,包含交易費將提高處理優(yōu)先級故河。
  4. 起初,交易費是網(wǎng)絡中的一個固定常數(shù)。漸漸地宙橱,交易費的結構被放寬了,以便被市場基于網(wǎng)絡容量和交易量而強制影響。目前最小交易費被固定在每千字節(jié)0.0001比特幣帝璧,或者說是每千字節(jié)萬分之一比特幣,最近一次改變是從千分之一比特幣減少到這個數(shù)值的。大多數(shù)交易少于一千字節(jié)襟雷,但是那些包含多個輸入和輸出的交易尺寸可能更大卓缰。在未來的比特幣協(xié)議修訂版中捌显,錢包應用預計會使用統(tǒng)計學分析偿乖,基于最近的幾筆交易的平均費用,來計算最恰當?shù)馁M用并附在交易上竣稽。
  5. 交易的數(shù)據(jù)結構沒有交易費的字段。相反地台丛,交易費通過所有輸入的總和变汪,以及所有輸出的總和之間的差來表示实胸。從所有輸入中扣掉所有輸出之后的多余的量會被礦工收集走鲤拿。
  6. 如果你忘記了在手動構造的交易中增加找零的輸出,系統(tǒng)會把找零當作交易費來處理窒升。舉例來說台谊,如果你消耗了一個20比特幣的UTXO來完成1比特幣的付款,你必須包含一筆19比特幣的找零回到你的錢包玩荠。否則,那剩下的19比特幣會被當作交易費填具,并且會被挖出你的交易到一個區(qū)塊中的礦工收走绰筛。盡管你會受到高優(yōu)先級的處理,并且讓一個礦工喜出望外毛甲,但這很可能不是你想要的一姿。
  7. 高交易費不是因為付的錢很多艾栋,而是因為她的交易很復雜并且尺寸很大携冤,交易費是與參加交易的比特幣值無關的。

交易鏈條和孤立交易

  1. 當一條交易鏈被整個網(wǎng)絡傳送時苞笨,他們并不能總是按照相同的順序到達目的地。有時谚中,子交易在父交易之前到達。在這種情況下,節(jié)點會首先收到一個子交易南誊,而不能找到他參考的父交易橄务。節(jié)點不會立即拋棄這個子交易,而是放到一個臨時池中攒驰,并等著接收它的父交易诬垂,與此同時廣播這個子交易給其他節(jié)點。沒有父交易的交易池被稱作孤立交易池喉磁。
  2. 內(nèi)存中儲存的孤立交易數(shù)量是有限制的,這是為了防止針對比特幣節(jié)點的拒絕服務攻擊(DoS)。這個限制被定義在比特幣涉及到的客戶端的源代碼中的MAX_ORPHAN_TRANSACTIONS妖滔。

比特幣交易腳本和腳本語言

  1. 比特幣客戶端通過執(zhí)行一個用類Forth腳本語言編寫的腳本驗證比特幣交易陨帆。鎖定腳本被寫入UTXO,同時它往往包含一個用同種腳本語言編寫的簽名矢洲。
  2. 當一筆比特幣交易被驗證時袁滥,每一個輸入值中的解鎖腳本被與其對應的鎖定腳本同時(互不干擾地)執(zhí)行,從而查看這筆交易是否滿足使用條件塑荒。
  3. 大多數(shù)經(jīng)比特幣網(wǎng)絡處理的交易是以“Alice付給Bob”的形式存在的。同時拧篮,它們是以一種稱為“P2PKH”(Pay-to-Public-Key-Hash)腳本為基礎的。然而赏参,通過使用腳本來鎖定輸出和解鎖輸入意味著通過使用編程語言,比特幣交易可以包含無限數(shù)量的條件。
  4. 比特幣交易驗證并不基于一個不變的模式疗锐,而是通過運行腳本語言來實現(xiàn)箍铲。這種語言可以表達出多到數(shù)不盡的條件變種关划。這也是比特幣作為一種“可編程的貨幣”所擁有的權力资盅。

腳本創(chuàng)建(鎖定與解鎖)

  1. 比特幣的交易驗證引擎依賴于兩類腳本來驗證比特幣交易:一個鎖定腳本和一個解鎖腳本振峻。
  2. 鎖定腳本是一個放在一個輸出值上的“障礙”荣赶,同時它明確了今后花費這筆輸出的條件。
  3. 解鎖腳本是一個“解決”或滿足被鎖定腳本在一個輸出上設定的花費條件的腳本慢逾,同時它將允許輸出被消費变擒。解鎖腳本是每一筆比特幣交易輸出的一部分策添,而且往往含有一個被用戶的比特幣錢包(通過用戶的私鑰)生成的數(shù)字簽名。由于解鎖腳本常常包含一個數(shù)字簽名傻挂,因此它曾被稱作ScriptSig符相。并非所有解鎖腳本都一定會包含簽名姻僧。
  4. 每一個比特幣客戶端會通過同時執(zhí)行鎖定和解鎖腳本來驗證一筆交易松嘶。對于比特幣交易中的每一個輸入巢音,驗證軟件會先檢索輸入所指向的UTXO似谁。這個UTXO包含一個定義了花費條件的鎖定腳本蛀缝。接下來嗤练,驗證軟件會讀取試圖花費這個UTXO的輸入中所包含的解鎖腳本构哺,并執(zhí)行這兩個腳本曙强。
  5. 首先碟嘴,使用堆棧執(zhí)行引擎執(zhí)行解鎖腳本溪食。如果解鎖腳本在執(zhí)行過程中未報錯(沒有懸空操作符),主堆棧(非其它堆棧)將被復制娜扇,然后腳本將被執(zhí)行错沃。如果采用從解鎖腳本處復制而來的數(shù)據(jù)執(zhí)行鎖定腳本的結果為真,那么解鎖腳本就成功地滿足了鎖定腳本所設置的條件醒叁,因而续捂,該輸入是一個能使用該UTXO的有效授權。如果在執(zhí)行完組合腳本后的結果不是真,那么輸入就不是有效的依鸥,因為它并未能滿足UTXO中所設置的使用該筆資金的條件。

腳本語言

  1. 比特幣交易腳本語言宿崭,也稱為腳本,是一種基于逆波蘭表示法的基于堆棧的執(zhí)行語言。
  2. 比特幣腳本語言被稱為基于棧語言,因為它使用的數(shù)據(jù)結構被稱為棧。
  3. 如果堆棧頂部的結果顯示為真(標記為{0×01})凯力,即為任何非零值或腳本執(zhí)行后堆棧為空情形行瑞,則交易有效。如果堆棧頂部的結果顯示為假(0字節(jié)空值莺奔,標記為{})或腳本執(zhí)行被操作符禁止。

圖靈非完備性

  1. 比特幣腳本語言包含許多操作,但都故意限定為一種重要的方式——沒有循環(huán)或者復雜流控制功能以外的其他條件的流控制。
  2. 這樣就保證了腳本語言的圖靈非完備性,這意味著腳本的復雜性有限甥捺,交易可執(zhí)行的次數(shù)也可預見尿瞭。
  3. 腳本并不是一種通用語言葛超,施加的這些限制確保該語言不被用于創(chuàng)造無限循環(huán)或其它類型的邏輯炸彈,這樣的炸彈可以植入在一筆交易中绪穆,通過引起拒絕服務的方式攻擊比特幣網(wǎng)絡。
  4. 受限制的語言能防止交易激活機制被人當作薄弱環(huán)節(jié)而加以利用够坐。

非主權驗證

  1. 比特幣交易腳本語言是無國家主權的七扰,沒有國家能凌駕于腳本之上道盏,也沒有國家會在腳本被執(zhí)行后對其進行保存。所以需要執(zhí)行腳本的所有信息都已包含在腳本中懊亡。
  2. 如果您的系統(tǒng)對一個腳本進行驗證依啰,可以確信的是每一個比特幣網(wǎng)絡中的其他系統(tǒng)也將對其進行驗證,這意味著一個有效的交易對每個人而言都是有效的店枣,而且每一個人都明白這一點速警。<font color='red'>這種對于結果的可預見性是比特幣系統(tǒng)的一項重要良性特征</font>。

標準交易

五大標準腳本分別為P2PKH鸯两、P2PK闷旧、MS(限15個密鑰)、P2SH和OP_Return

P2PKH(Pay-to-Public-Key-Hash)

  1. 比特幣網(wǎng)絡上的大多數(shù)交易都是P2PKH交易钧唐,此類交易都含有一個鎖定腳本忙灼,該腳本由公鑰哈希實現(xiàn)阻止輸出功能,公鑰哈希即為廣為人知的比特幣地址逾柿。由P2PKH腳本鎖定的輸出可以通過鍵入公鑰和由相應私鑰創(chuàng)設的數(shù)字簽名得以解鎖缀棍。
  2. <Cafe Signature> <Cafe Public Key> OP_DUP OP_HASH160 <Cafe Public Key Hash> OP_EQUAL OP_CHECKSIG

P2PK(Pay-to-Public-Key)

  1. 與P2PKH相比宅此,P2PK模式更為簡單。與P2PKH模式含有公鑰哈希的模式不同爬范,在P2PK腳本模式中父腕,公鑰本身已經(jīng)存儲在鎖定腳本中,而且代碼長度也更短青瀑。
  2. P2PKH是由Satoshi創(chuàng)建的璧亮,主要目的一方面為使比特幣地址更簡短,另一方面也使之更方便使用斥难。P2PK目前在Coinbase交易中最為常見枝嘶,Coinbase交易由老的采礦軟件產(chǎn)生,目前還沒更新至P2PKH哑诊。
  3. <Signature from Private Key A> <Public Key A> OP_CHECKSIG

多重簽名

  1. 多重簽名腳本設置了這樣一個條件群扶,假如記錄在腳本中的公鑰個數(shù)為N,則至少需提供其中的M個公鑰才可以解鎖镀裤。這也被稱為M-N組合竞阐,其中,N是記錄在腳本中的公鑰總個數(shù)暑劝,M是使得多重簽名生效的公鑰數(shù)閥值(最少數(shù)目)
  2. OP_0 <Signature B> <Signature C> 2 <Public Key A> <Public Key B> <Public Key C> 3 OP_CHECKMULTISIG

數(shù)據(jù)輸出(OP_RETURN操作符)

  1. 比特幣的分發(fā)和時間戳賬戶機制(也即區(qū)塊鏈)骆莹,其潛在運用將大大超越支付領域。許多開發(fā)者試圖充分發(fā)揮交易腳本語言的安全性和可恢復性優(yōu)勢將其運用于電子公證服務担猛、證券認證和智能協(xié)議等領域幕垦。
  2. 比特幣腳本語言的早期運用主要包括在區(qū)塊鏈上創(chuàng)造出交易輸出。
  3. 在0.9版的比特幣核心客戶端上傅联,通過采用OP_Return操作符最終實現(xiàn)了妥協(xié)先改。OP_Return允許開發(fā)者在交易輸出上增加40字節(jié)的非交易數(shù)據(jù)。然后蒸走,與偽交易型的UTXO不同盏道,OP_Return創(chuàng)造了一種明確的可復查的非交易型輸出,此類數(shù)據(jù)無需存儲于UTXO集
  4. OP_Return輸出被記錄在區(qū)塊鏈上载碌,它們會消耗磁盤空間,也會導致區(qū)塊鏈規(guī)模的增加衅枫,但它們不存儲在UTXO集中嫁艇,因此也不會使得UTXO內(nèi)存膨脹,更不會以消耗代價高昂的內(nèi)存為代價使全節(jié)點都不堪重負弦撩。
  5. OP_RETURN不涉及可用于支付的解鎖腳本的特點步咪,OP_RETURN不能使用其輸出中所鎖定的資金,因此它也就沒有必要記錄在蘊含潛在成本的UTXO集中益楼,所以OP_RETURN實際是沒有成本的猾漫。OP_RETURN常為一個金額為0的比特幣輸出点晴,因為任何與該輸出相對應的比特幣都會永久消失。
  6. 假如一筆OP_RETURN遇到腳本驗證軟件悯周,它將立即導致驗證腳本和標記交易的行為無效粒督。如果你碰巧將OP_RETURN的輸出作為另一筆交易的輸入,則該交易是無效的禽翼。
  7. 一筆標準交易(通過了isStandard()函數(shù)檢驗的)只能有一個OP_RETURN輸出屠橄。但是單個OP_RETURN輸出能與任意類型的輸出交易進行組合。

P2SH(Pay-to-Script-Hash)

  1. P2SH旨在使復雜腳本的運用能與直接向比特幣地址支付一樣簡單闰挡。在P2SH支付中锐墙,復雜的鎖定腳本被電子指紋所取代,電子指紋為密碼學哈希长酗。當一筆交易試圖支付UTXO時溪北,要解鎖支付腳本,它必須含有與哈希相匹配的腳本夺脾。
  2. P2SH的含義是之拨,向與該哈希匹配的腳本支付,當輸出被支付時劳翰,該腳本將在后續(xù)呈現(xiàn)敦锌。
  3. 在P2SH交易中,鎖定腳本由哈希取代佳簸,哈希指代的是贖回腳本乙墙。因為它在系統(tǒng)中是在贖回時出現(xiàn)而不是以鎖定腳本模式出現(xiàn)。
  4. P2SH的另一重要特征是它能將腳本哈希編譯為一個地址生均。P2SH地址是基于Base58編碼的一個含有20個字節(jié)哈希的腳本听想,就像比特幣地址是基于Base58編碼的一個含有20個字節(jié)的公鑰。由于P2SH地址采用5作為前綴马胧,這導致基于Base58編碼的地址以“3”開頭汉买。
  5. 與直接使用復雜腳本以鎖定輸出的方式相比,P2SH具有以下特點:
    • 在交易輸出中佩脊,復雜腳本由簡短電子指紋取代蛙粘,使得交易代碼變短。
    • 腳本能被編譯為地址威彰,支付指令的發(fā)出者和支付者的比特幣錢包不需要復雜工序就可以執(zhí)行P2SH出牧。
    • P2SH將構建腳本的重擔轉移至接收方,而非發(fā)送方歇盼。
    • P2SH將長腳本數(shù)據(jù)存儲的負擔從輸出方(存儲于UTXO集舔痕,影響內(nèi)存)轉移至輸入方(僅存儲于區(qū)塊鏈)。
    • P2SH將長腳本數(shù)據(jù)存儲的重擔從當前(支付時)轉移至未來(花費時)。
    • P2SH將長腳本的交易費成本從發(fā)送方轉移至接收方伯复,接收方在使用該筆資金時必須含有贖回腳本慨代。
  6. 不能將P2SH植入P2SH贖回腳本,因為P2SH不能自循環(huán)啸如。也不能在贖回腳本中使用OP_RETURN侍匙,因為OP_RETURN的定義即顯示不能贖回。
  7. 因為贖回腳本只有在你試圖發(fā)送一個P2SH輸出時才會在比特幣網(wǎng)絡中出現(xiàn)组底,假如你將輸出與一個無效的交易哈希鎖定丈积,則它將會被忽略。你將不能使用該筆資金债鸡,因為交易中含有贖回腳本江滨,該腳本因是一個無效的腳本而不能被接受。
  8. 這樣的處理機制也衍生出一個風險厌均,你能將比特幣鎖定在一個未來不能被花費的P2SH中唬滑。因為比特幣網(wǎng)絡本身會接受這一P2SH,即便它與無效的贖回腳本所對應(因為該贖回腳本哈希沒有對其所表征的腳本給出指令)

七棺弊、比特幣網(wǎng)絡

節(jié)點類型及分工

  1. 盡管比特幣P2P網(wǎng)絡中的各個節(jié)點相互對等晶密,但是根據(jù)所提供的功能不同,各節(jié)點可能具有不同的分工模她。每個比特幣節(jié)點都是路由稻艰、區(qū)塊鏈數(shù)據(jù)庫、挖礦侈净、錢包服務的功能集合尊勿。
  2. 每個節(jié)點都參與全網(wǎng)絡的路由功能,同時也可能包含其他功能畜侦。每個節(jié)點都參與驗證并傳播交易及區(qū)塊信息元扔,發(fā)現(xiàn)并維持與對等節(jié)點的連接。
  3. 一些節(jié)點保有一份完整的旋膳、最新的區(qū)塊鏈拷貝澎语,這樣的節(jié)點被稱為“全節(jié)點”。全節(jié)點能夠獨立自主地校驗所有交易验懊,而不需借由任何外部參照擅羞。
  4. 一些節(jié)點只保留了區(qū)塊鏈的一部分,它們通過一種名為“簡易支付驗證(SPV)”的方式來完成交易驗證义图。這樣的節(jié)點被稱為“SPV節(jié)點”祟滴,又叫“輕量級節(jié)點”。
  5. 挖礦節(jié)點通過運行在特殊硬件設備上的工作量證明(proof-of-work)算法歌溉,以相互競爭的方式創(chuàng)建新的區(qū)塊。一些挖礦節(jié)點同時也是全節(jié)點,保有區(qū)塊鏈的完整拷貝痛垛;還有一些參與礦池挖礦的節(jié)點是輕量級節(jié)點草慧,它們必須依賴礦池服務器維護的全節(jié)點進行工作。
  6. 用戶錢包也可以作為全節(jié)點的一部分匙头,這在桌面比特幣客戶端中比較常見漫谷。當前,越來越多的用戶錢包都是SPV節(jié)點蹂析,尤其是運行于諸如智能手機等資源受限設備上的比特幣錢包應用舔示;而這正變得越來越普遍。
  7. 在比特幣P2P協(xié)議中电抚,除了這些主要的節(jié)點類型之外惕稻,還有一些服務器及節(jié)點也在運行著其他協(xié)議,例如特殊礦池挖礦協(xié)議蝙叛、輕量級客戶端訪問協(xié)議等俺祠。
  8. 總結:
    • 核心客戶端(bitcoin core):在比特幣p2p網(wǎng)絡中,包含錢包借帘、礦工蜘渣、完整區(qū)塊鏈數(shù)據(jù)庫、網(wǎng)絡路由節(jié)點肺然。
    • 完整區(qū)塊鏈節(jié)點:在p2p網(wǎng)絡中蔫缸,包含完整區(qū)塊鏈以及網(wǎng)絡路由節(jié)點。
    • 獨立礦工:包含具有完整區(qū)塊鏈副本的挖礦功能际起、以及比特幣p2p網(wǎng)絡路由節(jié)點
    • 輕量(SPV)錢包:包含不具有區(qū)塊鏈的錢包以及比特幣p2p網(wǎng)絡路由節(jié)點拾碌。
    • 礦池協(xié)議服務器:將運行其他協(xié)議的節(jié)點(例如礦池挖礦節(jié)點、stratum節(jié)點)連接至p2p網(wǎng)絡的網(wǎng)關路由器
    • 挖礦節(jié)點:包含不具有區(qū)塊鏈加叁、但具備stratum協(xié)議節(jié)點(S)或者礦池挖礦協(xié)議節(jié)點(P)的挖礦功能
    • 輕量(SPV)Stratum錢包:包含不具有區(qū)塊鏈的錢包倦沧、運行stratum協(xié)議的網(wǎng)絡節(jié)點

網(wǎng)絡發(fā)現(xiàn)

  1. 新的網(wǎng)絡節(jié)點必須發(fā)現(xiàn)至少一個網(wǎng)絡中存在的節(jié)點并建立連接。節(jié)點通常采用TCP協(xié)議它匕、使用8333端口(該端口號通常是比特幣所使用的展融,除8333端口外也可以指定使用其他端口)與已知的對等節(jié)點建立連接。
  2. 在建立連接時豫柬,該節(jié)點會通過發(fā)送一條包含基本認證內(nèi)容的version消息開始“握手”通信過程告希,包括以下字段:PROTOCOL_VERSION、nLocalServices(一組該節(jié)點支持的本地服務列表烧给,當前僅支持NODE_NETWORK)燕偶、nTime(當前時間)、addrYou(當前節(jié)點可見的遠程節(jié)點的IP地址)础嫡、addrMe(本地節(jié)點所發(fā)現(xiàn)的本機IP地址)指么、subver(指示當前節(jié)點運行的軟件類型的子版本號,例如:/Satoshi:0.9.2.1/)酝惧、BaseHeight(當前節(jié)點區(qū)塊鏈的區(qū)塊高度)
  3. 雖然比特幣網(wǎng)絡中沒有特殊節(jié)點,但是客戶端會維持一個列表伯诬,那里列出了那些長期穩(wěn)定運行的節(jié)點晚唇。這樣的節(jié)點被稱為“種子節(jié)點(seed nodes)”。新節(jié)點并不一定需要與種子節(jié)點建立連接盗似,但連接到種子節(jié)點的好處是可以通過種子節(jié)點來快速發(fā)現(xiàn)網(wǎng)絡中的其他節(jié)點哩陕。在比特幣核心客戶端中,是否使用種子節(jié)點是通過“-dnsseed”控制的赫舒。默認情況下悍及,該選項設為1,即意味著使用種子節(jié)點接癌。
  4. 另一種方式是心赶,起始時將至少一個比特幣節(jié)點的IP地址提供給正在啟動的節(jié)點(該節(jié)點不包含任何比特幣網(wǎng)絡的組成信息)。在這之后扔涧,啟動節(jié)點可以通過后續(xù)指令建立新的連接园担。用戶可以使用命令行參數(shù)“-seednode”把啟動節(jié)點“引薦”并連接到一個節(jié)點,并將該節(jié)點用作DNS種子枯夜。
  5. 當建立一個或多個連接后弯汰,新節(jié)點將一條包含自身IP地址的addr消息發(fā)送給其相鄰節(jié)點。相鄰節(jié)點再將此條addr消息依次轉發(fā)給它們各自的相鄰節(jié)點湖雹,從而保證新節(jié)點信息被多個節(jié)點所接收咏闪、保證連接更穩(wěn)定。另外摔吏,新接入的節(jié)點可以向它的相鄰節(jié)點發(fā)送getaddr消息鸽嫂,要求它們返回其已知對等節(jié)點的IP地址列表。通過這種方式征讲,節(jié)點可以找到需連接到的對等節(jié)點据某,并向網(wǎng)絡發(fā)布它的消息以便其他節(jié)點查找。
  6. 節(jié)點必須連接到若干不同的對等節(jié)點才能在比特幣網(wǎng)絡中建立通向比特幣網(wǎng)絡的種類各異的路徑(path)
  7. 由于節(jié)點可以隨時加入和離開诗箍,通訊路徑是不可靠的癣籽。因此,節(jié)點必須持續(xù)進行兩項工作
    • 在失去已有連接時發(fā)現(xiàn)新節(jié)點
    • 并在其他節(jié)點啟動時為其提供幫助
  8. 節(jié)點啟動時只需要一個連接滤祖,因為第一個節(jié)點可以將它引薦給它的對等節(jié)點筷狼,而這些節(jié)點又會進一步提供引薦。一個節(jié)點匠童,如果連接到大量的其他對等節(jié)點埂材,這既沒必要,也是對網(wǎng)絡資源的浪費汤求。在啟動完成后俏险,節(jié)點會記住它最近成功連接的對等節(jié)點严拒;因此,當重新啟動后它可以迅速與先前的對等節(jié)點網(wǎng)絡重新建立連接竖独。如果先前的網(wǎng)絡的對等節(jié)點對連接請求無應答糙俗,該節(jié)點可以使用種子節(jié)點進行重啟動。
  9. bitcoin-cli getpeerinfo 列出對等節(jié)點的連接信息
  10. 如果節(jié)點持續(xù)某個連接長達90分鐘沒有任何通信预鬓,它會被認為已經(jīng)從網(wǎng)絡中斷開,網(wǎng)絡將開始查找一個新的對等節(jié)點赊颠。因此格二,比特幣網(wǎng)絡會隨時根據(jù)變化的節(jié)點及網(wǎng)絡問題進行動態(tài)調(diào)整,不需經(jīng)過中心化的控制即可進行規(guī)模增竣蹦、減的有機調(diào)整顶猜。

全節(jié)點

  1. 完整區(qū)塊鏈節(jié)點保有完整的、最新的包含全部交易信息的比特幣區(qū)塊鏈拷貝痘括,這樣的節(jié)點可以獨立地進行建立并校驗區(qū)塊鏈长窄,從第一區(qū)塊(創(chuàng)世區(qū)塊)一直建立到網(wǎng)絡中最新的區(qū)塊。完整區(qū)塊鏈節(jié)點可以獨立自主地校驗任何交易信息纲菌,而不需要借助任何其他節(jié)點或其他信息來源挠日。

交換“庫存清單”

  1. 一個全節(jié)點連接到對等節(jié)點之后,第一件要做的事情就是構建完整的區(qū)塊鏈翰舌。如果該節(jié)點是一個全新節(jié)點嚣潜,那么它就不包含任何區(qū)塊鏈信息,<font color='red'>它只知道一個區(qū)塊——靜態(tài)植入在客戶端軟件中的創(chuàng)世區(qū)塊</font>椅贱。新節(jié)點需要下載從0號區(qū)塊(創(chuàng)世區(qū)塊)開始的數(shù)十萬區(qū)塊的全部內(nèi)容懂算,才能跟網(wǎng)絡同步、并重建全區(qū)塊鏈庇麦。
  2. 通過分攤工作量的方式防止單一對等節(jié)點被批量請求所壓垮计技。該節(jié)點會追蹤記錄其每個對等節(jié)點連接上“正在傳輸”(指那些它已經(jīng)發(fā)出了請求但還沒有接收到)的區(qū)塊數(shù)量,且檢查該數(shù)量有沒有超過上限(MAX_BLOCKS_IN_TRANSIT_PER_PEER)山橄。如果一個節(jié)點需要更新大量區(qū)塊垮媒,它會在上一請求完成后才發(fā)送對新區(qū)塊的請求,從而允許對等節(jié)點控制更新速度驾胆,不至于壓垮網(wǎng)絡涣澡。
  3. 一個節(jié)點上線,會從發(fā)送getblocks消息開始丧诺,收到一個inv響應入桂,接著開始下載缺失的區(qū)塊庫存清單和區(qū)塊廣播協(xié)議。

簡易支付驗證 (SPV)節(jié)點

  1. SPV節(jié)點只需下載區(qū)塊頭驳阎,而不用下載包含在每個區(qū)塊中的交易信息抗愁。由此產(chǎn)生的不含交易信息的區(qū)塊鏈馁蒂,大小只有完整區(qū)塊鏈的1/1000淹办。SPV節(jié)點不能構建所有可用于消費的UTXO的全貌吧凉,這是由于它們并不知道網(wǎng)絡上所有交易的完整信息。
  2. 簡易支付驗證是通過參考交易在區(qū)塊鏈中的深度俱饿,而不是高度撮珠,來驗證它們沮脖。一個擁有完整區(qū)塊鏈的節(jié)點會構造一條驗證鏈,這條鏈是由沿著區(qū)塊鏈按時間倒序一直追溯到創(chuàng)世區(qū)塊的數(shù)千區(qū)塊及交易組成芯急。而一個SPV節(jié)點會驗證所有區(qū)塊的鏈(但不是所有的交易)勺届,并且把區(qū)塊鏈和有關交易鏈接起來。
  3. 一個全節(jié)點要檢查第300,000號區(qū)塊中的某個交易娶耍,它會把從該區(qū)塊開始一直回溯到創(chuàng)世區(qū)塊的300,000個區(qū)塊全部都鏈接起來免姿,并建立一個完整的UTXO數(shù)據(jù)庫,通過確認該UTXO是否還未被支付來證實交易的有效性榕酒。
  4. SPV節(jié)點則不能驗證UTXO是否還未被支付胚膊。相反地,SPV節(jié)點會在該交易信息和它所在區(qū)塊之間用merkle路徑(見“7.7 Merkle 樹”)建立一條鏈接想鹰。然后SPV節(jié)點一直等待紊婉,直到序號從300,001到300,006的六個區(qū)塊堆疊在該交易所在的區(qū)塊之上,并通過確立交易的深度是在第300,006區(qū)塊~第300,001區(qū)塊之下來驗證交易的有效性杖挣。
  5. SPV節(jié)點毫無疑問可以證實某個交易的存在性肩榕,但它不能驗證某個交易(譬如同一個UTXO的雙重支付)不存在,這是因為SPV節(jié)點沒有一份關于所有交易的記錄惩妇。
  6. 完整的區(qū)塊鏈節(jié)點是通過檢查整個鏈中在它之下的數(shù)千個區(qū)塊來保證這個UTXO沒有被支付株汉,從而驗證交易。而SPV節(jié)點是通過檢查在其上面的區(qū)塊將它壓在下面的深度來驗證交易歌殃。
  7. SPV節(jié)點對特定數(shù)據(jù)的請求可能無意中透露了錢包里的地址信息乔妈。例如,監(jiān)控網(wǎng)絡的第三方可以跟蹤某個SPV節(jié)點上的錢包所請求的全部交易信息氓皱,并且利用這些交易信息把比特幣地址和錢包的用戶關聯(lián)起來路召,從而損害了用戶的隱私。

Bloom過濾器

  1. Bloom過濾器是一個允許用戶描述特定的關鍵詞組合而不必精確表述的基于概率的過濾方法波材。它能讓用戶在有效搜索關鍵詞的同時保護他們的隱私股淡。在SPV節(jié)點里,這一方法被用來向?qū)Φ裙?jié)點發(fā)送交易信息查詢請求廷区,同時交易地址不會被暴露唯灵。
  2. Bloom過濾器被用來過濾SPV節(jié)點從對等節(jié)點里收到的交易信息。SPV會建立一個只能和SPV節(jié)點錢包里的地址匹配的過濾器隙轻。隨后埠帕,SPV節(jié)點會向?qū)Φ裙?jié)點發(fā)送一條包含需在該連接中使用的過濾器的filterload消息垢揩。當過濾器建好之后,對等節(jié)點將每個交易的輸出值代入過濾器中驗證敛瓷。那些匹配的交易會被傳送回SPV節(jié)點叁巨。
  3. 為回應來自SPV節(jié)點的getdata信息,對等節(jié)點會發(fā)出一條只含有和過濾器匹配的區(qū)塊的區(qū)塊頭信息呐籽,以及與之相匹配的交易的merkle樹锋勺。這一對等節(jié)點還會發(fā)出一條相匹配的交易的tx消息。

交易池

  1. 比特幣網(wǎng)絡中幾乎每個節(jié)點都會維護一份未確認交易的臨時列表狡蝶,被稱為內(nèi)存池或交易池宙刘。節(jié)點們利用這個池來追蹤記錄那些被網(wǎng)絡所知曉、但還未被區(qū)塊鏈所包含的交易牢酵。保存用戶錢包的節(jié)點會利用這個交易池來記錄那些網(wǎng)絡已經(jīng)接收但還未被確認的、屬于該用戶錢包的預支付信息衙猪。
  2. 有些節(jié)點的實現(xiàn)還維護一個單獨的孤立交易池馍乙。如果一個交易的輸入與某未知的交易有關,如與缺失的父交易相關垫释,該孤立交易就會被暫時儲存在孤立交易池中直到父交易的信息到達丝格。
  3. 當一個交易被添加到交易池中,會同時檢查孤立交易池棵譬,看是否有某個孤立交易引用了此交易的輸出(子交易)显蝌。任何匹配的孤立交易會被進行驗證。如果驗證有效订咸,它們會從孤立交易池中刪除曼尊,并添加到交易池中,使以其父交易開始的鏈變得完整脏嚷。對新加入交易池的交易來說骆撇,它不再是孤立交易。前述過程重復遞歸尋找進一步的后代父叙,直至所有的后代都被找到神郊。通過這一過程,一個父交易的到達把整條鏈中的孤立交易和它們的父級交易重新結合在一起趾唱,從而觸發(fā)了整條獨立交易鏈進行級聯(lián)重構涌乳。
  4. 有些比特幣客戶端的實現(xiàn)還維護一個UTXO數(shù)據(jù)庫,也稱UTXO池甜癞,是區(qū)塊鏈中所有未支付交易輸出的集合夕晓。“UTXO池”的名字聽上去與交易池相似带欢,但它代表了不同的數(shù)據(jù)集运授。UTXO池不同于交易池和孤立交易池的地方在于烤惊,它在初始化時不為空,而是包含了數(shù)以百萬計的未支付交易輸出條目吁朦,有些條目的歷史甚至可以追溯至2009年柒室。UTXO池可能會被安置在本地內(nèi)存,或者作為一個包含索引的數(shù)據(jù)庫表安置在永久性存儲設備中逗宜。
  5. 交易池和孤立交易池代表的是單個節(jié)點的本地視角雄右。取決于節(jié)點的啟動時間或重啟時間,不同節(jié)點的兩池內(nèi)容可能有很大差別纺讲。相反地擂仍,UTXO池代表的是網(wǎng)絡的突顯共識,因此熬甚,不同節(jié)點間UTXO池的內(nèi)容差別不大逢渔。此外,交易池和孤立交易池只包含未確認交易乡括,而UTXO池之只包含已確認交易肃廓。

警告消息

  1. 警告消息是比特幣的“緊急廣播系統(tǒng)”,比特幣核心開發(fā)人員可以借此功能給所有比特幣節(jié)點發(fā)送緊急文本消息诲泌。這一功能是為了讓核心開發(fā)團隊將比特幣網(wǎng)絡的嚴重問題通知所有的比特幣用戶盲赊,例如一個需要用戶采取措施的的嚴重bug。警告系統(tǒng)迄今為止只被用過幾次敷扫,最嚴重的一次是在2013年哀蘑,一個關鍵的數(shù)據(jù)庫缺陷導致比特幣區(qū)塊鏈中出現(xiàn)了一個多區(qū)塊分叉。
  2. 警告通過公鑰進行加密簽名葵第。對應的私鑰是由核心開發(fā)團隊的一些特定成員所持有绘迁。這樣的數(shù)字簽名可以確保虛假警告不會在網(wǎng)絡中傳播。
  3. 收到警告消息的節(jié)點會驗證該消息卒密,檢查是否過期脊髓,并傳播給其所有對等節(jié)點,從而保證了整個網(wǎng)絡中的快速傳播栅受。

八将硝、區(qū)塊鏈

簡介

  1. 比特幣核心客戶端使用Google的LevelDB數(shù)據(jù)庫存儲區(qū)塊鏈元數(shù)據(jù)。區(qū)塊被從后向前有序地鏈接在這個鏈條里屏镊,每個區(qū)塊都指向前一個區(qū)塊依疼。區(qū)塊鏈經(jīng)常被視為一個垂直的棧,第一個區(qū)塊作為棧底的首區(qū)塊而芥,隨后每個區(qū)塊都被放置在其他區(qū)塊之上律罢。
  2. “高度”表示區(qū)塊與首區(qū)塊之間的距離;“頂部”或“頂端”表示最新添加的區(qū)塊。
  3. 對每個區(qū)塊頭進行SHA256加密哈希误辑,可生成一個哈希值沧踏。通過這個哈希值,可以識別出區(qū)塊鏈中的對應區(qū)塊巾钉。同時翘狱,每一個區(qū)塊都可以通過其區(qū)塊頭的“父區(qū)塊哈希值”字段引用前一區(qū)塊(父區(qū)塊)
  4. 雖然每個區(qū)塊只有一個父區(qū)塊,但可以暫時擁有多個子區(qū)塊砰苍。每個子區(qū)塊都將同一區(qū)塊作為其父區(qū)塊潦匈,并且在“父區(qū)塊哈希值”字段中具有相同的(父區(qū)塊)哈希值。一個區(qū)塊出現(xiàn)多個子區(qū)塊的情況被稱為“區(qū)塊鏈分叉”赚导。區(qū)塊鏈分叉只是暫時狀態(tài)茬缩,只有當多個不同區(qū)塊幾乎同時被不同的礦工發(fā)現(xiàn)時才會發(fā)生。
  5. 盡管一個區(qū)塊可能會有不止一個子區(qū)塊吼旧,但每一區(qū)塊只有一個父區(qū)塊凰锡,這是因為一個區(qū)塊只有一個“父區(qū)塊哈希值”字段可以指向它的唯一父區(qū)塊。一個長區(qū)塊鏈的存在可以讓區(qū)塊鏈的歷史不可改變圈暗,這也是比特幣安全性的一個關鍵特征寡夹。
  6. 區(qū)塊結構:
    • 區(qū)塊大小 4字節(jié) 用字節(jié)表示的該字段之后的區(qū)塊大小
    • 區(qū)塊頭 80字節(jié) 組成區(qū)塊頭的幾個字段
    • 交易計數(shù)器 1-9(可變整數(shù))字節(jié) 交易的數(shù)量
    • 交易 可變的 記錄在區(qū)塊里的交易信息

區(qū)塊頭

  1. 區(qū)塊頭由三組區(qū)塊元數(shù)據(jù)組成:
    • 首先是一組引用父區(qū)塊哈希值的數(shù)據(jù),這組元數(shù)據(jù)用于將該區(qū)塊與區(qū)塊鏈中前一區(qū)塊相連接
    • 第二組元數(shù)據(jù)厂置,即難度、時間戳和nonce魂角,與挖礦競爭相關
    • 第三組元數(shù)據(jù)是merkle樹根昵济,一種用來有效地總結區(qū)塊中所有交易的數(shù)據(jù)結構
  2. 區(qū)塊標識符:區(qū)塊頭哈希值和區(qū)塊高度。區(qū)塊主標識符是它的加密哈希值野揪,一個通過SHA256算法對區(qū)塊頭進行二次哈希計算而得到的數(shù)字指紋访忿。產(chǎn)生的32字節(jié)哈希值被稱為區(qū)塊哈希值,但是更準確的名稱是:區(qū)塊頭哈希值斯稳,因為只有區(qū)塊頭被用于計算海铆。
  3. 區(qū)塊哈希值實際上并不包含在區(qū)塊的數(shù)據(jù)結構里,不管是該區(qū)塊在網(wǎng)絡上傳輸時挣惰,抑或是它作為區(qū)塊鏈的一部分被存儲在某節(jié)點的永久性存儲設備上時卧斟。相反,區(qū)塊哈希值是當該區(qū)塊從網(wǎng)絡被接收時由每個節(jié)點計算出來的憎茂。區(qū)塊的哈希值可能會作為區(qū)塊元數(shù)據(jù)的一部分被存儲在一個獨立的數(shù)據(jù)庫表中珍语,以便于索引和更快地從磁盤檢索區(qū)塊。
  4. 第二種識別區(qū)塊的方式是通過該區(qū)塊在區(qū)塊鏈中的位置竖幔,即“區(qū)塊高度(block height)”板乙。第一個區(qū)塊,其區(qū)塊高度為0拳氢,和之前哈希值000000000019d6689c085ae165831e934ff763ae46a2a6c172b3f1b60a8ce26f所引用的區(qū)塊為同一個區(qū)塊募逞。
  5. 一個區(qū)塊的區(qū)塊哈希值總是能唯一地識別出一個特定區(qū)塊蛋铆。一個區(qū)塊也總是有特定的區(qū)塊高度。但是放接,一個特定的區(qū)塊高度并不一定總是能唯一地識別出一個特定區(qū)塊刺啦。更確切地說,兩個或者更多數(shù)量的區(qū)塊也許會為了區(qū)塊鏈中的一個位置而競爭透乾。

區(qū)塊

  1. 因為創(chuàng)世區(qū)塊被編入到比特幣客戶端軟件里洪燥,所以每一個節(jié)點都始于至少包含一個區(qū)塊的區(qū)塊鏈,這能確保創(chuàng)世區(qū)塊不會被改變乳乌。每一個節(jié)點都“知道”創(chuàng)世區(qū)塊的哈希值捧韵、結構、被創(chuàng)建的時間和里面的一個交易汉操。因此再来,每個節(jié)點都把該區(qū)塊作為區(qū)塊鏈的首區(qū)塊,從而構建了一個安全的磷瘤、可信的區(qū)塊鏈的根芒篷。

Merkle 樹

  1. 在比特幣網(wǎng)絡中,Merkle樹被用來歸納一個區(qū)塊中的所有交易采缚,同時生成整個交易集合的數(shù)字指紋针炉,且提供了一種校驗區(qū)塊是否存在某交易的高效途徑。
  2. 生成一棵完整的Merkle樹需要遞歸地對哈希節(jié)點對進行哈希扳抽,并將新生成的哈希節(jié)點插入到Merkle樹中篡帕,直到只剩一個哈希節(jié)點,該節(jié)點就是Merkle樹的根贸呢。
  3. 因為Merkle樹是二叉樹镰烧,所以它需要偶數(shù)個葉子節(jié)點。如果僅有奇數(shù)個交易需要歸納楞陷,那最后的交易就會被復制一份以構成偶數(shù)個葉子節(jié)點怔鳖,這種偶數(shù)個葉子節(jié)點的樹也被稱為平衡樹。

挖礦與共識

  1. 挖礦是一種將結算所去中心化的過程固蛾,每個結算所對處理的交易進行驗證和結算结执。挖礦保護了比特幣系統(tǒng)的安全,并且實現(xiàn)了在沒有中心機構的情況下艾凯,也能使整個比特幣網(wǎng)絡達成共識昌犹。
  2. 比特幣以一個確定的但不斷減慢的速率被鑄造出來。大約每十分鐘產(chǎn)生一個新區(qū)塊览芳,每一個新區(qū)塊都伴隨著一定數(shù)量從無到有的全新比特幣斜姥。
  3. 總量有限并且發(fā)行速度遞減創(chuàng)造了一種抗通脹的貨幣供應模式。法幣可被中央銀行無限制地印刷出來,而比特幣永遠不會因超額印發(fā)而出現(xiàn)通脹铸敏。
  4. 最重要并且最有爭議的一個結論是一種事先確定的發(fā)行速率遞減的貨幣發(fā)行模式會導致貨幣通貨緊縮(簡稱通縮)缚忧。通縮是一種由于貨幣的供應和需求不匹配導致的貨幣增值的現(xiàn)象。它與通脹相反杈笔,價格通縮意味著貨幣隨著時間有越來越強的購買力闪水。

去中心化共識

  1. 共識是數(shù)以千計的獨立節(jié)點遵守了簡單的規(guī)則通過異步交互自發(fā)形成的產(chǎn)物。所有的比特幣屬性蒙具,包括貨幣球榆、交易、支付以及不依靠中心機構和信任的安全模型等都是這個機制的衍生物禁筏。比特幣的去中心化共識由所有網(wǎng)絡節(jié)點的4種獨立過程相互作用而產(chǎn)生:
    • 每個全節(jié)點依據(jù)綜合標準對每個交易進行獨立驗證
    • 通過完成工作量證明算法的驗算持钉,挖礦節(jié)點將交易記錄獨立打包進新區(qū)塊
    • 每個節(jié)點獨立的對新區(qū)塊進行校驗并組裝進區(qū)塊鏈
    • 每個節(jié)點對區(qū)塊鏈進行獨立選擇,在工作量證明機制下<font color='red'>選擇累計工作量最大的區(qū)塊鏈</font>
  2. 交易的優(yōu)先級是由交易輸入所花費的UTXO的“塊齡”決定篱昔,交易輸入值高每强、“塊齡”大的交易比那些新的、輸入值小的交易擁有更高的優(yōu)先級州刽。如果區(qū)塊中有足夠的空間空执,高優(yōu)先級的交易行為將不需要礦工費。
  3. 交易輸入的值是由比特幣單位“聰”(1億分之1個比特幣)來表示的穗椅。UTXO的“塊齡”是自該UTXO被記錄到區(qū)塊鏈為止所經(jīng)歷過的區(qū)塊數(shù)辨绊,即這個UTXO在區(qū)塊鏈中的深度。
  4. 一個交易想要成為“較高優(yōu)先級”匹表,需滿足的條件:優(yōu)先值大于57,600,000门坷,相當于一個比特幣(即1億聰),年齡為一天(144個區(qū)塊)桑孩,交易的大小為250個字節(jié)。
  5. “挖礦節(jié)點在填充這50K字節(jié)的時候框冀,會優(yōu)先考慮這些最高優(yōu)先級的交易流椒,不管它們是否包含了礦工費。這種機制使得高優(yōu)先級交易即便是零礦工費明也,也可以優(yōu)先被處理宣虾。然后,挖礦節(jié)點會選出那些包含最小礦工費的交易温数,并按照“每千字節(jié)礦工費”進行排序绣硝,優(yōu)先選擇礦工費高的交易來填充剩下的區(qū)塊,區(qū)塊大小上限為MAX_BLOCK_SIZE撑刺。
  6. 比特幣交易中沒有過期鹉胖、超時的概念,一筆交易現(xiàn)在有效,那么它就永遠有效甫菠。然而挠铲,如果一筆交易只在全網(wǎng)廣播了一次,那么它只會保存在一個挖礦節(jié)點的內(nèi)存中寂诱。因為內(nèi)存池是以未持久化的方式保存在挖礦節(jié)點存儲器中的拂苹,所以一旦這個節(jié)點重新啟動,內(nèi)存池中的數(shù)據(jù)就會被完全擦除痰洒。而且瓢棒,即便一筆有效交易被傳播到了全網(wǎng),如果它長時間未處理丘喻,它將從挖礦節(jié)點的內(nèi)存池中消失脯宿。如果交易本應該在一段時間內(nèi)被處理而實際沒有,那么錢包軟件應該重新發(fā)送交易或重新支付更高的礦工費仓犬。
  7. 節(jié)點需要填充難度目標值嗅绰,為了使得該區(qū)塊有效,這個字段定義了所需滿足的工作量證明的難度搀继。難度在區(qū)塊中以“尾數(shù)-指數(shù)”的格式窘面,編碼并存儲,這種格式稱作“難度位”叽躯。這種編碼的首字節(jié)表示指數(shù)财边,后面的3字節(jié)表示尾數(shù)(系數(shù))。以區(qū)塊277316為例点骑,難度位的值為0x1903a30c酣难,0x19是指數(shù)的十六進制格式,后半部0x03a30c是系數(shù)黑滴。
  8. 挖礦的目標是找到一個使區(qū)塊頭哈希值小于難度目標的nonce憨募。挖礦節(jié)點通常需要嘗試數(shù)十億甚至數(shù)萬億個不同的nonce取值,直到找到一個滿足條件的nonce值袁辈。
  9. 難度的調(diào)整是在每個完整節(jié)點中獨立自動發(fā)生的菜谣。每2016個區(qū)塊中的所有節(jié)點都會調(diào)整難度。難度的調(diào)整公式是由最新2,016個區(qū)塊的花費時長與20160分鐘(兩周晚缩,即這些區(qū)塊以10分鐘一個速率所期望花費的時長)比較得出的尾膊。難度是根據(jù)實際時長與期望時長的比值進行相應調(diào)整的(或變難或變易)。簡單來說荞彼,如果網(wǎng)絡發(fā)現(xiàn)區(qū)塊產(chǎn)生速率比10分鐘要快時會增加難度冈敛。如果發(fā)現(xiàn)比10分鐘慢時則降低難度。
  10. 為了防止難度的變化過快鸣皂,每個周期的調(diào)整幅度必須小于一個因子(值為4)抓谴。如果要調(diào)整的幅度大于4倍暮蹂,則按4倍調(diào)整。由于在下一個2,016區(qū)塊的周期不平衡的情況會繼續(xù)存在齐邦,所以進一步的難度調(diào)整會在下一周期進行椎侠。因此平衡哈希計算能力和難度的巨大差異有可能需要花費幾個2,016區(qū)塊周期才會完成。

區(qū)塊鏈的組裝與選擇

  1. 節(jié)點維護三種區(qū)塊:第一種是連接到主鏈上的措拇,第二種是從主鏈上產(chǎn)生分支的(備用鏈)我纪,最后一種是在已知鏈中沒有找到已知父區(qū)塊的。在驗證過程中丐吓,一旦發(fā)現(xiàn)有不符合標準的地方浅悉,驗證就會失敗,這樣區(qū)塊會被節(jié)點拒絕券犁,所以也不會加入到任何一條鏈中术健。
  2. 任何時候,主鏈都是累計了最多難度的區(qū)塊鏈粘衬。在一般情況下荞估,主鏈也是包含最多區(qū)塊的那個鏈,除非有兩個等長的鏈并且其中一個有更多的工作量證稚新。主鏈也會有一些分支勘伺,這些分支中的區(qū)塊與主鏈上的區(qū)塊互為“兄弟”區(qū)塊。這些區(qū)塊是有效的褂删,但不是主鏈的一部分飞醉。 保留這些分支的目的是如果在未來的某個時刻它們中的一個延長了并在難度值上超過了主鏈,那么后續(xù)的區(qū)塊就會引用它們屯阀。

區(qū)塊鏈分叉

  1. 每一個節(jié)點總是選擇并嘗試延長代表累計了最大工作量證明的區(qū)塊鏈缅帘,也就是最長的或最大累計難度的鏈。節(jié)點通過將記錄在每個區(qū)塊中的難度加總起來难衰,得到建立這個鏈所要付出的工作量證明的總量钦无。只要所有的節(jié)點選擇最長累計難度的區(qū)塊鏈,整個比特幣網(wǎng)絡最終會收斂到一致的狀態(tài)盖袭。分叉即在不同區(qū)塊鏈間發(fā)生的臨時差異失暂,當更多的區(qū)塊添加到了某個分叉中,這個問題便會迎刃而解苍凛。
  2. 兩個區(qū)塊的分叉是有可能的趣席,這種情況發(fā)生在因先前分叉而相互對立起來的礦工兵志,又幾乎同時發(fā)現(xiàn)了兩個不同區(qū)塊的解醇蝴。然而,這種情況發(fā)生的幾率是很低的想罕。單區(qū)塊分叉每周都會發(fā)生悠栓,而雙塊分叉則非常罕見霉涨。

礦池

  1. 礦池通過專用挖礦協(xié)議協(xié)調(diào)成百上千的礦工。個人礦工在建立礦池賬號后惭适,設置他們的礦機連接到礦池服務器笙瑟。他們的挖礦設備在挖礦時保持和礦池服務器的連接,和其他礦工同步各自的工作癞志。這樣往枷,礦池中的礦工分享挖礦任務,之后分享獎勵料身。
  2. 成功出塊的獎勵支付到礦池的比特幣地址锅棕,而不是單個礦工的赊瞬。一旦獎勵達到一個特定的閾值,礦池服務器便會定期支付獎勵到礦工的比特幣地址屯碴。通常情況下,礦池服務器會為提供礦池服務收取一個百分比的費用膊存。
  3. 大部分礦池是“托管的”导而,意思是有一個公司或者個人經(jīng)營一個礦池服務器。礦池服務器的所有者叫礦池管理員隔崎,同時他從礦工的收入中收取一個百分比的費用今艺。
  4. 托管礦池存在管理人作弊的可能,管理人可以利用礦池進行雙重支付或使區(qū)塊無效仍稀。此外洼滚,中心化的礦池服務器代表著單點故障。如果因為拒絕服務攻擊服務器掛了或者被減慢技潘,池中礦工就不能采礦遥巴。
  5. P2Pool通過將礦池服務器的功能去中心化,實現(xiàn)一個并行的類似區(qū)塊鏈的系統(tǒng)享幽,名叫份額鏈铲掐。P2Pool采礦方式比在礦池中采礦要復雜的多,因為它要求礦工運行空間值桩、內(nèi)存摆霉、帶寬充足的專用計算機來支持一個比特幣的完整節(jié)點和P2Pool節(jié)點軟件。P2Pool礦工連接他們的采礦硬件到本地P2Pool節(jié)點奔坟,它通過發(fā)送區(qū)塊模板到礦機來模擬一個礦池服務器的功能携栋。
  6. 最近,在集中式礦池已經(jīng)接近產(chǎn)生51%攻擊的擔憂下咳秉,P2Pool的份額增長顯著婉支。

共識攻擊

  1. 比特幣的共識機制指的是,被礦工(或礦池)試圖使用自己的算力實行欺騙或破壞的難度很大澜建,至少理論上是這樣向挖。就像我們前面講的蝌以,比特幣的共識機制依賴于這樣一個前提,那就是絕大多數(shù)的礦工何之,出于自己利益最大化的考慮跟畅,都會通過誠實地挖礦來維持整個比特幣系統(tǒng)。然而溶推,當一個或者一群擁有了整個系統(tǒng)中大量算力的礦工出現(xiàn)之后徊件,他們就可以通過攻擊比特幣的共識機制來達到破壞比特幣網(wǎng)絡的安全性和可靠性的目的。
  2. 共識攻擊只能影響整個區(qū)塊鏈未來的共識蒜危,或者說庇忌,最多能影響不久的過去幾個區(qū)塊的共識(最多影響過去10個塊)。而且隨著時間的推移舰褪,整個比特幣塊鏈被篡改的可能性越來越低皆疹。
  3. 共識攻擊也不會影響用戶的私鑰以及加密算法(ECDSA)。共識攻擊也不能從其他的錢包那里偷到比特幣占拍、不簽名地支付比特幣略就、重新分配比特幣、改變過去的交易或者改變比特幣持有紀錄晃酒。共識攻擊能夠造成的唯一影響是影響最近的區(qū)塊(最多10個)并且通過拒絕服務來影響未來區(qū)塊的生成表牢。
  4. 共識攻擊的一個典型場景就是“51%攻擊”。
  5. 雙重支付可以有兩種方式:要么是在交易被確認之前贝次,要么攻擊者通過塊鏈分叉來完成崔兴。進行51%攻擊的人,可以取消在舊分叉上的交易記錄蛔翅,然后在新分叉上重新生成一個同樣金額的交易敲茄,從而實現(xiàn)雙重支付。
  6. 為了避免這類攻擊山析,售賣大宗商品的商家應該在交易得到全網(wǎng)的6個確認之后再交付商品堰燎。或者笋轨,商家應該使用第三方的多方簽名的賬戶進行交易秆剪,并且也要等到交易賬戶獲得全網(wǎng)多個確認之后再交付商品。一條交易的確認數(shù)越多爵政,越難被攻擊者通過51%攻擊篡改仅讽。
  7. 共識攻擊中除了“雙重支付”攻擊,還有一種攻擊場景就是拒絕對某個特定的比特幣地址提供服務钾挟。一個擁有了系統(tǒng)中絕大多數(shù)算力的攻擊者洁灵,可以輕易地忽略某一筆特定的交易。如果這筆交易存在于另一個礦工所產(chǎn)生的區(qū)塊中等龙,該攻擊者可以故意分叉处渣,然后重新產(chǎn)生這個區(qū)塊,并且把想忽略的交易從這個區(qū)塊中移除蛛砰。這種攻擊造成的結果就是罐栈,只要這名攻擊者擁有系統(tǒng)中的絕大多數(shù)算力,那么他就可以持續(xù)地干預某一個或某一批特定錢包地址產(chǎn)生的所有交易泥畅,從而達到拒絕為這些地址服務的目的荠诬。
  8. 一些安全研究組織利用統(tǒng)計模型得出的結論是,算力達到全網(wǎng)的30%就足以發(fā)動51%攻擊了位仁。

九柑贞、競爭幣、競爭塊鏈

  1. 比特幣的核心:一種基于工作量證明的去中心化的一致性機制聂抢。
  2. 競爭塊鏈通過實現(xiàn)一致性和分布式賬簿機制來給諸如合同钧嘶、名字注冊和其他一些應用提供服務。競爭塊鏈使用的是和比特幣一樣的創(chuàng)建塊的機制琳疏,有時也會采用貨幣或代幣的支付機制有决,但它們的主要目的不是為了維持一個貨幣系統(tǒng)。

元幣平臺

  1. 元幣和元塊鏈是在比特幣之上實現(xiàn)的軟件層空盼,也可以認為是覆蓋在比特幣系統(tǒng)之上的平臺/協(xié)議书幕,或者是在一個幣中幣的實現(xiàn)。元幣的第一個實現(xiàn)利用了大量的 hack 技巧把元數(shù)據(jù)添加到比特幣塊鏈中揽趾,比如使用比特幣地址編碼數(shù)據(jù)台汇,或者利用空白的交易字段存放新協(xié)議層增加的這些元數(shù)據(jù)。
  2. 染色幣:一種在少量比特幣上存儲信息的一種元協(xié)議篱瞎。一個“被染色的”幣苟呐,是一定數(shù)額的重新用于表達另一種資產(chǎn)的比特幣。
  3. 染色幣由特殊的錢包管理俐筋,這類錢包存儲和解析依附在染色幣上的元信息掠抬。用戶在使用這類錢包的時候,可以通過增加有著某種特殊含義的標簽的方式校哎,將一般的比特幣“染色”為染色幣這種標簽的內(nèi)容可以表示股票證明两波、優(yōu)惠券信息、實際財產(chǎn)闷哆、商品或者可收集的代幣等等腰奋。如何書寫和解讀這類標簽,完全取決于給這枚比特幣“染色”的人抱怔,他可以決定附著在這部分比特幣上的元信息屬性劣坊。比如信息類型、能不能再分割屈留、某種符號或描述局冰,或者其他的相關信息测蘑。這部分比特幣一旦被染色,這些幣可以用來交易康二、分割碳胳、合并和獲取利息等。被染色的比特幣也可用通過刪除附著信息的方式沫勿,也能將“被染色的”比特幣恢復為普通比特幣挨约。
  4. 萬事達幣是另一個建立在比特幣之上的協(xié)議,該協(xié)議支持多個平臺對比特幣系統(tǒng)的擴展产雹。
  5. 合約幣是另一個建立在比特幣系統(tǒng)之上的協(xié)議層诫惭。合約幣擁有用戶貨幣、可交易代幣蔓挖、金融手段夕土、去中心化財產(chǎn)交易和其他一些功能。合約幣利用比特幣腳本語言中的OP_RETURE操作符記錄元信息來增加比特幣交易的額外信息瘟判。合約幣使用名為XCP的代幣維持整個系統(tǒng)的運行隘弊。
  6. 絕大多數(shù)的山寨幣都來自比特幣源代碼的克隆,少數(shù)則沒有使用比特幣的任何源碼荒适,僅僅是借鑒了塊鏈的模型后自己實現(xiàn)梨熙。競爭幣或競爭塊鏈(下一節(jié)會講到)都是運行在自己塊鏈上的獨立的塊鏈實現(xiàn)。之所以以命名區(qū)分刀诬,主要是因為競爭幣主要用做貨幣咽扇,而競爭塊鏈則不是。
  7. 萊特幣
    • 萊特幣使用了其他工作量證明算法(scrypt)的加密貨幣陕壹,這種算法起初是為了防止密碼遭暴力破解而設計的质欲,目標是通過使用這種消耗內(nèi)存的算法來實現(xiàn)一種不依賴GPU和ASIC芯片的電子貨幣。
    • 把新塊產(chǎn)生的時間從比特幣的10分鐘縮短為2分半鐘糠馆。
    • 如果把比特幣看作電子貨幣中的金幣的話嘶伟,那么萊特幣的愿景就是當電子貨幣系統(tǒng)中的銀幣,謀求成為比特幣的一種輕量的替代貨幣又碌。
    • 考慮到萊特幣8,400萬的貨幣總量和相對更快的確認速度九昧,很多萊特幣的擁躉相信與比特幣相比,萊特幣更適合零售業(yè)的交易
  8. 競爭幣區(qū)別于比特幣的三點主要不同:
    • 貨幣策略不同
    • 基于工作量證明的一致性機制不同
    • 一些特殊的功能毕匀,比如更強的匿名性等等
  9. 評估競爭幣的價值
    • 這款競爭幣有沒有引入重大的創(chuàng)新铸鹰?
    • 如果有,那么這項創(chuàng)新是不是足夠吸引使用比特幣的用戶轉移過來皂岔?
    • 這款競爭幣是不是致力于某一細分領域或應用蹋笼?
    • 這款競爭幣可以吸引到足夠多的礦工來抵御一致性攻擊嗎?
    • 這款競爭幣的市場總值是多少?
    • 整個系統(tǒng)的用戶/錢包規(guī)模大概是多少剖毯?
    • 接受其支付的商家有多少圾笨?
    • 整個系統(tǒng)每日的交易數(shù)是多少?
    • 交易總量是多少逊谋?
  10. <font color='red'>比特幣的工作量證明機制只有一個目的:維護比特幣系統(tǒng)的安全擂达。</font>跟維護一個傳統(tǒng)貨幣系統(tǒng)比起來,挖礦的成本并不高涣狗。然而,某些批評者認為挖礦這一行為是一種浪費舒憾。

非貨幣性競爭區(qū)塊鏈

  1. 域名幣是比特幣源代碼的首個克隆產(chǎn)物镀钓,它是一種使用區(qū)塊鏈的去中心化平臺,用來注冊和轉讓鍵-值對镀迂。域名幣支持全球的域-名注冊丁溅,類似因特網(wǎng)上的域-名注冊系統(tǒng)。目前域名幣作為根域名.bit的替代性域名服務(DNS)使用探遵。也可以用來注冊其他命名空間下的名稱和鍵-值對窟赏,例如存儲郵件地址、密鑰箱季、SSL證書涯穷、文件簽名、投票系統(tǒng)和股票憑證之類藏雏,以及許多其他應用拷况。
  2. Bitmessage是一個實現(xiàn)了去中心化安全消息服務的比特幣競爭幣區(qū)塊鏈,其本質(zhì)上是一個無服務器的加密電子郵件系統(tǒng)掘殴。Bitmessage可以讓用戶通過一個Bitmessage地址來編寫和發(fā)送消息赚瘦。這些消息的運作方式與比特幣交易大致相同,但區(qū)別在于消息是短暫瞬態(tài)的——如果超過兩天還沒被傳送至目的節(jié)點奏寨,消息將會丟失起意。發(fā)送方和接收方都是假名,除了一個bitmessage地址外病瞳,他們沒有其他的身份標識揽咕。
  3. 以太坊
    • 以太坊是一種圖靈完備的平臺,基于區(qū)塊鏈賬簿套菜,用于合約的處理和執(zhí)行心褐。它不是比特幣的一個克隆,而是完完全全獨立的一種設計和實現(xiàn)笼踩。
    • 以太坊內(nèi)置一種叫做ether的貨幣逗爹,該貨幣是付合約執(zhí)行之費用所必須的。以太坊區(qū)塊鏈記錄的東西叫做合約,所謂合約掘而,就是一種低級二進制碼挟冠,也是一種圖靈完備語言。本質(zhì)上袍睡,合約其實是運行在以太坊系統(tǒng)中各個節(jié)點上的程序知染。
    • 這些程序可以存儲數(shù)據(jù)、支付及收取斑胜、存儲ether以及執(zhí)行無窮范圍(因此才叫圖靈完備)的計算行為控淡,在系統(tǒng)中充當去中心化的自治軟件代理。

十止潘、比特幣安全

安全準則

  1. 核心準則是去中心化掺炭,這一點對安全性具有重要意義。網(wǎng)絡的安全性是基于工作量證明而非訪問控制凭戴,比特幣網(wǎng)絡可以對所有人開放涧狮,也無需對比特幣流量進行加密。
  2. 一筆比特幣交易只授權向指定接收方發(fā)送一個指定數(shù)額么夫,并且不能被修改或偽造者冤。它不會透露任何個人信息,例如當事人的身份档痪,也不能用于權限外的支付涉枫。因此,比特幣的支付網(wǎng)絡并不需要加密或防竊聽保護腐螟。
  3. 比特幣的去中心化安全模型很大程度上將權力移交到用戶手上拜银,隨之而來的是用戶們保管好密鑰的責任。
  4. 在比特幣里遭垛,共識系統(tǒng)創(chuàng)建了一個可信的完全去中心化的公開賬本尼桶,一個正確驗證過的區(qū)塊使用創(chuàng)世塊作為信任的根源,建立一條直至當前區(qū)塊的可信任鏈锯仪。比特幣系統(tǒng)可以并應該使用區(qū)塊鏈作為它們的信任根源泵督。在設計一個多系統(tǒng)服務機制的比特幣應用時,你應該仔細確認安全體系庶喜,以確保對它的信任能有據(jù)可依小腊。最終,唯一可確信無疑的是一條完全有效的區(qū)塊鏈久窟。如果你的應用程序或明或暗地信賴于區(qū)塊鏈以外的東西秩冈,就該引起重視,因為它可能會引入漏洞斥扛。一個不錯的方法評估你應用程序的安全體系:單獨考量每個組件入问,設想該組件被完全攻破并被壞人掌控的場景。依次取出應用程序的每個組件,并評估它被攻破時對整體安全的影響芬失。如果你的應用程序的安全性在該組件淪陷后大打折扣楣黍,那就說明你已經(jīng)對這些組件過度信任了。
  5. 一個沒有漏洞的比特幣應用程序應該只受限于比特幣的共識機制棱烂,這意味著其安全體系的信任源于比特幣最堅固的部分租漂。

用戶最佳安全實踐

  1. 比特幣物理存儲
  2. 硬件錢包:只提供了有限的接口,從而可以給非專業(yè)用戶提供近乎萬無一失的安全等級
  3. 平衡風險:為了防止被盜竊颊糜,其主人曾之前采取了一系列復雜的操作去加密備份哩治。結果他們不慎丟失了加密的密鑰,使得備份變得毫無價值衬鱼,白白失去了一大筆財富业筏。
  4. 分散風險:將風險分散到不同類型的比特幣錢包。審慎的用戶應該只留一小部分(或許低于5%)的比特幣在一個在線的或手機錢包馁启,就像零用錢一樣驾孔,其余的部分應該采用不同存儲機制分散開來芍秆,諸如電腦錢包和離線(冷存儲)錢包惯疙。
  5. 多重簽名管理: 多重簽名比特幣地址需要多個簽名才能支付,從而保證資金的安全
  6. 存活能力:一個非常重要卻又常常被忽視的安全性考慮是可用性妖啥,尤其是在密鑰持有者喪失工作能力或死亡的情況下霉颠。
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市荆虱,隨后出現(xiàn)的幾起案子蒿偎,更是在濱河造成了極大的恐慌,老刑警劉巖怀读,帶你破解...
    沈念sama閱讀 206,126評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件诉位,死亡現(xiàn)場離奇詭異,居然都是意外死亡菜枷,警方通過查閱死者的電腦和手機苍糠,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,254評論 2 382
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來啤誊,“玉大人岳瞭,你說我怎么就攤上這事∥们拢” “怎么了瞳筏?”我有些...
    開封第一講書人閱讀 152,445評論 0 341
  • 文/不壞的土叔 我叫張陵,是天一觀的道長牡昆。 經(jīng)常有香客問我姚炕,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,185評論 1 278
  • 正文 為了忘掉前任钻心,我火速辦了婚禮凄硼,結果婚禮上,老公的妹妹穿的比我還像新娘捷沸。我一直安慰自己摊沉,他們只是感情好,可當我...
    茶點故事閱讀 64,178評論 5 371
  • 文/花漫 我一把揭開白布痒给。 她就那樣靜靜地躺著说墨,像睡著了一般。 火紅的嫁衣襯著肌膚如雪苍柏。 梳的紋絲不亂的頭發(fā)上尼斧,一...
    開封第一講書人閱讀 48,970評論 1 284
  • 那天,我揣著相機與錄音试吁,去河邊找鬼棺棵。 笑死,一個胖子當著我的面吹牛熄捍,可吹牛的內(nèi)容都是我干的烛恤。 我是一名探鬼主播,決...
    沈念sama閱讀 38,276評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼余耽,長吁一口氣:“原來是場噩夢啊……” “哼缚柏!你這毒婦竟也來了?” 一聲冷哼從身側響起碟贾,我...
    開封第一講書人閱讀 36,927評論 0 259
  • 序言:老撾萬榮一對情侶失蹤币喧,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后袱耽,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體杀餐,經(jīng)...
    沈念sama閱讀 43,400評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,883評論 2 323
  • 正文 我和宋清朗相戀三年朱巨,在試婚紗的時候發(fā)現(xiàn)自己被綠了史翘。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 37,997評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡蔬崩,死狀恐怖恶座,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情沥阳,我是刑警寧澤跨琳,帶...
    沈念sama閱讀 33,646評論 4 322
  • 正文 年R本政府宣布,位于F島的核電站桐罕,受9級特大地震影響脉让,放射性物質(zhì)發(fā)生泄漏桂敛。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,213評論 3 307
  • 文/蒙蒙 一溅潜、第九天 我趴在偏房一處隱蔽的房頂上張望术唬。 院中可真熱鬧,春花似錦滚澜、人聲如沸粗仓。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,204評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽借浊。三九已至,卻和暖如春萝招,著一層夾襖步出監(jiān)牢的瞬間蚂斤,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,423評論 1 260
  • 我被黑心中介騙來泰國打工槐沼, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留曙蒸,地道東北人。 一個月前我還...
    沈念sama閱讀 45,423評論 2 352
  • 正文 我出身青樓岗钩,卻偏偏與公主長得像纽窟,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子凹嘲,可洞房花燭夜當晚...
    茶點故事閱讀 42,722評論 2 345

推薦閱讀更多精彩內(nèi)容