DAY 27- 地址 Address

「我家今晚没人,这是我的地址。」


我们昨天介绍了区块链的基本架构,
知道交易纪录如何在区块链上保存、连接。

  • 从最外层开始看起,
    区块链里面有区块,由矿工去更改Nonce值,
    最後将这些区块用哈西值 (杂凑值)链起来,达到不可窜改性。

  • 区块里面包含几个部分:
    使用的版本、难度、上一区块的杂凑值、交易资料的Merkle Root、时间戳记、Nonce
    我们在两天前有秀过区块的内容。

今天我们要更着重於交易资讯内容里非常重要的资讯:地址。
先放上一个交易内容。

这可不是普通的交易,这个是比特币有史以来第一个交易。

https://ithelp.ithome.com.tw/upload/images/20211009/20140112uZFYcrAka1.png

可以看到此交易的杂凑值,以及金额50BTC,时间是2009/01/04
新产生的比特币转到某个人的帐户(1A1zP1eP5QGefi2DMPTfTL5SLmv7DivfNa)里,
而这个人大概就是中本聪。
(之後还有很多人打币给他,所以余额并不是50BTC)

https://ithelp.ithome.com.tw/upload/images/20211009/20140112gjiPm2YIDo.png

不过那并不是重点,
今天的重点是,这个地址是怎麽回事。

私钥公钥地址

标题下的很烂,不过就是这麽回事。
区块链的地址是由「私钥→公钥→地址」的流程变来的,

私钥变公钥,公钥不能变私钥这件事情我们已经知道了,
那地址能不能变公钥呢?

答案是不行。
先卖个关子,等你看完应该就理解了,我们还是一步一步来,从头开始。

私钥

比特币的私钥为256位元,
可以从0x1到
0xFFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFE BAAE DCE6 AF48 A03B BFD2 5E8C D036 4140
中任选一个数字,每一个数字在secp256k1这个椭圆曲线上都是可行的。

我们都会有一个疑问,随机挑一个数字真的可行吗?
如果我跟另外一个人挑到一样的数字,那不就完了?
答案是,还真的完了。

虽然完了,但也不太可能发生。

256位元就意味着总共有 https://chart.googleapis.com/chart?cht=tx&chl=2%5E%7B256%7D个数字,或者说1.16 × https://chart.googleapis.com/chart?cht=tx&chl=10%5E%7B77%7D个数字
而全球人口四舍五入後不过就https://chart.googleapis.com/chart?cht=tx&chl=10%5E%7B10%7D(100亿),要想抽到同一个数字实在不简单。

所以实在没有碰撞的可能性。

公钥

公钥由私钥产生,而比特币使用的是 secp256k1 这个椭圆曲线,
还记得我们在说明ECC(DAY 15)时有说到

K=k*G

其中K是公钥,k是私钥,G是基点,
G的压缩型是

02 79BE667E F9DCBBAC 55A06295 CE870B07 029BFCDB 2DCE28D9 59F2815B 16F81798

藉由运算就可以得到相对应的私钥。

压缩型、非压缩型(compressed/uncompressed form)

椭圆曲线是在直角坐标上点的运算,因此会有x座标和y座标。
而压缩型就是在表示时不标示y座标,因为 y 是可以从 x 推算出来的。

虽然如此,椭圆区线上同一个 x 座标可以对应到两个 y 座标,
於是我们需要在公钥前加上前缀(prefix)。

  • 02 压缩型(y座标>0)
  • 03 压缩型(y座标<0)
  • 04 未压缩型

所以你可以回去看到基点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


<<:  实作Aurora

>>:  简报版-第六章-谈谈手机APP下载安全吗?

Day11 NiFi & NiFi Registry

在Day3 Pipeline 如何做版本控制 - NiFi Registry就有提到 NiFi Re...

从零开始学游戏开发:入门程序实作 Part.7 重新计分

这是 Roblox 从零开始系列,入门章节的第十三个单元,我们的游戏出现Bug了,那就是死亡後分数还...

02 | WordPress 编辑器的进化起源,认识「传统编辑器」

传统编辑器的作用,就是把 HTML 转换为我们所见的网页的过度性产品 Classic Editor...

GCP硬碟加大

硬碟空间调整 这几天的议题环绕在硬碟的使用,那今天就说得轻松的主题如何在GKE中改变硬碟的空间大小,...

D3JsDay20笔画面量彩色图涂色 彩亮面画笔—地理面量图(上)

面量图介绍 面量图又称分层设色图、区域密度图(Choropleth map),高中地理课本的说明是在...