1. 程式人生 > >安全多方計算(MPC)從入門到精通:JUGO-IDE及SDK

安全多方計算(MPC)從入門到精通:JUGO-IDE及SDK

限制 異常 側邊欄 錯誤信息 工作目錄 exp png 文件內容 則表達式

簡介:在上一節《安全多方計算(MPC)從入門到精通:Frutta語言》中,已經介紹了Frutta語言語法相關的內容,在本節中,我們將介紹JUGO-IDE及SDK。
1.什麽是JUGO-IDE
  JUGO-IDE是JUGO技術產品面向開發者提供的用來編寫MPC算法的開發工具,結合Frutta谷歌瀏覽器插件,開發者無需搭建任何環境就可以快速編寫、編譯、運行和發布算法。
  通過使用JUGO-IDE,開發者可使用Frutta語言編寫算法,並通過JUGO-IDE編譯成可在JUGO技術產品上執行的電路文件和java模板文件。
2.支持語言
  Frutta語言。
  Frutta作為類C的高級語言,可以將編寫的計算邏輯在JUGO-IDE生成電路文件和java模板文件,並在JUGO技術產品中執行計算。
3.開發環境
  操作系統windows(後續支持linux),chrome瀏覽器(需先安裝Frutta谷歌瀏覽器插件)
  第一步,請下載Frutta谷歌瀏覽器插件的安裝包
  第二步,在Chrome瀏覽器中啟用開發者模式,然後點擊按鈕“加載已解壓的擴展程序”,選擇插件所在的文件夾即可。
註意:由於該插件暫未上傳Google插件商店,所以只能以開發者模式運行。開啟開發者模式,由於是以開發者模式運行該插件的,Chrome瀏覽器會彈出“請停用以開發者模式運行的擴展程序”的提示,此時點擊“取消”才可以繼續使用Frutta谷歌瀏覽器插件。
技術分享圖片
一、界面
1.啟動頁

