简单总结版

SKALE网络的主要目的是创建一个去中心化、无需许可的云服务,它兼容以太坊并将其作为安全基石。当SKALE产品网络上线后,您在AWS上可以做的任何事情,都可以通过“以太坊+SKALE”,用一个更廉价、更可靠、更去中心化的方式来实现。

以太坊主网在加密领域的地位极其重要,因此我们对优化它的性能非常感兴趣,实现更快的确定性,提供更好的用户体验,并提供选项来维护一层网络(Layer 1)的安全性。我们认为有效扩展以太坊的长期答案不在于完全依赖主网的验证节点集,然而,SKALE的使命之一是为合适用例整合可靠的“全节点”主网扩容机制。

在11个月之前,我们发明了BLS-ROLLUP,一种有效而安全的扩容方法,它通过SKALE网络加速交易和以太坊主网的智能合约,同时还保留一层网络的安全保证。

今天,我们宣布将在SKALE产品网络中引入BLS-ROLLUP技术。每个SKALE验证者都参与到BLS-ROLLUP并从中获取一定费用。这是我们忠实验证者的一个绝佳赚钱机会!

SKALE的BLS-ROLLUP:

  • 即时安全,便宜
  • 无需任何等待时间
  • 无需计算繁琐的zkSNARKS/STARKS

简单而实用。

Rollup无法解决延迟问题(会在后续文章进行详细分析),因此它不是解决可扩展性问题的灵丹妙药,但是它们可以大幅提高吞吐量和降低成本。

在设计BLS-ROLLUP的时候,我们的指导原则是“开发一些人们需要的产品”,正如Y Combinator的Paul Graham所说的那样。一味追求高速的TPS是不够的,开发一些实用产品同样重要。

BLS-ROLLUP包含两个阶段:

  • 第一阶段,我们利用SKALE网络加速以太坊主网,该阶段让我们的ERC-20代币转换速度实现了约每秒50笔交易。
  • 第二阶段,我们利用SKALE网络进一步优化主网,该阶段后我们的TPS大约为350。
  • 第三阶段是个长期目标,软件开发的工作量非常繁重,实现后TPS将会超过1,000,与将要上线的ETH 2.0网络的整体速度相当甚至比它还快。

说人话,这意味着什么?这意味着我们能够在未来几年内支持全球范围所有的“大规模”用户交易,而额度更小、更频繁、具有最终确定性的重要微交易可以在侧链上进行。

SKALE解决方案的独特优点是所有的帐户余额都存储在链上,所有计算都在链上执行。它尽可能与一层网络保持一致。

是不是很激动?请继续往下看!期间遇到任何问题您都可以随时发推请教@stan_kladko。

1 | BLS Rollup鸟瞰图

BLS Rollup的核心思想是压缩交易。如果能让每笔交易的体积更小,区块链的速度就能更快。原因如下:

您可以设想以下场景:有一艘轮船在Tiburon和旧金山之间往返。假设该轮船能装载100辆车,那么吞吐量就是每小时100辆。

现在假设我们把车做得更小,轮船能装1,000辆。那么此时的吞吐量变成每小时1,000辆车,是上述情形的十倍。

上面的例子说明的是:汽车体积越小,吞吐量就越高。

在以太坊中,每个区块就是轮船,其中的交易相当于汽车。也就是将交易压缩10倍,吞吐量就能提高10倍。

于是现在问题就变成了:怎样压缩交易体积呢?请看下文!

2 | 压缩一笔ETH交易

一笔常规ETH转账交易的体积是多少?答案是100+字节。其中交易中的ECDSA签名占了很大一部分体积(约64字节),另外一部分则是接收钱包的地址(20字节)。

缩小交易的第一步是为每个用户创建一个4字节大小的UserID(而不采用20字节的ETH地址)。当某个用户注册BLS-ROLLUP时,他将被分配一个UserID

第二步是完全删除ECDSA签名。怎么做到呢?我们采用了一种称为聚合BLS签名的加密算法。如果多方都对某个文件进行签名,其实这些签名可以神奇地聚集到一起,形成一个聚合BLS签名。而这个BLS签名的体积比原来的小得多。

这个把签名聚集到一起,形成一个BLS签名的组织被称为聚合器

你可以这样理解:假如人们从旧金山寄信到纽约,但是信件里面的内容内容很少,而信封体积很大。这样的效率非常低!而聚合者充当了这样的角色,他们收到了多封信件后,将信件取出来,然后把它们汇总到一个信封(再寄出去)。这种方式效率更高!

