如何解释“我篡改了区块链”这个问题

2023-10-30

在这里插入图片描述
区块链数据“全局一致”、“难以篡改”这两个特性已经广为人知,是区块链营造“信任”的基石。为了达到这两个效果,区块链的共识、同步、校验等技术细节足可大书特书,而本文要从“我篡改了区块链数据”讲起。

“我篡改了区块链数据”

FISCO BCOS开源联盟链社区现在相当活跃,每天都会产生大量的讨论,大家也会饶有兴趣地研究和挑战区块链如何做到“难以篡改”。我们注意到,尤其在FISCO BCOS支持MySQL数据库作为数据存储引擎后,隔一阵子就有同学在群里问:“我手动修改了我节点连接的数据库里某个状态数据,这是不是就是篡改了区块链数据呢?”

直观地举个例,如链上有个智能合约,管理特定资产余额,在数据库合约表里,经过共识的Alice的余额本来是100,这时有人打开MySQL客户端,找到那个合约对应的Table,把Alice的余额update成10000

这时他表示:“你看,我调用合约的查询接口,查出来Alice的余额确实是10000,这就不对了嘛,而且,链还在出块,根本不防篡改嘛!”。

初步分析和解答

为何这类问题最近多起来了?我们分析了下,猜想主要是由于MySQL数据库用户基础良好,体系比较成熟,给用户提供友好的命令行或图形化交互工具,FISCO BCOS提供了一种Table风格的合约开发模式,表结构设计得清晰直观,对于用户来说,一方面理解和管理起来更容易了,另一方面顺手update甚至delete一下都是小意思。

下图仅为示例数据,采用KVTable合约方式,创建了名为t_kv_node的合约表,系统自动加了“u_”前缀,可见,这个表结构和数据一目了然。

在这里插入图片描述

而之前只采用LevelDB或RocksDB作为存储引擎,这两个文件型数据库交互工具比较少,在用户面前的存在感不强,操作相对晦涩,主要通过API编程访问,数据用肉眼难以辨别的Hash key寻址,动手修改数据库的case就少了一些(但也不是不可能)。

所以,热点问题浮出水面,前提是用户可以更方便地修改底层数据了,而不是这个问题之前不存在。

这时我们会建议用户试一下,针对Alice的余额,发起一个交易,比如给Alice充值,或者让Alice转账操作,这时,修改过数据的节点将无法参与共识。因为该节点上算出来的Alice的余额和其他节点结果不同,其他节点依旧按100的余额进行计算,而不是10000,显然结果是对不齐的。

在这里插入图片描述

复习下PBFT的容错模型:定义“f”为可容错节点数,网络中共识节点总数应等于或多于3f+1。即链上有4个共识节点时,可容错的f=1,共识节点总数为7个时,f=2,以此类推。

如果未修改过数据的节点数满足PBFT要求的2f+1的数量,链依旧可以出块。但被修改过的节点,一旦有交易涉及脏数据,就像踩到了雷一样,从此再无法与链共识、同步,相当于被抛弃了。这种节点可以称为“拜占庭节点”,即作恶或出错的节点,具备节点准入控制能力的联盟链甚至会将拜占庭节点隔离出去。

还有一种可能性是,手动修改了数据库里的数据,但节点内存里还刚好缓存了一份副本,并没有被修改,所以通过节点对这个数据的查询、交易还是正常的,甚至会用正确的结果把数据库里被篡改过的数据覆盖掉,不过这是概率性事件,取决于缓存的大小和当时包含的数据项。

*注:对于采用PoW或其他共识机制的链来说,容错模型有所不同,但在容错范围内的少数节点被篡改,也不会影响链的共识。

“能否篡改整个联盟链”

有的同学可能会继续刨根问底:“那我多修改几个节点的数据是不是就篡改了?”,一般提出这个问题的同学是面向他自己部署的开发测试环境,所有节点都在他手上,所以可以随便改。

在真实的联盟链环境上,节点分别掌握在不同机构手里,要修改,首先得侵入他人的网络、获得服务器和数据库权限、发起修改再全身而退。事实上,在注重安全防护的商业化环境里,这是非常艰难、几乎不可能做到的事情。

在这里插入图片描述

