八、公鑰/私鑰/Public Key Hash/P2PKH
在前面第2課,我們粗略引入了比特幣網路中賬號的概念。在此課,我將對賬號相關的幾個概念,做更深入的闡釋,這部分也是整個區塊鏈技術的基礎。
一、公/私鑰 公/私鑰的基本思路是:每個使用者生成1對公/私鑰,相當於賬號與密碼。
A給B轉賬,先用A的私鑰簽名,再把錢打入B的公鑰,只有B能用自己的私鑰解密。
這裡有2個關鍵點:(1)這筆交易是公開的,其他人都可以看到,但只有B有私鑰,可以解鎖這筆錢。(2)A的公鑰也是公開的,雖然B不知道A的私鑰,但B可以用A的公鑰來驗證,這筆交易的簽名用的是A的公鑰對應的私鑰,證明了這筆錢是A轉給B的,而不是C轉給B的。
反之亦然,B給A轉賬,先用B的私鑰簽名,再把錢打入A的公鑰。A收到這筆交易,同樣的可以驗證上面的2點。
二、比特幣地址(錢包地址) 在上面呢,通俗的介紹了公/私鑰的大致思路。但在比特幣網路裡,實際是有4個概念: 私鑰(Private Key) 公鑰(Public Key) 公鑰Hash (Public Key Hash) 錢包地址(Bitcoin Address)
下面這張圖展示了這4個概念之間的關係,以及生成機制:
Private Key:隨機生成的1長串數字
Public Key: 通過橢圓曲線函式,由私鑰生成公鑰。
Public Key Hash: 由Public Key,經過Hash160的計算得到。所謂Hash160,是指先進行1次SHA256運算,再進行1次RIPEMD160運算,最後算出來的Public Key Hash是160 bits。
Bitcoin Address: 把Public Key Hash,經過Base58Check編碼,得到Bitcoin Address,也就是交易轉賬最終用的地址。
這裡面有幾個關鍵點: (1)由箭頭可以看出,前2個轉換是單向的,不可逆。公鑰是公開的,但沒辦法通過公鑰反算出私鑰;也沒辦法通過Public Key Hash 反算出Public Key。
(2)最後1個是可逆的,一個Encode/Decode的過程。 所以你可以認為,Public Key Hash 和 Bitcoin Address本質是一個東西,只是編碼方式不一樣。
(3)那為什麼不直接拿Public Key當Bitcoin Address,而要再加1層 Public Key Hash呢? 這就涉及到1個抽象的問題。在比特幣網路中,Bitcoin Address是一個抽象的概念,在這個場景中,背後代表的是Public Key;在其他場景中,可能是一個Script Hash,而不是Public Key Hash。 關於用Script Hash做比特幣地址,是個很關鍵的話題,後面會專門講述。
三、簽名 簽名公式如下: Sig = Fsig(Fhash(transaction), private key)
也就是,先對Transaction進行1次Hash運算,把這個Hash值 + private key,經過一個簽名函式的計算,得到簽名值。
關鍵點:簽名是用私鑰來籤的,以此來證明轉賬的錢,是來自“我”。
四、基本交易型別 P2PKH 有了比特幣地址,其實也就是Public Key Hash,就有了一個最常見的交易型別,叫做P2PKH(Pay to Public Key Hash),付款給對方的Public Key Hash。
另外一個交易型別,就是P2SH(Pay to Scirpt Hash),後面會專門講述。
五、總結 任何時候,A給B轉賬的一筆交易,都會先用A的私鑰簽名,再發給B的公鑰(這裡是Public Key Hash,而不是直接是Public Key)。
以此,達到2個目的:(1)證明了這筆錢的確是來自A (2)這筆錢,只有B能解鎖,能使用。
A的私鑰簽名,叫做scriptSig;發給B的公鑰,叫做scriptPubKey。 這2個東西非常關鍵,後面會詳細講解他們的運作機制。