1)JUGO-IDE啟動頁默認包含一個歡迎頁和一個算法工程,開發者可根據需要進行增刪。
2)開發者在未登錄JUGO技術產品的情況下首次進入JUGO-IDE啟動頁的時候,即會自動彈出登錄彈窗,提供了登錄、忘記密碼、註冊等功能入口。開發者登錄後才可以使用JUGO-IDE提供的訪問算法庫、發布算法的功能。當然,開發者也可以點擊“暫不登錄”關閉該登錄彈窗繼續使用MPC-IDE,不會對工程編譯等功能造成影響。
3)JUGO-IDE啟動時,編輯區默認打開JUGO-IDE歡迎頁,該頁面中提供了JUGO-IDE、Frutta、JUGO技術產品、MPC的簡單介紹和詳情頁面鏈接,開發者可以點擊“詳情”去往詳情頁面進行深入了解。
技術分享圖片
2.菜單欄
1)文件管理
  功能描述:提供“新建工程、新建文件、導入本地文件、導出到本地、保存當前文件、保存所有文件、刪除當前文件”等功能。
  操作示例:

  • 新建工程:點擊頭部“工具欄文件--新建工程”,會彈窗創建算法工程彈窗,開發者輸入算法名稱後,即在當前文件管理器中新建一個算法工程。
    技術分享圖片
  • 算法工程目錄結構:
  • libraries: 引用的算法存放目錄;
  • bin: 當前算法工程編譯成功生成的java模板文件的存放目錄;
  • Include: 算法工程頭文件存放目錄;
  • Resource: 算法工程源文件存放目錄;
  • main.wir: 當前算法工程入口文件
     註意:當前算法工程的編譯入口文件為“main.wir”。 如果選中其它文件點擊編譯,JUGO-IDE會自動定位到當前選中文件所屬的算法工程,並編譯該算法工程中的“main.wir”。如果需要編譯其它文件,需要在“main.wir”中引入該文件後再點擊“編譯”。
  • 新建文件:點擊頭部“工具欄文件--新建文件”,即在當前工程目錄下新建一個Untitled1.wir文件,並自動在編輯區打開。
      功能限制:IDE當前文件系統中至少有一個工程。
  • 導入本地文件:點擊頭部工具欄“文件--導入本地文件”,選擇某一文件後該文件即被導入進JUGO-IDE文件管理器,並自動在編輯區打開。
      功能限制:IDE當前文件系統中至少有一個工程。
  • 導出到本地:點擊頭部工具欄“文件--導出到本地”,會將IDE中當前選中的文件或文件夾導出到本地,文件夾的格式為“文件夾名”.rar,文件的格式和當前選中的文件在IDE中的格式保持一致。
      功能限制:需要在IDE中選中文件或文件夾。
  • 保存/全部保存:點擊頭部工具欄“文件--保存”,會保存當前文件;點擊頭部工具欄“文件--全部保存”,會保存文件管理器中的所有文件;
      功能限制:當前窗口中有需要保存的文件
  • 刪除:點擊頭部工具欄“文件--刪除”,會刪除當前編輯區窗口打開的文件;
      功能限制:當前有選中的文件
    2)編輯操作
      功能描述:提供對當前文件“撤銷、恢復、復制、剪切、粘貼、查找、替換、格 式化、在文件中查找、在文件中替換”等常規功能。
      操作示例:
      在文件中查找/替換:點擊頭部工具欄“編輯--在文件中查找/替換”,左側邊欄會彈出搜索窗口,實現全局關鍵字的查找/替換功能。
      功能限制:當前編輯區窗口中有打開的文件
    3)幫助
      功能描述:提供對操作員的幫助文檔。
      操作示例:
  • 歡迎使用:點擊頭部工具欄“幫助--歡迎使用”,即會回到JIDE的歡迎頁面,該頁面中提供了JIDE的簡介及使用的大致流程。
  • 幫助文檔:點擊頭部工具欄“幫助--幫助文檔”,即會跳轉到JUGO技術產品的文檔中心,文檔中心中包含了比較詳細的開發流程。
    技術分享圖片
    3.工具欄
    1)文件管理
      功能描述:控制文件管理器的展開或收起。
      操作步驟:文件管理器窗口默認展開,點擊左側工具欄“文件管理技術分享圖片 ”控制文件管理器窗口的展開與收起
    技術分享圖片
    2)全局搜索
      功能描述:提供全局的搜索、替換功能。
      操作步驟:
      第一步:點擊左側工具欄“搜索技術分享圖片”按鈕,調出全局搜索功能窗口;
      第二步:輸入關鍵字即可即時出現搜索結果,關鍵字支持區分字母大小寫、全字匹配、正則表達式;
      第三步:點擊搜索結果自動跳轉到當前文件;
      第四步:替換操作支持單個替換和全部替換,輸入替換內容後,可以選擇單個替換和全部替換;
    技術分享圖片
    3)運行算法
      功能描述:對進行編譯成功的電路文件進行測試運行。
      操作步驟:
      第一步:點擊左側工具欄“運行技術分享圖片 ”按鈕,調出運行算法面板;
    技術分享圖片
      第二步:如果當前選中的工程沒有編譯成功,則提示沒有數據;
      第三步:如果當前選中的工程已經編譯成功,則可輸入輸入項運行該算法;
      第四步:運行成功,則會在輸出欄提示運行成功並輸入運行結果;
    技術分享圖片
      第五步:運行成功後,即可看到運行結果,格式如“name:value”,”name”即為當前運行的算法代碼中的輸出變量的名稱,”value”為算法代碼中輸出變量的值。
    4)算法庫
      功能描述:所有已上傳到算法中心的算法,都可在算法庫中調用,點擊圖標進入算法庫頁面。
      操作步驟:
      註意:進入算法庫需要用戶已登錄,未登錄狀態則需要進行登錄。
      第一步:點擊左側工具欄“算法庫技術分享圖片 ”按鈕,調出算法庫面板;算法列表中展示每一個算法的名稱、簡介和發布者,支持關鍵字搜索算法;
      第二步:點擊某一個算法,即跳往該算法的詳情界面,開發者可以了解到算法更多的信息,並提供了下載該算法的功能入口。
      功能限制:需要開發者登錄之後才能訪問,如果開發者未登錄,IDE會自動彈出登錄彈窗提示開發者登錄。
    技術分享圖片
    3.編輯區
    1)語法檢查
      功能描述:對當前編輯的文件執行“保存”或者“編譯”的操作時,會進行語法檢查,錯誤的地方有紅色叉號標識,鼠標懸浮在該行文字上時會顯示具體的錯誤信息。
    技術分享圖片
    2)查找/替換
      功能描述:輸入關鍵字進行查找/替換,支持區分字母大小寫、全字匹配、正則表達式。搜索結果支持上一個、下一個定位操作,替換操作支持單個替換和當前編輯區文件全部替換操作。
    3)多個窗口展示
      功能描述:編輯區打開文件過多時,隱藏的部分文件可在右側“更多文件”入口打開。
      操作步驟:點擊右側更多文件“...”標識,即可調出文件列表,其中加黑顯示的是已經在編輯區顯示的文件,灰色顯示的是隱藏的文件;
    技術分享圖片
    4)窗口右鍵操作
      功能描述:提供“關閉、關閉其他、關閉右側、關閉未更改、關閉所有”功能。
      操作步驟:選中某一文件名,單擊右鍵即可調出右鍵操作菜單。
    技術分享圖片
    5)文件狀態標識
      功能描述:每個文件名稱左側出現紅色小圓點圖標,則表示該文件更改後尚未保存;出現綠色小圓點圖標,則表示該文件已保存。
    二、快捷鍵
