stub.GetCallerCertificate(),stub.GetCallerMetadata(),stub.GetPayload()返回空白

时间:2017-04-18 11:34:26

标签: go hyperledger hyperledger-fabric

package main

import (
    "fmt"
    "github.com/hyperledger/fabric/core/chaincode/shim"
    pb "github.com/hyperledger/fabric/protos/peer"
)

var matchLogger = shim.NewLogger("Helper")

type PlaceHolder struct {
    ValA  string `json:"ValA"`
    ValB  string `json:"ValB"`
    Match bool   `json:"Match"`
}

type Agreement struct {
    TradeNumber         PlaceHolder `json:"TradeNumber"`
    BuyerName           PlaceHolder `json:"BuyerName"`
    SellerName          PlaceHolder `json:"SellerName"`
    BuyerID             PlaceHolder `json:"BuyerID"`
    SellerID            PlaceHolder `json:"SellerID"`
}

type ContractContaineer struct {
    FirmID       string   `json:"FirmID"`
    ContractList []string `json:"contractList"`
}


func (t *Agreement) Init(stub shim.ChaincodeStubInterface) pb.Response {

    xx, err1 := stub.GetCallerCertificate()
    if err1 != nil {
        matchLogger.Info(err1)  
    }
    matchLogger.Info("Cert ----")
    matchLogger.Info(string(xx))
    matchLogger.Info("----")

    xy, err3 := stub.GetCallerMetadata()
    if err3 != nil {
        matchLogger.Info(err3)  
    }
    matchLogger.Info("Meta ----")
    matchLogger.Info(string(xy))
    matchLogger.Info("----")

    yy, err4 := stub.GetPayload()
    if err4 != nil {
        matchLogger.Info(err4)  
    }
    matchLogger.Info("PLD ----")
    matchLogger.Info(string(yy))
    matchLogger.Info("----")


    return shim.Success(nil)
}


func (t *Agreement) Query(stub shim.ChaincodeStubInterface) pb.Response {
        return shim.Success(nil)
}


// Transaction makes payment of X units from A to B
func (t *Agreement) Invoke(stub shim.ChaincodeStubInterface) pb.Response {

    xx, err1 := stub.GetCallerCertificate()
    if err1 != nil {
        matchLogger.Info(err1)  
    }
    matchLogger.Info("Cert ----")
    matchLogger.Info(string(xx))
    matchLogger.Info("----")

    xy, err3 := stub.GetCallerMetadata()
    if err3 != nil {
        matchLogger.Info(err3)  
    }
    matchLogger.Info("Meta ----")
    matchLogger.Info(string(xy))
    matchLogger.Info("----")

    yy, err4 := stub.GetPayload()
    if err4 != nil {
        matchLogger.Info(err4)  
    }
    matchLogger.Info("PLD ----")
    matchLogger.Info(string(yy))
    matchLogger.Info("----")

    return shim.Success(nil)
}


func main() {

    lld, _ := shim.LogLevel("INFO")
    matchLogger.Info(lld)
    matchLogger.SetLevel(lld)
    matchLogger.Info(matchLogger.IsEnabledFor(lld))
    err := shim.Start(new(Agreement))
    if err != nil {
        fmt.Printf("Error starting Simple chaincode: %s", err)
    }
}

这是我完整的GO文件。请建议我做错了什么。对于xx,xy,yy,记录器输出为空白。错误也是零。我已经实现了所有3种方法,即init,invoke和query。代码编译得很好

1 个答案:

答案 0 :(得分:0)

如果你正在使用https://github.com/hyperledger-archives/fabric/blob/master/core/chaincode/shim/chaincode.go#L628我怀疑shim.ChainCodeStubInterface在传入此方法之前尚未正确初始化。

完成this interface

需要ChainCodeStub的每次实施
type Chaincode interface {
    // Init is called during Deploy transaction after the container has been
    // established, allowing the chaincode to initialize its internal data
    Init(stub *ChaincodeStub, function string, args []string) ([]byte, error)

    // Invoke is called for every Invoke transactions. The chaincode may change
    // its state variables
    Invoke(stub *ChaincodeStub, function string, args []string) ([]byte, error)

    // Query is called for Query transactions. The chaincode may only read
    // (but not modify) its state variables and return the result
    Query(stub *ChaincodeStub, function string, args []string) ([]byte, error)
}

Init方法是我希望存根被初始化的地方,这样你的值就不会被返回为空