◆陸昉
(天津海關 天津 300041)
跨境貿易業務涵蓋了國內外的生產商、貿易商、物流商、金融機構、政府監管部門等眾多的參與方,涉及物流鏈、資金鏈、數據鏈的跨境管理,是區塊鏈智能合約的重要應用領域。在跨境貿易領域,智能合約的自動化執行會推動各參與方業務數據的協同共享,實現參與方物權、資金的跨境轉移交付,因此智能合約的安全管理尤為重要。這就需要我們從智能合約構建應用的全生命周期開展安全管控的研究,形成智能合約應用的安全規范,為跨境貿易區塊鏈健康有序發展奠定安全管理的基石。
“智能合約”(Smart contract)不是一個新的概念,這個術語至少可以追溯到1995 年,是由跨領域的法律學者尼克·薩博(Nick Szabo)提出來的。他將智能合約定義為“是一套以數字形式定義的承諾(commitment),包括合約參與方可以在上面執行這些承諾的協議。”本質上來說,智能合約是一段程序,它以計算機指令的方式實現了傳統合約的自動化處理。智能合約的工作理論遲遲沒有實現,一個重要原因是因為缺乏能夠支持可編程合約的數字系統和技術。直到2008年區塊鏈技術的出現解決了該問題,區塊鏈技術不僅可以支持可編程合約,而且具有去中心化、不可篡改、過程透明、可追溯等特點,完美的契合于智能合約的需求,因此隨著區塊鏈技術應用的日益普及,智能合約備受關注。
智能合約是一段無須中介、可自我驗證、自動執行的計算機程序。在部署智能合約之前,與合約相關的所有條款的邏輯流程就已經通過代碼被制定好了,智能合約通常具有一個用戶接口(interface),以供用戶與已制定的合約進行交互,這些交互行為都會嚴格遵守此前制定的邏輯[1]。與傳統的合約相比,區塊鏈智能合約具有以下特點與優勢:
(1)去中心化權威:智能合約不需要中心化的權威來仲裁合約是否按規定執行,合約的監督和仲裁都由計算機來完成,最大限度地減少對第三方的依賴。
(2)不可篡改:在智能合約部署之后,合約的所有內容都將無法修改,合約中的任何一方都不能干預合約的執行,最大限度地減少惡意和偶然的異常,避免人為干預的風險。
(3)更經濟高效:由于智能合約的執行不需要第三方權威或中心化代理服務的參與,因此能夠在任何時候響應用戶的請求,大大提升了交易進行的效率;其去人為干預的特點,也能夠大大減少合約履行、裁決和強制執行所產生的人力成本。
智能合約與傳統編程在信息使用和商業安全方面存在很大不同。在跨境貿易領域主要體現在如下方面:
(1)智能合約在跨境貿易領域承擔了主要的商業邏輯,其商業邏輯執行于包括跨境貿易企業、金融機構以及政府監管部門在內的核心應用場景,無論是商業機密性還是數據安全性對企業、金融機構以及政府部門的重要性都不言而喻,任何泄露數據風險以及智能合約本身安全的風險都會破壞整個聯盟鏈運行的基礎。
(2)智能合約在聯盟鏈上的部署是有共識的,達成一致的。跨境貿易中的智能合約必須在合約設計過程中、編碼實現過程中把容錯與異常終止邏輯設計和實現到合約中,并且跨境貿易在智能合約存在安全漏洞的處理機制也需要由聯盟各參與方通過聯盟約定方式進行補充處理,以免造成商業層面或者更大的政府層面的安全風險。
(3)需要建立智能合約的安全編程模式。需要智能合約的安全的編程規范,進一步在隱私保護、審計和留痕上去消除各類安全隱患。
隨著跨境貿易聯盟鏈參與方的增多和業務鏈條的加長,由于商業利益或者政策驅動有可能會出現參與方或節點的惡意行為,在智能合約層對開放性部署的智能合約進行商業隱私數據的竊取、合約篡改等不當攻擊。另外智能合約代碼目前尚不成熟,智能合約在實際應用過程中難以避免會出現各類安全漏洞。因此跨境貿易聯盟鏈會對智能合約部署應用的安全提出更高的要求。
在智能合約設計時要考慮:
(1)智能合約必須規劃設計參與者可接觸的是完整信息、還是部分信息,或者無法訪問信息。這些權限必須在智能合約中通過代碼注明。
(2)跨境貿易區塊鏈中若智能合約邏輯中需要有監管者參與,那么監管者訪問數據的權限限定以及范圍也需要在智能合約中實現。
(3)隱私數據的可訪問范圍性質是靜態還是動態的,如何在智能合約中引入加密參數,對新參與者的數據訪問和共享機制進行設計。
(1)智能合約的動態特性引起的審計分析挑戰
智能合約的動態特性有很多,如調用了非確定的系統函數、調用了外部系統非確定性的數據來源、動態調用(運行時決定執行目標)。設計智能合約時盡量避免使用其動態特性,否則一旦破壞了系統的一致性,那么會增加定位問題的難度,在這種情況下難以判斷故障的根本原因。
(2)停機問題與資源控制的挑戰
智能合約必須是可終止的合約,否則會無限占用時間和資源。停機問題(halting problem)[3]是邏輯數學中可計算性理論的一個問題。通俗地說,停機問題就是判斷任意程序是否能在有限的時間之內結束運行的問題。區塊鏈上的智能合約必須是可終止的,否則將會消耗無限的時間和資源。停機問題是不好預判的,我們無法在不運行一個程序的情況下,提前判定該程序是否會停機。因此,在審計時,審計者和安全專家必須判斷區塊鏈的設計者是否考慮到智能合約可能會進入死循環,并對可能已經進入死循環的合約采用資源控制的方式來結束智能合約。對于停機問題與資源控制所面臨的挑戰,需要智能合約審計者去判斷是否采用了合適的處理策略。
(1)以客戶為中心,簡化智能合約的設計
簡化智能合約的復雜度,可以提升安全性。我們要以客戶為中心,通過協調業務和安全的關系,盡量簡化智能合約的復雜度,將復雜的合約拆成多個簡單的合約,減少復雜性造成的風險控制障礙。
(2)安全策略透明化、簡單化、便于擴展
智能合約在安全策略上需要減少人工處理量,通過減少人工處理安全風險需耗費的時間,來匹配可快速擴展的業務,以達到解決安全問題的目標。將安全策略透明化、簡單化,發展自動化工具,進行自動化的風險決策判斷,以便所有跨境貿易區塊鏈參與方都能夠快速實施安全策略,并持續改進安全策略。
(3)嚴格執行智能合約代碼審查
智能合約如同現實生活中的賬本合同一樣,需要經過多次、嚴格的代碼審查,包括業務流程審查、代碼動態運行審查、測試流程審查、安全性審查、專家評審等。對于復雜且涉及較大資金的智能合約要盡可能的進行更加嚴格的代碼審查工作,通過多種方式驗證智能合約的正確性。
(4)形成可參考的標準規范
跨境貿易區塊鏈聯盟需要為區塊鏈各參與方提供一個可參考的智能合約安全標準規范,幫助智能合約的編寫者、應用方、管理者開展智能合約安全管控。
(1)智能合約規劃設計階段
智能合約設計人員和安全人員對需求和安全風險進行溝通確認,使用建模語言對智能合約進行建模,建模需與智能合約各參與方進行反復溝通確認,完成初步設計階段。
(2)智能合約代碼編寫階段
智能合約代碼編寫階段,需要有專業的智能合約編寫人員參考智能合約安全規范進行編寫,使用智能合約審計工具進行漏洞分析,進行初步的審計。
(3)智能合約代碼審計階段
智能合約發布前進行一次完整的代碼審計,并保證經完整審計的代碼是用戶最終使用的智能合約版本。
(4)智能合約業務測試階段
智能合約測試人員將智能合約在測試鏈上部署,并完成智能合約的測試,如邊界測試、漏洞攻擊、業務邏輯測試,測試人員需與業務和安全專家對測試邊界進行設定,給出測試結果和安全分析結果,由審計專家和安全專家給出一份審計報告。
(5)安全測試和審計報告發給智能合約參與方
報告內容包括漏洞攻擊測試情況,合約存在的直接和潛在的漏洞細節,合約產生漏洞后如何響應、停止、更換。在智能合約代碼層面報告也可給出此智能合約的通用性,即合約的場景可復用性,給出此智能合約是否可被其他智能合約所調用。開發團隊應對審計報告中提到的“關鍵”或“重要”評級的漏洞予以修復,并將修復情況報送智能合約各參與方。智能合約各參與方對合約審計報告以及漏洞修復情況達成共識予以認可后,智能合約完成開發具備發布條件。
(1)智能合約需規范所有權
在跨境貿易鏈領域,智能合約需規范所有權,通過數字證書方式,明確當前智能合約的所有權。通過規范明確標記函數和狀態變量的可見性,如函數和狀態變量的可訪問控制權限,明確誰可以調用執行該合約、以及誰可以訪問智能合約中的變量。
(2)智能合約外部調用規范
在跨境貿易領域中,不可避免某些智能合約會使用外部調用,所有的外部調用需要可信任可依賴的數據源。外部調用規范,應盡可能謹慎,每個外部調用都應設定為潛在安全風險。在智能合約設計時,需要設計外部調用源的安全風險級別,外部調用源產生結果數據后,安全風險級別數據信息應設定到產生的結果中,以便審計和留痕時使用。
處理外部調用錯誤,盡量確保能檢查返回值,如采用正則匹配或者模式驗證方式,來處理調用失敗的返回值,在合約代碼上應考慮每種調用失敗可能性的處理方式。
調用規范約定不能用外部調用返回值作控制流的判斷邏輯。由于外部調用的結果不確定以及不安全性,在關鍵的判斷邏輯上不應采用外部調用函數的結果做邏輯判斷值,避免產生類似雙重攻擊風險。
對依賴外部調用資源的智能合約的輸入、輸出都要有留痕、審計等操作設計,如果是與金融相關場景,智能合約的應用層需提供回滾和補償機制,來保證調用異常漏洞不會影響聯盟鏈的正常運轉。
跨境貿易區塊鏈在智能合約層需要對可重入攻擊的資源做嚴格的訪問控制,確保智能合約有可重入限制,以此來避免此類漏洞安全問題。
(3)標記不可信合約和快速失敗原則的規范
在智能合約代碼層面上,命名函數等標識需滿足合約編碼的規范性,當與外部合約進行交互時,在代碼層面上,需要在變量、方法和合約接口上進行命名規范,對審計不確定的外部合約以及外部依賴,需要采用如"untrust"字串進行標識[5],明確標識與這些數據或智能合約交互時有潛在的安全風險。
快速失敗原則[4]是指在智能合約的核心邏輯在執行前,需要檢查合約的輸入數據,若數據不滿足智能合約校驗規則,需快速返回失敗結果,避免在智能合約的執行過程中產生異常。快速失敗原則可以減少智能合約的執行時間,避免未知異常產生的堆棧溢出風險。設計時應考慮數據檢驗失敗后,是否需要使用一個默認值,使合約繼續執行;或者盡快捕獲失敗的執行(區塊鏈腳本語言一般通過try,catch 語法機制,快讀定位捕獲失敗原因),避免不穩定不一致的狀態影響其他狀態和其他調用者。
(4)智能合約調用順序規范
智能合約可能存在調用多個函數、多個智能合約的情況,此種情況可能存在依賴順序問題。應當先完成函數內部工作,再調用外部函數。
另外,部分智能合約通過鎖機制(腳本語言的語法,互斥鎖可以鎖定某一代碼塊,通過鎖來保護資源的訪問權限),去解決多智能合約依賴調用問題。
(5)智能合約交易順序規范
智能合約執行過程中處理交易可能會隨著不同的交易順序而產生截然不同的狀態,不同的交易狀態導致不同的輸出結果。這種智能合約問題被稱為交易順序依賴合約,惡意的參與方可故意改變智能合約的執行順序、操縱智能合約的合法性。因此跨境貿易區塊鏈智能合約在設計時,要嚴格設計和驗證交易順序的確定性。
(6)時間戳校驗規范
智能合約若依賴當前區塊的時間戳或者根據時間戳來提供隨機數,則當各網絡節點的時間戳存在偏差時,智能合約的執行結果會有所差別。攻擊者可以通過操作區塊鏈節點的時間戳,去改變智能合約執行結果,使結果對自己有利。因此跨境貿易區塊鏈智能合約中若依賴時間戳,合約層面上需做時間戳范圍校驗,需多方在時間戳的時間范圍上達到共識,才可繼續執行依賴此時間戳的智能合約,否則在智能合約上予以放棄執行。
(7)回退、容錯和終止編程規范
智能合約與傳統編程不同,所有的智能合約在設計編碼過程中需要將容錯和異常終止邏輯寫進智能合約里面。
保持智能合約在回退時,盡可能簡單。需設計每個智能合約的回退功能,回退函數必須包含記錄回退動作的事件。如需要更復雜的回退功能,需經過測試評估,避免回退功能過于復雜。
智能合約代碼設計和實現過程需要考慮邊界條件,對智能合約運行過程中最糟糕情況做好準備。如果智能合約存在漏洞,規范恢復方法和流程,使智能合約盡快安全恢復,在跨境貿易領域的容錯方案為,任何一個智能合約需要一個備用方案,備用方案需要滿足智能合約存在漏洞時的緊急處理。
至于容錯,可采用停止合約機制,合約管理者可以采用凍結方式作為一種應急機制。在停止合約方式下,需采用線下或合約修正方式對業務邏輯進行補償。
對于停止合約,可采用信任方提供揭發熔斷的機制或者編程自動觸發停止合約。
(8)升級或修復智能合約的規范
升級或改進合約時,需考慮合約影響的節點,需要考慮如何處理合約數據,如舊合約與新合約共用相同數據,在舊合約和新合約并行一段時間后,關閉廢止舊合約。
智能合約安全審計機制包括代碼安全審計工具、存證流程及執行記錄。跨境貿易區塊鏈智能合約,可采用如超級賬本Hyperledger Fabric 分布式賬本解決方案。Hyperledger Fabric 智能合約被稱為chaincode,當一個區塊鏈外部的一個應用程序需要訪問賬本時,就會調用chaincode。chaincode 可通過多種不同編程語言實現。目前支持chaincode 的語言是Go 以及Java。
4.5.1 智能合約的身份管理
智能合約身份管理可以采用一個中心化的身份管理系統,中心化的身份管理系統應具有如下功能:
(1)身份認證,如LDAP 中注冊信息;
(2)發行擔保證書;
(3)發行交易證書,保障跨境貿易區塊鏈平臺交易信息的安全性;
(4)證書支持更新和撤銷。
4.5.2 訪問控制
(1)跨境貿易可分為不同的場景,每個場景下可有多個智能合約,不同場景使用通道進行隔離,每個通道只允許一部分已經授權的參與者查看該通道的智能合約代碼以及智能合約交易數據。
(2)在通道內,使用可見性等方式,限制可見性的粒度控制
4.5.3 數據隱私
(1)跨境貿易區塊鏈智能合約處理的中間數據和結果需要通過加密方式進行上鏈存儲。
(2)在鏈上存儲介質中的數據需要采用國密算法進行加密,來保證數據的安全性。
在跨境貿易區塊鏈中,智能合約數字資產需提供多維度立體的保護機制,可參考如下幾點:
(1)通過區塊鏈技術本身保證數字資產安全。區塊鏈本身數據加密技術以及鏈式結構,哈希樹等結構,保證數據的可追溯和不可篡改。
(2)在跨境貿易區塊鏈領域通過存證合約的存在,保證數字資產在發生爭議時可取證和可仲裁去解決數字資產的安全問題。
(3)持續監測和預警。數字資產在區塊鏈智能合約中運行,對交易行為持續的監控與快速預警機制,將保障數字資產在遭受攻擊或出現漏洞時盡早發現避免產生大規模損失[6]。
(4)智能合約本身的暫停和更新機制,以及限定范圍等策略,保證數字資產在出現緊急情況下,能有緊急的方式采取制動止損方式。
智能合約執行應用周期安全機制包括:
(1)智能合約的初始化和安裝安全機制。智能合約在編碼完成后,被上傳到跨境貿易區塊鏈網絡上,通過隱私機制,智能合約同步給智能合約對應的參與者,安裝到相應的多個節點上。
(2)智能合約會定期檢查智能合約自動執行的觸發事件和觸發條件,滿足條件的事件將會推送到待驗證的隊列中
(3)驗證節點對事件進行簽名,確保合約有效性;等大多數節點達成共識后,智能合約將成功執行,并通知用戶
(4)與此同時,存證合約會異步的記錄智能合約產生的影響,以及地址記錄。
(5)成功執行的智能合約將移出區塊。而未執行的智能合約則繼續等待下一輪處理。
智能合約作為在區塊鏈上自動運行的程序,其主要功能是通過區塊鏈的共識和同步機制,加工處理區塊鏈網絡各個節點上的不同數據,并將加工處理之后的數據或新產生的數據寫入區塊鏈網絡。智能合約在具體應用場景中提供業務服務,會受到現有法律法規的制約,也會面臨法律上的一些挑戰。
例如對于公開的區塊鏈服務,國家網信辦和公安部都在各自的職責范圍內對違反網絡信息內容安全的行為進行重點整治。這就要求了區塊鏈信息服務的提供者應采取有效的措施,對上鏈信息的內容安全進行嚴格管控。具體來說,這就要求智能合約應當擁有敏感詞過濾的功能,智能合約在向區塊鏈上新增數據時一旦發現有敏感詞,既當作為上鏈失敗來處理。
從現有法律的角度來說,也不能將“智能合約”完全等同于真正的商業合同,兩者不具備同等的法律效力。一是智能合約本質上是程序代碼,在程序的實施過程中,可能會出現人為有意或無意的偏差、漏洞和錯誤,例如驗證數據時未考慮數據源缺失的異常情況等。二是在智能合約的程序執行過程中,并非所有的區塊鏈技術都會將智能合約安裝、升級、執行的審計記錄,以及智能合約進行數據處理過程中的日志、痕跡、數據狀態的變更,在系統中進行保留。這也對日后遇到糾紛時的取證帶來了麻煩。三是針對智能合約產生的法律糾紛的管轄及適用法律仍不明確,有關智能合約的糾紛是否能直接適用中國的《合同法》,尚未有明確的定論。
首先,對區塊鏈上共享、共用的數據,應當遵循所有區塊鏈網絡主要參與方所在地的商業和個人的數據隱私保護法律法規,并滿足跨境數據傳輸的合規要求。
其次,運行在區塊鏈網絡上的智能合約,在遵循相關法律法規的框架下,通過程序方式實現了普通商業合同中的條款的自動化執行,并通過了智能合約的安全檢測,留存全面的程序變更和數據變更記錄,應當認可其和被其映射的普通商業合同具備同等的法律效力。
最后,完善解決智能合約糾紛的法律法規。對智能合約產生糾紛之后,如何取證、如何解決爭議,應當制定全面的法律框架、規定和解釋,這樣將可以有針對性地加強智能合約的安全審計、日志留痕等功能。
本文通過聚焦跨境貿易領域的業務場景,以區塊鏈智能合約相關技術為基礎,列舉了區塊鏈智能合約技術在該領域中的安全挑戰,結合業務場景提煉出了覆蓋智能合約全生命周期的安全機制,為在跨境貿易領域區塊鏈智能合約的安全應用進行了有益的探索和研究。
未來,我們相信隨著區塊鏈智能合約安全技術的繼續發展、逐漸成熟,配套法律體系的不斷完善,以智能合約為驅動的跨境貿易將會更加便捷高效,更加安全可信。