鍵名 操作 功能限制
Alt+p 新建工程
Alt+N 新建文件 IDE當前文件系統中至少有一個工程
Ctrl+O 導入本地文件 IDE當前文件系統中至少有一個工程
Ctrl+S 保存 IDE當前文件系統中有未保存的文件
Ctrl+Alt+S 全部保存 IDE當前文件系統中有未保存的文件
Ctrl+delete 刪除 當前有選中的文件
Ctrl+Z 撤銷 當前編輯區窗口中有打開的文件
Ctrl+Y 恢復 當前編輯區窗口中有打開的文件
Ctrl+C 復制 當前編輯區窗口中有打開的文件
Ctrl+X 剪切 當前編輯區窗口中有打開的文件
Ctrl+V 粘貼 當前編輯區窗口中有打開的文件
Ctrl+F 查找 當前編輯區窗口中有打開的文件
Ctrl+H 替換 當前編輯區窗口中有打開的文件
Ctrl+L 代碼格式化 當前編輯區窗口中有打開的文件
F2 重命名 當前有選中的文件
F8 編譯 IDE當前文件系統中至少有一個工程

三、編寫流程
1.文件格式

1) 輸入文件格式
  JUGO-IDE目前支持所有格式文件的編輯,但是編譯功能僅限於.wir格式的文件。
2) 輸出文件格式
  在JUGO-IDE中對一個.wir格式的文件進行編譯將生成一個.gc格式的電路文件和一個.java格式的java模板文件;.gc文件可通過“導出”按鈕導出到本地,.java文件放置於工程“bin”目錄,可通過菜單欄或者工具欄中“導出到本地”功能導出到本地,.java文件可在java-sdk中使用。
2.自動補全
  功能描述:JUGO-IDE編輯區在輸入過程中即時顯示自動補全提示。
3.編程
  功能描述:JUGO-IDE編輯區提供查找、替換、代碼格式化、字體放大、字體縮小、撤銷、恢復等常用功能。
  流程:編輯--保存--編譯
  錯誤類型反饋:
1)開發者在執行保存操作時,如果代碼中有語法錯誤,錯誤的地方行號處有紅色叉號標識,鼠標懸浮在該行文字上時會顯示具體的錯誤信息。
2)開發者在執行編譯操作時,如果編譯出錯,IDE輸出區域會有紅色的錯誤信息輸出,點擊錯誤信息,編輯區會自動打開當前發生錯誤的文件。
  措施:開發者在執行保存或者編譯時如果有錯誤信息提示,需要重新編輯文件糾錯後再執行保存或者編譯操作。
技術分享圖片
4.運行
  功能描述:JUGO-IDE編輯區提供“查找、替換、代碼格式化、字體放大、字體縮小、撤銷、恢復”等常用功能。
  流程:當前工程編譯成功後執行運行
  錯誤類型反饋:
1)當前項目沒有編譯成功
技術分享圖片
措施:開發者需要先對當前工程進行編譯,編譯成功後才能運行算法。
2)無效參數
技術分享圖片
措施:當前項目編譯成功後運行的時候,會對輸入參數進行類型和範圍校驗,存在不合法的參數時無法點擊“運行”按鈕。
5.發布
  功能限制:
1)需要開發者登錄。
2)當前項目編譯成功並通過了運行測試。
用途:開發者可將已通過運行測試的算法發布到JUGO技術產品的算法庫中,算法庫是JUGO技術產品的算法倉庫,開發者使用JUGO-IDE發布的算法會生成一個唯一的算法ID,通過這個算法ID可以下載該算法,並通過JUGO-SDK使用該算法。
技術分享圖片
6.算法庫
  功能限制:需要開發者登錄。
  用途:開發者可以訪問到JUGO技術產品的算法中心的所有算法。算法列表中展示每一個算法的名稱、簡介和發布者,支持關鍵字搜索算法;點擊某一個算法,即跳往該算法的詳情界面,開發者可以了解到算法更多的信息,並提供了下載該算法的功能入口。
技術分享圖片
7.導出
功能描述:開發者可以通過導出功能將JUGO-IDE中當前選中的文件或文件夾導出到本地,文件夾的格式為“文件夾名”.rar,文件的格式和當前選中的文件在IDE中的格式保持一致。
1.什麽是JUGO-SDK
  JUGO-SDK是JUGO技術產品面向開發者提供的安全多方計算應用開發工具包。
  開發者通過使用JUGO-SDK與其他JUGO技術產品,可以高效快速的開發MPC(安全多方計算)應用。每個集成了SDK的應用將作為計算節點接入到計算網絡中。應用調用SDK可以實現安全多方計算以滿足業務需求。
  此文檔面向開發者介紹如何使用JUGO-SDK及其相關註意事項。同時,閱讀此文檔的開發者需要具備分布式系統中間件(Ice)的基礎知識——JUGO-SDK使用RPC協議進行數據傳輸,使用了Ice中的Glacier2進行防火墻穿透。
技術分享圖片
2.編程語言&開發環境
  支持語言:JAVA語言。
  JDK版本:JDK1.8。
  開發工具:推薦使用 IntelliJ IDEA。
  開發環境:操作系統window/linux,ICE-3.6
3.調試&運行環境
  調試環境:由於MPC算法庫目前僅支持.so動態庫(Linux平臺運行),所以開發階段部分功能可在window上進行調試,完整的計算流程需要在Linux環境上進行。
  運行環境:目前僅支持運行在Linux環境,推薦:CentOS Linux release 7.2.1511 (Core)。
  電路文件:後綴格式規定為:.gc

一、集成流程
1、IDE上編寫電路算法;
2、編譯算法並生成電路文件JAVA包裝類;示例查看
3、項目中引入步驟2中的JAVA包裝類;
4、集成API,完成應用開發;
二、API列表

API 說明
YourCircuitWrapper() 初始化上下文, 構建電路對象
doCompute() 啟動計算任務
setInputCallbackForORG() 設置發起方計算數據源回調CALLBACK
setInputCallbackForDST() 設置受邀方計算數據源回調CALLBACK
setOutputCallback() 設置結果處理回調CALLBACK
invite() 是否接受計算邀請
getLocal() 獲取電路文件路徑

