diff --git a/rfcs/0006-rollup/006-rollup.md b/rfcs/0006-rollup/006-rollup.md index 9d4c15b..329cbd3 100644 --- a/rfcs/0006-rollup/006-rollup.md +++ b/rfcs/0006-rollup/006-rollup.md @@ -64,24 +64,30 @@ 3. 交易执行。解决计算结果正确性问题。 ### 技术方案 +![](images/impl.png) +~~1. 聚合器如何解决审查攻击问题?~~ -1. 聚合器如何解决审查攻击问题? +~~采用开源聚合器的方式来解决审查攻击问题。~~ - 采用开源聚合器的方式来解决审查攻击问题。 +~~用户如果认为自己受到了审查攻击,可以自建聚合器。~~ +1. 节点分类 - 用户如果认为自己受到了审查攻击,可以自建聚合器。 +* Master节点:收集用户提交的交易,本地执行,排序,提交至`Layer 1` +* Validator节点:拉取`Layer 1`的交易,按顺序重放验证 + +用户如果认为自己受到了审查攻击,可以自建聚合器。 2. 交易顺序如何决定?交易如何保存? - * 对于红色和蓝色路线,交易通过`Layer 1`链来对交易进行排序,并保存在链的数据库中。 + * 对于接收到来自于客户端的交易,会按照收到交易的时间戳+序号进行排序进行排序 - * 对于黑色路线,聚合器直接对交易进行排序,保存在聚合器本地的数据库中。 + * 收集到的交易会按照顺序将一批交易的原文打包成一个`packagedTx`,本地EVM按顺序执行`packagedTx`里面的所有交易,并将`packagedTx`原文存到`DAS(data availability server)`中,存储凭证存到区块链 3. 计算结果正确性如何保障? * 对于红色路线,跟现有区块链系统保持一致。执行器执行完一个区块内的交易后,需要对当前状态计算一个密码学证据,即以太坊中的`state root`。这个证据会经过共识流程,确保所有节点的计算结果一致。 - * 对于蓝色路线,`Layer 1`链的执行器退化为一个特殊的原生合约,提供对`Layer 2`的身份管理和计算结果管理功能。`Layer 2`执行完一个区块内的交易后,同样需要对当前状态计算一个密码学证据。然后以发交易的方式,将这个密码学证据提交到`Layer 1`链的特殊原生合约中。对于`Layer 1`来说跟红色路线一样,执行器依然要提供当前状态的密码学证据,并需要经过共识。这样可以保证`Layer 2`的计算结果是被`Layer 1`记录,并且是不可篡改的。辅助以链外的奖惩措施,或者启用多个`Layer 2`来确保其计算结果的正确性。 + * 对于蓝色路线,Master节点只会将`packagedTx`的存储凭证保存至`Layer 1`链,并提供对`Layer 2`的身份管理和计算结果管理功能。`Layer 2`执行完一个`packagedTx`内的交易后,需要将`packagedTx`原文保存到`DAS(data availability server)`中。然后由Validator节点从`Layer 1`链拉取交易并按顺序本地执行进行正确性验证。 * 对于黑色路线,计算结果的正确性完全由中心化系统来保证。 @@ -92,6 +98,7 @@ * 使用`JSON`格式来描述交易结构。 * 提供密钥托管功能,为最终用户提供用户名/密码校验方式。 + ##### 发送交易 对于红色和蓝色路线,后端仍然要对接`Layer 1`链,最终还是要把交易转换为`Layer 1`链的交易格式,并提供相应的交易签名。 @@ -108,16 +115,30 @@ *聚合器架构图* -#### Layer 2管理合约 +#### ~~Layer 2管理合约~~ -分为两部分功能: +~~分为两部分功能:~~ -1. 对`Layer 2`信息的管理。针对同一条链`Layer 2`可以有多个,每个都有自己的账户。这部分信息只有管理员可以修改。 -2. 对`Layer 2`执行结果的管理。同时记录不同`Layer 2`在不同高度的执行结果。只有注册过的`Layer 2`账户地址才可以提交执行结果。 +1. ~~对`Layer 2`信息的管理。针对同一条链`Layer 2`可以有多个,每个都有自己的账户。这部分信息只有管理员可以修改。~~ +2. ~~对`Layer 2`执行结果的管理。同时记录不同`Layer 2`在不同高度的执行结果。只有注册过的`Layer 2`账户地址才可以提交执行结果。~~ 数据结构 +```asm +// PackagedTx +#[derive(Default, Debug, Deserialize, Serialize, Clone)] +pub struct Package { + //local executor block height + #[tag = 0] + pub batch_number: u64, + //Block encode + #[tag = 1] + pub block: Vec, +} +transaction.data = serialize(package); +``` ```rust + // L2账户信息 struct L2AccountInfo { // L2账户地址 diff --git a/rfcs/0006-rollup/images/impl.png b/rfcs/0006-rollup/images/impl.png new file mode 100644 index 0000000..688be47 Binary files /dev/null and b/rfcs/0006-rollup/images/impl.png differ