
# 链代码示例
交易链码是用户实现其业务逻辑的链码，这里给出的示例代码Transaction Chaincode完成用户间的转账操作。在转账数据的验证过程中使用同态加密库对密文交易数据进行合法性校验，确保没有非法操作。示例中实现了余额初始化，余额查询，转账交易三个功能函数，具体功能实现参考如下。
#### Init初始化余额
当用户注册成功后，需要初始化该用户的余额，默认为0。
- **输入说明**
  
  | 参数名     | 类型     | 描述   | 是否必须 |
  |:---|:---|:---|:---|
  | PubKey  | string | 公钥   | 是    |
  | Balance | string | 初始金额 | 是    |
     
  
- **处理**
  调用ValidateInitBalance，校验balance范围有效性，完成余额背书。
  ```
  PubKey := string(args[0])
  BalanceInfo := string(args[1]) 
  //PubKey := string(args[2])
  hashPubkey, err := t.calcAddr(PubKey)
  logger.Debug("encrypt initial balance")
  //validate balance
  cipherBalance,err := pswapi_cc.ValidateInitBalance(BalanceInfo,PubKey)
   if err != nil {
      logger.Error("fail to Validate InitBalance ")
      return shim.Error("fail toValidate InitBalance")
   }
  ```
  
- **输出说明**
  
  | 参数名              | 类型     | 描述   |
  |:---|:---|:---|
  | newCipherBalance | string | 余额密文 |
     
  
 
#### QueryBalance查询余额
查询余额功能比较简单，根据key来查询value，即根据账户地址来查询当前余额，具体可见transaction_demo的queryBalance接口。
queryBalance接口参数如下：
| -  | 参数名           | 类型     | 描述     |
|:---|:---|:---|:---|
| 输入 | addr          | string | 账户地址   |
| 输出 | cipherbalance | string | 账户余额密文 |
| 输出 | err           | error  | 错误信息   |
   
#### Transfer转账
- **输入说明**
  
  | 参数名    | 类型     | 描述                | 是否必须 |
  |:---|:---|:---|:---|
  | AddrA  | string | A-转账者地址           | 是    |
  | AddrB  | string | B-收账者地址           | 是    |
  | txinfo | String | 交易信息PrepareTxInfo | 是    |
     
  

- **处理说明**
  1. 根据账户地址获取账本中A,B的当前余额cipherBalanceAKeyABlock, cipherBalanceBKeyBBlock。
  
  2. 校验证明有效性。
     ```
     newCipherBalanceA,newCipherBalanceB,newCipherTxA,newCipherTxB, err := pswapi_cc.ValidateTxInfo(txInfo, cipherBalanceAKeyABlock, cipherBalanceBKeyBBlock)
      if err != nil {
         logger.Error("fail to validate trans information")
         return shim.Error("fail to validate trans information")
      }
     ```
     
  
  3. 输出更新后的余额（密文） 业务的账本内容需要用户定制，将上面加密的金额合入到用户的账本中保存，demo中定义了一个存储结构，保存完后通过json序列化为一个交易记录对象进行保存。
     ```
     type TransRecord struct {
         FromAddr string
         ToAddr   string
         TXType   string
         Balance  string
         TX       string
         remark   string
      }
     ```
     
   
 
