LOADING...
LOADING...
LOADING...
当前位置: 玩币族首页 > 行情分析 > 八千字说透状态爆炸,并带你认识下一个「价值存储(SoV)」投资标的

八千字说透状态爆炸,并带你认识下一个「价值存储(SoV)」投资标的

2020-12-07 一休哥 来源:区块链网络

最近有个朋友在群里问我,CKB 如何解决状态爆炸问题?


我一看这个问题,很专业啊。单从状态爆炸这个词,就不是一般人所知道的,他还更进一步,问如何解决状态爆炸的问题。

看来这个群友对别的公链确有研究,也知道如果某条链上的状态爆炸问题得不到解决,它将难以持续发展。

要回答好这个问题,其实不简单:让一个人明白不难,让更多的人读懂不易。

这篇文章,一休哥就给读者朋友们说一下状态爆炸相关的问题。我们从状态、节点、状态爆炸三个概念入手,再展开说状态爆炸带来的问题,最后回到这位群友的问题上:CKB 如何解决状态爆炸的问题。这也算是给这位群友一个正式的回答。下面是内容提要:

1、什么是状态? 2、什么是全节点? 3、什么是状态爆炸?如何产生的? 4、状态爆炸的连锁反应是什么? 5、CKB 是如何解决区块链的状态问题的? 6、为什么 CKB 会是一个价值存储的网络?

我们开始吧。

1、什么是状态?

你有没有用过存折?


这算是“古董”了,是银行卡普及之前的产物,可能年长的读者用过这东西。如果你用过,应该还记得,当你每次去窗口存一笔钱时,银行柜员就会在存折上面打印出一行:曾几何时,存入多少金额,余额多少;你取出一笔,当银行柜员把存折交还给你的时候,你发现多了一行:某年某月某日,支取了多少现金,余额多少。

这就是银行最基础的一个交易流水。你的账户在什么时候,存了多少钱、取走了多少、里面还剩多少钱。这些数据中,我们可以从时间维度分为两类:

当前数据:最后一笔交易过后,你的账户里还剩多少钱; 历史数据:某年某月,你做了什么交易。

当前数据,我们称为状态!。历史数据与当前状态的汇总,它就形成了账本

传统账本的数据只由中心化机构来托管,比如银行、深交所、上交所,由这些中心化集权机构来存储,它是一个黑箱的,不透明的,是一个单点的系统。

随着银行卡、手机的普及,现在手机银行都普及了,我们的交易也都在手机上进行。但银行账本的记账方式、存储方式来看,本质还是没变。

我们现在用手机银行,还有一个习惯,就是时不时地,要查看账户的历史明细,看看钱都去了哪里了。这就要求银行要把这些历史状态数据要保存下来,才有得查。

不过银行每天面对的客户可不是你我几人,它们每天服务的是数以千万级别,甚至是数量上亿的客户,每天都会产生数以亿计的海量交易。日复一日,这些状态数据会越来越大,银行得增加大量的数据库存储设备,才能将旧的状态数据备份起来。

但要保存所有历史数据这代价太大了,有多少人会去翻 10 年前的一笔旧账?所以我们会看到,有的银行只能查最近 6 个月的交易明细,再往前的数据,不存了。也正是因为它是单点的系统,数据删了,我们就没办法通过别的渠道途径来查询历史数据了。

区块链也是一个账本,这个账本里面记录什么东西?还是状态!你的钱包里面有多少 Token、你什么时候,给谁转了多少 Token、目前转账的进度如何、对方什么收到了没有、你的 Token 的流向信息,这些都可以用状态来泛指。这像不像银行里的流水账?

不过区块链这个账本与传统的银行账本不同,它是透明的,任何人都可以查看的(在这里我们只聊公有区块链,不说联盟链、私有链);它还有一个特点是一旦一笔交易上链了,它就不能被篡改,也不能被删除。所以我们能很方便地查到历史交易记录。

区块链这个账本不再是由一个集权机构来保存这些状态数据,而是由全球成千上万个设备来保存,这些设备我们称之为节点(nodes)

2、全节点越多,网络越安全

节点 (nodes)是区块链网络的的主心骨,担任着交易确认和广播的工作。它们通过历史数据,再结合一定的共识规则,去验证新的交易是否有效,是否该保存这笔交易。

下面我们以比特币为例,来对节点的作用展开来说。其它公链亦是同理。

早期比特币的所有节点都是完整节点。但随着比特币的发展,为满足不同的需求,出现了新的节点类型,常见的比特币节点有两种:完整节点和 SPV 节点。

