比特币等加密货币是建立在密码学的大厦上的所以有必要了解一些的密码学基础,今天简单的聊一下相关的一下基本知识,今天小编就来聊一聊关于比特币的底层逻辑?接下来我们就一起去研究一下吧!

比特币的底层逻辑(比特币中的密码学)

比特币的底层逻辑

比特币等加密货币是建立在密码学的大厦上的。所以有必要了解一些的密码学基础,今天简单的聊一下相关的一下基本知识。

非对称加密与比特币转账

在讲非对称加密之前先了解一下对称加密。对称加密是一种古老的加密方法,据说最早是凯撒大帝发明的。原理很简单,假设要加密的一句话是“hello world”,那么假如每个字母都按照字母表的顺序往右平移2位,那这句话就变成了“jgnnq yqtnf”, 这么一来大家都看不懂了,只有知道这个规律人,可以将上面这句密文“jgnnq yqtnf” 每个字母左平移2位,那么这句话“hello world”就又出来了。 在这个操作中,右平移2位就是加密的过程,左平移两位就是解密的过程,这当中平移的位数“2”可以称为“密钥”。 这个加密的方法还可以扩展为第一位字母平移2,第二位平移3,第三位平移1,第四位平移N...等等。但不管怎么复杂,这种加密有一种致命的缺点,就是加密和解密之前,必须先将密钥告知对方,而一旦这个密钥被泄漏了,那这个加密方式就起不到保密的效果了。

而非对称加密就解决了这个问题。 在非对称加密的算法里面,有两个密钥而不是一个密钥。 这两个密钥由一种数学公式同时产生,一个叫公钥,一个叫私钥,公钥和私钥共同组成一对密钥。 当我需要加密一条信息的时候,我需要用到一个公钥将信息加密成密文。 但公钥只能用来加密,不能用来解密。这个密文发出去后,收到信息的人需要用私钥才能解密。那这里面有个问题,就是为什么公钥加密的信息必须要私钥才能解密,用公钥反而不能解密了呢?这里面就涉及了密钥对的生成过程,以及数论的知识。 打个比方,有两个质数11和13,很容易计算出他们两个相乘等于143。 但是给你一个数143,让你求出这是那两个质数的乘积,那估计是需要费一点脑细胞的。 但假如是两个很大的质数,比如有1000位,乘出来后想再分解就很难了,就是现在最快的计算机也得花成千上万年。 这个质数相乘的过程是一个单向计算的例子,而公钥加密的过程就是一个单向的计算。通过单向计算,我用公钥加密的信息我自己也解不开了(我只有公钥),但是,有私钥的人反而可以解开。私钥相当与单向计算过程中留了一手,通过私钥可以快速将公钥加密的密文求解出原始信息。 这么一来,公钥可以想他的名字一样,可以公之于众。这时候假如我位于间谍机构的总部,而我的手下特工在外面想要给我发信息,那么他用公钥加密发出一个信息,我收到后用私钥解密即可。这期间特工加密后的消息被敌方截获,但因为敌方没有私钥,所以没辙。 当然,公钥和私钥还有另外一种用法,我用私钥加密发信息,别人用我公布的公钥来解密收信息。这就起到一个数字签名的作用,可以向大家证明这条信息确实是我发的,因为只有我才有私钥。

非对称加密用途很广泛,流行的加密数据传输协议https, SSH 等都是上面说的第一种用法。而比特币的交易系统则是类似第二种的。 比特币的账户,或者比特币地址,这一串字符其实一个公钥换算得出的。我说这个地址是我的,何以证明?唯有私钥。比特币的账户系统是一个叫UXTO 的系统,就是一个流水帐,记录了所有比特币从挖矿被挖出来,到现在所有的交易流转的全过程。前一笔交易的输出就是下一笔交易的输入,环环相扣直至追溯到最初。那我手上的比特币别人给我后,我没有花掉,而是攒了起来,那现在这枚比特币在哪里呢?答案就是UXTO。 UTXO 代表 Unspent Transaction Output,就是未花费的输出。所有的UXTO组成了一个大的列表,保存在比特币网络的每个全节点中。每一个UXTO 都被锁定在一个加密脚本上,只要有人能提供一个解密脚本,使加密脚本的值为真,那他就能将这笔UXTO作为下一笔交易的输入,换句话说,他就可以花这笔钱了。脚本有好几种,今天先说P2PK 脚本。简单描述这个脚本就是解一题 checksig(? , 公钥)=1。 checksig 是一个验证函数,这个公式直接求解出?没可能。 但用私钥生成的签名代入以上公式可以轻松检验。具体算法上说,比特币采用的是椭圆曲线加密的算法(ECC算法),这个原理比较复杂我也不懂,就不展开了。

不可逆加密与比特币挖矿

