
# 链代码调用（公测）
#### 功能介绍
对已经部署并已经实例化的区块链链代码进行调用（invoke）和查询（query）。
#### URI
POST /v1/chaincode/operation
#### 请求消息
表1请求参数 
| 参数               | 是否必选 | 参数类型   | 描述                                                                                                                                                                                                                                                                                                                                |
|:---|:---|:---|:---|
| channelId        | 是    | String | 区块链通道ID                                                                                                                                                                                                                                                                                                                           |
| chaincodeId      | 是    | String | 链代码ID                                                                                                                                                                                                                                                                                                                             |
| chaincodeVersion | 否    | String | 链代码版本                                                                                                                                                                                                                                                                                                                             |
| userId           | 是    | String | 由组织CA签发的用户ID，目前区块链服务默认生成的都为User1                                                                                                                                                                                                                                                                                                  |
| orgId            | 是    | String | 区块链组织ID                                                                                                                                                                                                                                                                                                                           |
| orgPeers         | 是    | String | 由组织中每个节点的组织ID和域名组成的数组，形如： \[{"orgId":"7258adda1803f4137eff4813e7aba323018200c5","peerDomainName":"peer-7258adda1803f4137eff4813e7aba323018200c5-0.peer-7258adda1803f4137eff4813e7aba323018200c5.default.svc.cluster.local"}\] |
| opmethod         | 是    | String | 区块链链码调用类型，目前只有两类调用方法：invoke和query。                                                                                                                                                                                                                                                                                                |
| args             | 是    | String | 链码调用参数，形如：\["invoke","a","b","1"\]                                                                                                                                                                                                                                                                                                |
| timestamp        | 是    | String | 格式为2018-10-31T17:28:16+08:00                                                                                                                                                                                                                                                                                                      |
| cert             | 是    | String | 用户的证书文件，以字符串形式上传                                                                                                                                                                                                                                                                                                                  |
   
![](https://support.huaweicloud.com/devg-bcs/public_sys-resources/note_3.0-zh-cn.png)
以上参数获取方式，详细参见用户指南中的[链代码管理](https://support.huaweicloud.com/usermanual-bcs/bcs_usermanual_0003.html)链代码管理和[区块浏览器](https://support.huaweicloud.com/usermanual-bcs/bcs_usermanual_0008.html)章节。
- 在链代码管理页面中，单击链代码名称前的![](https://support.huaweicloud.com/devg-bcs/zh-cn_image_0000001091758932.png)，展开链代码详细信息，您可以查看当前链代码的版本列表、安装列表和实例化情况。
- 在区块浏览器页面中，在通道下拉框中选择一个通道，下方的数据即可实时刷新供您查看多项数据。区块链相关信息的查询功能，包括区块数量、交易数量、区块详细信息、交易详细信息、性能数据及节点状态等。
- 为了保证交易安全性，需要使用Fabric用户证书（证书获取方式请见[下载用户证书]）中的私钥对请求消息体进行签名（目前只支持椭圆曲线，暂不支持国密等其他加密算法），并将签名结果放到消息头部x-bcs-signature-sign字段。
 
链码REST API自定义了一些消息头，请参见[表2]。
 表2自定义消息头 
| 名称                        | 是否必选 | 描述                        |
|:---|:---|:---|
| x-bcs-signature-sign      | 是    | 链码调用请求消息体签名。              |
| x-bcs-signature-method    | 是    | 加密类型，目前固定是SW。             |
| x-bcs-signature-sign-gzip | 是    | Sign是否选择Gzip压缩。0表示否，1表示是。 |
   
![](https://support.huaweicloud.com/devg-bcs/public_sys-resources/note_3.0-zh-cn.png)
x-bcs-signature-sign：为了保证只允许有权限的调用端才能够进行合法的链码调用，需要使用[下载用户证书]中下载的用户私钥以ECDSA椭圆曲线的加密方式对整个请求消息体的SHA256摘要进行加密签名，x-bcs-signature-sign值即为签名结果。
 #### 下载用户证书
进行API调用前，需要下载区块链服务中已经配置生成的用户证书。
1. 登录华为云区块链服务控制台。
2. 进入"实例管理"界面，可以看到已经购买的区块链实例卡片。
3. 单击卡片上的"获取客户端配置"，勾选"Peer节点证书"。选择指定节点组织，勾选"用户证书"。
4. 单击"下载"，下载相应组织的用户证书。
5. 解压证书，其中msp文件夹中，keystore文件夹存储的是组织用户私钥，signcerts文件夹存储的是用户证书（公钥）。
 
#### 响应消息
- 当opmethod为invoke时，返回值是base64加密的transactionID。
- 当opmethod为query时，返回值是base64加密的链代码的返回值。
 
#### 示例
下面是调用invoke类型的链代码示例。
- 请求示例
  ```
  {
    "channelId": "testchannel",
    "chaincodeId": "zmmcode",
    "chaincodeVersion": "1.0",
    "userId": "User1",
    "orgId": "7258adda1803f4137eff4813e7aba323018200c5", 
    "orgPeers": "[{\"orgId\":\"7258adda1803f4137eff4813e7aba323018200c5\",\"peerDomainName\":\"peer-7258adda1803f4137eff4813e7aba323018200c5-0.peer-7258adda1803f4137eff4813e7aba323018200c5.default.svc.cluster.local\"}]",
    "opmethod": "invoke",
    "args": "[\"invoke\",\"a\",\"b\",\"1\"]",
    "timestamp": "2018-10-31T17:28:16+08:00",
    "cert": "-----BEGIN CERTIFICATE-----\nMIIDBzCCAq2gAwIBAgIQEXPZlMsReamxVtVNnKwCCzAKBggqhkjOPQQDAjCCAQQx\nDjAMBgNVBAYTBUNISU5BMRAwDgYDVQQIEwdCRUlKSU5HMRAwDgYDVQQHEwdCRUlK\nSU5HMXkwdwYDVQQKE3A3MjU4YWRkYTE4MDNmNDEzN2VmZjQ4MTNlN2FiYTMyMzAx\nODIwMGM1LnBlZXItNzI1OGFkZGExODAzZjQxMzdlZmY0ODEzZTdhYmEzMjMwMTgy\nMDBjNS5kZWZhdWx0LnN2Yy5jbHVzdGVyLmxvY2FsMVMwUQYDVQQDE0pjYS5wZWVy\nLTcyNThhZGRhMTgwM2Y0MTM3ZWZmNDgxM2U3YWJhMzIzMDE4MjAwYzUuZGVmYXVs\ndC5zdmMuY2x1c3Rlci5sb2NhbDAeFw0xODEwMzAwMjQ5MjZaFw0yODEwMjcwMjQ5\nMjZaMIG1MQ4wDAYDVQQGEwVDSElOQTEQMA4GA1UECBMHQkVJSklORzEQMA4GA1UE\nBxMHQkVJSklORzF/MH0GA1UEAwx2VXNlcjFANzI1OGFkZGExODAzZjQxMzdlZmY0\nODEzZTdhYmEzMjMwMTgyMDBjNS5wZWVyLTcyNThhZGRhMTgwM2Y0MTM3ZWZmNDgx\nM2U3YWJhMzIzMDE4MjAwYzUuZGVmYXVsdC5zdmMuY2x1c3Rlci5sb2NhbDBZMBMG\nByqGSM49AgEGCCqGSM49AwEHA0IABPMrzoJL/MHeSFPFOJWLqnJ0sqB0it7wDIOq\n+eTSvvPpGk1BIDmb2n13K5V04RO8xNezDQ7I6rW4LF2elq14eH+jTTBLMA4GA1Ud\nDwEB/wQEAwIHgDAMBgNVHRMBAf8EAjAAMCsGA1UdIwQkMCKAIFBXQ5TC4acFeTlT\nJuDZg62XkXCdnOfvbejSeKI2TXoIMAoGCCqGSM49BAMCA0gAMEUCIQCadHIKl0Mk\nYn0WZizyDZYR4rT2q0nzjFaiW+YfV5FBjAIgNalKUe3rIwXJvXORV4ZXurEua2Ag\nQmhcjRnVwPTjpTE=\n-----END CERTIFICATE-----\n"
  }
  ```
  
- 响应示例
  ```
  After  invoke the count of a is 188  b is  262
  ```
  
 
#### 错误码
请参见[错误码](https://support.huaweicloud.com/devg-bcs/ErrorCode.html)页面。
