比特币里的计算机知识

[亡魂溺海] 提交于 2019-12-01 10:24:56

比特币里的计算机知识

 一、人民币、支付宝和比特币有什么区别

(1)人民币

        大家都很清楚,人民币就是中国人民银行发行的货币。这些货币流通到市场中,每个人有了钱以后可以去购买各种商品和服务,人民币就会从一个人手里转到另外一个人手里。钱流通到市场中后,具体某一个编号的纸币在某个特定的时候在谁身上是不确定的,国家也不关心。纸币在实际中是很难复制的,复制成本高、风险也很大。

(2)支付宝

        支付宝,当然包括微信,里面的余额说白了就是一个数据,存储在支付宝和微信公司的服务器上。同人民币不同,数据的复制、修改是不需要成本的。这些电子货币在市场上是怎样运行的?以支付宝为例,首先你要申请一个支付宝账户,然后关联一张银行卡,这样你就可以把支付宝中的钱转出到银行卡或者将银行卡的钱充值到支付宝中。当你消费时利用支付宝付款或者营收通过支付宝收款时,对方也必须要有一个支付宝账号,这样付多少钱实际上是从你的支付宝账号上扣款,给对方支付宝账户加钱。

        这其中涉及到两个方面的数据变动。一是和银行相关:支付宝在各大银行都开了一个账号,个人在用银行卡往自己的支付宝账号充值或者提现,实际上是银行中支付宝那个大账号和你的账号之间的存款变动。当然支付宝公司会将你支付宝账号上的数值进行相应的变动。二是和银行无关,支付宝内部数据转换。当你和对方之间一个用支付宝进行付钱、另一个进行收钱,这个时候就跟银行没有关系,是支付宝自己内部数据的转换问题。

        国家发行的纸币是以国家的信用进行背书,确保纸币有购买力,而不是废纸,通货膨胀贬值除外。银行卡里的存款安全是以银行的信用进行背书,当然我国的银行主要是国有银行,其实也是以国家的信用背书。支付宝、微信的电子货币支付是以蚂蚁金服和腾讯公司的信用进行背书的。如果有一天蚂蚁金服把在各大银行中开的账户钱全部转移后注销掉,同时宣告各位支付宝上的余额就是一个数字,没有任何意义,甚至直接将所有的支付宝账户余额全部清零。这并非不可能发生。作为国家肯定有一定的监管措施的,比如支付宝在工行开的账号在一定时间内有异于平时有大量的资金流出到其他少数账号中,那就进行冻结交易,进行调查。但是支付宝公司直接将每个人支付宝账户数字清零,即使其在银行开的大账户有钱也不知道怎么给各位分配。

        支付宝的支付、数额在不同用户的支付宝账号之间变动,这个实现是比较复杂的,最难的就是怎样确保安全,可靠,不会出错,所以安全是互联网金融的生命线。

(3)比特币

        上面提的人民币、银行卡、支付宝等都是中心型的。英国的思想史学家阿克顿在《自由与权力》中说到:权力导致腐败,绝对权力导致绝对腐败。永远信任某个机构不作恶是比较危险的。

        为了解决这个问题,比特币就是采取了另外一种思路:简而言之就是去中心化。每一个人都有一个账本,账本都是公开的,每个人都可以去查,看看什么时候谁给谁付了多少钱。其次账本只能写入新的交易记录,任何已经写入的记录永远都无法更改,如果有人尝试着想篡改,所有的人都可以发现。这与海上进行航海日志填写相似,当天的日志记录完毕后以后是不能更改的。

        这里要重点解决两个问题:

        第一,怎么要做到账本无法篡改,不管谁修改了大家都可以发现。需要用到计算机中的密码学。主要用到了两点,一是数字签名技术,比特币采用的是椭圆曲线数字签名算法,二是哈希算法,比特币中用的是SHA256。

        第二,比特币是一个去中心化的分布式系统,就存在一致性问题,分布式系统中最核心的就是一致性问题。

 二、比特币怎么做到防篡改

