這是我的第六篇研讀記錄泻肯,每天擠一點(diǎn)時(shí)間邊學(xué)邊寫(xiě)海洼,歡迎大家拍磚。
公鑰
1休里、公鑰的生成
公鑰通過(guò)私鑰與橢圓曲線相乘而得蛆挫,公式為
K=k*G
k:是私鑰
G:稱為生成點(diǎn)的常數(shù)點(diǎn)(坐標(biāo)點(diǎn))
K:所得的公鑰
上述公式并不是一個(gè)簡(jiǎn)單的乘法運(yùn)算,而是一個(gè)幾何運(yùn)算妙黍,涉及到一個(gè)橢圓曲線運(yùn)算
2悴侵、橢圓曲線
橢圓曲線源于橢圓弧長(zhǎng)的,橢圓積分的反函數(shù)拭嫁。比特幣中的橢圓曲線是用美國(guó)國(guó)家標(biāo)準(zhǔn)與技術(shù)研究院(NIST)設(shè)立的secp256K1標(biāo)準(zhǔn)可免。公式:y2modp=(X3+7)modp
其坐標(biāo)范圍(0,1.158x10^77-1)做粤,與之前的私鑰空間范圍相同浇借。
3、橢圓曲線坐標(biāo)
由于x驮宴、y限定范圍非常大逮刨,導(dǎo)致整個(gè)數(shù)值也非常大呕缭,又因?yàn)樗请x散的堵泽,所以要找到相同點(diǎn)非常難修己。在secp256k1的標(biāo)準(zhǔn)下它的坐標(biāo)值非常大,無(wú)法用我們所知的個(gè)十百千萬(wàn)來(lái)描述迎罗,它的源碼位于src/secp256k1睬愤,包含了私鑰與地址相關(guān)的函數(shù),主要功能是實(shí)現(xiàn)比特幣密鑰與地址的計(jì)算纹安,包括:簽名尤辱、驗(yàn)證、密鑰的生成等
4厢岂、橢圓曲線幾何算法
K=k*G并不是一個(gè)簡(jiǎn)單的乘法運(yùn)算光督,而是一個(gè)幾何運(yùn)算。簡(jiǎn)單介紹一下兩種情況的坐標(biāo)值:
1)兩個(gè)不同點(diǎn)坐標(biāo)值:P+Q=R
P+Q表示為P和Q的連線塔粒,R表示連線與整個(gè)橢圓曲線的焦點(diǎn)结借,然后對(duì)焦點(diǎn)進(jìn)行X取反得“-R”,得到一個(gè)坐標(biāo)值卒茬,即公鑰值船老。K=k*G,k*G表示k個(gè)G在橢圓曲線上的相加圃酵,G是常量柳畔,要想得到不同的公鑰,只有k(私鑰)不同才能保證公鑰的不同
2)兩個(gè)相同點(diǎn)坐標(biāo)值:P+P=2P
P+P表示為兩個(gè)點(diǎn)在同一位置郭赐,那如何計(jì)算呢薪韩?以P點(diǎn)作橢圓曲線的切線,對(duì)曲線的焦點(diǎn)進(jìn)行x取反捌锭,得到相應(yīng)的坐標(biāo)值躬存,即公鑰值。
綜上所述舀锨,以G為起點(diǎn)做相加處理岭洲,以切線計(jì)算與橢圓曲線交點(diǎn)取反,再加上下一個(gè)G坎匿,循環(huán)往復(fù)計(jì)算形成一種無(wú)序的狀態(tài)盾剩,從而得到需要的公鑰值(x.y)坐標(biāo)。
5替蔬、壓縮公鑰
當(dāng)我們得到相應(yīng)的坐標(biāo)值告私,我們就能得到我們需要的公鑰值。首先把x.y進(jìn)行組合承桥,并在組合后的公鑰前加上04作為前綴驻粟,這樣就形成了“04xy”公鑰值(稱為未壓縮公鑰),由于未壓縮公鑰值占比內(nèi)存較大(512位),需要對(duì)其進(jìn)行壓縮蜀撑、以減少存儲(chǔ)壓力挤巡。那怎么實(shí)現(xiàn)呢?
一方面由于y的坐標(biāo)值可以通過(guò)x推導(dǎo)出來(lái)酷麦,所以y值的信息沒(méi)必要存儲(chǔ)矿卑,可以節(jié)省一半的信息量肠阱。
另一方面y值有正負(fù)數(shù)落蝙,所以當(dāng)y為正數(shù)時(shí),公鑰前加02檐嚣,如:02x糊肤;反之在公鑰前加03琴昆,如:03x。
當(dāng)公鑰需要的儲(chǔ)存空間變小馆揉,這樣就有利于比特幣交易更加完善椎咧。
? ? ? ? ? ? ? 區(qū)塊鏈研習(xí)社源碼研讀班方建強(qiáng)