当前位置: 首页 > 编程日记 > 正文

【超越白皮书3】DAG技术解析与实测

本报告由火币区块链研究院出品,作者:袁煜明、胡智威。原文地址

相关报告:

【超越白皮书2】EOS主网上线前夕的实测分析与技术建议

【超越白皮书1】EOSIO程序实测分析与技术建议

火币区块链应用研究院从技术角度对基于有向无环图(DAG)数据结构的分布式账本技术进行研究,并通过对典型代表项目IOTA的具体技术测试,主要得到以下研究结果:

  • DAG技术与狭义的区块链技术相比,有其创新之处,理论上在不考虑作恶情况下可实现高可扩展性和高去中心化,因此存在一些安全隐患。
  • DAG项目往往以偏中心化的方式来实际运行,即降低去中心化程度来提高安全度,但同时其交易速率并没有接近理论上限。
  • 采用基于VPS(CPU进行PoW)的40个节点网络对代表性项目IOTA进行交易压力测试,可发现TPS很低:可达到的最优结果为4.19。
  • 经分析,其性能瓶颈目前主要还在于硬件的算法实现本身。如果采用FPGA等其他方式来实现,应可进一步挖掘出DAG的性能潜力。
  • 同时,为保持良好的交易处理能力,应建立足够规模的节点网络。

1. 引言

区块链是一种分布式账本技术,而分布式账本技术却不局限于“区块链”这一种技术形式。在数字经济发展的浪潮中,为了改进原有技术、满足更多的实际业务应用场景,更多的分布式账本技术正在被探索和应用当中。有向无环图(Directed Acylic Graph,以下简称“DAG”)是其中的代表之一。

DAG技术以及它背后的设计思想是什么?实际应用效果如何?我们尝试通过对DAG技术进行深层解析以及对代表性项目IOTA的实际测试运行获得分析结论。

另外需要注意的是:测试得到的指标数据结果不是也不应被视为是对IOTA平台或项目最终效果的证明或确认。特此声明。

2.主要结论

经过研究与测试分析,我们得到以下主要结论及技术建议:

  • DAG技术与狭义的区块链技术相比,有其创新之处,理论上在不考虑作恶情况下可实现高可扩展性和高去中心化,因此存在一些安全隐患。
  • DAG项目往往以偏中心化的方式来实际运行,即降低去中心化程度来提高安全度,但同时其交易速率并没有接近理论上限。
  • 采用基于VPS(CPU进行PoW)的40个节点网络对代表性项目IOTA进行交易压力测试,可发现TPS很低:可达到的最优结果为4.19。
  • 经分析,其性能瓶颈目前主要还在于硬件的算法实现本身。如果采用FPGA等其他方式来实现,应可进一步挖掘出DAG的性能潜力。
  • 同时,为保持良好的交易处理能力,应建立足够规模的节点网络。

3. DAG介绍

3.1. DAG原理简介

DAG(Directed Acyclic Graph,有向无环图)是一种数据结构,表示的是一张有向图,并且在这个图中,从任意顶点出发都无法回到该点(无环),如图所示:

clipboard.png

基于DAG技术的分布式账本(以下简称DAG)技术在近年来被提出后,被很多人认为有希望替代狭义上的区块链技术。因为DAG在设计时的目标就是保留区块链的优点并且改进区块链的缺点。

和传统线性区块链结构不同,以IOTA为代表的分布式账本平台的交易记录之间形成的是一个有向无环图的关系结构,如下图所示。

clipboard.png

3.2. DAG特性

由于采用了不同于以往块链式的数据结构,基于DAG的分布式账本技术,拥有高可扩展、高并发等特性并适用于物联网场景。

3.2.1. 高可扩展性、高并发性

传统线性区块链(如以太坊)的数据同步机制是同步的,这可能造成网络的拥堵。DAG 网络采用异步通讯机制,允许并发写入,多个节点可以按照不同的节奏同时交易,而不必有明确的先后顺序,因此同一时刻网络的数据可能不一致,但最终会是同步的。

3.2.2. 适用于物联网场景

