簡介:在上一節《安全多方計算(MPC)從入門到精通:Frutta語言》中,已經介紹了Frutta語言語法相關的內容,在本節中,咱們將介紹JUGO-IDE及SDK。html
JUGO-IDE是JUGO技術產品面向開發者提供的用來編寫MPC算法的開發工具,結合Frutta谷歌瀏覽器插件,開發者無需搭建任何環境就能夠快速編寫、編譯、運行和發佈算法。java
經過使用JUGO-IDE,開發者可以使用Frutta語言編寫算法,並經過JUGO-IDE編譯成可在JUGO技術產品上執行的電路文件和java模板文件。https://jugo.juzix.net/ide/node
Frutta語言。linux
Frutta做爲類C的高級語言,能夠將編寫的計算邏輯在JUGO-IDE生成電路文件和java模板文件,並在JUGO技術產品中執行計算。 https://jugo.juzix.net/api_document/frutta/frutta.htmlc++
操做系統windows(後續支持linux),chrome瀏覽器(需先安裝Frutta谷歌瀏覽器插件)正則表達式
第一步,請點擊下載Frutta谷歌瀏覽器插件的安裝包https://jugo.juzix.net/file/PLUGIN.tar.gz,並在本地解壓。算法
第二步,在Chrome瀏覽器地址欄輸入chrome://extensions/,啓用開發者模式,而後點擊按鈕「加載已解壓的擴展程序」,選擇插件所在的文件夾便可。chrome
注意:因爲該插件暫未上傳Google插件商店,因此只能以開發者模式運行。打開chrome://extensions/,以下圖示開啓開發者模式。因爲是以開發者模式運行該插件的,Chrome瀏覽器會彈出「請停用以開發者模式運行的擴展程序」的提示,此時點擊「取消」才能夠繼續使用Frutta谷歌瀏覽器插件。 編程
1)JUGO-IDE啓動頁默認包含一個歡迎頁和一個算法工程,開發者可根據須要進行增刪。windows
2)開發者在未登陸JUGO技術產品的狀況下首次進入JUGO-IDE啓動頁的時候,即會自動彈出登陸彈窗,提供了登陸、忘記密碼、註冊等功能入口。開發者登陸後纔可使用JUGO-IDE提供的訪問算法庫、發佈算法的功能。固然,開發者也能夠點擊「暫不登陸」關閉該登陸彈窗繼續使用MPC-IDE,不會對工程編譯等功能形成影響。
3)JUGO-IDE啓動時,編輯區默認打開JUGO-IDE歡迎頁,該頁面中提供了JUGO-IDE、Frutta、JUGO技術產品、MPC的簡單介紹和詳情頁面連接,開發者能夠點擊「詳情」去往詳情頁面進行深刻了解。
1)文件管理
功能描述:提供「新建工程、新建文件、導入本地文件、導出到本地、保存當前文件、保存全部文件、刪除當前文件」等功能。
操做示例:
注意:當前算法工程的編譯入口文件爲「main.wir」。 若是選中其它文件點擊編譯,JUGO-IDE會自動定位到當前選中文件所屬的算法工程,並編譯該算法工程中的「main.wir」。若是須要編譯其它文件,須要在「main.wir」中引入該文件後再點擊「編譯」。
功能限制:IDE當前文件系統中至少有一個工程。
功能限制:IDE當前文件系統中至少有一個工程。
功能限制:須要在IDE中選中文件或文件夾。
功能限制:當前窗口中有須要保存的文件
功能限制:當前有選中的文件
2)編輯操做
功能描述:提供對當前文件「撤銷、恢復、複製、剪切、粘貼、查找、替換、格 式化、在文件中查找、在文件中替換」等常規功能。
操做示例:
在文件中查找/替換:點擊頭部工具欄「編輯--在文件中查找/替換」,左側邊欄會彈出搜索窗口,實現全局關鍵字的查找/替換功能。
功能限制:當前編輯區窗口中有打開的文件
3)幫助
功能描述:提供對操做員的幫助文檔。
操做示例:
1)文件管理
功能描述:控制文件管理器的展開或收起。
操做步驟:文件管理器窗口默認展開,點擊左側工具欄「文件管理」控制文件管理器窗口的展開與收起
2)全局搜索
功能描述:提供全局的搜索、替換功能。
操做步驟:
第一步:點擊左側工具欄「搜索」按鈕,調出全局搜索功能窗口;
第二步:輸入關鍵字便可即時出現搜索結果,關鍵字支持區分字母大小寫、全字匹配、正則表達式;
第三步:點擊搜索結果自動跳轉到當前文件;
第四步:替換操做支持單個替換和所有替換,輸入替換內容後,能夠選擇單個替換和所有替換;
3)運行算法
功能描述:對進行編譯成功的電路文件進行測試運行。
操做步驟:
第一步:點擊左側工具欄「運行」按鈕,調出運行算法面板;
第二步:若是當前選中的工程沒有編譯成功,則提示沒有數據;
第三步:若是當前選中的工程已經編譯成功,則可輸入輸入項運行該算法;
第四步:運行成功,則會在輸出欄提示運行成功並輸入運行結果;
第五步:運行成功後,便可看到運行結果,格式如「name:value」,」name」即爲當前運行的算法代碼中的輸出變量的名稱,」value」爲算法代碼中輸出變量的值。
4)算法庫
功能描述:全部已上傳到算法中心的算法,均可在算法庫中調用,點擊圖標進入算法庫頁面。
操做步驟:
注意:進入算法庫須要用戶已登陸,未登陸狀態則須要進行登陸。
第一步:點擊左側工具欄「算法庫 」按鈕,調出算法庫面板;算法列表中展現每個算法的名稱、簡介和發佈者,支持關鍵字搜索算法;
第二步:點擊某一個算法,即跳往該算法的詳情界面,開發者能夠了解到算法更多的信息,並提供了下載該算法的功能入口。
功能限制:須要開發者登陸以後才能訪問,若是開發者未登陸,IDE會自動彈出登陸彈窗提示開發者登陸。
1)語法檢查
功能描述:對當前編輯的文件執行「保存」或者「編譯」的操做時,會進行語法檢查,錯誤的地方有紅色叉號標識,鼠標懸浮在該行文字上時會顯示具體的錯誤信息。
2)查找/替換
功能描述:輸入關鍵字進行查找/替換,支持區分字母大小寫、全字匹配、正則表達式。搜索結果支持上一個、下一個定位操做,替換操做支持單個替換和當前編輯區文件所有替換操做。
3)多個窗口展現
功能描述:編輯區打開文件過多時,隱藏的部分文件可在右側「更多文件」入口打開。
操做步驟:點擊右側更多文件「...」標識,便可調出文件列表,其中加黑顯示的是已經在編輯區顯示的文件,灰色顯示的是隱藏的文件;
4)窗口右鍵操做
功能描述:提供「關閉、關閉其餘、關閉右側、關閉未更改、關閉全部」功能。
操做步驟:選中某一文件名,單擊右鍵便可調出右鍵操做菜單。
5)文件狀態標識
功能描述:每一個文件名稱左側出現紅色小圓點圖標,則表示該文件更改後還沒有保存;出現綠色小圓點圖標,則表示該文件已保存。
1) 輸入文件格式
JUGO-IDE目前支持全部格式文件的編輯,可是編譯功能僅限於.wir格式的文件。
2) 輸出文件格式
在JUGO-IDE中對一個.wir格式的文件進行編譯將生成一個.gc格式的電路文件和一個.java格式的java模板文件;.gc文件可經過「導出」按鈕導出到本地,.java文件放置於工程「bin」目錄,可經過菜單欄或者工具欄中「導出到本地」功能導出到本地,.java文件可在java-sdk中使用。。
功能描述:JUGO-IDE編輯區在輸入過程當中即時顯示自動補全提示。
功能描述:JUGO-IDE編輯區提供查找、替換、代碼格式化、字體放大、字體縮小、撤銷、恢復等經常使用功能。
流程:編輯--保存--編譯
錯誤類型反饋:
1)開發者在執行保存操做時,若是代碼中有語法錯誤,錯誤的地方行號處有紅色叉號標識,鼠標懸浮在該行文字上時會顯示具體的錯誤信息。
2)開發者在執行編譯操做時,若是編譯出錯,IDE輸出區域會有紅色的錯誤信息輸出,點擊錯誤信息,編輯區會自動打開當前發生錯誤的文件。
措施:開發者在執行保存或者編譯時若是有錯誤信息提示,須要從新編輯文件糾錯後再執行保存或者編譯操做。
功能描述:JUGO-IDE編輯區提供「查找、替換、代碼格式化、字體放大、字體縮小、撤銷、恢復」等經常使用功能。
流程:當前工程編譯成功後執行運行
錯誤類型反饋:
1)當前項目沒有編譯成功
措施:開發者須要先對當前工程進行編譯,編譯成功後才能運行算法。
2)無效參數
措施:當前項目編譯成功後運行的時候,會對輸入參數進行類型和範圍校驗,存在不合法的參數時沒法點擊「運行」按鈕。
功能限制:
1)須要開發者登陸。
2)當前項目編譯成功並經過了運行測試。
用途:開發者可將已經過運行測試的算法發佈到JUGO技術產品的算法庫中,算法庫是JUGO技術產品的算法倉庫,開發者使用JUGO-IDE發佈的算法會生成一個惟一的算法ID,經過這個算法ID能夠下載該算法,並經過JUGO-SDK使用該算法。
功能限制:須要開發者登陸。
用途:開發者能夠訪問到JUGO技術產品的算法中心的全部算法。算法列表中展現每個算法的名稱、簡介和發佈者,支持關鍵字搜索算法;點擊某一個算法,即跳往該算法的詳情界面,開發者能夠了解到算法更多的信息,並提供了下載該算法的功能入口。
功能描述:開發者能夠經過導出功能將JUGO-IDE中當前選中的文件或文件夾導出到本地,文件夾的格式爲「文件夾名」.rar,文件的格式和當前選中的文件在IDE中的格式保持一致。
JUGO-SDK是JUGO技術產品面向開發者提供的安全多方計算應用開發工具包。
開發者經過使用JUGO-SDK與其餘JUGO技術產品,能夠高效快速的開發MPC(安全多方計算)應用。每一個集成了SDK的應用將做爲計算節點接入到計算網絡中。應用調用SDK能夠實現安全多方計算以知足業務需求。
此文檔面向開發者介紹如何使用JUGO-SDK及其相關注意事項。同時,閱讀此文檔的開發者須要具有分佈式系統中間件(Ice)的基礎知識——JUGO-SDK使用RPC協議進行數據傳輸,使用了Ice中的Glacier2進行防火牆穿透。
支持語言:JAVA語言。
JDK版本:JDK1.8。
開發工具:推薦使用 IntelliJ IDEA。
開發環境:操做系統window/linux,ICE-3.6
調試環境:因爲MPC算法庫目前僅支持.so動態庫(Linux平臺運行),因此開發階段部分功能可在window上進行調試,完整的計算流程須要在Linux環境上進行。
運行環境:目前僅支持運行在Linux環境,推薦:CentOS Linux release 7.2.1511 (Core)。
電路文件:後綴格式規定爲:.gc
接口: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. }
接口: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. }
接口: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]。
接口: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]及的多維數組。
接口: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)由具體電路文件決定。
接口: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. });
接口: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. });
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包所有拷貝到本地項目中依賴引用。
底層算法邏輯使用c/c++進行編寫,JAVA使用JNI進行調用。目前僅提供了Linux環境下的動態庫(.so),所以測試環節需在Linux完成。下載解壓後會獲得一個libjuzixmpc.so動態庫文件,須要更改配置文件mpc-node-config.conf進行配置 。此操做是必須的,不然沒法完成計算操做。
算法動態庫 下載https://jugo.juzix.net/file/libjuzixmpc.zip
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」}
注意:若是配置文件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