通过前5篇的学习我们大致了解了区块链的基本情况,听起来似乎没这么难理解,可是我们今天要学习的就有多一点难度了,可能需要你对照这图片反复的看几遍了,今天这节课是区块链原理系列课里面最难的一部分了,提前做好思想准备。
在比特币这个公开的账本里,怎么做到我在不泄露私钥的情况下,让大家都相信我拥有某一个地址的私钥?可能今天这个比特币的钱包我们都已经用的很熟练了,可是这个最基础的问题很多人都没有思考过,我们要解决这个问题需要先了解,公钥私钥和地址是怎么回事,还有他们三者之间的关系。
首先,每一个地址都对应一对公钥和私钥,公钥和私钥是唯一对应的关系
我们先说私钥,私钥本质上是32个byte组成的数组,1个byte等于8位二进制,一个二进制只有两种可能性0或者1,所以私钥的总数就是2^(8*32)=2^256个,这个数量已经超过了宇宙中原子的总数,想要编译所有的私钥,耗尽整个太阳的能量也是不可能成功的。所以私钥匙绝对安全的,只要你自己不泄露出去,无论黑客的技术多厉害,都是办法用暴力的方式去破解的。
下面来说公钥。公钥实际上是由私钥转来的,这个过程,使用了之前提到的一种算法——椭圆曲线加密算法(这种加密算法也是非对称加密的一种)。
至于算法的过程,我们就不探讨了,涉及到计算以及理论,我们记住一条就可以了,
公钥是由私钥生成的,一个私钥经过椭圆曲线变换之后会生成一个65个byte的数组,这个数据也是唯一的,公钥和私钥是相互唯一的,从私钥可以推导出来公钥,因为加密是非对称的,所以,公钥推不出来私钥。用公钥加密的信息,只能使用与它配对的私钥来解密。总结起来就是,公钥加密,私钥解密,私钥用来数字签名,公钥验证。想要了解看看公钥长什么样子的,可以看一下图片。
一般我们会看到这样的一个公钥:
04a34b99f22c790c4e36b2b3c2c35a36db06226e41c692fc82b8b56ac1c540c5bd5b8dec5235a0fa8722476c7709c02559e3aa73aa03918ba2d492eea75abea235
最后用一句话总结他们三者之间的关系,私钥可以推导出公钥,公钥经过一系列数字签名运算就能生产比特币的地址,每一个地址都对应一对公钥私钥,公钥和私钥互为唯一。
理解了公钥,私钥和地址的关系下面我们来解决,怎样在不泄露自己私钥的前提下,花出我账户里的比特币。这个过程有点复杂,请问大家多看几遍。
比如我们要做的这件交易支付,从1PA地址支付给E2H这个地址0.1个比特币,那么今天我们就见证一下,这笔交易是如何完成的。
首先,我们在进行这种支付过程之前,我先做一个简化,我把这串信息交易信息利用哈希函数做个简化,把他简化成一个简短的摘要信息。
这里交易信息比较简单,但是实际上比特币系统里面可以有非常复杂的交易信息,因为就在一个交易信息里面可以列上千条交易,但是无论多少条交易信息,我们都可以把他简化,
好,在完成这项工作以后,那么这个简短的交易摘要,就唯一的标识了原始的交易信息。那么,我作为1PA地址的私钥的所有者,就要想办法让别人都接受。我交易指令,让所有的账本都接受交易指令,从而把我这个钱划出去。那么要做到这一点,就要让所有的人确信我拥有1PA这个地址上所对应的私钥。
那么我们做两步工作,第1部是签名,这个私钥就相当于我的私人签名或者我的私人印章一样。我对这笔交易进行一个签名,就是表明我确认我用我的私钥,我用我的私人的印章,确认了这笔交易。
这个签名的过程是这样的,我们把原始的交易信息的摘要,让他跟我手中所持有的私钥进行一个运算,这个运算比较复杂,我们简化一下,把它写成一个乘号,这样一乘就得到了一个签名,如果要确保安全的话,过程签名这个过程应该在一个离线的物理上跟网络隔绝的地方进行,这样的话才能保证私钥不泄露。
得到签名之后,我们就可以把原始的交易信息和签名广播出去,广播出去。所谓广播出去,就是说通过比特币网络把原始的交易信息跟签名发送出去。这个广播的速度是非常快的,大约在几秒钟的范围时间内可以传遍全世界!
这样我们就把原始的交易信息放出去摘签名放出去。我们想要做到的是告诉大家,别人收到了信息之后,他就要来验证一下,这个签名是不是付款的账号,所对应的私钥。
如果是的话,请同意这笔支付。我们接下来就要进入一个验证的过程,任何一个接到原始信息和签名的人都可以做验证。
这个验证相当于对签名过程的一个逆运算,我们知道普通的乘除法里面,乘法和除法之间是运算的过程,我们就拿做比方,尽管它真实的运算过程、签名的运算和验证的运算是很复杂的,但是道理相通。
这里有第三张图,你可以结合图片看一下,
我们验证就是用刚才得出来得到的签名,除上公钥看看能不能得到第一步的交易摘要。如果能得到,就证明这个签名是经过了公钥所对应的私钥签名的。就可以证明这个地址上的比特币是你的,你就可以顺利支付这一笔比特币了。
其实这个反向验证的时候本来是应该除以私钥的,可是私钥又不能泄露,如果用私钥来验证的话,不就把私钥泄露出去了吗?所以我们再验证的时候,只需要除上私钥的一个简化的形式公钥就可以了。
到这里我们开头的问题就解决了,我们就完成了,如何在不泄露私钥的前提下,完成一笔比特币的支付。
那么接下来还有最后一步,就是交易完成了以后,验证通过了之后,我们就需要记账,这个记账说起来容易,但是仍然有许多的现实问题,具体记账怎么记?谁可以记账?那么作为一个公共的账本,分布式的账本系统,理论上每个人都可以记账,但是谁愿意记账呢?
这十年来,这些记账人他们的动力,在哪里呢?我们下节课再讲。