在传统的区块链网络中,每个区块中有很多笔交易,矿工打包好后统一发送,涉及到多个用户;而在 DAG 网络中并没有“区块”的概念,网络的最小单元是“交易”,每笔新的交易需要验证前面两笔交易才能进行,这样DAG网络并不需要矿工传递信任,转账无需手续费,这使得 DAG 技术适用于小额支付。

4. 技术思路分析

不可能三角(trilemma),或被称为“三难困境”,是指在特定的情形下,只能选择三个有利选项中的两个或者是在三个不利选择中必须选择一个。这一类选择困境在宗教、法律、哲学、经济学、企业管理等多种领域均有相关案例。区块链也不例外。区块链中的不可能三角为:可扩展性(Scalability)、去中心化(Decentralization)、安全性(Security)这三者中只能选择其中两个。

如果按照这种思路来分析DAG技术,根据前文介绍,那么无疑DAG已占据了去中心化、可扩展性这两个方面。DAG的去中心化和可扩展性可认为是一体两面的,因为基于DAG数据结构带来的异步记账特性,同时实现了高度的参与网络节点的去中心化和交易的可扩展性。

5. 存在问题

既然是数据结构上的特性同时带来了去中心化和可扩展性,所以按照不可能三角的理论来推测,安全性会是一个隐患。但由于DAG是一个比较创新、特殊的结构,是否也可比较完美的实现安全性?目前从实际效果来看并非如此。

5.1. 双花问题

DAG 异步通讯的特性为双花攻击创造了可能。例如,攻击者在网络的两个不同的位置添加了两笔冲突的交易(双花),交易在网络中不断向前验证,直到它们出现在同一笔交易的验证路径上,网络才会发现冲突,这时这两笔交易汇聚成的共同祖先节点才能判断哪一笔交易是双花攻击。

而如果将交易路径控制的过短又会存在类似“Blowball”的问题:当极端情况下绝大多数交易都较为“懒惰”(Lazy Tip)、只参考早期交易时,交易网络会形成一个以少数早期交易为核心的中心拓扑。这对依赖于交易的不断增加而提高网络可靠性的DAG来说,也不是一件好事。

因此,目前对于双花问题,需要综合考虑实际情况进行设计。不同的DAG网络有各自的解决方案。

5.2. 影子链问题

由于存在双花的潜在问题,当攻击者可以构建出足够数量的交易后,就可能从真实的网络数据中分叉出一个欺诈性分支(影子链),其中包含着双花交易,然后将这个分支合并到DAG网络中,特定情况下这个分支有可能取代原有交易数据。

6. 目前改进方案简介

目前项目主要都是通过牺牲一部分DAG的原生特性来保证安全性。

IOTA项目中采用了马尔科夫链蒙特卡洛(Markov chain Monte Carlo,以下简称MCMC)的方式来解决该问题。IOTA为交易引入了累积权重(Cumulative Weight)的概念用来记录该笔交易被引用的次数,目的是表示其交易的重要性。MCMC算法通过对累积权重进行加权随机游走,选择目前网络中已存在的交易作为新增交易的参考。即被参考越多的交易路径越容易被算法选中。游走策略在1.5.0版本中也进行了优化,可将交易拓扑的“宽度”控制在一个合理范围内,使得网络更加安全。

但在平台启动初期,由于参与节点和交易数量均有限,所以很难避免一个恶意机构通过大量节点发送出海量的恶意交易使得整个网络受到影子链的攻击。因此就需要一个权威的仲裁机构来判定交易的有效性。在IOTA中,这一节点为Coordinator,它会定期对目前交易数据网络(Tangle)进行快照;包含在快照中的交易即被确认为有效交易。但Coordinator并不会一直存在。随着整个网络的运行和成长,IOTA会在未来某一时间取消掉Coordinator。

Byteball改进方案的特色在于其对于见证人(witness)和主链的设计。因为DAG的结构带来了很多偏序关系的交易,而要避免双花则需要对这些交易建立一个全序关系,形成一个交易主链。主链上较早的一笔交易作为有效交易。而由知名用户或机构担任的见证人通过不断的发送交易确认其他用户交易,从而形成主链。

