账本
区块链账本是一个基于密码学安全的分布式账本,是一个方便验证不可篡改的账本.
讲到区块链就不得不说明一下哈希函数: hash(原始信息)=摘要信息
哈希函数有几个特点:
- 同样的原始信息通过同一个哈希函数总能得到相同的摘要信息
- 原始信息任何微妙的变化都会使哈希出来的摘要信息面目全非
- 摘要信息不能逆向推算出原始信息
#举例说明:
Hash(张三找冲哥借了100w,一天后还,利息10w)=ABC123,于是账本上就有了ABC123这条记录.
由此可见账本信息展现了哈希函数的几个特点:
1.很好理解,信息变短了
2.账本是ABC123这条信息,原始信息被隐匿了,能够直接用摘要信息代替原始信息
3.如果双方出现欺骗,可以由ABC123来还原原始信息并验证是谁在撒谎
那么区块链是怎样记账的呢
假设有一个账页序号为0的交易记录如下
---------------------------------------------------------
账号 入账 出账 余额 备注说明
王二 100 190 收到xxx货款
张三 100 30 xxxx
李四 120 90 170 xxxx
记账时间为:2017-10-22 10:22:02
----------------------------------------------------------
区块链会在记账时把账单信息(包括序号,时间,记录等)作为原始信息进行Hash得到一个Hash值,如:ABC123
用函数表示为:Hash(序号0,时间2017-10-22 10:22:02,交易记录xxx)=ABC123
账页信息和Hash值组合在一起就构成了一个区块.
#比特币是十分钟记一次账,即每个区块形成的时间为十分钟
在第二次记账的时候,则会把上次生成的Hash值作为原始信息Hash进去:
Hash(上一个Hash值,序号,时间,交易记录)=BCD234
这样第二个区块不仅包含了此次的账本信息,还包含了上个区块的信息.
照这样记账最新的区块总是包含了之前所有的账本信息.
所有这些区块组合起来就形成了区块链,这样的区块链就构成了一个便于验证(只验证最后一个Hash值就等于验证了所有账本),不可更改(任何一个区块的更改,会导致之后形成的区块的Hash值发生变化,这样在验证时就无法通过)的总账本.
账户所有权问题
-
现有的转账:在银行通过身份证,手机号,拍照等等进行注册便生成了属于个人的银行卡号.甲通过乙的银行卡号给乙转账100元实际上就是在银行上面的账本上进行甲:-100和乙:+100,所有的安全操作都是通过银行来保证,这样就导致银行在特殊情况下会撤销此次转账操作.
-
比特币系统:
点对点操作,没有第三方参与
,虽然这样账户获得了所有权,但是安全性降低了.在比特币系统中每个账户都配有地址和私钥,地址代表账户,而私钥代表支付密码,一旦丢失或者被盗,无法找回(没有第三方担保).
在银行系统中账号和密码是没有任何关联,而且密码可以重置.
但是在比特币系统秘钥可以经过两次Hash推倒就能还原地址,比如:
地址:abcd1234
秘钥:efg5678
Hash(Hash(efg5678))->adcd1234
#过程不可逆,即不能用地址推导出私钥
如果这样就会有朋友问:如果我使用私钥的时候被别人看到岂不是所有权就没了?
在这里比特币系统提供了另一项安全技术:
非对称加密技术(交易签名)
签名过程:
hash ('
{"付款地址":"fdshfjdshf",
"收款地址":"gfkjgfhg",
"金额":"1.2btc"
}') -> 87fjfjdi
#87fjfjdi为上面生成的交易摘要,fdfshfsdhfiushd为私钥,dfsodhfd为生成的签名信息
sign("87fjfjdi","fdfshfsdhfiushd") - > "dfsodhfd"
付款之后就会在系统广播发布:
fdshfjdshf -> gfkjgfhg ...."1.2btc"
签名:dfsodhfd
收到广播的节点会进行验证:
#dfsodhfd为上面生成的签名信息,fdshfjdshf是付款方地址,87fjfjdi是原始摘要信息(包含付款方,收款方,金额等)
verify("dfsodhfd","fdshfjdshf") -> "87fjfjdi"
如果验证出来的摘要信息和原始信息一样,即为验证通过
其实签名就是对摘要信息和私钥进行加密,验证就是对签名信息和付款方地址进行解密
补充
- 隐私:彼此不知道该货币属于谁,有多少
- 安全:不会对来路不明的货币进行追踪,也不会泄露个人信息(刚办卡就有贷款电话来电?)
对于每个节点为什么要帮忙记账?
记账会消耗计算机资源,而系统会对成功记账的节点进行奖励
记账规则:
- 一段时间内只可以有一个人记账成功
- 通过解决密码学难题(即工作量证明)竞争获取得唯一记账权
- 其他的节点复制记账结果
如果只是对于公式 Hash(上一个Hash值,交易记录集) = ABC123 作为记账权的判定,那每个人都可以做到
所以要增加记账难度,即:
Hash(上一个Hash值,交易记录集,随机数) = 0000ABC123
在满足记账条件的时候必须要满足生成的Hash值必须要以若干个0开头,所以要引入随机数做为变量.
因为变量任何一点微妙的变化对于生成的Hash值都会有很大的影响
所以当我们不断的去改变这个随机数使生成的Hash值满足以若干个0开头这样的过程就叫挖矿.
所以显卡变贵了很多 ಥ﹏ಥ ........(显卡的运算速度比CPU快)
举个例子:
1000个旷工进行挖矿,当系统广播发出交易摘要后.满足Hash值前18位为0的朋友就能获得记账权.
这时候肯定不能通过人力去计算,只能通过计算机去不断的改变这个随机值,计算的越快获得记账权的概率就越大.
在这里基本上能综合出整个挖矿过程
挖矿过程:
- 收集系统广播中还没有被记账的交易
- 验证交易的有效性 (付款地址,私钥,摘要信息,付款方余额够不够等)
- 完成上面两步后再添加一笔给自己转账的记录(即挖矿奖励)
补充:
生成的Hash值是16进制的字符串,
由于前十六位得为0,
所以前一位生成0的概率为1/16,
前两位都是0的概率为1/(16 * 16),
前三位都是0的概率为1/(16 * 16 * 16)
.
.
.
.
前十六位都是0的概率是1/(16的16次方),
即计算机要进行16的16次方次运算,
emmmm
有的同学就会问了,如果两节点同时完成了区块打包该取谁的有效呢?
由于区块链不像咱们生活中有12315这样的仲裁机构,无法由‘裁判’去规定谁才是胜出者。
于是就形成了共识机制 :区块最长运算最多难度最大的选手胜出!
好啦,简介就到这里了,下一章我们一起学习Python3实现区块链技术。