區塊鏈基礎知識篇——《精通比特幣》第五章“交易”解讀

通過本章的學習,我們能瞭解到比特幣交易所包含的信息、交易如何被創建、如何被驗證。對於產品和研發人員實現數字錢包的應用功能,有非常直觀的借鑑意義。

建議閱讀時長:5分鐘左右

第1節 交易概述

交易是比特幣系統最重要的部分。根據比特幣系統的設計原理,系統中任何其他的部分都是為了確保比特幣交易可以被生成、能在比特幣網絡得以傳播和通過驗證、並最終加入全球比特幣交易總帳薄。

通過比特幣客戶端可以創建並廣播交易。比特幣交易是一個含有輸入值和輸出值的數據結構,該數據結構中植入了將一筆資金從指定的比特幣地址轉移至目標地址的代碼信息。比特幣客戶端會維護一套節點地址列表(即挖礦節點的地址列表),當交易創建完成後,會將交易信息通過比特幣網絡廣播到所維護列表中的節點,節點驗證交易有效後,會繼續廣播至與其相連的其他節點,就這樣,一筆交易很快會被所有節點接收到,當礦工通過挖礦將這筆交易加入到新區塊、且大部分節點在該新區塊的基礎上開始工作後,這筆交易就成為了比特幣交易總賬簿的一部分。

比特幣系統並不存儲比特幣地址的餘額,比特幣是分散在各個區塊交易記錄中的,當一筆交易中的收款地址還未用於新的支付時,這個收款地址即對應著一筆可用的未消費UTXO

(全稱Unspent Transaction Output)。UTXO是比特幣交易的基本單位,不可再拆分,就像紙幣一樣,當一張紙幣大於待付金額時,不能將紙幣撕成幾段,只能整體支付後,再接收找零。

所以比特幣交易的輸入,是將1個或多個UTXO組合成足額大於等於待支付的金額;比特幣交易的輸出,是輸出新的UTXO到接收方的收款地址中,同時會創建用於找零的UTXO。輸入和輸出之間的差額即為獎勵給礦工的交易手續費。

比特幣錢包是如何知道用戶有哪些未消費的UTXO用來支付呢?

這可以從”第4章 密鑰、地址和錢包“中的知識來理解。當用戶剛開始使用一個新的比特幣客戶端時,可以通過各種方式導入已有的私鑰。當導入私鑰後,比特幣錢包會根據該私鑰自動生成對應的比特幣地址,然後錢包用這些地址去掃描區塊鏈,得到比特幣地址上每個還未消費的UTXO記錄。最終比特幣錢包客戶端本地會維護一套未消費的UTXO數據庫,用於支付時作為交易輸入。

第2節 交易輸出

給某人發送比特幣實際上是創造新的UTXO,註冊到那個人的地址,並且能被他用於新的支付。

交易輸出包含兩部分:一定量的比特幣和一個鎖定腳本。鎖定腳本,是用來支付時必須滿足的條件,只有滿足鎖定腳本中的條件,才能動用這筆UTXO輸出比特幣給其他人。鎖定腳本中包含了接收方的比特幣地址。

第3節 交易輸入

若想支付UTXO,一個交易的輸入也需要包含解鎖腳本,用來滿足UTXO的支付條件。解鎖腳本是一個簽名,用來證明對於在鎖定腳本中的比特幣地址擁有所有權。

當用戶付款時,錢包需要選擇特定的UTXO來滿足付款額,比如需要支付1BTC,錢包應用會選擇一個包含0.4BTC的UTXO和0.7BTC的UTXO,加在一起用於支付。多餘的0.1BTC,客戶端可指定作為找零打到支付方的比特幣地址中。若指定了獎勵給礦工的手續費,這時除去手續費之後剩餘的部分也會找零到指定地址。

當然,比特幣客戶端中維護了一套未消費的UTXO數據庫,如何從庫裡面選擇最優的UTXO組合,也是錢包要實現的功能。

說明:礦工的交易手續費,是基於交易的字節長度來計算的,而不是基於交易金額的價值。

所以,交易輸入的步驟是:選定最優的UTXO—>為每個UTXO生成解鎖腳本—> 當解鎖腳本驗證通過後—>可正常創建交易輸出。

第4節 腳本驗證

原書中,講解了比特幣系統中5種標準腳本的原理和使用背景,感興趣的朋友可以深入學習。本節以P2PKH(Pay-to-Public-Key-Hash)為例,主要講講解鎖腳本是如何驗證鎖定腳本的。

比特幣網絡中的大多數交易都是P2PKH交易,此類交易都含有一個鎖定腳本,由P2PKH腳本鎖定的輸出可以通過鍵入公鑰和由相應私鑰生成的數字簽名進行匹配來解鎖。

解鎖過程與第四章原理一致,如下:

1.先由私鑰生成公鑰;

2.將公鑰通過哈希算法得到公鑰哈希

3.將解鎖腳本和鎖定腳本組合在一起,比對由私鑰生成的公鑰哈希與鎖定腳本中的公鑰哈希是否匹配,若匹配成功,則符合解鎖條件;否則無法使用該UTXO中包含的比特幣。

第5節 總結

通過本章的學習,我們瞭解了比特幣交易所包含的信息、交易如何被創建以及如何驗證是否對UTXO中的比特幣擁有支配權。

本章對於產品和研發人員實現數字錢包的應用功能,有非常直觀的借鑑意義。

文章首發於公號“Tina說”



分享到:


相關文章: