Docker go合约部署失败
【问题分类】
- bug
- P2P网络相关(包含libp2p,liquid)
- 链账户身份与权限相关(证书问题、public、多签投票问题)
- 核心交易引擎相关(交易池、DAG)
- 共识相关
- 智能合约相关
- 存储相关
- SDK相关
- 长安链CMC工具
- 长安链管理台
- 长安链浏览器
- 长安链合约IDE
- 长安链web签名插件
- 跨链相关
- 轻节点相关
- 隐私计算相关
- 密码学相关
- 环境依赖
- 其他补充:
【问题描述】(请对问题进行描述,方便定位问题)
具体的现象,操作步骤,前置条件等,尽可能描述清楚,有截图说明更佳 在长安链IDE中尝试编写了一个Demo例子 代码如下: `package main
import ( "encoding/json" "log" "strconv"
"chainmaker/pb/protogo"
"chainmaker/shim"
)
//FactContract 合约对象 type FactContract struct { }
//Fact 存证对象,存证合约的数据内容
type Fact struct {
FileHash string json:"file_hash"
FileName string json:"file_name"
Time int json:"time"
}
//NewFact 新建存证对象 func NewFact(fileHash, fileName string, time int) *Fact { return &Fact{ FileHash: fileHash, FileName: fileName, Time: time, } }
//InitContract 合约初始化方法 func (f *FactContract) InitContract(stub shim.CMStubInterface) protogo.Response { return shim.Success([]byte("Init Success")) }
// UpgradeContract 合约升级方法 func (f *FactContract) UpgradeContract(stub shim.CMStubInterface) protogo.Response { return shim.Success([]byte("Upgrade Success")) }
//InvokeContract 调用合约 func (f *FactContract) InvokeContract(stub shim.CMStubInterface) protogo.Response {
//获取调用合约哪个方法
method := string(stub.GetArgs()["method"])
// 这里必须写成 switch {case "a": ... [case "b": ...[...]] default:...} 形式
// 而且case后面的内容必须是字符串,不能是常量
// 这里必须写成 switch {case "a": ... [case "b": ...[...]] default:...} 形式
// 而且case后面的内容必须是字符串,不能是常量
// 这里必须写成 switch {case "a": ... [case "b": ...[...]] default:...} 形式
// 而且case后面的内容必须是字符串,不能是常量
// 如果 method == "save", 执行FactContract的save方法
// 如果 method == "findByFileHash", 执行FactContract的findByFileHash方法
// 如果没有对应的 case 语句,返回错误
switch method {
case "save":
return f.Save(stub)
case "findByFileHash":
return f.FindByFileHash(stub)
default:
return shim.Error("invalid method")
}
}
//save 存证,把数据存储到链上 func (f *FactContract) Save(stub shim.CMStubInterface) protogo.Response { // 获取调用合约的全部参数 params := stub.GetArgs()
// 获取指定的参数
fileHash := string(params["file_hash"])
fileName := string(params["file_name"])
timeStr := string(params["time"])
if fileHash == "" || fileName == "" || timeStr == "" {
//返回合约执行错误,以及错误信息
return shim.Error("fileHash and fileName and time must not empty")
}
time, err := strconv.Atoi(timeStr)
if err != nil {
msg := "time is [" + timeStr + "] not int"
// 打印日志,使用 stub.Log 打印的日志会在控制台的输出中显示
stub.Log(msg + err.Error())
//返回合约执行错误,以及错误信息
return shim.Error(msg)
}
fact := NewFact(fileHash, fileName, time)
// 序列化
factBytes, err := json.Marshal(fact)
if err != nil {
msg := "marshal data fail"
stub.Log(msg + err.Error())
return shim.Error(msg)
}
//向链上发送事件,发送的事件会在控制台的事件中显示
stub.EmitEvent("topic_vx", []string{fact.FileHash, fact.FileName})
key := getHashKey(fact.FileHash)
//把数据存到链上
err = stub.PutStateFromKeyByte(key, factBytes)
if err != nil {
msg := "fail to save fact"
stub.Log(msg + err.Error())
return shim.Error(msg)
}
//打印日志,使用 stub.Log 打印的日志会在控制台的输出中显示
stub.Log("[save] file hash:" + fact.FileHash)
stub.Log("[save] file name:" + fact.FileName)
// 返回执行成功
return shim.Success([]byte(fact.FileName + fact.FileHash))
}
//findByFileHash 根据文件哈希从链上查找数据 func (f *FactContract) FindByFileHash(stub shim.CMStubInterface) protogo.Response { // 获取调用合约的全部参数 params := stub.GetArgs()
// 获取指定参数
fileHash := string(params["file_hash"])
// 查询结果
key := getHashKey(fileHash)
result, err := stub.GetStateFromKeyByte(key)
if err != nil {
msg := "failed to call get_state"
// 打印日志,使用 stub.Log 打印的日志会在控制台的输出中显示
stub.Log(msg + err.Error())
//返回合约执行错误,以及错误信息
return shim.Error(msg)
}
// 反序列化
var fact Fact
err = json.Unmarshal(result, &fact)
if err != nil {
msg := "unmarshal data fail"
stub.Log(msg + err.Error())
return shim.Error(msg)
}
// 记录日志
stub.Log("[find_by_file_hash] file hash:" + fact.FileHash)
stub.Log("[find_by_file_hash] file name:" + fact.FileName)
// 返回执行成功
return shim.Success(result)
}
func getHashKey(hash string) string { return "fact_hash" + hash }
func main() {
//运行合约
err := shim.Start(new(FactContract))
if err != nil {
log.Fatal(err)
}
} ` 编译和漏洞检查都无问题 但在长安链管理台尝试部署时 每当投第三张票时都会报错 此时合约部署状态转换为 合约初始化部署失败 管理台版本是2.3.4 IDE选择了2.3.0+
【相关日志文件】(如果有报错日志请贴图,或者上传附件)
chainmaker-go 的 log/system.log & bin/panic.log file *
SDK 的 sdk.log file
【系统信息】(请填写系统信息,方便定位问题)
- chainmaker-go version * : [v2.1.0]
- OS & version * :
- docker镜像 version:
-
管理台 version:
- 如果是管理台的相关问题,请附带管理台版本,如果不是可忽略。
-
区块浏览器 version:
- 如果是浏览器的相关问题,请附带浏览器版本,如果不是可忽略。
-
合约IDE version:
- 如果是合约IDE的相关问题,请附带合约IDE版本,如果不是可忽略。
-
web签名插件 version:
- 如果是web签名插件的相关问题,请附带web签名插件版本,如果不是可忽略。