1. 程式人生 > >比特幣的技術指南(適用於非程式設計師)

比特幣的技術指南(適用於非程式設計師)

這裡寫圖片描述
翻譯:青水評級

比大多數人更好地理解比特幣需要18分鐘。

在18分鐘內,您將很好地理解雜湊函式,公鑰加密和Merkle樹如何在比特幣中出色地使用。

這篇文章的目的是為關鍵的比特幣技術提供一個半技術性指南。我們發現如何實現在兩個實體交易時,解析比特幣交易過程發生的所有事情。

當然,我們以Bop(鮑勃)和Alice(愛麗絲)為主角表述。

假設:愛麗絲生活在一個正在經歷大規模經濟衰退的國家,人們普遍認為這是一場人道主義災難。在這個國家,惡性通貨膨脹、飢餓、失業和暴力犯罪阻礙了公民享有最基本的人權。

儘管經濟不景氣,生活還是要繼續,人們仍然需要購買商品和服務。愛麗絲迫切地需要修理已經破損的屋頂。但修理這個屋頂需要一天多的時間,而且使用過度膨脹的國家貨幣來定價這項服務幾乎是不可能的。

歷史上,每當一個國家的貨幣崩潰時,公民傾向於採用穩定的外匯來對衝通貨膨脹。許多經歷過惡性通貨膨脹時期的南美洲國家在試圖為服務定價時,非正式地採用了美元。但現在,愛麗絲很難找到實體美元鈔票,而且這種危機已經進入第三個年頭。為了對衝惡性通貨膨脹,她提議用比特幣支付屋頂修復工鮑勃,雖然這比她自己國家的貨幣更加不穩定。

鮑勃需要0.001 BTC才能開始維修屋頂,但他沒有比特幣錢包。除了給他寄錢,愛麗絲還需要教鮑勃如何製作錢包和使用比特幣。

1、愛麗絲想把 0.001 BTC 傳送給鮑勃

要在 Bitcoin 網路中進行交易,每個參與者都需要下載一個特定的軟體來與其他網路參與者互動。這就是所謂的客戶端,它向伺服器傳送特定的資料請求。例如,Web瀏覽器就是一種從伺服器請求和解釋資料的客戶端。當一個URL被訪問時,瀏覽器客戶端會向儲存網站內容的伺服器傳送一個請求,一旦得到了資料,它就會顯示給使用者。

比特幣客戶端的工作方式也是相似的,但有一個關鍵的區別。比特幣客戶端不是從中央伺服器訪問資料,而是與網路的其他成員進行互動,以獲取和驗證資料的完整性。這一點很容易確定,因為該網路的每個參與者基本上都儲存著相同的資料庫。這也是Bitcoin網路的一個關鍵點,因為它的去中心化屬性為網路參與者或節點之間資料交換的完整性提供了獨特的安全保障。

根據定義,節點是網路的獨立參與者。當我們提到Bitcoin網路的節點時,我們談論的是那些已經下載並執行比特幣客戶端的使用者。總的來說,節點就是比特幣網路的基礎組成部分; 一組互聯機器執行客戶端和交換資料。

節點可以通過執行兩種型別的客戶端,一個完整的客戶端或一個輕客戶端。 讓我們先來看看它們之間的區別:

完整的客戶端(也稱為全節點,或”厚”客戶端)

正如我們許多人所知道的,區塊鏈只是一種結構,可以用來儲存資料。在比特幣中,交易每10分鐘被新增到區塊中,然後連結(連線)到前一個區塊。這個資料結構的目的是確定一個單一的和不變的真相,來記錄發生了什麼以及何時發生。

完整的客戶端,也稱為完整的節點,在他們的計算機中儲存著區塊鏈的一套完整副本,它由網路中所有交易的所有區塊組成; 從創世區的第一個交易開始,這是第一個被開採的區塊,一直到軟體能夠找到的最新塊。完整的節點是比特幣網路的支柱,並且強制執行由軟體(雜湊演算法或智慧合約)規定的規則。這些規則保證了區塊鏈上所有的儲存資料的安全性、格式統一性和一致性,以及新資料修改為分類賬的過程。

