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

链代码示例(2.0风格)

如下是一个账户转账的链代码示例(2.0风格)仅供安装实例化,若您需要调测请参考Fabric官方示例中的链代码。
package main
 
import (
         "errors"
         "fmt"
         "strconv"
 
         "github.com/hyperledger/fabric-contract-api-go/contractapi"
)
 
// 链码实现
type ABstore struct {
         contractapi.Contract
}
 
// 初始化链码数据,实例化或者升级链码时自动调用
func (t *ABstore) Init(ctx contractapi.TransactionContextInterface, A string, Aval int, B string, Bval int) error {
         // 使用println函数输出的信息会记录在链码容器日志中
         fmt.Println("ABstore Init")
         var err error
 
         fmt.Printf("Aval = %d, Bval = %d\n", Aval, Bval)
         // 将状态数据写入账本
         err = ctx.GetStub().PutState(A, []byte(strconv.Itoa(Aval)))
         if err != nil {
                   return err
         }
 
         err = ctx.GetStub().PutState(B, []byte(strconv.Itoa(Bval)))
         if err != nil {
                   return err
         }
 
         return nil
}
 
// A转账X给B
func (t *ABstore) Invoke(ctx contractapi.TransactionContextInterface, A, B string, X int) error {
         var err error
         var Aval int
         var Bval int
 
         // 从账本获取状态数据
         Avalbytes, err := ctx.GetStub().GetState(A)
         if err != nil {
                   return fmt.Errorf("Failed to get state")
         }
         if Avalbytes == nil {
                   return fmt.Errorf("Entity not found")
         }
         Aval, _ = strconv.Atoi(string(Avalbytes))
 
         Bvalbytes, err := ctx.GetStub().GetState(B)
         if err != nil {
                   return fmt.Errorf("Failed to get state")
         }
         if Bvalbytes == nil {
                   return fmt.Errorf("Entity not found")
         }
         Bval, _ = strconv.Atoi(string(Bvalbytes))
 
         // 执行转账
         Aval = Aval - X
         Bval = Bval + X
         fmt.Printf("Aval = %d, Bval = %d\n", Aval, Bval)
 
         // 将状态数据重新写回账本
         err = ctx.GetStub().PutState(A, []byte(strconv.Itoa(Aval)))
         if err != nil {
                   return err
         }
 
         err = ctx.GetStub().PutState(B, []byte(strconv.Itoa(Bval)))
         if err != nil {
                   return err
         }
 
         return nil
}
 
// 账户注销
func (t *ABstore) Delete(ctx contractapi.TransactionContextInterface, A string) error {
 
         // 从账本中删除账户状态
         err := ctx.GetStub().DelState(A)
         if err != nil {
                   return fmt.Errorf("Failed to delete state")
         }
 
         return nil
}
 
// 账户查询
func (t *ABstore) Query(ctx contractapi.TransactionContextInterface, A string) (string, error) {
         var err error
         // 从账本获取状态数据
         Avalbytes, err := ctx.GetStub().GetState(A)
         if err != nil {
                   jsonResp := "{\"Error\":\"Failed to get state for " + A + "\"}"
                   return "", errors.New(jsonResp)
         }
 
         if Avalbytes == nil {
                   jsonResp := "{\"Error\":\"Nil amount for " + A + "\"}"
                   return "", errors.New(jsonResp)
         }
 
         jsonResp := "{\"Name\":\"" + A + "\",\"Amount\":\"" + string(Avalbytes) + "\"}"
         fmt.Printf("Query Response:%s\n", jsonResp)
         return string(Avalbytes), nil
}
 
func main() {
         cc, err := contractapi.NewChaincode(new(ABstore))
         if err != nil {
                   panic(err.Error())
         }
         if err := cc.Start(); err != nil {
                   fmt.Printf("Error starting ABstore chaincode: %s", err)
         }
}