在区块链中,一封信就是一笔交易,其中信封相当于签名。我们将这种聚合技术称为BLS-ROLLUP的第一阶段。

想深入了解更多细节,请继续阅读下一节。

3 | BLS-ROLLUP第一阶段:聚合协议

首先,我们需要选择一个聚合器。

我们不允许某个节点一直担任聚合器,因为这样它可能演变成一个独裁者,对交易进行审查。

我们采取的做法是划分10分钟的周期(epoch),然后在每个周期中都随机选出一个聚合器。注意:该协议还有一个更高阶的版本,即在每个周期选出好几个聚合器,但我们先从简单做起。

想象有一群人(SKALE网络)。我们随机选出一个人(例如小红),她在上午10:00到10:10这段时间担任一个聚合器。这段时间结束后,我们就要换一个人。

那么,六个步骤的聚合协议(SSAP)流程如下:

  1. 用户向聚合器小红提交交易。
  2. 小红将来自大量用户组G的交易聚集成交易块C。
  3. 小红将C发回给原始组G中的每个用户。
  4. 用户组中的用户(例如小明)收到交易块C后,对它进行签名,然后将签名S发送回来。
  5. 当小红收到每个用户发回的签名后,她将它们聚集到BLS签名BLS_SIG中。于是,交易块C和BLS_SIG就成了“一个信封装了很多信件”。节省了大量空间!
  6. 最后,小王将C和BLS_SIG提交到主网。

聚合协议的速度有多快?我们假设用户使用的是浏览器或移动app,聚合器使用web服务器。由于web服务器与用户的交互是并行的,考虑到目前常规的互联网速度,整个聚合过程耗时仅为几百毫秒

现在有个问题:如果小明发动恶意攻击,在步骤4中没有将签名S返回来,那怎么办?事实上有两个非常有效的应对方法:

  • 首先,聚合器可以在交易块中剔除小明的交易并重新启动聚合过程。接着聚合器在区块链上对小明打了一个差评。而一旦小明的评分低于限定值,他就会被移出系统。可以类比Uber来理解:如果一直在叫车但总是不用车,那么你的乘客评分就会下降,直到某个阈值你就不能再使用Uber了。
  • 其次,如果除了小明以外,每个人都签名了,聚合器可以将交易块C提交到主网,并将小明标记为未签名人。交易块中小明的交易就会被区块链忽略。

我们来总结一下实际提交到区块链中的内容:

  • 第一部分包含许许多多的交易,大约每笔12字节(发送源4字节,接收方4字节,交易金额4字节)。
  • 第二部分是一个保护所有这些交易的签名BLS_SIG

瞧瞧,节约了多少空间!

一旦交易块C和BLS_SIG被提交到主网后,后续处理就非常简单了!继续往下读,看看接下来会发生什么。

4 | BLS-ROLLUP阶段1:主网处理

主网接收到交易块C和BLS_SIG后,将会有一个智能合约处理这些交易。我们将该智能合约称为BLS-ROLLUP管理员或BRM。

以下是BRM的工作职责:

  1. 验证BLS_SIG是否有效。
  2. 对于交易块中的每笔交易,
  • 读取交易Amount中的数值
  • 将发送方的余额减少Amount数值
  • 将接收方的余额增加Amount数值

就这么简单!

那么BRM处理需要消耗多少gas呢?根据附录A进行粗略计算,一笔ERC-20代币交易大约需要13,000 gas,一笔NFT代币交易大约需要7,000 gas。相比之下,目前的ERC-20代币交易价格约为52,000 gas。

以太坊每个区块的gas limit 为10,000,000,而平均区块时间为15秒,我们的ERC-20、NFT代币转换速度分别达到50 tps90 tps

我们预计,BLS-ROLLUP阶段1将于2020年上半年投入使用。

而BLS-ROLLUP阶段2大约在2020年夏天准备就绪,并加速推进一些别的阶段。下一节有详细介绍。

5 | BLS-ROLLUP阶段2:使用更便宜的存储

如果想让速度更快,那么我们要降低每笔交易的gas费用。请记住我们在BLS-ROLLUP阶段1中将一笔ERC-20代币兑换的gas费用从5.2万降低到了1.3万。

