【小哈划重点:比特币世界几个关键的信息是按照这个顺序生成的:先生成私钥,再由私钥算出公钥,再由公钥经过一系列哈希算出钱包地址。上面的推导次序是单向的,反向不可能。就是说从钱包地址无法得到公钥,从公钥无法得到私钥。】
钱包
判断一个人是否真的了解区块链的一个简单的测试是问一句:“我转钱给你。你的钱包地址是啥?”这个试金石可以轻松区分很多伪专家。在成熟的互联网世界,没有邮件地址还说得过去,毕竟没有邮件地址也可以点外卖,但是现在百废待兴的区块链世界,一切都如此原始,没有自己的钱包地址就是一个旁观者。
要开始,先要搞一个钱包,获得自己的地址。比如这就是一个合法的比特币地址:
1EHNa6Q4Jz2uvNExL497mE43ikXhwF6kZm
这就像银行账户一样,有了它任何人都可以给你转账了。有非常多的软件可以帮你生成自己的地址。
受互联网网站的思维惯性影响,还有银行开户程序的影响,很多人以为要搞一个钱包地址还需要到什么地方注册一下。其实不然。任何人都可以自己独立的,不联网的生成自己的钱包。这是怎么做到的呢?钱包里面到底包含什么呢?
公钥私钥
这涉及到一个密码学上的一个基本概念:公钥密钥。公钥和密钥一对一对儿的出现,公钥加密的东西可以拿私钥解开,私钥加密的东西可以用公钥解开。大家就想像成一个带锁的盒子和一把钥匙的关系吧。这个特性用来加密和签名。
加密的过程好像是把自己的盒子写上自己的地址发的全世界都是,谁都可以免费要一个。谁要给你寄信就把信放到盒子里面锁上,然后寄给你。寄件人和收件人都很放心,因为路途上没有任何人(包括寄件人)可以打开盒子了。世界上能够知道信的内容就只有你和寄信的人。
签名的过程也很容易理解。就是写着你名字的钥匙发的满世界都是,谁都可以免费拿一个。而这把钥匙能打开的盒子只有你有,谁都不给。如果有人得到了一个盒子,拿你发的钥匙可以打开,盒子里的东西一定是你发的,因为这把钥匙能够打开的盒子,这个世界上只有你有,你无法抵赖。
区块链世界用了这个精妙设计的公钥私钥体系,但是不是用来加密,主要用于签名。你手里面握着私钥,打死你也不说的私钥。而你的地址,就是那个满世界皆知的公钥。钥匙信息可以被公钥打开,则说明一定是知道私钥的人加密的。所以任何的交易一旦用你的私钥加密了,收到的人验证一下用你的公钥可以解密,那就认为是你授权的操作。
钱包地址的生成
比特币世界几个关键的信息是按照这个顺序生成的:先生成私钥,再由私钥算出公钥,再由公钥经过一系列哈希算出钱包地址。
私钥 ---> 公钥 --> 钱包地址
上面的推导次序是单向的,反向不可能。就是说从钱包地址无法得到公钥,从公钥无法得到私钥。
比特币的公钥变形出来的钱包地址,可以想象成用户名,这全世界都可以知道;私钥可以想象成密码,这个只有自己可以知道。
私钥是一切的开端
私钥一个大于零,小于2的256次方的一个任意数字①。你就随便挑吧。挑中了这就是你的了。比如,你可以任性的把私钥设置成这样:
0000000000000000000000000000000000000000000000000000000000000001
就是数字1。好记吧?(千万别真的真么做。我举着个例子就是为了演示用一个大家能猜到的私钥是多么危险)
然后通过椭圆曲线函数,就可以对应的公钥②:
0479BE667EF9DCBBAC55A06295CE870B07029BFCDB2DCE28D959F2815B16F81798483ADA7726A3C4655DA4FBFC0E1108A8FD17B448A68554199C47D08FFB10D4B8
然后经过一系列让人眼花缭乱的哈希,最终形成比特币地址如下:
1EHNa6Q4Jz2uvNExL497mE43ikXhwF6kZm
私钥就像《阿里巴巴和四十大盗》的故事里面的“芝麻开门”。世界上任何人只要知道“芝麻开门”这个咒语,就可以在那座大山里面找到那个山洞并且打开大门。比特币的世界就是这样无情。一个人是否拥有一个账户,不看他是谁,就是看他是不是知道那个秘密。四十大盗知道咒语可以拿宝贝,阿里巴巴知道也可以拿。至于这个山洞里面有没有金银财宝是另外一件事情了。
既然所有看这篇文章的人都知道了这个地址的私钥(数字1),我们就共同拥有了这个地址里面的钱,任何一个人都可以花里面的全部的钱。
在比特币的世界,虽然无法知道地址背后的人是谁,但这个地址历史上所有的交易都是公开信息。很多网站和工具可以让你查询。来,让我们来查询一下这个账户,看看咱们有多少钱 :-)
真可惜,余额为零。这个并不惊讶。
但让我惊讶是,这个地址从2011年到最近的2018年3月9日,居然有过1201笔交易,总共收到过7.8个比特币,即便按照最近跳楼的币价,也是24万块钱人民币呢。这期间任何一个时间点,这个地址里的钱,就是放在大马路上任何人都可随手拿走的钱。多危险呀!
所以所有的钱包软件都是尽量的生成一个越随机越好的私钥。好在随机生成的私钥足够安全。有多安全呢?我们的大脑是无法理解256位私钥到底能存多大的数字。这么说吧,2的256次方大约是10的78次方,也就是10后面78个零。而现在人类观测到的全宇宙的所有的原子才10的78到80次方左右。也就是说私钥的可能性大约是全宇宙的原子数那么多。从整个宇宙中随机找出一个原子给你,这是你的私钥,你觉得和别人冲突,或者被别人猜中的可能性有多少?
钱到底存在哪里?
首先,钱不存在钱包里。
很多钱包软件可以显示余额,完成交易,但钱不在钱包里。钱包唯一记录就是一个私钥 ③,大多数的私钥不像例子里面那么容易猜,看起来就是乱码。如果谁有本事背的下来这个密码,其实你就不需要任何钱包。有些工具允许你交易的时候直接输入私钥就可以了。
那钱存在哪里呢?
钱的数量存在区块链上,而区块链的链表结构存在成千上万的电脑上。如果你下载一个比特币的客户端,同步以后有大约100多G的数据。里面包含了从第一笔交易到现在快10年的所有数据。所以回答这个问题,钱并不存在在任何地方(不存在一种刻着中本聪头像的纸币或金币),钱的余额存在无数的电脑共同维护的一个账本里。
密码和助记词
既然唯一重要的是私钥,为什么很多钱包还需要密码呢?这是一个双重保护。把私钥明文的存在电脑硬盘或手机上不是个好主意,对于黑客甚至是亲近的朋友拿到硬件一个简单的搜索就能找到钱包文件。所以大多数钱包是把私钥再用一个密码加密一下,然后只存储加密过的私钥。没有密码就无法容易的访问私钥。因为人类起的密码就那么8-10位常常是有规律的文字,其安全性远低于机器生成的256位的私钥,但也总比没有好。但千万不要以为这个密码就是你的比特币或以太币密码。它仅仅是是一个保护密码的密码。丢了存私钥的文件,有密码也没有用了。
还有一个大家使用钱包中经常遇到的,就是钱包帮你生成一串12个单词的句子,让你把这个句子抄下来保存好。比如这样的:
voice again pupil thumb strategy toss extend unusual neutral shuffle claim cave
这是什么呢?和私钥又是什么关系呢?
它叫助记词(mnemonic code),其实就跟以前地下工作者用的密码本一样,也跟“A for alpha, B for Brave, C for Charlie ”的原理类似。,BIP39(Bitcoin Improvement Proposal 39)定义了2048个单词的列表,每个单词都有编号,比如
voice ==>1964
again ==> 38
...
cave ==> 295
然后把这些数字按照一些复杂的算法拼起来就可以还原出来私钥了 ④。
现有钱包的问题
如上就是比特币等的钱包,私钥,地址等的现有运作方式。但问题是很明显的:
密码不可改。密码改了,公钥就变了,地址就变了,也就是另外一个钱包了。密码一旦泄露,也没有办法改变。
密码忘了。如果你的私钥忘了怎么办?无解。忘了就是忘了。没有找回密码功能。大量早年的比特币都随着一次不小心的电脑格式化消失了。严格的说,那些比特币没有消失,我们还能看到它们就在自己曾经拥有的那个地址里面,但我们就像忘记密码的四十大盗,只能看不能花了。此事现在无解。
假装不记得密码。典型例子就是离婚的时候,夫妻双方有一大笔财产在比特币里,一方坚持说把私钥弄丢了,法官无法证明这个人是真的忘了还是假的。另外的情况就是有些公司宣称被黑客偷走了比特币,而没有任何人可以证明小偷是另有其人还是就是自己。
这些问题都需要未来的创新来解决。
总结
前面几篇文章介绍了区块链的一些最基本的技术,从链表,哈希,挖矿等 到 智能合约,代币(Token)等,还有本文的钱包,私钥和地址等。
我花时间先谈技术的本意不是为了证明技术多重要,而是通过抽丝剥茧来帮助大家理解区块链的底层技术是多么的简洁,容易理解。希望这可以缓解很多人的区块链焦虑。因为从底层来说,技术没有什么复杂,但是设计的非常精妙,而且像互联网底层技术一样实用。
接下来,我想我会把视野更多的放到技术背后的商业和哲学的层面了。毕竟,区块链对于世界的影响,不是技术本身,而是它对于生产关系,对于价值传递等等的巨大改变。这里面牵扯到代币经济(Token Economy),代币促进的网络效应,ICO,区块链应用等等好多的内容。如果感兴趣可以订阅公众号以后一起学习交流。
感谢华宏伟,赵君,宫亮,Tim,王哲对本文的帮助。
注①:严格地说是 1.158 * 10^77,比2^256稍微小一点点
注②:这个公钥其实是一个坐标。0x04是标记位,后面两个256位的数字是椭圆曲线上的坐标值: (79BE667EF9DCBBAC55A06295CE870B07029BFCDB2DCE28D959F2815B16F81798, 483ADA7726A3C4655DA4FBFC0E1108A8FD17B448A68554199C47D08FFB10D4B8)
③:虽然公钥,地址都是可以从私钥确定的算出来,很多钱包软件里面为了方便也存储了公钥和地址。
④:技术细节:实际上不是简单的拼接。2048个可能性就是11位,所以是很多个11位拼出来。还有最后几个单词是有可能是校验位,以发现用户输入错误。同时最终拼出来的也不是私钥本身。但大家只要知道这个东西最终可以找到私钥就好。