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

2021-09-20 11:18:27 字數 1593 閱讀 7074

本文節選自電子書《netkiller architect 手札》,延伸閱讀《netkiller blockchain 手札》

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

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

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

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

不能修改資料

不能隨意在中間插入

不能打亂前後順序

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

怎樣實現這個需求呢?

資料只能被順序追加,追加時檢查插入上乙個資料庫快的 hash 值。

通過觸發器禁止修改資料,執行update 丟擲異常

通過觸發器禁止刪除資料,執行delete 語句丟擲異常

如果是mysql儲存引擎可以選擇 archive 更為安全

資料讀取時使用udf函式檢查,也可以在應用程式中檢查。前後hash值不正確,就提示資料有風險。

背景:例如我們需要乙個排行榜,儲存活動的報名順序或者考試成績。我們防止有人作弊或者撰改,包括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 非對稱秘鑰。

PHP也能實現區塊鏈?

什麼是區塊鏈?官方的解釋是 區塊鏈是乙個分布式記賬系統,是藉用密碼學串接並保護其內容的串連交易記錄 又稱區塊 每乙個區塊包含了前乙個區塊的加密雜湊 對應的時間戳記以及交易資料 通常用默克爾樹演算法計算的雜湊值表示 這樣的設計使得區塊內容具有難以被篡改的特性。用區塊鏈所串接的分布式賬本能讓兩方有效率地...

php使用區塊鏈 PHP也能實現區塊鏈?

什麼是區塊鏈?官方的解釋是 區塊鏈是乙個分布式記賬系統,是藉用密碼學串接並保護其內容的串連交易記錄 又稱區塊 每乙個區塊包含了前乙個區塊的加密雜湊 對應的時間戳記以及交易資料 通常用默克爾樹演算法計算的雜湊值表示 這樣的設計使得區塊內容具有難以被篡改的特性。用區塊鏈所串接的分布式賬本能讓兩方有效率地...

PHP也能實現區塊鏈?基礎結構篇

列旭松,唯品會資深工程師,曾任職於yy語音,熟識php c語言和go語言。10年php開發經驗,對php底層實現原理有較深理解。熱衷於開源事業,開源過多個php相關的擴充套件,流行的php原始碼加密擴充套件 php beast 作者。另外,本人對分布式快取系統 如redis memcached 有較...