---
title: makeShare
description: "调用此函数对原始数据进行分片，分为计算方0节点和非计算方1节点，当为计算方时先设置isRecvShare为1用于接收非计算方发送的分片，后设置isRecvShare为0用于分片自身的数据。当为非计算方时设置isRecvShare为0用于分片自身的数据，并将分片发送给计算方。"
url: https://www.hikunpeng.com/document/detail/zh/kunpengcctrustzone/tee/kcal/kunpeng_kcal_16_0085.html
sourcePath: /source/zh/kunpengcctrustzone/tee/kcal/kunpeng_kcal_16_0085.html
indexId: d6cba1a3ed10ff85b6914021ea13684f63ec854604763660366e13b82d06c6b564
---
# makeShare

调用此函数对原始数据进行分片，分为计算方0节点和非计算方1节点，当为计算方时先设置isRecvShare为1用于接收非计算方发送的分片，后设置isRecvShare为0用于分片自身的数据。当为非计算方时设置isRecvShare为0用于分片自身的数据，并将分片发送给计算方。

```
int makeShare(
DG_TeeCtx *dgTeeCtx,
int isRecvShare,
DG_TeeMatInput *input,
DG_MpcMatShare **share
)
```

#### 参数

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


**表1 DG_TeeMatInput结构体**

| 名称 | 类型 | 说明 |
| --- | --- | --- |
| data | DG\_MpcDataUnion | 输入数据中，strings的类型为DG\_String \*，doubleNumbers为double \*，u64Numbers类型为u64 \* |
| row | uint32\_t | 矩阵行数 |
| col | uint32\_t | 矩阵列数 |
| dataType | DG\_MpcDataType | 数据类型枚举有： MPC\_DOUBLE（密态矩阵加法、密态矩阵减法、密态矩阵乘法） |


**表2 DG_MpcDataUnion联合体**

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


**表3 DG_MpcMatShare结构体**

| 名称 | 类型 | 说明 |
| --- | --- | --- |
| dataShare | Share | 分片结构 |
| row | unsigned long | 矩阵行数 |
| col | unsigned long | 矩阵列数 |
| shareType | DG\_ShareType | 分片类型 |


```
ShareType
enum DG_ShareType {
FIX_POINT, // 定点数
NON_FIX_POINT // 非定点数
};
```


**表4 Share结构体**

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


#### 返回值

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


#### 错误码

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


#### 依赖

- aritOpts依赖  DG_InitMatrixOpts
成功初始化矩阵算术类函数组。
- 需要先调用negotiateSeeds接口给所有节点分发种子。
- 依赖的头文件为"data_guard_mpc.h"。


#### 示例

- 使用调用DG_InitMatrixOpts成功后的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_TeeMatInput teeInput;
teeInput.data.doubleNumbers = inData.get();
teeInput.row = row; // 假设矩阵行数为row。
teeInput.col = col; // 假设矩阵列数为col。
teeInput.dataType = MPC_DOUBLE;
printf("++++++++++input data size:%lu\n", teeInput.size);
int res = aritOpts.negotiateSeeds(dgTee);
printf("exchange seed res = %d\n", res);
DG_MpcMatShareSet shareDat;
std::unique_ptr<DG_MpcMatShare[]> share = std::make_unique<DG_MpcMatShare[]>(2);
DG_MpcMatShare *share1 = nullptr;
DG_MpcMatShare *share2 = nullptr;
DG_TeeMatOutput *output = nullptr;
if (nodeId == 0) {
res = aritOpts.makeShare(dgTee, 1, nullptr, &share1);  // &teeInput
```

说明：样例只做参考，方便测试从文件中读取数据，并不能真正运行。

测试结果：res为0，share不为null。