前面已经讲过单向计算的算法,就是正向计算比较简单,由结果逆推比较困难。而不可逆加密则是完全无法反向的一种算法。 因为加密后无法还原出原始信息,所有用来传递信息肯定是不行的。但是根据函数的唯一性,用相同算法加密相同信息总能生产相同的密文,因此通过对比两次加密后的密文是否一致,可以起到验证信息,签名等用途。HASH(哈希)算法就是一个目前广泛使用的不可逆算法。 hash 算法可以把任意长度的输入经过计算后得到固定长度的输出。 HASH 算法有好多中,如MD5,SHA-1, SHA256等,比特币系统中多处使用了SHA256 算法, 这种算法可以把任意长度的输入计算得出一个256位的字符。被加密的通常是一包数据或一个文件,而加密得到的这个256位字符通常成为这个文件的哈希值。 如果你需要在服务器上保存大量敏感信息例如用户名和密码等信息,最好是进行HASH 加密,这样就是数据库被盗,黑客也比较难以猜出实际的用户名和密码。 但是不可避免的破解方法就是一个一个的试,也就是常说的暴力破解法。 回到比特币系统,HASH 加密只能被穷举法破解的这个特性被充分的利用实现了区块链的不可篡改性以及通过挖矿竞赛形成网络节点的共识上。先说挖矿,比特币网络在协议中规定了一个挖矿难度,比如14,这个难度是指比特币网络上的这个块数据的哈希值的前14位必须是0。 但是你将给定文件用哈希加密后出来值完全是不可预测的,只知道是256位,但每一位是多少完全不可预知,没法控制。如果想得到符合难度要求的hash值,只能不断的改变待加密的文件里面的字符,一遍一遍的尝试直到符合要求。这样每计算一次hash 值称为一次hash碰撞,计算机或矿机进行hash碰撞的速度称为算力。当前比特币全网的算力超过了7000PH/s,也就是每秒在进行7,000,000,000,000,000,000 次hash碰撞,这个数字到底多大已经超过我的理解能力了,可见比特币挖矿行业确实是疯狂。

看到这里,可能有的同学要问了,既然比特币的数据都是放在网上的,那我直接把我以前挖的区块再挖一次,难度不就直接符合要求了吗? 这当然是不可以,这就是聊到了区块链的不可篡改性。 比特币的区块链信息是环环相扣的,每个区块会有一个自身的哈希值,而下个区块的区块头必须包含上一个区块的哈希值,否则这不是一个有效区块,这样就保证了每次挖矿的hash 碰撞都是重新开始的。 矿工在打包区块的时候对区块里面的内容有很高的自由度,通常他会把新产生的未确认交易打包进新的区块中,但他可以对这里面的交易进行选择,比如他痛恨某一地址(可能他的比特币被黑客盗取到了这个地址上),那他可以选择性的不去打包涉及这个地址的交易。极端的条件下,矿工可以挖空块,就是里面没有任何的交易,这样的好处是省了网络下载交易的过程,可以比其他的矿工提前一点时间开始直接开矿,时间就是金钱啊。 当然有一笔交易是必不可少的,就是coinbase交易,也就是直接将新块的奖励的比特币数量打入自己的地址(这个奖励数量也是比特币协议代码里面规定的,大约每4年减半,这就确保了比特币的稀缺性)。 但是,比特币的交易是有手续费的,手续费会直接进入矿工的腰包,这样最经济的方法就是按每字节的手续费大小排序,在不超过区块大小上限的情况下尽量打包更多的交易,这样利己也利他保证了网络的正常运作。 这样等矿工将一个块包好后,就在空白区域去随机填充字符,或改变交易的前后顺序,开始hash 碰撞,一旦得到的hash值符合要求,那一个新的块就生成了,这时候矿工就是尽快把这个块广播到网络中。

因为区块链的hash 值环环相扣,那要篡改区块链需要花很大的代价,因为要靠自己生成从要改的地方开始后面全部的块,这需要大量的hash 计算。 而比特币网络只认长度最长的块,一旦你篡改后的区块生成速度无法赶上正常的区块链生成速度,那篡改就失败了。很明显,篡改最新生成的一个区块还是有机会的,区块越老篡改它的代价越大。一般认为6个区块后这个块就不可能被篡改了,这也就是一般的比特币交易都要求6个区块的确认。

Hash 算法不是只有SHA256,一些其他的加密货币就在这个算法上进行了创新,比如莱特币用了scrypt 算法,以太坊独创了一个Ethash算法, DASH 更狠,用了一个X11算法,就是用11中不同的加密算法串起来(BLAKE, BMW, GROESTL, JH, KECCAK, SKEIN, LUFFA, CUBEHASH, SHAVITE, SIMD, ECHO)。 算法是一个加密货币的核心,如果算法被破解,那整个货币体系就崩塌了,目前SHA256 是经过验证安全的算法,而另一个HASH 算法 MD5 多年前就被数学家破解了,所以现在基本都看不到MD5 的应用了, SHA-1 据说也被谷歌的密码学家破解。 回到加密货币领域,虽然SHA256 算法应用最广数学家对它的破解也研究的最多,但正是这样,SHA256的安全性也经受住了考验,目前认为是安全的。 而其他 scrypt算法等都是程序员自创的,没有证明表明其不可破解性,虽然目前看的确是安全的。 而想X11 这种铁锁横江派算法却根据木桶原理,整体的安全性取决于最脆弱的一个算法,一不小心可能被火烧连营。 此外,计算原理完全不同传统计算机的量子计算机也在持续研发中,一旦成功这些算法都会变的不堪一击,但同时抗量子计算的算法也在同时被研究。

,