每天进步一点点: 比特币的公钥压缩与地址

in #cn8 years ago

在昨天的帖子中,学习了如何由私钥生成公钥.

有朋友私下问我,你咋整出俩公钥啊,一个压缩,一个未压缩,这又是什么鬼?我该用哪个公钥啊?别急,听我慢慢道来。

公钥压缩

为何要压缩

根据我们上节学习的成果,公钥(K)是通过私钥(k)乘以生成点(G)得到的,并且是椭圆曲线上的一个点P(x, y)

上图是我们用Hello World生成的私钥并计算出来的点P
表示成公钥其实就是把加上前缀04并把x和y连接起来

很长很长有木有,一共是520bits (8 + 256 + 256),使用16进制字符串表示,要130个字节!!
而这么长的内容在网上传输来传输去,传输无数次是很浪费资源的,于是就有了压缩的公钥

为何能压缩

通过以前的学习和上边的分析,我们知道公钥是椭圆曲线上的一个点P(x, y)
而按照椭圆曲线的方程,我们是可以通过x求得y的,所以我们只要保留x部分就可以了
机制就是这么简单!可见数学有多么重要,可惜是我从小学起就没有好好学 😭
同学们千万不要学我!

如何去压缩

以下图示很好的说明了公钥压缩的流程


公钥压缩的示意图( Source: 《Mastering Bitcoin》)

比特币地址

好了,公钥压缩问题已经理解了。
我们继续来进行最后一步,生成比特币地址!!!!

私钥、公钥都有了, 但是要玩转,让别人给我打钱,必须要有地址啊
木有地址,怎么骗钱???, 怎么收钱?


公钥到比特币地址的示意图( Source: 《Mastering Bitcoin》)

《Mastering Bitcoin》好书啊,再次强烈推荐!!

有了这个公钥到比特币地址的流程,生成比特币地址就相当容易了。

从steem python库中扒来ripemd160函数,hashlib真强大啊

def ripemd160(s):
        ripemd160 = hashlib.new('ripemd160')
        ripemd160.update(unhexlify(s))
        return ripemd160.digest()

连扒再改弄个了生成地址的函数,请忽略变量命名之类的毛病

def get_address(public_key):
        pkbin = unhexlify(public_key)
        addressbin = ripemd160(hexlify(hashlib.sha256(pkbin).digest()))
        address = base58CheckEncode(0x00, hexlify(addressbin).decode('ascii'))
        return address

运行我们代码,导入之前生成的两组公钥,得到两个地址:

Address(C): 1LGWpj3pqbzYWvTLEcBKP6CS5PQkxBgjXj
Address(U): 14EvJWPvFNLnzBBzhm1AG9a5b6XiSBFs6R

验证

导入WIF(未压缩)

在blockchain.info 在线钱包,导入WIF(未压缩)
5K5CpQZtUvPqwk2UE1FAiWC1nPV1WYqMnEhMYy2WTiMz3J1u9nm

再导出私钥,显示的地址是未压缩的,但是私钥自动给显示成WIF-Compressed了
Address(U): 14EvJWPvFNLnzBBzhm1AG9a5b6XiSBFs6R

导入WIF-Compressed

在blockchain.info 在线钱包,导入WIF-Compressed
L2mZAF2AEEfq2cuVAQ5XtBqcTLEdFRWSifT7i6Hf2uZckefDJfp5

再导出私钥,显示的地址是压缩的,私钥显示和我们导入的相同
Address(C): 1LGWpj3pqbzYWvTLEcBKP6CS5PQkxBgjXj

不同的私钥(压缩、未压缩) 对应不同的地址

由此可见,不同的私钥(压缩或者未压缩)对应不同的比特币地址,和我们程序中生成的地址结果一样

钱包里虽然把私钥都作为WIF-Compressed显示,但是对于压缩和未压缩的,是区别对待的。

关于压缩私钥,压缩地址,以及压缩公钥

无论是压缩私钥还是压缩地址,地址和私钥本身是不压缩的,只是代表对应的公钥是压缩的而已

