Skip to content

GitLab

  • Projects
  • Groups
  • Snippets
  • Help
    • Loading...
  • Sign in
issue
issue
  • Project overview
    • Project overview
    • Details
    • Activity
    • Releases
  • Repository
    • Repository
    • Files
    • Commits
    • Branches
    • Tags
    • Contributors
    • Graph
    • Compare
  • Issues 23
    • Issues 23
    • List
    • Boards
    • Labels
    • Service Desk
    • Milestones
  • Wiki
    • Wiki
  • Snippets
    • Snippets
  • Members
    • Members
  • Activity
  • Graph
  • Create a new issue
  • Commits
  • Issue Boards
Collapse sidebar

新注册的用户请输入邮箱并保存,随后登录邮箱激活账号。后续可直接使用邮箱登录!

  • chainmaker
  • issueissue
  • Issues
  • #1201

Closed
Open
Opened Oct 08, 2024 by 落花听雨@13223060783💬3 of 19 tasks completed3/19 tasks

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签名插件版本,如果不是可忽略。
To upload designs, you'll need to enable LFS and have an admin enable hashed storage. More information
Assignee
Assign to
None
Milestone
None
Assign milestone
Time tracking
None
Due date
None
Reference: chainmaker/issue#1201

Copyright © 2021 ChainMaker Org. All Rights Reserved. 长安链 版权所有。