Published on

原语隐私计算平台的部署与使用

Authors

原语隐私计算平台

项目地址

https://github.com/primihub

https://docs.primihub.com/docs/advance-usage/start/quick-start 快速开始

环境要求

启动服务

拉取代码

git clone https://github.com/primihub/primihub.git
cd primihub

选择最新的稳定版本

git tag -l

# 目前最新的release是1.7.0
git checkout 1.7.0 -b test

启动

docker-compose up -d

显示如下输出,表示启动成功

NAME             IMAGE                                     COMMAND                  SERVICE   CREATED       STATUS                 PORTS
primihub-meta0   docker.io/primihub/primihub-meta:latest   "/bin/bash -c 'java …"   meta0     2 hours ago   Up 2 hours (healthy)
primihub-meta1   docker.io/primihub/primihub-meta:latest   "/bin/bash -c 'java …"   meta1     2 hours ago   Up 2 hours (healthy)
primihub-meta2   docker.io/primihub/primihub-meta:latest   "/bin/bash -c 'java …"   meta2     2 hours ago   Up 2 hours (healthy)
primihub-node0   docker.io/primihub/primihub-node:latest   "/bin/bash -c 'GLOG_…"   node0     2 hours ago   Up 2 hours             50050/tcp
primihub-node1   docker.io/primihub/primihub-node:latest   "/bin/bash -c 'GLOG_…"   node1     2 hours ago   Up 2 hours             50050/tcp
primihub-node2   docker.io/primihub/primihub-node:latest   "/bin/bash -c 'GLOG_…"   node2     2 hours ago   Up 2 hours             50050/tcp

3个meta,3个node

运行一个sample

进入一个容器节点

docker exec -it primihub-node0 bash

执行一个MPC加法计算

./primihub-cli --task_config_file="example/mpc_add_task_conf.json"

结果在容器的data/result/mpc_add_result.csv目录,这个目录是代码库里的data路径映射进来的, 在宿主机也能查看。

其他任务的cli执行也大同小异,在执行自定义python算法时报错,找不到ph_secure_lib.so,待官方解决

使用java-sdk执行任务

按照官方教程进行 https://docs.primihub.com/docs/advance-usage/java-sdk/java-install

需要将docker-compose.yaml里的50050端口映射出来

加入maven依赖,sdk最新版本是1.0.1

    <dependency>
      <groupId>com.primihub</groupId>
      <artifactId>primihub-sdk</artifactId>
      <version>1.0.1</version>
  </dependency>

从maven仓库直接拉的库有点问题,跟官方github上的代码对不上,初步怀疑他们发布maven包后,没有 更改版本号,本地的包mvn install的时候替换了,但是远端的包因为版本号一样,没有更新。等会 使用会遇到一点问题。

执行MPC乘法

官方给的例子是PIR任务,即隐私求交,我写一个MPC乘法的例子。

核心代码

    public static void MyMpc(){

      GrpcClientConfig grpcClientConfig = new GrpcClientConfig();
      grpcClientConfig.setAddress("127.0.0.1");
      grpcClientConfig.setPort(50050);


      new TaskMPCParam(){
          public String a;
      };
      
      try {
          TaskHelper taskHelper = TaskHelper.getInstance(grpcClientConfig);
          // 发起一个MPC任务
          TaskParam<TaskMPCParam> taskParam = new TaskParam<>(new TaskMPCParam());
          // 设置taskID
          taskParam.setTaskId(UUID.randomUUID().toString().replace("-",""));

          // 设置MPC参数
          Map<String, Object> m = new HashMap<>();
          m.put("ResFileName", "data/result/mpc_mul_result_java.csv");
          m.put("Expr", "A*B*C");
          m.put("RevealToParties", "PARTY2");
          m.put("Col_And_Owner", "A-PARTY0;B-PARTY1;C-PARTY2;D-PARTY2");
          m.put("Col_And_Dtype", "A-0;B-0;C-0;D-0");
          m.put("Accuracy", "D16");
          taskParam.getTaskContentParam().setParamMap(m);

          taskParam.getTaskContentParam().setResourceIds(
              new ArrayList<String>(){{
                  add("mpc_arithmetic_0");
                  add("mpc_arithmetic_1");
                  add("mpc_arithmetic_2");
              }}
          );
          
          taskParam.getTaskContentParam().setTaskName("arithmetic");
          //taskParam.getTaskContentParam().setTaskCode("arithmetic")
          
          // 提交任务 - 阻塞持续获取任务状态
          taskHelper.submit(taskParam);
      }catch (Exception e){
          System.out.println("错误信息:");
          e.printStackTrace();
      }

由于maven拉取的sdk版本与github的不一致,导致maven版本的sdk没有setTaskCode方法 需要将setTaskName设置为arithmetic,早期版本任务名和算法名,可能公用一个字段。 这样就可以运行了。

GitHub上的新版本应该是分开的。

  taskParam.getTaskContentParam().setTaskName("arithmetic");

  taskParam.getTaskContentParam().setTaskCode("arithmetic")

算法名,应该是对应任务json文件task_code字段的值

    "task_code": {
      "code_file_path": "",
      "code": "arithmetic"
  },

每个example里面都有,可以根据example来改写代码

setResourceIds对应的是

    "party_datasets": {
      "PARTY0": {
        "Data_File": "mpc_arithmetic_0"
      },
      "PARTY1": {
        "Data_File": "mpc_arithmetic_1"
      },
      "PARTY2": {
        "Data_File": "mpc_arithmetic_2"
      }
  }

按照数组的顺序,分别对应PARTY0; PARTY1; PARTY2

导入自己的数据集


  public static void registerDataSet(){

    GrpcClientConfig grpcClientConfig = new GrpcClientConfig();
    grpcClientConfig.setAddress("127.0.0.1");
    grpcClientConfig.setPort(50050);
    
    try {
        TaskHelper taskHelper = TaskHelper.getInstance(grpcClientConfig);
        // 发起一个MPC任务
        
        TaskParam<TaskDataSetParam> taskParam = new TaskParam<>(new TaskDataSetParam());
        // 设置taskID
        taskParam.setTaskId(UUID.randomUUID().toString().replace("-",""));

        taskParam.getTaskContentParam().setAccessInfo("data/reg_test_a.csv");
        taskParam.getTaskContentParam().setDriver("csv");
        taskParam.getTaskContentParam().setId("test_data_a");
        
        taskParam.getTaskContentParam().setFieldTypes(new ArrayList<TaskDataSetParam.FieldType>(){{
            add(new TaskDataSetParam.FieldType("BB", FieldTypeEnum.LONG)); 
        }});

        // 提交任务 - 阻塞持续获取任务状态
        taskHelper.submit(taskParam);
    }catch (Exception e){
        System.out.println("错误信息:");
        e.printStackTrace();
    }
  }