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