
# 使用分布式数字身份添加存证 - AddEvidenceWithDid
#### 功能介绍
使用DID添加存证。进行该操作的有两种角色，存证持有者和操作员。存证持有者指的是拥有该存证的人，操作员经过授权后可以将存证持有者的存证代为上传的人。存证持有者上传存证时只需要提供自身的DID以及存证持有者对存证文件哈希的签名两个参数。操作员上传存证时，需要提供存证持有者的DID，操作员的DID，操作员对存证文件哈希的签名以及存证持有者对操作员授权的可验证凭证的索引（Verifiable Credential Index）四个参数。注意：只对文件Hash值上链，不对原文进行报送，Hash值需要用户本地生成并保证正确性，请使用SM3算法。
#### 授权信息
账号具备所有API的调用权限，如果使用账号下的IAM用户调用当前API，该IAM用户需具备调用API所需的权限，具体权限要求请参见[权限和授权项](https://support.huaweicloud.com/api-dac/dac_api_006.html)。
#### URI
POST /v1/{project_id}/chains/{chain_id}/evidences/did
表1路径参数 
| 参数         | 是否必选 | 参数类型   | 描述                            |
|:---|:---|:---|:---|
| project_id | 是    | String | 租户从IAM申请到的projectid，一般为32位字符串 |
| chain_id   | 是    | String | 数字资产链实例ID                     |
#### 请求参数
表2请求Body参数 
| 参数                          | 是否必选 | 参数类型    | 描述                                                                                                                                                                                                                    |
|:---|:---|:---|:---|
| owner_did                   | 否    | String  | 存证持有者的did，该值不能为空。                                                                                                                                                                                                     |
| operator_did                | 否    | String  | 上传该存证者的操作员的去中心化标识符，如果是本人上传存证，此时该值为空值。                                                                                                                                                                                 |
| verifiable_credential_index | 否    | String  | 当操作员上传存证时，存证持有者首先要使用智能合约向操作员签发一个可以执行操作的可验证凭证（Verifiable Crendential，VC），签发VC成功后智能合约会返回一个索引，这个索引称之为verifiable_credential_index。操作员上传存证时需要同时将授权的索引verifiable_credential_index作为参数进行传递，链上可以根据这个参数查询存证持有者对操作员授权的VC进行授权验证。 |
| signature                   | 否    | String  | 如果是存证持有者本人进行存证操作，那么存证本人需要对存证文件的哈希值进行签名；如果是操作员代替存证持有者进行存证操作，那么操作员需要对存证文件的哈希值进行签名，哈希算法请使用SM3算法，该值不能为空。                                                                                                                  |
| charge_type                 | 否    | String  | 存证类型, normal:普通存证                                                                                                                                                                                                     |
| name                        | 否    | String  | 存证名称，默认为文件名称                                                                                                                                                                                                          |
| file_hash                   | 否    | String  | 文件hash值。                                                                                                                                                                                                              |
| platform_name               | 否    | String  | 平台名称，用户定义的平台名称                                                                                                                                                                                                        |
| data_type                   | 否    | Integer | 存证的文件类型，1:文件类型2:图片类型3:视频类型4:音频类型5:其他                                                                                                                                                                                  |
   
#### 响应参数
**状态码：200**
表3响应Body参数 
| 参数    | 参数类型   | 描述           |
|:---|:---|:---|
| tx_id | String | 交易ID, 64位哈希值 |
| ev_id | String | 存证ID         |
   
**状态码：400**
表4响应Body参数 
| 参数         | 参数类型   | 描述   |
|:---|:---|:---|
| error_code | String | 错误码  |
| error_msg  | String | 错误描述 |
   
**状态码：401**
表5响应Body参数 
| 参数         | 参数类型   | 描述   |
|:---|:---|:---|
| error_code | String | 错误码  |
| error_msg  | String | 错误描述 |
   
**状态码：403**
表6响应Body参数 
| 参数         | 参数类型   | 描述   |
|:---|:---|:---|
| error_code | String | 错误码  |
| error_msg  | String | 错误描述 |
   
**状态码：500**
表7响应Body参数 
| 参数         | 参数类型   | 描述   |
|:---|:---|:---|
| error_code | String | 错误码  |
| error_msg  | String | 错误描述 |
   
#### 请求示例
```
{
  "charge_type" : "normal",
  "name" : "test.pgn",
  "file_hash" : "501da8f081152990fe2e896f83124a0dc55f1562fe5fc67ede08332a082cb410",
  "platform_name" : "test",
  "data_type" : 1
}
```
#### 响应示例
**状态码：200**
success
```
{
  "tx_id" : "e5e967bb14f97734c9957560267357ee916918bd5dd5130e30fe6e88ca2c76df",
  "ev_id" : "7484b9b5b4bc11ed87c64a2b0e716f7e"
}
```
**状态码：400**
Error response
```
{
  "error_code" : "TDE.40000400",
  "error_msg" : "InvokeReq params invalid"
}
```
**状态码：401**
Error response
```
{
  "error_code" : "TDE.40100401",
  "error_msg" : "unauthorized user"
}
```
**状态码：403**
Error response
```
{
  "error_code" : "TDE.40300403",
  "error_msg" : "c59b99a1-32e8-11ef-8e12-0255ac100037 chainID does not exist"
}
```
**状态码：500**
Error response
-
  ```
  {
    "error_code" : "TDE.50010010",
    "error_msg" : "Internal error"
  }
  ```
-
  ```
  {
    "error_code" : "TDE.50010019",
    "error_msg" : "c59b99a1-32e8-11ef-8e12-0255ac100037 chainID status is Unavailable"
  }
  ```
-
  ```
  {
    "error_code" : "TDE.50004001",
    "error_msg" : "db query error"
  }
  ```
-
  ```
  {
    "error_code" : "TDE.50010011",
    "error_msg" : "the file hash already exist"
  }
  ```
#### 状态码
| 状态码 | 描述             |
|:---|:---|
| 200 | success        |
| 400 | Error response |
| 401 | Error response |
| 403 | Error response |
| 500 | Error response |
   
