《以太坊白皮書》原文鏈接:https://github.com/ethereum/wiki/wiki/White-Paper
Bitcoin
#1 State Transaction System
State
在 Bitcoin 當(dāng)中蚤假,"state" 代表了所有被挖出且沒(méi)有被消費(fèi)的貨幣的集合 (UTXO - "unspent transaction outputs"),并且每一個(gè)貨幣都有面值和持有者臭家。
Bitcoin 交易:
- 有 1 個(gè)或多個(gè)輸入初厚,包含現(xiàn)有的 UTXO 和由持有者地址相關(guān)的私鑰簽名
- 有 1 個(gè)或多個(gè)輸出芙扎, 包含一個(gè)新的 UTXO 并更新?tīng)顟B(tài)
State Transaction Function
輸入當(dāng)前狀態(tài)和一筆交易惜纸,輸出新的狀態(tài)或者ERROR
APPLY(S,TX) -> S' or ERROR
- For each input in TX:
- If the referenced UTXO is not in S, return an error.
- If the provided signature does not match the owner of the UTXO, return an error.
- If the sum of the denominations of all input UTXO is less than the sum of the denominations of all output UTXO, return an error.
- Return S' with all input UTXO removed and all output UTXO added.
第一條:前半部分防止使用不存在的比特幣趴捅,后半部分防止使用不屬于自己的比特幣
-
第二條:加強(qiáng)對(duì)輸出結(jié)果正確性的防御
?
#2 Mining
Decentralized
如果有一個(gè)足夠信賴的中心化服務(wù)羔味,那么挖礦系統(tǒng)存在的意義就變得微乎其微兵钮。因?yàn)檫@個(gè)中心化服務(wù)可以實(shí)時(shí)追蹤全局的狀態(tài)蛆橡。
但比特幣努力打造了一個(gè)去中心化的貨幣系統(tǒng)。因此矢空,比特幣的狀態(tài)轉(zhuǎn)換系統(tǒng)必須配上一個(gè)共識(shí)系統(tǒng)航罗,為了確保每一筆交易的可信度。
比特幣的去中心化系統(tǒng)要求網(wǎng)絡(luò)中的節(jié)點(diǎn)去不斷地嘗試去制造一個(gè)個(gè)包含交易的集合 —— 區(qū)塊屁药。在比特幣網(wǎng)絡(luò)中粥血,每十分鐘會(huì)產(chǎn)出一個(gè)新的區(qū)塊,這個(gè)區(qū)塊會(huì)包含創(chuàng)建時(shí)的時(shí)間戳酿箭、一個(gè)臨時(shí)隨機(jī)數(shù)复亏、一個(gè)前一區(qū)塊的哈希串以及一個(gè)在這期間發(fā)生的所有交易的列表。經(jīng)過(guò)一段時(shí)間之后缭嫡,這會(huì)產(chǎn)生一個(gè)持久的缔御、持續(xù)增長(zhǎng)并且持續(xù)保持最新?tīng)顟B(tài)的比特幣賬本——區(qū)塊鏈。
Validation
校驗(yàn)塊是否正確的算法:
- 檢查父塊是否存在并且合法
- 檢查塊的時(shí)間戳是否大于父塊的時(shí)間戳妇蛀,并且差值小于 2 小時(shí)
- 檢查 POW 是否合法
- 讓父塊的最終狀態(tài)變?yōu)?S[0]
- 假設(shè) TX 為當(dāng)前塊中 n 條交易的列表耕突,對(duì)于
i in 0...n-1
,讓s[i+1] = APPLY(S[i],TX[i])
评架,如果任何一次操作返回錯(cuò)誤眷茁,則檢驗(yàn)返回錯(cuò)誤 - 返回正確,并注冊(cè) S[n] 為當(dāng)前塊的最終狀態(tài)
Note:
each transaction in the block must provide a valid state transition from what was the canonical state before the transaction was executed to some new state
每條交易必須提供一個(gè)已經(jīng)驗(yàn)證的狀態(tài)纵诞,這個(gè)狀態(tài)由交易真正被進(jìn)行前的一個(gè)權(quán)威狀態(tài)轉(zhuǎn)變而來(lái)上祈。
Proof of Work (POW)
比特幣目前的POW條件:double-SHA256 hash (必須小于一個(gè)動(dòng)態(tài)調(diào)整的 target值)
因?yàn)?SHA256 的設(shè)計(jì),就是為了使其完全不可預(yù)測(cè)浙芙。而創(chuàng)造一個(gè)新的區(qū)塊的唯一辦法登刺,就是不停地進(jìn)行運(yùn)算并遞增臨時(shí)隨機(jī)數(shù)以嘗試讓得出的哈希值通過(guò)驗(yàn)證。因此嗡呼,這樣可以讓每個(gè)塊的生成有一定的難度纸俭,從而防止區(qū)塊鏈被攻擊。
比特幣的目標(biāo)值會(huì)在每 2016 個(gè)區(qū)塊創(chuàng)造出來(lái)后更新一次南窗,因此掉蔬,比特幣系統(tǒng)可以保證每 10 分鐘才會(huì)創(chuàng)造出一個(gè)新的區(qū)塊廊宪。同時(shí),每個(gè)礦工挖出一個(gè)新的區(qū)塊會(huì)得到一定數(shù)量的比特幣獎(jiǎng)勵(lì)女轿。另外,如果在此區(qū)塊中的任何交易發(fā)生時(shí)的比特幣價(jià)值大于這次交易被確認(rèn)時(shí)的價(jià)值壕翩,那么這個(gè)差值也會(huì)當(dāng)做 “手續(xù)費(fèi)” 給予礦工蛉迹。
為了更好的理解挖礦的意義,以下是假設(shè)有人要攻擊比特幣系統(tǒng)時(shí)會(huì)發(fā)生的事:
因?yàn)楸忍貛诺拿艽a學(xué)基礎(chǔ)被公認(rèn)為安全的放妈,所以攻擊者的目標(biāo)會(huì)是比特幣系統(tǒng)中沒(méi)有被密碼學(xué)基礎(chǔ)所保護(hù)的地方:交易的順序北救。其策略如下:
- 用 100 BTC 向一位供應(yīng)商換取一項(xiàng)商品 (通常是可以快速交付的電子商品)
- 等待供應(yīng)商交付
- 生成另一筆向自己支付 100 BTC 的交易
- 嘗試讓比特幣網(wǎng)絡(luò) “認(rèn)同” 這筆向自己支付的交易是先發(fā)生的
當(dāng)步驟 1 發(fā)生時(shí),幾分鐘后會(huì)有一個(gè)礦工把這筆交易囊括在自己發(fā)現(xiàn)的區(qū)塊中芜抒,假設(shè)是區(qū)塊 27,000珍策。大約一個(gè)小時(shí)后,更多的 5 個(gè)區(qū)塊會(huì)被加入到區(qū)塊鏈當(dāng)中宅倒,且這 5 個(gè)區(qū)塊每個(gè)都間接指向區(qū)塊 27,000攘宙。因此,區(qū)塊 27,000 是被 ”確認(rèn)“ 過(guò)的區(qū)塊拐迁。
這時(shí)蹭劈,供應(yīng)商會(huì)確認(rèn)這筆交易并交付商品。然后线召,攻擊者會(huì)創(chuàng)建另一條向自己支付 100 BTC 的交易铺韧。如果攻擊者直接把它公布出去,那這筆交易并不會(huì)被承認(rèn)并加入缓淹。因?yàn)榈V工們會(huì)去跑 APPLY(S,TX)
并注意到 TX
消費(fèi)了一個(gè)不存在于當(dāng)前狀態(tài)中的 UTXO哈打。
因此,攻擊者會(huì)選擇其他方法讯壶,比如會(huì)創(chuàng)建一條比特幣區(qū)塊鏈的 “分支”料仗,且這條分支中有了一個(gè)包含那條向自己支付 100 BTC 交易的區(qū)塊 27,000 指向一個(gè)與原區(qū)塊 27,000 相同的父區(qū)塊 —— 區(qū)塊 26,999。因?yàn)檫@個(gè)區(qū)塊 27,000 的數(shù)據(jù)與原先不同鹏溯,因此這個(gè)區(qū)塊會(huì)被要求重新運(yùn)算 POW罢维。而且,由于原先的區(qū)塊 27,001 - 27,005 并沒(méi)有 “指向” 這個(gè)新的區(qū)塊丙挽,因此攻擊者的新區(qū)塊鏈和原有的區(qū)塊鏈可以說(shuō)時(shí)完全分離了肺孵。
在比特幣的規(guī)則中,如果區(qū)塊鏈有分支颜阐,那么最長(zhǎng)的分支總是最被信任的平窘。所以其他所有的礦工都會(huì)基于區(qū)塊 27,005 所在的這條鏈上進(jìn)行作業(yè),而攻擊者只能一個(gè)人基于他自己的鏈進(jìn)行作業(yè)凳怨。那么攻擊者為了使他自己的區(qū)塊鏈變成最長(zhǎng)的鏈瑰艘,他必須擁有比其他所有礦工更高的算力才能達(dá)到是鬼!
更有意思的是,在中本聰 (比特幣發(fā)明者) 本人的說(shuō)明中紫新,由挖礦帶來(lái)的獎(jiǎng)勵(lì)均蜜,要遠(yuǎn)遠(yuǎn)大于破壞現(xiàn)有的比特幣網(wǎng)絡(luò) (需要注意,這在礦工數(shù)量很少的情況下并不適用)芒率。
#3 Merkle Trees
比特幣中所有交易的數(shù)據(jù)都被存儲(chǔ)在一種二叉樹(shù)類型的名為 Merkle Tree 的數(shù)據(jù)結(jié)構(gòu)中囤耳。
- 具有樹(shù)結(jié)構(gòu)的所有特點(diǎn)
- 葉子節(jié)點(diǎn)的值為 HASH 值
- 非葉子節(jié)點(diǎn)的值是根據(jù)其下面的所有子節(jié)點(diǎn)的值通過(guò) HASH 算法計(jì)算得出
Merkle Tree 在比特幣中應(yīng)用的目的是為了驗(yàn)證數(shù)據(jù)的有效性。因?yàn)楣V迪蛏蟼鬟f的特性偶芍,如果有人試圖傳遞一個(gè)假的交易數(shù)據(jù)充择,那么這會(huì)導(dǎo)致此節(jié)點(diǎn)在 Merkle Tree 中的父節(jié)點(diǎn)數(shù)據(jù)發(fā)生改變,以及父節(jié)點(diǎn)的父節(jié)點(diǎn)……
使用 Merkle Tree 的另一個(gè)重要的原因是:**Simplified Payment Verification (SPV) **協(xié)議匪蟀。SPV 允許一種稱為 “l(fā)ight nodes” 的節(jié)點(diǎn)集合椎麦。SPV 協(xié)議使得在驗(yàn)證某一交易的有效性時(shí),能夠只下載比特幣區(qū)塊鏈中所有數(shù)據(jù)的其中一小部分材彪,同時(shí)也可以強(qiáng)有力地保證數(shù)據(jù)的有效性观挎。
#4 Scripting
在比特幣中,由于沒(méi)有現(xiàn)實(shí)中的 “賬戶” 的概念查刻。因此如何判斷用戶所擁有的 UTXO键兜,并不單單是依靠一個(gè)公鑰地址,而是一個(gè)更為復(fù)雜的腳本穗泵。比特幣中的腳本普气,是一種基于棧運(yùn)行的程序語(yǔ)言。
在這樣的設(shè)計(jì)下佃延,任何一筆交易如果要達(dá)成现诀,這筆交易所花費(fèi)的 UTXO 必須滿足這個(gè)腳本(由產(chǎn)生這個(gè) UTXO 的交易輸出)。
假設(shè)履肃,Bob 向 Alice 支付了 1BTC仔沿,這筆交易輸出了類似一個(gè)包含 Alice 公鑰的腳本。現(xiàn)在尺棋,Alice 想花費(fèi)這 1BTC封锉,她必須提供自己私鑰生成的簽名(私鑰是 Alice 唯一的 )和公鑰作為輸入。如果腳本能夠順利跑通膘螟,那么這個(gè)交易就會(huì)被認(rèn)可成福,同時(shí)所有人都可以去驗(yàn)證這筆交易。
比特幣腳本的幾個(gè)缺陷:
- 缺少圖靈完備性
- 缺少狀態(tài)的聲明
- 沒(méi)有綁定任何數(shù)據(jù)
- 過(guò)依賴區(qū)塊鏈
閱讀 Github 上 《Ethereum - White Paper》 的一些筆記