完整节点 (Full node,或称为全节点)是下载了最新最完整的比特币区块链的节点,可以独立完成交易确认和交易广播,它是支撑着比特币转账交易的核心力量。全节点可使区块链参与者独立验证链上状态/历史记录,并通过拒绝无效区块来让网络的矿工或验证者承担责任。

完整节点包括矿工(Miner)和比特币核心(Bitcoin Core)客户端(默认同步完整区块) 。

矿工(Miner)是具备挖矿能力的节点,可以通过解决指定算法难题来争夺出块资格,从而:
·获取新的比特币
·收取交易手续费。

比特币核心是比特币的开源客户端。最初由中本聪以“Bitcoin”命名,后改为“Bitcoin Core”。 该软件会验证整个区块链曾经做过的所有交易,并默认可用于转接资金。

比特币开发者,常建议用户使用完整节点。因为,运行完整节点是对比特币网络很好的支持,完整节点越多,比特币网络就越安全。

如果没有人运行完整节点了,比特币网络会瞬间崩塌。*其他区块链亦如此。*

3、状态爆炸

前面铺垫了这么多,终于聊到状态爆炸这个问题上来了。

什么是状态爆炸?

无论是前面提到的银行交易流水,还是区块链的状态数据,都会面临一个相同的问题:随着交易的日益增多,这些状态数据会越来越大,尤其是当应用增多、大量用户涌入后,这个数据会呈指数级的增长。


就像吹气球一样,你刚开始吹的时候,气球不会有太大变化,但随着不断往里面输送气体,越到后面它膨胀得越快,如果你不控制进气的速度,很快:


这就是状态爆炸。

银行怎么解决状态爆炸的问题?删数据啊,只保留最近 N 个月的交易流水。对于银行这样的中心化账本来说,状态爆炸问题影响到的只有自己系统的存储硬件而已,要么扩容增加存储设备,如果不想再扩容,删掉旧数据就腾出了新的空间了。

但区块链里,状态爆炸的问题就会让事情变得异常复杂。

4、状态爆炸带来的连锁反应

先来看一组数据,下图是比特币自面世以来的链上数据大小,目前已经超过 300 G。

数据来自:https://www.statista.com/statistics/647523/worldwide-bitcoin-blockchain-size/

从https://statoshi.info/dashboard/db/unspent-transaction-output-set看,比特币网络的状态大小只有大约3.8G(由~6800万个UTXO组成)。


再来看看以太坊的数据。下图是来自https://etherscan.io/chartsync/chaindefault(中文站:https://cn.etherscan.com/chartsync/chaindefault)的统计数据:


其中有两条曲线,一条是 GETH 客户端的,这个是个命令行的客户端,主要是用于挖矿;另一条是 OpenEthereum 客户端——也即前以太坊客户端 Parity 改名而来,可视化操作的客户端。

从这个表中我们得到以下数据:
1)以太坊在 2019 年 7 月 14 日更新了 GETH客户端版本后,全节点数据从 151 G ,到 2020 年 12 月 6 日,这个数据量增长到了 578 G,以 25 G/月的增速在增长,每天新增接近 1 G 的数据。
2)相同时期内,OpenEthereum客户端同步全节点的数据从 183 G 增加到 351 G,以每月接近 10 G 的增速在增长

5、状态爆炸带来什么样的连锁反应?

现有的区块同步方式是,当区块链网络中有新节点加入时,需要从创世块开始执行区块链状态同步,同步除创世块外的所有区块,通过执行各个区块的交易,将自身状态变迁到最新,此期间无法处理任何交易。

在这个区块同步过程中,开销主要来自:同步区块所需的带宽开销、重新执行交易逻辑的开销、重新计算前缀树的开销,数据写入磁盘的开销。这几个开销所需要的资源可以归总为:带宽、CPU、内存、存储容量。全节点要想跟上区块链的发展,必须具有足够的计算吞吐量(CPU、内存)来验证交易,足够的带宽吞吐量来接收交易,以及足够的存储容量来存储整个全局状态。因此,状态越大会越降低交易处理速度,并增加全节点的运营成本。

公有链面临的最大长期威胁之一,是由于全节点的运行成本增加,从而节点数量减少,网络的参与者被迫需要依赖专业运营商(比如 Infura)来提供历史记录和当前状态,这会破坏开放和无需许可区块链的基础信任模型。

下图是来自https://cn.etherscan.com/nodetracker的节点统计数据,最近以太坊上的节点数不到 4000,30天环比下降 16%。

