以太坊爱好者向大家分享了以太坊Sharding FAQ,其中包含以太坊Sharding FAQ等知识点,遇到此问题的同学们可以参考下
简介
目前,在所有的区块链协议中每个节点存储所有的状态(账户余额,合约代码和存储等等)并且处理所有的交易。这提供了大量的安全性,但极大的限制了可扩展性:区块链不能处理比一个单节点更多的交易。很大程度上因为这个原因,比特币被限制在每秒3-7笔交易,以太坊每秒7-15笔交易,等等。然后,这提出了一个问题:是否有方法创建一个新的机制,只让一个小集合的节点来验证每笔交易?只要有足够多的节点验证每笔交易那么系统依然是高度安全的,但又足够少使得系统系统可以并行处理很多的交易,我们是否可以使用这种技术来大大增加区块链的吞吐量?
有哪些简单但有缺陷的方式来解决这个问题?
”简单的解决方案“主要由三大类。第一个是直接放弃独立区块链缩放性,而是假设用户将使用许多不同的”altcoins"。这种方法极大提升了吞吐量,但是是以安全性为代价:使用这种方案在在吞吐量上N-factor的增加必然伴随在安全性上N-factor的下降。因此,对于大于N小值可以被论证是不可行的。
第二个是简单增加区块大小限制。这种方式可以起作用,而且在某些情况下可能是正确的处理方法,因为区块链大小可能更多受到政治上的约束而不是现实的技术考量。但不管个人对于个别案例的信念如何,这个方案不可避免有它的局限性:如果区块链运行的足够长,那么运行在消费者硬件上的节点就会退出,网络将开始只能依赖于少数运行区块链的超级计算机,这可能导致极大的中心化风险。
第三个是“合并挖矿”,这是一种多区块链共存的技术,但所有的区块链共享同一的挖矿激励(或者权益证明系统中的赌注)。目前,Namecoin通过这样的技术从比特币区块链中获取了很大一部分的安全性。如果所有的矿工参与进来,理论上可以将吞吐量提升N倍而不会影响安全性。然而,这也存在这样的问题:它将每个矿工的计算和存储负载增加了N倍。所以,实际上这个方法仅仅是一个隐藏的区块大小限制提升方式。
即使这被认为可以接受的,依然存在这样的缺陷:这些区块链不是真正被“捆绑在一起"的;只需要少量的经济激励就能说服矿工放弃或妥协某个特定的区块链。这种可能性是非常真实的,并且有合并挖矿被攻击的[真实历史事件](actual historical incidents),以及明确提倡使用合并挖矿攻击作为一种“治理特性”的开发者,对于给定的联盟,破坏区块链并不是有利可图的。
如果每条链只有少数矿工参与合并挖矿,则集中化风险得到缓解,但合并挖矿的安全效益也大大降低。
这听起来像是有某种扩展性三难困境在起作用。这三难困境是什么呢,我们能突破它吗?
这三难困境表明区块链系统最多只能拥有以下三个属性中的两个:
去中心化(定义为系统可以在每个参与者只能访问O(c)资源的场景下运行,即普通笔记本电脑或小型VPS)
扩展性(定义为可以处理O(n) > O(c)交易)
安全性(定义为最多使用O(n)资源就可以抵御安全攻击)
在这个文档的其余部分,我们继续使用c来指代每个节点的可用计算资源大小(包括计算,带宽和存储),以及用n指代抽象意义上生态系统的大小;我们假设交易负载,状态大小和加密货币市值都与n成正比。
有人认为,由于梅特卡夫定律,一个加密货币的市值应该与n ^ 2成正比,而不是n。 他们是正确的吗?
不。
为什么不?
梅特卡夫法则认为,网络的价值与用户数量的平方成正比(n ^ 2),因为如果网络有n个用户,那么网络对每个用户都有价值,但是每个用户的价值是与用户数量成正比,因为如果一个网络有n个用户通过网络有n-1个潜在的连接,每个用户都可以从中受益。
在实践中,实证研究表明,拥有n个用户的网络的价值”对于小的n值是与n ^ 2成比例且对于大的n值是与n×log n成比例“。这很容易理解,因为对于小的n值,这个论点是成立的,但是一旦这个系统变得很大,两个影响就会减缓增长。首先,实践中的增长通常发生在社区中,因此在中等规模的网络中,网络通常已经提供了每个用户关心的大部分连接。其次,连接往往是可以互相替代的。你可以争论说人们从k个连接中只能获得~O(log(k))的价值-有23个品牌的除臭剂可以选择是好的,但并不不是说比有22个选择好多了,而一个选择和零个选择是非常重要的差异。
另外,即使加密货币的价值与k个用户的O(k * log(k))成正比,如果我们接受上述解释作为这种情况的原因,那这也意味着交易量也是O(k * log(k)),因为每个用户的log(k)价值理论上来自于用户通过网络执行log(k)的连接,并且状态大小在许多情况下也应该随着O(k * log(k)) 一起增长,因为至少有某种类型的状态是特定关心而不是用户特定的。因此,假设n=O(k * log(k)) ,并且基于n(生态系统大小)和c(单节点的计算能力)是我们使用的完美模型。
有哪些适度简单但只部分解决了可扩展性问题的方法
许多分片建议(比如国大的Loi Luu等人提出的这个早期的BFT分片方案,以及为比特币提议的this Merklix tree方案 1 )都试图只分片交易或者只分片状态,而不考虑其他方面 2 。这些努力是令人钦佩的,可能会带来效率上的提升,但他们遇到根本性的问题,他们只能解决其中一个瓶颈。我们希望能够每秒处理超过10000个交易,而且不必强迫每个节点成为超级计算机也不强迫每个节点存储一兆字节的状态数据,而这需要一个全面的解决方案即状态存储工作量,交易处理甚至交易下载和广播都跨节点分散。
特别要注意的是,这要求在P2P级别做出变更,因为广播模型是不可扩展的,因为它要求每个节点下载和重复广播O(n) 的数据(每个被发送的交易),而我们去中心化的标准假设是每个节点只能访问各种O(c)资源。
有哪些不试图“分片”任何东西的方法?
Bitcoin-NG 可以通过另外一种区块链设计来增加扩展性,即如果节点花费大量CPU时间验证区块来使得网络更安全。在简单的PoW区块链中,存在较高的中心化风险,并且如果阀值增长到节点的CPU时间超过5%用于验证块则共识安全就会被削弱;Bitcoin-NG的设计缓解了这个问题。然而,这仅仅使得交易扩展性提升了大约常量因子5-50x 3,4 ,但并没有提升状态扩展性。也就是说,Bitcoin-NG式的方法与分片并不互相排斥,两者当然可以同时实施。
基于通道的策略(闪电网络,雷电网络等)可以通过常量因子扩展交易容量,但不能扩展状态存储,并且还会带来他们自己独特的折衷和限制,特别是涉及到拒绝服务攻击;通过分片实现链上扩展(加上其他的技术)和通过通道实现链下扩展可以说是必要和互补的。
还有其他一些使用高级密码学的方法。如Mimblewimble 和基于ZK-SNARKs的策略来解决扩展性问题的特定部分。初始化全节点同步,而不是从创世块验证整个历史,节点可以验证一个密码学证明当前状态合法地遵循历史记录。这些方法确实解决了合法性问题,但是值得注意的是,可以依靠加密经济学用更简单的方式而不是纯粹密码学来解决同样的问题-参见以太坊当前快速同步和神同步的实现。这两种方法都没有缓解状态大小的增长或者在线交易处理的限制。
状态大小,历史,加密经济学,哦,我的天!在我们继续之前,先定义一些这样的术语!
状态:代表系统”当前状态“的一个信息集合;确定交易是否有效,以及交易的结果,在最简单的模型中应该仅仅依赖状态。例如比特币中UTXO的状态数据,以太坊中的balances+nonces+code+storage,Namecoin中的域名注册项。
历史
目前,在所有的区块链协议中每个节点存储所有的状态(账户余额,合约代码和存储等等)并且处理所有的交易。这提供了大量的安全性,但极大的限制了可扩展性:区块链不能处理比一个单节点更多的交易。很大程度上因为这个原因,比特币被限制在每秒3-7笔交易,以太坊每秒7-15笔交易,等等。然后,这提出了一个问题:是否有方法创建一个新的机制,只让一个小集合的节点来验证每笔交易?只要有足够多的节点验证每笔交易那么系统依然是高度安全的,但又足够少使得系统系统可以并行处理很多的交易,我们是否可以使用这种技术来大大增加区块链的吞吐量?
有哪些简单但有缺陷的方式来解决这个问题?
”简单的解决方案“主要由三大类。第一个是直接放弃独立区块链缩放性,而是假设用户将使用许多不同的”altcoins"。这种方法极大提升了吞吐量,但是是以安全性为代价:使用这种方案在在吞吐量上N-factor的增加必然伴随在安全性上N-factor的下降。因此,对于大于N小值可以被论证是不可行的。
第二个是简单增加区块大小限制。这种方式可以起作用,而且在某些情况下可能是正确的处理方法,因为区块链大小可能更多受到政治上的约束而不是现实的技术考量。但不管个人对于个别案例的信念如何,这个方案不可避免有它的局限性:如果区块链运行的足够长,那么运行在消费者硬件上的节点就会退出,网络将开始只能依赖于少数运行区块链的超级计算机,这可能导致极大的中心化风险。
第三个是“合并挖矿”,这是一种多区块链共存的技术,但所有的区块链共享同一的挖矿激励(或者权益证明系统中的赌注)。目前,Namecoin通过这样的技术从比特币区块链中获取了很大一部分的安全性。如果所有的矿工参与进来,理论上可以将吞吐量提升N倍而不会影响安全性。然而,这也存在这样的问题:它将每个矿工的计算和存储负载增加了N倍。所以,实际上这个方法仅仅是一个隐藏的区块大小限制提升方式。
即使这被认为可以接受的,依然存在这样的缺陷:这些区块链不是真正被“捆绑在一起"的;只需要少量的经济激励就能说服矿工放弃或妥协某个特定的区块链。这种可能性是非常真实的,并且有合并挖矿被攻击的[真实历史事件](actual historical incidents),以及明确提倡使用合并挖矿攻击作为一种“治理特性”的开发者,对于给定的联盟,破坏区块链并不是有利可图的。
如果每条链只有少数矿工参与合并挖矿,则集中化风险得到缓解,但合并挖矿的安全效益也大大降低。
这听起来像是有某种扩展性三难困境在起作用。这三难困境是什么呢,我们能突破它吗?
这三难困境表明区块链系统最多只能拥有以下三个属性中的两个:
去中心化(定义为系统可以在每个参与者只能访问O(c)资源的场景下运行,即普通笔记本电脑或小型VPS)
扩展性(定义为可以处理O(n) > O(c)交易)
安全性(定义为最多使用O(n)资源就可以抵御安全攻击)
在这个文档的其余部分,我们继续使用c来指代每个节点的可用计算资源大小(包括计算,带宽和存储),以及用n指代抽象意义上生态系统的大小;我们假设交易负载,状态大小和加密货币市值都与n成正比。
有人认为,由于梅特卡夫定律,一个加密货币的市值应该与n ^ 2成正比,而不是n。 他们是正确的吗?
不。
为什么不?
梅特卡夫法则认为,网络的价值与用户数量的平方成正比(n ^ 2),因为如果网络有n个用户,那么网络对每个用户都有价值,但是每个用户的价值是与用户数量成正比,因为如果一个网络有n个用户通过网络有n-1个潜在的连接,每个用户都可以从中受益。
在实践中,实证研究表明,拥有n个用户的网络的价值”对于小的n值是与n ^ 2成比例且对于大的n值是与n×log n成比例“。这很容易理解,因为对于小的n值,这个论点是成立的,但是一旦这个系统变得很大,两个影响就会减缓增长。首先,实践中的增长通常发生在社区中,因此在中等规模的网络中,网络通常已经提供了每个用户关心的大部分连接。其次,连接往往是可以互相替代的。你可以争论说人们从k个连接中只能获得~O(log(k))的价值-有23个品牌的除臭剂可以选择是好的,但并不不是说比有22个选择好多了,而一个选择和零个选择是非常重要的差异。
另外,即使加密货币的价值与k个用户的O(k * log(k))成正比,如果我们接受上述解释作为这种情况的原因,那这也意味着交易量也是O(k * log(k)),因为每个用户的log(k)价值理论上来自于用户通过网络执行log(k)的连接,并且状态大小在许多情况下也应该随着O(k * log(k)) 一起增长,因为至少有某种类型的状态是特定关心而不是用户特定的。因此,假设n=O(k * log(k)) ,并且基于n(生态系统大小)和c(单节点的计算能力)是我们使用的完美模型。
有哪些适度简单但只部分解决了可扩展性问题的方法
许多分片建议(比如国大的Loi Luu等人提出的这个早期的BFT分片方案,以及为比特币提议的this Merklix tree方案 1 )都试图只分片交易或者只分片状态,而不考虑其他方面 2 。这些努力是令人钦佩的,可能会带来效率上的提升,但他们遇到根本性的问题,他们只能解决其中一个瓶颈。我们希望能够每秒处理超过10000个交易,而且不必强迫每个节点成为超级计算机也不强迫每个节点存储一兆字节的状态数据,而这需要一个全面的解决方案即状态存储工作量,交易处理甚至交易下载和广播都跨节点分散。
特别要注意的是,这要求在P2P级别做出变更,因为广播模型是不可扩展的,因为它要求每个节点下载和重复广播O(n) 的数据(每个被发送的交易),而我们去中心化的标准假设是每个节点只能访问各种O(c)资源。
有哪些不试图“分片”任何东西的方法?
Bitcoin-NG 可以通过另外一种区块链设计来增加扩展性,即如果节点花费大量CPU时间验证区块来使得网络更安全。在简单的PoW区块链中,存在较高的中心化风险,并且如果阀值增长到节点的CPU时间超过5%用于验证块则共识安全就会被削弱;Bitcoin-NG的设计缓解了这个问题。然而,这仅仅使得交易扩展性提升了大约常量因子5-50x 3,4 ,但并没有提升状态扩展性。也就是说,Bitcoin-NG式的方法与分片并不互相排斥,两者当然可以同时实施。
基于通道的策略(闪电网络,雷电网络等)可以通过常量因子扩展交易容量,但不能扩展状态存储,并且还会带来他们自己独特的折衷和限制,特别是涉及到拒绝服务攻击;通过分片实现链上扩展(加上其他的技术)和通过通道实现链下扩展可以说是必要和互补的。
还有其他一些使用高级密码学的方法。如Mimblewimble 和基于ZK-SNARKs的策略来解决扩展性问题的特定部分。初始化全节点同步,而不是从创世块验证整个历史,节点可以验证一个密码学证明当前状态合法地遵循历史记录。这些方法确实解决了合法性问题,但是值得注意的是,可以依靠加密经济学用更简单的方式而不是纯粹密码学来解决同样的问题-参见以太坊当前快速同步和神同步的实现。这两种方法都没有缓解状态大小的增长或者在线交易处理的限制。
状态大小,历史,加密经济学,哦,我的天!在我们继续之前,先定义一些这样的术语!
状态:代表系统”当前状态“的一个信息集合;确定交易是否有效,以及交易的结果,在最简单的模型中应该仅仅依赖状态。例如比特币中UTXO的状态数据,以太坊中的balances+nonces+code+storage,Namecoin中的域名注册项。
历史