Предполагая, что данный код является вашим полным кодом, я вижу некоторые серьезные проблемы в вашем коде.
- Структура проверки отсутствует
- Вы не обрабатывали ошибку после получения состоянияинформация (это не остановит сборку вашей программы)
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)
для пустой строки, так как это приведет к ошибке.