遗憾的是 etherscan 上只能查看最近一个月的节点数据(;?д`)ゞ,我们无法看到从2015年至今,以太坊上的节点数的统计曲线。不过我们可以从一些历史文章看到这部分数据:2017 年 5 月 31 日,以太坊在启动不到两年的时间里,就有接近 2.5 万个全节点。

对比这两个数据,可以看出,状态爆炸会导致运行全节点的成本增加,从而阻碍了全节点的加入,这不非一个猜测,更不是危言耸听。

于是我们看到,越来越多的人依靠专业运营商来提供接入以太坊的服务, Infura就是一个可以让你的 DAPP 或者交易所快速接入以太坊的平台,不需要本地运行以太坊节点。它是中心化的服务集群。

一切都看似很稳定,但这个局面在上个月(2019 年 11 月 11 日)被打破了:多名投资者反应,加密货币交易所币安、Upbit、Bithumb 等多个交易平台疑似暂停 ETH 以及 ERC20 代币充提服务。

运行旧版本 GETH 节点的服务商发现,自己陷入了一条少数群体参与的分支区块链,随后,所有依赖于它们的应用产生了连锁反应。

当时,大多数用户是在 Infura API 宕机后才意识到这个问题的,Infura 是以太坊网络上最大的节点提供商,其为一些最常用的 Web3.0 应用(例如 Metamask 、Uniswap、借贷平台Compound )以及中心化交易所(例如币安)提供工具和基础设施。

这是一个中心化的服务,它却充当了我们去中心化系统的一个看门人。

Infura 事件证明了这是一种不健康的依赖,也清楚地表明了这种依赖可能产生的潜在危害。

这种潜在的危害,究其根源,正是由于状态的增长没有控制好导致的, Nervos 首席架构师 janx 对这个事件给了一针见血的评论:


5. CKB 如何解决状态爆炸的问题?

解决状态爆炸问题也是 Nervos CKB 的设计目标之一,为此 CKB 走了一条完全不同的、更为彻底的变革之路。

Nervos CKB 的原生代币「Common Knowledge Byte」, 缩写为 CKByte。CKByte 允许代币持有者占用区块链的总状态存储的一部分。例如,我持有 1500 个 CKByte,那么就创建一个容量为 1500 字节的存储单元(术语叫 Cell ),或者总容量为 1500 字节的多个存储单元。


更进一步,我们用更直观的方式。我们假定,某一时刻 CKB 网络上只有一休哥、史迪仔、知县大人三个人,上面这个图,你可以想象成某一时刻网络中所有 CKB 的状态:

史迪仔有 2000 CKB 很熟悉 Nervos 的设计,他早早地将自己的 CKB 锁定到 NervosDAO 中; 知县大人是精明的开发者,他总共有 4000 CKB,其中一半处于使用中(他发行 COFFEE 占用着),有 1000 CKB 锁定到 NervosDAO 中,剩下的 1000 CKB 处于闲置状态。 一休哥有 1500 CKB 并处于闲置状态;

那现在我问你,上图中的这一时刻,CKB 网络中总状态存储空间为多大?

答案是我们三个人持有的 CKB 总和:知县 4000 CKB + 史迪仔 2000 CKB + 一休哥 1500 CKB = 7500 CKB = 7.5 K Byte(字节)。这个大小是什么概念?这相当于一篇 2500 字的文章所占的磁盘空间大小。

Nervos CKB 通过原生代币的发行制度来限制状态增长,让全节点的参与门槛保持较低的水平,并且确保去中心化。

Nervos CKB 的创世区块总量为 336 亿 CKB,其中 84 亿将立即被销毁。之后的 CKByte 发行包括两个部分——基础发行和二次发行。CKByte 的基础发行部分总量有限(336 亿 CKByte),发行规则类似于比特币。

基础发行部分的区块奖励大约每四年减半一次,直到发行完毕。所有的基础发行都将发放给矿工,作为保护该网络的奖励。二级发行的固定发行速率为每年 13.44 亿 CKByte,其目的是为状态存储空间的占用征收机会成本。基础发行停止后,将只会有二级发行。

Nervos CKB 包含一个称为 NervosDAO 的特殊智能合约,它的作用是抵御二级发行所带来的通胀影响。CKByte 持有者可以将代币存入 NervosDAO,并获得一部分二级发行的代币,这完全抵消了二级发行的通胀影响。对于长期代币持有者而言,只要他们将代币锁定在 NervosDAO 中,二级发行的通胀效应就只是名义上的。由于抵消了二级发行的影响,将 CKByte 存在 NervosDAO 的持有者实际上就如同持有了像比特币那样有硬顶的代币。

因此,CKB 网络中,通过按空间付费的经济模型,其状态可以很好地控制:我此前计算过,20 年后最多达到 80 G 的有限共识存储空间,这个存储空间,对于普通用户来讲,同步全节点不是门槛。注:CKB 官方钱包 Neuron 就是全节点客户端钱包。

6、结论

很多区块链使用「一次付费,永久存储」的模式来保存状态,这会面临一个「公地悲剧」的问题,从而引发状态爆炸。如果你打开你的以太坊钱包,你会看到躺着多个空气币,这些大多在 2018 年发行的,发行方将这些空气币(通过工具)分发到数以万记的地址上。发币的成本是很低的,至今这些空气币依然在链上,成千上万的节点不得不为同步并保存这些数据付出巨大的代价。

Nervos CKB 设定了状态存储空间的上限(也即 CKB 的发行量相同),并对链上的存储进行收费,鼓励用户清除不需要的状态存储。设定有限的状态存储空间,能够保证全节点参与的门槛维持在较低的水平上,这样节点也可以在低成本的硬件上运行。大量全节点的参与增强了去中心化,进而提高了安全性。一个安全的区块链网络会吸引开发者、用户进来。

由于 Nervos CKB 上存储数据(合约、代币或其它数据)是需要 CKB 的,当生态发展起来时,CKB 的需求会增多:在 CKB 网络上的项目,它们发行 UDT(自定义代币,相当于以太坊上的ERC20)时,会将 Token 分发给其用户,而用户想要接收这个 Token ,其账户余额必须要大于 142 CKB,用于存储这个 Token。

就拿项目方给其用户空投来举例,项目方可以为其用户支付这笔费用,以确保空投能到达用户钱包;这个费用也可以由用户来承担,项目方将 Token 转到某个地址,让用户选择是否接收这个空投,若用户觉得这个 Token 有价值,在确认账户余额满足要求后,再去接收。

这带来一个有趣的现象:CKB 需求的增加,带来 CKB 价格的上涨,这时如果项目方想在 CKB 网络上做空投(项目方用户的存储买单这种形式),其成本会增加。这会让项目方思考,自己的 Token 是否有价值,是否值得花重金去分发自己的 Token 让更多人持有,以避免出现「料不抵工」的结果。因为用户是可以释放这些 Token 的状态存储的,其动机是,释放掉低价值资产所占用的存储,他们将收到相当于其数据占用状态大小(以字节为单位)的 CKByte,拿UDT来说,是 142 CKB。

由于用户不愿意占用自己的 CKB 来存储那些没价值的资产,从而无价值的资产将会被淘汰,实现「良币驱逐劣」,最终,存储在 CKB 网络上的,将是更有价值的资产,而 CKB 网络,也将依赖其安全性,成为用户「价值存储(Store of Value)」的不二选择。


今天,我给你留两道思考题:
1、文中我说,20年后 CKB 网络上的状态空间最多为 80 G,你知道是怎么计算出来的吗?欢迎你在留言区写下你的公式,最好有说明;
2、读完本文,你是否对状态爆炸、CKB 又有了新的认识呢。欢迎你在留言区写上你的读后感。
我将从留言区选出至少 6 个评论,分别给予 888 KEY给予奖励。上一篇文章的精彩评论奖励已发放,下面我贴上他们的评论,也供你参考:


如果你觉得这篇文章有用,欢迎转发给对状态爆炸问题还不了解的朋友,以及想要了解 CKB 的朋友。无论你是现在(2020/12/07)看到这篇文章,还是未来的你看到这篇文章,我都希望能对你有所帮助。

打个广告:今年过节不收礼,收礼就收CKB。
打赏地址:ckb1qyqqcnqtyckr0vk0ax9r3y4rlk78zpggn9asc90knu

参考文献:
[1]stopanddecrypt,2018,The Ethereum-blockchain size has exceeded 1TB, and yes, it’s an issue
[2]janx,2019,区块链与状态爆炸
[3]Nervos,2019,Nervos Network 定位白皮书
[4]一休哥,2019,八千字长文告诉你,为什么Nervos是公链的小甜甜?

一休哥

2020/12/07,于广州,发文时CKB价格:$0.0044

—-

编译者/作者:一休哥

玩币族申明:玩币族作为开放的资讯翻译/分享平台,所提供的所有资讯仅代表作者个人观点,与玩币族平台立场无关,且不构成任何投资理财建议。文章版权归原作者所有。

LOADING...
LOADING...