閃電般的速度——揭露比特幣交易原理

買賣虛擬貨幣

要了解閃電網路的工作原理,就要先明白比特幣交易的工作原理,以及UTXO和比特幣指令碼的定義。閃電網路是在UTXO和比特幣指令碼之上設計的一種激勵機制。

簡單概括——兩個系統與三種交易

閃電網路的誕生原因非常簡單。如果你打算烹飪兩個雞蛋作為早餐,就不會每天都去Costco超市購買兩枚雞蛋。相反,你會一次性買上幾十個雞蛋囤起來,免去每天都去超時購買雞蛋的麻煩。相對而言,比特幣作為一種轉賬服務,交易速度本身較慢。每秒只能處理大約7筆交易,與Visa或萬事達等其他支付網路相比相差甚遠。為了解決交易速度慢的問題,就像儲存食物一樣,我們可以在比特幣網路的線下儲存一些代幣,再建立一個支付系統,於是閃電網路出現了。

有兩個系統需要區分下,一個是原始的比特幣網路,另一個是閃電網路。兩個網路系統用不同的交易方式來流通比特幣,根據資金流向的不同,可以分為以下幾類:

· 比特幣網路,也就是當前大多數轉移比特幣的方式,我們稱之為第一層交易。

· 閃電網路,一種更快轉移比特幣的方式,我們稱之為第二層交易。

· 在閃電網路和比特幣網路之間轉移,我們稱之為跨層交易。稍後,我們將看到,跨層交易本質上是一個第一層交易,而閃電網路是比特幣區塊鏈上一個獨立實體。

在本系列中,我們將詳細討論這三種型別的交易。

第一層交易

比特幣被形容為分散式賬本,也就是說它是一本記錄每個人賬戶資訊的賬本,人人手中都有一份副本。但是賬本里麵包含了什麼內容?如何記錄?使用什麼格式?在繼續之前,先把重點劃出,這樣便知把注意力放哪裡了。我們無需關心比特幣的生成過程,也就是說這裡不討論挖礦。我們關心的不是密碼學的用途,而是它經受住了時間的考驗。即便比特幣應用的加密函式符合法律要求,也沒有科學家或數學家能證明比特幣萬無一失。事實曾有高手試圖破解比特幣,但都失敗了,這給了些許信心。

UTXO是什麼——樹和連結串列

你曾思考過計算機如何儲存資料嗎?計算機不能隨隨便便儲存一條資訊,就像圖書館裡不能隨意排放書籍一樣。因此計算機需要以某種方式排列資料,便於管理才行。於是資料結構發揮作用了。計算機需要根據具體情況使用一組不同的預定義格式,以有序的方式存放資料。兩種格式,也就是亟待我們理解的資料結構鏈式列表和樹格式。

當我們觀察母親和她們的孩子時,樹狀結構就像她們的家譜。

上圖中最上方的Grandmother(祖母),用計算機術語來表示為樹的“根”,最下方的一列稱為樹的“葉”(堂兄弟姐妹以及你)。連結串列是一種特殊的樹,從樹中的葉子瀏覽到根獲取一段資訊。譬如,你想列出所有為你捐過錢的人,它會是這樣的,

也可以表示為帶有連結項的列表,

現在讓我們看看比特幣如何在設計中應用樹和連結串列的。

通常,當你透過銀行轉賬時,比如你要給愛麗絲匯100美元。發生的情況是,錢將從你的銀行賬戶中扣除,愛麗絲的賬戶餘額將相應增加100美元。錢是從一個賬戶流向另一個賬戶,而比特幣則不是這樣。在比特幣中,你沒有賬戶,只有交易記錄。例如,鮑勃是一個礦工,有一筆屬於他的25個比特幣的記錄,這個記錄會被真實地寫成,

當鮑勃決定花費這25個比特幣時,他必須把25個比特幣當作根,並形成樹狀結構。如果他想以1ETC的價格從埃隆·馬斯克手中購買一輛特斯拉,他會產生3筆新記錄,

· 支付給埃隆·馬斯克1 BTC

· 付給礦工的交易費,假設是0.00001 BTC;

· 剩下的錢以零錢的形式轉回給自己,也就是23.99999。

這些記錄將被放入樹中,