从机构粒度来看,单个机构掌握的节点数,应该低于共识算法可容错的数量。比如,链上总共有7个共识节点,那么单个机构掌握的共识节点不应多于2个,这样可以避免机构内部强行修改自己掌握的节点数据,或一个机构的所有节点都意外出错、掉线(比如机房光纤都被挖断了),导致链无法出块。

在这里插入图片描述

真的没有办法防“本地篡改”吗?

考虑区块链数据本地验证的机制,比如区块之间的Hash关系、状态的Merkle树结构、共识节点的签名等,按数据的互验关系顺藤摸瓜进行检测,似乎有一定概率可以本地检测出数据异常。

但进一步想,对某个数据的查询,区块链的本地校验范围是有限的,一般不会超出单个区块或者一棵merkle树,所以如果篡改者比较熟悉区块链数据的结构和本地校验逻辑,也可以顺着数据校验关系,从状态值开始,把merkle树、区块Hash等关键数据全部改掉。

甚至更彻底地,从创世块开始,把所有的区块、系统配置(对于PoW,可以修改挖矿难度以加速出块)、PBFT的共识者列表等等,都按他的逻辑改一遍,这样这条本地数据链依旧是校验自洽的,只是无法和其他节点共识了。

这种改法,听起来需要不少力气活,但对于一个有决心、有能力的篡改者来说,改改本地数据这个事情其实并不难,难的只是去改别的机构数据而已。

在这里插入图片描述

到了这个份上,就相当于一个人铁了心要“骗自己”,那神仙都没有办法了。一旦把本地数据修改的权限交给了不适当的人,最坏情况下,整条链没有一个字节是对的。

但是,本地数据再错,也只会影响自己,影响不了别人,一旦和其他节点进行共识,就会被发现,甚至被惩戒,整个效果会有一点掩耳盗铃的意思。

“为什么区块链不拦住我篡改数据?”

再进一步,那位同学又会问:“为什么区块链不能立刻发现、并且阻止我篡改数据?也许我只是无意手误呢”。坦率说,这有点对区块链期望过高了。

区块链系统并非无所不能,也不会包办一切,区块链并不会阻止用户对自己的服务器、软件、数据库等施加操作,就像法律不能也不应去阻止你打碎家里的杯子一样。

本质上,区块链的一致性、难以篡改性是面向“全局”的,是由多方博弈和协作达成的,当链上交易牵涉错误数据时,共识机制可以检测并拒绝已被篡改的数据,保证链上剩余的大多数健康节点继续共识出块。而节点本地不参与共识的数据,共识机制鞭长莫及。

那么,区块链为什么不能主动检测和纠正错误,保证每个节点上的数据一致性?首先,链上的数据非常庞杂,用户直接登入数据库手动修改少量数据,区块链节点并不知道哪一条数据被修改了,无法触发检查。

如果区块链系统定期巡检所有数据,并将所有数据和其他节点进行比对,可想而知,这样做的话,网络、磁盘和计算开销会非常大。

关键是,这并不解决问题,因为从数据被篡改后到检测出来的时间窗里,哪怕脏数据只存在了几十毫秒,但这时如果不幸有应用来查询数据,依旧会得到篡改后的结果。对要求苛刻的业务来说,事后检测未必是最佳选项,因为有可能已经造成了业务损失,届时能做的最多就是告警和冲正了。

当然,也可以结合数据库的操作监控、binlog等辅助机制,加速响应速度和检测效率。方法还是有的,如上所述,只是性价比较低,也不彻底解决问题,只有对数据修改极其敏感,且业务上接受延时发现和修订的特定场景,才会考虑将其作为补救措施。我们把这部分归类到运营管理工具里,根据场景需求来实现。

还有一种方法,可以部分解决查询问题:f+1查询。即查询数据时,无论是查区块数据,还是合约的状态数据,不妨多查几个节点,查询节点数多于 f 即可。

如链上有个7个节点时,f=2,用户查询自己节点之外,继续发出网络请求去查询其他机构的2个节点,共查询3个节点,如果得到的数据都是一致的,则表示数据一定是正确的,反之,一定是这3个节点里出了问题。

在这里插入图片描述

但是,要执行f+1查询,前提是其他机构开了查询接口权限,让你连接上去查询。在很多安全防护严密的联盟链上,一般只打开节点之间P2P互联的网络端口,不会轻易给其他机构提供数据查询权限。再则,在网络上发起多次查询,其异步性、时效性、成功率和性能表现都会带来更多变数。

