一文理解:区块链与比特币
1.区块链和比特币是一个东西么?
区块链是比特币的底层技术,比特币是区块链技术第一个也是目前最成功的应用。 所以说,区块链是区块链,比特币是比特币,是不同性质的两个东西。
2.比特币:一种数字货币
比特币是一种数字、电子货币,使用密码学的设计来确保货币流通各个环节安全性。在2008年11月1日由中本聪发表比特币白皮书,文中提出了一种去中心化的分布式电子记账系统。
我们平常使用的支付宝、微信、信用卡等,每进行一笔交易,不管是进还是出,都是依靠国家银行在背后进行记账,而银行背后是国家的信用,所以我们很放心。
而中本聪提出的去中心化的电子记账系统,每个人的账本都是公开的。交易双方不需经过如银行、电子支付平台等第三方机构,从而避免了高手续费、繁琐流程以及受监管性的问题。全世界所有矿工都在为你记账,而且信息更新受到密码算法的保护,所以你不必担心风险问题。
3.问题的引入
假设现有4个人分别称之为A、B、C、D,他们之间发起了3个交易,A转给B10个比特币,B转给C5个比特币,C转给D2个比特币。如果是传统的记账方式,这些交易会记录在银行的系统中,这些信息由银行来记录,我们相信银行不会随意添加、删除或修改一条交易记录。
而比特币系统是这样做的,每当有人发起一笔交易,他就要将一笔交易广播至全网,由全网中的某一个人,把一段时间内的交易打包好记录到一个区块上,再按照顺序把这些区块,一个一个的链接在一起,进而形成了一个链条,这就是所谓的区块链。
按照这个系统,就会有以下几个问题:
- 以谁的记录为准呢?比如上面的账单顺序,A用户可能是先记录A把10个BTC给B,后记录B把5个BTC给C这件事。因为网络延迟,D可能先记录B把5个BTC给C这件事,再记录A把10个BTC给B。甚至可能D根本就没有接收到A给B转账的这个消息。
- 为何要记账?无利不起早,凭什么你广播给我消息,我就要收着呢?凭什么我要用自己的计算机资源记录一个和我无关的账目呢?
-
如何防伪?B广播一个记录,说B给A10个BTC,但实际上并没有给,这是一个伪造的记录,我们如何防伪,如何防止记录被篡改呢?还有很多其他问题,比如说双重支付问题,B只有10比特币,他同时向C和D转10个比特币。比如说如何进行个人信息保密问题等等一系列问题。
4.为何要记账?
因为记账有奖励啊。奖励一是手续费的收益,A付BTC给B时,要多付那么一丢丢,作为手续费。奖励二是打包奖励,(我们常说的挖矿就是想得到这个奖励),谁打包就奖励给谁,但只能是一个人打包。中本聪设计的奖励方案是,每十分钟生成一个区块,每打包一个区块会奖励一定数量的比特币。最开始每打包一个区块是50个BTC,过4年会奖励25个BTC,再过4年再减少一半,以此类推。这样比特币的产生会越来越少。越来越趋近于一个最值,计算公式:50×6×24×365×4×(1+1/2+1/4+1/8+…)≈2100万,其中最初奖励50个比特币,每小时有6个区块,每天24小时,每年365天,前四年是如此,之后每四年减半。也就是说,流通的比特币最多只有2100万个,通过打包奖励将其扩散出去,比特币不是无限的。
5.以谁为准?
正因为打包有不少的奖励,所以大家都争着去打包记录。但是,最终只能有一个人打包成功,那么以谁为准呢?
每个人通过工作量证明机制来争夺记账权,他们将会计算一个很复杂的数学题,第一个计算出正确结果的人获得打包的权力。这个数学题很难很难,难到没有任何一个人能直接用脑袋算出来。必须一个一个去尝试,类似于暴力**(就是用计算机去暴力搜索),**的过程就叫挖矿。
5.1哈希函数(Hash)
又称散列函数,散列算法。基本原理就是把任意长度的输入,通过Hash算法变成固定长度的输出。这个映射的规则就是对应的Hash算法,而原始数据映射后的二进制串就是哈希值。最常使用的MD5和SHA都是历史悠久的Hash算法。(文末有sha256算法代码)
简单来说,什么是哈希算法呢?例如比特币中用到的哈希算法SHA256。对于任意长度的消息,执行SHA256算法都会产生一个256bit长的哈希值,称作消息摘要。例如:SHA256(“任何东西”)=01011101010…,一共256个0和1。比如说一张图片,又或者是一段视频,只要执行SHA256算法,就会输出一个256bit的字符串,这个字符串就叫做摘要。
SHA256算法有几个重要特点
-
[1 ] 只要输入的东西不同(哪怕一个小数点,一个空格),输出的摘要一定不一样,而且差距还挺大。
-
[2 ] 执行SHA256算法很快,不管你输入的东西是什么,有多大,SHA256算法都会在很短的时间给你算出结果。但是,如果给你一个摘要,让你找出输入是什么,这几乎不可能做到。其实所有的Hash算法原理都是这样,正向算比较简单,反着算就很难。
5.2挖矿原理
区块链实际上是一大堆的交易信息,比如说下面的一个区块链,一个区快里面不仅有交易信息,还有一个头部(head)。
这里有详细的区块链数据结构介绍,读者如有兴趣,可以点击查看。有利于大家理解区块链
每个人都想打包交易信息,然后接到上边的链上,因为这样可以获得奖励。每个人都有自己的个人区块和主链,个人区块里面记录他刚刚接收到的交易信息。
每个区块的数据结构大致如下
- 每个人都会有属于自己的一个字符串,包括:前块的头部、自己收到记录(也就是账单)、时间戳、随机数等。
- 每个人都将自己的这个字符串作两次哈希运算,得到自己哈希值。Hash=SHA256(SHA256(字符串))= 一个256bit的字符串
- 系统要求,Hash值的前n位为0的人(这就是前面说到的数学题),即为获胜者,将获得打包的权力,将自己的Hash值放到区块头部里面,再链接到主链上,然后拿到奖励,挖矿成功!
- 那如何才能使前n位为0呢?通过不断的改变随机数的值,来一个一个尝试,直到找到符合要求的随机数。谁先找到,谁就挖矿成功。这里要注意一下,每个人的计算难度是不同的,因为每个人所记录的信息、时间戳等都不同,所以每个人的正确答案也不一样。有的人可能运气好,算一次,就可以找到正确答案,有的人算几万次都算不出来,这也是有可能的。但平均来看,谁的CPU在单位时间内计算的次数越多,谁就能更快的找到答案。这也是大家为什么拼命的去买高性能矿机的原因。
- 上边的这个n,是如何确定的呢?很显然可以看出,n越大,题目就越难。平均每十分钟产生一个区块,总体上来看,挖矿成功的概率为1/2n。现假设世界上有1W台矿机,每台矿机的算力是14T次/s = 1.4×1013 次/s,即一秒可以计算这么多次。10分钟是600s,所以10分钟可以做1.4×1013× 600×104=8×1019次哈希运算,从概率角度看,想要挖矿成功需要做2n次运算,列出等式2n = 8×10^19,可以解出n约为66。这时,n就被设置成66,第一个算出前66位为0的人将获得打包的权力。n的值是动态的,随着矿机的增加、计算能力的增加,难度也会随之增加。所以,挖矿没有捷径,只能买更多、更高性能的矿机来增加单位时间内计算的次数。
6.如何防伪、防篡改、防双重支付
这部分简要介绍几个比较重要的方面,有助于了解比特币,还有更多的方面在这里不再赘述。
6.1 身份认证—电子签名(非对称加密技术)
当你注册成为比特币用户时,系统会根据随机数为你生成一个私钥(唯一),私钥又会生成一个公钥(唯一),公钥又会生成一个地址(唯一)。其中私钥必须保密,可以保存到硬盘里或者记到脑子里,一旦丢失,你的所有的比特币将无法使用。而公钥和地址是公开的,别人给你BTC的话,你要把你的地址告诉他。同样,你要给别人BTC的话,你要把你的公钥和地址一块发过去。
了解了公钥、私钥、地址的概念后,防伪验证的过程就很容易理解,当A发起一笔交易后,对消息进行哈希,生成数字摘要,对数字摘要,通过私钥加密,生成一个密码。之后A会广播这条交易消息、公钥以及密码。收到消息的人首先对交易信息进行哈希生成摘要1,再通过公钥对密码进行解密,生成摘要2,这样,如果两个摘要相同,说明这个消息确实是A发出的。所谓的签名,就是密文。
6.2双重支付问题
比如说A有10个BTC,他却同时发了两条消息,一条消息是给B10个,另一条消息给了C10个,这该如何鉴别?
这里要首先说一下余额检查。区块链是把好多交易信息一个块一个块进行打包,然后链接起来的。每一个矿工(参加记账的人),都会把把从创始区块开始的所有区块下载下来(主链)。这样,他就可以知道别人的余额。例如:A广播了一条消息,说A给了B10个BTC,那么收到消息的人,就会在区块链上查询、计算,看看A的比特币最初是从哪来(挖矿获得、或者是别人给他)、A自己用了多少、还剩多少。若A剩余BTC大于等于10个,则这个消息被网络认可,可以作为一条记录被打包放到区块链上,否则网络不接受这个消息。这一过程称之为追溯。
这里要重申一点,很重要!只有交易记录被打包放到区块链上,才叫真正的交易成功,否则,交易失败。
利用余额检查,就可以解决双重支付的问题。接着上边所说的问题,若D先收到消息1(D查询知道,此时A余额已经为0),那么他就会拒绝接收消息2。与此同时,若E先收到消息2(E查询知道,此时A余额已经为0),那么他就会拒绝接收消息1。至于说,D和E谁接受到的消息是对的,就看D和E谁先算出那个数学题,谁先把自己的消息记录打包到主链上。
所以说,当我们要接收别人的付款时或者付款给别人时,我们不能就认为钱已经到账了,我们要等着,只有那条付款记录被打包放到主链上才叫真正到账成功。
6.3如何防止篡改
假设A转给B10个比特币,但是他想把这个信息从区块链上删除,这样大家就都不知道这个事情存在,就可以赖账。
首先说一下比特币里面的最长链原则,假设某一个区块后面有两个矿工同时挖到了矿,或者由于网络延迟等原因产生了分歧,这时,各个节点先根据自己认为对的区块链分支,接着挖矿直到下一个区块产生,这时会有两条链,但是有一条是长的,比特币规定,以最长的链为准。如果某个节点仍然的固执的以较短的链为准,他就是在和大多数算力作对,这样做的结果是,他挖的块不被大家认可,会浪费时间和算力。
如果有一个人想要篡改信息(假设他想篡改的信息在区块三),那么他就必须这样做,如下,他要在原有的区块链上,计算数学题,重新打包一个不含A给B10个BTC这个消息的包,链接到区块二上,形成B链。但是B链太短,别人不承认怎么办?他必须以一己之力,对抗全世界所有矿机,他要把所有数学题都最先算出来,他才有一直打包权力,直到他把B链长度变得比A链的长,那么他就篡改成功了。
但是,理论上虽然可以,但现实操作却几乎不可能,全世界的矿机都在链接A链,而你却要链接B链,每十分钟才能出来一个区块,而且必须你一直都能是第一个算出数学题的人,这可能么?基本没可能。防篡改就是这么来的。
7.总结
比特币,具有匿名性、交易费低廉、速度快、不可逆性(一旦消息被记录在区块链上,就不可能再被修改)、全球通用性等特点。由于比特币的匿名性、全球性,他已经成了黑客敲诈勒索的工具。但比特币的优势也很明显。世界上已经有国家将比特币合法化,像美国、法国、德国等。
区块链是一种技术,不仅仅可以应用在比特币上。笔者认为,这样一种技术,虽然有自身的瓶颈,但还是一种值得研究的方向。完全的去中心化,完全的中心化都不是最好的选择,未来应该是在去中心化和中心化之间取得一个平衡点。
文章大致分析了区块链和比特币的原理,但写的很糙。有兴趣的可以去看看李永乐老师的视频,很经典。本文是根据李永乐老师的视频所写,加上自己的一些不成熟想法。如有不当之处,还请前辈们不吝赐教!
后续有时间,我会再详细写写区块链里面的一些具体技术,区块链的发展等。本文只用作新手去了解区块链和比特币。
大家如对文章哪些点有疑问,可以讨论区交流!蟹蟹~~
Python 实现sha256算法
import hashlib #导入库
m=hashlib.sha256()
#b后面放的就是你想输入的内容
m.update(b"Noboday inspect the spammish repetition.")
m.digest() #输出摘要
m.digest_size #输出摘要大小(以字节为单位)
下一篇: 一. java基础语法自述(1.3)