以上方案也可能会对基于DAG结构的平台带来不一样的改变。以IOTA为例,因为引入了Coordinator,一定程度上降低了去中心化特性。

7. 实际运行情况

7.1. 正面效果

采用了除了解决安全问题之外,以上方案还可以在一定程度上解决智能合约问题。

由于DAG原生特性带来的两个潜在问题:(1)交易时长不可控,当前通过请求重发的机制需要在客户端进行一些较为复杂的超时机制设计,希望能够存在更简单的一次性确认机制;(2)不存在全局排序机制,导致系统支持的操作类型受限。因此在基于DAG技术的分布式账本平台上,较难实现出图灵完备的智能合约体系。

为了保证智能合约可以运行,需要一个机构来完成上述工作。目前的Coordinator或主链可实现类似的效果。

7.2. 负面效果

作为最为直观的指标之一,DAG的TPS在理论上应该是可以无限的。如果把IOTA平台的最大TPS比喻为一个工厂的产能,那么日常运行的TPS就是工厂的日常产量。

对于最大TPS,2017年4月份的IOTA压力测试显示,网络具有112CTPS和895TPS的交易处理能力。这是在一个由250个节点所组成的小型测试网络上得到的结果。

对于日常运行的TPS,从目前可公开获取的数据看到,近期主网平均TPS为8.2左右,CTPS(每秒确认交易数量)为2.7左右。

clipboard.png

而测试网近期的平均TPS为4左右,CTPS为3左右。

数据来源 discord bot: generic-iota-bot#5760

这是否与Coordinator的存在有关?需要实际测试来进一步论证。

8. 实测分析

公开测试网的运行统计数据与诸多因素都有关系。为了进一步分析,我们继续以IOTA平台为例,搭建一个私有测试环境进行技术实测分析。

8.1.测试架构

我们本次测试搭建的各组件间关系如下图所示。