三、API詳情
1.創建電路實例
  接口:YourCircuitWrapper circuit=new YourCircuitWrapper();
  註意:電路文件包裝類,僅可實例化一次,建立與代理連接。
  描述:創建電路實例,並完成鏈路初始化工作,與JUGO代理服務進行會話連接,後續數據通信都依賴此連接通道進行。
  參數說明:

參數 類型 必填 說明
pcbId String 電路ID,一般與電路文件名相同,此值會用於進行本地電路文件搜索。如:xxx.gc
user String 節點用戶名,用於連接JUGO平臺代理服務進行鑒權。獲取方式從JUGO開發服務平臺已註冊
password String 用戶名對應密碼,用於連接JUGO代理服務會話連接鑒權。此密碼對應JUGO開發服務平臺已註冊賬號對應的密碼
mode NodeCommunicateMode 節點啟動模式,有兩種類型SERVER -節點初始化後同時作為服務節點啟動CALLBACK -節點初始化後作為回調節點啟動有關二者差異的描述請參考配置節點為服務節點
proxyEndpoint String JUGO代理服務的Endpoints連接信息。例如:ProxyGlacier2/router:tcp -h 192.168.7.167 -p 4502 -t 11000
jugoEndpoint String 當前節點的Endpoint信息,當mode == SERVER時,此值必填。mode == CALLBACK時可不填
args Array 啟動配置信息。如:攜帶節點服務配置信息:--Ice.Config=config.conf

返回參數說明:

參數 說明
無返回參數 需處理調用過程中可能觸發的異常MPCException

示例代碼:

  1. try {
  2. YourCircuitWrapper yourCircuit=new YourCircuitWrapper("mycircuitId","admin01","password",NodeCommunicateMode.SERVICE
  3. , "ProxyGlacier2/router:tcp -h 192.168.7.167 -p 4502 -t 11000", null, "--Ice.Config=config.conf");
  4. } catch (MPCException e) {
  5. }
    2.開啟計算任務
      接口:yourCircuit.doCompute();
      註意:調用前請確保成功構建了YourCircuitWrapper實例對象。
      描述:通過調用doCompute,可以啟動一次計算任務。該接口由任務發起方進行調用,被邀請方無需調用該接口。
      參數說明:
參數 類型 必填 說明
roomId String 計算實例ID,該值由JUGO開發服務平臺提供,當創建好一次計算任務後會產生該值
args Array 計算條件,參數可任意擴展,但需要保證所有計算參與方對此字段的解析過程一致即可。如:此處傳遞A=15 B=15 C=17,各其它參與方收到數據後按規則解析參數結構獲取
takerList List 計算參與方用戶名列表,列表中第一個元素為計算任務發起者
resultReceiverList List 計算結果接收方列表,計算完成後該列表中用戶都會收到計算結果

  返回參數說明:

參數 說明
無返回參數 需處理調用過程中可能觸發的異常MPCException

示例代碼:

  1. try {
  2. String[] argsAttach = new String[]{"n=3","m=4"};
  3. List<String> takerList = Arrays.asList(new String[]{"admin01","admin02"});
  4. List<String> resulReceiverList = Arrays.asList(new String[]{"admin01"});
  5. yourCircuit.doCompute("1111", argsAttach, takerList, resulReceiverList);
  6. } catch (MPCException e) {
  7. e.printStackTrace();
  8. }
    3.發起方獲取源數據
      接口:yourCircuit.setInputCallbackForORG();
      註意:此函數用於設置計算發起方的源數據獲取方式。
      描述:此函數接受一個InputCallback()接口的具體實現, 可自行定義計算源數據的獲取邏輯。設置時請註意電路文件定義的數據結構規範,如果是數組則需要保證數組元級及元素個數與預定義的一致。
      參數說明:
參數 類型 必填 說明
taskId String 任務ID,回調傳入。每發起一次計算就會產生一個新的任務ID
algorithmId String 算法ID,回調傳入。每一次任務對應一個算法ID
args Array 附加參數,此參數就是在調用startTask時傳入的args參數,可以使用此參數攜帶條件(如果業務需要的話),任何參與方收到的參數都是一致的

  返回參數說明:

