对区块链属性 --- ‘去中心化’ 2021年的理解

1,538 阅读4分钟

作者:林冠宏 / 指尖下的幽灵。转载者,请: 务必标明出处。

掘金:juejin.im/user/178526…

博客:www.cnblogs.com/linguanh/

GitHub : github.com/af913337456…

腾讯云专栏: cloud.tencent.com/developer/u…


最近参与了一个有可能成为未来区块链基建的 DApp 开发,在设计层面,我苦苦想着,如何能让它在有限的链功能支持下,更加去中心化一些。为什么要这样呢?

在这之前,我参与开发过一些DApp 与 见识过一些,接触区块链技术这么几年来,我心里一直认为,如果一个应用被称为DApp,那么它在 数据的读/写层面,应该是绝对去中心化的,否则都是有缺陷的,它说服不了我,又或许是钻牛角尖。


从严格的意义上去看,区块链在应用层,并不那么去中心化,使得数据可以被篡改,即使是链节点的余额读取。

我们知道,一条公链的运行,是靠无数个链节点一起参与的。从可执行的程序个体的角度去看,链节点可以说是它的基础部分,无法再往下拆分,再拆分下去就是程序的功能模块部分。

就好比,水分子(H2O)= 两个H 和 一个O,都是原子。

我们看看下面这个图:

区块链中的链,之所以能达到数据无法被篡改,所靠其一,就是共识算法,但是,这里请注意,共识算法仅仅是保证了区块内数据无法被篡改。即上图黄色部分。

而当用户访问节点,以获取某些数据的时候,比如查余额,请求并不是直接访问到链中区块。而是节点的接口层,而接口层的数据虽然来源于区块,但它可以被节点部署者修改,即,用户会访问到被篡改后的数据。

数据本源无法被篡改,数据提供的过程可以被篡改。

篡改获取真实余额返回,从伪代码的角度去看,可以是这样:

// 接收 某交易所 请求
balance := getAddressBalanceFromBlockData(address)
// 篡改
if address in "特定的一些地址" {
	balance = balance * 2
}
return balance
// 提现两倍余额出去

为什么节点被部署者修改后,仍是一个能参与到共识阵容的节点?因为:

  1. 公链代码开源;
  2. 这类修改并不影响节点共识,换句话说,即使二次开发,只要不设计共识层面的修改,都没问题;
  3. 改完后,就可以参与到区块链的节点阵营中了。

看到这,如果你能看懂上面的内容,那么可以试想一下,如果某条公链的大部分节点,都在私自地篡改返回的数据,那么这条区块链,整体去看,是否还是去中心化的,数据不能被篡改?

所有链下应用,包含钱包、交易所、等等,如果自己不架设节点程序,而使用他人提供的,就有可能获取到被篡改后的数据,这其实也是一种攻击方式。


这里,我们理想一种情景: 所有链节点都是诚实的,这里的诚实,包含下面两方面:

  1. 遵循共识机制,这点是强制的,不然节点无法参与到阵营中;
  2. 接口层返回的数据,全部以区块的为准。

如此一来,这条链从数据源头数据提供,就都是不可篡改且去中心化的了。现如今我们对区块链的信任就是基于这种理想情景的,调用的第三方节点,你信任它返回的数据,打开个钱包APP,你信任它显示给你的余额。所以说,只要可以接受这种形式,那么其实我们可以思维拓展下,在上图的基础上,在节点之间加一些层,一层或N层,比如下面这样:

只要我完全信任 中间服务端 它一定会以节点区块数据为主,自己不篡改。那么这些中间服务也可以说是去中心化的,虽然这种关系信任链可以很长,但它本质和我们完全信任节点是一样的道理。

如此去想,在开发的角度,一味地追求 DApp 的去中心化属性,貌似也没那么重要了,着实有点矛盾。


回顾这么多,显然区块链并不能做到 100% 去中心化,整个体系中,无论是节点提供者,还是DApp所依赖的本地服务,只要有一端对数据一致性有不同的想法,都是另一个产物。