makeShare
调用此函数对原始数据进行分片,当isRecvShare为1用于接收对端计算方发送的分片,当isRecvShare为0用于分片自身的数据。计算方0节点需先接收计算方1节点的分片,随后分片自身数据;对应的,计算方1节点先分片自身数据,然后接收计算方0节点的分片。
int makeShare (
DG_TeeCtx *dgTeeCtx,
int isRecvShare,
DG_TeeInput *input,
DG_MpcShare **share
)
参数
参数名 |
描述 |
取值范围 |
输入/输出 |
|---|---|---|---|
dgTeeCtx |
KCAL上下文信息 |
为initTeeCtx成功初始化的结果 |
输入 |
isRecvShare |
|
0或1 |
输入 |
input |
原始数据,当isRecvShare为0时input可以为NULL,当isRecvShare不为0时不能为NULL |
目前支持double类型 |
输入 |
share |
分片结果 类型为:DG_MpcShare |
一级指针为空二级指针不为空 |
输出 |
名称 |
类型 |
说明 |
|---|---|---|
data |
union |
输入数据strings的类型为DG_String *,doubleNumbers为double *, u64Numbers类型为u64 * |
size |
int |
数据量 |
dataType |
DG_MpcDataType |
数据类型枚举有:
|
名称 |
类型 |
说明 |
|---|---|---|
dataShare |
Share |
分片结构 |
size |
unsigned long |
数据量 |
shareType |
DG_ShareType |
分片类型 |
名称 |
说明 |
|---|---|
FIX_POINT |
该分片类型最终revealShare时转为double类型输出 |
NON_FIX_POINT |
该分片类型最终revealShare时转为u64类型输出 |
名称 |
类型 |
说明 |
|---|---|---|
shares |
u64* |
一个明文数据对应的多个分片 |
size |
u64 |
分片个数 |
返回值
- 成功:返回0。
- 失败:返回错误码。
错误码
错误码 |
错误码值 |
描述 |
特殊说明 |
|---|---|---|---|
DG_FAILURE |
4501 |
分片失败 |
参数校验失败 分片失败 接收对方数据失败 |
依赖
- aritOpts依赖initTeeCtx的成功初始化KCAL函数组。
- 需要先调用negotiateSeeds接口给所有节点分发种子。
- 依赖的头文件为 #include "data_guard_mpc.h"。
示例
#include "data_guard_mpc.h"
std::unique_ptr<double[]> inData = std::make_unique<double[]>(datas.size());
for (int i = 0; i < datas.size(); i++) {
inData[i] = (std::stod(datas[i].c_str())) * 1.0;
}
// 计算方分片DG_TeeInput teeInput;
teeInput.data.doubleNumbers = inData.get();
teeInput.size = static_cast<int>(datas.size());
teeInput.dataType = MPC_DOUBLE;
int res = aritOpts.negotiateSeeds(dgTee);
printf("exchange seed res = %d\n", res);
DG_MpcShareSet shareDat;
std::unique_ptr<DG_MpcShare[]> share = std::make_unique<DG_MpcShare[]>(2);
DG_MpcShare *share1 = nullptr;
DG_MpcShare *share2 = nullptr;
DG_TeeOutput *output = nullptr;
if (nodeId == 0) { // 0计算节点先接收1计算节点分片再自身分片
res = aritOpts.makeShare(dgTee, 1, nullptr, &share1); // teeInput
if (res != 0) {
printf("node 0 recv share data.[ret=%d]\n", res);
return res;
}
res = aritOpts.makeShare(dgTee, 0, teeInput, &share2);
if (res != 0) {
printf("node 0 make share self shar data fail.[ret=%d]\n", res);
return res;
}
} else { // 对应地,1计算节点先自身分片再接收0计算节点分片
res = aritOpts.makeShare(dgTee, 0, teeInput, &share1);
if (res != 0) {
printf("node 1 make share self shar data fail.[ret=%d]\n", res);
return res;
}
res = aritOpts.makeShare(dgTee, 1, nullptr, &share2);
if (res != 0) {
printf("make share self shar data.[ret=%d]\n", res);
return res;
}
}
测试结果:res 为 0 share1 和 share2 不为NULL
// 计算方分片
说明:样例只做参考,方便测试从文件中读取数据,并不能真正运行。
测试结果:res 为 0,share 不为NULL
- 调用DG_InitArithmeticOpts成功后的aritOpts来调用makeShare接口。
- 在两个节点(0计算节点和1计算节点)中调用接口时,若一方接口返回非成功错误码,需要调用方通过任务调度通知对端结束业务流程。例如,调用makeShare时1计算节点返回错误码,0计算节点在等待接收,此时需要调用方通知0计算节点停止接收。
父主题: 算术类算子