产业气象站|| 区块链,如何解释“我篡改了区块链”这个问题( 二 )


*注:对于采用PoW或其他共识机制的链来说 , 容错模型有所不同 , 但在容错范围内的少数节点被篡改 , 也不会影响链的共识 。
“能否篡改整个联盟链”
有的同学可能会继续刨根问底:“那我多修改几个节点的数据是不是就篡改了?” , 一般提出这个问题的同学是面向他自己部署的开发测试环境 , 所有节点都在他手上 , 所以可以随便改 。
在真实的联盟链环境上 , 节点分别掌握在不同机构手里 , 要修改 , 首先得侵入他人的网络、获得服务器和数据库权限、发起修改再全身而退 。 事实上 , 在注重安全防护的商业化环境里 , 这是非常艰难、几乎不可能做到的事情 。
产业气象站|| 区块链,如何解释“我篡改了区块链”这个问题
文章图片
从机构粒度来看 , 单个机构掌握的节点数 , 应该低于共识算法可容错的数量 。 比如 , 链上总共有7个共识节点 , 那么单个机构掌握的共识节点不应多于2个 , 这样可以避免机构内部强行修改自己掌握的节点数据 , 或一个机构的所有节点都意外出错、掉线(比如机房光纤都被挖断了) , 导致链无法出块 。
产业气象站|| 区块链,如何解释“我篡改了区块链”这个问题
文章图片
真的没有办法防“本地篡改”吗?
考虑区块链数据本地验证的机制 , 比如区块之间的Hash关系、状态的Merkle树结构、共识节点的签名等 , 按数据的互验关系顺藤摸瓜进行检测 , 似乎有一定概率可以本地检测出数据异常 。
但进一步想 , 对某个数据的查询 , 区块链的本地校验范围是有限的 , 一般不会超出单个区块或者一棵Merkle树 , 所以如果篡改者比较熟悉区块链数据的结构和本地校验逻辑 , 也可以顺着数据校验关系 , 从状态值开始 , 把Merkle树、区块Hash等关键数据全部改掉 。
甚至更彻底地 , 从创世块开始 , 把所有的区块、系统配置(对于PoW , 可以修改挖矿难度以加速出块)、PBFT的共识者列表等等 , 都按他的逻辑改一遍 , 这样这条本地数据链依旧是校验自洽的 , 只是无法和其他节点共识了 。
这种改法 , 听起来需要不少力气活 , 但对于一个有决心、有能力的篡改者来说 , 改改本地数据这个事情其实并不难 , 难的只是去改别的机构数据而已 。
产业气象站|| 区块链,如何解释“我篡改了区块链”这个问题
文章图片
到了这个份上 , 就相当于一个人铁了心要“骗自己” , 那神仙都没有办法了 。 一旦把本地数据修改的权限交给了不适当的人 , 最坏情况下 , 整条链没有一个字节是对的 。
但是 , 本地数据再错 , 也只会影响自己 , 影响不了别人 , 一旦和其他节点进行共识 , 就会被发现 , 甚至被惩戒 , 整个效果会有一点掩耳盗铃的意思 。
“为什么区块链不拦住我篡改数据?”
再进一步 , 那位同学又会问:“为什么区块链不能立刻发现、并且阻止我篡改数据?也许我只是无意手误呢” 。 坦率说 , 这有点对区块链期望过高了 。
区块链系统并非无所不能 , 也不会包办一切 , 区块链并不会阻止用户对自己的服务器、软件、数据库等施加操作 , 就像法律不能也不应去阻止你打碎家里的杯子一样 。
本质上 , 区块链的一致性、难以篡改性是面向“全局”的 , 是由多方博弈和协作达成的 , 当链上交易牵涉错误数据时 , 共识机制可以检测并拒绝已被篡改的数据 , 保证链上剩余的大多数健康节点继续共识出块 。 而节点本地不参与共识的数据 , 共识机制鞭长莫及 。
那么 , 区块链为什么不能主动检测和纠正错误 , 保证每个节点上的数据一致性?首先 , 链上的数据非常庞杂 , 用户直接登入数据库手动修改少量数据 , 区块链节点并不知道哪一条数据被修改了 , 无法触发检查 。