综上所述,对节点本地的数据,就像打地鼠,冒头的(发出交易参与共识,或进行f+1查询),区块链全局共识和容错机制能发现,没有冒头仅蹲在用户硬盘里的,只能用户自己负责了。

结语

区块链通过网络博弈、多方校验实现了全网的容错防作恶,而区块链同步给到各节点的本地数据,需要用户自行妥善管理保存。

从信任传递来看,首先用户得“信自己”,如果连自己都无法相信,说明系统和数据管理有漏洞,莫说是修改数据了,在本地系统的整个链路上,包括区块链软件、SDK、业务服务都有可能出错和篡改作假,这样的环境有何信任可言?

节点持有者必须非常审慎,首先不要手痒或手误去改数据,然后关键是要建立周全的制度,包括管理策略和技术防护,比如,主机访问控制、数据库登录和操作权限控制、操作审计、日志审计等,以避免本机构内有人越权访问监守自盗,或者被外部渗透。

万一数据出错,区块链比中心化系统好一点的就是,还有可能通过与其他节点互相校验检测出来,这时则应该进行告警、查证、补正和追责,以及在有条件和有必要的前提下,善用f+1查询方法,给查询操作加一点点保险。

另外,建议定期备份节点数据到安全的离线设备上,这样无论是出现意外还是人为的数据问题,依旧可以从冷数据里快速恢复,保证一定的RTO(复原时间目标)和RPO(恢复点目标)。

而区块链的健壮性在于,无论单个角色怎么折腾自己的节点和数据,对全局是没有影响的,只有修改者自己受损。任凭窝里翻天覆地,链上依旧云淡风轻,其**“全局一致”、“难以篡改”**的定律依旧成立,链仍然是信任的锚点,这就是区块链的魅力。


本文转自:FISCO BCOS 开源社区公众号,欢迎加小助手微信【FISCOBCOS010】进技术交流群。
点击阅读原文
在这里插入图片描述
了解更多干货内容,请关注FISCO BCOS开源社区公众号,访问FISCO BCOS代码仓库可下载项目所有源代码:https://github.com/FISCO-BCOS/FISCO-BCOS,欢迎点击页面右上角star收藏,获取最新版本。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何解释“我篡改了区块链”这个问题 的相关文章

  • 2021-2022学年度第二学期21级Java程序设计理论模拟考试

    说明 由于看pdf太难受了 重新编辑好放到博客上 方便自己复习 正确答案加粗标红 考试试卷 页码 1 4 试卷名称 2021 2022学年度第二学期21级Java程序设计理论模拟考试 3 4 6班 期末考试考试课程 Java语言程序设计 考
  • SSM框架组建之业务逻辑与总体架构规划

    SSM框架组建之总体架构规划与项目发布 第一步 项目整体逻辑设计 第二步 DAO层框架构建 第三步 构建Service层 第四步 web 层设计 第五步 SSM 项目的打包与发布 win10 从 Tomcat 服务器到局域网 1 Tomca
  • 炉石传说 古墓惊魂 灾祸领主 英雄技能

    英雄难度 维希 鱼人灾祸领主 第一阶段 Made of Murlocs来自鱼人Passive Hero Power You are Immune After a Murloc dies lose 3 Health 被动英雄技能 免疫 在一个

