diff --git a/MPC/third_party_adaptor/secrerflow/psi/README.md b/MPC/third_party_adaptor/secrerflow/psi/README.md index 851710a76a23a110a3c7d4da585dc2ec9d7d067a..cf5f23a8e936d2c25fba3049ce091dfa48b0ef94 100644 --- a/MPC/third_party_adaptor/secrerflow/psi/README.md +++ b/MPC/third_party_adaptor/secrerflow/psi/README.md @@ -1,105 +1,175 @@ -# 前置条件 +# KCAL 中间件适配蚂蚁 psi 库 -1. 需获取 `kcal` 包,含 `include` 和 `lib` 目录 -2. 需要 bazel 编译构建工具,编译环境依赖参考:[devtools/dockerfiles/release-ci-aarch64.DockerFile at main · secretflow/devtools](https://github.com/secretflow/devtools/blob/main/dockerfiles/release-ci-aarch64.DockerFile) -3. 运行环境为`virtCCA cvm`​ +本文档介绍 KCAL 中间件如何在 virtCCA 内部署已经适配了的蚂蚁 psi 库(`tag: psi-v0.6.0.dev250507` 版本) -# 中间件在蚂蚁 psi 库的编译 +## 前置条件 -## 创建工作目录 +1. 需获取 `kcal` 包,含 `include` 和 `lib` 目录,获取链接:[https://support.huawei.com/enterprise/zh/software/265814201-ESW2001490913](https://support.huawei.com/enterprise/zh/software/265814201-ESW2001490913) +2. 需要 bazel 编译构建工具,编译环境依赖参考:[devtools/dockerfiles/release-ci-aarch64.DockerFile at main · secretflow/devtools](https://github.com/secretflow/devtools/blob/main/dockerfiles/release-ci-aarch64.DockerFile) +3. 运行环境为`virtCCA cvm,前提是用户已经启动两个 virtCCA 的机密虚机(cvm1、cvm2)`​ -为方便进行演示,以下操作均以 `/home/admin/dev` 目录作为工作主目录 +## 中间件使能和部署步骤 -## clone virtCCA\_sdk 仓 +### 宿主机编译蚂蚁 psi 库 -```shell -cd /home/admin/dev +1. 创建工作目录 -git clone https://gitee.com/openeuler/virtCCA_sdk.git -``` + 为方便进行演示,以下操作均以 `/home/admin/dev` 目录作为工作主目录 -## clone 蚂蚁 psi 仓,应用 patch +2. clone virtCCA\_sdk 仓 -注:目前已适配蚂蚁 `tag: psi-v0.6.0.dev250507` 版本的 `psi`库 + ```bash + cd /home/admin/dev -```shell -cd /home/admin/dev + git clone https://gitee.com/openeuler/virtCCA_sdk.git + ``` -# clone 仓库,并创建一个本地分支 -git clone --branch "v0.6.0.dev250507" https://github.com/secretflow/psi.git -git switch -c kcal-on-v0.6.0 +3. clone 蚂蚁 psi 仓,应用 patch -# 应用 virtCCA_sdk 下面的 patch -cd /home/admin/dev/psi # 进到蚂蚁 psi 目录下 -git apply /home/admin/dev/virtCCA_sdk/MPC/third_party_adaptor/secrerflow/psi/patches/kcal.patch -``` + ```bash + cd /home/admin/dev -## 引入中间件和 kcal 库 + # clone 仓库,并创建一个本地分支 + git clone --branch "v0.6.0.dev250507" https://github.com/secretflow/psi.git + git switch -c kcal-on-v0.6.0 -### 引入 kcal 库 + # 应用 virtCCA_sdk 下面的 patch + cd /home/admin/dev/psi # 进到蚂蚁 psi 目录下 + git apply /home/admin/dev/virtCCA_sdk/MPC/third_party_adaptor/secrerflow/psi/patches/kcal.patch + ``` -```shell -# 假设 kcal 库已下载在 /opt/kcal 目录下 -cp -r /opt/kcal/include /home/admin/dev/psi/third_party/kcal/ -cp -r /opt/kcal/lib /home/admin/dev/psi/third_party/kcal/ -``` +4. 引入中间件和 kcal 库 -### 引入中间件 + ```bash + # 假设 kcal 库已下载在 /opt/kcal 目录下 + cp -r /opt/kcal/include /home/admin/dev/psi/third_party/kcal/ + cp -r /opt/kcal/lib /home/admin/dev/psi/third_party/kcal/ -```shell -cp -r /home/admin/dev/virtCCA_sdk/MPC/middleware/* /home/admin/dev/psi/third_party/kcal_middleware/ -``` + # 引入中间件 + cp -r /home/admin/dev/virtCCA_sdk/MPC/middleware/* /home/admin/dev/psi/third_party/kcal_middleware/ + ``` -## 执行编译 +5. 编译 -```shell -cd /home/admin/dev/psi + ```bash + cd /home/admin/dev/psi -bazel build //... -c opt -``` + bazel build //... -c opt -编译完成后,在`bazel-bin/psi/apps/psi_launcher`目录下生成`main`可执行文件,后续可通过执行`./bazel-bin/psi/apps/psi_launcher/main --config xxx.json`进行验证 + # 创建临时目录 bin,存放 main 可执行文件 + mkdir bin + cp ./bazel-bin/psi/apps/psi_launcher/main ./bin/main + ``` -## 将二进制部署至 virtCCA 内 + 编译完成后,在`bazel-bin/psi/apps/psi_launcher`目录下生成`main`可执行文件 + +### 部署至 virtCCA 内 可让`/home/admin/dev/psi`的目录结构与`virtCCA`内部保持一致,方便进行测试 -# kcal psi 在蚂蚁 psi 库上的测试 +```bash +# cvm 内创建目录 +virsh console cvm +mkdir -p /home/admin/dev + +# 宿主机内,拷贝蚂蚁 psi 编译后项目整体至 cvm 内 +cd /home/admin/dev +tar -czvf psi.tar.gz psi +scp -r /home/admin/dev/psi.tar.gz root@:/home/admin/dev/ -编译完成后,进入`/home/admin/dev/psi`目录,步骤可参考:`examples/psi/README.md`​ +# 进入 cvm 内,解压 +virsh console cvm +cd /home/admin/dev && tar -xzvf psi.tar.gz +``` -## 生成 psi 测试数据 +## KCAL 中间件适配蚂蚁 psi 库测试 + +### 测试数据准备 + +#### 宿主机侧数据生成 + +1. 进入`/home/admin/dev/psi`目录 +2. PSI 算法数据生成 + + 步骤可参考:`examples/psi/README.md`​ + + ```bash + python examples/psi/generate_psi_data.py \ + --receiver_item_cnt 1e6 \ + --sender_item_cnt 1e6 \ + --intersection_cnt 8e4 \ + --id_cnt 2 \ + --receiver_path /tmp/receiver_input.csv \ + --sender_path /tmp/sender_input.csv \ + --intersection_path /tmp/intersection.csv + ``` + + > 说明: + > + > --receiver_item_cnt:receiver 方拥有的数据总量 + > + > --sender_item_cnt:sender 方拥有的数据总量 + > + > --intersection_cnt:约定两方产生交集部分的数据总量 + > + > --id_cnt:每个参与方的输入数据包含几个字段 + > + > --receiver_path:receiver 方输入数据的文件位置 + > + > --sender_path:sender 方输入数据的文件位置 + > + > --intersection_path:生成的交集数据的文件位置 + > +3. PIR 算法数据生成 + + 步骤可参考:`examples/pir/README.md`​ + + ```bash + python examples/pir/apsi/test_data_creator.py \ + --sender_size=10000000 \ + --receiver_size=1000 \ + --intersection_size=100 \ + --label_byte_count=100 \ + --item_byte_count=16 + + # 生成的用来最后比对结果的交集集合 + mv ground_truth.csv /tmp/ground_truth.csv + # 数据库模拟数据 + mv db.csv /tmp/db.csv + # 查询数据 + mv query.csv /tmp/query.csv + ``` + + > 说明: + > + > --sender_size:服务端数据库总体数据行数 + > + > --receiver_size:客户端要查询的 key 的数量 + > + > --intersection_size:实际上生成的数据里面,服务端只有 intersection_size 个包含客户端能够查到的键值 + > + > --label_byte_count:服务端数据库每个 value 所占的字节数 + > + > --item_byte_count:服务端数据库每个 key 所占的字节数 + > + +#### 拷贝测试数据至 virtCCA 内 + +将 PSI PIR 的测试数据分别拷贝进两个 virtCCA 内 ```bash -cd /home/admin/dev/psi - -python examples/psi/generate_psi_data.py \ - --receiver_item_cnt 1e6 \ - --sender_item_cnt 1e6 \ - --intersection_cnt 8e4 \ - --id_cnt 2 \ - --receiver_path /tmp/receiver_input.csv \ - --sender_path /tmp/sender_input.csv \ - --intersection_path /tmp/intersection.csv +scp /tmp/receiver_input.csv \ + /tmp/sender_input.csv \ + /tmp/intersection.csv \ + /tmp/ground_truth.csv \ + /tmp/db.csv \ + /tmp/query.csv \ + root@:/tmp/ ``` -> 说明: -> -> --receiver_item_cnt:receiver 方拥有的数据总量 -> -> --sender_item_cnt:sender 方拥有的数据总量 -> -> --intersection_cnt:约定两方产生交集部分的数据总量 -> -> --id_cnt:每个参与方的输入数据包含几个字段 -> -> --receiver_path:receiver 方输入数据的文件位置 -> -> --sender_path:sender 方输入数据的文件位置 -> -> --intersection_path:生成的交集数据的文件位置 - -## 配置文件说明 +### KCAL PSI 测试 + +#### 配置文件说明 配置文件已在`patch`中提供,只需修改下列说明的部分进行测试 @@ -114,13 +184,13 @@ python examples/psi/generate_psi_data.py \ "thread_count": 16 // 线程数按需修改,目前固定 16 线程 }, "role": "ROLE_SENDER", - "broadcast_result": true + "broadcast_result": true }, "input_config": { "type": "IO_TYPE_FILE_CSV", "path": "/tmp/sender_input.csv" // 当前参与方运行 psi 算法的数据输入文件位置,按需修改 }, - "output_config": { + "output_config": { "type": "IO_TYPE_FILE_CSV", // 文件类型不需修改 "path": "/tmp/kcal_sender_output.csv" // 两方运行完 psi 算法后,最终交集文件的输出位置,按需修改 }, @@ -151,17 +221,17 @@ python examples/psi/generate_psi_data.py \ ``` -### kcal 两个配置文件 +#### kcal 两个配置文件 - examples/psi/config/kcal_receiver.json - examples/psi/config/kcal_sender.json -### 蚂蚁对比配置文件 +#### 蚂蚁对比配置文件 - examples/psi/config/rr22_receiver_recovery.json - examples/psi/config/rr22_sender_recovery.json -## 测试 +#### 测试 进入两个 cvm 分别执行以下命令 @@ -176,44 +246,15 @@ cd /home/admin/dev/psi 运行完以上命令后,每个`cvm`内会在配置文件中指明的`output_config.path`路径中生成交集文件 -## 结果对比 +#### 结果对比 将`/tmp/kcal_sender_output.csv`、`/tmp/kcal_receiver_output.csv`的内容与一开始生成的交集文件`/tmp/intersection.csv`内容进行比对,结果保持一致 -# kcal pir 在蚂蚁 psi 库上的测试 +### KCAL PIR 测试 编译完成后,进入`/home/admin/dev/psi`目录,步骤可参考:`examples/pir/README.md`​ -## 生成 pir 测试数据 - -```bash -cd /home/admin/dev/psi - -python examples/pir/apsi/test_data_creator.py \ - --sender_size=10000000 \ - --receiver_size=1000 \ - --intersection_size=100 \ - --label_byte_count=100 \ - --item_byte_count=16 - -mv ground_truth.csv /tmp/ground_truth.csv -mv db.csv /tmp/db.csv -mv query.csv /tmp/query.csv -``` - -> 说明: -> -> --sender_size:服务端数据库总体数据行数 -> -> --receiver_size:客户端要查询的 key 的数量 -> -> --intersection_size:实际上生成的数据里面,服务端只有 intersection_size 个包含客户端能够查到的键值 -> -> --label_byte_count:服务端数据库每个 value 所占的字节数 -> -> --item_byte_count:服务端数据库每个 key 所占的字节数 - -## 配置文件说明 +#### 配置文件说明 配置文件已在`patch`中提供,只需修改下列说明的部分进行测试 @@ -263,18 +304,18 @@ mv query.csv /tmp/query.csv } ``` -### kcal 两个配置文件 +#### kcal 两个配置文件 - examples/pir/config/kcal_pir_receiver.json - examples/pir/config/kcal_pir_sender.json -### 蚂蚁对比配置文件 +#### 蚂蚁对比配置文件 - examples/pir/config/apsi_sender_setup.json - examples/pir/config/apsi_sender_online.json - examples/pir/config/apsi_receiver.json -## 测试 +#### 测试 进入两个 cvm 分别执行以下命令 @@ -289,6 +330,6 @@ cd /home/admin/dev/psi 运行完以上命令后,客户端`cvm`内会在配置文件中指明的`kcal_pir_receiver_config.output_file`路径中生成查询结果文件 -## 结果对比 +#### 结果对比 将`/tmp/result.csv`的内容与一开始生成的交集文件`/tmp/ground_truth.csv`内容进行比对,结果保持一致