比特幣的信任系統(tǒng)是如何構(gòu)建的
比特幣是一種去中心化的數(shù)字貨幣,它建立在信任系統(tǒng)的基礎(chǔ)上,并以諸如橢圓曲線的各種性質(zhì)等密碼難題為基礎(chǔ)。在不深入研究比特幣數(shù)學(xué)方面的情況下,要正確理解本文的關(guān)鍵思想,不需要深入了解密碼學(xué)。但是,您應(yīng)該對私鑰和公鑰有基本的了解。
“我在哪兒簽名?”
每次您想授權(quán)付款時,都會要求您進(jìn)行某種形式的驗(yàn)證。核實(shí)的目的是,一旦你以自己的名義批準(zhǔn)了一筆交易,這筆交易就不可逆轉(zhuǎn)。當(dāng)然,在某些情況下,您可能希望添加一個條款,即如果某些條件沒有得到滿足,付款必須向另一個方向進(jìn)行托管。但一旦一項交易獲得授權(quán)并簽署,就會成為定局。唯一的問題是:你能完全肯定地證實(shí)它確實(shí)是由它所代表的人授權(quán)的嗎?使用簽名來識別用戶的問題是一個老問題。曾經(jīng)有一段時間,人們用昂貴的徽記密封信件,以證明信件 確實(shí)來自某個權(quán)威機(jī)構(gòu)。
封信與應(yīng)用封信的做法已被PGP密鑰所取代。PGP密鑰很有趣,因?yàn)樵谀承┓矫嫠鼈兣c比特幣密鑰非常相似。讓我們花一分鐘看看PGP,然后看看比特幣是如何建立在這個基礎(chǔ)上的。
有兩種使用PGP密鑰的方法:
1. 用于加密和解密電子郵件。如果有人截獲了郵件,他們就無法破譯郵件內(nèi)容。
2. 簽署消息。如果有人攔截,他們能夠驗(yàn)證消息的真實(shí)性。
PGP有效地替代了密封裝置。過程如下。首先,必須生成公鑰-私鑰對。現(xiàn)在你寫電子郵件。完成之后,您拿著您的私鑰和電子郵件,通過PGP簽名程序運(yùn)行它,然后會出現(xiàn)一個簽名。此簽名只能由持有私鑰的人生成。怎么能確定呢?您獲取消息和簽名,并通過提供發(fā)送方公鑰的PGP驗(yàn)證程序運(yùn)行它。這個程序會告訴你這封郵件是否真的是由他聲稱的那個人寫的。唯一需要回答的問題是:如何獲得公鑰?這是一個有趣的問題,因?yàn)榧用芗夹g(shù)沒有為您提供任何機(jī)制。它完全掌握在用戶手中。通常,在PGP的情況下,用戶上傳他們的一些中央服務(wù)器公鑰,這樣任何人都可以取。
比特幣使用了一個非常類似的公鑰加密過程。然而,比特幣程序不需要對消息進(jìn)行簽名,而是允許您對交易進(jìn)行簽名。
比特幣交易如何簽署?
現(xiàn)在你已經(jīng)了解了PGP加密是如何工作的,你可以開始考慮比特幣簽名了。不過這有點(diǎn)棘手。天真的想法是,當(dāng)您創(chuàng)建一個交易提供從您的帳戶中扣除X數(shù)量的比特幣并將其轉(zhuǎn)移到Y(jié)時,您只需要簽署這個建議。但這有一個問題。如果您只是在創(chuàng)建交易,說明您想要轉(zhuǎn)移資產(chǎn),那么誰會驗(yàn)證您確實(shí)有錢?這將需要一些中央權(quán)力進(jìn)行核查。比特幣的設(shè)計初衷并非如此。因?yàn)闄?quán)力最終掌握在用戶手中。比特幣提出了一個絕妙的解決方案。這個想法是這樣的:只有在過去的某個時候你收到了比特幣,你才有可能擁有比特幣。這樣,唯一可以聲明事務(wù)的人,就是持有私鑰的人。因此,比特幣簽名有雙重用途:
· 它驗(yàn)證您是事務(wù)的真正創(chuàng)建者,并且
· 你確實(shí)擁有你將要轉(zhuǎn)移的比特幣。
后者是最基本的。我們將在其他帖子中看到這是如何形成錢包(或賬戶集合)的基礎(chǔ)。順便說一下,以太坊以略不同的方式介紹了一個獨(dú)立帳戶的概念。但比特幣只是一個交易鏈。因此,對于所有權(quán)來說,你必須掃描交易鏈并使用它們,你必須解鎖它們并在交易中使用它們。
附注: 您可能想知道:以太坊為什么有一個較好的設(shè)計,因?yàn)樗试S創(chuàng)建賬戶。這取決于用例。設(shè)計上的簡潔性使系統(tǒng)保持流線型,比特幣確實(shí)實(shí)現(xiàn)了價值儲存的目的。
每個事務(wù)都由輸入和輸出組成。每個輸入都包含一些以前的事務(wù)。每一項產(chǎn)出都包括資金被送往的目的地。當(dāng)您簽署一個事務(wù)時,您同時簽署輸入和輸出。通過對輸入的簽名,您實(shí)際上是在說您是這些代幣的真正所有者。通過對輸出結(jié)果的簽名,您就同意確實(shí)希望將這些代幣發(fā)送到指定的地址。為了保持資金流動,交易的每個輸出都被用作另一個交易的輸入。
輸出消耗為輸入
足夠的理論。讓我們看一個真實(shí)的交易。
這是通過電線傳輸?shù)膶?shí)際交易。我們無法從中了解任何東西。我們?nèi)绾谓忉屗??一個詞: 協(xié)議。
協(xié)議是一個標(biāo)準(zhǔn)的用于定義交換數(shù)據(jù)的方法,從計算機(jī)networkIf的交易協(xié)議規(guī)則中,我們可以看到交易是如何構(gòu)造的。
交易協(xié)議
輸入交易協(xié)議
輸出交易協(xié)議
讓我們根據(jù)協(xié)議分解交易。
頭
包含元數(shù)據(jù)信息。例如,它告訴程序這是一條事務(wù)消息。
版本
允許向后兼容性。如果使用新字段更新協(xié)議,則舊事務(wù)不應(yīng)變得不可識別。
事務(wù)目擊者
這是作為隔離證人變更的一部分而引入的一個領(lǐng)域。我們改天再看。
引用的事務(wù)
事 務(wù)僅包含對正在使用的前一個事務(wù)的特定輸出的引用。它使用事務(wù)哈希值和輸出索引號(從0開始)的組合。如果需要,程序可以使用它的哈希值獲取整個事務(wù)。使用索引號,它知道將哪個輸出用作輸入。
要計算事務(wù)哈希值,您需要連接事務(wù)的完整十六進(jìn)制表示,并計算該字符串的SHA256兩次。
序列
見https://bitcoin.stackexchange.com/a/55113。
價值
發(fā)送的金額(以satoshi表示)。
鎖定時間
解鎖此事務(wù)的塊號或時間戳。
公鑰腳本(scriptPubKey)
事務(wù)的目的地。隱藏在這個腳本中的是接收方的公鑰哈希值,表示為十六進(jìn)制。要獲得相應(yīng)的比特幣地址,只需將此十六進(jìn)制轉(zhuǎn)換為Base58。
簽名腳本(scriptSig)
與scriptPubKey類似,scriptSig包含授權(quán)事務(wù)的簽名。除了簽名本身之外,所有部分都已簽名。
現(xiàn)在我們知道了編碼的規(guī)則,讓我們解碼它:
有一個事務(wù)輸入,即hash2936ee6a0db4e4901988503bb6e966128dd5fa01bcf08451f78a1d5b08dbbd6事務(wù)的第0個索引,有兩個輸出。其中一個是0.05 BTC,地址為3swtkzdetsfxyjqgdwtvpqulv64rvktbzthukvxxre4th6tsgxnrg
其余33.54 BTC,地址為3q7mcidryx4d9pefdeqckuq2iug4i4efb8buho7gflckepynwkr4h。
您可能已經(jīng)注意到,與其簡單地調(diào)用公鑰和簽名,還不如調(diào)用公鑰腳本和簽名腳本。這是一個非常強(qiáng)大的概念,我們將在其他時間深入探討。但我將留給您這樣一個想法:有時您希望創(chuàng)建一個可編程事務(wù),以便它只在滿足某些條件時才執(zhí)行。例如,如果發(fā)現(xiàn)有問題,您可能希望返回剛購買的商品?;蛘吣愕慕?jīng)理想要批準(zhǔn)你做的每一筆交易。腳本支持有趣的用例,并且正在進(jìn)行進(jìn)一步改進(jìn)腳本的工作。
交易是比特幣分散式對等電子現(xiàn)金系統(tǒng)的關(guān)鍵組成部分。公鑰密碼學(xué)確保了沒有人可以只接受您創(chuàng)建的交易并更改它,這樣一來,比特幣現(xiàn)在的地址將與您打算發(fā)送的目的地不同。它還確保除了私鑰所有者之外,任何人都不能訪問發(fā)送給他的資金。
概括地說:交易是不可逆轉(zhuǎn)的,也是無可爭辯的。要使用以前事務(wù)的輸出作為新事務(wù)的輸入,您需要私鑰。這允許您對消息進(jìn)行簽名。要將資產(chǎn)發(fā)送到某個帳戶,需要它們的公鑰。交易是比特幣系統(tǒng)的核心特征之一。
但這并不是信任體系的全部。如果我創(chuàng)建一個事務(wù),廣播它,然后快速創(chuàng)建另一個事務(wù),并廣播那個事務(wù),會怎么樣?誰來廢除其中一個?一般來說,世衛(wèi)組織確保系統(tǒng)中的所有事務(wù)都公平地進(jìn)行。如果比特幣需要一個實(shí)體來檢查一切是否公平公正,它就不會被認(rèn)為是去中心化的。在這篇文章的第二部分中,你將看到如何可以在沒有一個中心機(jī)構(gòu)的情況下,確保一切事物順利運(yùn)行。
上面探討了如何以加密方式密封交易,從而使除所有者之外的任何人都無法對其進(jìn)行j決策。我們簡要地討論了這些交易是如何通過網(wǎng)絡(luò)提交并廣播到整個網(wǎng)絡(luò)的。我們還討論了接收方如何接收這些交易并在后續(xù)交易中使用它們,從而創(chuàng)建一個順序,在這個順序中,先前交易的輸出作為新交易的輸入使用。
創(chuàng)建交易之后,需要在某個地方寫下它,以便以后可以引用它。這需要一個存儲模型,其中所有的交易都可以被記錄(也稱為分類賬)。為什么我們需要以前的交易?因?yàn)闉榱蓑?yàn)證某筆交易是正確的而不是欺詐的,您必須從一開始就跟蹤它(從Nakamoto的賬戶開始)。我建議你暫停一下思考為什么需要這樣做?有沒有更有效的方法來處理這個問題?
這顯然是一個乏味的過程!在每分鐘發(fā)生數(shù)百萬個交易的情況下,您不可能花費(fèi)所有的計算資源來試圖弄清楚交易是如何構(gòu)造的。這里有一種簡單而優(yōu)雅的方法可以解決這個問題。將一組交易存儲在塊中,并將這些塊鏈接在一起。而不是在接受的單個交易上蓋章。通過這種方式,在檢查某個交易是否確實(shí)正確而非欺詐時,您只需獲取前面引用的交易及其塊,并對其進(jìn)行驗(yàn)證即可。
這總結(jié)了比特幣的存儲模式。但是如何進(jìn)行溝通呢?區(qū)塊鏈中有不同的角色—每個角色都有自己的角色集。有些正在向區(qū)塊鏈添加塊。有些只是簡單地將塊傳遞給其他塊—確保所有塊都被考慮在內(nèi)。有些正在創(chuàng)建/傳輸實(shí)際的交易。有些只是驗(yàn)證這些交易。有些只是監(jiān)視區(qū)塊鏈上發(fā)生的活動。但這一切是如何在不受外部影響的情況下以一種自我維持的方式發(fā)生的呢?
在我們深入研究理論之前,我想介紹一下系統(tǒng)中的一些關(guān)鍵角色。稍后我們將進(jìn)一步闡述其目的。這些參與者(更具體地說:節(jié)點(diǎn))可能以某種形式重疊,但在概念上是獨(dú)立的實(shí)體。
錢包
錢包(也稱為簡單支付驗(yàn)證節(jié)點(diǎn))有兩種功能:
1. 它需要掃描區(qū)塊鏈來查看哪些交易屬于他
2. 它需要創(chuàng)建向網(wǎng)絡(luò)廣播(并最終挖掘)的交易。
種子
在任何時刻,每個節(jié)點(diǎn)都連接到若干其他任意節(jié)點(diǎn);形成點(diǎn)對點(diǎn)節(jié)點(diǎn)的網(wǎng)格狀結(jié)構(gòu)。然而,為了發(fā)現(xiàn)其他節(jié)點(diǎn),一個節(jié)點(diǎn)必須首先連接到“種子”節(jié)點(diǎn)——這將引入其他節(jié)點(diǎn)。
礦工
礦工將塊放入?yún)^(qū)塊鏈中。它們匯集所有未經(jīng)確認(rèn)的交易;按照開礦費(fèi)(最高)對它們進(jìn)行排序,并將其添加到區(qū)塊鏈中。然后將這個新挖掘的塊廣播到網(wǎng)絡(luò)的其他部分。簡而言之,礦商的工作就是將交易轉(zhuǎn)換為塊。
中繼器
中繼器只是監(jiān)視活動。他們可以判斷網(wǎng)絡(luò)的健康狀況;參與消息傳遞;或者查詢區(qū)塊鏈以獲得其他統(tǒng)計信息。
在上述文中我們在討論中提到,對于一個具有加密簽名的交易系統(tǒng),仍然有可能濫用該系統(tǒng)。如何確保添加到區(qū)塊鏈上的交易沒有被篡改?如果一個淘氣的參與者開始用不正確的交易/消息轟炸系統(tǒng),該怎么辦?如果有人同時將x個BTC發(fā)送給A和x個BTC發(fā)送給B,會怎么樣?哪一個是有效的?如果礦商接受兩個不同的交易呢?節(jié)點(diǎn)之間如何協(xié)調(diào)一致地進(jìn)行網(wǎng)絡(luò)更改?可以用一個問題來概括:這個體系是如何監(jiān)管的?
這些都是密碼學(xué)上的、受保護(hù)的、不受信任的網(wǎng)絡(luò)中的難題——在某種意義上說,任何一方都不能危害生態(tài)系統(tǒng)。所有節(jié)點(diǎn)必須符合網(wǎng)絡(luò)規(guī)則,如有異議,一組節(jié)點(diǎn)可以對當(dāng)前的區(qū)塊鏈進(jìn)行快照;
提出的比特幣解決方案中的一個關(guān)鍵概念是形成一個定義良好的塊順序。如果您已經(jīng)訂購了塊,并且得到了所有對等方的一致同意,那么同一個交易不可能在區(qū)塊鏈中出現(xiàn)多次。一個簡單的方法可以是簡單地向塊(1,2,3…)添加索引。更好的方法是添加時間戳而不是數(shù)字,因?yàn)闀r間戳還提供關(guān)于塊創(chuàng)建時間的額外信息,每個塊隨后可以引用前面的時間戳(假設(shè)每個時間戳是惟一的)。在我們的系統(tǒng)中仍然有一個明顯的問題。你能看出來是什么嗎?
任何人都可以在任何時候創(chuàng)建一個塊,并可以向網(wǎng)絡(luò)發(fā)送幾十個塊的垃圾郵件。這將導(dǎo)致網(wǎng)絡(luò)癱瘓,比特幣將完全無法使用。在Bitcoin白皮書中提出的解決方案如下:當(dāng)向區(qū)塊鏈添加一個塊時,礦商被要求破解一個密碼難題,并將產(chǎn)生的哈希值添加到塊中。這個謎題的設(shè)計方法是這樣的:它很容易驗(yàn)證是否正確解出了,但如果事先不知道答案,就很難解出。此外,比特幣網(wǎng)絡(luò)還可以定期調(diào)整這個謎題。例如,2019年初,采礦難度比兩年前提高了1800%左右。這樣做是為了抵消采礦機(jī)哈希功率的上升,并在系統(tǒng)中保持平衡。當(dāng)然,如果礦商沒有開采這些交易的動機(jī),所有這些工作都將毫無意義。這就是所有交易都要收費(fèi)的原因——費(fèi)用由礦商承擔(dān)。在2140年之前,礦工們還將獲得一些BTC作為繼續(xù)采礦的額外激勵。這個額外工作產(chǎn)生的哈希值也用于排序;而不是依賴于時間戳。但是,我們?nèi)匀辉趬K上使用時間戳,因?yàn)樗鼈優(yōu)槲覀兲峁┝擞袃r值的信息。
到目前為止,我們已經(jīng)有了一個帶有時間戳的、受垃圾郵件保護(hù)的、鏈接在一起的塊,這些塊由看起來相當(dāng)可靠的交易組成。讓我們進(jìn)一步測試它。礦工有可能做出惡意行為嗎?例如,他可以在一個塊中引入一個從來沒有人請求過的交易嗎?如果兩個不同的塊包含由兩個不同的礦商幾乎同時產(chǎn)生的一組相同的交易,該怎么辦?
這是兩個不同的問題,但值得探討。為了解決第一個問題,我們需要介紹比特幣區(qū)塊鏈如何巧妙地處理哈希值。哈希值是一種固定大小的數(shù)據(jù),用于確保某些輸入的完整性。首先,我們計算一個塊中所有交易的哈希值。然后,我們使用一種稱為Merkle根構(gòu)造的技術(shù)來計算根哈希值。這個哈希值可以看作:所有的哈希值。簡單來說,根哈希保證了塊中所有交易的完整性。礦機(jī)或中繼器不可能引入不屬于原始塊的交易,因?yàn)檫@會破壞整個塊的哈希值。很好,那么同時生產(chǎn)多個塊呢?
這就有點(diǎn)復(fù)雜了,因?yàn)楸忍貛耪撐牟]有給出一個具體的答案。相反,它被留在了一場碰運(yùn)氣的游戲中。不幸的是,必須有人輸?shù)暨@場戰(zhàn)斗。讓我們畫一幅畫。假設(shè)中國的礦商X和美國的礦商Y的區(qū)塊中都包含了交易T。x 產(chǎn)生塊 b1 和產(chǎn)生的區(qū)塊鏈?zhǔn)?[。.。a→b1], 而 y 的區(qū)塊鏈看起來像 [。.。a→b2]。這兩個塊被廣播和轉(zhuǎn)發(fā), 直到最終74% 的節(jié)點(diǎn)知道一個區(qū)塊鏈 [。.。a→b1], 而18% 的人知道區(qū)塊鏈為 [。.。a→b2]。這兩個區(qū)塊鏈似乎都是有效的, 盡管相互矛盾?,F(xiàn)在,德國的一名礦工Y把區(qū)塊鏈看成是[…a→B1],他制作了另一個C塊并廣播它。他的范圍是94%的節(jié)點(diǎn)。所有以前和區(qū)塊鏈[…A→B2]打交道的礦商,現(xiàn)在都看到了這個新的區(qū)塊鏈[…A→B1 C],他們將決定放棄之前的鏈條,代之以最新的版本。如果他們不這樣做,而是繼續(xù)使用舊的開采鏈,他們就有可能將開采區(qū)塊拱手讓給大多數(shù)。最后,最流行的區(qū)塊鏈版本被認(rèn)為是標(biāo)準(zhǔn)版本。這就是為什么一般建議等到6個塊后才接受交易,因?yàn)閰^(qū)塊鏈的狀態(tài)可能會發(fā)生變化。作為一個挖掘人員,您希望能夠訪問盡可能多的節(jié)點(diǎn),否則您的所有努力都有可能白費(fèi)。另一方面,礦業(yè)權(quán)力的統(tǒng)一也給比特幣網(wǎng)絡(luò)的分散化帶來了風(fēng)險。如果一組礦工獲得51%的哈希值功率,他們可以有效地從他們喜歡的區(qū)塊鏈中剝離出來。這是對比特幣區(qū)塊鏈的實(shí)際威脅,目前沒有任何安全措施確保未來不會發(fā)生這種情況。反對這一觀點(diǎn)的人認(rèn)為這是極不可能的,而且會損害所有參與者的利益。
垃圾郵件保護(hù)(工作證明)結(jié)合區(qū)塊鏈分支和最終的合并意味著我們應(yīng)該在交易廣播之后等待一段時間,然后才能有足夠的信心說它已經(jīng)在區(qū)塊鏈網(wǎng)絡(luò)中持久化。通常,開采一個新區(qū)塊需要10分鐘。如果我們等6個區(qū)塊,我們的交易就會被深埋在賬本里,我們可以非常自信地說,交易已經(jīng)完成了。但是沒有人喜歡喝等一個小時的咖啡。這就是比特幣的瓶頸。這項技術(shù)不能用于日常使用,但卻引領(lǐng)了互聯(lián)網(wǎng)貨幣的發(fā)展。記住,比特幣本身就是各種試圖創(chuàng)造虛擬貨幣的高潮。所以,在我看來,說這項技術(shù)已經(jīng)達(dá)到頂峰是不正確的。有很多改進(jìn)的建議。下一個版本的加密貨幣可能在利用比特幣(Bitcoin, et al)提出的概念的同時,處理當(dāng)前系統(tǒng)面臨的問題(比如波動性和交易速度)。