TrustNote打造的DAG公有链正在让使用区块链成为一种生活方式
扫描二维码
随时随地手机看文章
TrustNote 是支持挖矿的 DAG 公有链,具有创新的双层共识机制,面向数字通证发行、区块链游戏和社交网络等应用场景,基础代币称为“TTT”。TrustNote的宗旨是“极轻、极速、极趣”。“极轻”是指 TrustNote 拥有轻量化的架构和智能合约系统,支持轻量级应用扩展和微钱包;“极速”是指 TrustNote 支持高并发交易、交易确认速度快、dApp 开发简单上线快;“极趣”是指 TrustNote 打造的应用生态体系,让新奇特的想法在 TrustNote 上流畅地运行,让使用区块链成为一种生活方式。
关键特性
拥有双层共识机制,是支持挖矿的 DAG 公有链
支持高并发交易,交易极速确认
支持高级声明式智能合约
数字通证发行平台
哈希算法:BLAKE2
签名算法:EdDSA
多平台钱包、轻钱包、微钱包,支持第三方扩展
有向无环图
若一个有向图无法从某顶点出发经过若干条边回到该点,则称该图为有向无环图(Directed Acyclic Graph,DAG)。使用 DAG 数据结构存储区块链账本数据的模式,正逐步受到更多开发者的关注。已有 IOTA 和 Byteball 等多个项目利用DAG 技术成功构建了能够稳定运行的公有链,证明了 DAG 链的可行性。
在 TrustNote 中,交易被视为一种消息,支持多种类型的消息,多个消息可组合成一个数据块,该数据块称作一个单元(Unit),单元与单元之间相互链接组合成一个 DAG 图。由于单元可以链接到任意一个或多个之前的单元,不需要为共识问题付出更多的计算成本和时间成本,也不必等待节点之间数据强同步,甚至没有多个数据单元拼装区块的概念,因此可以极大提高交易的并发量,并把确认时间降低到最小。
TrustNote 使用以下方案解决双花问题(一份数字货币被花了两次)。首先,尝试在 DAG 图上找到一条以创世单元为起点的主链(Main Chain,MC),并给位于主链上的单元分配索引,创世单元索引为 0,创世单元的子单元索引为 1,以此类推。然后,对于不在主链上的单元,定义其索引等于引用此单元的第一个主链单元的索引。最终,DAG 上的每笔交易都拥有了一个索引。如果两笔交易尝试使用同一笔输出,只需要比较其索引(Main Chain Index,MCI)的大小,小的有效,大的无效,由此解决双花问题。例如,图 2-2 中存在两笔双花交易,当它们的 MCI 确定后,其中一笔双花的 MCI 是 11,而另一笔双花的 MCI 是 15。所以,我们可以认定 MCI 为 11 的交易有效,而拒绝 MCI 为 15 的交易。
安全性方面,不同于比特币的区块链以巨大算力作保障,基于 DAG 的TrustNote 依靠交易的快速推进,以及交易之间关联关系的不确定性作为“防火墙”,使整个系统毫无规则,无从攻击。TrustNote 具有创新的双层共识机制和 TrustME共识算法,利用该算法周期性地选出若干超级节点,赋予它们数据单元的公证权,并会根据它们发出有效的公证单元获得 Coinbase 奖励。
项目对比
TrustNote 站在巨人的肩膀上,吸纳现有区块链项目的优点,解决它们的突出问题,构建更加繁荣的应用生态。TrustNote 采用创新的双层共识机制,具有高安全性的密码算法,以挖矿的方式使超级节点参与单元公证。TrustNote 与当下知名 DAG 链(IOTA 和 Byteball)进行了横向对比,对比结果如表 2-1 所示。
共识机制
TrustNote 采用双层共识机制,该共识机制包括基础共识和公证共识。基础共识是指节点发送的新交易单元对旧交易单元的验证与引用,也称“DAG 共识”;公证共识是指根据公证节点提交的公证单元严格确定其它单元的顺序,也称“TrustME 共识”。这种双层共识机制有利于提供较高的交易吞吐量和较短的交易确认时间,能有效解决过度分叉和双花问题。
为使 TrustNote 生态更加健壮,我们设计了两种 TrustME 共识方案。TrustNote将在早期采用基于工作量证明(Proof of Work,PoW)的 TrustME 共识方案,该方案称为“TrustME-PoW”;未来,TrustNote 计划采用基于拜占庭协商(ByzantineAgreement,BA)的 TrustME 共识方案,该方案称为“TrustME-BA”。无论哪种方案,若超级节点参与共识并被选作公证节点,它将会获得 TTT 作为奖励。
在 TrustME-PoW 中,超级节点通过证明自己的运算能力获得公证权,而在TrustME-BA 情况下,利用伪随机算法选择超级节点并赋予其公证权。无论哪种TrustME 共识方案,公证节点发出的公证单元都同样遵守单元引用规则,并且不会影响其它单元之间已经建立的引用关系。而只有在公证单元成为主链上的稳定单元后,才能最终证明某个公证节点做了有益于维护 TrustNote 的工作,并因此获得公证奖励。另外,两种 TrustME 共识机制都鼓励所有节点公平参与,相比中心化和弱中心化的方案更加公平、可信、安全。
1.节点
TrustNote节点有四种类型,分别为超级节点(super node)、全节点(full node)、轻节点(light node)和微节点(micro node),节点对比如表 4-1 所示。
TrustNote 具有与比特币相似的 P2P 网络,每一个节点可选择一组随机的 peer节点,并利用 Gossip 协议来传播消息。为了保证消息不被伪造,每一个消息都被原始发送者的私钥签名,其它节点在转发它之前要验证签名是否有效。为了避免消息传播出现前向回环,节点不会转发重复的消息。
成为 TrustNote 超级节点,需满足以下条件:
有资源:具有良好的网络带宽、存储空间和运算能力,最好拥有公网 IP;
有币:在多个共识周期内平均持有一定数量的 TTT;
有信用:之前提交的所有单元都被认为是有效的。
成为超级节点之后,可参与 TrustME 共识,进而成为公证节点。公证节点可通过发送公证单元获得公证奖励并能赚取普通单元的公证费。
单元引用
TrustNote 中每个单元可引用多个彼此之间没有父子继承关系的单元,而且新的子单元会优先链接有更多父单元的单元。如果沿着某个父单元向子单元方向推进,当一个单元被多个子单元引用时,我们将观察到许多分叉,而当多个父单元被同一个子单元引用时,这些单元将逐渐汇聚。
引用父单元的目的是建立单元之间的模糊次序。引用父单元之前,需要验证父单元有效性,如签名是否有效、单元引用是否合规等。TrustNote 不要求节点之间强同步,不同节点看到的 DAG 链图存在临时性的不一致,但这并不会破坏已经建立的父子关系,只可能会使一个父单元有多个子单元。而正因为不追求节点之间的单元数据强同步,TrustNote 可以容忍高交易吞吐量和网络延迟。
为减少 DAG 中可能出现的垃圾单元,所有节点提交新单元时需要支付交易费。交易费分成两部分,分别支付给将该单元作为父单元的节点以及为该单元提供公证的节点。若一个单元被多个子单元引用,那么发送拥有最小哈希值单元的节点获得引用奖励。同时,限制获得引用奖励的子单元的 MCI 值应等于或略大于其父单元的 MCI,激励节点尽可能快地引用更多最新的父单元,以获得更多引用奖励。这有助于 DAG 快速收敛,减少分叉。
3.主链
主链是在指定单元所见的 DAG 图中沿着子-父链接找到一个单链,可以把所有单元都关联在一起。所有的单元要么直接在这条主链之上,要么从主链上的单元沿着 DAG 的边缘通过少量的跳跃可以到达。如果我们从另一个顶点开始,我们会构建另一条主链。如果以相同的规则在两个不同的顶点选择主链,这两条主链在回溯过程中一旦相交,它们会在交点之后完全重合。最坏的情况,两条主链在创世单元相交。虽然节点生成单元的过程中是相互独立的,也不存在任何协调的可能,我们仍期望主链之间的交点可以尽可能的靠近顶点。
一旦某单元选择出一条主链(MC),它就可以在两个冲突的无序单元之间建立总序。首先,给直接位于主链上的单元做个索引,创世单元索引为 0,创世单元的子单元索引为 1,以此类推,沿着主链给主链上的所有单元分配索引。对于不在主链上的单元,我们找到第一个直接或间接引用此单元的主链单元。这样,就给每一个单元分配了一个主链索引(MCI)。然后,给定两个单元,拥有较小MCI 的单元被认为是更早生成的。如果两个单元的 MCI 恰好相同并且存在冲突,则拥有较小哈希值的单元有效。TrustNote 会保留双花的所有单元,包括最终认定无效的单元。
主链构建过程实际上是父单元选择算法的递归调用过程。通过参与 TrustME共识,超级节点有机会成为具有公证权的节点,可以发送公证单元。通过比较可选路径中公证单元的数量,父单元选择算法能在给定的所有可选父单元中选出一个作为“最优父单元”。对于不同节点,主链构建过程是完全独立的,仅依赖于节点自身能看到的 DAG 图。从 DAG 图的无子单元开始,沿着最优父单元的路径做历史回溯,节点可以构建一条能通达创世单元的主链。
4.交易确认
当获得新的单元时,每一个节点会持续追踪自身的当前 MC,好像他们将要基于当前的所有无子单元构建新单元。不同节点各自的当前 MC 也许不同,因为它们有可能看到不同的非稳定单元集合。而当新单元到达时,当前 MC 会不断变化。然而,当前 MC 的足够老的那部分会保持不变。
未来所有的 MC 在回溯时将会汇集某个 MC 单元,这个 MC 单元以及之前的所有 MC 单元都是稳定的,不会因为新单元的到来而改变。事实上,创世单元是一个天然的初始稳定节点。假设我们已经基于当前的非稳定单元集合构造了一条当前 MC,并且这条链上已经有一些之前认定稳定的节点,也就是说未来的当前 MC 都被相信会在这个点或早于这个点汇集,然后就沿同一条路径回溯。如果我们能找到一个方法,把这个稳定点向远离创世单元的方向推进,就可以根据数学归纳法证明这个稳定点存在。而被这个稳定点所引用的单元将获得确定的 MCI,包含在这些单元中的所有消息也将被确认。
5.交易费与挖矿奖励
发布交易需要支付交易费,节点根据生成单元的字节数计算交易费。交易费被分成两部分,60%作为单元引用费,40%作为公证费。引用费将被该单元的子单元获得,而公证费将被累加到主链中 MCI 值最接近的公证单元所在共识轮的公证奖金池。公证单元也需要支付交易费,交易费计算方法与普通单元相同。公证单元包含较多信息,通常比普通单元占用更大的存储空间,因而交易费也相对较高,激励其它节点引用公证单元。
在 TrustNote 中,DAG 链的增长与 TrustME 共识是异步的,每轮共识会选举出多名公证人,这些公证人有权提交公证单元。在主链没有稳定的情况下,无法确定哪些公证单元在主链上,也无法计算公证单元的有效引用,所以没办法像比特币一样直接给出 Coinbase。当某共识轮的所有公证节点发出的所有公证单元都成为稳定单元后,才能确定该共识轮的每个公证节点分别可以获得多少公证奖金。需要说明的是,普通单元也可能会出现在主链中,它们可能会获得父单元支付的引用费,但不会分享公证奖金。
TrustME 共识周期性地执行,每轮都会选出一定数量的公证节点。如果某轮公证节点发送的所有公证单元都成为稳定单元,则称该轮共识稳定。每个公证单元的第一个消息是公证节点自身的公证权证明。每次达成 TrustME 共识后,当前轮公证节点生成的首个公证单元必须包含最新稳定共识轮的 Coinbase。需要说明的是,最新稳定共识轮的 Coinbase 在进行新一轮 TrustME 共识时已经确定,是TrustME 共识算法的输入变量之一。在同一共识轮内,由不同公证节点生成的其它公证单元不再包含上述内容,而是通过验证并引用首个公证单元的方式确认稳定共识轮的 Coinbase 内容。这样做可以进一步削弱公证节点的能力,防止恶意的超级节点通过多次获得公证权干扰稳定共识轮公证节点的 Coinbase 收益。
6.TrustME-PoW
TrustME-PoW 是基于工作量证明选择公证节点的共识机制,每轮共识将选择少量节点成为公证节点,并确定相关公证节点的优先级。TrustME-PoW 共识算法每五分钟执行一次,每次达成共识会选出不超过二十个超级节点作为公证节点,这些公证节点有权发送公证单元并以此获得公证奖励。
TrustME-PoW 基于 Equihash 算法,以 BLAKE2 为底层哈希函数,降低使用ASIC 挖矿的优势,更多超级节点可以公平参与挖矿,使超级节点成为公证节点的概率分布更加合理。Equihash 算法的输入为当前轮数、种子和难度系数等内容。当前轮数起始为 0,每轮加 1;每轮共识的种子根据上一轮共识的种子和取得的共识结果计算得出,种子可被公开获得及验证;难度系数根据全网平均算力推算得出,通过调整难度系数可以控制达成共识的平均时间间隔。
公证单元必须满足前文所述的单元引用规则。公证单元只能引用非稳定单元,并且必须验证引用单元及其“子-父”链的正确性,直到验证到稳定的 MC 单元。鼓励公证单元引用多个非稳定状态的最优父单元,加速单元稳定,促使 DAG 链向前推进并收敛。
只有公证单元成为主链上的单元,才能获得相应的公证奖励。同一共识轮内,所有主链上公证单元按照各自的有效引用单元数量计算当前共识轮公证奖金的分配比例。每个公证单元在成为主链单元并稳定之后,计算出该公证单元的有效引用数量。公证节点直接引用自己发送的公证单元或普通单元不计为有效引用,防止公证节点之间恶意争夺奖金,发送无意义单元。
7.TrustME-BA
TrustME-BA 是一种基于可验证随机函数(Verifiable Random FuncTIon,VRF)和 BA 算法构建的共识机制,该共识机制能够随机选出少量超级节点作为公证节点,并确定公证节点的优先级。
TrustME-BA 每一分钟执行一次,每次达成共识将随机选出若干超级节点作为公证节点,公证节点有权发送公证单元,公证单元须满足 DAG 共识中的父子引用规则。公证节点发送的公证单元成为稳定主链的单元后,该公证节点可以获得公证奖励。当交易活跃时,新单元不断产生,则公证节点会及时获得公证奖励;当交易不活跃时,极端情况下一分钟内没有新单元产生,已经发送公证单元的节点在发送的公证单元成为稳定主链单元时获得公证奖励,没有发送公证单元的节点不获得公证奖励。
智能合约
TrustNote 拥有非图灵完备的声明式智能合约系统,支持布尔运算、数学运算、合约数据存储,不支持栈和跳转指令。这种智能合约语言能直接描述合约期望的目标,表达能力强,易于理解,安全性高。与以太坊相比,TrustNote 的智能合约系统具有复杂度低、轻量化和高性能等优势,同时还降低了合约编写难度和出错概率。
TrustNote 没有账户的概念,TTT 以 UTXO 的形式存储在不可篡改的分布式账本的数据单元中。在 TrustNote 的智能合约语言里,地址定义是一个布尔表达式,可计算出是 true 或者 false 的结果。智能合约的所有表达式,最终都会计算出一个布尔值,多个子表达式可以通过布尔操作联合起来。例如,下面这个定义需要两个签名。
[“and”, [
[“sig”, {pubkey: “one pubkey”}],
[“sig”, {pubkey: “another pubkey”}]
]]
为了花费与以上定义地址的资金,必须同时提供两个签名。我们使用 JSON来编写表达式,可以使用具备很好支持的、已经过优化的 JSON 解析器。
“Or” 操作可以用来描述需要提供任意一个公钥所对应私钥的签名。
[“or”, [
[“sig”, {pubkey: “laptop pubkey”}],
[“sig”, {pubkey: “smartphone pubkey”}],
[“sig”, {pubkey: “tablet pubkey”}]
]]
可以用以上定义实现在三个不同设备上可以控制同一个 address,这三个设
备可能是你的电脑、手机和平板。
地址定义的指令可以嵌套,如:
[“and”, [
[“or”, [
[“sig”, {pubkey: “laptop pubkey”}],
[“sig”, {pubkey: “tablet pubkey”}]
]],
[“sig”, {pubkey: “smartphone pubkey”}]
]]
地址定义可以要求一个集合中参与者必须达到某个阈值,例如 2-3 签名。
[“r of set”, {
required: 2,
set: [
[“sig”, {pubkey: “laptop pubkey”}],
[“sig”, {pubkey: “smartphone pubkey”}],
[“sig”, {pubkey: “tablet pubkey”}]
]
}]
上面的表达式意味着任意两个签名便可以使表达式为真。如果一个密钥丢失了,这个地址仍然可用,并且能够修改这个定义,给丢失的密钥设置一个新值。
另外,不同条目可以赋予不同的权重,并可以设定一个最小权重要求。
[“weighted and”, {
required: 50,
set: [
{weight: 40, value: [“sig”, {pubkey: “CEO pubkey”}] },
{weight: 20, value: [“sig”, {pubkey: “COO pubkey”}] },
{weight: 20, value: [“sig”, {pubkey: “CFO pubkey”}] },
{weight: 20, value: [“sig”, {pubkey: “CTO pubkey”}] }
]
}]
地址定义可以引用其它地址。
[“and”, [
[“address”, “ADDRESS 1 ”],
[“address”, “ADDRESS 2”]
]]
这种定义意味着把签名委托给其它地址,这对于构造共同控制的地址是很有用处的。这种语法给予了用户很多方便,他们能根据自己的意愿去改变他们自己有权管理的那部分地址的定义,而不会影响别的用户。
地址定义可以用来配备添加到 DAG 中的数据。
[“in data feed”, [
[“ADDRESS1”, “ADDRESS2”, …],
“data feed name”,
“=”,
“expected value”
]]
如果由某地址添加到 DAG 的数据反馈结果与期望值相等,则表达式的结果为 true。通过指定数据反馈的来源,可以实现链上预言机功能。利用链上预言机可以扩展出非常强大的功能。
[“or”, [
[“and”, [
[“address”, “ADDRESS 1”],
[“in data feed”, [[“EXCHANGE ADDRESS”], [“EURUSD”, “+”, “0.200”], “》”,
“1.1500”]]
]],
[“and”, [
[“address”, “ADDRESS 2”],
[“in data feed”, [[“TIMESTAMPER ADDRESS”], “dateTIme”, “》”, “2016-10-01
00:00:00”]]
]]
]]
上面的表达式依赖两个预言机,一个会发布欧元/美元的汇率,另外一个会发布时间。首先,双方为这个表达式定义的地址准备资金,向这个地址支付各自相应的份额。然后,如果由兑换地址公布的欧元/美元汇率加上 0.200 曾经超过1.150,则地址 1 将得到全部资金。如果在 2016 年 10 月 1 日之前,以上情况没有发生,则地址 2 将得到全部资金。另外一个有趣的例子中,消费者向商人购买货物,但是他不是很信任商人,如果货物没有发给他,希望钱可以退还给自己。
此时,消费者可以把钱付给用以下方式定义的一个共享地址。
[“or”, [
[“and”, [
[“address”, “MERCHANT ADDRESS”],
[“in data feed”, [[“FEDEX ADDRESS”], “tracking”, “=”, “123456”]]
]],
[“and”, [
[“address”, “BUYER ADDRESS”],
[“in data feed”, [[“TIMESTAMPER ADDRESS”], “datetime”, “》”, “2016-10-01
00:00:00”]]
]]
]]
这个定义有效的前提是 FedEx 会在链上存储包裹的单号。如果货物发放了,根据第一个条款,商人可以解锁资金。如果在商定的日期之前,货物没有发放,消费者可以拿回自己的资金。
地址定义可以实现交易查询。假定用户想购买至少 1200 个单元的数字资产,但是只愿意支付 1000 TTT,而且他不愿意一直在线等待卖家。他可以只在交易平台发布一个订单,当匹配的卖家出现时,自动完成交易。他可以按照以下方式创建地址,并发送 1000 TTT 到该地址。
[“or”, [
[“address”, “USER ADDRESS”],
[“and”, [
[“address”, “EXCHANGE ADDRESS”],
[“has”, {
what: “output”,
asset: “ID of alternative asset”,
amount_at_least: 1200,
address: “USER ADDRESS”
}]
]]
]]
第一个或条件的含义是用户在任何时候都可以撤销订单,拿回他的 TTT。第二个或条件当满足条件的交易出现后,将 TTT 付给委托交易平台,授权它来花费资金。交易平台会公开发布订单信息,卖家可以查看订单列表,生成一个交换资产交易,并且和交易平台一起签名。
发行量和分发规则
TTT 是 TrustNote 基础代币的简称,单位是 Mega Notes (MN)。
发行总量:1,000,000,000 MN,无增发,500,000,000 MN(占比 50%)为初始分发,投资兑换的方式分发;500,000,000 MN(占比 50%)为公证奖金,可挖矿获得。支持 PoW 挖矿的主链预计于 2018 年 Q4 正式上线,届时用户可以下载和使用挖矿客户端,并申请成为超级节点,通过积极参与主链共识获得公证权,通过发布有效的公证单元获得公证奖励。
公证奖励策略为首年提供总公证奖金的 6.79%,之后公证奖金逐年衰减,衰减情况参见图 7-1。其中,公证奖金的 90%分配给提供有效公证单元的超级节点,公证奖金的 10%分配给基金会,用于社区运维、项目孵化、贡献者奖励等。
TrustME-PoW 共识平均每 5 分钟一轮,每年共约 10 万轮,每轮公证奖金总量 = 公证奖金*90% + 单元公证费。
✓ 第一年,每轮公证奖金约为 323.04 MN;
✓ 第二年,每轮公证奖金约为 262.39 MN;
✓ 第三年,每轮公证奖金约为 232.34 MN。