# 联盟链扩展分析

## 1. 背景
存储的瓶颈是当前区块链面临的主要问题之一，随着交易数据的增加，区块高度增长，节点所需同步的数据也不断增长。
Chain33的平行链架构通过扩展侧链处理指定合约的交易来提升主链的性能，然而平行链并非独立的链，需要依赖主链，并不能分担主链区块数据存储。

## 2. 整体思路
区块链扩展在业界有一些解决方案，包括cosmos，波卡，迅雷链，cosmos和波卡更多关注异构链间的价值流转和交换，对联盟链扩展参考意义不是很大。这里主要参考迅雷链的同构跨链扩展，针对chain33的联盟链扩展方案分析。

![xunlei](resource/xunlei.jpg)

中间服务层有一些中心化的操作，这些参考意义不大，主要是基础层的路由模块和跨链模块(订阅通知模块可以待讨论)。
## 3. 方案分析
### 3.1 交易分发
扩展多条平行的chain33公链，这些公链的路由信息保存在路由节点，交易通过路由节点或者带路由功能的共识节点根据源地址(或其他属性)分发到不能的链上打包存储，多链之间没有存储冗余。

![balance](resource/balance.jpg)

### 3.2 网络拓扑

* 方案一 路由节点
路由节点仅负责路由转发功能，路由性能高，但中心化程度高，一旦路由节点宕机，则对应的链就孤立了。另外客户端只能连接到路由节点
![topology1](resource/topology1.jpg)

* 方案二 路由+共识节点
在共识节点上集成路由模块，由单个或多个共识节点开启路由功能，路由性能相比于路由节点可能要低，但是相对去中心化，路由信息可通过智能合约更新
![topology2](resource/topology2.jpg)

### 3.3 跨链
* 智能合约单独部署在一条链上时，当其他链收到该合约的交易需要打包到目的链执行

![cross](resource/cross.jpg)
* 客户端跨链查询

![cross2](resource/cross2.jpg)

跨链需要配合路由模块或路由节点，获取目的链信息

### 3.4 路由信息更新
* 方案一，直接更新路由节点
* 方案二，新链部署时，需要向其他链广播路由更新交易，其他链执行合约更新本地路由表

![cross3](resource/cross3.jpg)

> 新增和删除链对历史交易不做改动，新增链需要将路由信息同步到其他链，删除链或者链出故障如何处理？

### 3.5 合约部署
类似2.4路由信息，部署新合约想其他链广播合约信息，其他链执行合约更新本地路由表


## 4 系统设计
### 4.1 模块
![module](resource/module.jpg)

* 路由模块/路由节点
  * 多链和合约路由信息维护
  * 路由信息更新(路由更新交易的合约执行）
  * 路由节点还需要交易分发
  * 根据from_address路由到具体链
  * 根据合约名路由到具体部署链

* 跨链模块：包括链间通信和跨链确认。该模块将需要跨链的查询请求和区块或者交易同步到对应链。

### 4.2 流程
> 针对方案二的交易路由和合约跨链的流程，方案一只需将mempool换成路由节点

![process](resource/process.jpg)

* mempool通过交易from地址识别时候本链交易，如果是放入本链交易队列，反之放入跨链交易队列,可通过mempool的plugin插件实现，用于将跨链消息单独成队列，跨链模块定时获取
* mempool通过解析执行器，判断是否本链执行器，如果不是需要放入跨链交易队列(mempool是否能解析执行器?）
* 新增跨链模块，或者plugin执行器，实现跨链交易的转发
* 跨链模块从路由模块获取路由信息
* 路由信息存储在本地数据库，由路由模块维护
* 路由信息变更由特定的plugin执行器处理
