Updated on 2022-09-08 GMT+08:00

Sample Chaincode

A transaction chaincode implements the service logic. The example transaction chaincode provided in this section is used to transfer money between users. The validity of the transaction data in the form of a ciphertext is verified using the homomorphic encryption library to detect unauthorized operations, if any. This chaincode implements the functions of balance initialization, balance query, and money transfer.

Initializing the Balance

After a user is registered successfully, the balance of the user must be initialized. The default value is 0.

  • Input

    Parameter

    Type

    Description

    Mandatory

    PubKey

    string

    Public key

    Yes

    Balance

    string

    Initial balance

    Yes

  • Processing

    Invoking the ValidateInitBalance API to verify the validity of the balance range for endorsement

    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")
     }
  • Output

    Parameter

    Type

    Description

    newCipherBalance

    string

    Balance ciphertext

Querying the Balance

The balance can be queried using the account address. For details, see the queryBalance API of the transaction_demo.

The following table lists the parameters of the queryBalance API.

-

Parameter

Type

Description

Input

addr

string

Account address

Output

cipherbalance

string

Ciphertext of the account balance

Output

err

error

Error message

Money Transfer

  • Input

    Parameter

    Type

    Description

    Mandatory

    AddrA

    string

    Address of user A (payer)

    Yes

    AddrB

    string

    Address of user B (payee)

    Yes

    txinfo

    String

    Transaction information PrepareTxInfo

    Yes

  • Processing
    1. Obtain the current balances of users A and B (cipherBalanceAKeyABlock and cipherBalanceBKeyBBlock) from the ledger based on the account addresses.
    2. Verify the validity of the certificates.
      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. Provide the updated balances (ciphertext).

      The ledger content of a service needs to be customized. The encrypted balance amount is added to the users' ledgers. A storage structure is defined in the demo. After the storage structure is saved, a transaction record object is saved in JSON format.

      type TransRecord struct {
          FromAddr string
          ToAddr   string
          TXType   string
          Balance  string
          TX       string
          remark   string
       }