
# REST API Demo
华为云区块链提供了REST API服务来简化用户访问区块链的学习成本。通过REST API服务，用户可以不需要学习fabric-go-sdk，fabric-Java-sdk, fabric-nodejs-sdk等，只需要开发的应用支持RESTful接口，就可以轻松访问区块链。本Demo通过一个go语言的客户端来演示如何使用REST API服务调用链代码，供您学习参考。
![](https://support.huaweicloud.com/devg-bcs/public_sys-resources/note_3.0-zh-cn.png)
只用于场景体验，不用于实际应用。
仅适用于Hyperledger Fabric增强版的区块链服务。
#### 创建区块链实例
1. 登录区块链服务管理控制台。
2. 单击Hyperledger Fabric增强版卡片上的"购买"。
3. 根据界面提示，配置区块链基本信息，参数如[表1]所示。
   
   ![](https://support.huaweicloud.com/devg-bcs/public_sys-resources/notice_3.0-zh-cn.png)
   为了保证示例Demo成功运行，请在参数配置时按照表格中的参数值填写。
    表1基本信息配置 
   | 参数                      | 参数值       |
   |:---|:---|
   | 计费模式                    | 按需计费      |
   | 区域                      | 使用默认区域    |
   | 企业项目                    | default   |
   | 区块链实例名称                 | demo      |
   | 版本类型                    | 基础版       |
   | 区块链类型                   | 私有链       |
   | Hyperledger Fabric增强版内核 | v2.2      |
   | 共识策略                    | Raft(CFT) |
   | 资源初始密码                  | 请自行设置     |
   | 资源初始密码确认                | 请自行设置     |
      
   
   
4. 单击"下一步：资源配置"，进行资源配置，参数如[表2]所示。
   
    表2资源配置 
   | 参数              | 示例                               |
   |:---|:---|
   | 环境资源            | 选择"自定义环境"。                       |
   | 集群              | 创建新的CCE集群                        |
   | 可用区             | 请自行选择                            |
   | 云主机规格           | 4核/8GB                           |
   | 云主机个数           | 1                                |
   | 高可用             | 否                                |
   | 虚拟私有云           | 系统自动创建VPC                        |
   | 所在子网            | 系统自动创建子网                         |
   | 云主机登录方式         | 密码                               |
   | root密码          | 如果填写该项，则以填写值为准，如果不填写，则以资源初始密码为准。 |
   | 确认密码            | -                                |
   | 是否使用CCE集群节点弹性IP | 是                                |
   | 弹性IP计费方式        | 使用默认规格                           |
   | 弹性IP带宽          | 5 Mbit/s                         |
      
   
   
5. 单击"下一步：区块链配置"，进行区块链配置，参数如[表3]所示。
   
    表3区块链配置 
   | 参数              | 示例                                                                                                                                                                                                                                                                                                                                                                                                                             |
   |:---|:---|
   | 区块链配置           | 选择"自定义配置"。                                                                                                                                                                                                                                                                                                                                                                                                                     |
   | 区块链管理初始密码       | 如果填写该项，则以填写值为准，如果不填写，则以资源初始密码为准。                                                                                                                                                                                                                                                                                                                                                                                               |
   | 区块链管理确认密码       | -                                                                                                                                                                                                                                                                                                                                                                                                                              |
   | 存储卷类型           | 极速文件存储卷                                                                                                                                                                                                                                                                                                                                                                                                                        |
   | 节点组织存储容量 (GB)   | 使用默认规格。                                                                                                                                                                                                                                                                                                                                                                                                                        |
   | 账本数据存储方式        | 选择"文件数据库（GoLevelDB）"                                                                                                                                                                                                                                                                                                                                                                                                           |
   | peer节点组织        | 系统已默认创建1个节点组织，名称为organization，将节点数量修改为1。                                                                                                                                                                                                                                                                                                                                                                                       |
   | 通道配置            | organization节点组织已默认添加进至通道中，保持默认即可。                                                                                                                                                                                                                                                                                                                                                                                             |
   | 共识节点数量          | 使用默认值。                                                                                                                                                                                                                                                                                                                                                                                                                         |
   | 安全机制            | ECDSA 须知： 安全机制仅支持选择ECDSA。                                                                                                                                                                                                                                                                                                                                    |
   | 区块生成配置          | 否                                                                                                                                                                                                                                                                                                                                                                                                                              |
   | 添加RESTful API支持 | 请选择"是"。若您选择了"否"，则需要在实例创建完毕后，执行以下步骤安装RESTful API： 1. 左侧导航栏选择"插件管理"。  2. 在"插件仓库"页签下，鼠标移至baas-restapi插件卡片右上角。  3. 单击"安装"，选择已购买的区块链实例，安装baas-restapi插件。   |
      
   
   
6. 单击"下一步：确认订单"。
7. 确认配置信息无误后，根据界面提示购买区块链实例。 
   请等待数分钟，安装页面提示安装成功，查看实例状态变为"正常"后，表示区块链实例部署完成。
   
   
 
#### 安装及实例化链代码
1. 登录区块链服务管理控制台。
2. 在新创建的实例卡片中，单击"区块链管理"，登录链代码管理页面。
3. 在登录页面输入用户名、密码，单击"登录"。 
   ![](https://support.huaweicloud.com/devg-bcs/public_sys-resources/note_3.0-zh-cn.png)
   用户名为admin，密码为您在创建区块链实例时设置的区块链管理初始密码，如果没有设置区块链管理初始密码，则以资源初始密码为准。
   
   
4. 在链代码管理页面，单击页面左上角的![](https://support.huaweicloud.com/devg-bcs/zh-cn_image_0000001127937837.png)。
   
   安装参数如下：
   
   | 参数         | 值                                                                                                                   |
   |:---|:---|
   | 链代码名称      | bcsysq                                                                                                              |
   | 链代码版本      | 1.0                                                                                                                 |
   | 账本数据存储方式   | 文件数据库(goleveldb)                                                                                                    |
   | 选择全部Peer节点 | 勾选                                                                                                                  |
   | 组织\&Peer节点 | peer-0                                                                                                              |
   | 链代码语言      | Golang                                                                                                              |
   | 链代码文件      | 下载示例链代码文件：[chaincode_example02.zip](https://bcs.obs.cn-north-1.myhuaweicloud.com/restapi/chaincode_example02.zip )。 |
   | 链代码描述      | 根据需要填写相关描述。                                                                                                         |
   | 代码安全检查     | 链代码语言选择Golang，该功能才会显示。选择是否开启链代码安全检查。                                                                                |
      
   
   
5. 单击"安装"完成链代码安装。
6. 链代码安装完成后，在链代码列表的"操作"列，单击"实例化"。 
   实例化参数如下：
   
   | 参数     | 值            |
   |:---|:---|
   | 实例化通道  | channel      |
   | 链代码版本  | 1.0          |
   | 初始化函数  | init         |
   | 链代码参数  | a,200,b,250  |
   | 背书策略   | 任意组织背书       |
   | 背书组织列表 | organization |
   | 隐私保护配置 | 否            |
      
   
   
 
#### 配置应用
1. 在"实例管理"界面，在实例卡片中，单击"获取客户端配置"。
2. 勾选"Peer节点证书"，指定节点组织选择organization，勾选"用户证书"并下载。
3. 下载Demo项目工程：[fabric-restapi-demo.zip](https://bcs.obs.cn-north-1.myhuaweicloud.com/restapi/fabric-restapi-demo.zip)，并将Demo项目代码工程包下载解压到本地并使用IDE打开。
   
   本Demo是一个golang编写的REST客户端，通过RESTAPI服务来调用链代码，实现链代码a给b转账的功能，请用GoLand等个人喜欢的IDE打开。项目的内容如下图所示：
   ![](https://support.huaweicloud.com/devg-bcs/zh-cn_image_0000001080611964.png "点击放大")
   
   
4. 将下载的用户证书解压到项目的usercrypto目录下。如图所示： 
   ![](https://support.huaweicloud.com/devg-bcs/zh-cn_image_0000001127759597.png "点击放大")
   
   
5. 修改参数配置。 
   1. 修改config目录下conf.yaml中的各项参数，参考如下截图及表格。 ![](https://support.huaweicloud.com/devg-bcs/zh-cn_image_0000001169448938.png "点击放大")
      
   
   2. 修改src/restapi目录下的main.go文件，参考如下截图及表格。 ![](https://support.huaweicloud.com/devg-bcs/zh-cn_image_0000001127876743.png "点击放大")
      ![](https://support.huaweicloud.com/devg-bcs/public_sys-resources/note_3.0-zh-cn.png)
      针对需要参与背书的每个peer节点，对其构造一个OrgPeer结构体，将组织ID和peer节点的域名传入，并将该结构体添加进OrgPeer类型的数组中，经json.Marshal()方法转换为字节数组，最后会转换成字符串类型传入。其中OrgPeer结构体定义如下：
      type OrgPeer struct {
      OrgId string \`json:"orgId"\`
      PeerDomainName string \`json:"peerDomainName"\`
      }
      表4参数表 
      | 参数           | 说明                                                                                                                                                                                                                                                                                                                                                                                                                                                                                              |
      |:---|:---|
      | Endpoint     | RESTAPI服务的访问IP和端口。具体获取方法如下： 1. 在已购买区块链实例卡片中，单击"容器集群"名称，进入云容器引擎CCE页面。  2. 单击实例所在集群名称，进入集群信息页面。在左侧导航栏，单击"工作负载"。  3. 在"无状态负载"页签，单击baas-restapi工作负载名称，进入详情页面，然后单击实例所在节点跳转至节点管理页面获取节点的弹性公网ip，该弹性公网ip为RESTAPI服务访问IP，端口固定为32621。   |
      | Path         | RESTAPI服务的访问路径，保持不变。                                                                                                                                                                                                                                                                                                                                                                                                                                                                            |
      | CryptoMethod | 加密算法，如果是ECDSA算法填写"SW"。                                                                                                                                                                                                                                                                                                                                                                                                                                                                          |
      | SignCert     | 用户下载的证书中的签名证书路径。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                |
      | PrvKey       | 用户下载证书中的签名私钥。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                   |
      | InvokeReq    | 请求body的参数，请按照部署的链码实际情况填写，可参考如下InvokeReq参数表。                                                                                                                                                                                                                                                                                                                                                                                                                                                     |
      | QueryReq     | 与InvokeReq类似，按照部署链码的实际情况填写。                                                                                                                                                                                                                                                                                                                                                                                                                                                                     |
         
      表5InvokeReq参数表 
      | 参数               | 说明                                                                                                                                                                                                                                           | 范例                                                                                                                                                                                                    |
      |:---|:---|:---|
      | SignGzipSwitch   | Sign是否选择Gzip压缩。0表示否，1表示是。                                                                                                                                                                                                                    | "1"                                                                                                                                                                                                   |
      | ChannelId        | 区块链通道名称。                                                                                                                                                                                                                                     | "channel"                                                                                                                                                                                             |
      | ChaincodeId      | 链代码名称。                                                                                                                                                                                                                                       | "testcode"                                                                                                                                                                                            |
      | ChaincodeVersion | 链代码版本。                                                                                                                                                                                                                                       | "1.0"                                                                                                                                                                                                 |
      | UserId           | 由组织CA签发的用户ID，目前区块链实例默认生成的都为User1。                                                                                                                                                                                                            | "User1"                                                                                                                                                                                               |
      | OrgId            | 区块链组织ID。 说明： 在"通道管理"页面中，单击通道名称后的"查看节点"，查看"MSP标识"，去掉MSP即为区块链组织ID。例如：MSP标识为"1232b2032faafee152b58cd82cecf52e49a22a38MSP"，区块链组织ID为"1232b2032faafee152b58cd82cecf52e49a22a38"。 | "1232b2032faafee152b58cd82cecf52e49a22a38"                                                                                                                                                            |
      | OrgPeers         | 各个Peer节点的组织ID和域名。                                                                                                                                                                                                                            | "\[{OrgId:" 1232b2032faafee152b58cd82cecf52e49a22a38", PeerDomainName:"peer-1232b2032faafee152b58cd82cecf52e49a22a38-0 .peer-1232b2032faafee152b58cd82cecf52e49a22a38.default.svc.cluster.local "}\]" |
      | Opmethod         | 区块链链码调用类型，目前只有两类：invoke和query。                                                                                                                                                                                                               | "invoke"                                                                                                                                                                                              |
      | Args             | 链码调用参数。                                                                                                                                                                                                                                      | '\["invoke","a","b","100"\]' （第一个参数为invoke的调用函数，可以是其他值如：move，query等等）                                                                                                                                 |
         
      
   
   
   
   
6. 配置完成后，构建并运行main()来运行该Demo项目。 
   代码中将读取conf.yaml以及main.go中的参数QueryReq和InvokeReq请求，并调用RESTAPI的接口"/v1/chaincode/operation"来调用链代码，实现a给b转账功能。运行结果如下：
   ![](https://support.huaweicloud.com/devg-bcs/zh-cn_image_0000001127642379.png "点击放大")
   ![](https://support.huaweicloud.com/devg-bcs/public_sys-resources/note_3.0-zh-cn.png)
   本Demo用一个简单的REST客户端调用RESTAPI服务实现了调用链代码，返回的invoke结果为一个base64加密的TransactionID，query结果为base64加密的数据值。代码仅供参考，可以通过该项目代码理解如何调用RESTAPI服务。
   
   
 
