OKCoin

比特股2.0:每秒10万次转账的高性能和可扩展性

白眉大侠 发布在 竞争币 8 3191

比特股

为了给业界提供一个有可能代替现有的金融平台的方案,高性能的区块链技术对加密货币和智能合约平台来说是必须的。为了能够实现比VISA和MasterCard加起来每秒可以处理的交易数量更高的级别,比特股从底层开始重新设计。通过股份授权证明机制,比特股网络可以在平均一秒的时间内确认交易,唯一的限制只是光速。

总览

要达到这个产业里面最顶级的性能,比特股借鉴了从LMAX交易所里面学到的经验。这个LMAX交易所可以在每秒内处理高达6百万次的交易。在这个经验里面,关键点是以下这些:

  1. 将一切东西放在内存里面
  2. 将核心的业务逻辑放到一个单线程里面
  3. 将加密算法操作(哈希和签名)放在核心业务逻辑以外
  4. 将校验的操作分成状态独立和状态依赖检查
  5. 使用一种面向对象的数据模型

通过遵守这些简单的规则,比特股在没有进行任何显著性优化工作的情况下就实现了每秒处理10万次转账的性能。如果有进一步的优化工作的话,会让比特股可以达到跟LMAX交易所相近的性能表现(即每秒600万次)。

应该需要注意到,比特股达到的性能表现是高度依赖其中的一个兼容交易协议。如果想用业务逻辑运行在一个进行加密算法操作和用哈希识别器去调用所有对象的虚拟机上的话,是不可能去达到同样层级的性能表现的。区块链天生就是单线程的,而单核的CPU的性能是各种资源中最短缺的、最难扩展的一个方面。比特股设计成能够让这个单线程的执行达到极可能的高效。

背景

区块链是一个下达关于确定去修改一个共享的全局状态交易的全球账本。这些交易中包含的命令可以改变其他交易的有效性。例如,你不能在你的支票存入生效前去从你的银行账户理解支取金钱。在能够影响一个特定的账户的所有先前交易都被处理之前,你不可能知道一个交易是否有效。

如果两个无关联的账号没有共享任何通用的依赖关系的话,理论上这两个账号的交易可以是在同一时间进行处理的。实际上,在一个由具备仲裁条件的智能合约驱动的账本上识别哪些交易是真正独立存在的耗费是很棘手的。唯一的保证两个交易是真正独立存在的方法,是通过维护完全分离的账本,然后定期在它们之间传输价值。如果要用这种性能表现的权衡关系去打比方的话,可以像是非一致内存访问架构(Non-Uniform Memory Access ,NUMA)和一致内存访问架构(Uniform Memory Access ,UMA)之间的关系。

实际上,一致内存访问架构对开发者来说是更容易去设计的,而且耗费更低。非一致内存访问架构通常是在建造超级计算机和大型计算机集群时作为不得已的方法去采用的。

计算机产业逐渐意识到通过平行计算去实现性能的扩张并没有早期那么容易,毕竟那时候最需要做的事情只是提高处理器的频率而已。就是因为这个原因,处理器的设计者们在尝试去采用多线程设去提高性能之前都在拼命去提高单线程的性能。当多线程还不够的话,而且只有这样的话,集群计算这个方案才会被考虑。
很多加密货币产业的人在没有探索过在技术上一台电脑的单个核心能实现什么之前,就尝试通过用集群计算的方案去解决可扩展性的问题。

 LMAX Disruptor分解器技术

LMAX 分解器提供了一个在单线程上可以实现什么表现的学习例子。LMAX是一个针对终端顾客的交易平台,目标是成为世界上最快的交易所。它们一直很慷慨地将他们学到的东西公布出来。
这是它们架构的概要总览:

业务逻辑处理器是所有顺序交易和订单匹配发生的地方。它是一个可以每秒处理百万级别订单的单线程。这个架构可以很容易地用在加密货币和区块链设计的领域。

输入分解器扮演的角色是从很多来自不同源头的用户里面收集订单,然后分配给它们一个确定的顺序。当给它们分配好顺序后,它们会被复制、记录然后广播到很多冗余的业务逻辑处理器。输入分解器是高度并行的,而且容易分包到一个计算机集群系统中。

当业务逻辑处理器处理完输入后,一个输出分解器负责通知那些关心结果的人。这也是一个高度并行的任务。

最终,通过在业务逻辑处理器里使用单线程样品化处理器和Java虚拟机,LMAX可以在每秒内执行600万次交易。如果LMAX可以达到这个成绩,那么加密货币和智能合约平台平不需要在每秒连10个交易都不到的情况下去考虑集群网络方案。

 高性能区块链

