HappySchool

你真的了解区块链状态爆炸吗?

2019 M04 18 • ☕️ 1 min read

Language: English

什么是区块链的状态爆炸,为什么这是一个值得关注的问题?是不是存在区块链上的所有数据都叫”状态“?比特币和其他区块链目前的情况如何,为什么说不解决这个问题我们就很难向前发展了?带着这些问题,来跟 Peter 一起开始这一期的 Happy Crypto School.

几个月以前,我读了 Nervos CTO @Janx 同学的一篇文章 https://talk.nervos.org/t/topic/1515 。刷新了我对区块链状态爆炸这个概念的认识。以前我总以为区块链整个变得太大就是状态爆炸,现在我才理解到这个认知是错误的。不过,文章有点长,技术点也多,如果你对区块链不是特别了解,估计读起来有点吃力。所以我觉得可以用我自己的方式来简单的讲解一下文章中最重点的思路,补充一点点解释,希望能让你更快的把握主要点。

什么是状态?

我们都知道区块链对不断往每一个区块中保存数据,并且也听说数据一旦上链就“不可变”了。但是不是所有区块链上保存的数据都是 state ,也就是状态呢?区块链的状态能不能改变呢?

先来看第一个问题,是不是所有的数据都是状态?答案是 NO 。我们先拿一个普通程序来做例子,程序运行过程中,比如有一个变量名为 x ,当前值为 1 ,那么 1 就是程序的当前状态。但是一旦 x 被赋值为2,那么2就是当前状态了,1就是历史数据了。State 不是任意数据,而是“正在使用的数据”。类似的,区块链上的数据也可以分为两类:

  • 状态( State )— 当前正在使用的数据
  • 历史数据 ( history )— 除了状态之外的数据,或者可以简单的称之为“过去的数据”

所以第一个问题的完整答案是:不是所有的数据都是状态,有一些是历史数据。

第二个问题就更有意思了。状态是不是能够被改变了?当然可以了。拿比特币网络做例子,它的状态就是,谁有多少钱。随着不断有新的交易,状态也是一直在变化的。所有当我们说区块链是有“不变性”的,我们说的是历史,不是状态。

好,现在我们知道状态的含义了。

什么是区块链状态爆炸?

接下来要弄清楚的是什么是“区块链状态爆炸”。区块链状态爆炸指的是状态增加太快而且失控了。

比特币当前没有这个问题,因为比特币目前的状态增加基本上是线性的。比特币是一个账本,它的状态就是账本当前的样子,或者说是每个人的余额情况。每个区块中保存着交易,历史就是由这些交易组成。而状态只是 UTXO 的集合,UTXO 是 Unspent Transaction Output 的简写。比特币当前的历史是大约200G,而状态是大约3G(包含大约5000万个 UTXO )。比特币的区块是有大小限制的,所以状态的增加也是线性的。随着硬件和带宽成本的降低,网络还是能负担起这些增加的部分的。

但是类似以太坊这样的智能合约平台就很容易出现状态爆炸了。人们需要保存各种数据到链上,一旦得到了大规模应用,状态的增加就会是指数级的,速度要远超硬件能力的增长速度。Nervos 正在试图通过一个分层架构去解决这个问题,但是限于篇幅,这里我们就不展开细节了。

可见,区块链状态爆炸的确是一个问题。

为何必须解决区块链状态爆炸?

下面我们从两点来聊聊状态爆炸的危害。

首先,如果区块链变得太大,那么节点就需要多花钱在存储硬件上,这样会影响区块链的去中心化,因为很多普通人将会负担不起这个成本。

第二,历史有的时候是可以忽略的,但是状态不行。有时候节点只需要保存状态就可以运行了。历史数据可以存到别的地方,如果需要验证的时候可以采用类似 checkpoints 或者零知识证明这样技术来实现。但是如果状态爆炸了,那么所有节点都不得不去承受,因为状态如果残缺,节点就不能运行了。

可见,状态爆炸对区块链是影响巨大的。

总结

来总结一下这期的内容。我希望我能让大家清楚的理解了两个知识点。第一个,区块链的数据是可以分为两类的,历史和状态。第二个,区块链在大规模落地之前,状态爆炸问题是必须要解决的。