簡介:在上一節《安全多方計算(MPC)從入門到精通:JUGO-IDE及SDK》中,已經介紹了JUGO-IDE及SDK相關的內容,本節也是本系列的最后一篇文章,我們將介紹MPC的經典案例,以及這些案例的代碼及實現流程。
1.業務邏輯
該案例為經典的MPC百萬富翁問題的一個演示,百萬富翁問題是由華裔計算機科學家、圖靈獎獲得者姚期智教授首先提出的。該問題表述為:兩個百萬富翁Alice和Bob想知道他們兩個誰更富有,但他們都不想讓對方知道自己財富的任何信息。
該問題有一些實際應用:假設A希望向B購買一些商品,但她願意支付的最高金額為x元;B希望的最低賣出價為y元。A和B都非常希望知道x與y哪個大。如果x>y,他們都可以開始討價還價;如果z<y,他們就不用浪費口舌。但他們都不想告訴對方自己的出價,以免自己在討價還價中處於不利地位。
2.案例介紹
本案實現了經典的百萬富翁案例,用戶可以在不知道對方的具體數值情況下,與對方計算出誰的數值更大。
3.操作流程
1)在頁面中輸入計算數據值,並向參與計算方發出計算邀請。
2)參與計算方同意並錄入數據后,雙方開始進行安全多方計算。
3)計算完成后將比較結果返回給雙方,完成本次計算任務。
4.所用算法
該案例使用了32位比大小算法電路文件;電路文件是由Frutta語言開發、JUGO IDE編譯;電路文件以與門和或門構成。
一、代碼
該案例中集成了三大部分的代碼。包括:1)算法代碼、2)服務端應用代碼。
1.算法代碼
1. #parties 2 2. #input 1 uint32 3. #input 2 uint32 4. #output 1 uint32 5. function void main() 6. { 7. /* 數據比較電路 (output1=1 && input1>input2)*/ 8. output1 = input1/input2; 9. if(output1>0) 10. { 11. output1 = 1; 12. } 13. }
2.服務端代碼
1)初始化節點
描述
引入JUGO平台SDK庫;
初始化節點,啟動節點監聽(包括發起方節點和接收方節點);
JUGO的節點初始化是以異步形式進行返回。
代碼參考:
1. compare = new Compare(SystemProperties.getDefault().getCompare(), SystemProperties.getDefault().getNode1UserName(), SystemProperties.getDefault().getNode1Password(), mode,SystemProperties.getDefault().getNode1Endpoint(), null, argsAttach); 2. //設置返回的callback對象,處理結果返回數據 3. compare.setOutputCallback(new OutputCallback<Uint32>(Uint32.class){ 4. @Override 5. public void onResult(String taskId, String algorithmId, int resultCode, Uint32 result) { 6. logger.debug("獲取到結果:任務ID:{},算法ID:{},錯誤碼:{},值:{}", 7. taskId, algorithmId, resultCode, result.getValue().toString()); 8. //根據返回值進行判斷結果 9. if(resultCode == 0){ 10. resultMapper.insertData(id, "獲取最終結果,返回數據結果:我方值大於等於對方值,任務id:" + taskId, new Date(),Const.getType_one());} 11. else{ 12. resultMapper.insertData(id, "獲取最終結果,返回數據結果:對方值較大,任務id:" + taskId ,new Date(), Const.getType_one());} 13. } 14. @Override 15. public void onFailure(Throwable e) { 16. e.printStackTrace(); 17. } 18. }); 19. // 邀請方定義輸入參數。對於輸入發起方調用setInputCallbackForORG方法,被邀請方調用setInputCallbackForDST方法。 20. compare.setInputCallbackForORG(new InputCallback<Uint32>() { 21. @Override 22. public Uint32 onInput(String taskId, String algorithmId, String[] args) { 23. resultMapper.insertData(id, "准備參與計算參數,發起計算,任務id:" + taskId, new Date(),Const.getType_one()); 24. //初始化后台輸入參數 25. return new Uint32(BigInteger.valueOf(3)); 26. } 27. @Override 28. public void onFailure(Throwable e) { 29. e.printStackTrace(); 30. } 31. });
2)節點啟動任務
描述:
如果是被邀請方,無需啟動任務
如果是發起方,需要進行啟動任務
JUGO的節點初始化是以異步形式進行返回
代碼參考:
1. //初始化計算雙方 2. List<String> takerList = Arrays.asList(new String[] { "admin01", "admin02" }); 3. //初始化接收結果的參與方 4. List<String> resulReceiverList = Arrays.asList(new String[] { "admin01" , "admin02"}); 5. //啟動節點任務 6. compare.doCompute(SystemProperties.getDefault().getRoomId(), argsAttach, takerList, resulReceiverList);
二、實現流程
1.MPC應用部署
1)准備工作
環境搭建(要求linux系統)
安裝nginx
安裝JDK,配置JDK環境變量
2.項目打包
1)描述:
項目依賴gradle進行構建;
可通過gradle指令進行打包,文件輸出在同級build目錄下;
可通過JAVA IDE打包可執行文件;
2)gradle指令:
1.>cleanbuild
3.項目運行
1)描述:
在環境中執行以下指令進行監聽;
后續可通過統計目錄nohup.out查看輸出日志
2)指令參考:
1.>nohupjava-jarMPCAcceptApp.jar&//啟動接收方節點 2.>nohupjava-jarMPCStartApp.jar&//啟動發起方節點
4.項目調試
部署完畢
在瀏覽器中輸入
http://ip:port/swagger-ui.html,可調試發起方接口
在瀏覽器中輸入
http://ip:port/swagger-ui.html,可調試接收方接口
更多內容可以參考視頻:http://edu.51cto.com/course/14087.html
產品實操請訪問:https://jugo.juzix.net/home