美文网首页
比特币的原理

比特币的原理

作者: lzh华 | 来源:发表于2018-05-13 10:36 被阅读108次

    Youtube链接  作者:Junqiang Jin

    一、背景

    我们先用一个小故事作为背景来讲述记账的基础需求:

    小青、小红、小皂、小白(青红皂白)4位朋友用客厅公开的白板记账,每个人都需要手写签名已确账本内容。

    由于电脑更加利于存储和备份,所以他们把账本记到了电脑上。

    搬到电脑后出现了一个问题,签名很容易就被复制。

    比如,小红的一个朋友恶作剧,在上面3条账本基础上增加了第4条(小红付款50给小白)。这样到了结算的时候,小红需要无缘无故付给小白50块钱。

    二、数字签名

    既然要用电脑记账,就需要一种不能修改和复制的签名方式,我们称它为“数字签名”。

    如果交易内容产生变化,那么签名内容也应该失效。(下图的50元被修改为51元)

    数字签名有很多种,一般采用哈希算法。

    哈希(hash)算法:SHA-256, SHA:Secure Hash Algorithm(安全哈希算法)

    SHA256是目前公认的安全算法,任何字符串经过SHA256计算后,会得到256位长度的二进制数,如下图所示:

    SHA256哈希碰撞有两个重要的特点

    1、只要原始信息出现一点改变,即使是微小的变动,SHA256的结果完全不同。而且这些变化毫无规律可循。

    2、只要这条初始信息不变,SHA256的结果一直保持不变。

    所以经过SHA256签名后,小红、小青和小皂的交易信息的表达方式变成如下:

    同时,数字签名要同时满足“可鉴别”这个属性。

    那如何让(最后一笔交易)这个签名体现出是小红的签名,而不是别人的签名呢。

    在密码学有一种现成可用的加密方式——非对称加密法

    这里简单说一下

    三、加密算法

    比如说最近的的一种加密方式:在5201314的每个数字都加2 就得到7423636,叫做密文

    对应其解密方式就是:在7423636的每个数字都减去2 就得到5201314,叫做原文。

    这里的2就是秘钥。 这种加密和解密都是使用同一个秘钥(2)的方式,叫做对称加密法

    那么非对称加密是什么呢? 非对称加密使用私钥进行加密,使用公钥进行解密

    私钥不能公开,只能加密的人自己知道(如小红);

    公钥需要公开,其他人利用公钥进行解密。

    公钥是用私钥通过公式计算出来的, 但是无法从公钥反推出私钥。

    那么,非对称加密怎么让签名可鉴别(确认来自于小红)?

    1、首先将原始的交易记录:小红需要付50元给小白,进行SHA的哈希计算,得到

    SHA256(“原始记录”) =      哈希值

    非对称加密方程(参数1: 哈希值,参数2: 小红的私钥) = 加密后后的哈希值 = 小红的签名。

    也就是小红的签名需要包括她确认的交易记录,以及确认她身份的私钥。

    利用小红的公钥,对小红的签名进行解密,得到解密后的哈希值1,

    SHA256(“接受到的记录”) = 哈希值2,

    如果哈希值1 = 哈希值2, 那么:

    1、这条签名是针对这条交易记录的

    2、这条签名是经过小红签名确认的。

        ——如果不是小红的私钥加密的,那么解密出来的哈希值1不等于哈希值2,

    3、接受到的记录与原始记录相同,没有被篡改。

    那么小青小红小皂小白的交易记录,对于的数字签名则可以表示为:

    以上这个记账系统可以初步运行,但是还不足以支撑大规模的应用。

    四、比特币的出现

    2008年11月,网络上出现了一篇名为《Bitcoin: A Peer-to-Peer Electronic Cash System》(比特币:一种点对点的电子现金系统)的文章,署名为Satoshi Nakamoto,也就是中本聪。

    2009年1月,比特币网络上线,人们开始可以用比特币进行记账、转账 。

    下面把我们小青小红用的原始记账系统,向比特币系统进行改造。

    第一步:把付款信息中单位的“元”改成比特币BTC

    第二个改进: 把付款信息中的“需要付”,改成 “支付”——因为电子系统是即使不可撤销的

    第三种改进: 需要有一种方法——确认付款方是否有足量的比特币进行支付。

                银行等金融机构,可以通过用户的账户余额很快确认

                然而中本聪发明比特币就是为了摆脱银行等金融机构——银行可能会倒闭,国家会大量增发货币。

    比特币的解决方案是: 每笔交易都必须把以前的交易作为基础。

    所以小白接收到支付消息后进行检验:

        50BTC >= 50BTC ;

        SHA256(“接收到的支付消息”) = 哈希值1

        使用小红的公钥对小红的数字签名进行解密,得到哈希值2

        哈希值1 = 哈希值2

    所以确认小红的签名有效。

    细节一:

    如果“支付50BTC给小白”修改为“支付60BTC给小白”,那么在输入交易的时候,就必须要也有等值的金额输入(比如“小皂支付10BTC”给小红),保证 50BTC+10BTC >= 60BTC

    支付消息变成:

    “小青支付50BTC给小红 + 小皂支付10BTC给小红 —> 支付60BTC给小白”

    细节二:

    如果小皂支付了20BTC给小红,而小红支付60BTC给小白保持不变

    那么支付消息变成:

    “小青支付50BTC给小红 + 小皂支付20BTC给小红 —> 支付60BTC给小白 ”

    50BTC + 20BTC > 60BTC ,输入值超过了输出值,这种情况怎么处理呢。

    比特币网络的处理方式是,超过的部分支付给发送者本身,这种方式成为“找零”。

    更新后的支付消息变成如下:

    “小青支付50BTC给小红 + 小皂支付20BTC给小红 —> 支付60BTC给小白 + 支付给小红自己10BTC”

    第四种改进:

    因为世界上重名的人太多,需要把支付方的名字小青、小红改成全球唯一的账号。

    小青的账号,也就是小青的公钥。

    账号一般是包含34长度的字符串,例如18F9pbWTLBsBPcVmfz4w1spLozd4M74AHr

    因为账号比较长,为了方便表示为:“小红的账号”或“小青的账号”,如以下截图所示。

    第五个改进: 转账记录的存储和维护。

    每条记录都代表着钱,这些记录是系统运行的基础, 所以转账记录和信息不能只存放在一台电脑上 ; 但同时也不能存在机构或者公司,因为谁也不能保证公司在巨大的诱惑,或者巨大的威胁下去篡改交易记录。

    比特币网络的解决方法是,比特币的每一笔交易都要发送到网上所有节点,让所有比特币客户端都存储交易记录,这样就不会出现缺失。

    但是同时也引来了


    五、3个一致性方面的问题

    1、如何进行同步

        1.部分节点关机,或者离线

    2、如何防止记录被篡改

    3、如何防止双花(指:同一笔比特币收入被重复使用)

    比如小青只有50BTC,小青支付给小红50BTC(消息1),同时又把50BTC支付给小皂(消息1)。

    这两个消息同时发布到网络,因为消息传播的路线不同,所以不同节点接受到不同的消息,如下图。

    3.1  先收到消息1的节点,认为消息2的支付是无效的。

    因为小青的50BTC在消息1中已经被使用。

      同理,先收到消息2的节点,认为消息1的支付是无效的。

    这样,不同的计算机对同一个的账号的交易产生分歧。

    如果通过银行进行交易,就可以很方便解决这个问题——一切以银行的裁剪为准,银行说了算,那么银行就可以规定。

    那么比特币如何解决这3个一致性方面问题。答案是:区块链。

    区块链——是由一个一个区块串联而成,区块中存储的是一个个经过验证的交易记录,比特币网络仅仅认可并维护同一条区块链,通俗地说也就是区块链网络都存储着完全相同的一条链。

    新的交易被存储到新的区块中,并且添加到区块链后——这交易记录才算是得到了比特币网络的确认。

    区块由比特币网络中的矿工节点生成

    ——矿工接收到各个比特币交易记录,

        1、校验这些交易记录是否符合要求

            1.1 是否使用正确的数字签名

            1.2 交易的输入是否有被使用过

            1.3 每条交易的输入值是否 >= 输出值

            等

        2、讲这些交易记录,添加到自己正在整理的新区块中

        3、当矿工制作好这个新区块,就把区块发送到网络上的各个节点 。

    网络上的节点检查这个新区块是否符合要求,如果符合就添加到区块链的末尾。

    那么新的问题来了,比特币网络有很多矿工节点,每个矿工都可以生产新的区块。网络上可能同时生产许多新的区块(100?1000?个)。

    也就是说,对于一个节点可能同时收到矿工节点发送过来的许多个新节点,那么它应该选择哪个新节点添加到网络呢。

    至少不能根据区块到达节点的时间来决定,因为传播路径和时间的区别,每个节点接收到第一个区块一般是不同的。

    比特币如何解决这个问题呢?

    ——采用一个方法,限制单位时间内生产的新区块的数量。

    ——这个方法就是:当矿工把交易记录检验后添加到新区块后,还要求矿工做一个额外的工作。

    这个额外的工作,整个比特币网络一般只有1个矿工能在10分钟左右的时间成功完成(概率上)。

    这个额外的工作分为两步:

    第1步、将新制作的区块所包含的内容(前一个区块的SHA256函数值 + 这个新区块链的基本信息+这个新区块包含的所有交易记录)生成一个字符串

    第2个区块,包括第1个区块的SHA256值;

    第3个区块,包括第2个区块的SHA256值;

    第2步:找1个随机数

    在这个字符串的末尾添加上这个随机数,组成新的字符串。

    SHA256(新字符串) = 1个256位的二进制数,如果这个256位的二进制数的前72位全是0,才算成功完成了这个额外的工作。

    这个额外工作的难度非常高

    新新字符串  =  前一个字符串的SHA256值 + 新区块的基本信息 + 这个新区块的所有交易记录 + 随机数

    每次的SHA256的值是完全随机的,无法预测随机数的规则。所以要找到这个(前72位全是0)的数,只能不断输入新的值,不停地尝试。

    比特币整个网络,平均每10分钟才能完成2^72次方次运算——找到符合要求的随机数;——有时可能是3-4分钟,有时可能要10几分钟才能找到。

    因为完全靠运气,所以哪个矿工找到这个数字也是随机的,类似买彩票。

    但是矿工的计算能力越强, 则运气会越好

    当矿工找到随机数后,把随机数添加到新区块中,并把新区块发布到网络中。

    网络上的节点接受、验证、添加新区块——讲新区块所包含的所有内容(前一个区块的SHA256函数值+这个新区块的基本信息+这个新区块所包含的所有交易记录+找到的这个随机数)组成一个字符串str。

    验证: 如果SHA256(str) 的前72位数都是0,则说明制作这个区块的矿工确实完成了这份额外的工作;并检查区块的其他内容是否符合要求

    添加:如果验证通过,则把新区块添加到自己区块的末尾。网上所有接收到这个区块的节点都做一样的操作。

    六、对矿工的激励措施

    巨大的经济利益,促使比特币挖矿设备的升级,导致整个网络计算能力的提升,导致挖矿的时间缩短。

    比特币网络为了维持平均10分钟生成1个区块的速度,每2个星期调整一次工作难度。比如从前72位数字为0,调整为前73、74位位数字为0。

    因为找到这个随机数完全靠运气,有没有可能两个矿工在相关的时间各自找到一个符合要求的随机数,并各自制作了一个新区块。答案是有可能,而且经常发生。

    如果节点同时接受到两个节点,并且通过验证。 因为两个都符合要求,所以比特币网络也不知道使用哪个区块,因此两个区块都会保留, 从而区块链出现了分叉

    有的矿工先接受到紫色区块,有些矿工先接受到绿色区块,由于不同矿工在不同的区块上创建新的区块。

    情况1:  如果只在紫色区块上产生一个新区块,区块链只认可最长的支链,那么绿色区块链被放弃; 反之紫色区块被放弃。

    情况2: 如果同时在紫色区块上,又同时出现了两个新的区块,那么重复情况1的动作。

    情况3: 如果在紫色和绿色同时生成了新的区块,则添加各自区块上,并等待后续区块的生成。

    大家要注意的是,进行比特币交易转账的时候:

    交易记录虽然被放入区块中,但是这个区块,可能是支链上的区块,如果这个支链不能成为主链的话,交易可能重新变成未确认交易。重新等待确认。

    稳妥起见:当交易后面的确认区块较多的时候,才可以认为该交易被的到确认。一般是6个区块。

    七、 一致性问题的解决


    1、如何进行同步

        无论是第一次安装比特币客户端,还是中途有长时间未联网。比特币客户端会想周围的网络节点下载自己没有的区块。

        检查无误后,添加到自己的区块链上 。

    2、如何防止记录被篡改

        对任何一个区块,任何一个交易记录的修改,都会导致区块链的SHA256函数值不相同,导致这条链断裂。

    这条区块链就不是比特币里面最长的链,而比特币网络只认可和支持最长的那条链。

        窜改这有没有可能修改记录,并不断添加区块到区块链后面,生成1条最长链呢。

    ——因为只有篡改者拥有的计算能力,超过整个网络中其他所有节点的能力之和,他窜改的区块链的生产速度才可能超过现有区块链的生成速度——否则这条链只会短暂存在然后被其他链超越; 窜改者制作的区块链才有可能成长为最长的区块链。

    但是由于比特币网络10年的发展,比特币矿工越来越多,算力越来越强,这种情况微乎其微。

    3、如何防止双花(指:同一笔比特币收入被重复使用)

    如果在制作新区块时,发现有2笔同样的支付输入,则矿工只认可其中一笔支付并加入新区块,放入区块的支付才是比特币网络认可的支付。另外一笔支付会被丢弃。

    八、FAQ

    一、比特币是怎么发行的?

    二、比特币存在什么地方。

    三、

    四、

    五、

    比特币所使用的主要技术和特点:

    相关文章

      网友评论

          本文标题:比特币的原理

          本文链接:https://www.haomeiwen.com/subject/hiokdftx.html