郭 婧 朱咸軍
(金陵科技學院軟件工程學院 南京 211169)
(guo_jing163@163.com)
近年來,區塊鏈技術發展迅速,區塊鏈作為一個公開的、去中心化的數據庫,作為一個互相驗證的分布式賬本,記錄了所有賬戶發生的所有交易,即在數據庫中將每個賬戶發生每筆數額變化都記錄在內.
區塊鏈作為一個特殊的賬本,首先從基本結構來看,是由區塊構成的交易鏈條[1].區塊由區塊頭以及區塊主體組成,其中:區塊頭包含版本號、該區塊的前一個區塊的哈希值、默克爾樹根數據、難度值、隨機數、時間戳;區塊主體包含了所有交易數據,同時,區塊還有2個關鍵信息需要注意,即區塊的高度、區塊頭信息生成的哈希ID.其中,區塊頭中的版本號可用于更新,該區塊的前一個區塊的哈希值用于該區塊能夠連接并找尋前一個區塊,默克爾樹根數據則將區塊主體中包含的所有交易數據兩兩計算最后得到,難度值可以用于控制區塊生成的時間,隨機數用于讓節點競爭區塊的產生權,時間戳用于記錄區塊產生的時間.區塊主體中記錄的所有交易數據均為交互性交易數據,并且附加記錄交易數據的哈希值.區塊的高度為區塊的序號,說明了區塊的產生編號.區塊頭信息生成的哈希ID可以由下一個區塊進行引用,從而將區塊連成了一個鏈條[1].
事實上,區塊鏈擁有如下幾個典型的特征[2]:
1) 該賬本是可以無限增加的,增加的方法通過在區塊鏈中增加區塊來實現,區塊中記錄了1條或多條交易信息;
2) 賬本中規定了區塊之間的順序,區塊就會被蓋上時間戳,區塊按時間戳的順序連接形成了一個總的賬本,這個總的賬本是作為區塊鏈形式存在的;
3) 區塊鏈是由所有用戶共同維護的,因此是去中心化的.
而現今區塊鏈技術不僅作為賬本技術活躍在與常用技術的結合應用[3-4]中,而其熱度增加的原因之一是與金融技術的廣泛融合,特別是數字貨幣的盛行.而數字貨幣的開端由2008年中本聰發表了一篇論文《比特幣:一種點對點的電子現金系統》[5]開啟.在該文中完整描述了一種產生了數字貨幣的記賬系統及一個競爭記賬的運行模式,數字貨幣則作為挖礦的獎勵,最長區塊鏈作為主鏈,并采用了工作量證明作為共識機制[6].接著,以太坊在比特幣的概念上更進一步,不僅關注了其存儲交易數據的功能,還擴展了開發功能,用戶可以在以太坊上不經許可開發產品,特別是歷史性地應用了虛擬機以及智能合約[7].比特幣作為區塊鏈1.0的代表,是數字貨幣的完整生態系統.以太坊[8]作為區塊鏈2.0的代表,是一種可編程的并在其上生成各種代幣以及開發的系統.而后,區塊鏈3.0開始產生,不僅僅拘泥于金融以及貨幣領域,而是將重點放在區塊鏈與其他技術的跨行業應用上,其中EOS[9]作為一個突出的代表,它大大提高了吞吐量,并創造性地提出了股份授權證明機制[10].這種共識證明方法與以往的共識協議[11-12]有很大的區別,即針對所有擁有代幣的節點,選舉出21個節點進行協作記賬,為了提高區塊確認的速度,提出了拜占庭容錯機制以及不可逆狀態,將區塊進行分割確認,而超過2/3的節點確認后將進入不可逆狀態.現今,區塊鏈4.0也在緊鑼密鼓地開發過程中,雖然很多代幣[13-16]宣稱自己為區塊鏈4.0,但仍缺少其中的代表技術.
無論是比特幣還是以太坊,都存在著記賬效率低、確認速度慢、吞吐量低等突出問題,對于比特幣來說,區塊大小被限制在1 MB.而交易量的增加必然由于區塊的大小而限制區塊的出塊時間以及速度.而在以太坊中,作為一個運轉的網絡,當用戶進行操作時,必然需要支付一定的GAS費用,而GAS費用的限定間接限定了交易處理速度.因此,諸多開發者開始研究多種區塊鏈可擴展性的解決方案,研究方案主要有以下幾種:第1種擴容方案為側鏈,側鏈技術的做法為不僅僅是一條主鏈,同時增加側鏈,可以讓虛擬貨幣安全地從主鏈放到側鏈中,并且也可以從側鏈安全地返回到主鏈中,側鏈中一個典型應用有閃電網絡、RSK[17],在閃電網絡中利用智能合約在鏈下進行零確認,而RSK側鏈既是以太坊圖靈機又是比特幣側鏈;第2種擴容方案為分片,顧名思義,將數據分為更小的數據碎片以方便處理,同時區塊鏈網絡也被分為一個個小的組件式網絡,交易可以由小的組件式網絡處理;第3種擴容方案為DAG,即有向無環圖,其中一個典型的應用為IOTA[18],在IOTA中,節點需要驗證2筆交易,驗證后進行微量的工作量證明,再將自己的交易與這2筆交易綁定,再進行廣播,周而復始節點確認其他的交易,自己的交易也被其他交易所確認,當到達某個設定的臨界值時,交易被完全確定,而其后越來越多的技術采用了DAG技術[19-20].
在上述3種主要擴容方案中,第1種方法除了主鏈還增加了能夠存儲交易的空間,而第2種方法傾向于處理交易組而不是全網集中來處理單個交易,第3種方法同時處理多條交易鏈條,做到高并發.本文針對區塊鏈中的交易表示問題,充分考慮了3種擴充方案的可行性.首先,從交易本身出發,將交易以交易事件的形式呈現.將交易事件定義為改變區塊鏈狀態機中狀態使之發生變遷的事件,將交易事件之間的偏序關系分類.其次,主要對時間的先后關系進行考察,在區塊鏈中時間先后發生的關系限定在指定時間或者指定的時間范圍內.同時對交易事件進行拆分,拆分的目的是將交易事件分配到賬戶上,并且在交易事件上附加轉賬信息或消息.最后,將交易事件、偏序關系、附加的轉賬信息或消息進行圖形化表示,并且根據依賴關系構成新的結構——類與切片,以切片的形式加入根鏈中,實際上既可以并行處理交易事件和整體查找交易事件,也可以以賬戶為單位查找屬于自己的交易事件鏈條,切片以及類的構成也同時使交易的分塊處理成為可能.
從形式化的角度來看,將整個區塊鏈看作一個整體的狀態機,每一個狀態都作為區塊鏈的整體狀態,而區塊鏈的整體狀態由所有區塊鏈上賬戶的個體狀態構成,個體狀態也被稱為賬戶狀態,交易可以改變賬戶狀態,在本文中,賬戶狀態寫作SB,其中,B為賬戶.
定義1.區塊鏈的狀態機[21].區塊鏈的狀態機為一個四元組〈T,S,s0,δ〉,其中T為區塊鏈中所有的交易集合,S為區塊鏈的整體狀態集合,s0∈S為整體狀態集合中的初始狀態,δ:S×T→S表示狀態的變遷由交易集合T中的交易觸發.如果將交易集合看作交易事件集合,即將交易以事件的形式來表示,ET表示交易事件集合,因此,區塊鏈的狀態機也可以寫作〈ET,S,s0,δ〉.

