// 查看竞赛信息是否存在
func (cc *SmartContract) ContestExists(ctx contractapi.TransactionContextInterface,
id string) (bool, error) {
contestJson, err := ctx.GetStub().GetState("contest" + id)
if err != nil {
return false, fmt.Errorf("failed to read from the world state: %v", err)
}
fmt.Println("json:", contestJson != nil) // 此处是一个测试点
return contestJson != nil, nil
}
// 创建竞赛信息
func (cc *SmartContract) CreateContest(ctx contractapi.TransactionContextInterface,
id, name, desc string) error {
exists, err := cc.ContestExists(ctx, id)
if err != nil {
return err
}
if exists {
return fmt.Errorf("the contest %s already exists.\n", id)
}
contest := &Contest{
EducateId: id,
Contest: name,
Description: desc,
}
contestJson, err := json.Marshal(contest)
if err != nil {
return fmt.Errorf(">> contest MARSHAL error: %v", err)
}
err = ctx.GetStub().PutState("contest" + contest.EducateId, contestJson)
if err != nil {
return fmt.Errorf(">> contest PUT error: %v", err)
}
return nil
}
func TestSmartContract_CreateContest(t *testing.T) {
chaincodeStub := &mocks.ChaincodeStub{}
transactionContext := &mocks.TransactionContext{}
transactionContext.GetStubReturns(chaincodeStub)
contestCreator := &SmartContract{}
err := contestCreator.CreateContest(transactionContext,
"", "", "")
require.NoError(t, err)
chaincodeStub.GetStateReturns([]byte{}, nil)
err = contestCreator.CreateContest(transactionContext,
"4", "", "")
//require.NoError(t, err)
require.EqualError(t, err, "the contest 4 already exists.\n")
chaincodeStub.GetStateReturns(nil, fmt.Errorf("unable to retrieve contest"))
err = contestCreator.CreateContest(transactionContext,
"4", "", "")
require.EqualError(t, err, "failed to read from the world state: unable to retrieve contest")
}
json: false
json: true
下断点调试后发现是在调用下面这一句时由false转为了true
err = contestCreator.CreateContest(transactionContext,
"4", "", "")
但目前依然不太清楚这究竟是什么原因,应该怎么解决这个问题呢?
不知道你这个问题是否已经解决, 如果还没有解决的话:【进阶题目】
给定一个字符串s,再给定s的最长回文子序列字符串slps,
请返回在添加字符最少的情况下,让s整体都是回文字符串的一种结果。
进阶问题比原问题多了一个参数,请做到时间复杂度比原问题的实现低。
【举例】
s=“A1B21C”,slps=“121”,返回"AC1B2B1CA"或者"CA1B2B1AC"。
总之,只要是添加的字符数最少,只返回其中一种结果即可。