由於完整節點儲存所有網路中發生的事務的副本,因此能夠驗證任何其他使用者發起的事務的有效性。為了做到這一點,軟體會檢視使用者所有過去的交易,從而防止惡意行為者傳送超越他們所擁有的資金。由於這是數字貨幣,防止比特幣被使用兩次的唯一方法(Ctl + c,Ctl + v)是高度關注所有交易。(避免數字經濟的雙花問題,也叫雙重支付)

從其他節點下載整個區塊鏈可能需要一段時間,因為目前比特幣區塊鏈的大小是164GB。然而,這個過程每個使用者只需要做一次。在已經下載好的區塊鏈的基礎上,使用者每10分鐘只需下載一個新區塊,並且這些都是由客戶端自動在後臺完成的。

輕型客戶(亦稱「瘦客戶」)

由於執行一個完整的節點有幾個要求,例如需要足夠的儲存空間和記憶體,所以設計輕客戶端是為了減少與網路的互動,減少擁有和使用比特幣的麻煩。例如,輕型客戶可以在智慧手機上執行。相比於儲存一個完整的區塊鏈副本,輕型客戶只儲存每個區塊的標題,這基本上是包含在其中的所有事務的摘要。

僅僅儲存區塊標題需要更少的磁碟空間,但它限制了輕型客戶端可以做的事情。輕型客戶端無法完全驗證事務的有效性,但如果將事務包含在區塊中,可以通過檢視標題來確認,其主要目的是向網路廣播交易。完整的節點接收並驗證輕型客戶端的事務,並將它們與所有其他未處理的事務一起新增到一個單獨的桶中。當礦工發出命令時,完整節點只允許這些未經處理的交易新增到他們的區塊鏈。

2、愛麗絲幫助鮑勃下載了一個比特幣輕型客戶端,這將使他能夠快速建立一個賬戶並獲得資金。

多個客戶端和服務上傳時間

現如今,共有幾十個不同的比特幣客戶端可供下載。這種多樣性是十分必要的,因為它降低了因一個客戶端的錯誤而破壞整個網路的風險。如果一個客戶端發生錯誤,使用者也可以下載其他客戶端並進行交易。

這就是比特幣在99.99%的時間上都可以執行的原因。沒有多少網際網路服務具有可與其相比穩定性,對於一個9年前由一位不知名人士發起的開源專案而言,這本身就是一件了不起的事情。

錢包

儘管全節點客戶端和輕型客戶端都可以作為使用者的錢包,但比特幣錢包的定義與客戶端不同。從技術上講,錢包用於收集來自發送和接收比特幣所需的資料。這些資料包括一個公共地址和一個私人密碼。

比特幣身份和鑰匙

由於比特幣是為點對點支付而建立的,所以網路中的所有使用者都需要一個公共身份,使他們能夠識別每一筆交易的當事人。就像銀行賬戶一樣,這個地址需要是獨特的,但使用者必須能夠公開分享。相反,使用者也需要通過唯一私有身份證明來授權交易,以便證明資金的所有權。

比特幣通過三個獨特的標識來達成以上操作:

私鑰

私鑰是一個完全隨機數字和字母組合,用以與特定地址的比特幣關聯。私鑰,如支票帳戶的密碼一樣,用於授權交易。下面是一個私鑰的例子。

cxprv9xg3pXGrrmSQNqRCZRFmphUZpkzt8s43ESotbcPXk5fLXt6NT3fh2tTPyQ7tW2SWAS9uWjhDJzzex9m8qmAHsJvTN1hctsgiYFK9Moo9Nx1

正如看到的,對於一個人來說,要記住私鑰是極其困難的。建議你把它寫下來存放在與網路隔絕的書籍夾層或保險箱,因為如果你碰巧寫錯一個字母,你將永遠失去你的資金。當然,你可以使用一種稱為記憶鍵的東西,以人可讀的格式來表示私鑰。信不信由你,以下十二個單詞的記憶鍵代表了上面的私鑰。

faith joke visa range turkey expose they bacon gentle hill cushion recipe