要建造一个高性能的区块链,我们需要使用LMAX同样的技术。这是几个必须实现的事项:
将所有东西放在内存上,避免同步原语(锁定,原子操作),避免在业务逻辑处理器上不必要的计算。

由于内存的设计是高度并行的,因此越来越便宜。追踪互联网上每个人的账户余额和权限所需要的数据量是可以放在小于1TB的RAM内存上,这用不到15000美元的价格就能买到了,而且可以装在商品化(高端)的服务器主板上。在这个系统被30亿人采用之前,这类硬件会在普通的桌面计算机里面看到。

真正的瓶颈不是内存容量的需求,而是带宽的需求。在每秒100万次交易和每笔交易占256字节的情况下,网络会需要256MB每秒的数据量,即1Gbit/s的带宽。这样的带宽在普通的桌面计算机上并不是常见的。不过,这样的带宽只是二代互联网100Gbit/s带宽的一点而已。这个二代互联网被供应给超过210个美国教育机构、70家公司和45个非盈利机构和政府机构。

另一句话说,区块链技术可以轻松将所有东西保存在内存里,而且如果设计的合理的话可以扩展到支持每秒百万级别的转账。

分配ID并避免哈希计算

在单线程系统的系统里面,处理器周期是需要被保留的稀缺资源。传统的区块链设计使用加密算法基础上的哈希计算去生成一个全球独特的ID系统,以实现统计学上不会有碰撞的保证。进行这些哈希计算的问题是,它会耗用越来越多的内存和处理器周期。与一个直接的数组索引相比,这种方式会显著地占用更多处理器的时间去查找一个账户的记录。例如,64位的整数对比和操作起来都要比160位以上的ID更简单。更大的哈希ID机制意味着CPU缓存里面的空间更少了,而需要更多的内存。在现代的操作系统里不常访问的随机存储器是会被压缩的,不过哈希识别器是随机数,这是没法压缩的。

幸好区块链给了我们一个在全球内分配独特的ID的方法,这些ID互相之间不会起冲突,因此完全避免使用像比特币地址那样的哈希算法为基础的识别器去引用一个账号、余额或者许可。

从业务逻辑处理器中去除签名校验

所有在加密货币网络的交易依赖于用加密算法签名去校验权限。大部分情况下,请求的权限可以由其他交易的结果改变。这意味着在业务逻辑处理器里面,权限需要被定义成与加密算法计算无关的情况。

要达到这个目的,所有的公钥需要分配一个独特的和不可代替的ID。当ID被分配后,输入分解器可以校验提供的签名与指定的ID是否匹配。当交易到达业务逻辑处理器后,只需要去检查ID就可以了。
这个同样的技术可以在拥有不可代替的静态ID的对象上实现去除前提条件检查。

为静态校验设计交易

对交易来说,有很多特性是可以进行静态检查的,而不需要引用当前的全局状态。这些检查包括参数的范围检查、输入的去冗余和数组排序等。通常来说,有很多检查是可以被进行的,如果交易包含它“假设”是全局状态的数据的话。在这些检查被执行后,业务逻辑处理器必须要做的事情就只有去确保这些假设还是正确的,这个过程总结下来就是检查一个涉及交易签名时间的对象引用的修改时间戳。

 智能合约

很多区块链正在整合一种通用的脚本语言去定义所有的操作。这些设计最终将业务逻辑处理器定义为一个虚拟机,而所有的交易被定义为由这个虚拟机运行的脚本。这个方案有一个在真实处理器上的单线程性能极限,并且由于将所有东西强制通过一个虚拟处理器去执行,让问题更严重了。一个虚拟处理器即使用上了实施编译技术(JIT)也总会比一个真正的处理器要慢,不过计算速度并不是这种“任何东西都是一个脚本”方案的唯一问题。
当交易被定义在这么低的层次上,意味着静态检查和加密算法操作还是会被包含到业务逻辑处理的环节里,这也让会让整体的吞吐量降低。一个脚本引擎永远不应该要求执行一个加密算法签名检查的请求,即使这个请求是通过原生的机制实现的。

根据我们从LMAX上学到的课程,我们知道一个为区块链设计的虚拟机应该考虑到单线程表现。这意味着在一开始就要为实施编译优化,而且最常用的智能合约应该通过区块链原生支持,而只有那些不常用的、定制的合约会运行在一个虚拟机上。这些定制的合约设计的时候要考虑性能,这意味着虚拟机应该将可以访问的内存范围限制到可以放在处理器缓存上的级别。

