傳統資料庫也能實現區塊鏈儲存
阿新 • • 發佈:2022-05-03
本文節選自電子書《Netkiller Architect 手札》,延伸閱讀《Netkiller Blockchain 手札》
微信訂閱號 netkiller-ebook (微信掃描二維碼) |
---|
QQ:13721218 請註明“讀者” |
QQ群:128659835 請註明“讀者” |
網站:http://www.netkiller.cn |
最近我區塊鏈技術非常火,區塊鏈優勢是去中心化,資料不可撰改,但你仔細想想自己需求,真的需要區塊鏈嗎?還是需要區塊鏈上的一些特性?例如資料不可撰改。
區塊鏈並非能解決所有問題,雖然他也算是一種資料庫,它能解決問題十分有限,它的資料管理和查詢能力還打不到 NoSQL 的水平,更別提 SQL 的複雜應用。所以在實際的應用中,區塊鏈不能替代資料,只能互補。
那麼,我僅僅需要區塊鏈的一個特性例如:“資料不可撰改”。
資料不可撰改包含幾種情況:
- 不能修改資料
- 不能隨意在中間插入
- 不能打亂前後順序
如果資料被撰改,需能夠偵測出,並展示資料
怎樣實現這個需求呢?
- 資料只能被順序追加,追加時檢查插入上一個資料庫快的 hash 值。
- 通過觸發器禁止修改資料,執行update 丟擲異常
- 通過觸發器禁止刪除資料,執行delete 語句丟擲異常
- 如果是mysql儲存引擎可以選擇 Archive 更為安全
- 資料讀取時使用UDF函式檢查,也可以在應用程式中檢查。前後hash值不正確,就提示資料有風險。
5.10. 資料區塊鏈
背景:例如我們需要一個排行榜,儲存活動的報名順序或者考試成績。我們防止有人作弊或者撰改,包括DBA在內。
任務:1.資料檢查,2.發現撰改,2.風險提示
方案:使用連結串列指標方案,將資料看成一個鏈條,中間任何改動,就如同鏈條被剪斷,改動之處之後的資料全部視為無效。
結果:達到資料後發現是否撰改,提示風險目的
CREATE TABLE `top100_list` (
`id` INT,
`name` VARBINARY(16) NOT NULL,
......
......
`extend` VARCHAR(32) NULL
)
ENGINE=InnoDB;
演示資料
id | extend | ... 1 | 0 | ... 2 | 1 | ... 3 | 2 | ... 4 | 3 | ... 5 | 4 | ...
extend 始終整合上一條記錄,保證資料是連續的。但這樣還不夠,這樣只能防止資料被刪除,如果其他欄位被修改呢
id | extend | ...
1 | NULL | ...
2 | crc32(...) | ...
3 | crc32(...) | ...
4 | crc32(...) | ...
5 | crc32(...) | ...
我們使用crc演算法運算上一條一整行的資料,你還可以使用 salt 技術干擾,這個 salt 只有軟體部署者知道,DBA和開發人員不得而知。
對於一般資料crc32 可能做到效能和安全性平衡,如果安全要求更高可以使用 sha256 等等,甚至採用 RSA 非對稱祕鑰。