区块链分片设想
一、基本概念
不对称密钥:公钥加密,私钥解密;私钥签名,公钥验证
地址:具有相同的长度,由公钥映射而成
账户:地址作为唯一标识,由私钥控制,有自己的状态,比如余额等
区块链:维护许多账户状态,保证账户状态的完整和正确
状态分片:把所有的账户按照某种规则进行分割,切成一个个小小的分片,一个分片只包含一部分账户状态
二、基础方案
- 分片规则:按地址段分割(比如所有地址以 0xff 开头的为一个分片,以 0xfe 开头的为另一个分片)
- 分片内交易处理:维护这个分片的节点间达成共识即可
- 跨分片合约交易处理:不直接支持,采用账户转移的方案,即把一个账户状态从一个分片移动到另一个分片
三、分片组织
- 一个分片如果发生了账户转移,账户就会变化,所以不止维护分片内账户的状态,还需要维护一个账户索引
- 可以以变量的方式维护分片索引,记录离开和进来的分片账户
- 一个完整的分片状态,由账户索引及其账户状态组合而成
四、账户转移
- 每一个账户都有默认的账户转移函数,如果是合约账户可以重写
- 账户转移函数如果调用成功会生成一笔账户转移交易
- 目标分片打包执行账户转移交易来完成账户转移
五、账户转移交互流程
- 由其他账户、自己账户或者合约调用自己的转移函数,生成一笔交易
- 所在分片将这一笔交易打包到区块中,共识成功生成账户转移交易(要包含账户的状态)
- 目标分片收到这个账户转移交易,并打包到区块中
- 目标分片成功共识这个区块,账户转移成功
- 需要一些手段来确保转移交易是可信的
六、账户转移可信化
保证账户不同时出现在多个分片及其状态的正确性
- 不能凭空生成转移交易
- 不能篡改转移账户的状态
方法 1:全局维护账户所在的分片和状态哈希
方法 2:将节点变成可信节点(至少挖矿节点)
方法 3:同步验证,同步指定的分片,其分片数据就可信了(即转移交易就可信)
七、跨分片的快速转账
- 简单描述:分片 1 的 A 账户转账到分片 2 的 B 账户
- 基本原理:使用 CD 账户(属于同一个人)作为中转账户,分片 1 的 A 账户转账到 C 账户,分片 2 的 D 账户转账到 B 账户
- 若两个分片不能相互验证交易的正确性,则需要保证两个中转账户是可信的
八、跨分片合约交易处理的弊端
交易首先需要一个全状态的节点预处理交易分析涉及到的账户,再去不同的分片把这些账户锁定,最后再获取、修改写入其他分片的账户状态,存在以下问题:
- 验证这些操作的正确性很难(去其他分片节点操作,一个节点的结果不太可靠,而多个节点又费时费力,多个分片就更难了)
- 要所有的操作都成功交易才能算是执行完成,如果设置超时时间长就需要回撤,如果没有设置超时锁定的账户就一直无法解锁
- 长时间锁定其他分片的账户,这是不应该的会导致锁定的账户一直不可用
- 如果跨分片的交易涉及到多个分片及其多个账户,这个交易要成功就需要很多操作,可能花费很长时间甚至失败
- 对于区块链上的账户状态,每一步的操作都需要记录下来写到区块中,方便回溯和验证,复杂跨分片的交易操作记录可能远远大于交易本身了
- 跨分片的交易如果很多,分片间的交互就很多,这样还不如不分片快
九、采取账户转移的方案间接支持跨分片合约交易的优点
- 分片间的账户交互就只有转移操作,分片交互就变得简单
- 化跨分片交易为分片内交易,交易快速且安全
- 演变以应用为中心的特色分片,相关联的账户会逐渐集合到一个分片中
- 分片的负载均衡,如果一个账户所在的分片交易拥堵,那么它可以选择转移到其他分片
以太坊的 POW 共识分片账户转移
一、基础架构
- 按地址段分割,以 0x00 开头的为一个分片,直到 0xff 开头的分片,一共 256 个分片
- 一个完整的分片状态,由账户索引及其账户状态组合而成
- 账户转移是一个合约调用,每一个账户都有默认的,如果是合约账户可以重写
- 账户转移如果调用成功会生成一个账户转移交易
二、交易
包括片内交易、账户转移交易
- 片内交易即以太坊的普通交易和合约交易(包括账户转移调用)
- 账户转移交易的发起者和接收者是账户所在分片和转移目标分片的分片 id(转为地址)
- 账户转移交易要包括转移账户的状态,可以序列化保存到交易 data 字段
三、账户转移手续费
- 普通账户转移手续费恒定,合约账户转移根据序列化后的数据量大小而定
- 自己转移自己手续费相对便宜,自己转移别人费用较高,普通账户只能自己转移自己
- 所在分片矿工收取一部分手续费,另一部分由目标分片矿工收取
四、分片内共识
对分片内交易打包共识,保证片内账户状态和转移出去的账户可信
- 矿工打包交易组成区块,在分片内达成共识即可,可以使用以太坊自带的 POW 共识
- 可以使用以太坊的 GHOST 协议提高交易处理速度
- 可能会产生账户转移交易
五、分片外共识
对分片外交易打包共识(账户转移交易),保证账户转移交易可信
来自其他分片的账户转移交易,要可信就可以同步并验证来源分片,一个解决方案是以环的方式达成信任和传递数据
打包一个区块的时候验证前一个(多个)分片的数据,并将账户转移交易(包括传递下来的)一起打包到区块中,
下一个分片也这样做,那么账户转移交易就可以如此传递下去,且这些账户转移交易都是可信的。
- 挖矿时必须要验证前面分片的数据,并且处理前一个(多个)分片和打包本分片的账户转移交易
- 打包区块时将转移目标是本分片的账户接收交易处理掉,不是本分片将一直被传递下去直到目标分片
- 理论上来说,对于本分片,只能验证和保证前一个(多个)分片的交易及其产生的账户转移交易可信
六、可能造成扰乱区块链的严重问题:
一个分片 B 以超过一半的算力,持续产生错误区块 Qn(伪造打包自上个区块账户接收交易),传播到下一个分片 C 中
由于下一个分片 C 无法验证来自上上一个分片 A 的区块账户接收交易,即使分片 B 的节点可以验证错误区块 Qn,但是
下一个分片 C 验证不到,只要分片 B 的节点一直以超过一半的算力产生错误区块 Qn,就可以一直欺骗那些没有同步
分片 A 数据的分片 C 中的节点,诱使分片 C 中的一部分节点基于错误的区块 Qn 产生新的区块, 一个缓解的办法多同步一些前面的分片
详细设计
交易定义:复用以太坊的交易数据模型,增加新的交易类型,即片外交易(账户接收交易),
from 和 to 分别是账户转移发起和接收的分片 id,data 是序列化的账户状态,value 是手续费 (目标分片收取),gas、gasprice、nonce 和签名都为空
账户转移:是一个合约调用,每一个地址有一个默认的,合约地址的可以重写这个调用,参数包括目标分片 id,无返回值,
合约调用的 value 是转移手续费,同时这个调用也像正常合约调用一样收取合约执行的手续费,
这个调用成功将会自动产生一笔账户接收交易,可以缓存到虚拟机上下文或者 statedb 里面