总结

  • 公钥压缩可以节省空间
  • 公钥压缩的原理: 对应椭圆曲线上的点P(x, y) , 可以通过x求得点y
  • 公钥压缩的实现,y是偶数用02做前缀,奇数03,接上x的16进制字符串表示
  • 比特币地址由公钥按固定流程生成
  • 压缩公钥生成对应压缩公钥的地址
  • 未压缩公钥生成对应未压缩公钥的地址
  • blockchain.info 导入相同私钥的WIF, WIF-Compressed,生成两个地址
  • 地址和私钥本身是不压缩的,只是代表对应的公钥是压缩的而已

疑问,两个地址对应的是一个私钥(256bit随机数),那么我向一个地址打一笔钱过去,是两个地址同时显示有钱,还是只是我打钱的地址有钱呢?
我一会用我生成的这俩地址打一个比特币过去测试一下,你们别乱动啊。😭


今天就探索到这里。
免责声明,本文为个人理解,示例仅供参考
因使用文中代码或地址造成的损失,概不负责!

Sort:  

又一篇超級專業的文章!😆

过奖了,我也在学习和探索

嗯嗯,大家都加油!!>V<

Good....
Upvote & follow me....

done, pls follow me too

great post,awesome work
thanks for sharing the info.

pls sir/ma @oflyhigh, pls i am greatly in need of your help.

my goal was jeopardize by @adm @idx @blacklist-a by flagging my post. pls i seek ur help sir/ma to pls help me out in any way you can help me

i will be very greatful

pls i need your reply

I'm sorry there is nothing I can do to help.

thank you for this useful info and article.

You are welcome! 😄

it's good that steemit can display translated page immediately , good to learn many things along the way..

nice post...upvoted and followed ..... please me too

學習了,多謝O哥。

😄 互相学习

哥 下篇探讨下荣耀地址生成呗

荣耀地址是啥?😄 华为的荣耀吗?

就是比特币地址靓号
有的人比特币地址是88888888888jdjdj 这种


我第一次听说,了不起

内容太高级了, 不是很看得懂,反正觉得不错!

谢谢夸奖 😄

Very informative thanks

我翻译了你的文章是出于好奇,我不后悔,有你在比特币做的事情,因为我从来没有想到😊。感谢您对这篇文章我是法国人,我看所有的新闻比特币。我给予好评的文章✌

好专业啊!!

见笑了 😄

hello, your post for I get it. I like it,I vote it
but no language

I love Bitcoins!

看不懂也要看,希望有一天能看懂。

其实没啥用的啦,哈哈

能学一点是一点,咱是终身学习者。

每天一小步,人生一大步。

Hello! I just upvoted you! I help new Steemit members! Upvote this comment and follow me! i will upvote your future posts! To any other visitor, upvote this post also to receive free UpVotes from me! Happy SteemIt!https://steemit.com/steemit/@rakiblove/today-529-75-profit-sativacoin-stv-cryptocurrency


Congratulations! This post has been upvoted (100%) and reestem from the new curation trail @animus, The goal is to help Steemit grow by supporting Minnows and creating a social network. It's a completely free and you can join https://streemian.com/profile/curationtrail/trailing/691 or delegate steem power (SP) to @animus

牛。反正看不懂。

请在牛后边加个毛

Hello! I just upvoted you! I help new Steemit members! Upvote this comment and follow me! i will upvote your future posts! To any other visitor, upvote this post also to receive free UpVotes from me! Happy SteemIt!


and he DownVote all of my post... his name's MonkyyHey can you help me quickly ! A man give my real identity https://steemit.com/suisse/@monkrypto/on-me-downvote-sans-raison-2017730t829020z

A very professional article to describe Bitcoin address

请教一下,根据圆锥曲线y^2=x^3+7,一个确定的x不是应该生成两个y值吗(y1=-y2),那这个pubkey压缩的时候应该会有信息损失吧?不知道比特币系统是怎么解决的?