Ошибка цепочки кода 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 ответ
Предполагая, что данный код является вашим полным кодом, я вижу некоторые серьезные проблемы в вашем коде.
- Структура проверки отсутствует
- Вы не обработали ошибку после получения информации о состоянии (хотя это не остановит сборку вашей программы)
shim.success(nil)
следует заменить наshim.Success(nil)
[Вы отредактировали свой вопрос и исправили эту ошибку, но важно указать на эту ошибку, потому что она была причиной ошибки в заголовке вашего вопроса]- Есть ненужное
return nil, nil
линия, которая мешает вашей программе от сборки правильно. Я понятия не имею, почему вы могли поставить эту строку там. Просто удали это. - Там нет основной функции
После исправления всех этих ошибок ваш код должен выглядеть примерно так:
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)
на пустой строке, так как это приведет к ошибке.