(一)区块中的交易记录怎么防篡改

        每个区块中有若干条交易记录,这些交易记录怎么防篡改?比如A给C转了100块钱。大家查账本时怎么确定是A转的,而如果B说是他转的,怎么确定B是撒谎。这里就用到数字签名。密码学里有对称加密和非对称加密。对称加密中加密秘钥和解密秘钥是相同的,而非对称加密中公钥和私钥是不同的,且为成对出现。比特币这里用到的就是非对称加密:椭圆曲线算法。

        一个人的公钥是公开在互联网上的,每个人都知道,私钥是自己留存的,只能自己掌握。一些可信任的第三方组织或者公司专门进行颁发公钥和私钥对的数字证书。用自己公钥加密过的数据只能用自己私钥解开,同样用自己私钥加密过的数据也只能用自己公钥进行解密。所以这里存在正反两个方向:(1)如果他人要发送数据给我,那么先用我公开在互联网上的公钥对数据进行加密,加密完毕发送给我,我再用自己的私钥对数据进行解密。这样即使数据被人截获也不要紧,只有我自己有可以解密的私钥,这就是利用公钥私钥对进行数据的加密传输。(2)另一个方向:如果我有一份文件需要传给朋友,朋友收到之后怎么确定是我发的呢,这就需要我先用自己的私钥对文件进行加密,朋友收到后利用我的公钥进行解密,只有用我的私钥加过密的文件才能用我的公钥正确的解密,这就是数字签名功能。

        目前流行的非对称密码算法主要有3中:RSA密码体制、基于离散对数问题的密码体制和椭圆曲线密码体制。比特币中使用的签名算法就是椭圆曲线算法,相对于其他两种,加密性更强。在比特币系统中,一对公钥和私钥就代表了一个人,每个人的公钥是公开的,其他人要验证一条消息是否是某个人发送的,只需要将他的公钥来去验证一下即可判断真伪。

(二)区块链中的区块怎么防篡改

        怎么确保之前区块不会被篡改。这里要用到计算机加解密中另外一项技术:哈希。哈希和前面讲的对称加密和非对称加密不同,对称和非对称加密是双向的、可逆的,比如我用对称加密密钥对数据加密后可以再用该秘钥进行解密,用非对称加密中的公钥对数据进行加密或者私钥进行签名后,对端可以用私钥进行解密或者公钥进行验证签名。

        而且哈希函数是不可逆的,哈希函数计算了一个消息的摘要,而这个摘要是一个非常短的、固定长度的字符串,这个消息摘要可以看成是该消息的指纹。哈希函数必须满足几个条件,第一哈希函数是单向的,即不可逆的,也就是说给定一个哈希值,你是无法倒推出对应的消息的。第二哈希函数要弱抗冲突性,完全的抗冲突性是不可能的,比如常用的MD5摘要算法其得出的消息摘要是128位,根据鸽笼原理可知,必定有不同的消息得到的消息摘要是一样的。存在弱冲突不要紧,只要在实际应用中不要被发现即可。这是操作可行的,在实际应用中碰到两个消息得到的消息摘要是一样的概率几乎可以忽略不计。第三抗冲突性,消息1经过哈希计算得到摘要1,理论上存在消息2经过哈希计算也得到摘要1,但是这在计算上是不可行的。满足了这三个基本条件才可以,目前常用的有MD5、SHA-256、SHA-384、SHA-512哈希函数。比特币中使用的是SHA-256哈希算法。我们平时下载一个软件安装包,下载完毕后进行完整性校验,防止被不法之徒加入一些病毒之类的,用的就是这个原理。