這樣更容易記住,但這卻是比特幣最不受重視的方面之一。這是人類歷史上第一次,你可以在沒有第三方的情況下將你的財富儲存在你的大腦中。

這意味著,如果愛麗絲居住的國家局勢變為內戰,她就可以逃離這個國家,並且僅憑這十二個字就能轉移她的財富。這十二個詞也可以在之後裝入任何比特幣錢包。

公鑰

公鑰來自於使用奇異代數的私鑰,並在使用者的私有和公共身份之間充當中間人。公鑰是由私鑰經過hash演算法,準確說是橢圓曲線演算法產生的,下面是一個公鑰的例子。

xpub6E9pP9ny45P14SNMCzCBFCPwr2QHgWQqZggJg6sMjnGgPo8Hf9tzPwtzHYeKXn6GdACpoKRcvkb2w6pvcAj6kwdw5mKLyDErWXKX8Bhozed

地址

地址來自公鑰,使用雜湊函式。但是現在需要注意的是,公鑰和地址是不一樣的。

我們經常被問到”如果使用者使用地址進行交易,公鑰的意義何在?” 這種中介背後有幾個技術上的原因,這都歸結於隱私和可擴充套件性。使用者可以從他們的公鑰中匯出多個地址,這使得人們很難(但不是不可能)在網路中指定一個單一的身份。 下面是一個地址的例子。

1LGpghBaX7AGbxA5dvpVwR7vMy53R8HcXX

易於驗證,幾乎不可能回溯
正如圖中所示,私鑰、公鑰和地址之間存在一種數學關係。這是通過使用一個稱為數學陷阱門的原理來實現的; 一種單向的數學函式,可以很容易地在一個方向上執行(即從私鑰中獲得公鑰),但幾乎不可能在相反的方向上執行(即從公鑰中推匯出私鑰)。

這裡寫圖片描述

儘管這些操作背後的數學方法令人興奮(以一種很好的方式),細節更多關於橢圓曲線密碼學和其他的技術。現在,請記住,當愛麗絲簽署一項交易時,她實際上是在使用她的私鑰來建立一個簽名。通過這個簽名,每個人都可以很容易地驗證愛麗絲有一個與地址關聯的私鑰,但同時卻不知道私鑰到底是什麼。

現在,讓我們分享一些奇妙的推測:

問: 使用者可以生成多少比特幣地址?

答:1,461,501,637,330,902,918,203,684,832,716,283,019,655,932,542,976

問: 地球上有多少沙粒?

答: 9,223,372,036,854,775,807

我們應該要了解,需要用整個太陽的能量才可以強制從公鑰中回推出私匙。

數學是如此的不可思議。

3、鮑勃通過他的輕型客戶端建立了一個錢包,並通過電子郵件將自己的比特幣地址傳送給愛麗絲。

交易

簡單地說,比特幣交易是一個附有簽名的資訊,用以授權將資金從一個賬戶轉移到另一個賬戶。每個交易都包含發件人的地址、接收者的地址和由發件人私鑰生成的簽名。

比特幣區塊鏈有一個本地的多輸入會計系統,每個交易都有輸入(餘額的來源)和輸出(餘額的流向),這很像一個借貸系統。使用者的餘額基本上是與從其公匙中得到的地址有關的所有借方的總和,減去已經發送到其他地址的所有貸方的總和。一旦在交易中使用,餘額就被認為是被花掉了。

4、愛麗絲現在有鮑勃的地址(1Few1623…)了,這也是她開始交易所需的唯一東西

這裡寫圖片描述

當愛麗絲啟動一個0.001BTC的交易,或者10毫位元(mBTC)時,她的比特幣客戶端將檢視所有以前與其公鑰相關的未使用輸出(debits),並顯示她的總餘額。 然後,愛麗絲掃描或複製鮑勃的地址,新增交易金額,並選擇她希望資金以多快的速度到達鮑勃。鮑勃接收愛麗絲交易的速度取決於愛麗絲願意支付多少網路費用。

5、愛麗絲決定她將支付多少費用,這與鮑勃獲得資金的速度成正比