類型 說明
返回具體類型由電路文件定義

示例代碼:

  1. yourCircuit.setInputCallbackForORG(new InputCallback<Int32[][]>() {
  2. @Override
  3. public Int32[][] input(String taskId, String algorithmId, String[] args) {
  4. return new Int32[2][2];
  5. }
  6. @Override
  7. public void onFailure(Throwable e){
  8. // 異常處理
  9. }
  10. });
      說明:
      上述示例中假定生成的電路java文件中定義的入參類型為:Int32[][],一個Int32的二維數組,且元素個數為[2][2]。
    4.收邀方獲取源數據
      接口:yourCircuit.setInputCallbackForDST();
      註意:此函數用於設置受邀發起方的源數據獲取方式。
      描述:此函數接受一個InputCallback()接口的具體實現, 可自行定義計算源數據的獲取邏輯。設置時請註意電路文件定義的數據結構規範,如果是數組則需要保證數組元級及元素個數與預定義的一致。
      參數說明:
參數 類型 必填 說明
taskId String 任務ID,回調傳入。每發起一次計算就會產生一個新的任務ID
algorithmId String 算法ID,回調傳入。每一次任務對應一個算法ID
args Array 附加參數,此參數就是在調用startTask時傳入的args參數,可以使用此參數攜帶條件(如果業務需要的話),任何參與方收到的參數都是一致的

  返回參數說明:

類型 說明
返回具體類型由電路文件定義

示例代碼:

  1. yourCircuit.setInputCallbackForDST(new InputCallback<Int32[][]>() {
  2. @Override
  3. public Int32[][] input(String taskId, String algorithmId, String[] args) {
  4. return new Int32[3][3];
  5. }
  6. @Override
  7. public void onFailure(Throwable e){
  8. // 異常處理
  9. }
  10. });
      說明:
      上述示例中假定生成的電路java文件中定義的入參類型為:Int32[][],一個Int32的二維數組,且元素個數為[3][3]。因此在回調函數中input的返回一定是[3][3]及的多維數組。
    5.處理計算結果
      接口:yourCircuit.setOutputCallback();
      註意:N/A。
      描述:設置一個回調函數,用於處理獲取到的結果。該結果返回的數據類型與電路文件算法電路的返回類型一致。
      參數說明:
參數 類型 必填 說明
taskId String 任務ID,回調傳入。每發起一次計算就會產生一個新的任務ID
algorithmId String 算法ID,回調傳入。每一次任務對應一個算法ID
resultCode int 結果錯誤碼,0表示成功獲取數據。
result <T> 計算結果,其類型根據電路決定,是動態變化的。可能為:Int32/Int64/Int32[]/Int32[][]

  返回參數說明

參數 說明
void 無返回值

