- Published on
原语隐私计算平台的部署与使用
- Authors
- Name
- JiGu
- @crypto20x
原语隐私计算平台
项目地址
https://docs.primihub.com/docs/advance-usage/start/quick-start 快速开始
环境要求
docker
docker-compose
启动服务
拉取代码
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();
}
}