白海洋
中國電信股份有限公司江蘇分公司
銷售傭金是企業(yè)為促進業(yè)務(wù)發(fā)展向合作伙伴支付的服務(wù)酬金。傳統(tǒng)運營商傭金結(jié)算系統(tǒng)面向合作伙伴提供銷售傭金按月結(jié)算的出賬服務(wù)。隨著業(yè)務(wù)形態(tài)和營銷模式的不斷發(fā)展,特別是面向個人合作伙伴的營銷激勵方式不斷升級,合作伙伴已不僅僅滿足于月度總賬的準確性,更是對每筆業(yè)務(wù)的結(jié)算進度、結(jié)算依據(jù)查詢提出了更高的要求。此外,防范國有資產(chǎn)流失、加強企業(yè)成本審計監(jiān)管等方面對傭金結(jié)算系統(tǒng)的數(shù)據(jù)存證能力也提出了新的挑戰(zhàn)。
在傳統(tǒng)傭金結(jié)算體系下,由于技術(shù)架構(gòu)等因素制約,存在數(shù)據(jù)可被篡改、計算結(jié)果不透明、計算軌跡難以追溯等問題。具體如下:(1)電子化的歷史信息難以固定,結(jié)算規(guī)則和結(jié)果存在被篡改的可能,給問題核查和審計監(jiān)管帶來一定難度;(2)系統(tǒng)處理過程是一個黑盒,結(jié)算流程不公開透明,計算的可信度難以證明;(3)僅可提供最終結(jié)果,在不結(jié)算狀態(tài)下難以給出結(jié)算軌跡和不結(jié)算原因的追溯查詢。
利用區(qū)塊鏈技術(shù)數(shù)據(jù)不可篡改、智能合約可信計算、歷史信息可追溯等特性設(shè)計本方法,將結(jié)算全流程、全要素數(shù)據(jù)上鏈,設(shè)計結(jié)算智能合約,實現(xiàn)以下效果:(1)上鏈數(shù)據(jù)不可篡改,提升結(jié)算可信度,為審計監(jiān)管提供數(shù)據(jù)存證能力;(2)智能合約自動化結(jié)算批價,提升計算可信度;(3)結(jié)算全流程可追溯,不結(jié)算原因清晰可查。
2009年,中本聰發(fā)表《比特幣:一種點對點的電子現(xiàn)金系統(tǒng)》,一種新型的數(shù)字貨幣體系就此構(gòu)建。隨著比特幣系統(tǒng)的穩(wěn)定運營和比特幣的持續(xù)火爆,其底層區(qū)塊鏈技術(shù)也越來越多的被關(guān)注和認可。區(qū)塊鏈的本質(zhì)是一種去中心化、防篡改的分布式數(shù)據(jù)賬本技術(shù),設(shè)計的初衷是為數(shù)字貨幣提供可信任的網(wǎng)絡(luò)交易環(huán)境。隨著智能合約技術(shù)的誕生,以及以太坊、超級賬本等技術(shù)平臺的日趨成熟,區(qū)塊鏈技術(shù)的適用范圍快速擴大到非金融領(lǐng)域,在多個領(lǐng)域逐漸形成比較成熟的應(yīng)用。本方法即區(qū)塊鏈技術(shù)在營銷傭金結(jié)算領(lǐng)域的具體應(yīng)用。
區(qū)塊鏈技術(shù)并非一項完全新誕生的技術(shù),而是對諸多技術(shù)的有機整合,包含P2P網(wǎng)絡(luò)、密碼學(xué)中的非對稱加密技術(shù)、哈希算法、共識算法、分布式存儲等。以下分別闡述與本方法密切相關(guān)的關(guān)鍵技術(shù)。
加密算法根據(jù)加解密的密鑰是否相同分為對稱加密和非對稱加密。對稱加密技術(shù)的加解密雙方使用相同的密鑰,解決了信息在不安全信道上傳輸安全的問題,但沒有解決密鑰傳輸?shù)陌踩珕栴}。在非對稱加密技術(shù)中,加解密使用不同的密鑰,分為全網(wǎng)可見的公鑰以及僅有本節(jié)點掌握的私鑰。在區(qū)塊鏈網(wǎng)絡(luò)中,通過公私鑰體系解決了信息加密傳輸和數(shù)字簽名兩個問題。信息在區(qū)塊鏈網(wǎng)絡(luò)節(jié)點之間通過密文傳輸,并且每個節(jié)點對于其發(fā)送的交易信息是不可抵賴的。
共識算法致力于解決去中心化的分布式網(wǎng)絡(luò)中各個節(jié)點寫入賬本的信息如何達成一致的問題,是區(qū)塊鏈技術(shù)的核心。區(qū)塊鏈系統(tǒng)中主流的共識算法包括工作量證明(Proof of work,PoW)、股權(quán)證明(Proof of Stake,PoS)和權(quán)威證明(Proof of Authority,PoA)等。比特幣采用PoW共識算法,要求各節(jié)點基于自身算力共同求解一個計算復(fù)雜但驗證容易的數(shù)學(xué)難題,最先提交一個可行解的節(jié)點獲得本次的記賬權(quán),并獲得比特幣的激勵。在PoS系統(tǒng)中,持有最多數(shù)字貨幣而非最高算力的節(jié)點具有最大概率打包下一個區(qū)塊,從而解決PoW需要耗費大量算力的問題。PoA則是一種由指定的權(quán)威節(jié)點產(chǎn)生區(qū)塊的共識機制,所有的權(quán)威節(jié)點地位相同,可以通過投票的方式踢出或加入權(quán)威節(jié)點。以上共識算法在特定的區(qū)塊鏈系統(tǒng)中有著各自的應(yīng)用,但在容錯性和共識效率上,難以滿足商業(yè)應(yīng)用。
實用拜占庭容錯算法(Practical Byzantine Fault Tolerance,PBFT)基于消息傳遞一致性算法,在異步系統(tǒng)中實現(xiàn)信息一致性同步的效率較高,每秒處理交易速度可達上千筆,同時實現(xiàn)1/3節(jié)點的容錯性。
本文使用的魯棒拜占庭容錯算法(Robust Byzantine Fault Tolerance,RBFT)在PBFT基礎(chǔ)上加入主節(jié)點的重新選舉機制和節(jié)點監(jiān)控機制,大大提升了系統(tǒng)的健壯性。
智能合約可以理解為現(xiàn)實合同的鏈上數(shù)字化體現(xiàn),是運行在區(qū)塊鏈上的程序代碼。當滿足合約規(guī)定的條件時,約定的結(jié)果必然執(zhí)行,從而達到公正執(zhí)行和自動追償?shù)饶康摹?/p>
智能合約通常被視為是區(qū)塊鏈技術(shù)2.0的標志,極大擴展了區(qū)塊鏈的應(yīng)用范疇。區(qū)塊鏈上數(shù)據(jù)分布式一致、不可篡改等特性保證了基礎(chǔ)數(shù)據(jù)的公正性,智能合約的引入讓程序的執(zhí)行變得同樣公開透明,提高了計算的可信度。
本方法基于中國電信自主研發(fā)BaaS(Block chain as a service,區(qū)塊鏈即服務(wù))平臺,提供數(shù)據(jù)賬本、共識、P2P網(wǎng)絡(luò)等區(qū)塊鏈核心服務(wù),并在以太坊基礎(chǔ)上提供高級語言的接口封裝,對上層應(yīng)用屏蔽底層區(qū)塊鏈技術(shù)差異。區(qū)塊鏈底層平臺的基礎(chǔ)框架如圖1所示。數(shù)據(jù)層提供分布式賬本的管理能力,非對稱加密算法以及Merkle樹為區(qū)塊節(jié)點打包提供校驗。上層P2P網(wǎng)絡(luò)提供各個節(jié)點間數(shù)據(jù)傳輸?shù)木W(wǎng)絡(luò)環(huán)境。共識層運行本方法設(shè)計的RBFT共識算法。合約層集成以太坊虛擬機,支持Solidity智能合約語言。管理層提供各個節(jié)點的成員管理以及公私鑰的創(chuàng)建和分發(fā)管理功能。接口層封裝了Java等高級語言的API,提供友好的業(yè)務(wù)平臺交互,屏蔽底層區(qū)塊鏈平臺的實現(xiàn)差異。
圖1 本方法基于的區(qū)塊鏈底層平臺架構(gòu)
本方法使用的區(qū)塊結(jié)構(gòu)如圖2所示。區(qū)塊的頭部包含區(qū)塊編號BlockNum、上一個區(qū)塊的哈希值PreviousHash、時間戳TimeStamp、默克爾樹根的結(jié)果MekleTree,及其它輔助頭部信息。區(qū)塊的交易體中保存著經(jīng)過共識的業(yè)務(wù)相關(guān)交易數(shù)據(jù)。本方法中交易數(shù)據(jù)包含三類:銷售業(yè)務(wù)訂單的基礎(chǔ)資料信息、結(jié)算規(guī)則信息、結(jié)算軌跡和結(jié)果信息。三類信息通過不同的智能合約打包成區(qū)塊,寫入?yún)^(qū)塊鏈分布式數(shù)據(jù)賬本。
圖2 本方法的區(qū)塊數(shù)據(jù)模型
本方法基于區(qū)塊鏈技術(shù)提供一種通用的銷售傭金結(jié)算方法。通過共識算法保證數(shù)據(jù)的分布式一致和不可篡改,實現(xiàn)關(guān)鍵數(shù)據(jù)的鏈上存證,并提供結(jié)算過程的追溯查詢。通過智能合約實現(xiàn)區(qū)塊鏈上的可信計算。
本方法利用區(qū)塊鏈中聯(lián)盟鏈技術(shù),加入的計算節(jié)點由認證中心CA進行授權(quán),并頒布數(shù)字證書。任一節(jié)點可接收客戶端發(fā)送的請求,通過冗余拜占庭共識算法(RBFT),將結(jié)算規(guī)則、結(jié)算依據(jù)、結(jié)算過程、結(jié)算結(jié)果等結(jié)算全流程、全要素數(shù)據(jù)在區(qū)塊鏈各節(jié)點間達成共識,并記錄到各節(jié)點的數(shù)據(jù)賬本中,保證了各賬本的一致性和不可篡改,實現(xiàn)數(shù)據(jù)的上鏈存證。上鏈的數(shù)據(jù)具有嚴格的時間排序,根據(jù)交易流水可進行結(jié)算過程的追溯查詢。
本方法利用區(qū)塊鏈的智能合約技術(shù),組織關(guān)鍵數(shù)據(jù)寫入?yún)^(qū)塊鏈并通過智能合約執(zhí)行自動化結(jié)算,步驟如圖3所示。
圖3 本方法核心處理流程
步驟1:數(shù)據(jù)采集和預(yù)處理。在各個相關(guān)源系統(tǒng)側(cè)建立區(qū)塊鏈節(jié)點,采集結(jié)算所需的規(guī)則數(shù)據(jù)、店員(即合作營銷人)基礎(chǔ)資料數(shù)據(jù)、報單(提交銷量信息稱之為報單)基礎(chǔ)資料數(shù)據(jù)、銷售產(chǎn)品的相關(guān)訂購和狀態(tài)數(shù)據(jù)等,并進行格式、閾值等必要的預(yù)處理操作。
步驟2:數(shù)據(jù)共識上鏈。區(qū)塊鏈平臺通過共識算法將結(jié)算資料寫入?yún)^(qū)塊鏈各個節(jié)點的數(shù)據(jù)賬本。在各節(jié)點的數(shù)據(jù)賬本中,將保留全網(wǎng)一致的完整的結(jié)算基礎(chǔ)資料數(shù)據(jù),不可篡改的基礎(chǔ)數(shù)據(jù)一方面對數(shù)據(jù)進行了固定,達到存證效果,另一方面為后續(xù)批價計算提供了數(shù)據(jù)輸入。
步驟3:智能合約批價計算。報單觸發(fā)結(jié)算智能合約的計算,根據(jù)結(jié)算規(guī)則逐條匹配結(jié)算資料,結(jié)算出清單或錯單,將結(jié)算結(jié)果和結(jié)算軌跡輸出到區(qū)塊鏈賬本中。
步驟4:計算軌跡追溯查詢。通過讀鏈的智能合約獲取區(qū)塊上的歷史版本的數(shù)據(jù),提供獎勵結(jié)算的追溯查詢。
結(jié)算系統(tǒng)及其它源系統(tǒng)節(jié)點根據(jù)店員報單,采集結(jié)算規(guī)則和結(jié)算所需基礎(chǔ)資料,通過上鏈合約UploadContract,經(jīng)過共識算法寫入?yún)^(qū)塊鏈分布式賬本?;顒右?guī)則計算合約SettleContract以報單為維度,實現(xiàn)規(guī)則和資料的匹配計算,并詳實地將每條計算軌跡記錄上鏈。當滿足結(jié)算條件時,輸出該報單的結(jié)算結(jié)果;當未匹配到任何規(guī)則,可完整追溯查詢本報單的計算軌跡,定位到具體不符合條件的結(jié)算因子(結(jié)算規(guī)則的基礎(chǔ)單元),提供不結(jié)算原因查詢。鏈上數(shù)據(jù)查詢合約QueryContract根據(jù)交易哈希定位到具體區(qū)塊,并獲取區(qū)塊體中的交易數(shù)據(jù),作為鏈上數(shù)據(jù)的輸出。業(yè)務(wù)系統(tǒng)將根據(jù)報單ID等信息串聯(lián)起一個報單在鏈上的全生命周期,提供追溯查詢功能。
本方法以訂單和規(guī)則兩個維度組織資料上鏈以及提供智能合約計算。報單提交動作和規(guī)則變更動作均可觸發(fā)系統(tǒng)狀態(tài)轉(zhuǎn)移。如圖4所示。
圖4 結(jié)算處理過程中的狀態(tài)轉(zhuǎn)移
詳細步驟描述如下:(1)報單提交進入初始狀態(tài)S1;(2)S1->S3完成了報單及相關(guān)資料的解析上鏈;(3)對于需要匹配產(chǎn)品激活信息以及終端激活信息的報單,需完成S4、S5狀態(tài),才會進行下一步狀態(tài)轉(zhuǎn)移;(4)當活動或規(guī)則信息變更,狀態(tài)位為S2;(5)S2->S6完成了活動或規(guī)則數(shù)據(jù)的解析上鏈;(6)當S3、S6均處于就位狀態(tài)時,訂單的處理可前進到S7狀態(tài);(7)對于有延遲匹配條件的活動,智能合約會循環(huán)匹配,S7->S8循環(huán)匹配直至所有條件匹配完成或達到最大匹配次數(shù);(8)S7->S9,結(jié)算結(jié)果輸出至區(qū)塊鏈;(9)S9->S10,進入終止態(tài),該報單的所有結(jié)算流程狀態(tài)結(jié)束。
定義一個五元組〈Action,Source,Info,Dest〉σi,各元素作用描述如表1所示。其中,信息可以在本步驟中僅產(chǎn)生計算而不產(chǎn)生傳播,故Dest為非必要元素。
表1 RBFT共識算法五元組的含義說明
如圖5所示,分區(qū)節(jié)點間共識及寫入?yún)^(qū)塊的步驟如下:
圖5 本方法采用的共識算法信息計算和傳播步驟
步驟1:由認證管理中心CA為準入的區(qū)塊鏈節(jié)點頒發(fā)數(shù)字證書:〈Authentication,CA,ca,i〉σ,并廣播公鑰給其他節(jié)點:〈Broadcast,i,ca,all〉σi。
步驟2:〈Transcation,c,rid,any〉σc,客戶端client向任一準入節(jié)點發(fā)送數(shù)據(jù)請求,請求消息編碼為rid,以client的私鑰加密。接收節(jié)點s對接收到的信息使用client的公鑰進行MAC(Message Authentication Code,消息認證碼)認證,確保數(shù)據(jù)沒有被篡改,且通過私鑰加密——公鑰解密的認證實現(xiàn)了數(shù)字簽名,即數(shù)據(jù)由client節(jié)點產(chǎn)生是不可否認的。通過MAC認證才執(zhí)行下一環(huán)節(jié)。
步驟3:〈Broadcast,s,rid,all〉σs,接收節(jié)點s將數(shù)據(jù)廣播給其他所有節(jié)點,并以s節(jié)點的私鑰加密。
步驟4:〈Sort,pr,rid〉,主節(jié)點Primary對s節(jié)點廣播的數(shù)據(jù)進行MAC校驗通過后,對數(shù)據(jù)進行打包排序操作,形成Prepare消息,并發(fā)送給其他所有節(jié)點,〈PrePrepare,pr,Prerid,all〉σpr。
步驟5:其他節(jié)點i接收到主節(jié)點的打包排序結(jié)果后,利用步驟3獲得的rid的消息,打包排序并與主節(jié)點發(fā)送的Prepare消息做比對。校驗通過形成本節(jié)點的Prepare消息,向其他所有節(jié)點廣播校驗結(jié)果〈Prepare,i,Prerid,all〉σi。
步驟6:當節(jié)點收到quorum(quorum=(N+1)/2,N為節(jié)點總個數(shù))個節(jié)點的Prepare消息,開始驗證區(qū)塊,并將驗證結(jié)果與步驟4主節(jié)點發(fā)送的Prepare信息進行比對,均通過則進入提交環(huán)節(jié)。
步驟7:提交環(huán)節(jié),當節(jié)點接收到quorum個節(jié)點的確認應(yīng)答信息,即quorum節(jié)點之間已經(jīng)達成共識,則認為客戶端發(fā)送的消息得到了多數(shù)節(jié)點的認可,將其寫入本節(jié)點的賬本:〈Commit,i,rid〉σi。
步驟8:節(jié)點記賬完成,分別給客戶端做應(yīng)答,〈Reply,i,Rprid,c〉σi。
通過以上步驟,客戶端的發(fā)送數(shù)據(jù)在區(qū)塊鏈的各個節(jié)點間達成交易共識,并記錄在所有節(jié)點的賬本上。
當3.1節(jié)步驟4中的主節(jié)點失效或性能產(chǎn)生較大劣化時,監(jiān)控節(jié)點會發(fā)起主節(jié)點重新選舉,指定新的主節(jié)點,從而提高系統(tǒng)整體的魯棒性。如圖6所示。
圖6 主節(jié)點重新選取選用的時延段示意圖
主節(jié)點PrimaryNode重新選舉的執(zhí)行算法描述如下:
步驟1:監(jiān)控節(jié)點MonitorNode的產(chǎn) 生,Monitor Node=(PremaryNode+1)%N。
MonitorNode為監(jiān)控節(jié)點編號,N為總活躍節(jié)點數(shù),PrimaryNode為當前主節(jié)點編號。各個活躍節(jié)點的編號從1開始。
步驟2:采集PrimaryNode到MonitorNode的時延Δp。
步驟3:判斷Δp是否超安全時延閾值threshold,Check(Δp)>threshold
其中threshold閾值可根據(jù)網(wǎng)絡(luò)狀況不同配置調(diào)節(jié),建議值為500ms。
步驟4:當條件3滿足時,進行主節(jié)點選舉。
步驟5:節(jié)點恢復(fù)和重新產(chǎn)生MonitorNode。
當監(jiān)控節(jié)點重新選舉出主節(jié)點,通過廣播形式通知其它各個節(jié)點,重新建立P2P連接。連接恢復(fù)后,按照步驟1中的MonitorNode節(jié)點產(chǎn)生方法,重新確認監(jiān)控節(jié)點行使監(jiān)控職責(zé)。
被監(jiān)控節(jié)點剔除的PrimaryNode原則上不重新加入?yún)^(qū)塊鏈網(wǎng)絡(luò),發(fā)送告警由運維人員對其性能和網(wǎng)絡(luò)狀況進行分析。此外,根據(jù)各個節(jié)點Δo的統(tǒng)計平均值,MonitorNode還承擔(dān)著對非PrimaryNode的心跳探測功能,當某節(jié)點Δo的近c次平均值超過設(shè)定的門限值,主動觸發(fā)告警。
該算法可動態(tài)監(jiān)控區(qū)塊鏈網(wǎng)絡(luò)中各節(jié)點的工作情況,當主節(jié)點計算能力和網(wǎng)絡(luò)時延劣化到一定程度,由監(jiān)控節(jié)點重新選舉出新的主節(jié)點。當非主節(jié)點的心跳探測超過閾值,也將觸發(fā)告警。對提升基于拜占庭算法的區(qū)塊鏈網(wǎng)絡(luò)的魯棒性提供了解決方法。
本方法已在“江蘇電信區(qū)塊鏈一線激勵結(jié)算平臺”上應(yīng)用實現(xiàn),為合作伙伴提供基于區(qū)塊鏈的實時結(jié)算服務(wù)和友好的查詢界面,并實現(xiàn)了全省一線激勵傭金數(shù)據(jù)的存證監(jiān)管。經(jīng)壓力測試,本系統(tǒng)的區(qū)塊鏈交易速率可超過3000TPS,滿足應(yīng)用推廣需求。
利用區(qū)塊鏈技術(shù)數(shù)據(jù)不可篡改、智能合約可信計算、歷史可追溯等特點,基于區(qū)塊鏈技術(shù)設(shè)計了通用的銷售傭金結(jié)算方法。該方法實現(xiàn)結(jié)算全流程、全要素數(shù)據(jù)通過共識算法寫入?yún)^(qū)塊鏈分布式賬本,設(shè)計結(jié)算批價智能合約實現(xiàn)關(guān)鍵的鏈上結(jié)算批價功能,通過歷史追溯查詢提供結(jié)算計算流程和不結(jié)算原因的清晰查詢,解決了結(jié)算過程不透明、歷史信息存證難等問題。在實用拜占庭容錯算法(PBFT)的基礎(chǔ)上,該方法的共識算法對其魯棒性進行了改進,加入了主節(jié)點主動監(jiān)控恢復(fù)等機制,提升系統(tǒng)的可用性。
基于本方法實現(xiàn)的江蘇電信區(qū)塊鏈一線激勵結(jié)算平臺在江蘇全省落地應(yīng)用,為全省店員提供清晰明了的實時結(jié)算服務(wù),并在加強數(shù)據(jù)存證監(jiān)管方面起到了較好效果。