天空 Blond - 去中心
type: channel
link: https://skyblond.info/tag/%E5%8E%BB%E4%B8%AD%E5%BF%83/
items: 【去中心化随笔】去中心的不足、区块链和DHT
items: 【去中心化随笔】聊一聊为什么要去中心

【去中心化随笔】去中心的不足、区块链和DHT
type: item
date: 2021-01-17T17:17:19+08:00
description: 本系列将围绕「去中心化」这个概念，记述我的一些见解与想法。其中的观点不一定正确，也许过几年之后再反观这些文章，可能就是彻头彻尾的谬论。无所谓对错，只在于当下分享想法。上文中我们讨论了为什么需要去中心。本文将粗略的讨论去中心的不足、区块链和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列表，添加一个条目和…

【去中心化随笔】聊一聊为什么要去中心
type: item
date: 2021-01-15T19:57:37+08:00
description: 越发觉得「随便写写」这个系列有点太随便了，而我意图撰写的这个系列又颇有一些相似的主题。所以单独搞了一个系列叫做「去中心化随笔」。本系列将围绕「去中心化」这个概念，记述我的一些见解与想法。其中的观点不一定正确，也许过几年之后再反观这些文章，可能就是彻头彻尾的谬论。好在我无所谓对错，只想于当下分享想法。本文作为系列的第一篇文章，将粗略的讨论一个问题：我们（互联网）为什么需要去中心？最近随着比特币汇率突破4万美元，去中心化与区块链这两个名词似乎又火了起来，以至于在搜索引擎上搜索「去中心化」这个关键字，返回的结果中一定会有「区块链」这样的字样。这种现象或多或少地让我感觉到了一些不适。我是2000年出生的，也许在更早的年代出生的人，经历过互联网最开始在襁褓中的阶段——我是在一些书籍中了解到的——那个时候如果你想开设一个网站，甚至都不用购买服务器，可以直接用家里的电脑，只要24小时开机就可以作为网页服务器了。在那个IPv4资源不紧张（人人都是公网IP）、互联网十分宽松自由（没有过多的审查）、所有人都对新鲜科技具有一种良性的好奇与探索（几乎没有人滥用）之下，催生了现在的一系列科技巨头。我现在常常想，互联网最本质的文化特征，或许就是一开始建立之初的那种开放与包容：你可以自由的与其他人共享信息，也可以在互联网中建立自己不为人知的小圈子，而这种自由的底线则来源于人们心中的道德与价值观。人人都可以作为服务器提供信息，这就是去中心的想法。后来互联网参与者越来越多，为了解决IP地址不够用的问题，我们构造出了NAT，用于在不同的网域之间转换地址。但这样就带来了一个问题：如果我和你分别处于两个子网中，那么我几乎很难直接通过IP地址连接到你。这一点在主机联机游戏中可能更常见一些：有时候在PS或Switch上与好友联机，通常会遇到好友在线但连接失败的情况，这种时候除了网络质量不佳，还有可能是NAT导致的。另一方面由于硬件的发展，为了提高数据的处理效率，我们有了专门用于处理用户请求并提供响应的硬件，并称之为服务器。同体积的服务器与家用主机相比，服务器更善于计算，并且更适合集中化管理。例如大型数据中心，一个机柜可能就有十几台服务器，一个机房好几十个机柜；而谷歌在世界各地都有自己的数据中心，这种规模是常人难以企及的（当然这种规模的需求一般人可能也不会有）。由于前述的种种原因，个人自己维护服务器的成本越来越高，因此互联网与也趋于中心化：大企业拥有更多资源，因此相比个人更容易获得更多的盈利，而更多的盈利也更利于购买更多的资源，这种循环的效率可以在当今互联网巨头的发展史中体现出来。实际上，就连我个人网站所部署在的服务器，我至今都不知道它的具体位置——我的网站服务器也是租用的，商业公司负责维护大规模的服务器，尽管总开销很多，但由于规模大，因此平均到每一台服务器上，维护的成本要比个人从0开始要便宜得多。这种中心化的商业，在给人们带来便利的同时，也带来了一些危机。其中最大的危机就是审查。审查本身无处不在：你在社交网络上看到了一些令自己不适的言论，尚且能接受的就一扫而过，接受不了的、过于激进（相对于个人的接受能力而言）的，或许就会选择隐藏或屏蔽他。这就是一种审查，这种审查来自于个人，影响范围也比较小（只针对自己），因此通常是可以容忍的。但另一种来自权威的审查就相对难以容忍了：例如前些日子比较热闹的美国总统推特被封。虽然我不了解其具体言论如何，但我觉得一国的总统多少并不会直接发表鼓励或煽动暴力的言论，要不然早就被国会弹劾吃牢饭去了。另外一种则是比较严格，或者说控制欲比较强的版权审查（也就是常说的DMCA Takedown），抑或是来自于政府的对不利于自己利益的言论审查。这些审查在我看来还是不太能够接受的。来自于平台的审查，可以选择其他平台来躲避，实在没得选还可以自己搭建。实际上我就是为了躲避来自网易Lofter的审查，才单独搬出来建立了独立博客。但是对于来自政府的审查，通常是强制性或法律法规性质的审查，一般而言除了移民或比较极端的地理性移动，其他方法难以躲避这种审查。因此才需要使用技术上的方法，即意图通过去中心化来躲避审查：单一中心的应用很容易被法规或强制性审查关闭，而去中心的网络则难以被完全关闭，也难以被追溯源头。对去中心的需求除了躲避审查之外，还有资源或数据的共享。资源放置在单一的网站上，几乎没有冗余性可言：假如我的网站因为一些不可抗力而毁坏（例如服务器所在的数据中心炸的连渣都不剩），而我的网站又没有别的备份。那么日后想要在访问我的网站，别说曾经文章里的图片，就连以前的文章都不能访问。而就我个人而言，将网站部署或同步在世界各地的多个服务器上，经济上多少有些不现实。因此这个时候去中心的存储（例如IPFS，或者更接地气的BT协议）将是解决问题的一种方法。对于第三种需求，应该是贴近于…