想了解区块链必须要知道比特币是怎么工作的吗?没错一切区块链设计想法的源头都来自比特币
比特币也是区块链中应用最广的,细致了解比特币后,弄懂其他区块链的速度就很快。
比特币的目标,是打造一个谁都不能篡改的账 本。这个账本在网络中由每个节点保存一份, 只要联网,大家就会保持同步更新。比如我现在要给小哥哥发50BTC,我的比特币客户端软件会做3件事一一
①“客服小姐姐给小哥哥50BTC”当作(原始信息),对它做一次SHA-256运算,得到(原哈希值)
②用私钥给(原哈希值)上锁,得到(密哈希)
③把(原始信息)+公钥+ (密哈希),这3 项广播到网络中去。
这几句话可能你已经跟不上了,陌生词比较多,什么SHA256,什么私钥、公钥的。我们挨个来解释。
什么叫SHA256运算呢?
它的计算结果是一个256位的二进制字符串。你不用管它具体是怎么计算的,只要知道,不论什么东西用它算完,都能生成一个唯一的 256位的二进制数。一个空格也好,还是一部电影的数据,结果都是唯一的一串唯一的二进制数。而且它还有一个好处:只有这串数字的话,是没法倒推出原始信息的。就像图书馆每本书都有一个条形码,我们没法从条形码知道书的内容,但我们可以从条形码的差异分辨出是不是同一本书那样。所以SHA256函数就特别方便对比2条信息知否一致。比如,我要给小哥哥汇BTC,交易信息发出去,再附上这条信息的SHA256函数值。别人收到交易信息就能验证,汇钱的内容是不是被改动过。他只要把交易信息用SHA256函数算一下,再和我附上的SHA256函数值对比一 下,如果相等,就说明没有被改过。
“私钥”和“公钥”
这是加密技术出现两千年后的一次飞跃。
从前的加密技术是这样运转的,比如我要给小哥哥发“520”,我怕别人知道我们关系特殊,所以在每一位上做一个“+2”的处理,520 就变成了742,谁看到742也想不出我们关系特殊。小哥哥收到742之后,按我们之前约定过的,把“2”反作用于742,每一位都减去2, 就得到了520。在这个过程中,"2”就叫做钥 匙,又因为加密和解密都用的是它,所以叫 “对称钥匙”。长久以来,加密方法层出不穷,但钥匙却是保密的最大弱点。因为钥匙至少需要单独传递, 比如打电话、写信,或者趴耳边说,反正是需要单独的过程传递。只要这个过程被截获,加密法再复杂都白搭。但是在1978年,新的钥匙技术出现了,叫做 “非对称钥匙”。也就是说,加密和解密用的不是同一把钥匙,其中任选一把加密的话,另一把钥匙就可以解密。
具体来说是这样一一两把钥匙,我们任选其中一把,永远保留在自己手里谁也不告诉,叫做 “私钥”,另一把钥匙呢,必须公开给大家,谁都可以看见,叫做''公钥”。公钥-私钥是通过一种很巧妙的、不可逆的数学计算,关联成对儿的。
公钥-私钥怎么用呢?
比如,任何人要给我发加密消息,只要从黄页中查到我的公钥,然后用公钥把消息加密后发给我就行了。我收到 这条密文,用我自己的私钥套就可以解开。整个过程没传递过任何钥匙,加密解密却完成了,所以安全性大幅提高。
公钥-私钥系统,不光能完成加密解密
还能完成另一个更有用的功能一一签名
我们现实生活里使用手写签名,是因为笔体很难造假。但电子信息中,谁都可以敲出“小哥哥”,怎么确认一条支付信息是经由我确认的呢?很简单,只要把公钥-私钥反着用就可以了。正着用的逻辑是,谁要给我发消息,请用公钥加密,我收到后用私钥解开。而签名功能是反着当我要向别人证明一条信息是我本人发出的,我先用自己的私钥给信息加密,再把加密后的内容广播出去。别人怎么能确定这条消息一定来自于我呢?其实只要是用我的公钥去解一下就行了。如果解开了, 就说明当初这条加密信息是用这把公钥对应的私钥加的密。而谁有小哥哥的私钥呢,这世界上只有我自己有。所以,就能证明这条消息是从我这里发出的。
总结一下
SHA256函数运算的作用,是为了确认原文是否被改动过;公钥-私钥,是用来确认交易信息签名的。让我们回到刚刚支付比特币的过程。首先,我的客户端软件要把(客服小姐姐给小哥哥50BTC)这个原始信息公布出去。这很好理解,因为这是交易的细节。除此之外,还要把我的公钥公布出 去,这是为了之后让别人验证签名用的。最后还需要公布用我自己私钥加密过的原始信息的哈希值,也就是SHA256函数的值)。当这3部分消息广播到比特币网络后,马上就 会有其他比特币参与者帮我验证。这些人就是我们俗称的“矿工”。矿工用客户端软件做验证工作。
矿工验证什么?
首先把我发的原始信息(客服小姐姐给小哥哥50BTC)做SHA256的运算,得到一个原始信息的哈希值。求这个哈希值的目的,是要和收到的那个 “被我的私钥加密过后的原始信息哈希值”做对比,看看一致不一致,只有一致才能证明交易信息没被篡改过。但这个“被我的私钥加密过后的原始信息哈希值”是加过密的,没法直接和原始信息的哈希值对比,所以必须先解密。你可能要问,为什么非要先加密后解密再对比呢?直接比不行吗?还真不行。因为直接比只能判断原始信息有没有被篡改过,但这份原始信息可不一定是我认可的。如果谁都可以写出一堆“客服小姐姐给小哥哥50BTC”的原始信息,这不乱套了嘛。所以一定先用私钥对它加密,如果之后还能用公钥解开,就说明这里包含的加密信息是我授权认可的,并且支付内容没有一个字的篡改。
经过这一番确认,这条交易就算是合格了。
而矿工要验证一千条左右的交易信息,把它们按一定格式打包,这个数据包就叫做“区块”。这个区块就有可能成为区块链这条链上的最新的区块,被挂在末尾。但是我们知道,物理位置不同,搜罗到的交易信息也不同。所以世界各地的矿工即便都正确打包好一千条交易信息,形成了新的区块,但它们做好的区块里的内容可是千差万别的。而谁有资格把自己制作的区块放在主链的末尾呢?这个裁断是由一项额外的比拼决定的,就是所有矿工都需要做一份看起来没什么意义的工作 一一把他打包好的这个区块整体看作一个字符串,在这个字符串的末尾添加一个随机数,所以这个区块的整体就变成了一个更大的随机数,然后对这个更大的随机数做SHA256运算。刚才说了,SHA256运算的结果是一个长度为 256位的二进制数。这个额外的工作要求是,谁最先在运算结果中出现一个前72位都为零的二进制数,谁制作的区块就有资格最终挂在主链的最后一个。我们可以想象一下,要做到这一点得有多幸运。
基本上需要整个比特币网络所有的算力加在一起,大约10分钟,才会诞生这么一个幸运者。凡是成功提交这个区块的人,系统奖励他 50BTC。但这个奖励可不是一成不变的,每往后推进21万个块,奖励就会减半,变成25、12.5、6.25等等。可以一直这样减下去,直到几乎没有可以减半的时候。总数用等差数列算一下,大约是2100万个比特币。
当然,这只是奖励的一部分,还有一部分来自交易额的提成,大约挖出一个块只有零点几个币的提成。有人会想,计算机性能不断提升,算得越来越快,万一以后全网每几秒钟就出现一个区块怎么办?那不就很难保证一致性了吗?其实很简单,只要把幸运数字的要求从前72个都是零改一下,改成前73个都是零,有需要继续增加就可以了。这样一来,就能一直控制全网总是每10分钟出一个块。
如果有两个人在同一秒钟提交了正确的区块,以谁的为准呢?
没关系,在这10分钟里他们都正确,我们只要再等10分钟就可以了。因为在下一个10分钟里总会有一个分叉是后出现的,一个是先出现的,由于比特币协议中只认可最长链,所以哪个分叉上最早出现了下一个块,那这个分叉就会更长,就会成为今后的主链。而那个分叉上的交易数据,就作为无效数据,所有的币就退回了。
而这个规则,也能解释为什么区块链很难被人 恶意篡改。
因为如果有一个人希望篡改一条交易,比如说把别人给我的1个比特币改为1万个比特币,那他只能把自己区块的内容改掉,然后打包,提交到网络中。而这时,全网所有的矿工都工作在最长的链,没有人知道有个黑客做出了一个新区块。那这个黑客只能期待自己一个人在这条支链上的推进速度,比全网络所有矿工推进主链的速度还要快才行。什么时候他成为了最长链,其他矿工才会按照比特币协议“只认最长链”的规则,在他的后面继续挖矿。而一个人的算力,怎么可能超过全网其他所有人的算力呢?所以说,区块链是很难被恶意篡改的。
我最后还要说一个重要特征,也是链结构中重要的一环,它让比特币当前区块包含了所有历史交易记录的特征。这一点是怎么做到的呢?
笼统的说,一个区块包含2部分,一部分叫头部,一部分是那1000条左右的交易记录。头部中有一个值,是上一个区块所有字符的SHA256函数值。如果你把它认为,那是上一个区块里大约1000 条交易信息的特征,把它们取一个SHA256函数,那就错了。因为上一个区块跟这一个区块,也是同样的结构。主体部分是1000条交易记录,但上一个区块也包含头部,头部记录的又是上上一个区块整体的SHA256函数值。所以这一下,当前区块的头部保存的上一个区块整体的SHA256函数值,不止包含了上上一个区块里的1000条交易,也同样包含了上上上个区块SHA256函数的取值。就这样,循环嵌套可以无穷尽,直到第一个区块。所以当前区块中头部那个SHA256函数值,实际是全部交易历史的特征抽取。根据SHA256函数的特性,抽取出的这个特征值是唯一的,而且是无法倒推的。所以一些比特币钱包软件,可能常年都没打开过,再次开机更新的时候,就可以根据这个特征来确认自己从网上抓取的区块是不是合法的了。
以上就是比特币工作原理
关注比特玩家公众账号,看下一章节:以太坊的工作原理
扫描下方二维码
关注比特玩家
|
|