鲲鹏社区首页
中文
注册
开发者
我要评分
获取效率
正确性
完整性
易理解
在线提单
论坛求助

makeShare

调用此函数对原始数据进行分片,当isRecvShare为1用于接收对端计算方发送的分片,当isRecvShare为0用于分片自身的数据。计算方0节点需先接收计算方1节点的分片,随后分片自身数据;对应的,计算方1节点先分片自身数据,然后接收计算方0节点的分片。

int makeShare ( 
 DG_TeeCtx *dgTeeCtx,
        int isRecvShare,
        DG_TeeInput *input,
        DG_MpcShare **share 
   )

参数

表1 参数说明

参数名

描述

取值范围

输入/输出

dgTeeCtx

KCAL上下文信息

initTeeCtx成功初始化的结果

输入

isRecvShare

  • 0为自身原始数据分片
  • 1为接收对方数据的分片

01

输入

input

原始数据,当isRecvShare为0时input可以为NULL,当isRecvShare不为0时不能为NULL

目前支持double类型

输入

share

分片结果

类型为:DG_MpcShare

一级指针为空二级指针不为空

输出

表2 DG_TeeInput结构体

名称

类型

说明

data

union

输入数据strings的类型为DG_String *,doubleNumbers为double *, u64Numbers类型为u64 *

size

int

数据量

dataType

DG_MpcDataType

数据类型枚举有:

  • MPC_STRING,(PSI字符串交集、PIR查询)
  • MPC_INT,(密态比较、PSI字符串交集下标)
  • MPC_DOUBLE(密态乘法、密态除法、密态排序、密态求均值、密态求和)
表3 DG_MpcShare结构体

名称

类型

说明

dataShare

Share

分片结构

size

unsigned long

数据量

shareType

DG_ShareType

分片类型

表4 DG_ShareType枚举类

名称

说明

FIX_POINT

该分片类型最终revealShare时转为double类型输出

NON_FIX_POINT

该分片类型最终revealShare时转为u64类型输出

表5 Share结构体

名称

类型

说明

shares

u64*

一个明文数据对应的多个分片

size

u64

分片个数

返回值

  • 成功:返回0。
  • 失败:返回错误码。

错误码

表6 错误码

错误码

错误码值

描述

特殊说明

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计算节点停止接收。