一笔交易被反复打回交易池,直到超出交易池限制时间被移除,父合约、子合约进程没有正常被kill
【问题分类】
- bug
- P2P网络相关(包含libp2p,liquid)
- 链账户身份与权限相关(证书问题、public、多签投票问题)
- 核心交易引擎相关(交易池、DAG)
- 共识相关
- 智能合约相关
- 存储相关
- SDK相关
- 长安链CMC工具
- 长安链管理台
- 长安链浏览器
- 长安链合约IDE
- 长安链web签名插件
- 跨链相关
- 轻节点相关
- 隐私计算相关
- 密码学相关
- 环境依赖
- 其他补充:Chainmaker版本v2.3.2,启动单机四节点使用docker vm引擎的链
【问题描述】
为什么交易始终被打回,而不是交易执行超时
触发条件 智能合约中使用跨合约调用接口CallContract()进行大量跨合约调用
func (f *FuContract) save() protogo.Response {
params := sdk.Instance.GetArgs()
// 获取参数
contractName := string(params["contractName"])
method := string(params["method"])
argsmapBytes := params["argsmap"]
argsmapstring := make(map[string]string)
err := json.Unmarshal(argsmapBytes, &argsmapstring)
if err != nil {
return sdk.Error(fmt.Sprintf("marshal argsmapstring failed, err: %s,argsmapstring: %v", err, argsmapstring))
}
argsmapByte := make(map[string][]byte)
for k, v := range argsmapstring {
argsmapByte[k] = []byte(v)
}
var wg sync.WaitGroup
for i := 0; i < 10000; i++ {
// start := make(chan struct{}) // 使用无缓冲通道同步启动
wg.Add(1)
go func() {
defer wg.Done()
//跨合约调用
var response protogo.Response
response = sdk.Instance.CallContract(contractName, method, argsmapByte)
if response.Message != "Success" {
sdk.Error(fmt.Sprintf("fail to CallContract zicontract, argsmapByte:%v", argsmapByte))
}
}()
// 同时启动所有协程
// close(start)
// 等待所有协程完成
// time.Sleep(1 * time.Second)
}
wg.Wait()
// 返回结果
return sdk.Success([]byte("invoke successfully"))
}
【相关日志文件】
【系统信息】(请填写系统信息,方便定位问题)
- chainmaker-go version * : [v2.3.2]
- OS & version * : [CentOs 7]
- docker镜像 version: [chainmakerofficial/chainmaker-vm-engine:v2.3.2]
To upload designs, you'll need to enable LFS and have an admin enable hashed storage. More information