一旦這棵新樹建立起來,鮑勃就會進行傳播,告訴其他比特幣賬戶所有者(比特幣節點)更新他們的賬簿,這樣每個人都知道鮑勃已經傳送了1 BTC給埃隆·馬斯克。但如何確保別人不會作弊呢?似乎沒有任何保護措施阻止他人改寫這些記錄,其他人能簡單地把這些記錄的所有者變成他們自己,從而竊取這些錢嗎?這個問題,我們稍後再討論。

一旦埃隆·馬斯克聽到廣播,並對交易獲得的確認數感到滿意,他就可以把特斯拉交給鮑勃了。好了,現在埃隆·馬斯克覺得無聊了,他決定從兩個經銷商50 Cent和Snoop Lion手裡購買一些大麻,每人支付0.001 BTC, 埃隆·馬斯克會像鮑勃那樣更新記錄,將交易記錄做成一棵樹,用1 BTC作為根,看起來就是這樣,

現在整個賬本看起來是,

如果鮑勃此時決定再次花費記錄的25個BTC來作弊,他能做到嗎?當然,他可以隨心所欲地畫這棵樹。然而,由於每個人都有一份原始記錄的副本,表明鮑勃已經花費了25個BTC,如果鮑勃試圖廣播偽造的記錄,整個網路將拒絕它,因為它與“真實的”歷史不同。要成功地完成第一層交易,通常需要三個步驟。

1.建立交易,在原來的樹上添上交易,更新原來的樹。

2.在交易上簽字,證明你花的錢屬於你本人。目前,我們使用Owner欄位來表示所有權。稍後,我們會看到,我們在記錄上簽名來花費這筆錢。

3.廣播,將交易記錄傳送到比特幣網路,其他人驗證、確認和更新自己的記錄。

整個過程就像用支票轉賬一樣。任何人都可以在支票上寫上金額,但支票只有在你簽字後才有效,而且收件人需要將支票存入自動櫃員機才算支付完成。你可以但沒必要簽署大量的支票,只要支票成功存入便可以了。在比特幣中,你可以建立大量相同記錄的交易,卻不廣播。因為一經廣播,只會接受(確認)一筆交易。這個特性使閃電網路成為可能,在大多數情況下,閃電網路所做的就是建立交易而不廣播這些交易。

一個小小修改

在真實的比特幣交易中,不會明確記錄支付的交易費用。相反,交易費用是隱式給出的。

建立新交易時,遵循新記錄的比特幣總額不能大於舊記錄總額的規則。便是用舊費用減去新費用的總額來計算所支付的交易費用。在鮑勃的例子中,交易費用為25-23.99999-1=0.00001BTC。更新後的分類帳資料如下所示,

從技術上講,你可以不支付交易費用,但沒有人這樣做,因為這樣你交易會一直懸在空中。

輸入和輸出

到目前為止,我們只提到了單個記錄和單個記錄形成的樹。但交易到底是什麼呢?

在我們的例子中,如果鮑勃決定再次花費比特幣,他將遵循以下步驟,

1.在整個樹中查詢a)屬於他的記錄(所有者:鮑勃)和b)他還沒有花費的記錄,在我們的示例中,餘額是23.9999 BTC。

2.將把23.9999 BTC記錄作為根,並在其上繪製一個新的子樹,子樹上的葉子是傳送給接收者的記錄。

3.將新建立的子樹廣播到網路中,一旦它被驗證,子樹就將包括在整個樹中,也就是每個人手中共享的賬本當中。

根據我們的示例,子樹是最接近代表交易的術語。如果我們將交易過程看成一個管道,將未花費的記錄作為輸入,新建立的記錄作為輸出,交易就是轉化輸入和輸出的一段資訊,回答錢來自哪裡轉向何處的問題。這也表明我們可以同時有多個輸入。如果鮑勃在樹中有多個未花費的記錄,一次只能使用一條記錄,那麼使用這些錢將是一段乏味的體驗。因此,儘管分類賬的結構保持一致,但交易資料卻有所不同,如下圖所示,

鮑勃的交易

埃隆·馬斯克的交易

好奇鮑勃是怎樣得到自己這筆錢的?這裡有一筆coinbase交易,向系統生成比特幣,

Coinbase交易

