最近感觉身边有点闲钱的人都在炒币,没闲钱的都在信用卡套现炒币。
女朋友:“比特币是啥币?咋就值那么多钱?”
我:“比特币是一种基于电子签名、工作量证明和密码哈希算法的去中心化数字货币。”
女朋友:“#$*#^@%_¥>”
我:“啥意思?”
女朋友:“这是一条基于电子签名、工作量证明和和密码哈希算法的消息”
我:“...”
那么问题来了,怎样向外文系毕业,只学过高中数学的女朋友解释区块链或者比特币的原理?
首先我们从大家更熟悉的东西说起,记账和签名。
·公共账本
假设我和几个朋友小A、小B、小C..生活在一起,有时候我们吃饭要AA,有时候我吃了小A的面包,有时候小B又借了100块钱给小C...由于资金往来很频繁,我们每次都用现金结算很麻烦,于是我们想着,干脆大家先把账记下来,然后一段时间结算一次。于是我们就开始记账了:
谁来负责记账呢?找其中一个人负责?或者找个中立的第三方?
这一些都必须建立在我们对某个中心的信任之上。如果我们不信任任何一个中心,不希望记账的权利集中在某一个人或机构身上呢?
为了让每个人都可以随时记账和查账,不依赖任何第三方(即去中心化),我们把账本放在网上(比如google doc),公共编辑。
·电子签名
问题来了,万一小A在上面乱写怎么办,比如小A悄悄上去加一条记录“小B付给小A10000元”,小B可就亏大了。于是我们需要引入签名。每条账目必须签名才生效。
由于账目是记在网上,我们需要使用电子签名。电子签名是一串由0和1组成的长达256位的数字。例如:01100001000110101001....(256位)
那么我们怎样得到自己的电子签名呢?这里需要再引入两个概念公钥和私钥。每个人首先要生成一组公钥和私钥,他们看上去都是一串0和1组成的数字。例如:
私钥:0001011100100110... 公钥:0110010010101...
私钥自己保存,用于生成签名,公钥向大家公开,用于验证签名。这里需要用的两个函数:
第一个函数:f1(信息,私钥)=签名
这个函数的意思是,把信息(一条账目就是一种信息)和私钥输入函数,即可得到签名。注意,这个函数是不可逆向计算的,即你不可以通过签名,反向计算出私钥。另外,输入的信息(账目)不同,输出的签名也完全不同,所以你在不同的账目后面签名是不一样的,别人不能把你在一条账目后面的签名复制到别的地方去。
那么我们怎么知道这个签名真的是你签的呢?那就要用到第二个函数:
f2(签名,公钥)=真 or 假
这个函数的意思是,任何人都可以用你公开的公钥去验证签名的真假。把签名和公钥输入函数,就会告诉你签名的真假。
这两个函数的细节就不讲了,你可以确定的是,如果没有私钥的话,你想碰运气试出能通过f2检验的真实签名是不可能的。因为这里面有2^256(2的256次方)种可能..
2^256这个数字真的bigger than bigger。我们一个一个碰运气,用1亿台世界上最快的计算机,一起算1亿年,都远远算不完。你要是说“我运气就是好,一击命中”,这命中的概率,比“从地球上瞎开一枪正好打中火星上某个外星人的左眼的概率”还要小...下次有空详细讲下2^256这个数字有多大。
机智的人可能会问:我直接把这行账目和签名一起复制粘贴,交易不就翻倍了吗?解决方案很简单,我们在每一行账目前面再加一个不允许重复的唯一id即可。所以我们的账本又升级了:
·有人欠钱跑路怎么办?
如果小A欠了一屁股债,然后在结算之前跑路了,怎么办?
为了避免这一情况,我们只需在账本最初,记上每个人的总钱数即可。当某人的余额为零了,他就不能再通过账本向别人付钱了。即使记了帐,也被判无效。如果小A余额为零了,他必须为别人打工,让别人通过账本向他支付报酬。这和现实世界中以货币为载体进行价值转移的原理,其实是一模一样的。
如果所有人都就账本使用达成共识,并使用同一本账本,理论上可以通过记账实现一切价值转移,不再需要货币。
·每人一个账本
之前提到,为了让每个人都可以随时记账和查账,我们把账本放在网上让大家协同编辑。但是如果网站挂了怎么办?网站负责人把数据删了怎么办?所以如果我们把账本放在网上,归根结底还是必须要信任网站管理者这个中心,并没有实现真正的去中心化。
那么,干脆一个人一个账本吧!当小A付给小B100元,小A就把这条交易信息签上名,然后广播出去给所有人,收到广播的人就在自己的账本上加这一条记录即可。
·哈希函数
每个人都在自己的账本上记账的话,怎么保证大家都记得一样呢?如果不一样以谁的为准呢?比特币之父中本聪的方案听起来很无厘头:哪个账本上的计算量最大就认为他是真实的账本。
你可能有点懵逼了,计算量?记个账而已需要计算啥?凭啥计算量最大就是真的?好了,先放一边,我们再补充一个概念——哈希函数 。
哈希函数很神奇,我们往函数里输入任意信息(比如我们的账本)就会得到一串256位的1001001110001...的数字,这个数字我们叫做哈希值。往函数里输入的值稍微改变一点(比如小A恶意篡改了账本中的一条),输出的哈希值将完全不一样。而且这个函数是不可逆推的,意思是你不可能根据输出的哈希值去反向计算出输入的信息。
值得一提的是,并没有严格的数学证明这个哈希函数不可逆向计算,但是现代信息安全基本都是基于哈希函数。
·工作量证明和区块
有了哈希函数,我们再对账本做点改进。我们要求每一个有效的账本,最后必须带上一个数字,使得将账本输入哈希函数后会得到一个前30位都是0的哈希值。由于哈希函数是不可逆的,你只能一个一个去试,平均要试10亿次才能确保找到一个这样的数。我们把这个数叫做“工作量证明”。如果有人篡改了账目,工作量证明马上会变,又得重新算。于是现在我们的账本应该是这样的:
中本聪大神表示一切才刚刚开始。有了账本中加入工作量证明数之后,我们要把账本分成很多个区块(block),每个区块是一部分账目和一个“工作量证明”。为了保证区块顺序,我们要求每个区块还必须带上上一个区块的哈希值。那么如果修改或顺序变了,区块上带的哈希值就会变,那所有 “工作量证明”就完全变了,得全部重新算一次。这个账本就是大名鼎鼎的区块链(block chain)。
·挖矿
前面说到所有人都可以参与建造区块,参与建造区块的人被称为“矿工”。当他们收到广播中的交易信息时,就把他们收集起来装进一个区块,然后开始拼命计算这个区块的“工作量证明”(当然是用计算机算)。前面说了,矿工们平均要试10亿次才能确保找到一个这样的数,当第一个幸运儿找到之后,立即将这个区块广播出去,向大家宣告我找到了。其他人就只需要把这个区块加进自己的链即可。矿工的这一系列计算被称为“挖矿”。为了激励挖矿,我们需要协议给矿工一些奖励,这个奖励就是比特币。每个矿工完成“工作量证明”的同时,他可以在这个区块中凭空增加一行特殊的账目“我收到10个比特币的奖励”,且这条账目不需签名即可生效。你可能会意识到,每一个新区块的产生,都会凭空产生一些新的比特币。比特币就是这样挖出来的。
·为什么工作量最大的账本就是真实的账本?
如果我不想要奖励,也没有力气去算,那就只需要接受矿工发出来的区块链,然后更新自己的账本即可。但当你接收到两条不同的链的时候,哪条是真实的?中本聪告诉我:很简单,选计算量更大那条,也就是更长的那条。如果两条一样长,我们就等着,看他们变长,总有一条会更长的。
为什么链越长工作量越大,就一定是真的呢?我们不妨换一个方向来思考,在工作量证明的前提下,怎样能造假?即怎样让一条假的链,始终保持最长?
假设小A想伪造一个区块给小B,写着“小A付给小B100元”,但同时小A不愿向其他人广播这个区块,以便让其他人认为他没付钱给小B,即他的资产没有减少。
小A在向小B广播伪造的区块,而其他矿工也在各自建造区块。那么小B必定会收到两条不一样的区块,一条来自小A一条来自其他矿工。小A为了骗到小B,她必须比所有人更快的算出工作量证明,以保证她的那条链增长得更快。为了让小B一直相信他伪造的区块链,小A必须在每个区块都比其他矿工先算出工作量证明,不然其他矿工总会赶上她。为此她必须拥有整个区块链网络中的50%以上的计算能力。
以上基本就是比特币以及大部分数字货币的主要思想了。
·补充
比特币协议中规定新增一个区块的时间间隔需要被控制在大约10分钟。随着矿工的计算能力越来越高,为了保持出块的时间间隔,只需增加哈希值开头的0的个数即可,每增加一个0,需要计算的次数就翻一倍。现在很多新币的出块速度很块,比如eth只要15s,xrp只有3.5s。
另外每个区块的奖励是递减的,最开始每完成区块的工作量证明奖励50的比特币,但协议规定每算出21万个区块,约4年,奖励会减半,由于奖励按几何级数递减,比特币总量将不会超过2100万。这也是促成比特币稀缺、高价的原因之一。
好了,大概就讲这些吧,待会儿女朋友就回来了,不知道她能不能看懂。当然,更大的可能是,她根本看不完这又臭又长的文章..
参考资料:
1、https://www.youtube.com/watch?v=bBC-nXj3Ng4&list=PLtaKsrMgSUu9DLTVLiBaCd0bMMsosiKIT
2、https://wenku.baidu.com/view/c62c067cb307e87101f69642.html