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。
評論
查看更多