区块链不是一个单独的技术,而是很多技术的综合,区块链应用与比特币中,比特币的诞生离不开“密码朋克”这个组织的功劳。
密码朋克(Cypherpunk):一个邮件组;组中包含了许多密码天才、计算机精英:维基解密创始人、BT下载的作者、WWW的发明者、智能合作的提出者、Facebook创始人、比特币之父中本聪。
组中讨论的内容有:数学、计算机技术、加密技术、数字货币。
密码朋克中一系列技术的铺垫,给了中本聪发明比特币很大的灵感。
①Adam Back发明了Hashcash,使用了工作量证明POW,这是比特币的核心要素;
②时间戳保证了数字文件安全的协议,这是比特币协议之一;
③戴伟发明了B-money,强调点对点交易,不可更改记录,比特币中也采用了点对点交易技术;
④哈尔-芬尼推出了“加密现金”;
由这么技术铺垫,中本聪发布了《比特币:一个点对点的电子现金系统》。
比特币底层技术:
区块链来由:由于比特币系统中数据是一个个区块来存储的,并且通过Hash的方式把一个个区块连接起来,这样就形成了区块链。
二、应用场景
三、比特币:
1、比特币是一种数字货币;
什么是货币?货币是可以承载价值的一般等价物;
一般等价物:铜币、金银-->银票-->法币(纸币)
一般等价物本身,如银票、纸币本身不具有价值,之所以可以作为货币,是因为人们都认可,那么一串数字,是否也可以作为货币呢?这就是数字货币。
2、 比特币的优势,它的信任从何而来:
①财产只受自己控制,不会像银行里的钱一样可能会被冻结;
②无通货膨胀风险,比特币总量是2100万个,只会升值;
③无假钞,因为需要其他人认可;
④流通性好,全球流通,点对点交易;
3、比特币还是一种去中心化记账系统;
通常中心化系统把所有数据存在中央服务器,而比特币数据不存在中央服务器,而是将数据存在记账网络中的每一个节点;假设每一个节点相当于一个电脑,那么记账数据会存在每一个人的电脑里,每一个人电脑里都记有账本数据,那么假设有人的账本和其他人不一样,以谁的账本为准呢?这就是涉及到比特币的原理知识,请看后面内容。
①账本如何验证?哪一个账本是有效的?
②所有权问题?如何来证明谁拥有这个货币?
③为什么记账?
④以谁的账本为准?(共识机制)
四、账本如何验证?
有人会说,把所有人的账本拿出来对比,少数服从多数;办法是可以的,但是数据量很大,效率太差。
Hash哈希函数:Hash(原始信息)--> 摘要信息
Hash特点:
①同样的原始信息用同一个哈希函数总能得到相同的摘要信息;
②原始信息任何微小的变化经过哈希函数都会得到“面目全非”的摘要信息;
③摘要信息无法逆向推算出原始信息;
MD5就是一个哈希函数,用来比较文件下载后是否被损坏;
根据Hash的特性可以验证账本的有效性!
Hash(原始信息) == 摘要信息
通过对比摘要信息来验证账本!!!
下一次记账如下:
新的账本Hash之前会将上一个账本的Hash值作为参数加入:这样每次只需要验证最后一个Hash值就可以判断整个链所有账本是否正确。
账本验证总结:每个节点在核对数据时,只需要核对最后一个区块的摘要信息,如果最后一个区块的摘要信息核对正确,那么说明整个区块链的账本是正确的,这样就可以完成高效的账本验证!
五、账户所有权问题(比特币系统中如何来确定某个账户的比特币是属于谁的?)
首先来看下中心化系统---银行系统如何确定所有权:
银行系统:用户(银行卡 + 密码) ----> 交易
如果有人盗刷了你的银行卡,那如何处理呢?第三方(银行)介入,来验证这笔交易是否是你本人操作,如果不是银行卡所有者操作,则银行会撤销此次交易。
但是比特币系统是一个点对点交易的去中心化系统,没有第三方参与,那么如何来确保所有权呢???
1、比特币解决方案:
在比特币系统中,账号---->用地址来表示,一个地址就是一个账号;一笔交易,其实就是比特币从一个地址转移到另一个地址;在整个交易过程中,不包含任何个人信息;
谁能用这个地址进行支付,谁就拥有了这个账户的所有权。
2、密码 ----> 私钥
在比特币系统中的私钥,就相当于是银行系统银行卡的密码;
①比特币中一个地址对应一个私钥;地址和私钥是非对称关系;
②通过私钥可以得到地址:
Hash(Hash(fun( 私钥 ))) ——> 地址
③地址无法反推出私钥:
④谁拥有了私钥,谁就可以支付;
那么,在泄漏私钥的情况下,如何证明自己拥有了某个地址的私钥???
3、非对称加密技术(对交易签名)
(1)签名过程:
①对交易进行hash,得到摘要;
Hash( 交易信息/转账记录 ) ——> 摘要信息
②用私钥对摘要签名;
Sign( 摘要信息,私钥 ) ——> 签名信息
(2)广播交易:
签名之后,付款节点在整个网络中广播,广播的内容包括交易信息、签名信息,让其他节点对此交易进行验证,广播是一个循环的过程,其他节点验证通过后会同时广播给周边节点;
4、验证:
其他节点收到广播后,开始验证签名的信息是不是付款方用私钥对摘要进行签名后产生的:
verfiy( 签名信息,付款方地址 ) ————> 交易摘要
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、共识机制:每个节点的工作量只有得到其他节点认可才是有效的,每个节点只认可累计工作量最长的那条链;