面向对象的数据模式

在内存中保存所有东西的其中一个好处是,软件可以设计成模仿现实世界中数据的关系。这意味着业务逻辑处理器可以迅速根据内存内的指针去找到数据,而不是被迫去进行耗费高的数据库查询任务。这意味着数据不需要复制就能访问了,而且可以当场就被修改。这个优化提供了比任何数据库为基础的方案高一个数量级的性能表现。

交易大小

一个每秒可以处理10万次交易的区块链在每一秒都会产生大量数据。在一些正在竞争的网络如瑞波和比特币里,平均交易的大小是250字节。而在比特股上,相似的交易仅仅是100个字节。换句话说,其他正在竞争的系统在同样数量的交易情况下需要2.5倍的带宽去处理。假设连接到互联网的带宽是1Gb/s,只需要0.1秒就可以将一个含有10万次交易的区块传播出去。竞争性的网络需要0.25秒。如果考虑到延迟和点对点网络的多次中转过程,很明显交易的大小会影响到区块的间隔,因此影响到确认的延迟。
交易的大小通常是一个CPU必须在关键的通道上处理的数据数量的指标。因此,它可以显示出在在一个单线程里面CPU命中速度有多快。在所有的协议里面一些优化是可行的,如果假设所有的节点都有之前所有广播的交易,而且只需要一个转账ID的排序表去广播所有的区块。这将会是一个具体的实施细节。

结论

设计一个高性能的区块链并不是什么火箭科学,而且既不需要复杂难懂的协议,也不需要在网络上的所有节点里分处理任务。反而,要建造一个高性能的区块链最需要的事情应该是在核心业务逻辑上去除与关键性、订单依赖性和评估无关的计算任务,并且设计一个可以帮助优化这些事项的协议。这就是比特股做了的事情。

 

转自:比特股之家(http://www.bts.hk/bts20-high-performance.html

译者:打超人的小怪兽

责编:薄荷凉幼

评论:8

您需要登录后才可以回复 登录|注册
    二凡十四郎
    二凡十四郎 531 天前

    //@喂宝宝吃饭饭:别去跟那些路人争论,直接控评//@喜欢粉色的张大饼:能在这个时候不走寻常路,足以说明吴亦凡对时尚的态度,再加上配合致敬mj的主题,哥哥简直了#吴亦凡巴黎时装周#

    +1
    +1
    我要点评
    星际堡垒
    星际堡垒 531 天前

    //@ebit堡主: #区块链#技术:#比特股#2.0:每秒10万次转账的高性能和可扩展性 http://t.cn/R2j4K0i

    +1
    +1
    我要点评
    ebit堡主
    ebit堡主 531 天前

    #区块链#技术:#比特股#2.0:每秒10万次转账的高性能和可扩展性 http://t.cn/R2j4K0i

    +1
    +1
    我要点评
    PTS中国
    PTS中国 537 天前

    精彩啊 大数据时代 此类技术需求只多不少//@ebit堡主:将一切东西放在内存里面#比特股##bitshares#http://t.cn/R2j4K0i

    +1
    +1
    我要点评
    ebit堡主
    ebit堡主 537 天前

    将一切东西放在内存里面#比特股##bitshares#http://t.cn/R2j4K0i

    +1
    +1
    我要点评
    Author Image
    supbtc 543 天前

    文章中所列的关键点好像有点不准确,我看到的关键点是:
    1. 1T内存、100G带宽;
    2. 拆账本,将全局唯一账本拆成多个;
    3. 网络上的节点不对等,有的节点负责采集交易,有的节点负责路由,有的节点负责处理交易;
    4. 用id代替公钥或者地址;
    5. 不签名、不校验并去掉脚本系统;

    看到DAC“多态资产系统”退化成交易所,比特币脑残粉们就放心了,:P。 看在我自己持有几百个BTS的份上,愿BM的区块链能够托起BM的雄心。

    +1
    +1
    我要点评
      Author Image
      比特吹吹 541 天前

      1T内存, 100G带宽。。 真心跪了。

      +1
      +1
      我要点评
    Author Image
    幸福的懒洋羊 543 天前

    BTS又TMD在吹牛画饼了,真的要好早就能融资几千万几亿美金了,一秒钟就算一亿都没有用,聪明人都不信,大家看戏就好,千万别碰,碰了就是替那只无用的废物BM买单

    +1
    +1
    我要点评