示例代碼:

  1. yourCirciut.setOutputCallback(new OutputCallback<Int32>(Int32.class) {
  2. @Override
  3. public void onResult(String taskId, String algorithmId, int resultCode, Int33 result) {
  4. // 處理結果
  5. }
  6. @Override
  7. public void onFailure(Throwable e){
  8. // 異常處理
  9. }
  10. }
      註意:示例中的數據類型(Int32)由具體電路文件決定。
    6.處理邀請結果
      接口:InvitationManager->invite();
      註意:此接口提供了默認實現,如需更改則需要在調用doCompute()前重新進行設置。可調用yourCircuit.setInvitationManager();進行更改。
      描述:一個接口,並提供回調函數,當節點收到計算邀請後該回調會被觸發,可在回調函數中提供業務邏輯來決定是否同意計算邀請。該接口提供了一個默認實現類(DefaultInvitationManager)
      參數說明:
參數 類型 必填 說明
taskId String 任務ID,回調傳入。每發起一次計算就會產生一個新的任務ID
starter String 計算發起者用戶名
algorithmId String 算法ID,回調傳入。每次任務都對應有一個算法ID
numberOfParticipants int 參與計算方人數
takersList List<String> 計算參與方用戶名列表

  返回參數說明:

類型 說明
boolean 計算邀請確認結果,true 同意參與計算,false 拒絕參與計算

示例代碼:

  1. yourCircuit.setInvitationManager(new InvitationManager() {
  2. @Override
  3. public boolean invite(String taskId, String starter, String algorithmId, int numberOfParticipants, List<String> takersList) {
  4. // 這裏實現業務邏輯
  5. return true;
  6. }
  7. });
    7.獲取本地電路文件
      接口:CircuitManager -> getLocal();
      註意:如需更改則在調用doCompute前重新進行設置。可調用yourCircuit.setCircuitManagerManager();預先設置。
      描述:此接口提供了默認實現類(DefaultCircuitManager)。當需要自定義電路文件路徑時可重新提供接口實現。JUGO-SDK默認會根據算法ID(algorithmId)去電路倉庫進行下載(由JUGO開發服務平臺提供)。
      參數說明:
參數 類型 必填 說明
algorithmId String 算法ID,優先會根據算法ID作為文件名進行本地搜索(後綴.gc),如果不存在則會從電路文件倉庫進行下載

  返回參數說明:

類型 說明
String 返回電路文件存儲在本地的全路徑

示例代碼:

  1. // 示例提供了根據不同ID返回不同文件類型的電路文件
  2. yourCircuit.setCircuitManager(new CircuitManager() {
  3. @Override
  4. public String getLocal(String algorithmId) {
  5. if(algorithmId.equals("1")){
  6. return "/home/juzhen/work2018/jugo/jugompc/circuits-files/adder_32bit.gc";
  7. }
  8. if(algorithmId.equals("2")){
  9. return "/home/juzhen/work2018/jugo/jugompc/circuits-files/AES-expanded.gc";
  10. }
  11. return "";
  12. }
  13. });
    四、JUGO-SDK使用步驟
    1.引入JUGO-SDK
      SDK倉庫地址
      Maven
1.    <dependency>  
2.    <groupId>com.juzix.jugo</groupId>  
3.    <artifactId>mpc-node-sdk</artifactId>  
4.    <version>1.1.0-SNATSHOP</version>  
5.    </dependency>`

  Gradle

  1. compile "com.juzix.jugo:mpc-node-sdk:1.1.0-SNATSHOP"
    Jar包引用下載

2.算法動態庫
  底層算法邏輯使用c/c++進行編寫,JAVA使用JNI進行調用。目前僅提供了Linux環境下的動態庫(.so),因此測試環節需在Linux完成。下載解壓後會得到一個libjuzixmpc.so動態庫文件,需要更改配置文件mpc-node-config.conf進行配置 。此操作是必須的,否則無法完成計算操作。

3.配置文件創建
  JUGO-SDK使用默認方式獲取電路文件時需要一些配置信息,如自定義實現了CircuitManager,則無需提供配置文件。此處規定,配置文件名為:mpc-node-config.conf,必須在目錄config下。配置文件可位於classes源碼目錄或者${user.dir}工作目錄。如果使用IDEA開發工具,則可將配置文件放置在:${project.dir}/src/main/resources/config/mpc-node-config.conf。
  文件內容如下:

1.    node {  
2.         isDebug=false  
3.         # 是否使用Glacier2進行消息路由 false 不使用, true 使用  
4.         isRouterModel=false  
5.    circuit {  
6.    # 電路文件下載地址,此處將IP和port更改為實際地址即可  
7.    download.url = "http://xxx:port/file_api/file/download?arithmeticId=%s&user=%s"  
8.    # 電路文件本地存儲目錄  
9.    local.dirPath = /home/test/developer/jugompc  
10.    }  
11.    jni {  
12.       # jni調用的動態庫文件目錄  
13.       library.path=/home/test/developer/jnilib  
14.    }  
15.    }

註:完成以上2步操作基本完成了對JUGO-SDK的集成。請務必註意算法庫的文件路經配置正確。
4.配置節點為服務節點
  在啟動一個節點的時,可以將節點作為一個服務節點啟動。可直接接收對端(計算比較端)的數據,而不需要通過JUGO代理服務回調傳輸。在調用API-初始化節點(initContext)時,如果參數mode傳入SERVER,則必須進行配置操作。如果傳入CALLBACK則可忽略此步驟。
  當節點需要作為服務節點啟動時,需提供服務配置文件,並在初始化時通過參數args傳入。
  服務配置文件:config.node-server

1.    # 當前節點作為服務提供的Endpoints信息  
2.    NodeServer.Endpoints=tcp -p 12001  
3.    Server.Trace=1  
4.    Ice.ThreadPool.Server.Size=10  
5.    Ice.ThreadPool.Server.SizeMax=10  
6.    Ice.ThreadPool.Client.Size=10  
7.    Ice.ThreadPool.Client.SizeMax=10

  註:在創建電路實例中的
args=new String[]{“--Ice.Config=config.node-server”}
5.配置節點Glacier2
  註意:如果配置文件mpc-node-config中,isRouterModel=false, 則無需啟動節點Glacier2,該模式標識僅使用節點直連進行消息傳遞而不需要Glacier2進行消息路由。
  Glacier2是ICE特有的應用層防火墻和路由器,提供了安全校驗、消息路由和事務管理等功能。這裏為了防止網絡造成數據傳輸阻礙,引入Glacier2進行網絡穿透。將節點服務放置在Glacier2之後,由Glacier2進行消息接收並路由到目標服務。
  Glacier2配置文件:config.glacier2-node-server

1.    #Glacier2實例名  
2.    Glacier2.InstanceName=NodeGlacier2  
3.    # 客戶端訪問Endpoints信息  
4.    Glacier2.Client.Endpoints=tcp -h 0.0.0.0 -p 4503 -t 12000  
5.    Glacier2.Server.Endpoints=tcp  
6.    # 會話創建服務地址,此處連接到節點服務的EEndpoings  
7.    Glacier2.SessionManager=NodeSessionManager:tcp -h 192.168.7.168 -p 12001  
8.    # 權限校驗服務地址,此處連接到節點服務的Endpoints  
9.    Glacier2.PermissionsVerifier=NodePermissionsVerifier:tcp -h 192.168.7.168 -p 12001  
10.    Glacier2.SessionTimeout=30  
11.    Glacier2.Server.Buffered=0  
12.    Glacier2.Client.Buffered=0  
13.    IceSSL.Trace.Security=1  
14.    Ice.Trace.Network=1  
15.    Ice.Warn.Connections=1  
16.    Ice.Trace.Protocol=1  
17.    Ice.ThreadPool.Server.Size=10  
18.    Ice.ThreadPool.Server.SizeMax=10  
19.    Ice.ThreadPool.Client.Size=10  
20.    Ice.ThreadPool.Client.SizeMax=10

  註:配置中為基本的Glacier2信息配置,具體含義請參考ICE詳細文檔查看。
  啟動Glacier2之前請確保本地已安裝Ice並可正常使用。
  啟動Glaicer2命令為:
glacier2router --Ice.Config=./config.glacier2-node-server
  使用Glacier2後,在調用節點初始化(initContext)時的參數jugoEndpoint=NodeGlacier2/router:tcp -h 127.0.0.1 -p 4503 -t 12000。後續再計算過程中對端節點會通過該Endpoints信息直接調用Glacier2進行數據轉發路由到目標服務。
五、返回碼一覽

錯誤碼 說明
0 計算成功
100 程序未知異常
1001 連接失敗,網絡不通
1007 參與計算節點異常下線
1008 有節點拒絕參與計算
1009 電路文件缺失

更多內容可以參考視頻:安全多方計算MPC視頻課程

安全多方計算(MPC)從入門到精通:JUGO-IDE及SDK