對於使用比特幣的人來說,需要一直在交易的輸出部分找到未花費的記錄。在比特幣中,不存在賬戶的概念。相反,一個可花費的單元是一個未花費的交易輸出,因此我們將它命名為未花費的交易輸出,簡稱UTXO。在此階段,記錄ID的概念可能會被拋棄。如果你從Transaction 00檢查到Transaction 02,三個交易輸出都在一筆交易當中,三個交易輸入都來自舊交易的輸出,因此沒必要再給每個輸出一個單獨ID。可以參考交易輸出中的序列號,即Transaction 00中的第二個輸出或Transaction 02中的第三個輸出。最終的交易資料如下:

鮑勃的交易

埃隆·馬斯克的交易

於是你有了一個基於交易的系統,即比特幣。現在我們深入探討如何確保交易的安全性。

比特幣指令碼——基礎

在上述的例子當中,要傳送交易時,只需在所有者欄位中寫下接受者姓名,並祈禱其他記賬者不會動用這筆資金。但世界不是這樣運作的。在傳統世界,沒有第三方的干涉、監督與管理,就無法建立信任。比特幣用解決難題的方法建立信任,傳送者建立一個難題,能解決這個難題的人就能花費這筆錢。例如,如果愛麗絲要給鮑勃傳送1個BTC,她會使用自己其中的一個UTXO,並建立一個如下所示的交易,

愛麗絲髮送一個BTC給鮑勃

一旦愛麗絲廣播了這筆交易,網路就會意識到愛麗絲的UTXO已經用完了,誰能解開這個難題,誰就擁有這筆錢。當鮑勃從網路上看到愛麗絲完成付款時,就可以交付之前承諾的商品或服務了。

如果鮑勃想花費他的錢,將錢傳送給查理,他需要,

1.解出UTXO中指定的原本難題,就像解鎖屬於自己的錢一樣。

2.提供一個只有查理答案的新難題,就像用查理的鎖把錢鎖起來一樣。

簡化的交易如下所示,

鮑勃傳送一個BTC給查理

當查理想要使用自己的UTXO時,也是同樣的流程。愛麗絲的UTXO也是來自其他人(或屬於她自己),當她使用它時,她也需要為指定的難題提供一個答案。整個交易全貌如下,

連結在一起的UTXO列表

現在你瞭解了。UTXO由三部分組成,

· 前業主的解決方案;

· 比特幣數量;

· 當前所有者的新難題。

很快,我們將把這三個部分對映到交易的全貌中。

驗證交易

交易難題相當於一把鎖,確保只有特定的所有者才能開啟這把鎖。但作為接收者,如何確定自己已經拿到錢了?

讓我們看看之前的例子,一個簡化的樹結構,

如果想要檢查從埃隆·馬斯克那裡收到的錢是否合法,就要重點檢查這顆樹上的連結串列。

要檢查就需要驗證這個連結串列當中的所有難題解。按降序排列,會是這樣,

· 檢查埃隆·馬斯克提供的解(藍色框)可以解出埃隆·馬斯克的難題(棕色框);

· 鮑勃提供的解(棕色框)可以解出為鮑勃的難題(灰色框);

· 檢查礦工提供的解(即灰色框中的鮑勃)可以解出礦工的難題。

一旦驗證完畢,就能確保交易是合法的。針對所有的記賬者,即比特幣節點,每當他們收到新交易,這個驗證流程是他們在更新自己副本資料前需要做的。針對50美分的最後一步是檢查難題確保錢是給到他。如果是,就等待一段時間,直到該交易獲得足夠的確認數。一旦錢到賬,就能確定這筆錢是屬於他的。

什麼是難題?

難題可以是任何內容,只要它是可計算的。例如,A加B等於4(求A,B),也算是一個簡單的難題。再例如,像宇宙的目的是什麼就不算一個難題,因為這個問題沒有答案,至少這個問題還無法定論。

那麼,從結構和語義上來說,難題到底是什麼呢?

第一步是理解難題使用的語言。當你想讓電腦為你做某事時,你需要說一種它能理解的語言。比特幣存在於電腦中。當你想用比特幣做一個難題時,你必須說它能理解的語言。在這種情況下,難題使用的是一種名為比特幣指令碼的語言。

