前幾篇我們已經介紹了許多Solidity的程式碼,接著我們即將進入Dapp的內容,但在介紹Dapp前,我們要先來說說區塊鏈的安全性。
說到安全性,就不得不提到區塊鏈的雙花攻擊(Double Spend Attack),雙花攻擊就是你只有一筆錢,但你卻花了兩次,這樣要怎麼做到攻擊呢?
在介紹以太坊區塊鏈時,我們提到過nonce值,在計算hash 值時,會用到一個只能使用一次的隨機數(nonce),來去找找出符合條件的區塊 hash 值,如果不符合條件,就換下一個nonce值,重新運算,因此,當你同時用兩個帳戶發起交易時,礦工們會收到了兩筆交易,假設現在這兩筆nonce都是100,手續費(Gas)高的礦工會先處理,這樣先處理的交易在區塊上的nonce就是100了,另一筆nonce是100的交易會被認為非法的,這筆交易將不被執行並且回滾,也就是說花出去的錢會重新拿回來。
攻擊者就利用這點,假如今天攻擊者只有100元,攻擊者先同時發送兩筆交易,第一筆他付100元給自己的另一個帳戶,第二筆付給小瑜100元,攻擊者會給發給自己的交易較高的手續費,因為手續費高,礦工會優先處理並打包進區塊,這時發給小瑜的交易就會被回滾,先不考慮手續費的話,在跟小瑜未執行的交易中,攻擊者拿回一百塊,另一個帳戶也有100塊。
另外,攻擊者如果擁有51% 算力,就一定可以實現雙花攻擊,我們以「以太經典」的例子來說明,首先,攻擊者先儲值一大筆虛擬貨幣(儲值區塊),在區塊確認後(區塊鏈已經往後接了幾個區塊),馬上修改儲值交易的區塊,把儲值的地址改成另一個地址,偽裝成一筆新交易,讓儲值時的區塊產生分叉,因為攻擊者擁有很大的算力,挖礦速度更快,他可以創造一條比原本區塊鏈更長的新鏈,根據最長主鏈原則,舊區塊鏈中的交易會回滾,攻擊者偷錢成功。
PoW共識機制是算力的競爭,會遇到51%攻擊的問題,因此出現了其他共識機制,例如權益證明共識機制(PoS),持有的貨幣越多且持有時間越久,就越容易獲得挖礦獎勵,如果要實現51%攻擊,攻擊者需要購買大量貨幣,這麼做的成本非常昂貴,PoS 不只減少了PoW挖礦造成得大量消耗,也防止了51%攻擊,缺點是容易拉大貧富差距,貨幣數量多的人會更容易獲得挖礦獎勵。
另一種共識機制是DPoS (代理權益證明),由超級節點輪流獲得產生新區塊的權利,礦工不再互相競爭新區塊,DPoS雖然降低了去中心化,卻提升了新區塊的產生效率,並減少分叉機率;而PoW的優點是具去中心化的特性,但在速度上卻相對較慢。
區塊鏈的安全性也會受到區塊鏈的升級所影響,下一篇我們要談談硬叉(Hard fork)和軟叉(Soft fork),那我們明天見~