比特幣依賴於某些網路參與者將未經處理的交易分組到一個區塊中,並將該區塊新增到分類賬中,這個活動叫做挖礦。礦工收取一個區塊內所有交易的費用。因此,他們有優先處理高額交易的經濟動機。如果愛麗絲希望鮑勃在不到一小時內收到資金,她將不得不向礦工支付更高的費用。

由於鮑勃不會馬上需要這筆資金,所以愛麗絲決定支付每千位元組2.21 mBTC 的交易費,這足以確保鮑勃在50分鐘內或者5個區塊內收到她的交易。愛麗絲預覽了這筆交易,看看她將支付多少費用。

這裡寫圖片描述

按每千位元組2.21mBTC的交易費率,由於其交易規模為336位元組,網路費支付總額為0.743 mBTC,即4.65美元(2.21* 336)。

注意: 截圖是在比特幣交易達到歷史最高水平。如今,類似交易的成本將低於1美元。

從本質上講,比特幣交易就是分類賬條目的交換,它們被表示為輸入和輸出。愛麗絲髮起的具體交易只包含一個輸入和兩個輸出。為了給鮑勃發送10 mBTC,愛麗絲的客戶端使用過去的交易作為輸入,以證明她的餘額高於傳送的數量。一天前,愛麗絲把98.525 mBTC存入了她將用來把錢寄給鮑勃的地址。她的客戶端將使用這筆交易作為輸入,因為它的值高於她將傳送給鮑勃的數量。她的客戶端還會把昨天的存款和10mbtc (即,變化)之間的差額發回給愛麗絲。

同時,共建立了兩個輸出:第一個輸出將10 mBTC傳送給了鮑勃,因為它代表了愛麗絲髮送的內容,第二個輸出的87.78mBTC作為變化差值回到了愛麗絲的地址。要注意的是,愛麗絲將收到的87.78 mBTC輸出已經計算了她將為網路收費支付的0.74 mBTC。

這裡寫圖片描述

有時,輸入和輸出會令人困惑。這是因為前一個交易的輸出變成了新交易的輸入。在上面的例子中,輸入0是前一天存款的輸出。因為該輸出在任何其他交易中都沒有使用(即它是未使用的輸出),它可以用作新交易的輸入。一旦被使用,它就變成了一個已使用輸出,不能被視為未來交易的輸入。

在這個特定的交易可以廣播到網路之前,愛麗絲需要通過簽署這個交易來證明她擁有與此地址相關聯的私鑰。愛麗絲可以通過載入用於儲存它的文字檔案或手動輸入她的12個單詞的記憶鍵。愛麗絲的客戶端會將交易中的所有細節組合起來,將其轉換為十六進位制格式。

轉換之後,愛麗絲的整個交易看起來是這樣的:

0100000001148e2d38c3689aad33912d200466fae64f5838f78b3b9f86b01c248720e6c4a601000000fdfe0000483045022100c30774a82e9073eddb6087f41a59072d29eaee7c3d1421d6f87176ebdff4d7d0022062de162d52c6b547fa24691df56c9da4d6eb7ee73af414af4b60ccce9e69e9e601483045022100f3e2f4a4b970c266a6bd8673cc4ebceea552d8f95a08a35f9961b4d82dfbb8b1022006bd96c993d8b3abb5f709575a0bd4aaa3dfc7ef4be2332e5742dea07d0cc3a9014c69522102645819411857186df087f733675574e37372b4de78471b5c87b832d977f3007e21034df63462f237819e46a9aa586a87597fde69df7ed2b5b583de38ae0d4abc183a2103ec10bb20748527001b900474f72440e1a9591305b991f79cbf0897413ec0cfb753aeffffffff0240420f00000000001976a9147fd627956048ff5b5cff26183df231540c637d2e88acd8f185000000000017a914167a1e9c105bd7bc1a5e86d3d576078a63f0472c8700000000

上面的字串是與網路的其他成員共享的。一旦被廣播,圍繞愛麗絲的節點驗證交易的有效性,並將其傳播到其他節點,直到交易被礦工處理。如上所述,每個節點都儲存一籃未經處理的交易。這就是所謂的記憶池,或者mempool。

