比特币和区块链基本概念
[TOC]
比特币介绍
比特币是一种电子货币或者叫数字货币,它是基于密码学的一种货币。
比特币历史
2008年11月1日,一名网络极客,化名中本聪(到目前为止也不知道他到底是谁),在网络上发表一篇现在被称做《白皮书》的文章,全名叫《比特币——一种点对点的电子现金系统》,
设计思想
白皮书中提到的主要构想:设计一种去中心化的电子记账系统。我们在交易的时候最重要的一件事就是记账,之前是银行记账,我们信任银行是因为银行的背后是国家信用背书,中本聪提出我们不需要一种中心化的记账系统,每一个人的账本都是让别人去看,都是公开的,这就叫去中心化的电子记账系统。
区块链
比如,有A,B,C,D四个人进行交易,相互之间要进行支付。一次交易A向B支付十个BTC,这件事情要记账,记账之后不能自己留着,不然别人不信,所以要把账单广播出去告诉所有人(B,C,D),之后B又向C支付5个BTC并广播出去(A,C,D),之后C又支付2个BTC给D并广播出去….等到账单比较多了将这些账单打包成一个块,我们称之为区块,一个区块大小大概是1M,可以存4000条左右的记录。等到这个块打包好之后,我们再把这个块链接到以前的交易记录上形成一条链,就叫区块链。
要解决的问题
有了这么一个系统之后就要解决几个问题,
-
账单以谁为准?
每个人的账单可能不是一样的,比如A可能会先记录A->B(10BTC),后记录B->C(5BTC),但是因为网络延迟等原因,D这边的顺序可能是先记录B->C(5BTC),再记录A->B(10BTC),每个人的账单可能不一样,到底是以谁为准
-
为什么要记账,凭什么你广播给我,我就要花自己的电脑资源去记一个跟我无关的账,
-
安全性
- 伪造,比如B广播说A->B(10BTC),但是A并没有支付10个BTC给他
- 篡改,之前的记录把它改掉
- 双重支付,一个人同时发给两个人十个BTC,但他自己一共只有10个BTC
- 如何保密,信息是公开的,别人知道你有多少钱
为什么要记账
记账有奖励,每一个比特币系统中的用户都可以去记账,如果他记了账,会有奖励
-
手续费的收益
如果A要付10个BTC给B,A必须多付一点点,这一点点就是给这个打包的人也就是记账的人一个手续费。这个手续费比银行卡的手续费低的多。
-
打包奖励
一个包只能由一个人打,打包奖励系统大致是
每十分钟打一个包,最开始这一个包会奖励打包者50个BTC,过了4年之后每打一个包会奖励25个BTC,再过四年就是12.5个,也就是每过4年会减半,可以算一下截止到现在一共有多少个BTC,
- 打一个包有50个BTC
- 一个小时6个十分钟,可以打包6次,每天24个小时,每年360天,前4年都是这样,后四年减半
所以,共有:$50 * 6 * 24 * 365 * 4 * (1 + 1/2 + (1/2)^2 + (1/2)^3)$ 按照16年算,大概2100万个
比特币就是通过这种打包奖励这种方式把它扩散出去的。
第一个区块叫创世区块,不是挖出来的,是中本聪自己生成的。里只有一条交易,这条交易给中本聪的一个地址发了50BTC,不过这50BTC没有进入UTXO集合,等于不存在,不能花出去。
有了手续费和打包奖励,大家都抢着去打包,这也是为什么大家都拼命买矿机的原因,那么以谁为准呢?
以谁为准
每次打包只能交给某一个人,那么交给谁呢?中本聪想到一个办法叫工作量证明,
工作量证明
每一个想参与打包的用户他都要去做一个很难的数学题,做出来这个数学题就可以有权利进行打包,你如果进行打包就会获得手续费以及打包奖励。这个很难的数学题难到什么程度,难到没有任何一个人能够直接通过脑子把它做出来,必须一个一个数去尝试,直到尝试出来才能获得这个奖励,这个过程又称之为挖矿。
挖矿
数学题并不是看你脑子聪明不聪明,而是看你cpu的速度如何,因为没有人能够通过脑子把它算出来,大家的方法只能一个个去试,具体的原理如下
哈希函数
也可以叫数字摘要或者散列函数,把一个字符串通过一定的运算,转化成一个摘要的形式,而且是正着算比较容易,反着算很难,比如哈希算法里一个很著名的算法SHA256,这是美国国家安全局发明的一种算法,
把一个字符串输入到SHA256函数里面,$Sha256(“apple”)$,输出的是一个没有什么规律的二进制数,共有256位,比如“1011010111…”,不管输入什么,输出都是256位二进制数,即使你将一个10个G的电影输入进去,而且你改一点点它这个数字都不一样,
哈希算法的难度就在于,正向算比较容易,反向算非常困难,举个例子,有这么个函数,
$x^3 + log_2x+sinx=y$
给一个x很容易算出y,给一个y则很难算出x,哈希函数比这个还要难的多,所以它反算基本上是不可能的,我们只能怎么办,只能一个一个去试。你告诉我一个结果y,我只能一个个去试x,直到试出来为止。
挖矿就是基于这个SHA256的运算,
挖矿具体原理
区块链就是一大堆的交易信息,比如说区块链已经链接到了某一个位置,这个块里并不是只有交易信息,包括区块头,交易信息(记录账单),现在很多的人都想打包,每个人都有自己的账单,这个账单是他收集了周围一大堆人造成的账单,每个人都拿着账单准备去网上接块,但是在接块的时候他必须要算一个数学题,
-
首先会有一个字符串,这个字符串里的内容非常多,主要包含 : 前块头部 + 现在已经有了的这个账单的信息 + 时间戳 + 随机数 + …
-
哈希运算,对这个字符串做两次SHA256运算,$Sha(Sha256(字符串))$,这个运算速度很快,一下子就能算出256位二进制这个结果,
-
要求算出来的256位结果要满足前n位必须是0,满足要求就有资格打包,把算出来的哈希值作为一个新块的头部,再将这个块接到区块链上,然后就获得了想要的奖励
那么怎么能算出来满足要求的结果呢,只能通过改变字符串中的随机数,因为其他内容改变不了,随机数从0开始不停地试,直到把它试出来为止。
注意每个人在算这道题的难度是不一样的,因为每个人虽然前块的头部一样,但是所打包的这个账单不一样,时间戳也可能不一样,还有个人信息也不一样,所以造成每个人试出来的随机数大小不同,有的人运气好可能第一个数就算出来,有的人运气不好虽然计算能力强但是算好长时间最后也算不出来。不过平均来讲,谁的计算能力更强,谁就更有希望打包这个块,谁就更有可能挖到这个矿。
挖矿难度n的确定
挖矿的难度就是 要求满足前n位必须是0 的这个n,这个n是怎么确定的呢
每一位上是0还是1的概率是1/2,所以前n位都是0的概率是$(1/2)^n$,中本聪在设计的时候,就是保证每10分钟需要出一个块打包几千条信息,如何保证呢,就是通过调整难度也就是这个n,举个例子,
世界上有10000台矿机,每台矿机的计算能力是14T/s(每秒做14T次哈希运算),10分钟能算:
$1.4 * 10^13 * 10^4 * 10 * 60 = 8 * 10^19$
概率是$(1/2)^n$,所以需要平均计算$2^n$次才能出结果,所以通过计算$2^n = 8 * 10^19$,算出n约等于66,所以将难度设成n=66,第一个算出前66位全是0的人就成功打包这个块,你没有办法让自己的运气更好,能做的就是买更多的矿机,然后拼命地去挖矿。
比特币是一种去中心化的电子记账系统,它的所有记录都是公开且匿名的,这样比特币就面临几个问题,它如何去解决伪造记录,篡改记录和双重支付的问题
身份认证
必须保证每一条记录都是由比特币持有者所发出的,而不是由其他人伪造的,传统的认证方式有:人脸识别,签名,指纹识别等,但是这些认证方式在电子支付系统上都不能实现,因为无论人脸,签名,指纹等都可以利用计算机系统进行拷贝,所以必须对传统的身份认证方式进行更改,
电子签名
比特币用户在注册的时候,系统会生成一个随机数,通过这个随机数产生一对分别叫私钥和“公钥”的字符串,私钥和公钥是对应的。同时又可以产生一个地址。
- 私钥必须保存好,私钥丢了那你的所有比特币也都不见了,所以有些人把私钥放在一个不联网的电脑里面,增加一些数字防止被盗走
- 公钥和地址都是公开的,想要别人给你钱告诉地址即可,想给别人钱则要把公钥和地址一起发送过去,这两个都是公开的,被人知道也没关系
通过公钥也反算不出来私钥,像前面说的SHA256算法只能正着算,反着算不出来,同样的私钥到公钥可以算,这也是一种加密手段,那么私钥和公钥有什么作用呢?
私钥可以对一串字符进行加密,公钥可以把这个私钥加密之后的数据进行解密,加密和解密的钥匙不一样,称之为非对称加密,最典型的非对称加密就是RSA加密,比特币也是采用了非对称加密,只有你可以加密,任何人都可以解密你加密的信息。
现在有个人A想要付10BTC给B,他该怎么办,
- A首先写一条记录,就是 “A付给B10个BTC”
- 然后将这条记录进行数字摘要,也就是SHA256算法做的哈希运算,算出来一个摘要1
- 再通过私钥对这个摘要加密,生成密文
- 对外广播一条信息,原始记录 “A付给B10个BTC” + 自己的公钥 + 刚才加密的密文 一起广播出去
- 别人收到这条信息,就会琢磨A说给了B 10个BTC,是不是真的,验证过程:
- 对原始记录 “A给了B10个BTC”做哈希,得出一个摘要2,和A自己哈希出来的摘要1完全一样
- 利用公钥和密文进行解密,解密出来一个摘要3
- 将摘要3和摘要2进行对比,如果完全一样,说明这个密文是真实的,因为只有A拥有他唯一的私钥可以进行加密;如果不一样,那就说明这条消息是伪造的。这样一来就保证了所有A发给B的消息都是由A签发的
这种方式我们就称之为“电子签名”,银行卡很多时候也是采用这种方法进行电子签名的。
以上是解决第一个问题,也就是如何证明A发给B10个BTC,这条消息是A发出的,而不是别人伪造的。
对付双重支付问题
比如A一共有10个BTC,但他几乎同时发了两条消息,分别是A->B(10BTC),A->C(10个BTC),那这个时候别人又如何去鉴别,要解决这个问题,首先得说下如何进行余额检查
余额检查:追溯
区块链是将很多交易信息,一个块一个块打包然后串联起来,每一个人在使用比特币的时候都会下载所有信息(从创世区块开始),如果有一天A说 我要付给B10个BTC 并且广播出去,
别人收到这条消息验证完真实性后就会检查 A的比特币是从哪来的,比如 A 在第三个区块获得50个比特币,在第四个区块A已经支付20个比特币,别人一算$50 -20 = 30$ ,现在A支付B 10个比特币 是可以的,于是这条消息就会别网络所接受,反之如果A说要付给B60个比特币,则这条消息不会被别人确认。
这样就解决了余额的问题,方法就是追溯
双重支付
现实中的例子就是一个卖房子,同时卖给两家
区块链,顾名思义,首先是一个链,记账的过程也是一个串行的操作,通过挖矿去形成链上的一个个节点,挖矿这个操作其实就是一个将并行变串行(极小概率出现多名矿工同时挖出新的区块)的操作,只有一个幸运儿允许进行打包,所以记账这个操作可以理解为一笔一笔进行的,当先操作A->B(10BTC),此时A只剩下0个比特币,再去处理A->C(10个BTC)则会余额检查不过,于是这条消息不会被确认。
所以当我们接受别人给我们付款时,我们不能当时就认为钱已经到账,必须等到这条消息已经被记到主链上了,才能认为这个钱已经真正打给我们了。
即使当多名矿工同时挖出新的区块,根据比特币系统规定,只认最长合法链,这也是所有矿工的共识,所以当一个合法的新区块被挖出后,所有矿工将在此区块的基础上挖下一个区块,因为这对所有矿工而言,都是最经济、利益最大化的选择,而另外一条链将被矿工抛弃,弃链上的区块也称为孤块。 这也确保了公链是串行的
参考:
防止篡改
比如说有个想篡改记录的人,首先他不可能伪造别人的签名,但是他可以删掉自己的某一条记录,比如说他本来付给了别人十个比特币,现在想删掉这条记录,怎么防止这件事?首先要说下比特币有个“最长链原则”。
最长链原则
防止篡改
第三个区块上记录A->B(10个BTC),现在A想改这条消息,就必须以第二个节点为基础重新打包,重新打包后造出一个支链,这个支链时不含A->B(10个BTC) 这个信息的,但是为了别人不承认这条链,因为这条链不够长,于是你在支链上面继续往下算,什么时候算的比公链还要长了,那么全世界的人都会跟到你,于是你伪造成功了。
也就是理论上来说是可以进行伪造的,仅当你的计算能力占了世界上一半以上,但是要知道当一个人很有钱,他就不会去甘当一个小偷,同理如果一个人控制了世界上一半以上的算力,他也不会去通过这种方法就为了抹掉自己的一条记录,还不如在真正的链上继续挖矿赚取更多的钱。
而且随着后续的链的增加,改动的难度就越来越大,所以一般大额的交易都要多等几个块,比如说等6个块之后,我们就认为基本上没有可能再去进行篡改了,就确认了这条交易消息。
结语
比特币作为一种技术手段是非常新颖而且漂亮的,比特币也没有一个中心发行机构,不用担心主权危机,比特币总量固定,不会存在滥伐的风险,比特币天生具有防伪属性,而且可以追溯,比特币交易的时候手续费非常低。
由于有这么多的优点,有人甚至提名中本聪应该获得诺贝尔经济学奖,但是又因为比特币是一种匿名的货币,它在交易的时候只需要一个公钥和一个地址,你又不知道背后的交易者到底是谁,所以就给很多犯罪分子提供了可乘之机,比如有人利用比特币进行敲诈,贩毒,洗钱等等这样的活动,也受到了一些政府的打击。
还有些人把比特币当做一种投机手段,比特币暴涨暴跌造成了许多人一夜暴富,也有许多人倾家荡产,希望大家把比特币看作是一种技术手段, 如果要购买比特币 也应该从投资而不是投机的角度,因为从长期来看,任何一种投机行为都会使你输的倾家荡产,而投资才能使你获得稳定收益。