区块链-理论入门

一、背景

区块链不是一个单独的技术,而是很多技术的综合,区块链应用与比特币中,比特币的诞生离不开“密码朋克”这个组织的功劳。

密码朋克(Cypherpunk):一个邮件组;组中包含了许多密码天才、计算机精英:维基解密创始人、BT下载的作者、WWW的发明者、智能合作的提出者、Facebook创始人、比特币之父中本聪。

组中讨论的内容有:数学、计算机技术、加密技术、数字货币。  

密码朋克中一系列技术的铺垫,给了中本聪发明比特币很大的灵感。  

①Adam Back发明了Hashcash,使用了工作量证明POW,这是比特币的核心要素;  

②时间戳保证了数字文件安全的协议,这是比特币协议之一;  

③戴伟发明了B-money,强调点对点交易,不可更改记录,比特币中也采用了点对点交易技术;  

④哈尔-芬尼推出了“加密现金”;  

由这么技术铺垫,中本聪发布了《比特币:一个点对点的电子现金系统》。  

比特币底层技术:

![](https://img-blog.csdn.net/20180523234330520?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2x1Y2lmZXJsb25neHU=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70)

区块链来由:由于比特币系统中数据是一个个区块来存储的,并且通过Hash的方式把一个个区块连接起来,这样就形成了区块链。  

二、应用场景

  1. 资产:数字资产发型,支付,交易,结算;
  2. 记账:股权交易,供应链金融,商业积分;
  3. 不可篡改特性应用:众筹,医疗证明,存在性证明;
  4. 点对点特性应用:共享经济,物联网;
  5. 隐私命名特性应用:匿名交易;

三、比特币:

 **1、比特币是一种数字货币;**

 什么是货币?货币是可以承载价值的一般等价物;

 一般等价物:铜币、金银-->银票-->法币(纸币)

 一般等价物本身,如银票、纸币本身不具有价值,之所以可以作为货币,是因为人们都认可,那么一串数字,是否也可以作为货币呢?这就是数字货币。

**2、 比特币的优势,它的信任从何而来:**  

 ①财产只受自己控制,不会像银行里的钱一样可能会被冻结;  

 ②无通货膨胀风险,比特币总量是2100万个,只会升值;  

 ③无假钞,因为需要其他人认可;  

 ④流通性好,全球流通,点对点交易;  

3、比特币还是一种去中心化记账系统;

通常中心化系统把所有数据存在中央服务器,而比特币数据不存在中央服务器,而是将数据存在记账网络中的每一个节点;假设每一个节点相当于一个电脑,那么记账数据会存在每一个人的电脑里,每一个人电脑里都记有账本数据,那么假设有人的账本和其他人不一样,以谁的账本为准呢?这就是涉及到比特币的原理知识,请看后面内容。  

①账本如何验证?哪一个账本是有效的?  

②所有权问题?如何来证明谁拥有这个货币?  

③为什么记账?  

④以谁的账本为准?(共识机制)  

四、账本如何验证?

    有人会说,把所有人的账本拿出来对比,少数服从多数;办法是可以的,但是数据量很大,效率太差。

    **Hash哈希函数**:Hash(原始信息)--> 摘要信息  

    Hash特点:

        ①同样的原始信息用同一个哈希函数总能得到相同的摘要信息;  

        ②原始信息任何微小的变化经过哈希函数都会得到“面目全非”的摘要信息;  

        ③摘要信息无法逆向推算出原始信息;  

    MD5就是一个哈希函数,用来比较文件下载后是否被损坏;  

    根据Hash的特性可以验证账本的有效性!  

![](https://img-blog.csdn.net/2018052400412818?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2x1Y2lmZXJsb25neHU=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70)  

Hash(原始信息) == 摘要信息

**通过对比摘要信息来验证账本!!!**

![](https://img-blog.csdn.net/20180524203816473?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2x1Y2lmZXJsb25neHU=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70)  

下一次记账如下:

新的账本Hash之前会将上一个账本的Hash值作为参数加入:这样每次只需要验证最后一个Hash值就可以判断整个链所有账本是否正确。  

**账本验证总结:每个节点在核对数据时,只需要核对最后一个区块的摘要信息,如果最后一个区块的摘要信息核对正确,那么说明整个区块链的账本是正确的,这样就可以完成高效的账本验证!**

五、账户所有权问题(比特币系统中如何来确定某个账户的比特币是属于谁的?)

首先来看下中心化系统---银行系统如何确定所有权:  

银行系统:用户(银行卡 \+ 密码) ----\>  交易  

如果有人盗刷了你的银行卡,那如何处理呢?第三方(银行)介入,来验证这笔交易是否是你本人操作,如果不是银行卡所有者操作,则银行会撤销此次交易。  

但是比特币系统是一个点对点交易的去中心化系统,没有第三方参与,那么如何来确保所有权呢???  

**1、****比特币解决方案:**

在比特币系统中,账号---->用地址来表示,一个地址就是一个账号;一笔交易,其实就是比特币从一个地址转移到另一个地址;在整个交易过程中,不包含任何个人信息;  

![](https://img-blog.csdn.net/20180524213512477?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2x1Y2lmZXJsb25neHU=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70)  

谁能用这个地址进行支付,谁就拥有了这个账户的所有权。  

**2、密码 ----> 私钥**  

在比特币系统中的私钥,就相当于是银行系统银行卡的密码;  

![](https://img-blog.csdn.net/2018052421404010?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2x1Y2lmZXJsb25neHU=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70)  

①比特币中一个地址对应一个私钥;地址和私钥是非对称关系;

②通过私钥可以得到地址:  

    **Hash(Hash(fun( **私钥 **)))**  ——\>  地址

③地址无法反推出私钥:

④谁拥有了私钥,谁就可以支付;  

那么,在泄漏私钥的情况下,如何证明自己拥有了某个地址的私钥???  

**3、非对称加密技术(对交易签名)**  

**(1)签名过程:**  

    ①对交易进行hash,得到摘要;  

        Hash( 交易信息/转账记录 )  ——\>  摘要信息  

    ②用私钥对摘要签名;  

        Sign( 摘要信息,私钥 )      ——\>  签名信息  

**(2)广播交易:**  

签名之后,付款节点在整个网络中广播,广播的内容包括交易信息、签名信息,让其他节点对此交易进行验证,广播是一个循环的过程,其他节点验证通过后会同时广播给周边节点;  

**4、验证:**  

其他节点收到广播后,开始验证签名的信息是不是付款方用私钥对摘要进行签名后产生的:  

verfiy( 签名信息,付款方地址 )  ————>  交易摘要  

![](https://img-blog.csdn.net/20180524221419123?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2x1Y2lmZXJsb25neHU=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70)  

**5、签名与验证:互为逆运算**  

签名是一个加密的过程:sign(摘要信息,私钥) ——> 签名信息  

验证时一个解密的过程:verify(签名信息,付款方地址) ——> 摘要信息  

六、为什么记账?工作量证明:

记账:是一个Hash打包的过程,会消耗大量的资源;

记账需要消耗资源,那么系统为什么要记账,是因为系统会给参与记账的账户一定的奖励;由于记账具有随机性,因此又称记账为挖矿;  

**1、挖矿过程:**  

①每次记账,系统先发行一定数量的比特币到记账账户;  

②当前每次记账发行12.5个比特币,每个比特币价值>4000RMB;  

③大家争相记账,如果大家一起记账,就会出现记账不一致问题,因此需要制定规则;  

**2、规则:  **

①一段时间内,只有一人可以记账成功,目前一段时间大约十分钟;  

②通过解决密码学难题(工作量证明)竞争获得唯一记账权;  

③其他节点,只是复制上一步的记账结果;  

**3、工作量证明:**  

①记账:Hash(上一个Hash值,交易记录集) = 23434WEG3

②这样记账太过于简单,人人都可以记账成功;为了保证一段时间内只有一个人可以完成记账:需要提高记账难度,所以比特币要求Hash值必须以N个0开头,目前是18个0开头;  

③所以引入了随机数,不停的改变随机数,来获取不同的Hash值去匹配符合条件的值;  

Hash(上一个Hash值,交易记录集,随机数) =  0000000000000000002346ffkw324lf23lsfe23f43t3455f  

交易记录集:

    a.收集广播中还没有被记录账本的交易;

    b.交易有效性验证;

    c.添加一笔给自己的转账交易(挖矿奖励);  

**4、工作量分析**  

区块:Block #512884  

Hash值:0000000000000000002243f4g45g3463sl3424l89fd231583nrkf92i3a3823i98i409o9o32f5rf1wedf6tg  

Hash值以18个0开头,Hash值是十六进制数;  

那么得到一个0的几率是1/16,理论上需要尝试16次,得到两个0就需要尝试16*16次,那么需要得到一个以18个0开头的数字,理论上就需要尝试1618次;  

七、共识机制

既然记账是有奖励的,那么就会有很多人参与挖矿,就可能出现两个节点同时记账,同时完成工作量证明,那么使用谁的区块呢?为了解决这个问题,所以比特币采用了共识别机制,节点的工作量需要得到其他节点的认同才是有效的。共识机制如下:  

1.如果两个节点同时完成工作量证明,每个节点只认同累计工作量最大的区块链,延长最长链;  

2.分叉解决:广播收到哪个节点,就在哪个节点的链上打包,如果同时出现两条链同样长度,那么两条链相互竞争,总有一条链最终抢先完成工作量证明;

如上#2345A和#2345B两个节点同时完成工作量证明,这两条链长度相同,这时候#2345A和#2345B两个节点同时向网络中其他节点广播,收到#2345A的节点在#2345A这条链上继续打包,收到#2345B的节点在#2345B这条链上打包,网络传输速度是不同的,那么最后#2345A和#2345B这两条链,最终总有一条超过另一条链,比如#2346B,那么这条链就是有效的;  

八、总结

1、比特币是一个点对点的区中心话系统,没有第三方参与;  

2、账本验证是个问题?所以引入了Hash函数来进行验证账本有效性;每次只需要比对最后一个快的Hash值是否正确即可,如果最后一个块的Hash值正确,那么整条链的账本就正确;  

3、所有权问题?如何确定账户的比特数属于谁?  

        签名:Hash(交易信息)——>摘要信息,sign(摘要信息+私钥)——>签名信息

        验证:verify(地址+签名信息)——>判断是否等于Hash(交易信息)  

4、为什么记账?记账消耗资源,可以得到系统奖励  

5、工作量证明:引入随机数,提高记账难度,匹配符合比特币条件的Hash值;  

        Hash(上一个Hash值,交易记录集,随机数)==以18个0开头的Hash值  

6、共识机制:每个节点的工作量只有得到其他节点认可才是有效的,每个节点只认可累计工作量最长的那条链;