簡介:在上一節《安全多方計算(MPC)從入門到精通:Frutta語言》中,已經介紹了Frutta語言語法相關的內容,在本節中,咱們將介紹JUGO-IDE及SDK。html
1.什麼是JUGO-IDEjava
JUGO-IDE是JUGO技術產品面向開發者提供的用來編寫MPC算法的開發工具,結合Frutta谷歌瀏覽器插件,開發者無需搭建任何環境就能夠快速編寫、編譯、運行和發佈算法。node
經過使用JUGO-IDE,開發者可以使用Frutta語言編寫算法,並經過JUGO-IDE編譯成可在JUGO技術產品上執行的電路文件和java模板文件。https://jugo.juzix.net/ide/linux
2.支持語言c++
Frutta語言。正則表達式
Frutta做爲類C的高級語言,能夠將編寫的計算邏輯在JUGO-IDE生成電路文件和java模板文件,並在JUGO技術產品中執行計算。https://jugo.juzix.net/api_document/frutta/frutta.html算法
3開發環境chrome
操做系統windows(後續支持linux),chrome瀏覽器(需先安裝Frutta谷歌瀏覽器插件)編程
第一步,請點擊下載Frutta谷歌瀏覽器插件的安裝包https://jugo.juzix.net/file/PLUGIN.tar.gz,並在本地解壓。windows
第二步,在Chrome瀏覽器地址欄輸入chrome://extensions/,啓用開發者模式,而後點擊按鈕「加載已解壓的擴展程序」,選擇插件所在的文件夾便可。
注意:因爲該插件暫未上傳Google插件商店,因此只能以開發者模式運行。打開chrome://extensions/開啓開發者模式。因爲是以開發者模式運行該插件的,Chrome瀏覽器會彈出「請停用以開發者模式運行的擴展程序」的提示,此時點擊「取消」才能夠繼續使用Frutta谷歌瀏覽器插件。
1、界面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」中引入該文件後再點擊「編譯」。
功能限制:IDE當前文件系統中至少有一個工程。
功能限制:IDE當前文件系統中至少有一個工程。
功能限制:須要在IDE中選中文件或文件夾。
功能限制:當前窗口中有須要保存的文件
功能限制:當前有選中的文件 2)編輯操做 功能描述:提供對當前文件「撤銷、恢復、複製、剪切、粘貼、查找、替換、格 式化、在文件中查找、在文件中替換」等常規功能。 操做示例: 在文件中查找/替換:點擊頭部工具欄「編輯--在文件中查找/替換」,左側邊欄會彈出搜索窗口,實現全局關鍵字的查找/替換功能。 功能限制:當前編輯區窗口中有打開的文件
3)幫助
功能描述:提供對操做員的幫助文檔。
操做示例:
歡迎使用:點擊頭部工具欄「幫助--歡迎使用」,即會回到JIDE的歡迎頁面,該頁面中提供了JIDE的簡介及使用的大體流程。
幫助文檔:點擊頭部工具欄「幫助--幫助文檔」,即會跳轉到JUGO技術產品的文檔中心,文檔中心中包含了比較詳細的開發流程。
1)文件管理
功能描述:控制文件管理器的展開或收起。
操做步驟:文件管理器窗口默認展開,點擊左側工具欄「文件管理」控制文件管理器窗口的展開與收起
2)全局搜索功能描述:提供全局的搜索、替換功能。
操做步驟:
第一步:點擊左側工具欄「搜索」按鈕,調出全局搜索功能窗口;
第二步:輸入關鍵字便可即時出現搜索結果,關鍵字支持區分字母大小寫、全字匹配、正則表達式;
第三步:點擊搜索結果自動跳轉到當前文件;
第四步:替換操做支持單個替換和所有替換,輸入替換內容後,能夠選擇單個替換和所有替換;
3)運行算法功能描述:對進行編譯成功的電路文件進行測試運行。
操做步驟:
第一步:點擊左側工具欄「運行」按鈕,調出運行算法面板;
第二步:若是當前選中的工程沒有編譯成功,則提示沒有數據;第三步:若是當前選中的工程已經編譯成功,則可輸入輸入項運行該算法;
第四步:運行成功,則會在輸出欄提示運行成功並輸入運行結果;
第五步:運行成功後,便可看到運行結果,格式如「name:value」,」name」即爲當前運行的算法代碼中的輸出變量的名稱,」value」爲算法代碼中輸出變量的值。4)算法庫
功能描述:全部已上傳到算法中心的算法,均可在算法庫中調用,點擊圖標進入算法庫頁面。
操做步驟:
注意:進入算法庫須要用戶已登陸,未登陸狀態則須要進行登陸。
第一步:點擊左側工具欄「算法庫」按鈕,調出算法庫面板;算法列表中展現每個算法的名稱、簡介和發佈者,支持關鍵字搜索算法;
第二步:點擊某一個算法,即跳往該算法的詳情界面,開發者能夠了解到算法更多的信息,並提供了下載該算法的功能入口。
功能限制:須要開發者登陸以後才能訪問,若是開發者未登陸,IDE會自動彈出登陸彈窗提示開發者登陸。
3.編輯區1)語法檢查
功能描述:對當前編輯的文件執行「保存」或者「編譯」的操做時,會進行語法檢查,錯誤的地方有紅色叉號標識,鼠標懸浮在該行文字上時會顯示具體的錯誤信息。
2)查找/替換功能描述:輸入關鍵字進行查找/替換,支持區分字母大小寫、全字匹配、正則表達式。搜索結果支持上一個、下一個定位操做,替換操做支持單個替換和當前編輯區文件所有替換操做。
3)多個窗口展現
功能描述:編輯區打開文件過多時,隱藏的部分文件可在右側「更多文件」入口打開。
操做步驟:點擊右側更多文件「...」標識,便可調出文件列表,其中加黑顯示的是已經在編輯區顯示的文件,灰色顯示的是隱藏的文件;
4)窗口右鍵操做功能描述:提供「關閉、關閉其餘、關閉右側、關閉未更改、關閉全部」功能。
操做步驟:選中某一文件名,單擊右鍵便可調出右鍵操做菜單。
5)文件狀態標識功能描述:每一個文件名稱左側出現紅色小圓點圖標,則表示該文件更改後還沒有保存;出現綠色小圓點圖標,則表示該文件已保存。
2、快捷鍵
3、編寫流程1.文件格式
JUGO-IDE目前支持全部格式文件的編輯,可是編譯功能僅限於.wir格式的文件。
在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上編寫電路算法;
二、編譯算法並生成電路文件JAVA包裝類;示例查看
三、項目中引入步驟2中的JAVA包裝類;
四、集成API,完成應用開發;
2、API列表
3、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. });
複製代碼
4、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源碼目錄或者{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-p4503-t12000。後續再計算過程當中對端節點會經過該Endpoints信息直接調用Glacier2進行數據轉發路由到目標服務。
5、返回碼一覽
更多內容能夠參考視頻: 安全多方計算MPC視頻課程產品實操請訪問:JUGO開放服務平臺