(三)区块链的结构及形成

        前面介绍了区块中的交易记录怎么防篡改和已经写入到区块链系统中的区块怎么防篡改,下面来具体看下。

        首先来看每个区块中有什么:第一有若干条交易记录,前面分析过一条条的交易记录是通过公钥密码算法进行数字签名确定记录的真实性。第二有表头,每个区块前面都有一个表头,表头中存了前一个区块的地址和前一个区块的哈希值。

        每一个区块是有大小限制的,区块链中的区块数目是在不断增加的。这样就形成了一个单向链表,且最新生成的区块在链表的最端。其中第一个区块称为创始区块。我们来看一下整个区块链的生成过程:

        首先系统中只有一个区块A,区块A中包含了若干条交易记录,这些交易记录都是用各自用户的私钥进行签名过的。区块A的地址和哈希值广播给系统中的每一个成员。如果区块A被修改了则其他人将区块A进行一下哈希运算其哈希值是否对应得上就可以判断是否篡改过。

        运行一段时间后,区块A存储不下了,这就需要新增一个区块B。B的表头记录了A的地址和哈希值,这样B的地址和哈希会被广播给系统中的所有人。这样B无法篡改了,因为B的哈希值大家手上都有,同样A也无法篡改,A篡改了通过B中存储的A的哈希值同样可以发现。按此方式,系统继续运行,区块C、区块D按照同样的方法添加进来。

三、区块链中共识问题

        比特币系统中每一个人都可以进行查账,由此判断是否发生了篡改。那么谁负责记账呢,就是一条条的交易信息谁负责将其写入区块中。本来由一个权威的人负责写入是最简单的,但是这和区块链去中心化思想是矛盾的。所以比特币采用的是人人记账方法。这里就产了一个难题,就是分布式系统一致性问题,这也是分布式系统中最核心的问题。

        分布式系统一致性:这个系统中某个节点提出某个值,经过一系列步骤,所有的节点达成共识,选取了相同的值,而且这个值必须是某个节点提出来的。

        采用区块链技术实现一款电子货币,其不可篡改采用的方法是通用的,就是公钥密码算法和哈希算法,不同的是选取的算法不一样。最重要的是解决分布式系统一致性问题,也就是说共识问题才是关键。

        一个简化的共识算法:

        1.提议的某条交易信息被广播到系统中的每一个节点中。

        2.每个节点把自己收到的交易信息写入一个新的区块,写入新区块的交易信息如果成功加入到了区块链中,就被成功执行了。

        3.新的一轮开始的时候,整个系统中某个节点被随机选中,被选中的节点把自己的新区块广播给大家。

        4.每个收到新区块的节点会对新区块里的交易记录进行验证,采用交易记录中相关成员的公钥信息进行验证,验证无误之后将这个新的区块加到自己的本地账本中。

        怎么确保每一个人的账本是一致的呢?如果上述算法在完美的条件下运行是可以做到的,什么是完美的环境:就是系统中的每个成员都是守规矩的、网络相当可靠。但是在实际中是不可能存在的。一个是系统中网络是复杂不可靠的,二是不是系统中每一成员都值得信赖。在比特币系统中采取的方法是:遵循一条原则,就是整个系统中最长的那个区块链是大家公认的真相。

        那为什么比特币系统中被选到的节点愿意努力去生成这个区块呢?因为系统会给奖励。如果他创建的那个区块最终进入到系统中那条最长的区块链中,可以获得可观的奖励。对于它成功写入的交易,都要给他一笔手续费;每个新区块的创建者都会获得一笔额外的比特币,这个数目每四年减少一半,最开始四年是50个比特币,之后是25个,依次类推。

        那到底谁创建的区块可以被系统接受?一个区块被创建出来,是需要计算其哈希值进行完整性校验的。区块中有一段随机填充的空间,其值无意义,唯一的作用就是为这个区块产生不同的哈希值。比特币网络要求产生的哈希值的前若干位全部为0。为了生成合法的哈希值,对于生成的新区块,必须通过改变随机区域的值,这个没有捷径可以走,只能采用穷举法,一次一次的进行计算,一直计算到前面若干位都是0的哈希值。这就是比特币的挖矿,大家通过贡献的算力进行奖励的分配。不管网络上有多少算力在进行计算,反正比特币的区块都是每10分钟产生一个,如果算力多了,那么产生的哈希前面的0的个数就多,反之就少一些。比特币系统中参与计算的人越多,算力越强,整个系统就越稳定。

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!