📜 [專欄新文章] 區塊鏈權益證明(PoS)的去中心化難題:主觀性與遠程攻擊
✍️ Ping Chen
📥 歡迎投稿: https://medium.com/taipei-ethereum-meetup #徵技術分享文 #使用心得 #教學文 #medium
相較於工作量證明(PoW)的客觀、直覺、易於驗證,權益證明因為仰賴過去的狀態做為共識基礎,存在「正確性」環環相扣的問題。
工作量證明 vs 權益證明
工作量證明做為比特幣發明之初就存在的共識機制,最大的優點就是簡單:礦工需要算一百兆次,驗證只需要驗算正確的那一次,易守難攻,但缺點也很明顯,挖礦的無意義運算很浪費資源。
權益證明捨棄低效率的挖礦猜數字遊戲,改用投票表決的方式產生共識,任何持幣超過一定數量的人都可以參與投票,票多者勝。
易驗證的安全性沈澱
相較於權益證明,驗證需要有「過去每個人的持幣量」的先備知識,工作量證明簡單粗暴,你不需要知道幣的分佈、全局狀態、過去的任何一筆交易,只要看區塊頭就知道合法,所以如果你有天不小心在路邊撿到兩條鏈,沒什麼好猶豫的,更長、累積工作量更多的鏈就是對。
基於物理法則,工作量證明區塊鏈上的交易,在被礦工打包後,不只安全,隨著未來有更多區塊接在後面,這個區塊被回溯的機率就越來越低,也就是交易「沈澱」到更深、更安全的地方。所以我們常看到交易所和商家會有「n 個區塊」的確認等待設計,就是要等款項變得更像是不會跑掉。
區塊鏈的最終性
權益證明區塊鏈不存在安全沈澱的效應,因為「區塊 X 的正確性」仰賴「區塊 X-1 的正確性」,又仰賴 X-2, X-3, …,所以如果你對整條區塊鏈的狀態(誰有多少幣)一無所知,那往前給你再多證據也未必能說服你,畢竟偽造區塊,也就是狀態轉移,的成本非常非常低。
然而,權益證明的支持者會告訴你,我們有最終性(finality)這個工作量證明沒有的超讚的東西。也就是說,如果你確信區塊 X-1 是對的,那當區塊 X 產生的瞬間,它對你而言就永遠是對的,根本不需要等什麼沈澱。
理由很簡單,因為工作量證明的潛在礦工是未知、是無限多的,很難知道現在世界上有多少能挖礦的設備,這甚至超越時間跨度,也就是未來的算力也可能回來挖現在的區塊,所以僅管越來越安全,卻永遠不可能確信 100% 不被反轉。如果有外星人掏出一台異次元電腦,瞬間做了超越全地球電腦運算力的工作量,那區塊鏈上的任何交易,都是有可能被逆轉的。
這時候,權益證明的有限礦工就顯得很重要了。對於「區塊 X 是否正確」問題,有投票權的母體僅是「所有在區塊 X-1 有持幣的人」,而當這群人當中的 2/3 已經投票(且保證不會跑票),那區塊 X 就永遠地敲定了。
主觀性
回到「你有天不小心在路邊撿到兩條鏈」的情境,這對專業節點/礦工來說當然不是問題,他們隨時都在同步新區塊,總是能根據共識規則選邊站。但業餘使用者難免會離線一段很長的時間再回來。有天當你連上網,卻發現有兩組人傳給你兩條完全不同的鏈,在權益證明的情境下,你是沒辦法馬上知道該選哪一邊的,甚至可以說,即便你補足了離線期間的每個區塊,這兩條鏈誰好誰壞仍然是憑感覺,看你相信誰,也就是「主觀」的。
要克服主觀性對業餘節點近用區塊鏈的威脅,唯一的辦法是每個區塊產出時都立刻達到最終性(不可分叉),但這等同於要求「每一個礦工」都「永遠活躍在線上」且「知道狀態和每一筆交易」並「隨時投票表態」,這樣的標準太嚴苛,很容易讓新區塊難產,甚至整個鏈停滯,實務上不可行。
遠程攻擊
共識演算法的設計中,最重要的指標就是「抗惡意行為」的程度。工作量證明的術語「51% 攻擊」指的是:這個區塊鏈能容忍一些壞人存在,只要他們掌握的算力不超過整個系統的一半就沒關係。
對於攻擊發起者,我們只能假設他不要太強;對於其他誠實中立(共識系統中不存在善良的概念)的參與者,我們則希望透過經濟機制的設計,引導他們做出促進共識收斂的行為。
在工作量證明系統分叉時,礦工選擇在較短鏈上挖礦是不划算的,因為挖礦獎勵可能會消失,平白浪費算力。而權益證明的礦工因為不用真的用設備耗很多電做運算,同時在兩個分叉上押寶理論上是可行的,但如果每個礦工都這樣做,分叉就永遠不會收斂。為了強迫礦工選擇,我們會懲罰在同個區塊高度的不同區塊都投票的人,減少挖礦獎勵,甚至沒收資金。
可以說,權益證明在處理分叉上更強而有力。工作量證明的礦工如果兩邊挖礦,頂多沒賺到錢;權益證明礦工兩邊挖的話非但不會賺,甚至會損失本金,嚇阻力顯然大上許多。但是當攻擊目標是遙遠的過去時,權益證明卻比工作量證明脆弱,甚至可以說是束手無策。
如前所述,工作量證明的區塊鏈擁有不斷沈澱的安全性,惡意攻擊最近的區塊或許可行,但要惡意攻擊一年前的區塊,必須要重做一年份的工作量,成本超級高,也很容易被發現。相較之下,權益證明區塊鏈的記帳不需要物理性的消耗設備和電力,攻擊一分鐘的區塊和一年前的區塊的成本相差無幾。
想像某人在一年前秘密地掌握了大多數的幣(投票權),並且在一年間表現正常,從不作惡,然後慢慢的賣幣退場。但就在完全脫手後,他忽然從一年前那個他佔有過半投票權的時間點,瞬間偽造了整年份的歷史,一個完全由他一手偽造的分叉鏈。對不知情的節點而言,這條鏈完全合法,對其他節點而言,就算想懲罰他(他確實有重複投票),他在主鏈上也已經沒有幣可以被罰了,這就是所謂的遠程攻擊(long range attack)。
看啊,是ICBM! Photo by Maciej Ruminkiewicz on Unsplash
緩解主觀性與遠程攻擊的方案
對工作量證明鏈而言,礦工和持幣者是脫鉤的,權益證明則否。權益證明的問題,基本上就是共識機制和區塊鏈狀態高度耦合的後遺症,衍生出的包括共識有效性、活性、輕節點實作等等的問題得靠額外的機制處理。
鏈外共識
一種簡單有效的方法是定期發布區塊鏈的里程碑(milestone),這種方法對工作量證明和權益證明都適用。比方說,聖人明君,偉大全能的以太坊創辦人 Vitalik,可以固定在他的 Twitter 上發布整數區塊的 block hash,告訴大家第九百萬塊就是 0x388f34dd9....d8e142960e3不會錯,甚至直接更新節點實作,把里程碑寫死在程式碼裡面,就可以有效引導新加入的節點不會走到壞人的鏈上,可以稱作 PoS + PoR (reputation) 的共識機制。
合併工作量證明
另一種方法是合併使用兩種共識機制,比方說原本 2018 要上線但忽然被整組砍掉的 Casper FFG,就計畫要在原有的 ETH 1.0 鏈上疊加一層由智慧合約實作的權益證明。也就是出塊仍然由原本的礦工負責,再讓持幣者投票做雙重驗證,礦工不再只跟隨最長鏈,而是要同時考慮這個鏈是否違反投票結果。既可以享有最終性,也能累積工作量避免遠程攻擊。
不過後來以太坊開發者的大頭們決定放棄上這版,改直接推出一步到位的 PoS + sharding 的真・ETH 2.0。在這個版本中預計也有合併工作量證明,但不是本來的雙軌制,而是用一種叫 VDF 的特殊演算法 + 專用硬體,同時提供工作量和重要的鏈上隨機數產生器(RNG)。
VDF (verifiable delay function) 和本來的挖礦有些許不同,它雖然也有計算困難驗證容易的特性,但並不能靠堆疊礦機來平行加速,而是要用由某幾家硬體廠商聯合開發的可信機器,保證計算的耗時總是在某個範圍內,從而提供近似工作量證明的客觀性和安全沈澱。
中心化
這題會考,旁邊畫五顆星星
回到權益證明高度耦合區塊鏈狀態的問題,這本質上是「自己證明自己對」的困境。實務上為了能運作,為了避免來自一年前礦工的超時空打擊,勢必得比工作量證明多出更多需要信任的環節:要相信節點實作給的信任根(像是 genesis block)、要相信別的節點提供的狀態、要相信驗證者和出塊礦工不會作惡或聯合審查。
實務上,為了確保可用性和活性,接受一些程度不一的中心化妥協方案在所難免,差別只在於你更願意相信社群大神的信譽還是硬體廠商不會偷做改良設備的職業操守。但話說回來,工作量證明也有自己的中心化議題,大礦池、ASIC 廠商壟斷等等,不會有系統能保證完全的去中心化,只能在已知可用的幾個方案裡面,盡量挑選比較好的,穩定中求進步了。
最近大手筆用了好多錢註冊更短的 ENS
ping.eth
歡迎順手抖內幫補血😢
區塊鏈權益證明(PoS)的去中心化難題:主觀性與遠程攻擊 was originally published in Taipei Ethereum Meetup on Medium, where people are continuing the conversation by highlighting and responding to this story.
👏 歡迎轉載分享鼓掌
同時也有22部Youtube影片,追蹤數超過4萬的網紅吳老師教學部落格,也在其Youtube影片中提到,JAVA程式設計第3次上課 這次上課主要是開始學習流程控制的迴圈部分: 有FOR、WHILE、DO...WHILE迴圈 這也是學習JAVA基本與法中比較重要且難學的部份, 因為人腦沒有迴圈的功能,反而厭惡迴圈, 所以常常有同學學到這部份就因此陣亡, 因為實在是太不人性化,但對電腦來說, 他最大的優...
「猜數字程式碼」的推薦目錄:
- 關於猜數字程式碼 在 Taipei Ethereum Meetup Facebook 的最佳貼文
- 關於猜數字程式碼 在 Taipei Ethereum Meetup Facebook 的最佳解答
- 關於猜數字程式碼 在 吳老師教學部落格 Youtube 的精選貼文
- 關於猜數字程式碼 在 吳老師教學部落格 Youtube 的最讚貼文
- 關於猜數字程式碼 在 吳老師教學部落格 Youtube 的精選貼文
- 關於猜數字程式碼 在 [範例] 猜數字+ 測試器- 看板Python - 批踢踢實業坊 的評價
- 關於猜數字程式碼 在 1A2B-in-C-/README.md at master - GitHub 的評價
- 關於猜數字程式碼 在 猜數字遊戲 - Rust 程式語言正體中文版 的評價
- 關於猜數字程式碼 在 Python Taiwan | 野人獻曝再一發:AB猜數字遊戲 的評價
- 關於猜數字程式碼 在 新手猜數字問題- 軟體工程師板 - Dcard 的評價
猜數字程式碼 在 Taipei Ethereum Meetup Facebook 的最佳解答
ethstats.net 是監測以太坊網路健康狀況的網站。但數字與圖表意義並無文件說明。以下說明大多是 Chih-Cheng Liang 根據對以太坊的理解與網站程式碼,所作出的猜測與詮釋。
權限開可編輯,歡迎修改。若不太確定,可做註解
猜數字程式碼 在 吳老師教學部落格 Youtube 的精選貼文
JAVA程式設計第3次上課
這次上課主要是開始學習流程控制的迴圈部分:
有FOR、WHILE、DO...WHILE迴圈
這也是學習JAVA基本與法中比較重要且難學的部份,
因為人腦沒有迴圈的功能,反而厭惡迴圈,
所以常常有同學學到這部份就因此陣亡,
因為實在是太不人性化,但對電腦來說,
他最大的優點就是可以不斷的執行迴圈,幾萬次都無所謂,
除了次數可以無上限外,速度也快到不行,
所以自動化控制一定少不了迴圈,只是要怎麼把迴圈學好呢?
這是非常重要的一環。
除了要反覆聽講外,反覆練習範例檔也是個方法,
或是嘗試修改範例成別的迴圈方式也是方法,
例如九九乘法表除了可以用FOR迴圈解,也可以試試WHILE迴圈和DO...WHILE迴圈,
結果都可以做的出來。
此外,也加入TQC的JAVA術科題目都範例,TQC地JAVA題目不算太簡單,
很有挑戰性,且目前有這張證照算是少數,
我覺得可以當成考SCJP國際證照之前的暖身,或可說互補也行。
吳老師 101/8/25
01_TQC認證試題練習說明
02_SwitchCase範例說明
03_JAVA版本比較說明
04_用JOptionPane顯示訊息
05_FOR迴圈範例並改為JOptionPane
06_猜拳遊戲解說
07_猜拳遊戲修改成JOptionOane
08_如何找到Class類別檔位置與反組譯
09_如何找到TQC_JAVA的程式碼
10_說明檔的使用說明
11_Array1D一維陣列說明
12_Array1D一維陣列說明(JOptionPane版)
13_Array1D一維陣列說明(DecimalFormat版)
14_Array2D二維陣列說明
相關JAVA教學:
JAVA證照考題解答分享,Android證照的跳板
http://terry55wu.blogspot.com/2012/01/java.html
JAVA程式設計總整理
http://terry55wu.blogspot.com/2011/10/java.html
湜憶電腦 TQC JAVA進階級先修課程
http://terry55wu.blogspot.com/2010/08/tqc-java.html
最近的生活很JAVA兼分享GOOGLE服務在教學上的應用
http://terry55wu.blogspot.com/2010/05/javagoogle.html
文化大學推廣部JAVA程式設計第 2 次上課
http://terry55wu.blogspot.com/2010/05/java-2.html
文化大學推廣部JAVA程式設計第 3 次上課
http://terry55wu.blogspot.com/2010/05/java-3.html
文化大學推廣部JAVA程式設計第 4 次上課
http://terry55wu.blogspot.com/2010/05/java-4.html
文化大學推廣部JAVA程式設計第 5 次上課
http://terry55wu.blogspot.com/2010/05/java-5.html
Java、VisualBasic、Visual C++有什麼不一樣呢?
http://terry55wu.blogspot.com/2009/03/javavisualbasicvisual-c.html
程式語言排行榜,C語言居冠,JAVA次之
http://terry55wu.blogspot.com/2010/05/cjava.html
Android程式開發證照教學懶人包
http://terry55wu.blogspot.com/p/android.html
吳老師,湜憶電腦,TQC,JAVA,電腦證照,JAVA工程師,AWT類別,線上教學,雲端計算,(吳老師提供)
猜數字程式碼 在 吳老師教學部落格 Youtube 的最讚貼文
VB.NET2008程式設計 第 13 次上課
今天的課程原則上是講解如何在把之前的練習加以美化與增加新功能。
1.如何美化介面,其實不外乎就是將控制項的外觀加以改變,
如顏色、字型大小、加底圖等等,讓程式看起來更花俏一些。
2.除了外觀之外,還可以增加城市的功能,但這部份就有些難度,
比如以猜數字遊戲為例,如果只是單純猜數字卻是有些單調,
若可以加入計時、最佳成績、成績排行等等功能,
相信會更有玩遊戲的感覺,除了這些功能之外還可以再加,
只是就是要多一些創意和巧思了。
3.再來就是如何將程式寫的更簡潔,把重複的程式寫成副程式,
於是就用了同學繳來的作業都成範例,這樣可以說明的更具體,
因為是同學自己寫的,也一定比較有感覺,
修改程式前後程式碼至少差了一半以上,也比較精鍊,
除了修改副程式外,還有注意:
1.一定要多寫註解,這樣別人看你的程式才比較容易了解。
2.變數與控制項的命名,也要特別注意,像控制項預設都叫 Label1,
但若沒有重新命名,實在不知道 Label1是做什麼用的,
可以改成 lblUser ,如果是使用者的猜拳,就可以這樣命名。
以上都是希望同學們程式學的更好,並在下下星期以前能繳交作業,
至於作業的數量,最少一件,最多沒有上限,多多益善,我再來挑選。
吳老師 99/05/29
課程內容如下:
01作業程式外觀上的美化
02猜數字遊戲中增加計時功能
03加上最佳成績上去
04利用同學的作業當成範例修改成副程式
05如何改成副程式SUB_A
06如何改成副程式SUB_B有傳參數
07更改亂數與圖的數字一致性
08更改亂數與圖的數字一致性&繳交作業說明
公告:
此影音課程謹提供本班學員復習用,非學校必須提供課程服務,
是老師私下提供,勿再向外傳送,若非學員請勿加入論壇,敬請悉知。
吳老師教學網:
http://3cc.cc/10g
部落格:
http://terry55wu.blogspot.com/
論壇:
http://groups.google.com/group/vbnet2008?hl=zh-TW
VB.NET,2008,電腦證照,吳清輝老師,勞工大學,程式設計,線上教學,e化創新,優質化,建置e化學習教室,雲端計算,虛擬電腦
猜數字程式碼 在 吳老師教學部落格 Youtube 的精選貼文
VB.NET2008程式設計 第 13 次上課
今天的課程原則上是講解如何在把之前的練習加以美化與增加新功能。
1.如何美化介面,其實不外乎就是將控制項的外觀加以改變,
如顏色、字型大小、加底圖等等,讓程式看起來更花俏一些。
2.除了外觀之外,還可以增加城市的功能,但這部份就有些難度,
比如以猜數字遊戲為例,如果只是單純猜數字卻是有些單調,
若可以加入計時、最佳成績、成績排行等等功能,
相信會更有玩遊戲的感覺,除了這些功能之外還可以再加,
只是就是要多一些創意和巧思了。
3.再來就是如何將程式寫的更簡潔,把重複的程式寫成副程式,
於是就用了同學繳來的作業都成範例,這樣可以說明的更具體,
因為是同學自己寫的,也一定比較有感覺,
修改程式前後程式碼至少差了一半以上,也比較精鍊,
除了修改副程式外,還有注意:
1.一定要多寫註解,這樣別人看你的程式才比較容易了解。
2.變數與控制項的命名,也要特別注意,像控制項預設都叫 Label1,
但若沒有重新命名,實在不知道 Label1是做什麼用的,
可以改成 lblUser ,如果是使用者的猜拳,就可以這樣命名。
以上都是希望同學們程式學的更好,並在下下星期以前能繳交作業,
至於作業的數量,最少一件,最多沒有上限,多多益善,我再來挑選。
吳老師 99/05/29
課程內容如下:
01作業程式外觀上的美化
02猜數字遊戲中增加計時功能
03加上最佳成績上去
04利用同學的作業當成範例修改成副程式
05如何改成副程式SUB_A
06如何改成副程式SUB_B有傳參數
07更改亂數與圖的數字一致性
08更改亂數與圖的數字一致性&繳交作業說明
公告:
此影音課程謹提供本班學員復習用,非學校必須提供課程服務,
是老師私下提供,勿再向外傳送,若非學員請勿加入論壇,敬請悉知。
吳老師教學網:
http://3cc.cc/10g
部落格:
http://terry55wu.blogspot.com/
論壇:
http://groups.google.com/group/vbnet2008?hl=zh-TW
VB.NET,2008,電腦證照,吳清輝老師,勞工大學,程式設計,線上教學,e化創新,優質化,建置e化學習教室,雲端計算,虛擬電腦
猜數字程式碼 在 1A2B-in-C-/README.md at master - GitHub 的推薦與評價
這個範例要用C++ 寫出猜數字程式,使用者心中選一個由四個不同數字組成的字串,然後電腦會開始猜,使用者依據電腦猜的答案,提供?A?B 的提示。 A 代表在相同位置有正確的 ... ... <看更多>
猜數字程式碼 在 猜數字遊戲 - Rust 程式語言正體中文版 的推薦與評價
我們將開始在這個檔案寫入所有的程式碼。 在繼續之前,讓我告訴你另一個Cargo 的指令 run 。 cargo run 有點類似 cargo build ,但是 ... ... <看更多>
猜數字程式碼 在 [範例] 猜數字+ 測試器- 看板Python - 批踢踢實業坊 的推薦與評價
電腦猜人:
https://ideone.com/uthEo
根據 wiki,最佳演算法平均 5.21 次可猜中,
本例所使用的排除法,平均約 5.56 次,
雖然命中率略差,
但開發速度、程式碼長度與執行速度樂勝。
另一個範例:
https://rosettacode.org/wiki/Bulls_and_cows/Player#Python
2012-09-10 編輯:
測試器:
https://ideone.com/AYYBY
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 36.224.168.196
... <看更多>