其中有一点很关键,1.3万gas中有1万用于更新EVM存储中发送方和接收方的余额。而每次EVM存储值的更新需要5,000 gas。

那么以太坊主网上有更便宜的存储吗?答案是肯定的,它就是日志存储(Log Storage)。日志存储的每个存储事件只需要消耗375 gas,加上每个字节的8 gas

既然如此,为什么我们不抛弃EVM存储,而使用日志存储呢?因为无法从EVM读取日志存储。用户可以将日志存储写入EVM中,但只能从EVM外部读取它。

因此我们想到:当EVM需要读取存储数据时,SKALE网络先把它读出来,然后推给EVM。你看!现在我们就可以利用日志存储啦。

下文两部分解释了具体的实现细节。

6 | BLS-ROLLUP阶段2:存储格式

在BLS-ROLLUP阶段2中,存储在日志存储中的资产采用类似于比特币的UTXO记账方式(请注意,Plasma采用的也是UTXO)。每个用户地址都有一些未花费的代币,总余额则是这些未花费代币的总和。

每笔交易都要使用发送方的多个输入代币,然后产生两个输出代币——一笔表示资金发送给接收方,另一笔表示发送方剩余的资金。

举个例子,如果Alice要转4个代币给Bob,那么她可能会动用到三个钱包的代币,数量分别是:1代币,1代币和3代币;然后产生两个代币:其中3个代币转给Bob,然后剩余的1代币剩给自己。

这笔交易对应的实际日志格式如下:

{transactionCounter, input_coins, output_coins; topic(sender:Alice), topic(receiver:Bob) )

其中,transactionCounter是交易序列号,input_coins表示输入代币的数量及其在区块链上相应日志记录的位置,output_coins表示输出代币的数量及其所有者。

主题(topic)在EVM中有着特殊的用途,展开来说,EVM提供了一种按主题搜索日志记录的简便方法。我们增加了两个发送方和接收方主题,这样用户可以轻易地找到她所有的代币。

上述单个交易对应的日志记录的gas成本约为1,300。它比阶段1还要低,阶段1更新发送方和接收方的余额需要消耗将近12,000 gas

因此我们大大降低了存储成本。现在我们需要让EVM在交易发生时读取记录。SKALE网络在主网中的功能请阅读下一节。

7 | BLS-ROLLUP阶段2:SKALE网络如何助力以太坊主网络

本阶段的核心想法是,SKALE网络的节点可以在读取日志中发挥作用,将日志读取出来并将推送到主网。为了保证一层网络的安全性,至少需要111个随机的SKALE网络节点,然后使用BLS三分之二大多数聚合签名对它进行签名。为什么是111个节点?因为在以太坊2.0中,111个节点是一个一层网络安全性的阈值。我们不会永远固定这个节点集,反而缓慢而随机地轮换其中的成员,最终让SKALE网络的每个节点都有机会参与其中。

然后我们采用第3节中描述的SSAP聚合协议,并且在聚合协议的第1步和第2步之间(聚合器发挥作用的地方),引入了一个额外的第11/2步

第11/2步:当接收到一笔打包中的交易,例如Alice花费一些代币(UTXO)转移给Bob,聚合器会将这笔交易发送给111个验证节点。

验证节点的职责非常简单:验证交易是否正确,发送的是有效代币而不是一笔双花代币。

每个验证节点的详细功能包括:

  • 验证交易中包含的UTXO存在于区块链上,金额正确,并且符合未花费的常规比特币格式(意味着未来的交易中不会讲这些UTXO作为输入)
  • 验证没有其他打包的交易在尝试利用这些UTXO(当验证节点接收到一笔交易时,就将其视为打包中)
  • 使用聚合的BLS验证节点签名对交易签名,并将其返回给聚合器
  • 接着,聚合器将把验证节点BLS签名包含在内,在第2步中将交易提交到区块链。

BRM智能合约接收该笔交易后,它将验证来自验证节点的BLS签名,然后处理交易,创建一个如第6节所述的UTXO日志记录。

现在我们每笔交易的预估总成本为1,600 gas:上文讨论的日志记录创建成本1,300 gas,每笔交易的BLS公钥聚合190 gas,其他操作100 gas。

8 | BLS-ROLLUP阶段2:性能

我们粗略地计算了BLS-ROLLUP阶段每笔交易的总成本,ERC-20代币转账大约为每笔交易2,200 gas。相比之下,目前ERC-20代币转账费用为51,000 gas。这相当于每秒处理300多笔交易,同时以正常成本的5%维护一层网络相当的安全性。