當記憶池填滿時,網路中的節點儲存大量未處理的交易時,導致記憶體不足,每千位元組的網路費率就會增加。結果,網路採礦費用也就增加了。

因此,比特幣記憶池被用作擁塞控制和交易成本的代理,因為更多未經處理的交易 = 記憶池中更少的空間 = 更高的費用。這裡需要強調,比特幣網路收費只根據交易規模(kilobytes)來定價,而不考慮傳送的數量。

區塊挖礦的驗證

比特幣的發明者中本聰從未用過”挖礦”這個詞來形容嵌入比特幣協議的數學競爭。相反,這個術語之所以受到歡迎,是因為它描述了一種與現實世界活動相似的行為,這種活動具有概率性,而且不能保證成功。

金礦主知道,即使他們在挖礦中花費了大量的資源,也不能保證可以找到一種珍貴的金屬。儘管這可以作為一個有用的類比來描述活動的概率性質,但採礦這個術語對於理解這個過程本身沒有任何幫助,而這個過程是比特幣在使用者採用和網路安全方面的最大成就之一。

礦工們的實際活動與現實世界的鎖匠的工作更類似,而不是一個真實世界的礦工。

想象一下,每隔十分鐘,比特幣協議就會給其網路中的鎖匠們一個未知金鑰的閉合鎖。只有當其中一個鎖匠能夠開啟鎖並將一組新的交易附加到鏈條上,才會釋出獎勵。為了找到鑰匙,鎖匠必須嘗試數以百萬計的不同組合,這需要花費時間和精力。鎖匠必須通過向其他鎖匠展示真正的金鑰,來證明自己的工作,之後其他鎖匠也可以自己複製和驗證這個金鑰。生產這把鑰匙,就是證明工作已經完成的證據,它會自動給予成功的鎖匠一個獎勵,而這種獎勵實際上與他的努力成正比。

這就是工作證明。

這裡寫圖片描述

協議總是知道有多少鎖匠試圖找到鎖的鑰匙,那麼在鎖匠找正確鑰匙之前,每次平均需要10分鐘。如果網路中只有十幾個鎖匠,鎖會很小,而且可以很容易地使用一個有很少凹槽的短鑰匙開啟。相反,如果有數百個鎖匠參與這個挑戰,協議將給他們一個大鎖,需要一個帶有許多凹槽的長鑰匙。至於比特幣,在找到正確的金鑰之前,需要測試數以百萬計的不同組合。

想想比特幣發行的時候,只需要一個簡單的演算法程式碼檔案就能生成一個有效的金鑰。現在,這個活動只能通過ASIC來完成,ASIC是為計算特定演算法的最優化硬體。比特幣ASICs的崛起類似於出售電子金屬磨床給這些鎖匠,成指數的增加他們測試不同的金鑰組合的能力。隨著這項活動的經濟效益刺激了價值的增加,鎖的尺寸也增加了。

比特幣鎖現在已經變的巨大,這有助於網路的安全。考慮到活動本身的競爭性和概率性,同一個鎖匠不太可能在一段時間內連續找到鎖的鑰匙。不可預測性是一個重要特徵,因為它減少了一個惡意的活動人通過連續挖掘來使資金翻倍的可能性。然而,當與專門硬體相結合時,難度的增加為普通使用者設定了進入門檻,最終必然轉化為某種集中化。

社群的傑出成員現在正在討論是否接受或審查ASICs的使用。ASIC製造商+礦商的合流有潛在的危險性。但需要注意的是,它確實通過數量級(當然是以犧牲去中心化為代價)來增加網路安全。

工作證明和雜湊函式

如你所知,上述數學謎題是以密碼學雜湊函式為基礎的。一般來說,雜湊函式對映檔案中的每一個數據,給它分配識別符號,並且生成一個固定長度的輸出。換句話說,使用雜湊函式將任何大小的資料壓縮到標準輸出,這個輸出被稱為雜湊。可以通過一個雜湊函式將整個國會圖書館放在一起,然後將輸出與它的雜湊值進行比較; 這兩個輸出將具有相同的大小。

