密碼學/區塊鏈筆記。三

in #cn7 years ago

Chapter 3 blockchain and mining overview

----第一節:blockchain


上面係一幅簡化左既blockchain圖
最左邊,即係創世block (genesis block)
佢起呢個世界既第一塊block, 成條chain既盡頭,所以叫佢做level 0
所有其他block都會間接或直接咁指住佢

隨左創世block之外
其他block既結構都一樣,包含兩樣野:上個block既hashvalue, 一大堆交易紀錄
例如block A咁,佢包含住上個block既hash value, 即係hash(創世block)
指住block A既block C都有同樣結構, 佢儲住hash(Block A)
最後仲有個pointer指住block C
大家就係靠指住block C既pointer去搵番曬成條chain出黎
hash value起呢個情況下就好似一個地址,我拎住一個block既hash, 就知道起memory邊度搵番佢出黎

運用番chapter 1既知識
hash value既作用係幫你檢查檔案有無被修改過
起blockchain既世界,hash value係用黎檢查一個block有無比人改過

例如,有條契弟想起創世block入面加一條交易,憑空創造100個bitcoin入佢戶口
佢就咁改創世block係唔會成功既,因為多左一條交易之後,創世block既hash value就會唔同左
但係呢個時候block A仲記住創世block舊既hash value, 所以block A會搵唔到創世block
咁條chain就斷左

圖解上面講既野

原本創世block入面得一條記錄,就係中本聰有50蚊
而且hash(創世block)=111
所以block A就記住左創世block係111


契弟自己老屈左100蚊比自己
但係因為佢改左創世block既數據
創世block既hash value都跟住變左,let say 222
但係block A仍然以為創世block 起111,所以條chain會斷左。

咁契弟就會諗到,「咁我改埋Block A咪得lor,將block A儲住既111改做222,得左!」
無錯,改完創世block同block A之後,睇落去係成功左。
但係唔好唔記得仲有Block C指住block A

當契弟改左block A儲住既創世block 地址
block A自己既hash value都會跟住改左
所以而家Block C就會指唔到Block A

如此類推,如果block C後面仲有block既話,咁契弟就要一直改落去
一直改曬成條chain,先可以成功起創世block度加到100蚊比自己

起bitcoin既世界入面你想改曬成條chain係無可能既
因為每一部掘緊bitcoin既server都有齊曬成條blockchain(200GB左右)起度
呢個世界閒閒地一百幾廿萬部機掘緊
隨非契弟能力一次過改曬幾百萬部機既成條blockchain啦
如果唔係,寫左落blockchain既野就無可能修改到

----第二節:mining

bitcoin network入面有好多礦工
礦工其實係一部server
做既野就係收集唔同人提交既transaction, 然後砌成一個block, 再attach上去而家條chain既尾

例如你發起一個bitcoin transaction, 想捐錢比我
咁你個bitcoin wallet software就會就街同人講:呢個連登仔想比1 bitcoin underpants呀
wallet係知道呢個世界有咩礦工起度,礦工收到一個交易之後又會話比佢既礦工朋友知
所以好快呢個交易就會傳播到去所有礦工,等待加入下一個block

但係網絡世界係有latency, 即係話呢個transaction可能會先去到香港礦工手上
然後香港礦工話比日本礦工知,再行多幾步先去到美國礦工度
呢個世界一秒鐘有咁多單交易,每一個礦工收到交易個時間都唔一樣
礦工做野通常都係first come first serve
(通常,not always, 遲D會講到咩情況下唔係first come first serve)
美國礦工可能隔左十幾秒先收到你個transaction
如果起佢收到呢個交易之前,佢已經儲夠一個block可以裝既交易數量
咁佢會暫時儲起呢個交易,等佢mine完而家呢個block,有機會先擺你既交易入下一個block

我想帶出既重點係:個個礦工掘緊既block,所裝住既交易可能係唔一樣

咁你就會問喇:點定邊個礦工有權建議下一個block儲住咩交易?
就係鬥快計數既時候喇
條數就係
SHA256(x,交易1,交易2,...,交易n) < target
形象化一D就係
SHA256("x,Alice pay Bob 1BTC,Bob pay Carol 2BTC") < 00F0000000000000000000000000000000000000000000000000000000000000

礦工試下x = 0000001
就符合唔到上面條不等式
SHA256("0000001,Alice pay Bob 1BTC,Bob pay Carol 2BTC") = D2CEEE02829CE041B3D1F2D836F863086D50C8CE97E3A8BA2C5549681AFFCB57
大過target,所以唔得

於是礦工繼續試,試下x=0000002
SHA256("0000002,Alice pay Bob 1BTC,Bob pay Carol 2BTC") =
9DCBDB0052C041078B3B92C14EE8C869BA70FA22D642511496E3D079BBC9528E
都係唔得

於是礦工繼續試,試下x=0000003
唔得...再試x=0000004
唔得...再試

直到
x=00000016
SHA256A("00000016,Alice pay Bob 1BTC,Bob pay Carol 2BTC") = 005ADB8E16B8A4BAC6D69601A091E70A3A7C4A823B62C12C2E9099F0AA939133 真係細過
00F0000000000000000000000000000000000000000000000000000000000000
bingo!!!!!

礦工卒之搵到一個x,砌埋落去其他transaction度,hash出黎個結果係細過target
佢立即會同全世既礦工講:我搵到啦!!!!
其他礦工就會檢查下佢計條數有無問題
同埋檢查一下呢個block包含既交易有無問題
都無問題既話,其他礦工就會接受左呢個block, 儲落自己database度
又會檢查一下自己既transaction pool, 睇下有無D交易係已經比人地mine左,咁自己就可以拎走果D交易

起上面個例子入面,個target其實好大,係兩個0字頭
現實上既target係好細好細
例如00000000000000000F0000000000000000000000000000000000000000000000
17個0字頭

target前面既0越多就即係越高難度
呢個target係所有礦工一齊傾出黎既
目標係要維持係大約10分鐘之內就要搵一個新block
如果忽然之間好多人加入做礦工,令到創造新block時間跌到落8分鐘
咁大家就會同意提升難度,例如將target由17個0字頭變成20個0字頭
如果好多礦工做到無癮,唔玩既話,令到創造新block既時間延長至12分鐘
咁大家會同意降低難度到ley say 10個0字頭

常見問題:
如果同時有兩個礦工搵到兩個唔同block既hash value細過target
又同時同其他礦工講,咁點算?
四個字:先到先得


好似上面幅圖咁
創世block出現之後
有兩個礦工一齊搵到下一個block, 一個係block A一個係block B
B同A一樣都係level 1既block
因為佢地都係直接指住創世block

所有先接收到block A既礦工,會基於block A既結果繼續mine下一個block
所有先接收到block B既礦工,會基於block B既結果繼續mine下一個block

例如呢個世界有70%礦工收到block A, 30%收到block B
斷估70%既礦工,會比30%既礦工做野快
所以好可能70%既礦工好快就搵到block C (which is based on block A)
呢個時候base on block B做野既礦工就可以收皮
因為blockchain既世界係淨係睇最長果條chain

你可以質疑,咁可能block A同block B既coverage係50/50呢
的確係有咁既可能
會唔會兩邊既server次次都一齊mine到
咁咪會變左兩條chain
A-C-E-G-I...
B-D-F-H-J...
實際上呢個可能性係非常非常之低
大多數既孤兒chain最多都係去到兩三個block
幾乎無一條孤兒chain可以去到六個block

所以bitcoin界有個defacto既標準:
longest blockchain 6個level之前既transaction可視為confirmed