但性能不是唯一重要的指标。BLS-ROLLUP将所有的信息和计算都保留在主网,并且只在需要的时候才利用SKALE网络。这意味着它与当前的基础设施相互配套,只需对现有的网页和移动端进行最小限度的调整。

9 | BLS-ROLLUP阶段3:极限速度

每秒300多笔交易,BLS-ROLLUP的阶段2速度已经非常快,足以支持生态系统多年的增长。请注意,目前以太坊主网每秒转移的代币少于10个,并且BLS-ROLLUP和主网类似,存在着一定的延迟。

但还存在着一种改进BLS-ROLLUP的方法,来进一步提升速度(尽管我们不打算在未来几年着手这项工作)。

该方案的关键是尽可能让交易的体积更小,在单条日志记录中记录多个UTXO。这个方法节省了创建一个记录需要花费1,125 gas的固定成本,但是其后果是UTXO记录不支持基于EVM主题的标准搜索工具。用户不能直接获取他们钱包的余额。我们通过分别向每个SKALE节点加入外部搜索和索引引擎来解决这个问题。

这时候Alice需要搜索主网才能查询到她的代币余额。为此,用户需要与SKALE节点或其他服务商(如Infura)通信,或者自己运行一个索引引擎。

阶段3的粗略估算费用为每笔交易700 gas,相当于每秒900多笔交易。

10 | 罚没

上文所述的系统能够轻易提供作恶节点破坏和罚没的证据。欺诈证明会被提交到主网,恶意验证节点也会受到削减。鉴于本文篇幅过长,在此就不作过多展开,读者可自行思考罚没触发的条件,其实答案非常明显了。

11 | 总结思考

BLS-ROLLUP提供了一种大规模扩展主网交易速度的方法,同时提供一层网络的安全保证,用户资产都存储在主网上。SKALE网络扮演了助力主网的一层网络助推者的角色。

BLS-ROLLUP是唯一一个无需任何用户监视、等待时间或争议的rollup解决方案。使得它成为一个更好、更用户友好的解决方案。

BLS-ROLLUP非常适用于转账和大额支付。由于它是基于以太坊主网,因此继承了主网的缓慢确定性。用户要5分多钟才能在主网成功确认一笔交易。因此,如果你要买一辆车,这个时间是可以接受的;但如果你要买一杯咖啡,这个时间就太长了。在买一杯咖啡的情况下,你应该使用一条侧链。

*附录A

阶段1每笔ERC-20代币转账交易的gas预估gas成本(伊斯坦布尔和柏林分叉后):

  • 读取发送方余额:800 gas
  • 读出接收方平衡:800 gas
  • 更新发送方余额:5000 gas
  • 更新接收方余额:5000 gas
  • 读取发送方BLS公钥:800 gas
  • 添加发送方BLS公钥,得到聚合密钥:190 gas
  • 总计:约13,000 gas

阶段1每笔ERC-721 NFT代币转账交易的gas预估gas成本(伊斯坦布尔和柏林分叉后):

  • 读取当前所有者地址:800 gas
  • 更新当前所有者:5000 gas
  • 读取当前所有者公钥:800 gas
  • 添加当前所有者BLS公钥,得到聚合密钥:190 gas
  • 总计:约7,000 gas

*附录B

阶段1每笔ERC-20或ERC-721 NFT代币转账交易的gas预估gas成本(伊斯坦布尔和柏林分叉后):

  • UTXO日志记录:1,300 gas (事件日志375 gas + 两个主题 2 * 375 gas + 数据)
  • BLS公钥聚合:190 gas,其中椭圆曲线相加40 gas + 预编译调用40 gas
  • 调用数据:调用最高18字节的数据最多需要300 gas
  • 计算:低于50气体

总计:约2,200 gas

*附录C

  • 一笔常规交易的最小体积大约为20字节,它包含两个输入UTXO的序列号、接收方的索引和创建两个代币的金额。其中,调用数据每字节需要16 gas,因此整个调用数据事件需要320 gas
  • BLS公钥聚合需要190 gas
  • 日志记录的体积大约为20字节,它包含两个输入UTXO的序列号、接收方的索引、发送方的索引和双方处理的金额。它需要160 gas(每字节8 gas)
  • 计算:低于50 gas

总计:约700 gas