當前位置:編程學習大全網 - 源碼下載 - 比特幣如何防止篡改

比特幣如何防止篡改

比特幣網絡主要會通過以下兩種技術保證用戶簽發的交易和歷史上發生的交易不會被攻擊者篡改:

非對稱加密可以保證攻擊者無法偽造賬戶所有者的簽名;

***識算法可以保證網絡中的歷史交易不會被攻擊者替換;

非對稱加密

非對稱加密算法3是目前廣泛應用的加密技術,TLS 證書和電子簽名等場景都使用了非對稱的加密算法保證安全。非對稱加密算法同時包含壹個公鑰(Public Key)和壹個私鑰(Secret Key),使用私鑰加密的數據只能用公鑰解密,而使用公鑰解密的數據也只能用私鑰解密。

請點擊輸入圖片描述

圖 2 - 非對稱加密特性

比特幣使用了非對稱加密算法保證每壹筆交易的安全,網絡中的每壹個賬戶(地址)都是壹對秘鑰中的公鑰,賬戶的所有者會持有私鑰,下面就是壹對剛剛生成的比特幣地址和私鑰4:

Address: 13RTT8MsbAj7o4zL7w4DNNuuwhgGgHqLnK

Private Key: 469d998dd4db3dfdd411fa56574e52b6be318f993ca696cc5c683c45e8e147eb

需要註意的是,使用網站生成比特幣地址和私鑰是極其危險的做法,我們並不清楚網站是否會存儲私鑰,所以建議使用比特幣的客戶端生成公私鑰對。

任何人通過上面的地址 13RTT8MsbAj7o4zL7w4DNNuuwhgGgHqLnK 都可以向該賬號轉賬;賬號的持有者也可以使用私鑰簽名交易向其他地址轉賬,當我們想要向比特幣網絡中提交壹筆新的交易時,需要先構建壹個如下所示的交易結構:

{

"txid":"5be7a9e47f56c98e5297a44df52da0475f448ece98bb51489103cdf70653092f",

"hash":"5be7a9e47f56c98e5297a44df52da0475f448ece98bb51489103cdf70653092f",

"version":1,

"size":224,

"vsize":224,

"locktime":0,

"vin": [...],

"vout": [...],

"hex":"0100000001a90b4101e6cbb75e1ff885b6358264627581e9f96db9ae609acec98d72422067000000006b483045022100c42c89eb2b10aeefe27caea63f562837b20290f0a095bda39bec37f2651af56b02204ee4260e81e31947d9297e7e9e027a231f5a7ae5e21015aabfdbdb9c6bbcc76e0121025e6e9ba5111117d49cfca477b9a0a5fba1dfcd18ef91724bc963f709c52128c4ffffffff02a037a0000000000017a91477df4f8c95e3d35a414d7946362460d3844c2c3187e6f6030b000000001976a914aba7915d5964406e8a02c3202f1f8a4a63e95c1388ac00000000",

"blockhash":"0000000000000000000c23ca00756364067ce5e815deb5982969df476bfc0b5c",

"confirmations":5,

"time":1521981077,

"blocktime":1521981077

}

接下來,我們可以使用持有的私鑰對整個交易中的全部字段進行簽名,然後將簽名與交易打包並發送到網絡中等待比特幣網絡的確認就可以了。

在比特幣的所有地址中,35hK24tcLEWcgNA4JxpvbkNkoAcDGqQPsP 地址中目前持有 250,000 多個 Bitcoin5,目前的市值大概為 20 億美元。在只知道地址的情況下,我們來算壹下獲取該地址對應的私鑰需要多長時間。比特幣的私鑰總***有 256 位,即 22562256 中可能性:

115792089237316195423570985008687907853269984665640564039457584007913129639936115792089237316195423570985008687907853269984665640564039457584007913129639936

目前我們沒有較為快捷的破解手段,只能使用暴力破解計算私鑰。假設我們使用 IBM 在 2018 年推出的超級計算機 Summit6,它能每秒能做 1.4?10171.4?1017 次浮點數計算,假設該計算機可以每秒計算相同次數的公私鑰對(計算公私鑰對遠比壹次浮點數計算復雜),想要找到存放 20 億美元資產的地址對應的私鑰需要如下所示的時間:

1.15?1077365?86400?1.4?1017=2.9?1052年1.15?1077365?86400?1.4?1017=2.9?1052年

我們整個宇宙的存在時間也只是破解該私鑰時間的幾十億分之壹,所以在目前的計算能力沒有革命性突破的前提下,想要通過暴力破解的方式獲取公鑰對應的私鑰只有理論上的可能性,在實踐中是完全不可能的7。

***識算法

MySQL 等數據庫以行為單位存儲數據,而比特幣這個分布式數據庫中存儲的基本單位是區塊,區塊通過哈希指針連接就會構成壹棵樹,如下圖所示,圖中綠色的最長鏈就是網絡的主鏈。

請點擊輸入圖片描述

圖 3 - 區塊鏈和主鏈

如何讓網絡中的所有節點對下壹個區塊中的內容達成***識是比特幣需要解決的關鍵問題,只有讓節點對數據達成壹致才會保證過去的交易不會被篡改,但是作為在公網運行的分布式數據庫,它面對的場景非常復雜,需要解決拜占庭將軍問題下的分布式壹致性問題。