從區塊鏈的狀態機的結構來看,對狀態機的記錄存在2種方向:
常用的記賬方式是基于賬本記賬的,賬戶轉賬的過程為:如果賬戶A需要向賬戶B付20元,由賬戶系統檢查賬戶B是否存在,接著再檢查賬戶A中是否存在20元,如果存在,從賬戶A中減少20元,在賬戶B中增加20元.UTXO模式為比特幣中經典的記賬模式,表示未被花費的輸出,即交易的輸入為其他交易沒有被花費使用完畢的輸出,并且這筆交易來自于其他交易的輸出,其他交易的輸出必須有相應賬戶的私鑰簽名,并且,交易的輸入總數與輸出總數持平.UTXO模式避免了交易的追溯,所有交易在無形中形成了1條鏈,在鏈中將所有交易的輸入與輸出連接在一起,如果當前交易沒有被交易的用戶花費,而被其他用戶花費,可以增加1條記錄轉賬給自己的賬戶.
在交易的基礎上定義賬本,賬本為交易的集合,更確切地說,為在區塊鏈中按照一定的順序排序的交易,所有的交易都存在著一個順序的概念.T為所有的交易集合,從交易集合中選取交易記錄在賬本上,并且按照時間的順序,將賬本L使用Lt來表示,Lt∈2T表示從交易集合T中選取交易加在賬本Lt上,并且按照時間t來排序.如果2個賬本合成,表示為L=L1+L2,L1,L2為2個不同的賬本.


