快速術語檢索
以下文中會可能會用到,以及看此文前可能會需要理解的幾個術語。
地址
比特幣地址(例如:1DSrfJdB2AnWaFNgSbv3MZC2m74996JafV)由一串字符和數字組成,以阿拉伯數字“1”開頭。就像別人向你的email地址發送電子郵件一樣,他可以通過你的比特幣地址向你發送比特幣。
比特幣
“比特幣”既可以指這種虛擬貨幣單位,也指比特幣網絡或者網絡節點使用的比特幣軟件。
區塊
一個區塊就是若干交易數據的集合,它會被標記上時間戳和之前一個區塊的獨特標記。區塊頭經過哈希運算後會生成一份工作量證明,從而驗證區塊中的交易。有效的區塊經過全網絡的共識後會被追加到主區塊鏈中。
區塊鏈
區塊鏈是一串通過驗證的區塊,當中的每一個區塊都與上一個相連,一直連到創世區塊。
哈希
二進制數據的一種數字指紋。(比特幣中大部分使用的是SHA256)
網絡
比特幣網絡是一個由若干節點組成的用以廣播交易信息和數據區塊的P2P網絡。
私鑰
用來解鎖對應(錢包)地址的一串字符,例如5J76sF8L5jTtzE96r66Sf8cka9y44wdpJjMwCxR3tzLh3ibVPxh。
交易
簡單地說,交易指把比特幣從一個地址轉到另一個地址。更準確地說,一筆“交易”指一個經過簽名運算的,表達價值轉移的數據結構。每一筆“交易”都經過比特幣網絡傳輸,由礦工節點收集並封包至區塊中,永久保存在區塊鏈某處。
私鑰、公鑰、地址
聊到交易,不得不先提下這三樣東西。私鑰運算可以產生公鑰,公鑰運算可以產生地址(又可成爲Public Key Hash,公鑰哈希),並且其中的運算雖然開源但是都不可逆。
詳細步驟:
由上圖可以看出,第一步是私鑰,經過ECDSA,也就是橢圓曲線算法得到公鑰,然後公鑰要經過數個步驟到第9步,才能得到比特幣交易中的地址。很明顯,大部分人會有疑問,6,7步SHA256爲什麼要執行兩次,原因是這張圖做的不夠直觀,具體可以看下圖:
可以說,地址就是公鑰經過SHA256+RIPEMD160之後的產物,原先6,7步的SHA256只是爲了在末尾添加校驗碼。因爲SHA256+RIPEMD160都是作用在二進制層面的,最後使用BASE58還原爲易於人所能識別的錢包地址。因此,地址有可以稱爲公鑰哈希。
交易標準
爲了讓所有節點都能識別交易,因此將交易信息標準化是必不可少的,比特幣的區塊鏈社區主要支持以下五種交易標準:P2PKH、P2PK、MS(限15個密鑰)、P2SH和OP_Return。OP_Return將不會介紹,因爲其存儲的是信息(或者說只是字節),並非比特幣貨幣。
比特幣腳本語言:
可以理解爲類HTML的語言,所有的節點都能理解,並且按照步驟進行編譯。而在交易過程中,發送方會將自己的UTXO(字符串,在比特幣區塊鏈中能代表一定數額的比特幣,使得比特幣可以追蹤)使用鎖定腳本進行鎖定,鎖定在接收方的地址上(也就是表示只有證明自己是接收方,才能夠使用)。接收方如果要使用,必須使用解鎖腳本,證明自己是這個地址的主人,各個節點才認可這筆交易。
在比特幣社區使用的腳本語言,是一種基於逆波蘭表示法的基於堆棧的執行語言。如下圖:
P2PKH(Pay-to-Public-Key-Hash):
現在的比特幣網絡上,大部分交易都是以P2PKH的方式進行的,以下是P2PKH的鎖定腳本與解鎖腳本:
<sig>表示簽名,<PubK>表示Public Key,具體操作步驟如下:
可以看出,主要驗證兩個驗證,第一是Public Key是否能夠轉換成正確的地址,第二是Signature是否正確,也就是證明你是否是這個Public Key的主人。
Signature簽名:
簽名內容主要是此交易摘要(也就是交易信息的Hash)與私鑰進行運算。驗證的話,將簽名與公鑰進行運算,如果能正確的得到交易摘要,則成功。
P2PK(Pay-to-Public-Key)
P2PK鎖定版腳本形式如下:
<Public Key A> OP_CHECKSIG
用於解鎖的腳本是一個簡單簽名:
<Signature from Private Key A>
經由交易驗證軟件確認的組合腳本爲:
<Signature from Private Key A> <Public Key A> OP_CHECKSIG
根據上方的規則去運行就可以發現,此規則比P2PKH要簡單的多,只有一步驗證,少了上方的地址驗證。其實,P2PKH被創建主要目的一方面爲使比特幣地址更簡短,使之更方便使用,核心內容還是P2PK的。
MS(Multiple Signatures)多重簽名
通用的M-N多重簽名鎖定腳本形式爲:
M <Public Key 1> <Public Key 2> ... <Public Key N> N OP_CHECKMULTISIG
其中,N是存檔公鑰總數,M是要求激活交易的最少公鑰數。
例如,2-3多重簽名條件:
2 <Public Key A> <Public Key B> <Public Key C> 3 OP_CHECKMULTISIG
上述鎖定腳本可由含有簽名和公鑰的腳本予以解鎖:
OP_0 <Signature B> <Signature C>
OP_0爲佔位符,沒啥實際意義。
兩個腳本組合將形成一個驗證腳本:
OP_0 <Signature B> <Signature C> 2 <Public Key A> <Public Key B> <Public Key C> 3 OP_CHECKMULTISIG
P2SH(Pay-to-Script-Hash)
P2SH是MS多重簽名的簡化版本,如果使用P2SH進行和上方相同的2-3多重簽名條件,步驟如下:
鎖定腳本:
2 <Public Key A> <Public Key B> <Public Key C> 3 OP_CHECKMULTISIG
對鎖定腳本,首先採用SHA256哈希算法,隨後對其運用RIPEMD160算法。20字節的腳本爲:
8ac1d7a2fa204a16dc984fa81cfdf86a2a4e1731
於是鎖定腳本變爲:
OP_HASH160 8ac1d7a2fa204a16dc984fa81cfdf86a2a4e1731 OP_EQUAL
此鎖定腳本要比原先使用MS的鎖定腳本要簡短的多,當接收方要使用此交易中的UTXO時,需要提交解鎖腳本(這裏又可稱爲贖回腳本):
<Sig1> <Sig2> <2 PK1 PK2 PK3 PK4 PK5 5 OP_CHECKMULTISIG>
與鎖定腳本相結合:
<Sig1> <Sig2> <2 PK1 PK2 PK3 PK4 PK5 5 OP_CHECKMULTISIG> OP_HASH160 8ac1d7a2fa204a16dc984fa81cfdf86a2a4e1731 OP_EQUAL
使用逆波蘭表達式運算,就能很明顯的得知,驗證過程分兩步,首先驗證的是接收方附上的贖回腳本是否符合發送方的鎖定腳本,如果是,便執行該腳本,進行多重簽名的驗證。
P2SH的特點是,將製作腳本的責任給了接收方,好處是可以暫緩節點存儲的壓力。