SmartEditor 在线合约编辑器合约编译失败
【问题分类】
- bug
- P2P网络相关(包含libp2p,liquid)
- 链账户身份与权限相关(证书问题、public、多签投票问题)
- 核心交易引擎相关(交易池、DAG)
- 共识相关
- 智能合约相关
- 存储相关
- SDK相关
- 长安链CMC工具
- 长安链管理台
- 长安链浏览器
- 长安链合约IDE
- 长安链web签名插件
- 跨链相关
- 轻节点相关
- 隐私计算相关
- 密码学相关
- 环境依赖
- 其他补充:
【问题描述】(请对问题进行描述,方便定位问题)
具体的现象,操作步骤,前置条件等,尽可能描述清楚,有截图说明更佳
SmartEditor 在线合约编辑器合约编译失败,例子存证合约
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 int32 `json:"time"`
}
//NewFact 新建存证对象
func NewFact(fileHash, fileName string, time int32) *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"))
}
//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, int32(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)
}
}
【相关日志文件】(如果有报错日志请贴图,或者上传附件)
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签名插件版本,如果不是可忽略。
To upload designs, you'll need to enable LFS and have an admin enable hashed storage. More information