上述單個交易改變單個狀態一般不會發生,一般1個交易都要涉及2個以上的賬戶.將交易集合T分為轉賬交易集合以及合約交易集合,將轉賬交易集合拆分為發送交易集合與接收交易集合,相應地,轉賬交易事件集合拆分為發送交易事件集合以及接收交易事件集合.可以看出,轉賬交易為發送以及接收2個過程,一定金額從1個賬戶發出,而另一個賬戶負責接收這些金額.因此,當轉賬交易被拆分后,單個轉賬交易涉及的賬戶可能只有1個.
另一方面,在區塊鏈中還涉及一類交易事件,該類事件被稱為合約事件集合H,為區塊鏈中的用戶執行合約時需要傳遞消息的過程,轉賬交易涉及的是具體金額,可能以代幣的形式存在,而合約事件為了執行合約,涉及的是消息,而在區塊鏈中,隨著智能合約使用率的提高,當某一條件觸發自動執行設計好的合約,自動執行智能合約的代碼.合約事件集合可以進一步被拆分為合約請求事件集合以及合約響應事件,如果從合約請求事件集合以及合約響應事件中各選取1個事件,當恰好該合約請求事件的響應為另一個合約響應事件,那么這2個事件為1對合約事件.交易事件存在交叉關系以及平行關系:如果交易事件為轉賬事件,并且該轉賬事件與另一個轉賬事件存在轉賬關系,例如轉賬事件的輸入為另一個轉賬事件的輸出,稱2個轉賬事件存在交叉關系;如果交易事件涉及的賬戶為不同的賬戶,那么稱2個交易事件具有平行關系.
在區塊鏈中運用了時間戳的概念,在區塊上打上時間戳,可以看出,區塊鏈與時間息息相關,時間的運用不僅涉及區塊鏈中各種信息的排序問題[22]以及信息之間的時間關系,還涉及了區塊鏈中相關條款的實行.例如在記賬的過程中,涉及首先計算出難度值的那個用戶,獲得記賬權.而時間的判定主要取決于2個方面:第1個方面是事件發生的確切時間點,如果用統一的全局時鐘進行計時,必然存在時鐘的延遲問題以及怎么樣將計時的時間同步,如果用各自的局部時鐘計時,必然存在時間之間的判定關系.第2個方面是事件之間發生時間的先后關系怎樣劃定,確定了事件發生的時間先后關系,才能劃定事件之間的偏序關系,將事件之間有效地組織起來.


時間區間I1與I2之間的并集與交集可寫作:

圖1 交易事件之間的時間區間比較關系
當交易事件為合約事件時,合約事件eH被分為請求合約請求事件eask以及合約響應事件ereq,必須將傳遞消息的時間納入考慮的范圍內,以此對時間進行更新[24].2個請求合約請求事件集合eask以及合約響應事件ereq之間存在先后關系,設eask發生的時間為task,并且發送請求信息m給合約響應事件ereq,并且設合約響應事件ereq接收到請求信息m的時間為treceive,合約響應事件ereq發生的時間為treq,取treceive,treq兩者之中較大的值,將合約響應事件ereq實際發生的時間更新為treq.當eask發生的時間task與合約響應事件ereq發生的時間treq存在task 交易事件偏序的性質: 當交易事件之間的偏序關系判定完畢后,將交易事件的偏序關系使用圖形進行表示,如圖2所示: 圖2 交易事件的嚴格時間偏序關系 圖3 交易事件的寬松時間偏序關系 圖4 交易事件的并行關系 圖5 交易事件的可能并行關系 圖6 交易事件帶有轉賬信息的時間偏序關系 所有交易事件進行分解后,即轉賬交易事件被分為發送交易事件與接收交易事件,合約事件被分為請求合約請求事件以及合約響應事件后,以方便圖形化整體表示,并將交易事件分配到相關賬戶之上.進行交易事件分解的原因為交易事件一般涉及2個以上賬戶,無法分配到單一賬戶之上,交易的整體化圖形化表示如圖7所示: 圖7 交易事件的偏序賬本表示 如果以切片為單位驗證其中的交易,投票選用驗證者來驗證切片中的交易,選用需要隨機抽取用戶進行驗證.用戶可以是在區塊鏈上的所有用戶,也可以是申請驗證的用戶,同時可以對用戶的權限進行限制,如限制申請驗證用戶的代幣數量,并且為了公平,可以將參與切片交易的用戶排除在外,當23的驗證者驗證了切片中的交易,切片中的交易被確認.在對切片進行隱私處理時,可以設置隱私權限,切片中的交易事件只有同一個切片中的交易事件涉及的賬戶在時間段才能有權查看,而被驗證后切片中的交易事件被封裝不可見. 最后,可以以切片為單位,將其加入根鏈中,在加入前必須確認切片中交易事件的完整性、驗證的完整性、驗證者的有效性,切片的先后連接關系以切片中的切片的結束時間或者切片的起始時間連接切片. 在區塊鏈中,由于記錄了用戶的所有交易,所以交易的數量在不斷增加,而不能減少,區塊鏈賬本會越來越龐大,所以迫切需要提高交易的處理速度以及可擴展性.本文以此為出發點,描述了一種區塊鏈中交易表示模型,不僅圍繞交易事件并將其周圍的理論完善,從而完善了交易事件的偏序賬本,增加了能夠并行處理交易以及根據賬戶查看交易兩大優勢,并且在該偏序賬本之上定義類以及切片,以達到將交易事件分批處理的目的,大大增加交易事件處理的效率. 下一步工作主要有:第一,完善交易的批量確認機制,如果高速地、并行地處理大批量的交易,并且進行交易確認,如何將確認的任務分配給節點,并給予獎勵的機制;第二,如何在保障性能、擴展性、安全性的基礎上,定義共識協議,并且保證從交易到共識、節點的權限等一個整體框架的統一性.

3.4 交易事件之間偏序關系的圖形化表示









4 交易的區塊鏈表示框架


5 結束語