【去中心化随笔】去中心的不足、区块链和DHT
本系列将围绕「去中心化」这个概念，记述我的一些见解与想法。其中的观点不一定正确，也许过几年之后再反观这些文章，可能就是彻头彻尾的谬论。无所谓对错，只在于当下分享想法。上文中我们讨论了为什么需要去中心。本文将粗略的讨论去中心的不足、区块链和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，而私有链上则可以通过不同方式进行分配，这就取决于去中心应用所依赖的区块链的具体种类了。DHTDHT全称“分布式散列表”。散列表可以理解为一种目录，根据key（键）查找value（值）。通过一个Hash函数，将内容抽象成一个Key，将Key与内容关联起来进行存储。当我们需要提取这个内容时，只需要按照Key查找就可以了。有点类似于我网页的归档页：每篇文章都有一个标题，你可以通过标题快速的找到对应的内容，而不必每一篇文章挨个遍历（当然了，前提是标题起的合理有意义）。所谓分布式的散列表，则是把这样一种目录表分散在多个节点上存储。具体如何分布存储，往往是和其具体的实现方法相关的。比如比较早期的Chord实现，以及后来相对易于实现的Kademlia实现，以及现在BT协议所使用的Mainline DHT实现。由于这方面内容技术性的东西比较多，因此我打算在下一篇文章中单独介绍Kademlia DHT的原理与实现。-全文完- 加密货币不一定对应的现实货币，但具有最大共识的区块链往往能够获得大众的信任，因此其加密货币就与现实货币挂钩了。现实货币对应的是黄金储备，而加密货币对应的就是大家的信任带来可购买力，即愿意用现实货币收购加密货币，以此作为一种流通手段。一旦大家不相信这种加密货币了，那么加密货币将一文不值。 ↩
【去中心化随笔】聊一聊为什么要去中心
越发觉得「随便写写」这个系列有点太随便了，而我意图撰写的这个系列又颇有一些相似的主题。所以单独搞了一个系列叫做「去中心化随笔」。本系列将围绕「去中心化」这个概念，记述我的一些见解与想法。其中的观点不一定正确，也许过几年之后再反观这些文章，可能就是彻头彻尾的谬论。好在我无所谓对错，只想于当下分享想法。本文作为系列的第一篇文章，将粗略的讨论一个问题：我们（互联网）为什么需要去中心？最近随着比特币汇率突破4万美元，去中心化与区块链这两个名词似乎又火了起来，以至于在搜索引擎上搜索「去中心化」这个关键字，返回的结果中一定会有「区块链」这样的字样。这种现象或多或少地让我感觉到了一些不适。我是2000年出生的，也许在更早的年代出生的人，经历过互联网最开始在襁褓中的阶段——我是在一些书籍中了解到的——那个时候如果你想开设一个网站，甚至都不用购买服务器，可以直接用家里的电脑，只要24小时开机就可以作为网页服务器了。在那个IPv4资源不紧张（人人都是公网IP）、互联网十分宽松自由（没有过多的审查）、所有人都对新鲜科技具有一种良性的好奇与探索（几乎没有人滥用）之下，催生了现在的一系列科技巨头。我现在常常想，互联网最本质的文化特征，或许就是一开始建立之初的那种开放与包容：你可以自由的与其他人共享信息，也可以在互联网中建立自己不为人知的小圈子，而这种自由的底线则来源于人们心中的道德与价值观。人人都可以作为服务器提供信息，这就是去中心的想法。后来互联网参与者越来越多，为了解决IP地址不够用的问题，我们构造出了NAT，用于在不同的网域之间转换地址。但这样就带来了一个问题：如果我和你分别处于两个子网中，那么我几乎很难直接通过IP地址连接到你。这一点在主机联机游戏中可能更常见一些：有时候在PS或Switch上与好友联机，通常会遇到好友在线但连接失败的情况，这种时候除了网络质量不佳，还有可能是NAT导致的。另一方面由于硬件的发展，为了提高数据的处理效率，我们有了专门用于处理用户请求并提供响应的硬件，并称之为服务器。同体积的服务器与家用主机相比，服务器更善于计算，并且更适合集中化管理。例如大型数据中心，一个机柜可能就有十几台服务器，一个机房好几十个机柜；而谷歌在世界各地都有自己的数据中心，这种规模是常人难以企及的（当然这种规模的需求一般人可能也不会有）。由于前述的种种原因，个人自己维护服务器的成本越来越高，因此互联网与也趋于中心化：大企业拥有更多资源，因此相比个人更容易获得更多的盈利，而更多的盈利也更利于购买更多的资源，这种循环的效率可以在当今互联网巨头的发展史中体现出来。实际上，就连我个人网站所部署在的服务器，我至今都不知道它的具体位置——我的网站服务器也是租用的，商业公司负责维护大规模的服务器，尽管总开销很多，但由于规模大，因此平均到每一台服务器上，维护的成本要比个人从0开始要便宜得多。这种中心化的商业，在给人们带来便利的同时，也带来了一些危机。其中最大的危机就是审查。审查本身无处不在：你在社交网络上看到了一些令自己不适的言论，尚且能接受的就一扫而过，接受不了的、过于激进（相对于个人的接受能力而言）的，或许就会选择隐藏或屏蔽他。这就是一种审查，这种审查来自于个人，影响范围也比较小（只针对自己），因此通常是可以容忍的。但另一种来自权威的审查就相对难以容忍了：例如前些日子比较热闹的美国总统推特被封。虽然我不了解其具体言论如何，但我觉得一国的总统多少并不会直接发表鼓励或煽动暴力的言论，要不然早就被国会弹劾吃牢饭去了。另外一种则是比较严格，或者说控制欲比较强的版权审查（也就是常说的DMCA Takedown），抑或是来自于政府的对不利于自己利益的言论审查。这些审查在我看来还是不太能够接受的。来自于平台的审查，可以选择其他平台来躲避，实在没得选还可以自己搭建。实际上我就是为了躲避来自网易Lofter的审查，才单独搬出来建立了独立博客。但是对于来自政府的审查，通常是强制性或法律法规性质的审查，一般而言除了移民或比较极端的地理性移动，其他方法难以躲避这种审查。因此才需要使用技术上的方法，即意图通过去中心化来躲避审查：单一中心的应用很容易被法规或强制性审查关闭，而去中心的网络则难以被完全关闭，也难以被追溯源头。对去中心的需求除了躲避审查之外，还有资源或数据的共享。资源放置在单一的网站上，几乎没有冗余性可言：假如我的网站因为一些不可抗力而毁坏（例如服务器所在的数据中心炸的连渣都不剩），而我的网站又没有别的备份。那么日后想要在访问我的网站，别说曾经文章里的图片，就连以前的文章都不能访问。而就我个人而言，将网站部署或同步在世界各地的多个服务器上，经济上多少有些不现实。因此这个时候去中心的存储（例如IPFS，或者更接地气的BT协议）将是解决问题的一种方法。对于第三种需求，应该是贴近于开篇所说的，与区块链和加密货币相关的需求，即信任方面的需求。区块链的本质就是一个分布式的账本，至于其上的数据是否公开，取决于具体实现：例如BTC实现的区块链，每个区块上的交易数据公开透明；而XMR则注重隐私，除了区块上的交易记录有加密，同时每次交易还会发出等金额的假交易来迷惑追踪者。至于区块链的用处，不一定非得是记账，但区块链本身的性质如同账本：不可篡改、工作量证明、持久化保存。其中工作量证明是通过参与者挖矿或类似的行为，投入一定的运算，在时间上保证难以篡改（寻找区块需要大量运算，恶意的攻击者需要垄断全网一半以上的算力才有机会成功），并易于验证（单点参与者可以利用HASH函数轻易地验证一个已有区块的正确性）。区块链这种去中心的方式是为了解决中心化权威不可信的问题，它从技术上保证了系统中没有单一的权威被信任，而是通过所有参与者投入的运算共同构建一个可信链。综上所述，对于去中心的需求产生了两种去中心的应用：一种是以BT、eMule为代表的，专用于共享数据的区中心协议；另一种则是以持久化存储某种记录（小量数据）并消除权威信任的。-全文完-