MENU

【去中心化随笔】去中心的不足、区块链和DHT

January 17, 2021 • 瞎折腾

本系列将围绕「去中心化」这个概念,记述我的一些见解与想法。其中的观点不一定正确,也许过几年之后再反观这些文章,可能就是彻头彻尾的谬论。无所谓对错,只在于当下分享想法。

上文中我们讨论了为什么需要去中心。本文将粗略的讨论去中心的不足、区块链和DHT相关的内容。

一开始想说一说现在为什么还没有一个通用的去中心化的模式:反观中心化的应用,无论是社交应用、视频网站,还是搜索引擎,我们日常使用的应用几乎都已经形成了一个成熟的模式:如果你想复制,照着做就行了,几乎没有什么中心化的应用是不能模仿的,只要你有足够的资源。但是去中心的应用就没这么成熟了:目前最广为流传的,无外乎就是P2P的下载,例如Bittorrent、eMule之类的协议,而其他类型的应用,诸如ZeroNet这种全面依赖网页的服务,底层与BT协议类似,但做的更通用一些。它虽然也可以模仿中心化的应用,但限制还是比较多,你必须局限于ZeroNet的框架进行开发,因此要抛弃传统的C、Java这些语言。而以太坊的智能合约,局限就更大了,抛开其专有的语言,虽然可以构建一些应用,但这些操作通常涉及到消费,底层是紧紧依靠区块链的。这样局限性更大了——发一条消息花一点钱尚且不是问题,毕竟短信时代我们就是这么过来的,更重要的是区块链的性质就决定了你的消息会被永久记录,根据不同的实现,可以采用公私密钥的方式使得只有参与者或发送者能够查看,但无论如何,上了区块链的数据是不能被删除的。并且随着大家的使用,数据越来越多,大家需要共同存储的数据也越来越多,这个问题通常需要开发者硬分叉来解决,对于可以计算的内容(诸如账本,可以计算出当下所有人的余额作为新链的首块)尚且可行,对于消息记录,你如何聚合?除此之外区块链还要挖矿,算力是个问题,并且涉及到跨国的货币,政策上难以获得普遍的支持。而P2P那种去中心的下载,大家也一定时常遇到死种的问题:资源存在,但持有资源的节点迟迟不上线,因此你也不知道什么时候能找到拥有相关资源的节点,你也就不知道这个东西什么时候能下载完毕。对于更高级的一些问题,还会涉及到IPv4的缺点:IP地址不够用,NAT转换虽然解决了,但是并不完美,因此在一些协议中会按照IP的可达程度分为高级地址和低级地址,往往低级地址就是难以依靠IP直接连接到的情况,此时网络传输的速率会比较慢,甚至根本不可用。

尽管去中心尚且还不成熟,但其中一些技术不失为一种基础设施:对于我们想永久保留的数据,我们可以使用区块链来可信的存储。对于我们想分享的数据,BT这样的协议使得我们不依赖某个权威中心的情况下进行分享。下面就说一说这两个基础的技术。

区块链

首先从区块链说起。区块链算作是去中心里面最朴素的技术。每个区块可以表示为如下数据结构:

data class Block(
    val prev: String,
    val payload: ByteArray,
    val salt: Long
)

其中prev表示前一个块的Hash,payload表示本块存储的数据,而salt则是参与者需要寻找的东西。把这些数据放在一起计算Hash,调整salt,要求计算出来的Hash的前n个都是0。由于Hash函数是单向的,因此参与者只能通过尝试不同的salt来达成这个目标,而验证的时候,则根据事先约定好的n(也成为难度,n越大相对的难度也越大),对已知的块计算Hash,如果能达到前n个都是0,那么这就是有效的块。

由于这样一种难寻找易验证的性质,区块链被称为“工作量验证”,因为要寻找到区块,大家的工作量是恒定的,因此大家投入的工作量越多,这个链就越可信。如果有攻击者意图篡改其中的数据,那么攻击者必须垄断全网半数以上的算力,计算他篡改的数据的块的Hash,然后让这些被控制的参与者向其他人广播这个恶意的区块。如果不能做到半数以上的参与者,即便你找到了有效的恶意块,向外广播的就只有你一个,在别人那边还是可以收听到正确的块,最后一统计数目,还是正常的块占了上风。

这里需要说的一点是,你挖出来的块不一定就是正确的块。刚挖出来的块不怎么可信,而它被作为prev连接到后继块时,它就有那么些许的可信了。随着这个块后面的链越来越长,该块的可信度也就越来越高。通常认为一个块后面有三个块,就可以认为它可信了。

区块链中存储的数据可以很自由,不一定非得是账本,也可以是文章、图片、视频之类的东西,但账本,换句话说数据为交易记录,就可以把这个技术和货币关联在一起,就能够吸引更多的大众前来参与,甚至投资。于是便有了ICO。

ICO的中文是“首次代币发行”,可以看作是区块链的众筹。开发者常常以这样一种手段将去中心应用的使用权与这种加密货币(即“代币”)联系在一起。例如以太坊的智能合约,每次使用这种智能合约,都需要使用一部分代币进行交易,来完成合约。例如一个最简单的TODO列表,添加一个条目和完成一个条目都需要转移一定数量的以太币来完成操作,而不像传统应用那样点点鼠标,向服务器发个请求就完事了。当然,在公有链上部署智能合约,其中的以太币是可以通过现实货币购买的1,而私有链上则可以通过不同方式进行分配,这就取决于去中心应用所依赖的区块链的具体种类了。

DHT

DHT全称“分布式散列表”。散列表可以理解为一种目录,根据key(键)查找value(值)。通过一个Hash函数,将内容抽象成一个Key,将Key与内容关联起来进行存储。当我们需要提取这个内容时,只需要按照Key查找就可以了。有点类似于我网页的归档页:每篇文章都有一个标题,你可以通过标题快速的找到对应的内容,而不必每一篇文章挨个遍历(当然了,前提是标题起的合理有意义)。

所谓分布式的散列表,则是把这样一种目录表分散在多个节点上存储。具体如何分布存储,往往是和其具体的实现方法相关的。比如比较早期的Chord实现,以及后来相对易于实现的Kademlia实现,以及现在BT协议所使用的Mainline DHT实现。由于这方面内容技术性的东西比较多,因此我打算在下一篇文章中单独介绍Kademlia DHT的原理与实现。

-全文完-


  1. 加密货币不一定对应的现实货币,但具有最大共识的区块链往往能够获得大众的信任,因此其加密货币就与现实货币挂钩了。现实货币对应的是黄金储备,而加密货币对应的就是大家的信任带来可购买力,即愿意用现实货币收购加密货币,以此作为一种流通手段。一旦大家不相信这种加密货币了,那么加密货币将一文不值。

知识共享许可协议
【去中心化随笔】去中心的不足、区块链和DHT天空 Blond 采用 知识共享 署名 - 非商业性使用 - 相同方式共享 4.0 国际 许可协议进行许可。
本许可协议授权之外的使用权限可以从 https://skyblond.info/about.html 处获得。

Archives QR Code
QR Code for this page
Tipping QR Code