「我家今晚沒人,這是我的地址。」
我們昨天介紹了區塊鏈的基本架構,
知道交易紀錄如何在區塊鏈上保存、連接。
從最外層開始看起,
區塊鏈裡面有區塊,由礦工去更改Nonce值,
最後將這些區塊用哈西值 (雜湊值)鏈起來,達到不可竄改性。
區塊裡面包含幾個部分:
使用的版本、難度、上一區塊的雜湊值、交易資料的Merkle Root、時間戳記、Nonce
我們在兩天前有秀過區塊的內容。
今天我們要更著重於交易資訊內容裡非常重要的資訊:地址。
先放上一個交易內容。
這可不是普通的交易,這個是比特幣有史以來第一個交易。
可以看到此交易的雜湊值,以及金額50BTC,時間是2009/01/04
新產生的比特幣轉到某個人的帳戶(1A1zP1eP5QGefi2DMPTfTL5SLmv7DivfNa)裡,
而這個人大概就是中本聰。
(之後還有很多人打幣給他,所以餘額並不是50BTC)
不過那並不是重點,
今天的重點是,這個地址是怎麼回事。
標題下的很爛,不過就是這麼回事。
區塊鏈的地址是由「私鑰→公鑰→地址」的流程變來的,
私鑰變公鑰,公鑰不能變私鑰這件事情我們已經知道了,
那地址能不能變公鑰呢?
答案是不行。
先賣個關子,等你看完應該就理解了,我們還是一步一步來,從頭開始。
比特幣的私鑰為256位元,
可以從0x1到
0xFFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFE BAAE DCE6 AF48 A03B BFD2 5E8C D036 4140
中任選一個數字,每一個數字在secp256k1這個橢圓曲線上都是可行的。
我們都會有一個疑問,隨機挑一個數字真的可行嗎?
如果我跟另外一個人挑到一樣的數字,那不就完了?
答案是,還真的完了。
雖然完了,但也不太可能發生。
256位元就意味著總共有 個數字,或者說1.16 × 個數字
而全球人口四捨五入後不過就(100億),要想抽到同一個數字實在不簡單。
所以實在沒有碰撞的可能性。
公鑰由私鑰產生,而比特幣使用的是 secp256k1 這個橢圓曲線,
還記得我們在說明ECC(DAY 15)時有說到
K=k*G
其中K是公鑰,k是私鑰,G是基點,
G的壓縮型是
02 79BE667E F9DCBBAC 55A06295 CE870B07 029BFCDB 2DCE28D9 59F2815B 16F81798
藉由運算就可以得到相對應的私鑰。
橢圓曲線是在直角坐標上點的運算,因此會有x座標和y座標。
而壓縮型就是在表示時不標示y座標,因為 y 是可以從 x 推算出來的。
雖然如此,橢圓區線上同一個 x 座標可以對應到兩個 y 座標,
於是我們需要在公鑰前加上前綴(prefix)。
所以你可以回去看到基點G的開頭是02,代表這是一個壓縮型的表示方式且y座標 > 0
而未壓縮型的G是
04 79BE667E F9DCBBAC 55A06295 CE870B07 029BFCDB 2DCE28D9 59F2815B 16F81798 483ADA77 26A3C465 5DA4FBFC 0E1108A8 FD17B448 A6855419 9C47D08F FB10D4B8
兩個表示方式的長度差了一倍。
地址是由公鑰導出來的,
首先會先過兩層雜湊函數,第一個是SHA-256,第二個是ripemd160(也是雜湊函數)。
我稱這個運算後的值為公鑰雜湊值好了
*我們等一下會組合成一個值,我稱它為「準地址」,這個值接著使用base58編碼後就會成為地址。
準地址由三個部分組成,0x00、公鑰雜湊值、校驗格。依序排列。
其中校驗格 = SHA(SHA(0x00公鑰雜湊值))的前四位元組(byte)
以上是 P2PKH (Pay to Public Key Hash) 格式的地址產生方式,他的開頭會是1。
另外一種P2SH (pay to script hash)格式是比較新的表示方法,開頭是3。
他的生成方式如下,我就不一一解釋了。
P2PKH和P2SH有不同的性質,在交易上會有差別,
不過那個不是我們今天的討論範圍,有興趣的人可以去讀 這篇。
大概是鐵人30天目前花最多時間的一篇(還自己做圖天啊)
因為是沒有學過的東西,所以花蠻多時間統整資料的,
若有錯誤再請不吝指教。
那麼,明天見!
參考資料:
https://know.zombit.info/私鑰公鑰與地址/
https://www.0x1.academy/wallet/address
https://medium.com/coinmonks/how-to-generate-a-bitcoin-address-step-by-step-9d7fcbf1ad0b
https://en.bitcoin.it/wiki/Private_key