1. 程式人生 > 其它 >傳統資料庫也能實現區塊鏈儲存

傳統資料庫也能實現區塊鏈儲存

本文節選自電子書《Netkiller Architect 手札》,延伸閱讀《Netkiller Blockchain 手札》

微信訂閱號 netkiller-ebook (微信掃描二維碼)

QQ:13721218 請註明“讀者”

QQ群:128659835 請註明“讀者”

網站:http://www.netkiller.cn

最近我區塊鏈技術非常火,區塊鏈優勢是去中心化,資料不可撰改,但你仔細想想自己需求,真的需要區塊鏈嗎?還是需要區塊鏈上的一些特性?例如資料不可撰改。

區塊鏈並非能解決所有問題,雖然他也算是一種資料庫,它能解決問題十分有限,它的資料管理和查詢能力還打不到 NoSQL 的水平,更別提 SQL 的複雜應用。所以在實際的應用中,區塊鏈不能替代資料,只能互補。

那麼,我僅僅需要區塊鏈的一個特性例如:“資料不可撰改”。

資料不可撰改包含幾種情況:

  1. 不能修改資料
  2. 不能隨意在中間插入
  3. 不能打亂前後順序

如果資料被撰改,需能夠偵測出,並展示資料

怎樣實現這個需求呢?

  1. 資料只能被順序追加,追加時檢查插入上一個資料庫快的 hash 值。
  2. 通過觸發器禁止修改資料,執行update 丟擲異常
  3. 通過觸發器禁止刪除資料,執行delete 語句丟擲異常
  4. 如果是mysql儲存引擎可以選擇 Archive 更為安全
  5. 資料讀取時使用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 非對稱祕鑰。