這個時候你可能會猶豫要不要學習一門外語,其實只要會一些基礎知識你就能明白比特幣的強大。比特幣指令碼是一門相當簡單的語言,我會進行演示,而不用語言來解釋為什麼這樣為什麼那樣,足以讓所有人理解閃電網路的工作原理。如果你感興趣,可以觀看這個講座,以及閱讀這本書。

比特幣指令碼魔法

在紙上做加法時,比如二加三,你只需要寫,

在比特幣指令碼中,你可以這樣寫,

如果你與大多數人一樣,從左讀到右,再從上讀到下,可能會對比特幣指令碼的順序感到迷惑。之所以這樣寫,是因為計算機對事物的理解與常人不同。

要理解比特幣指令碼如何工作,一個方法是想象經典學校遊戲“河內塔”(towers of Hanoi)的畫面。

比特幣使用的是一個變化版本。左邊的一堆盒子,類似比特幣指令碼中的指令。

當比特幣處理它的指令碼時,它用的是一個死板且相當嚴格的方法。它會從左邊的棍子裡拿出一個盒子,然後放到右邊。根據指令的內容,它可以使用預定義的規則執行額外的任務。例如,上面提到的加法指令碼可以表示為:

程式如下,

1.電腦作用於最上面的盒子。在本例中,提取整數2並放到右邊。

2. 再次提取左邊最上面的盒子,即整數3,並將其放到右邊。

3.它一直作用於最上面的盒子,直到提取完所有盒子。最後一個盒子OP_ADD表示加法運算,提取出來並放到右邊。OP_ADD是一個預定義的指令,它所做的就是將下方的兩個盒子相加,並建立一個新盒子來返回總和。所以在右邊的棍子上留下了一個數值為5的盒子。

OP_ADD是許多預定義指令之一,我們將這些指令統稱為指令集或操作碼。完整的指令集可以檢視這裡的連結。本文,我們只重點關注閃電網路的工作的指令集。

比特幣使用的語言被稱為比特幣指令碼。然而,當一組指令放在一起形成一段程式碼時,我們稱之為指令碼。如果把比特幣中的操作碼放在一起,我們也把它命名為一個指令碼,或者更具體地說,一個比特幣指令碼。

指令碼

現在該揭開前面提到的用比特幣指令碼編寫的難題和解對的面紗了。技術術語是鎖定指令碼(puzzle)和解鎖指令碼(solution)。驗證完後,我們會將解鎖指令碼放在鎖定指令碼之上,並透過一個比特幣客戶端執行它。

如果結果錯誤(用數字0表示),通常意味著所提供的解鎖指令碼(解決答案)不正確,因此交易無效。否則,如果結果為正確,且是除0之外的任何整數,則可以確保交易有效。

在我們前面的例子中,指令碼2 3 OP_ADD是一個糟糕的鎖定指令碼,因為它返回了數字5,這意味著驗證結果總是為正確,因此任何人都可以使用5作為答案。如果鮑勃從愛麗絲接收到一個交易,他希望的是隻有愛麗絲提供的鎖定指令碼才能解鎖。

使用一個名為數字簽名的加密應用程式解決了這一問題,數字簽名是當今網際網路上廣泛使用的一種工具。在討論數字簽名時,需要關注四點,

· 簽署的訊息可以是任何內容,從句子到文件。簽署的訊息是鮑勃想要取得所有權的東西。在本例中,是愛麗絲髮送UTXO交易中包裝的內容。

· 私鑰,由鮑勃作為秘密儲存。他使用私鑰對訊息進行簽名,這涉及一個複雜的數學過程並輸出簽名。

· 簽名,使用私鑰簽署訊息的結果。

· 公鑰,一把公鑰匹配一把私鑰。每個公鑰只能對映一個私鑰。正如“公鑰”一詞意味著公開,因此所有人都能看到鮑勃的公鑰。

除了鮑勃的私鑰是隱秘之外,所有交易內容都是公開的。原始訊息、簽名和公鑰之間存在一種奇妙的關係。在私鑰不暴露的情況下,任何人只要知道鮑勃公鑰和原始資訊,就能驗證該簽名是否由鮑勃的私鑰簽署的。由於身處網際網路時代,人們都傾向隱藏一些隱私,所以鮑勃的名字不會公開。鮑勃只需公開自己的簽名和公鑰。在比特幣中,公鑰就代表鮑勃的身份,同時公鑰還有另外一層含義,一旦變化編碼,便是比特幣地址。

