Цепной код GetState возвращает пустой ответ - PullRequest
0 голосов
/ 22 ноября 2018
func (t *ballot) initBallot(stub shim.ChaincodeStubInterface, args []string) peer.Response {

    if len(args) != 2 {
        return shim.Error("Incorrect number of arguments. Expecting 2")
    }

    // ==== Input sanitation ====
    fmt.Println("- start init ballot")

    if len(args[0]) == 0 {
        return shim.Error("1st argument must be a non-empty string")
    }
    if len(args[1]) == 0 {
        return shim.Error("2nd argument must be a non-empty string")
    }

    personFirstName := args[0]
    personLastName := args[1]
    hash := sha256.New()
    hash.Write([]byte(personFirstName + personLastName)) // ballotID is created based on the person's name
    ballotID := hex.EncodeToString(hash.Sum(nil))
    voteInit := "VOTE INIT"

    // ==== Create ballot object and marshal to JSON ====
    Ballot := ballot{personFirstName, personLastName, ballotID, voteInit}
    ballotJSONByte, err := json.Marshal(Ballot)
    if err != nil {
        return shim.Error(err.Error())
    }
    err = stub.PutState(string(ballotID), ballotJSONByte)

    //FIXME:0-------------------------------------------------
    ballotAsByte, err := stub.GetState(string(ballotID))
    if err != nil {
        return shim.Error(err.Error())
    }
    BBBallot := ballot{}
    //umarshal the data to a new ballot struct
    json.Unmarshal(ballotAsByte, &BBBallot)
    //
    fmt.Println(BBBallot)
    fmt.Println(BBBallot.personFirstName)
    return shim.Success([]byte(ballotID))
    }

Выше приведен код, и это тестовый скрипт, с которым я его запускаю

func Test_Invoke_initBallot(t *testing.T) {
    scc := new(ballot)
    stub := shim.NewMockStub("voting", scc)
    res := stub.MockInvoke("1", [][]byte{[]byte("initBallot"), []byte("John"), []byte("C")})
    if res.Status != shim.OK {
        t.Log("bad status received, expected: 200; received:" + strconv.FormatInt(int64(res.Status), 10))
        t.Log("response: " + string(res.Message))
        t.FailNow()
    }
    if res.Payload == nil {
        t.Log("initBallot failed to create a ballot")
        t.FailNow()
    }

}

Я пытаюсь прочитать данные из книги после ввода транзакции. Однако я получаюпустые ответы от обоих операторов Println.

    // PutState puts the specified `key` and `value` into the transaction's
// writeset as a data-write proposal. PutState doesn't effect the ledger
// until the transaction is validated and successfully committed.
// Simple keys must not be an empty string and must not start with null
// character (0x00), in order to avoid range query collisions with
// composite keys, which internally get prefixed with 0x00 as composite
// key namespace.
PutState(key string, value []byte) error

В документации сказано, что putState не фиксирует транзакции в бухгалтерскую книгу до тех пор, пока она не будет проверена, но я просто пытаюсь проверить мой цепной код с помощью MockStub без настройки фабричной сети.В чем решение этой проблемы?

PS проблема была решена, вот правильный способ настроить структуру

type ballot struct {
    PersonFirstName string
    PersonLastName  string
    BallotID        string
    VoteInit        string
}

1 Ответ

0 голосов
/ 23 ноября 2018

Вы еще не предоставили код для структуры голосования.Но из того, что вы предоставили, я догадываюсь, что может происходить.Я думаю, что вы, вероятно, не экспортировали поля, и ваша структура выглядит следующим образом:

type ballot struct {
    personFirstName string
    personLastName string
    ballotID string
    voteInit string
}

Но когда вы попытались преобразовать этот объект в JSON, используя json.Marshal(Ballot), ни одно из полей не было добавлено в JSONобъект, потому что они не были экспортированы.Все, что вам нужно сделать в этом случае, это экспортировать необходимые поля (используя заглавные буквы в начале имен полей).Ваша обновленная структура должна выглядеть примерно так:

type ballot struct {
    PersonFirstName string
    PersonLastName  string
    BallotID        string
    VoteInit        string
}

Это очень распространенная ошибка, которую допускают многие новички.Желаю вам всего наилучшего в вашем путешествии вперёд !!!

PS Пожалуйста, отредактируйте ваш вопрос и добавьте сюда код вашей структуры голосования, даже если это решение решит вашу проблему, так как это может помочь другим в будущем.Кроме того, добавьте в код правильные отступы и добавьте последний символ} в блоке кода.

...