更新时间:2022-09-16 GMT+08:00

链代码示例

交易链码是用户实现其业务逻辑的链码,这里给出的示例代码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
       }