現在,比特幣交易是由新UTXO組成,而新UTXO是用舊UTXO作為輸出。每花費一筆UTXO,你需要提供一個解鎖指令碼來解開鎖定指令碼中的難題,併為你的接收者建立新的鎖定指令碼。從結構上看,我們將解鎖指令碼放入輸入部分,新的鎖定指令碼放入輸出部分。一個常見的做法是應用數字簽名,將資金髮送給特定的收件人。譬如鮑勃給愛麗絲髮送1BTC,鮑勃發起的完整交易如下,

除了在指令碼中應用數字簽名,人們還想出了各種各樣的難題。比特幣指令碼確實很強大,閃電網路正是利用了比特幣指令碼的優勢,做出了一個有趣的設計,使比特幣交易達到閃電般的速度。

以下是一筆真實的交易,

注意下圖,輸入指令碼和輸出指令碼是花費的UTXO(舊UTXO)的解鎖指令碼,也是新UTXO的鎖定指令碼。

詳細的解碼交易如下圖所示,

其他方法——多重簽名和時間鎖

在所有的比特幣指令碼中,有三大指令碼功能值得注意,即前面提到的數字簽名,加上下面要講到的多重簽名與時間鎖。

多重簽名是多個簽名(OP_CHECK多重簽名)的縮寫,顧名思義,它是一個涉及到使用多個簽名進行驗證的函式。它檢查提交的簽名,如果簽名相匹配則返回true(正確)。多重簽名就像中國古代的虎符,本質上是一把特殊的鎖,只有匹配的鑰匙才能解鎖。

在比特幣中,多重簽名函式放在鎖定指令碼中,指定要解鎖的簽名。在解鎖指令碼中,花費者(接收者)需要一起提供簽名來解鎖指令碼,這樣他們就可以使用UTXO。

例如,如果愛麗絲和鮑勃決定建立一個共同賬戶,這個共同賬戶需要兩人一致同意才生效,兩人將分別建立一個新的UTXO,如下圖所示,

於是一個賬戶餘額為2BTC的共同賬戶便建立了,由愛麗絲和鮑勃共同決定如何使用。

時間鎖的功能就像比特幣的計時器。它會根據當前時間檢查預置日期,直到給定時間過去後才會繼續執行任務。比如,如果設定在日期2099/01/01 00:00:00之前不進行2+3的計算,我們就會建立類似於2099/01/01 00:00:00,check time lock, 2,3, OP_ADD這樣的任務,它可以表示為,

當我們執行這個指令碼時,因為還沒有達到指定的時間2099/01/01 00:00:00,所以無法執行其他步驟。時間鎖的一個實際作用是延遲付款。如果鮑勃想要給傳送愛麗絲 1個BTC,但是他不希望愛麗絲一個星期後才能花費它,他可以在鎖定指令碼中設定時間限制,

當愛麗絲收到鮑勃的這個UTXO時,她必須等上一個星期,才能滿足步驟1的條件,然後提供自己的簽名來花費這筆UTXO。比特幣中,有應用幾種達到時間鎖的方法。特別的是,閃電網路使用的OP_CHECKLOCKTIMEVERIFY和OP_CHECKSEQUENCEVERIFY。兩種方法工作幾乎相似,只是前一種使用的是絕對時間(例如2019/09/23 00:00:00)提交到一個比特幣塊中,而後者使用一個相對的(例如,未來3天之內)。

瞭解比特幣UTXO和比特幣指令碼了,瞭解閃電網路的工作原理就輕鬆了。

原文:https://blog.goodaudience.com/till-its-lightning-fast-uncover-bitcoin-transactions-9c2a5cc94144

稿源(譯):https://first.vip/shareNews?id=2259&uid=1

免責聲明:

  1. 本文版權歸原作者所有,僅代表作者本人觀點,不代表鏈報觀點或立場。
  2. 如發現文章、圖片等侵權行爲,侵權責任將由作者本人承擔。
  3. 鏈報僅提供相關項目信息,不構成任何投資建議

推荐阅读

;