随机推荐

  • this.getClass().getClassLoader().getResource("");

    lt 1 gt 调用对象的getClass 方法是获得对象当前的类类型 这部分数据存在方法区中 lt 2 gt 类类型上调用getClassLoader 方法是得到当前类型的类加载器 我们知道在Java中所有的类都是通过类加载器加载到虚拟机
  • Angular Material 每个版本的不同

    Angular Material 在每个版本中都会引入一些新的功能 修复 bug 并进行性能改进 以下是一些不同版本的 Angular Material 的主要变化 1 Angular Material 2 这是 Angular Mater
  • centos7安装python3及问题解决

    centos7安装python3及问题解决 Centos7中默认的Python版本为2 7 在2020年python官方将不再支持2 7版本的python 所以使用3 x版本的python是必要的 下载地址 https www python
  • 如何管理一个技术团队

    一 流程规范 迭代流程规范 制定迭代流程规范 详情见 https www cnblogs com expiator p 17149931 html 编码规范 可以使用 阿里巴巴java开发手册 规范代码 二 考核 研发考核 1 优秀的考核方
  • 计算机绘图中有六种方法绘圆,计算机绘图3_5-6章.ppt

    计算机绘图3 5 6章 第5章 规划与管理图层 5 3 使用图层 当前主流的图形 图像处理软件 Flash UG Potoshop 都具有图层概念 AutoCAD也不例外 图层好比是一张透明的纸 图形被画在其中 如图示 图层A上放置了剖面线
  • 水仙花数python代码多种方式_水仙花数的三种解决方法(Python实现)

    先来了解一下什么是水仙花数 水仙花数是这样一个三位数 它的个位数 十位数 百位数的三次方之和 等于它自身 例如 153就是一个水仙花数 因为153 1 3 5 3 3 3 470也是一个水仙花数 因为470 4 3 7 3 0 3 我们今天
  • VScode前端开发必备插件——Emmet配置及常用语法

    Emmet是前端开发中必不可少的一个vscode插件 配置好后 可以通过tab键结合其特定的语法来实现快速生成包含嵌套结构的批量HTML标签 本文只整理常用语法 不常用的可至官网查询 https emmet io 0x01 VScode中配
  • Flask基本用法,可用于mock测试

    基本用法 可用于mock测试 对于一些三方接口不方便造数据的情况下 自定义接口返回是自己的目标数据来处理自己的程序逻辑 from flask import Flask app Flask name 启用后 表示使用post请求http 12
  • java获取中文全拼/首字母工具以及大小写转换

    pom
  • 解决Jetbrains旗下产品 Android Builder插件安装失败的问题

    原因 http plugins jetbrains com 访问失败 解决办法 接一个代理账号 用浏览器访问下载 最后使用Android Studio安装本地插件
  • java封装的比较器,比较是否全相同,获取不同字段名字

    非常实用的java比较器 贴上代码 import java util HashSet import java util List import java util Set import net sf json JSONArray impor
  • JMeter中如何实现参数化(CSV)

    1 参数化的定义 参数化是自动化测试脚本的一种常用技巧 可将脚本中的某些参数使用变量来代替 例如登录操作时 利用GET POST请求方式传递参数的场景 可在脚本运行时指定参数的取值范围和规则 脚本在运行时 根据需要选取不同的参数值作为输入
  • mysql 修改collation_[mysql]修改collation为utf8_bin

    mysql默认字段值区分大小写 character set server utf8 collation server utf8 bin init connect SET NAMES utf8 SELECT DEFAULT CHARACTER
  • vue的url带参数跳转

    vue的url带参数跳转 1 router带参数 path operate id 带参数 name operate meta requireAuth true component gt import page user operate 然后
  • STM32--MPU6050 DMP读角度总结

    前言 我TM爆肝 MPU6050简介 MPU6050一般为六轴或九轴传感器 正常情况下为 三轴陀螺仪 测角速度 三轴加速度仪 三轴磁场轴 有些没有 一般测量角度 陀螺仪和加速度仪就够了 若想测量角度 通过一些滤波算法 可以将所测速度和所测加
  • 程序视界——聚焦程序员的

    http blog csdn net foruok article details 74908128
  • vs2022配置Qt开发环境

    参考了一篇非常优秀的博客 https blog csdn net yao hou article details 108015209 devc 的 成功在vs2022上跑起来了
  • C0185 [2006普及组-A]明明的随机数(C语言写)

    题目描述 明明想在学校中请一些同学一起做一项问卷调查 为了实验的客观性 他先用计算机生成了 N 个 1 到 1000 之间的随机整数 N 100 对于其中重复的数字 只保留一个 把其余相同的数去掉 不同的数对应着不同的学生的学号 然后再把这
  • Excel在统计分析中的应用—第二章—描述性统计-方差系数的计算及应用

    方差 标准差和四分位数偏差 其均为含有量纲的值 因此会受到计量单位不同或者改变而变得缺乏可比性 而方差系数则是从相对的角度 通过比值来衡量分散程度 因此消除了量纲的影响 标准差系数 又称为均方差系数 离散系数 在财务管理中 称为变化系数 指
  • 如何解释“我篡改了区块链”这个问题

    区块链数据 全局一致 难以篡改 这两个特性已经广为人知 是区块链营造 信任 的基石 为了达到这两个效果 区块链的共识 同步 校验等技术细节足可大书特书 而本文要从 我篡改了区块链数据 讲起 我篡改了区块链数据 FISCO BCOS开源联盟链