為了產出工作證明,比特幣礦工使用SHA-256; 這最初是一種由美國國家安全域性設計的壓縮敏感資訊的雜湊函式。在能夠向區塊鏈中新增區塊之前,礦工必須使用SHA-256功能,將區塊內的資料與一個特定的、未知的數字結合起來,這個數字叫做nonce。礦工需要找到一個nonce,當與一個區塊內的資料結合在一起時,產生一個雜湊值,該雜湊值需要以目標個數的零的開始。

雜湊函式對最輕微的變化都非常敏感。因此,礦工必須在10分鐘內嘗試數以百萬計的不同的非線性組合,以便找到一個與區塊合併時,以目標數個零起始的nonce。如果你仔細閱讀前面的部分,你會發現,鎖匠們正在努力尋找的關鍵是nonce。

這裡寫圖片描述

更改已新增到區塊的交易需要更改整個區塊鏈。比特幣之所以有效是因為其區塊鏈的資料結構使其不可改變; 一旦一個區塊被挖掘出來,其中的任何東西都不能在不影響整個區塊鏈的情況下被改變。

Merkle Tree

這是通過一個叫做MerkleTree的資料結構來實現的,這種結構將每個區塊中的資料組合起來,這樣所有的資料都是相互依存的。正如下圖,愛麗絲與鮑勃的交易生成Hash1,然後與Hash0(發生在同一時間的另一個交易的雜湊)生成 Hash01。 協議對每一個未經證實的交易都是這樣做,這些交易將被新增到區塊中,直到找到一個根雜湊。

這裡寫圖片描述

根雜湊是一個區塊內所有交易組成的雜湊。如果更改這些交易中任何微小的資料,那麼根雜湊將會完全不同。這就是為什麼術語區塊鏈被高度普及的原因; 對於許多不同的應用程式來說,這種資料結構的不可變性是非常可取的。

在關於輕型客戶端的部分中引用的區塊頭是將根雜湊與區塊鏈中前一個區塊的區塊頭結合起來。這就是在區塊鏈中將區塊基本連線在一起的原因。區塊頭還包括其他資料片段,比如nonce,當前的時間戳和挖掘它的困難度。

6、最後,愛麗絲的交易和許多其他交易一起被新增到一個區塊中。一旦這個區塊被挖掘出來,鮑勃就可以下載並驗證交易是否已被確認

激勵機制和獎勵

比特幣協議有一個本地激勵機制,獎勵那些能夠提供有效工作證明的礦工。這一數額每四年變為之前的一半。當前它是每個區塊12.5 BTC獎勵。 礦工們還從加入他們區塊的每一筆交易中收取網路交易費用。

2009年1月比特幣網路剛剛推出時,每個區塊的獎勵是50 BTC。正如預期的那樣,截止2012年11月獎勵減半至25 BTC,2016年7月降至12.5 BTC。在2140年,比特幣協議將停止生成新的硬幣和採礦獎勵,獎勵將只會基於網路費用。 屆時,將有大約2100萬比特幣在流通。

由於比特幣提供了一個以稀缺物資為基礎的獨特的經濟結構,它極大地促進了比特幣的採用。激勵和工作證明POW是通過一種演算法來定義的,這種演算法可以精確地模擬比特幣的通貨膨脹。這使得比特幣有可能成為未來硬幣的優秀候選者,因為它的貨幣政策是由軟體形式的數學演算法決定的。

最後的評論

我第一次玩比特幣的程式碼庫是在2012年秋天,當時我還在上大學。我記得起初對它不屑一顧,我現在明白是因為無知。比特幣的簡單性可能非常具有欺騙性,很容易忽視它的優雅。

無知是比特幣多次被宣告死亡的真正原因。畢竟,理解密碼學,電腦科學和經濟學的這種組合需要時間和精力,這不應該是一個驚喜。

但是一旦你得到它,它的技術輝煌是不可否認的。

我要非常感謝Andreas M. Antonopoulos撰寫的《Mastering Bitcoin》。它讓我開始瞭解比特幣協議中許多未被充分認識的方面。如果您沒有技術背景,我強烈推薦他的最新著作《The Internet of Money》。

原文作者:Lucas Nuzzi