简介:在上一节《安全多方计算(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.&gt;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视频课程