簡介:在上一節《安全多方計算(MPC)從入門到精通:Frutta語言》中,已經介紹了Frutta語言語法相關的內容,在本節中,我們將介紹JUGO-IDE及SDK。
1.什么是JUGO-IDE
JUGO-IDE是JUGO技術產品面向開發者提供的用來編寫MPC算法的開發工具,結合Frutta谷歌瀏覽器插件,開發者無需搭建任何環境就可以快速編寫、編譯、運行和發布算法。
通過使用JUGO-IDE,開發者可使用Frutta語言編寫算法,並通過JUGO-IDE編譯成可在JUGO技術產品上執行的電路文件和java模板文件。https://jugo.juzix.net/ide/
2.支持語言
Frutta語言。
Frutta作為類C的高級語言,可以將編寫的計算邏輯在JUGO-IDE生成電路文件和java模板文件,並在JUGO技術產品中執行計算。 https://jugo.juzix.net/api_document/frutta/frutta.html
3開發環境
操作系統windows(后續支持linux),chrome瀏覽器(需先安裝Frutta谷歌瀏覽器插件)
第一步,請點擊下載Frutta谷歌瀏覽器插件的安裝包https://jugo.juzix.net/file/PLUGIN.tar.gz,並在本地解壓。
第二步,在Chrome瀏覽器地址欄輸入chrome://extensions/,啟用開發者模式,然后點擊按鈕“加載已解壓的擴展程序”,選擇插件所在的文件夾即可。
注意:由於該插件暫未上傳Google插件商店,所以只能以開發者模式運行。打開chrome://extensions/,如下圖示開啟開發者模式。由於是以開發者模式運行該插件的,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)文件狀態標識
功能描述:每個文件名稱左側出現紅色小圓點圖標,則表示該文件更改后尚未保存;出現綠色小圓點圖標,則表示該文件已保存。
二、快捷鍵
三、編寫流程
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
三、API詳情
1.創建電路實例
接口:YourCircuitWrapper circuit=new YourCircuitWrapper();
注意:電路文件包裝類,僅可實例化一次,建立與代理連接。
描述:創建電路實例,並完成鏈路初始化工作,與JUGO代理服務進行會話連接,后續數據通信都依賴此連接通道進行。
參數說明:
返回參數說明:
示例代碼:
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. 6. }
2.開啟計算任務
接口:yourCircuit.doCompute();
注意:調用前請確保成功構建了YourCircuitWrapper實例對象。
描述:通過調用doCompute,可以啟動一次計算任務。該接口由任務發起方進行調用,被邀請方無需調用該接口。
參數說明:
返回參數說明:
示例代碼:
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()接口的具體實現, 可自行定義計算源數據的獲取邏輯。設置時請注意電路文件定義的數據結構規范,如果是數組則需要保證數組元級及元素個數與預定義的一致。
參數說明:
返回參數說明:
示例代碼:
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. 7. @Override 8. public void onFailure(Throwable e){ 9. // 異常處理 10. } 11. });
說明:
上述示例中假定生成的電路java文件中定義的入參類型為:Int32[][],一個Int32的二維數組,且元素個數為[2][2]。
4.收邀方獲取源數據
接口:yourCircuit.setInputCallbackForDST();
注意:此函數用於設置受邀發起方的源數據獲取方式。
描述:此函數接受一個InputCallback()接口的具體實現, 可自行定義計算源數據的獲取邏輯。設置時請注意電路文件定義的數據結構規范,如果是數組則需要保證數組元級及元素個數與預定義的一致。
參數說明:
返回參數說明:
示例代碼:
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. 7. @Override 8. public void onFailure(Throwable e){ 9. // 異常處理 10. } 11. });
說明:
上述示例中假定生成的電路java文件中定義的入參類型為:Int32[][],一個Int32的二維數組,且元素個數為[3][3]。因此在回調函數中input的返回一定是[3][3]及的多維數組。
5.處理計算結果
接口:yourCircuit.setOutputCallback();
注意:N/A。
描述:設置一個回調函數,用於處理獲取到的結果。該結果返回的數據類型與電路文件算法電路的返回類型一致。
參數說明:
返回參數說明
示例代碼:
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. 7. @Override 8. public void onFailure(Throwable e){ 9. // 異常處理 10. } 11. }
注意:示例中的數據類型(Int32)由具體電路文件決定。
6.處理邀請結果
接口:InvitationManager->invite();
注意:此接口提供了默認實現,如需更改則需要在調用doCompute()前重新進行設置。可調用yourCircuit.setInvitationManager();進行更改。
描述:一個接口,並提供回調函數,當節點收到計算邀請后該回調會被觸發,可在回調函數中提供業務邏輯來決定是否同意計算邀請。該接口提供了一個默認實現類(DefaultInvitationManager)
參數說明:
返回參數說明:
示例代碼:
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開發服務平台提供)。
參數說明:
返回參數說明:
示例代碼:
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倉庫地址:http://sdk.juzix.net/content/groups/public/
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包引用下載https://jugo.juzix.net/file/JAVA-SDK.zip
下載后會得到一個zip包,解包后將對應jar包全部拷貝到本地項目中依賴引用。
2.算法動態庫
底層算法邏輯使用c/c++進行編寫,JAVA使用JNI進行調用。目前僅提供了Linux環境下的動態庫(.so),因此測試環節需在Linux完成。下載解壓后會得到一個libjuzixmpc.so動態庫文件,需要更改配置文件mpc-node-config.conf進行配置 。此操作是必須的,否則無法完成計算操作。
算法動態庫 下載https://jugo.juzix.net/file/libjuzixmpc.zip
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詳細文檔查看。https://jugo.juzix.net/file/Ice-3.6b.pdf
啟動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進行數據轉發路由到目標服務。
五、返回碼一覽
更多內容可以參考視頻:http://edu.51cto.com/course/14087.html
產品實操請訪問:https://jugo.juzix.net/home