賬本
區(qū)塊鏈賬本是一個基于密碼學(xué)安全的分布式賬本,是一個方便驗證不可篡改的賬本.
講到區(qū)塊鏈就不得不說明一下哈希函數(shù): hash(原始信息)=摘要信息
哈希函數(shù)有幾個特點:
- 同樣的原始信息通過同一個哈希函數(shù)總能得到相同的摘要信息
- 原始信息任何微妙的變化都會使哈希出來的摘要信息面目全非
- 摘要信息不能逆向推算出原始信息
#舉例說明:
Hash(張三找沖哥借了100w,一天后還,利息10w)=ABC123,于是賬本上就有了ABC123這條記錄.
由此可見賬本信息展現(xiàn)了哈希函數(shù)的幾個特點:
1.很好理解,信息變短了
2.賬本是ABC123這條信息,原始信息被隱匿了,能夠直接用摘要信息代替原始信息
3.如果雙方出現(xiàn)欺騙,可以由ABC123來還原原始信息并驗證是誰在撒謊
那么區(qū)塊鏈?zhǔn)窃鯓佑涃~的呢
假設(shè)有一個賬頁序號為0的交易記錄如下
---------------------------------------------------------
賬號 入賬 出賬 余額 備注說明
王二 100 190 收到xxx貨款
張三 100 30 xxxx
李四 120 90 170 xxxx
記賬時間為:2017-10-22 10:22:02
----------------------------------------------------------
區(qū)塊鏈會在記賬時把賬單信息(包括序號,時間,記錄等)作為原始信息進(jìn)行Hash得到一個Hash值,如:ABC123
用函數(shù)表示為:Hash(序號0,時間2017-10-22 10:22:02,交易記錄xxx)=ABC123
賬頁信息和Hash值組合在一起就構(gòu)成了一個區(qū)塊.
#比特幣是十分鐘記一次賬,即每個區(qū)塊形成的時間為十分鐘
在第二次記賬的時候,則會把上次生成的Hash值作為原始信息Hash進(jìn)去:
Hash(上一個Hash值,序號,時間,交易記錄)=BCD234
這樣第二個區(qū)塊不僅包含了此次的賬本信息,還包含了上個區(qū)塊的信息.
照這樣記賬最新的區(qū)塊總是包含了之前所有的賬本信息.
所有這些區(qū)塊組合起來就形成了區(qū)塊鏈,這樣的區(qū)塊鏈就構(gòu)成了一個便于驗證(只驗證最后一個Hash值就等于驗證了所有賬本),不可更改(任何一個區(qū)塊的更改,會導(dǎo)致之后形成的區(qū)塊的Hash值發(fā)生變化,這樣在驗證時就無法通過)的總賬本.
賬戶所有權(quán)問題
-
現(xiàn)有的轉(zhuǎn)賬:在銀行通過身份證,手機(jī)號,拍照等等進(jìn)行注冊便生成了屬于個人的銀行卡號.甲通過乙的銀行卡號給乙轉(zhuǎn)賬100元實際上就是在銀行上面的賬本上進(jìn)行甲:-100和乙:+100,所有的安全操作都是通過銀行來保證,這樣就導(dǎo)致銀行在特殊情況下會撤銷此次轉(zhuǎn)賬操作.
-
比特幣系統(tǒng):
點對點操作,沒有第三方參與
,雖然這樣賬戶獲得了所有權(quán),但是安全性降低了.在比特幣系統(tǒng)中每個賬戶都配有地址和私鑰,地址代表賬戶,而私鑰代表支付密碼,一旦丟失或者被盜,無法找回(沒有第三方擔(dān)保).
在銀行系統(tǒng)中賬號和密碼是沒有任何關(guān)聯(lián),而且密碼可以重置.
但是在比特幣系統(tǒng)秘鑰可以經(jīng)過兩次Hash推倒就能還原地址,比如:
地址:abcd1234
秘鑰:efg5678
Hash(Hash(efg5678))->adcd1234
#過程不可逆,即不能用地址推導(dǎo)出私鑰
如果這樣就會有朋友問:如果我使用私鑰的時候被別人看到豈不是所有權(quán)就沒了?
在這里比特幣系統(tǒng)提供了另一項安全技術(shù):
非對稱加密技術(shù)(交易簽名)
簽名過程:
hash ('
{"付款地址":"fdshfjdshf",
"收款地址":"gfkjgfhg",
"金額":"1.2btc"
}') -> 87fjfjdi
#87fjfjdi為上面生成的交易摘要,fdfshfsdhfiushd為私鑰,dfsodhfd為生成的簽名信息
sign("87fjfjdi","fdfshfsdhfiushd") - > "dfsodhfd"
付款之后就會在系統(tǒng)廣播發(fā)布:
fdshfjdshf -> gfkjgfhg ...."1.2btc"
簽名:dfsodhfd
收到廣播的節(jié)點會進(jìn)行驗證:
#dfsodhfd為上面生成的簽名信息,fdshfjdshf是付款方地址,87fjfjdi是原始摘要信息(包含付款方,收款方,金額等)
verify("dfsodhfd","fdshfjdshf") -> "87fjfjdi"
如果驗證出來的摘要信息和原始信息一樣,即為驗證通過
其實簽名就是對摘要信息和私鑰進(jìn)行加密,驗證就是對簽名信息和付款方地址進(jìn)行解密
補(bǔ)充
- 隱私:彼此不知道該貨幣屬于誰,有多少
- 安全:不會對來路不明的貨幣進(jìn)行追蹤,也不會泄露個人信息(剛辦卡就有貸款電話來電?)
對于每個節(jié)點為什么要幫忙記賬?
記賬會消耗計算機(jī)資源,而系統(tǒng)會對成功記賬的節(jié)點進(jìn)行獎勵
記賬規(guī)則:
- 一段時間內(nèi)只可以有一個人記賬成功
- 通過解決密碼學(xué)難題(即工作量證明)競爭獲取得唯一記賬權(quán)
- 其他的節(jié)點復(fù)制記賬結(jié)果
如果只是對于公式 Hash(上一個Hash值,交易記錄集) = ABC123 作為記賬權(quán)的判定,那每個人都可以做到
所以要增加記賬難度,即:
Hash(上一個Hash值,交易記錄集,隨機(jī)數(shù)) = 0000ABC123
在滿足記賬條件的時候必須要滿足生成的Hash值必須要以若干個0開頭,所以要引入隨機(jī)數(shù)做為變量.
因為變量任何一點微妙的變化對于生成的Hash值都會有很大的影響
所以當(dāng)我們不斷的去改變這個隨機(jī)數(shù)使生成的Hash值滿足以若干個0開頭這樣的過程就叫挖礦.
所以顯卡變貴了很多 ?﹏? ........(顯卡的運(yùn)算速度比CPU快)
舉個例子:
1000個曠工進(jìn)行挖礦,當(dāng)系統(tǒng)廣播發(fā)出交易摘要后.滿足Hash值前18位為0的朋友就能獲得記賬權(quán).
這時候肯定不能通過人力去計算,只能通過計算機(jī)去不斷的改變這個隨機(jī)值,計算的越快獲得記賬權(quán)的概率就越大.
在這里基本上能綜合出整個挖礦過程
挖礦過程:
- 收集系統(tǒng)廣播中還沒有被記賬的交易
- 驗證交易的有效性 (付款地址,私鑰,摘要信息,付款方余額夠不夠等)
- 完成上面兩步后再添加一筆給自己轉(zhuǎn)賬的記錄(即挖礦獎勵)
補(bǔ)充:
生成的Hash值是16進(jìn)制的字符串,
由于前十六位得為0,
所以前一位生成0的概率為1/16,
前兩位都是0的概率為1/(16 * 16),
前三位都是0的概率為1/(16 * 16 * 16)
.
.
.
.
前十六位都是0的概率是1/(16的16次方),
即計算機(jī)要進(jìn)行16的16次方次運(yùn)算,
emmmm
有的同學(xué)就會問了剖膳,如果兩節(jié)點同時完成了區(qū)塊打包該取誰的有效呢旧找?
由于區(qū)塊鏈不像咱們生活中有12315這樣的仲裁機(jī)構(gòu)论悴,無法由‘裁判’去規(guī)定誰才是勝出者各薇。
于是就形成了共識機(jī)制 :區(qū)塊最長運(yùn)算最多難度最大的選手勝出查吊!
好啦,簡介就到這里了翎苫,下一章我們一起學(xué)習(xí)Python3實現(xiàn)區(qū)塊鏈技術(shù)兔院。