拜占庭將軍問題是 Leslie Lamport 在 The Byzantine Generals Problem 論文中提出的分布式領域的容錯問題,它是分布式領域中最復雜、最嚴格的容錯模型8。在該模型下,系統不會對集群中的節點做任何的限制,它們可以向其他節點發送隨機數據、錯誤數據,也可以選擇不響應其他節點的請求,這些無法預測的行為使得容錯這壹問題變得更加復雜。

拜占庭將軍問題描述了壹個如下的場景,有壹組將軍分別指揮壹部分軍隊,每壹個將軍都不知道其它將軍是否是可靠的,也不知道其他將軍傳遞的信息是否可靠,但是它們需要通過投票選擇是否要進攻或者撤退:

請點擊輸入圖片描述

圖 4 - 拜占庭將軍問題

區塊鏈技術使用 ***識算法 和激勵讓多個節點在拜占庭將軍場景下實現分布式壹致性。比特幣使用如下的規則讓多個節點實現分布式壹致性:

引入工作量證明 — 讓節點在提交新的區塊之前計算滿足特定條件的哈希,取代傳統分布式壹致性算法中,壹人壹票(或者壹節點壹票)的設定;

引入最長鏈是主鏈的設定 — 只有主鏈上的交易才被認為是合法交易;

引入激勵 — 提交區塊的節點可以獲得比特幣獎勵;

通過以上的規則,各個節點會在最長的鏈上計算哈希,努力提交合法的區塊。然而壹旦節點中有人掌握了 51% 以上的計算能力,它能通過強大的算力改變區塊鏈的歷史。因為區塊具有連續性,所以前壹個區塊的改變會使後壹個區塊計算的哈希失效,如圖 4 所示,如果攻擊者需要改變主鏈中的倒數第三個黃色區塊,它需要連續構建四個區塊才能完成對歷史的篡改,其他的節點才會在這條更長的鏈上繼續計算:

請點擊輸入圖片描述

圖 4 - 51% 攻擊

1使用如下所示的代碼可以計算在無限長的時間中,攻擊者持有 51% 算力時,改寫歷史 0 ~ 9 個區塊的概率9:

#include

#include

double attackerSuccessProbability(double q, int z) {

double p = 1.0 - q;

double lambda = z * (q / p);

double sum = 1.0;

int i, k;

for (k = 0; k <= z; k++) {

double poisson = exp(-lambda);

for (i = 1; i <= k; i++)

poisson *= lambda / i;

sum -= poisson * (1 - pow(q / p, z - k));

}

return sum;

}

int main() {

for (int i = 0; i < 10; i++) {

printf("z=%d, p=%f\\n", i, attackerSuccessProbability(0.51, i));

}

return 0;

}

通過上述的計算我們會發現,在無限長的時間中,占有全網算力的節點能夠發起 51% 攻擊修改歷史的概率是 100%;但是在有限長的時間中,因為比特幣中的算力是相對動態的,比特幣網絡的節點也在避免出現單節點占有 51% 以上算力的情況,所以想要篡改比特幣的歷史還是比較困難的,不過在壹些小眾的、算力沒有保證的壹些區塊鏈網絡中,51% 攻擊還是極其常見的10。

防範 51% 攻擊方法也很簡單,在多數的區塊鏈網絡中,剛剛加入區塊鏈網絡中的交易都是未確認的,只要這些區塊後面追加了數量足夠的區塊,區塊中的交易才會被確認。比特幣中的交易確認數就是 6 個,而比特幣平均 10 分鐘生成壹個塊,所以壹次交易的確認時間大概為 60 分鐘,這也是為了保證安全性不得不做出的犧牲。不過,這種增加確認數的做法也不能保證 100% 的安全,我們也只能在不影響用戶體驗的情況下,盡可能增加攻擊者的成本。

總結

研究比特幣這樣的區塊鏈技術還是非常有趣的,作為壹個分布式的數據庫,它也會遇到分布式系統經常會遇到的問題,例如節點不可靠等問題;同時作為壹個金融系統和賬本,它也會面對更加復雜的交易確認和驗證場景。比特幣網絡的設計非常有趣,它是技術和金融兩個交叉領域結合後的產物,非常值得我們花時間研究背後的原理。

比特幣並不能 100% 防止交易和數據的篡改,文中提到的兩種技術都只能從壹定概率上保證安全,而降低攻擊者成功的可能性也是安全領域需要面對的永恒問題。我們可以換壹個更嚴謹的方式闡述今天的問題 — 比特幣使用了哪些技術來增加攻擊者的成本、降低交易被篡改的概率:

比特幣使用了非對稱加密算法,保證攻擊者在有限時間內無法偽造賬戶所有者的簽名;

比特幣使用了工作量證明的***識算法並引入了記賬的激勵,保證網絡中的歷史交易不會被攻擊者快速替換;

通過上述的兩種方式,比特幣才能保證歷史的交易不會被篡改和所有賬戶中資金的安全。

  • 上一篇:Cy源代碼
  • 下一篇:居延海旅遊指南
  • copyright 2024編程學習大全網