大家好,我是Frozen,今天很有幸和大家一起分享XDAG,感谢计然研究院的邀请!
之前计然研究院多次邀请来做关于XDAG项目技术介绍,一直没有找到合适的时间,今天总算找到合适的时间合适的地点和大家一起分享。
友情提醒!
今晚的分享内容很干,默认诸位已经对区块链相关知识了解较为深入。
下面咱们开始分享。
先介绍下XDAG项目的概要情况,XDAG是一种基于PoW共识算法和DAG技术的加密货币。XDAG项目是在2017年9月份前后由俄罗斯匿名数学家Daniel开始独自开发,2018年1月5日主网正式上线,2018年2月2日XDAG代码移交社区,由社区开始进行开发和维护。项目没有ICO,没有预挖,完全由社区驱动。
目前社区由各国各地区的爱好者组成,社区开发者团队共有17人,分别负责核心代码开发、显卡矿机软件、钱包开发、区块浏览器、矿池脚本工具以及各种小工具开发。
比特币开创了区块链的先河,公认是区块链1.0时代,Ethereum将全球计算机的概念带入现实,被认为是区块链2.0时代,当前的EOS则将blockchain的技术发扬广大,有人认为是区块链3.0时代的开篇。
虽然行业经过多年发展,但是基于blockchain的区块链技术本身也面临诸多问题,并且随着普及范围扩大这些问题也越来越突出。尽管业内众多blockchain开发者都在尝试寻找各种技术手段来解决当前遇到的这些问题,但是从当前技术发展现状来看各种尝试并没有取得突破性进展。
目前遇到的问题主要有以下两个方面
1、blockchain本身的TPS瓶颈限制了区块链技术的性能
2、blockchain较长的确认时间也限制了区块链技术的广泛使用
针对以上两个问题,不管是EOS偏中心化的解决方案,还是目前如火如荼的分片技术、侧链技术都存在一些无法解决的问题。
这一现状间接说明基于blockchain本身再去扩展将面临巨大困难和挑战。
那除了blockchain上再进行扩展是否还有其他的方向可以去突破?答案是有的。
那就是DAG技术!
DAG (Directed Acyclic Graph 有向无环图) 并不是一个刚出现的技术,而是在数学的一个分支—图论中的数学概念,早在1736年被提出,在计算机技术中则是在计算机科学与技术初期就已经存在的一种数据存储结构。从理论上而言DAG结构比单链结构更复杂,但拥有更好的扩展性。
目前业内已经有一些基于DAG数据结构的公链存在,但是每个公链都因为对于DAG技术的理解不同实现路线和适用场景不尽相同。
这是NANO的实现方式,主要思路是每个账户拥有自己的一条链,不同账户之间根据交易记录串联起来,从而形成DAG。
这是IOTA的DAG样子,主要思路是根据交易不同的高度和权重让使用者来确定交易有效性。
这是Hashgraph的DAG样子,主要思路在于利用节点间的修改过的gossip算法传播的交易信息构成时间上的序列,从而构成DAG。
这是Byteball的DAG样子,他的思路在于利用见证人节点向每一个交易后追加见证人单元来增加分支上的权重,从而确定当前DAG中的主链。
而以上的多种DAG实现并没有很好的解决去中心化、高TPS和低确认时间。
与众不同的是XDAG尝试通过从区块链技术底层的数据结构开始重新设计,并采用另外一种DAG构成方式,巧妙的将PoW共识算法和DAG技术相结合,并同时提供了不同节点之间交易并发处理方式,在确保的网络安全性和公平性的前提下提高TPS降低确认时间。
此图展示了XDAG中一个局部的DAG组成。
A 表示钱包地址块,Tx表示交易块,M表示PoW产生的主块,W我将其命名为见证块。在XDAG中一直有个特点,就是区块= 交易= 地址
在XDAG中区块的数据结构如上图中所示,这个数据结构是用来持久化存储数据使用。
块结构通过16个名为xdag_field的结构组成,每个xdag_field都是一个结构体,其中由结构体和联合体组成。
transport_header在传输时用来表示序列号,在接收后处理时用来保存下一个块的地址。
type是一个64位的字段,用来表示一个块中16个field的类型,其中划分成16部分,每部分4bit,也就是半个字节,4位可以表示16种类型,因此type这个字段每4位表示一个field对应的类型。
time是用来表示块产生的时间,采用的格式是1/1024秒,一秒钟在其中表示为2^10。同时在节点间数据交换时作为请求时间范围的起始时间点。
hash是一个24字节的截断哈希值,通常是另一个区块的截断哈希值。
amount是以cheato为单位的数量值,用来记录XDAG数量,cheato是XDAG中的基本单位,1个XDAG包含有2^32个cheato。
end_time 用来表示节点间数据交换时作为请求时间范围的终止时间点。
data 是32字节的哈希值
在XDAG中以上描述的块是完全由每个节点、每个钱包自己独立生成,不会受其他干扰,从而在基础设计上保证了区块处理的独立性,也为后续提到的高TPS打下基础。
此图则展示了在构建DAG时XDAG采用内部块的方式来简化交易状态以及区块余额的处理逻辑。此内部块只在XDAG逻辑处理过程中才会使用到,并不会持久化存储。
这里展示了一个最简单的XDAG转账处理结构。
A表示地址,M表示主块,Tx1 记为A1地址向A2地址进行的一笔转账,W我将其命名为见证块。
上图展示了一个典型的双花检测。
假设A1地址有10个XDAG,A1的钱包被人恶意拷贝了两份,同时发起了两笔转账,一笔Tx1从A1转了5个XDAG到A2地址,另外一笔Tx2从A1转了7个XDAG到A2地址。两笔转账合计12个XDAG,超出了A1地址原有的10个XDAG,是个典型双花。
在XDAG检测的逻辑是在节点同一时间收到Tx1和Tx2时,节点生成的W块会引用Tx1和Tx2,根据稳定的排序规则Tx2会在被W块引用时填充到了顺序编号更小的field中,从而Tx2优先被处理,而Tx1则后处理,从而检验出Tx1的花费是一次双花,从而在内部块中将这个哈希值指向的交易块标记为拒绝状态,而Tx1这个交易块永远记录在DAG中,不会删除。
上图则展示了一个更加复杂的双花检测。
前提条件和上一个一样,假设A1地址有10个XDAG,A1的钱包被人恶意拷贝了两份,同时发起了两笔转账,一笔Tx1从A1转了5个XDAG到A2地址,另外一笔Tx2从A1转了7个XDAG到A2地址。两笔转账合计12个XDAG,超出了A1地址原有的10个XDAG,是个典型双花。但是这次情况有变化,那就是此人恶意采用技术手段将钱包连接到不同的节点上,因此就会产生不同节点之间的双花检测。
接收到Tx1交易的节点此时并不知道Tx2交易的存在,而接收到Tx2交易的节点同样不知道Tx1交易的存在,因此这种情况下就需要节点之间的数据交互才能检测。
此时PoW共识就产生作用了,在XDAG每隔64秒即产生一个主块,通过主块M1’ M1’’比较难度,确定出M1’’的难度更高,因此M1’’引用的块Tx2在排序时优先于M1’引用的Tx1,如此检测出Tx1为双花,从而在内部块中将这个哈希值指向的交易块标记为拒绝状态,而Tx1这个交易块永远记录在DAG中,不会删除。
如图是XDAG更全面的DAG结构,其中为了简单起见将前面几张图里的钱包地址块省略展示。
Node表示不同的节点,M 表示PoW挖到的主块,W标示额外的块,我将其命名为见证块。Tx是交易块。
不同节点分别接收各自的交易块,将交易块拼接到DAG中的行为相互之间耦合度较低,通过节点间的数据交互建立之间的联系,从而能够让不同节点很好地吸收较高的并发来达到高TPS。
同时每64秒通过PoW产生一个主块,让去中心化公链的交易确认时间也大大缩短,一般在1到2分钟即可被确认。
XDAG未来的方向不仅仅是做一个高TPS的去中心化公链,同时也计划带来交易的匿名性和智能合约,让XDAG具有支付属性以外具有更广阔的应用场景。
目前社区开发计划中的Android钱包和iOS钱包已经发布测试版本,在收集社区的反馈,并及时提供更新版本。
轻钱包和全节点钱包还在计划之中。
Golang版本实现已经着手进行基础开发,C++版本也在进行相关基础开发。
Python版本用于教学和入门XDAG开发,目前已经有了Python的矿机实现。
当前XDAG社区急需更多贡献者加入,也急需得到更多人的帮助。
帮助XDAG的方式有分享传播XDAG相关知识、和社区一起讨论各种提议、向社区报告问题、帮助社区做本地化翻译、直接参与XDAG项目开发贡献代码!
感谢所有的曾经帮助过和现在正在帮助XDAG的开发者们,他们有
Daniel, Evgeniy, Frozen, sgaragaghu, trueserve, amazingMan2017, ssyijiu, Solar, Wendy, czslience, rubencm, kbs1
感谢所有的矿工、矿池主和所有其他的贡献者们!
有他们的无私奉献才有XDAG这样一个项目存在!
https://jq.qq.com/?_wv=1027&k=5nOyPQ9 (二维码自动识别)
可以扫码关注微信公众号获取最新XDAG进展
扫码加入开发者QQ群,共同讨论XDAG技术路线。
感谢计然研究提供这样一个同大家交流的机会!
大家有什么问题可以现在提问或微信交流。
Q&A:
Q1: 这个见证块能否细说说,它既不是交易也不是地址吧?
A1: 见证块是由节点生成的,当节点有收到新的块时,这个块并没有连接到DAG中,而是通过节点生成的见证块,将接收到的新块加入到DAG中。
Q2: 看起来xdag里面的排序规则对于确定双花交易特别重要,里面的排序规则有哪些?
A2: 排序规则就比较复杂了。。可能单独得需要一个时间来分享
有疑问加站长微信联系(非本文作者)