深度解析以太坊分片
整体来讲,如何提高一个单链区块链的tps性能就是并行化和适当中心化。并行化得一个思路就是分片sharding,个人理解分片包括账户数据的分片和共识节点的分片两个部分。一个最简单的分片设计思路:
- 基本的思路是根据以太坊的账户地址,切分成k个分片shards(比如一致性hash等等分布式方法)。对于某个持有分片s1的节点我们称为collators,collators负责产生分片区块称colations,那么新的区块就需要包含每一个分片区块的head,为验证一个区块有效,
区块需要满足:
a. 每个分片区块的pre-state root必须和对应分片区块的当前state root匹配
b. 每个分片的区块是合法的
c. 每个分片区块在执行某个交易之后的state root和当前的state root匹配
d. 每个分片的区块collations需要有2/3以上的collators签名 - 按照这个设计思路,以太坊区块的几点就分为几大类:
a.超级全节点:处理所有分片的交易,同时保存所有分片的状态
b.顶层节点:处理所有顶层的交易,不处理某个分片或者存储某个分片的交易
c. 分片节点:除了有顶层节点的功能,还处理和保存某个具体分片的交易
d. 轻节点:只下载和验证顶层区块交易,如果需要验证某个具体分片的交易,就向对应的节点获取对应的默克尔证明分支
- 以太坊分片设计挑战
a.分片之间的通信:上面这个设计如何实现多个分片之间的可靠通信
b. 单个分片的抗攻击:怎么防止攻击者控制大多数collators来实现攻击----->随机挑选collators
c. 如果分片里面有无效区collations产生,那么对于某些节点比如轻量级节点如何发现
d. 数据可用性:如果collations里面的数据丢失,如何解决
e. 如果数据账户指数增加到大于整个节点的算力平方,那么一个全节点无法处理和容纳下所有分片的交易 - 分片通信设计思路:采用现在互联网的异步通信机制来实现事务一致。类比微信的转账功能:微信为了服务海量(十亿级别)用户,对用户的数据采用了分库分表。假如用户A需要转100到用户B,但是A和B不在一个数据库,没法使用数据库的事务特性来保证转账功能的ACID;解决办法就是首先在A所在的数据库执行减100操作,然后把这个操作通过高可靠的分布式消息处理服务(MQ)存储下来作为收据证明,然后再对B所在的数据库执行加100操作,同时也消耗掉A所产生的收据证明消息,本地也产生一个加100的收据证明消息返回给A所在的系统。
总体结论:区块链平台本身是一个互联网系统架构和经济学结合的产物,从工程上来说提高性能和速度的方法最终和传统的互联网方式的解决思路都是互通的,如果研发改进一个区块链平台,根据需求和对应的场景一步一步设计,根据遇到的问题结合现有互联网系统解决办法以及现阶段区块链提出的一些解决问题的方法,自然能设计成一个健壮高效的平台。