---
title: makeShare
description: "两方计算调用此函数对原始数据进行分片，分为计算方0节点和非计算方1节点，当为计算方时先设置isRecvShare为1用于接收非计算方发送的分片，后设置isRecvShare为0用于分片自身的数据。当为非计算方时设置isRecvShare为0用于分片自身的数据，并将分片发送给计算方。三方计算调用此函数对原始数据进行分片，分为计算方0节点、非计算方1、2节点，可以对任意两个节点原始数据进行分片，假设0，1节点有数据，当为计算方时节点0先设置isRecvShare为1用于接收非计算方发送的分片，后设置isRecvShare为0用于分片自身的数据。当为非计算方时节点1设置isRecvShare为0时用于分片自身的数据，并将分片发送给计算方，设置isRecvShare为1时用于接收节点0发送的分片。然后节点2设置isRecvShare为1用于接收0节点发送的分片，设置isRecvShare为1用于接收1节点发送的分片。"
url: https://www.hikunpeng.com/document/detail/zh/kunpengcctrustzone/tee/kcal/kunpeng_kcal_16_0022.html
sourcePath: /source/zh/kunpengcctrustzone/tee/kcal/kunpeng_kcal_16_0022.html
indexId: 098a578a1cd8e95577daa18431c7caf11ab32c037458e50068510d5ba1720a1864
---
# makeShare

两方计算调用此函数对原始数据进行分片，分为计算方0节点和非计算方1节点，当为计算方时先设置isRecvShare为1用于接收非计算方发送的分片，后设置isRecvShare为0用于分片自身的数据。当为非计算方时设置isRecvShare为0用于分片自身的数据，并将分片发送给计算方。三方计算调用此函数对原始数据进行分片，分为计算方0节点、非计算方1、2节点，可以对任意两个节点原始数据进行分片，假设0，1节点有数据，当为计算方时节点0先设置isRecvShare为1用于接收非计算方发送的分片，后设置isRecvShare为0用于分片自身的数据。当为非计算方时节点1设置isRecvShare为0时用于分片自身的数据，并将分片发送给计算方，设置isRecvShare为1时用于接收节点0发送的分片。然后节点2设置isRecvShare为1用于接收0节点发送的分片，设置isRecvShare为1用于接收1节点发送的分片。

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

#### 参数


**表1 参数说明**

| 参数名 | 描述 | 取值范围 | 输入/输出 |
| --- | --- | --- | --- |
| dgTeeCtx | KCAL上下文信息 | 为initTeeCtx成功初始化的结果 | 输入 |
| isRecvShare | 0为自身原始数据分片 1为接收对方数据的分片 | 0或1 | 输入 |
| input | 原始数据，当isRecvShare为0时input可以为NULL，当isRecvShare不为0时不能为NULL | 目前支持double类型 | 输入 |
| share | 分片结果 类型为：DG\_MpcShare | 一级指针为空二级指针不为空 | 输出 |


**表2 DG_TeeInput结构体**

| 名称 | 类型 | 说明 |
| --- | --- | --- |
| data | DG\_MpcDataUnion | 输入数据strings的类型为DG\_String \*，doubleNumbers为double \*, u64Numbers类型为u64 \* |
| size | uint64\_t | 数据量 |
| dataType | DG\_MpcDataType | 数据类型枚举有： MPC\_INT（密态比较） MPC\_DOUBLE（密态加法、密态减法、密态最大值、密态最小值、密态乘法、密态除法、密态求均值、密态求和、密态排序） |


**表3 DG_MpcDataUnion联合体**

| 名称 | 类型 | 说明 |
| --- | --- | --- |
| strings | DG\_String | 字符串数组类型 |
| u64Numbers | u64 | u64数组 |
| doubleNumbers | double | double数组 |


**表4 DG_MpcShare结构体**

| 名称 | 类型 | 说明 |
| --- | --- | --- |
| dataShare | Share | 分片结构 |
| size | unsigned long | 数据量 |
| shareType | DG\_ShareType | 分片类型 |


**表5 DG_ShareType枚举类**

| 名称 | 说明 |
| --- | --- |
| FIX\_POINT | 该分片类型最终revealShare时转为double类型输出 |
| NON\_FIX\_POINT | 该分片类型最终revealShare时转为u64类型输出 |


**表6 Share结构体**

| 名称 | 类型 | 说明 |
| --- | --- | --- |
| shares | u64\* | 一个明文数据对应的多个分片 |
| size | u64 | 分片个数 |


#### 返回值

- 成功：返回0。
- 失败：返回错误码。


#### 错误码


**表7 错误码**

| 错误码 | 错误码值 | 描述 | 特殊说明 |
| --- | --- | --- | --- |
| DG\_FAILURE | 1 | 分片失败 | 参数校验失败 分片失败 接收对方数据失败 |


#### 依赖

- dgTeeCtx依赖  initTeeCtx
的成功初始化。
- 需要先调用negotiateSeeds接口给所有节点分发种子。
- 依赖的头文件为"data_guard_mpc.h"。


#### 示例

- 使用调用DG_InitArithmeticOpts成功后的aritOpts来调用makeShare接口。
- 在两个节点（0计算节点和1计算节点）中调用接口时，若某一调用方返回非成功错误码，需要此调用方通过任务调度通知对端结束业务流程。例如，调用makeShare时1计算节点返回错误码，0计算节点在等待接收，此时需要调用方通知0计算节点停止接收。


```
#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<uint64_t>(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 share 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
```
