簡介:在上一節《安全多方計算(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 可調試接收方接口
更多內容可以參考視頻:安全多方計算MPC視頻課程