почему puttate не работает вне Init в Go Chaincode - PullRequest
0 голосов
/ 29 марта 2019

Я пишу свой собственный цепной код, следуя примеру мрамора.Однако puttate не работает вне функции Init.GetState работает нормально.Я могу получить те вещи, которые я помещаю в функцию Init.Если я пытаюсь вызвать мою пользовательскую функцию, которая пытается установить другую новую запись, она возвращает успех, но я не могу прочитать запись.Даже если я скопирую функции chaincode_example02.go в мой код цепи, он все равно не работает.Затем я обнаружил, что chaincode_example02.go имеет ту же проблему в моей сети.Кто-нибудь может мне помочь?Спасибо

package main
import (
    "encoding/json"
    "fmt"
    "strconv"
    // "github.com/hyperledger/fabric/discovery/support/chaincode"

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

type SmartContract struct {
}

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

    var Aval, Bval int // Asset holdings

    // Initialize the chaincode
    Aval, err = strconv.Atoi("10")
    Bval, err = strconv.Atoi("20")
    fmt.Printf("Aval = %d, Bval = %d\n", Aval, Bval)

    // Write the state to the ledger
    err = stub.PutState("A", []byte(strconv.Itoa(Aval)))
    if err != nil {
        return shim.Error(err.Error())
    }

    err = stub.PutState("B", []byte(strconv.Itoa(Bval)))
    if err != nil {
        return shim.Error(err.Error())
    }

    return shim.Success(nil)
}

func (t *SmartContract) Invoke(stub shim.ChaincodeStubInterface) pb.Response {
    fnc, args := stub.GetFunctionAndParameters()
    fmt.Println(" ")
    fmt.Println("Invoke, with function - " + fnc)

    if fnc == "init" {
        return t.Init(stub)
    } else if fnc == "invoke" {
        return t.invoke(stub)
    } else if fnc == "query" {
        return t.query(stub, args)
    }
    return shim.Error(fmt.Sprintf("Invalid function name: %s", fnc))
}

func (t *SmartContract) invoke(stub shim.ChaincodeStubInterface) pb.Response {
    var A, B string    // Entities
    var Aval, Bval int // Asset holdings
    var X int          // Transaction value
    var err error

    A = "A"
    B = "B"
    X = 5

    Avalbytes, err := stub.GetState(A)
    if err != nil {
        return shim.Error("Failed to get state")
    }
    if Avalbytes == nil {
        return shim.Error("Entity not found")
    }
    Aval, _ = strconv.Atoi(string(Avalbytes))

    Bvalbytes, err := stub.GetState(B)
    if err != nil {
        return shim.Error("Failed to get state")
    }
    if Bvalbytes == nil {
        return shim.Error("Entity not found")
    }
    Bval, _ = strconv.Atoi(string(Bvalbytes))

    // Perform the execution
    Aval = Aval - X
    Bval = Bval + X

    err = stub.PutState(A, []byte(strconv.Itoa(Aval)))
    if err != nil {
        return shim.Error(err.Error())
    }

    err = stub.PutState(B, []byte(strconv.Itoa(Bval)))
    if err != nil {
        return shim.Error(err.Error())
    }

    return shim.Success(nil)
}

func (t *SmartContract) query(stub shim.ChaincodeStubInterface, args []string) pb.Response {
    var A string // Entities
    var err error

    A = args[0]

    // Get the state from the ledger
    Avalbytes, err := stub.GetState(A)
    if err != nil {
        jsonResp := "{\"Error\":\"Failed to get state for " + A + "\"}"
        return shim.Error(jsonResp)
    }

    if Avalbytes == nil {
        jsonResp := "{\"Error\":\"Nil amount for " + A + "\"}"
        return shim.Error(jsonResp)
    }

    jsonResp := "{\"Name\":\"" + A + "\",\"Amount\":\"" + string(Avalbytes) + "\"}"
    return shim.Success(Avalbytes)
}

func main() {
    err := shim.Start(new(SmartContract))
    if err != nil {
        fmt.Printf("Error starting Simple chaincode: %s", err)
    }
}

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...