在位元幣區塊鏈中,交易是最核心的內容。通過前面的講述,我們知道,位元幣通過基於密碼學的公私鑰體系,交易的發起者可以使用自己的私鑰對交易進行簽名,其他人可以使用其公鑰進行驗證,這就從數學上保證了使用者資金的安全。那麼其交易具體是怎麼構建的呢?
在中本聰的***裡,位元幣被定義成乙個鏈式的數字簽名串。幣的擁有者通過對前一次交易和下一次擁有者的公鑰簽署乙個數字簽名,並將這個簽名附加在這筆交易的當中,來完成一筆轉賬。而轉賬的收款人通過對簽名進行驗證,就能夠驗證該鏈條的所有者是不是傳送方。
交易的運作圖如下:
這樣設計的交易體系的問題在於收款人很難校驗之前的某位資產擁有者是否進行了雙重支付(雙花)。通常的解決方案是引入可信的第三方,如銀行,來對每一筆交易進行檢驗,以防止雙重支付。而如果想要排除第三方中介機構,那麼交易資訊就應當被公開,需要整個系統內的所有參與者,都有唯一公認的歷史交易序列。收款人需要確保在交易期間絕大多數的節點都認同該交易是首次出現。
位元幣區塊鏈本質上可以說是乙個基於網際網路的去中心化的賬本系統,而這個賬本上記載的,就是一筆筆位元幣位址之間的轉賬交易,一筆具體的交易過程如上面所示,那整個系統該如何構建呢?。
常常有一種簡單化的說法,將位元幣公鑰模擬為使用者的銀行卡號,也即使用者的賬戶。那麼最容易想到的交易系統的記錄方式是以賬戶為基礎的,簡化的示意圖類似這樣:
這種記賬方式是最容易想到的,然而位元幣區塊鏈並沒有採用這種方式。重要的事情說三遍,位元幣的交易系統不是這樣的,不是這樣的,不是這樣的。原因很簡單,如果採用這種記賬方式的話,每當要進行一筆新交易的時候,系統都不得不回溯該所有交易歷史,這樣才能確定最新的這筆交易是不是合法,如上圖所示,使用者c有這些錢嗎?當系統龐大、交易數量眾多的時候,每次都進行這樣的檢驗無疑是笨重低效的。
utxo(unspent transaction outputs)是未花費的交易輸出,它是位元幣交易生成及驗證的乙個核心概念。交易構成了一組鏈式結構,所有合法的位元幣交易都可以追溯到前向乙個或多個交易的輸出,這些鏈條的源頭都是挖礦獎勵,末尾則是當前未花費的交易輸出。所有的未花費的輸出即整個位元幣網路的utxo。
位元幣規定每一筆新的交易的輸入必須是某筆交易未花費的輸出,每一筆輸入同時也需要上一筆輸出所對應的私鑰進行簽名,並且每個位元幣的節點都會儲存當前整個區塊鏈上的utxo,整個網路上的節點通過utxo及簽名演算法來驗證新交易的合法性。這樣,節點不需要追溯歷史就可以驗證新交易的合法性。
位元幣的交易,並不是通常意義的一手交錢一手交貨的交易,而是轉賬。如果每一筆轉賬都需要構造一筆交易資料會比較笨拙,為了使得價值易於組合與分割,位元幣的交易被設計為可以納入多個輸入和輸出。即一筆交易可以轉賬給多個人。從生成到在網路中傳播,再到通過工作量證明、整個網路節點驗證,最終記錄到位元幣的區塊鏈,就是交易的整個生命週期。
交易的本質是乙個包含交易傳送方、接收方、資產轉移等相關資訊的資料結構,其資料結構如下:
字段描述
大小版本
這筆交易參照的規則
4 位元組
輸入數量
交易輸入列表的數量
1 - 9 位元組
輸入列表
乙個或多個交易輸入
不定輸出數量
交易輸出列表的數量
1 - 9 位元組
輸出列表
乙個或多個交易輸出
不定鎖定時間
鎖定時間
4 位元組
從整體結構來看,交易主要的兩個單元字段就是交易的輸入與輸出。輸入標識著交易的傳送方,輸出標識著交易的接收方及對於自己的找零,交易的手續費則是輸入的總和與輸出的總和之差。由於所有的交易輸入必然是前面某筆交易的輸出,所以交易最核心的字段是交易的輸出。
一筆交易的資料結構圖如下所示:
位元幣的交易輸入(txin)有三種,分別是standard txin(標準輸入)、spend coinbase txout(花費挖礦獎勵)、coinbase/generation(產生挖礦獎勵),下圖分別描述了這三種txin的結構:
位元幣的交易輸出(txout script)有兩種,分別是standard txout (標準交易輸出)、coinbase txout (挖礦獎勵輸出),下圖分別描述了這兩種txout的結構:
指令碼是交易裡另乙個比較重要的技術。每一筆交易的每一項輸出嚴格意義上並不是指向乙個位址,而是指向乙個指令碼。指令碼類似一套規則,它約束著接收方怎樣才能花掉這個輸出上鎖定的資產。
交易的合法性驗證也依賴於指令碼。目前它依賴於兩類指令碼:鎖定指令碼與解鎖指令碼。鎖定指令碼是基於可變的模式,通過一段指令碼語言來實現,位於交易的輸出。解鎖指令碼與鎖定指令碼相對應,只有按鎖定指令碼的規則去解,才能花掉這個指令碼上對應的資產,位於交易的輸入。指令碼語言可以表達出無數的條件變種。這也是位元幣作為一種「可程式設計的貨幣」所擁有的特性。而解釋該指令碼是通過類似我們程式設計領域裡的「虛擬機器」,它分布式執行在位元幣網路裡的每乙個節點。
位元幣的指令碼目前常用的主要分為兩種,一種是普通的型別p2pkh(pay-to-public-key-hash),即支付給公鑰的雜湊即位址,接收方只需要使用位址對應的私鑰對該輸出進行簽名,即可花掉該輸出。另一種是p2sh(pay-to-script-hash),支付指令碼的雜湊。拿多重簽名來舉例,它要求該輸出同時要有n把私鑰中的m把私鑰(m<=n)同時簽名才能花掉該資產,它類似於現實生活中需要多把鑰匙才能同時開啟的保險櫃,只是更加靈活。
比如在位元幣中,p2pkh的指令碼規則如下:
pubkey script: op_dup op_hash160 op_equalverify op_checksigp2sh的指令碼規則如下:signature script:
pubkey script: op_hash160 op_equal在上述的2種指令碼規則裡,pubkey script代表著鎖定指令碼,signature script代表著解鎖指令碼。op_開頭的單詞是相關的指令碼命令,也是」虛擬機器」所能解析的指令。這些命令規則根據pubkey script的不同來進行劃分,它也決定著解鎖指令碼的規則。signature script: [sig] [sig...]
位元幣中的指令碼機制相對簡單,只是乙個基於堆疊式的,解釋相關op指令的引擎,能夠解析的指令碼規則並不是太多,不能實現很複雜的邏輯。但它為區塊鏈可程式設計提供了乙個原型,後續一些可程式設計區塊鏈專案其實是基於指令碼的原理發展起來的,比如以太坊,就是深入強化了指令碼機制,指令碼機制裡不再單單是簡單的op指令,而是支援指令碼語言,該指令碼語言可以通過」虛擬機器」去執行。以太坊實現了乙個支援圖靈完備指令碼語言的區塊鏈平台。
指令碼的機制對於區塊鏈來說非常重要,它類似於區塊鏈技術提供的乙個擴充套件介面,任何人都可以基於這個介面,去開發基於區塊鏈技術的應用,比如智慧型合約的功能。指令碼機制也讓區塊鏈技術作為一項底層協議成為可能。未來很多基於區塊鏈的顛覆性應用,都有可能是通過區塊鏈的指令碼語言來完成的。
以上簡述了位元幣區塊鏈中交易的過程和相關的重要概念。限於篇幅,在這裡省略了一些可以拓展的內容。到目前為止,我們講述的內容,包括上一節講述的公私鑰,都是與使用者的使用直接相關的。
位元幣的UTXO模式解讀及指令碼約束淺讀
在位元幣區塊鏈中,交易是最核心的內容。通過前面的講述,我們知道,位元幣通過基於密碼學的公私鑰體系,交易的發起者可以使用自己的私鑰對交易進行簽名,其他人可以使用其公鑰進行驗證,這就從數學上保證了使用者資金的安全。那麼其交易具體是怎麼構建的呢?在中本聰的 裡,位元幣被定義成乙個鏈式的數字簽名串。幣的擁有...
區塊鏈 位元幣的賬戶模型 UTXO
在位元幣中,是不存在乙個中心化的機構對位元幣的交易進行結算清算的,自然也就沒有中心化的資料庫對使用者的賬戶進行管理。事實上,在位元幣系統中是沒有賬戶這個概念的,取而代之的是utxo unspent transaction output 即未消費的交易輸出。這是中本聰的乙個極其天才的設計。通過utxo...
位元幣節點搭建,相關資料及遇到的坑
子隱 1.環境ubuntu18,硬碟建議盡量大,最少500g,節點資料一直增多。cd opt wget 解壓tar zxf bitcoin 0.18.0 x86 64 linux gnu.tar.gz 建立軟連線 此步驟可省略 ln fs opt bitcoin 0.18.0 opt bitcoin...