clipboard.png
其中:

  • 为了避免主网或测试网上的其他因素对测试结果的影响,我们搭建了一个40个节点的小型私有IOTA测试网络。构建过程参考“Private IOTA Testnet”项目(https://github.com/schierlm/p...),并对其中使用的IRI(IOTA Reference Implementation)版本更新为了最新的v1.5.0版本。此外,在测试过程中,使用该工具提供的Coordinator模拟工具,定期生成快照对交易进行确认。
  • 使用基于Python的开源负载测试工具Locust(https://locust.io/),以便控的发送出交易数据。在开始测试后,随机向所有私有网络中的节点发送出交易数据。
  • 在节点启动时,增加“--zmq-enabled”参数,以便启动IOTA的ZeroMQ支持,将节点得到的交易数据中通过消息队列方式发送给观测端。在观测端使用ZeroMQ事件解析脚本(https://github.com/lunfardo31...)观察节点交易数据情况。

8.2. 测试硬件环境

服务器采用亚马逊AWS EC2 C5.4xlarge: 16 核 3GHz, Intel Xeon Platinum 8124M CPU,32GB内存,服务器间为10Gbps局域网网络,通讯延迟(ping)小于1ms,操作系统为Ubuntu 16.04。

8.3. 测试场景及结果分析

8.3.1. 默认PoW难度值

虽然没有“矿工”等概念,但在发送交易前,IOTA节点仍然需要进行工作量证明,以避免发送大量交易淹没网络。PoW难度值(Minimum Weight Magnitude)与比特币类似,是PoW的结果应得出“9”的位数,其中9在IOTA采用的三进制中为“000”。IOTA难度值可在节点启动前进行设置。

目前对于生产网络,IOTA的难度值设置为14;测试网设置为9。因此,我们首先采用测试网的默认难度值9来进行测试,得到以下测试结果。

clipboard.png

由于每个IOTA的交易包(bundle)中会包含多笔transfer,因此实际处理的TPS会比发送速率高。但通过执行解析zmq的脚本可观察到,目前TPS很低。而另一个现象是,每秒可发送成功的请求数量也很低。

经过分析,原因在于测试使用的是VPS,所以在PoW时,主要使用CPU来进行运算,因此交易速度主要受发送速度的影响。

8.3.2. 降低PoW难度值

将难度值降低为1后重新进行测试,得到以下结果。

clipboard.png

从结果可看到,降低难度后,TPS会有所上升。所以目前IOTA项目的TPS并没有到达Coordinator所在的瓶颈,而主要是发送交易的客户端本身硬件以及网络等方面原因导致。IOTA社区目前在研发基于FPGA的Curl算法实现以及CPU指令集优化等工作。我们的测试结果也印证可通过这一方式继续挖掘DAG平台的性能潜力。

8.3.3. 减少测试网络节点数量

由于DAG的特性,平台实际TPS和网络节点数量可能也存在着关系。因此在难度值保持为1的情况下,将网络节点数减为10后重新进行测试,得到以下结果。

clipboard.png

从结果可看到,随着节点数降低,实际处理TPS也有所下降,而且低于发送速率。这说明在DAG环境下,维持足够规模节点将有助于交易的处理。

9. 参考资料

https://www.iota.org/
https://en.wikipedia.org/wiki...
https://blog.iota.org/new-tip...
https://en.wikipedia.org/wiki...
https://byteball.org/
https://www.iotachina.com/iot...
https://www.iotachina.com/iot...

相关文章:

【Live555】liveMedia下载、配置、编译、安装、基本概念

【Live555】live555源码详解系列笔记 一、下载、编译、安装 1、下载 官网地址:http://www.live555.com/ 下载地址:http://www.live555.com/liveMedia/public/ 2、配置、 源码目录下有已经写好的配置文件,如下 config.armlinux、 config.linux 、 config.linux-64bit …

更加安全的存取账户密码

苹果SDK自带的就有密码保护,使用方法很简单,如下: 1、引入Security.frameWork框架。2、引入头文件:SFHKeychainUtils.h.3、存密码:[SFHFKeychainUtils storeUsername:"dd" andPassword:"aa"forSer…

【C++】多态问题:基类调用子类的protected或者private函数

1、问题描述 如果在基类中虚函数是public,子类中重载时标记为protected或者private函数,是否还能访问这个函数? 答案是: 基类指针指向子类时,可以访问,并且访问的是子类重载后的函数; 子类指针…

Java接口对Hadoop集群的操作

Java接口对Hadoop集群的操作 首先要有一个配置好的Hadoop集群 这里是我在SSM框架搭建的项目的测试类中实现的 一、windows下配置环境变量 下载文件并解压到C盘或者其他目录。 链接:http://pan.baidu.com/s/1jHHPElg 密码:aufd 配置环境变量 1.配置HADOOP…

用对方法,开发与部署深度学习原来如此简单……

相信大部分人都会谈癌色变,正如我们所知的一样,晚期癌症患者的生存率低于 20%,而尽管早期患者可以被治愈,且治愈率高达 90% 以上,但因为大部分癌症早期起病隐匿,更重要的原因在于受限于现有医疗水平&#x…

PL/SQL -- INSTEAD OF 触发器

为什么80%的码农都做不了架构师?>>> -- -- PL/SQL --> INSTEAD OF 触发器 -- INSTEAD OF 触发器常用于管理编写不可更新的视图,INSTEAD-OF触发器必须是行级的。 可以用INSTEAD OF触发器来解释INSERT、UPDATE和DELETE语句,并用…

开源!《AI 算法工程师手册》中文教程正式发布!

作者 | 红色石头转载自 AI有道(id:redstonewill)最近红色石头在浏览网页的时候,偶然发现一份非常不错的 AI 资源,就是这本《AI 算法工程师手册》 。本文将给大家推荐这本优秀教材,并作详细的介绍。这本《AI 算法工程师…

shell中的函数shell中的数组告警系统需求分析

2019独角兽企业重金招聘Python工程师标准>>> 20.16/20.17 shell中的函数 函数的概念 函数就是把一段代码整理到了一个小单元中,并给这个小单元起一个名字,当用到这段代码时直接调用这个小单元的名字即可。 格式: 函数名称() {command} 注&am…

【Live555】live555源码详解(一):BasicUsageEnvironment、UsageEnvironment

【Live555】live555源码详解系列笔记 类关系图 1、UsageEnvironment 详解 1.1 BasicUsageEnvironment BasicUsageEnvironment 继承自 BasicUsageEnvironment0,主要增加的功能,使用静态函数 createNew 来创建自己;重载“<<”操作符,用来向标准错误输出(stderr)打…

Web前端开发人员和设计师必读文章推荐【系列七】

这篇文章主要收录了十二月份发布在梦想天空的优秀文章&#xff0c;特别推荐给Web开发人员和设计师阅读。梦天空博客关注前端开发技术&#xff0c;展示最新 HTML5 和 CSS3 技术应用&#xff0c;分享实用的 jQuery 插件&#xff0c;推荐优秀的网页设计案例&#xff0c;共享精美的…

【Live555】live555源码详解(二):BasicHashTable、DelayQueue、HandlerSet

【Live555】live555源码详解系列笔记 3、BasicHashTable 哈希表 协作图: 3.1 BasicHashTable BasicHashTable 继承自 HashTable 重载 HashTable 接口 Add :添加键值对 Remove :删除键值 Lookup :由“健”查找“值” numEntries :键值对数量重载 HashTable 成员(…

对标英伟达,依图发布AI芯片“求索”

作者 | 一一出品 | AI科技大本营&#xff08;ID:rgznai100&#xff09;依图成立 7 年&#xff0c;这次专为芯片召开了第一次产品发布会。5 月 9 日上午&#xff0c;依图科技在上海发布了其首款自研云端视觉推理 AI 芯片“求索”questcore™&#xff0c;以及基于该芯片构建的软硬…

JUC原子类 1

根据修改的数据类型&#xff0c;可以将JUC包中的原子操作类可以分为4类。1. 基本类型: AtomicInteger, AtomicLong, AtomicBoolean ; 2. 数组类型: AtomicIntegerArray, AtomicLongArray, AtomicReferenceArray ; 3. 引用类型: AtomicReference, AtomicStampedRerence, AtomicM…

使用ROW_NUMBER 和partition by 解决报表中的查询问题

在报表中遇到一个查询问题&#xff1a; 原始数据如下: Id cust_id call_date call_result 1 1 2012-03-15 09:00:00 fail 2 1 2012-03-15 09:05:00 number error 3 1 2012-03-15 09:10:00 fail 4 1 2012-03-15 09:15:00 success 5 2 2012-03-15 09:01:00 fail …

中国AI开发者真实现状:写代码这条路,会走多久?

2016 年起&#xff0c;人工智能成为中国开发者重点关注的技术领域&#xff0c;以深度学习驱动的计算机视觉、自然语言处理、语音相关技术成为渗透最广的三个 AI 技术领域。然而&#xff0c;在这样的背景下&#xff0c;AI 仍是一个非常前沿的学科&#xff0c;对于中国开发者而言…

linux学习-awk工具

awk是基于列的文本处理工具&#xff0c;它的工作方式是按行读取文本并视为一条记录&#xff0c;每条记录以字段分割成若干字段&#xff0c;然后输出个字段的值&#xff0c;事实上&#xff0c;awk是一种编程语言。awk认为文件都是结构化的&#xff0c;也就是说由单词和各种空白字…

【Live555】live555源码详解(四):Medium媒体基础类

【Live555】live555源码详解系列笔记 7、Media Medai所依赖关系图 依赖Medai关系图 Media和UsageEnvironment关联图

linux中普通文件和块设备文件的区别

1&#xff0c;概述 一直都搞不明白普通文件跟块文件的区别&#xff0c;总觉得一个普通的文件是存放在磁盘块上&#xff0c;那它既属于普通文件又属于块设备文件。刚好下午睡了一个大头觉&#xff0c;比较清醒&#xff0c;集中学习了下普通文件和块设备文件的区别和联系。 本文从…

我的vim配置

我的vim配置 1.通用配置 vimrc 2.自己配置 1.新建.c,.h,.sh,.java文件&#xff0c;自动插入文件头 vim ~/.vim_runtime/my_configs.vim 输入一下内容 """""""""""""""""""&qu…

【Live555】live555源码详解(五):MediaSource、MediaSink、MediaSession、MediaSubsession

【Live555】live555源码详解系列笔记 继承协作关系图 下面红色表示本博客将要介绍的四个类所在的位置: MediaSource、MediaSink、MediaSession、MediaSubsession 8、MediaSource MediaSource 继承自 Medium,下面是MediaSource的协作图 关于 MediaSource 类的继承关系 …

BAT携手清华、复旦、上交齐聚杭州, 和500名开发者干点啥?

2016 年起&#xff0c;人工智能成为中国开发者重点关注的技术领域&#xff0c;以深度学习驱动的计算机视觉、自然语言处理、语音相关技术成为渗透最广的三个 AI 技术领域。然而&#xff0c;在这样的背景下&#xff0c;AI 仍是一个非常前沿的学科&#xff0c;对于中国开发者而言…

MOS2010开发基础和集几种开发模型

基础 基本的部署结构图类似如下 创建新的Web Application的原因&#xff1a; One key reason to create a new web application is to isolate content. Every time a new web application is created, SharePoint creates a new content database. All the data in the sites …

还在用Matplotlib? 又一可视化神器Altair登场 | 技术头条

作者 | Fernando Irarrzaval 翻译 | Monanfei责编 | Jane出品 | Python 大本营&#xff08;id&#xff1a;pythonnews&#xff09;【导语】如何将我们的数据以更好的形势呈现出来&#xff1f;擅长不同编程语言的程序员会选择各自技术范畴内成熟、好用的工具包&#xff0c;比如 …

【Live555】live555源码详解(六):FramedSource、RTPSource、RTPSink

【Live555】live555源码详解系列笔记 继承协作关系图 下面红色表示本博客将要介绍的三个类所在的位置: FramedSource、RTPSource、RTPSink 11、FramedSource FramedSource 继承自 MediaSource,下面是实现 FramedSource 的依赖关系图 使用 FramedSource 的关系图

maven在idea的配置

首先去官网下载如图&#xff1a; 下载之后解压打开如图&#xff1a; 配置&#xff1a;1、打开conf文件夹下的settings.xml&#xff08;我用的notepad&#xff09; 第55行左右加上图上的第150行左右在标签下面写上如图&#xff08;阿里提供的存架包的仓库&#xff09; 2、配置id…

Apache下实现禁止目录浏览

当我们访问某个网站时&#xff0c;在后面增加相应的目录&#xff0c;就可以浏览到目录&#xff0c;对于网站来说&#xff0c;是很不安全的。 解决办法&#xff1a;1、编辑httpd.conf文件vi ./conf/httpd.conf找到如下内容&#xff1a;......<Directory "C:/Program Fi…

【Live555】live555源码详解(七):GenericMediaServer、RTSPServer、RTSPClient

【Live555】live555源码详解系列笔记 继承协作关系图 下面红色表示本博客将要介绍的三个类所在的位置: GenericMediaServer、RTSPServer、RTSPClient 14、GenericMediaServer GenericMediaServer 继承自 Medium,依赖关系图如下: 使用 GenericMediaServer 的关系图:

200万?程序员刚拿下华为Offer,这些技巧你必须知道!

最近&#xff0c;有华为员工在匿名社交网站上&#xff0c;曝光自己年收入已突破200万&#xff01;消息一出&#xff0c;不知酸了多少中国程序员&#xff01;但是&#xff0c;在羡慕之余&#xff0c;我们不如利用起碎片时间&#xff0c;从点滴做起&#xff0c;背水一战&#xff…

有效快速的学习微信小程序

微信小程序 实现了应用“触手可及”的梦想&#xff0c;用户扫一扫或搜一下即可打开应用。不用安装&#xff0c;即开即用&#xff0c;用完就走。省流量&#xff0c;省安装时间&#xff0c;不占用桌面。对用户使用上来说&#xff0c;确实方便&#xff0c;没有繁琐的注册&#xff…

Delphi开发的IOCP测试Demo以及使用说明。

Delphi开发的IOCP&#xff0c;此为压力测试Demo和使用说明。