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

Я пытаюсь создать цепной код, используя гиперледжер.Я использую 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 Ответ

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

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

  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) для пустой строки, так как это приведет к ошибке.

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