比特幣白皮書圖解--如何轉賬

比特幣白皮書圖解--如何轉賬

比特幣白皮書圖解--如何轉賬

編者按:本文由Peter 王廣忠的技術分享,轉載請註明來自Peter 王廣忠,並聯系作者獲得授權。Peter 王廣忠,程序員,專業區塊鏈講解員

本節來介紹一下比特幣如何進行轉賬,過程中會涉及比特幣地址,私鑰以及如何用數字簽名簽署交易這些問題。

比特幣地址和餘額

當我們最開始去持有比特幣的時候,系統會先給我們生成兩串數,一個是比特幣地址,另一個是讓我們能夠轉出這個地址中的幣的私鑰。

我們用地址去接收他人的轉賬。如果我跟 Alice 買了一個比特幣,那麼只需要給她我的地址,她就可以構建一個交易,把幣轉給我了。這裡涉及到一個交易輸出的概念,注意交易輸出是一個術語,後面咱們會頻繁用到。簡單來說,在 Alice 構建的交易中,交易輸出指的就是交易金額加上我的比特幣地址。很容易想到的是交易還應該有輸入,這個我們一會兒再說。

地址中並不直接存放比特幣。需要明確的是,比特幣大賬本上並沒有直接記錄一個地址下到底有多少餘額,大賬本上記錄的只有交易,而且是歷史上的所有人的所有交易。一個地址中的到底有多少餘額是軟件幫我算出來的:軟件會去找所有跟我地址相關的交易輸出,減去已經花費掉的交易輸出。每一個沒有被花費過的輸出就是一個”未花費交易輸出“,英文叫 Unspent Transaction Output ,簡稱 UTXO ,有人說比特幣就是 UTXO ,也是很有道理的。

那麼什麼叫做花費一個交易輸出呢?還是回到 Alice 給我轉賬的情景。Alice 構建的交易中肯定還是要有輸入的。而輸入就是 Alice 自己以前的交易輸出,同時這些交易輸出必須是沒有花費過的,也就是 UTXO 。比如之前有兩次交易輸出指向 Alice 的地址,其中一個是0.3個幣,另一個是0.8個幣,那麼 Alice 構造交易的時候,就要把這兩個 UTXO 都拿出來作為交易的輸入,因為這樣才能湊夠要給我的1個比特幣,當然,交易生成的時候,系統會自動找零的。白皮書中第九部分《價值的組合和分割》就是討論這個過程的。

這樣,我們就理解了地址和餘額都是怎麼回事了。

數字簽名

接下來要考慮的是交易發起人身份認證的問題,因為要保證每一條交易都是對應的比特幣持有者發出的。這個要涉及數字簽名這個概念。理解數字簽名首先也要理解哈希的概念,這個咱們就不展開了,大家搜我之前的文章中有過專門的介紹。

我們需要一種不可以被拷貝的簽名。生活中如果要簽署一張支票,那就直接簽名即可。但是簽名這種形式在電子世界中使用就要考慮如何防止一個簽名被拷貝並重復使用的問題。公鑰密碼學的數字簽名恰好就是一種不能被拷貝並重復使用的簽名。如果我用私鑰對一個信息進行簽名,那實際上就是先運算這個信息的哈希,然後用私鑰對這個哈希進行加密,那麼最終得到的密文就叫做數字簽名。簽名是跟信息綁定在一起的,如果信息被改動了哪怕一個字,那麼數字簽名就會馬上失效。所以,攻擊者不能拷貝我的數字簽名去簽署他偽造的一條交易信息,去花我的錢。

別人怎麼知道簽名是我發出的。我在構造交易的時候也會把我的公鑰公佈給全網的,你可能會說咱們手裡沒有公鑰啊,實際上這個不成問題,有私鑰隨時都能運算出公鑰。簽名是私鑰加密的產物,私鑰加密的東西是可以去用公鑰解密的,這個是公鑰密碼學的基本原理。大家看到交易信息,數字簽名和我的公鑰之後,就可以去證明兩點:第一,如果公鑰解密簽名成功,就可以證明交易的確是由私鑰的持有者,也就是我,發出的;第二,如果解密後得到哈希和再次運算交易信息的哈希得到的結果相同,那麼就證明了交易信息是沒有被篡改過的。

數字簽名是公鑰密碼學的基礎知識,在比特幣出現之前很早就被廣泛使用了,所以白皮書上沒有展開介紹,直接就在摘要部分提到

Digital signatures provide part of the solution

數字簽名可以解決部分問題。意思是說,數字簽名可以用來確認簽署人身份,但是不能防止雙花問題。雙花問題我們下一節再解釋。

數字簽名鏈

白皮書的第二部分《交易》就是本節討論的主體內容,不過白皮書上寫的比較精簡,我在這裡補充了一些知識進來。這裡有這麼一句話

We define an electronic coin as a chain of digital signatures. 我們把一個電子硬幣定義為一個數字簽名鏈。

這句話不太好理解,這裡我們展開一下。首先說什麼是一個電子硬幣呢?UTXO 在被花費的時候,是不能掰開來用的,這一點跟一個硬幣很像。第一個用戶想要把自己的這個硬幣轉給第二個用戶,只需要把這個硬幣相關的交易和第二個用戶的地址組成一條信息,然後用私鑰去對這條信息的哈希進行加密獲得數字簽名即可。第二個用戶想要繼續把這個幣轉給第三個用戶,也是完全一樣的過程,在新交易中再次做數字簽名即可。所以這個幣會出現在一連串的交易中,跟一連串的數字簽名相關,所以說一個幣就是一個數字簽名鏈。

不過白皮中畫的跟我們剛剛描述的還是有點差異。白皮書這裡沒有涉及地址,而是把幣轉給公鑰了。地址是公鑰的哈希,所以把幣跟地址和公鑰綁定都同樣能體現幣到底是輸入哪個私鑰持有者的。實際中地址更簡短,而且有一些自我查錯功能,所以用起來更方便一些而已,原理上跟白皮書中描述的是完全一致的。

到這裡,交易的基本組成和數字簽名鏈的概念我們就清晰了。

總結

本節介紹了持有比特幣是怎麼回事,以及網絡如何通過數字簽名來確認簽署人的身份。這樣就能保證別人不能去花我的幣。但是伴隨而來的問題是,系統如何防止一個人去多次花費自己的同一個幣,也就是防止雙花問題,這個問題我們後續小節中再解釋。


分享到:


相關文章: