Ошибка цепочки кода Hyperledger Fabric: невозможно сослаться на неэкспортированное имя shim.success

Я пытаюсь построить цепной код, используя гиперледжер. Я использую GoLang для написания контракта, при создании контракта я сталкиваюсь с ошибкой ниже:

    cannot refer to unexported name shim.success
    undefined: shim.success

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

   import (
    "encoding/json"
    "fmt"
    "bytes"
    "time"
    "strings"
    "github.com/hyperledger/fabric/core/chaincode/shim"
    pb "github.com/hyperledger/fabric/protos/peer"
   )


   func (t *check) SurrenderSaves(stub shim.ChaincodeStubInterface, 
   args []string) pb.Response {
   fmt.Println("Entering CodeSurrenderSaves")
   var err error
   var lastImportDatekey string
   var lastImportDate []byte

   lastImportDate, err= stub.GetState("lastImprtDatesaved")
   fmt.Println("lastImportDate ...... ", lastImportDate)

   err = json.Unmarshal(lastImportDate, &lastImportDatekey)
   if err != nil {
   fmt.Printf("Unable to unmarshal lastImportDate input 
   lastImportDatekey: %s\n", err)
    return shim.Error(err.Error())
   }
   fmt.Println("lastImportDatekey ...... ", lastImportDatekey)

   if (lastImportDate == nil){
      currentTime := time.Now()
      var timeString = currentTime.Format("2006-01-02")
      lastImportDatekey = timeString
      fmt.Println("lastImportDatekey ...... ", lastImportDatekey)
   } else {
      err = json.Unmarshal(lastImportDate, &lastImportDatekey)
      if err != nil {
        fmt.Printf("Unable to unmarshal lastImportDate input 
        lastImportDate: %s\n", err)
        return shim.Error(err.Error())
      }
      fmt.Println(" lastImportDatekey end:",lastImportDatekey)
   }
    return shim.Success(nil)
   }

   func (t *check) Init(stub shim.ChaincodeStubInterface) pb.Response {
      fmt.Println("Initiate the chaincde")
      return shim.Success(nil)
   }
   func (t *check) Invoke(stub shim.ChaincodeStubInterface) pb.Response 
   {
      function, args := stub.GetFunctionAndParameters()
       if function == "SurrenderSaves" {
          return t.SurrenderSaves(stub, args)
       }
   fmt.Println("Function not found")
   return shim.Error("Received unknown function invocation")
   return nil, nil
   }

1 ответ

Решение

Предполагая, что данный код является вашим полным кодом, я вижу некоторые серьезные проблемы в вашем коде.

  1. Структура проверки отсутствует
  2. Вы не обработали ошибку после получения информации о состоянии (хотя это не остановит сборку вашей программы)
  3. shim.success(nil) следует заменить на shim.Success(nil) [Вы отредактировали свой вопрос и исправили эту ошибку, но важно указать на эту ошибку, потому что она была причиной ошибки в заголовке вашего вопроса]
  4. Есть ненужное return nil, nil линия, которая мешает вашей программе от сборки правильно. Я понятия не имею, почему вы могли поставить эту строку там. Просто удали это.
  5. Там нет основной функции

После исправления всех этих ошибок ваш код должен выглядеть примерно так:

package main

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

//To-Do: Create check struct
type check struct {
}

func (t *check) SurrenderSaves(stub shim.ChaincodeStubInterface,
    args []string) pb.Response {
    fmt.Println("Entering CodeSurrenderSaves")
    var err error
    var lastImportDatekey string
    var lastImportDate []byte

    lastImportDate, err = stub.GetState("lastImprtDatesaved")

    //To-Do: handle error after getting state information
    if err != nil {
        fmt.Printf("Unable to get state : %s\n", err)
        return shim.Error(err.Error())
    }
    fmt.Println("lastImportDate ...... ", lastImportDate)

    err = json.Unmarshal(lastImportDate, &lastImportDatekey)
    if err != nil {
        fmt.Printf("Unable to unmarshal lastImportDate input lastImportDatekey: %s\n", err)
        return shim.Error(err.Error())
    }
    fmt.Println("lastImportDatekey ...... ", lastImportDatekey)

    if (lastImportDate == nil) {
        currentTime := time.Now()
        var timeString = currentTime.Format("2006-01-02")
        lastImportDatekey = timeString
        fmt.Println("lastImportDatekey ...... ", lastImportDatekey)
    } else {
        err = json.Unmarshal(lastImportDate, &lastImportDatekey)
        if err != nil {
            fmt.Printf("Unable to unmarshal lastImportDate input lastImportDate: %s\n", err)
            return shim.Error(err.Error())
        }
        fmt.Println(" lastImportDatekey end:", lastImportDatekey)
    }
    return shim.Success(nil) //To-Do: Success has to begin with uppercase S
}

func (t *check) Init(stub shim.ChaincodeStubInterface) pb.Response {
    fmt.Println("Initiate the chaincde")
    return shim.Success(nil)
}

func (t *check) Invoke(stub shim.ChaincodeStubInterface) pb.Response {
    function, args := stub.GetFunctionAndParameters()
    if function == "SurrenderSaves" {
    return t.SurrenderSaves(stub, args)
    }
    fmt.Println("Function not found")
    return shim.Error("Received unknown function invocation")
    //return nil, nil //To-Do: Remove this line
}
//To-Do: Add main function
func main() {
    // Create a new Smart Contract
    err := shim.Start(new(check))
    if err != nil {
        fmt.Printf("Error creating new Smart Contract: %s", err)
    }
}

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

Предупреждение: этот цепной код завершится ошибкой, если для ключа "lastImprtDatesaved" не сохранено значение. Потому что, когда вы звоните stub.GetState("lastImprtDatesaved") вы получите []byte представление пустой строки назад. И ты не можешь бежать json.Unmarshal(lastImportDate, &lastImportDatekey) на пустой строке, так как это приведет к ошибке.

Другие вопросы по тегам