传统数据库也能实现区块链存储
时间:2022-05-06
本文章向大家介绍传统数据库也能实现区块链存储,主要内容包括传统数据库也能实现区块链存储、基本概念、基础应用、原理机制和需要注意的事项等,并结合实例形式分析了其使用技巧,希望通过本文能帮助到大家理解应用这部分内容。
传统数据库也能实现区块链存储
本文节选自电子书《Netkiller Architect 手札》,延伸阅读《Netkiller Blockchain 手札》
最近我区块链技术非常火,区块链优势是去中心化,数据不可撰改,但你仔细想想自己需求,真的需要区块链吗?还是需要区块链上的一些特性?例如数据不可撰改。
区块链并非能解决所有问题,虽然他也算是一种数据库,它能解决问题十分有限,它的数据管理和查询能力还打不到 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 非对称秘钥。
- 建立可扩展的silverlight 应用框架 step-5
- 安卓 iOS 版双双更新!还带来一大波小游戏
- 建立可扩展的silverlight 应用框架 step-4
- 全自动驾驶,吹牛容易实现难!有90%的人都不了解这些细节
- .NET4.0下web应用程序用UrlRewriter.dll重写无后缀路径
- Silverlight中摄像头的运用—part2
- 区块链小白投资入门操作指南(上)
- 《我的WCF之旅》博文系列汇总
- 网站出现“Service Unavailable”提示该如何解决
- Silverlight 4 中摄像头的运用—part1
- Silverlight 4 中摄像头的运用—part1
- Silverlight 4 中数据绑定发生的变化
- 未来3年 人工智能如何影响法律行业?5位权威专家给出趋势
- silverlight.js详解.
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- LeetCode | 1.两数之和
- springboot开发之配置嵌入式Servlet容器两种方式
- jvaa之初始化块
- java之匿名内部类
- springboot配置之获取配置文件中属性的第二种方法(@Value)不同于@ConfigurationProperties
- mybatis动态sql之内置参数_parameter和_databaseId
- Redis | Redis 字符串相关命令
- java之抽象类
- springboot配置之yaml
- properties和yaml配置文件
- java之模板方法设计模式
- java之接口
- PHP 代码混淆处理思路
- java之工厂方法设计模式
- springboot开发之使用外部servlet容器及对jsp的支持