写点什么

长安链源码分析之交易过程分析(3)

作者:
  • 2022-10-25
    湖南
  • 本文字数:1186 字

    阅读完需:约 4 分钟

本文已参与「开源摘星计划」,欢迎正在阅读的你加入。活动链接:https://github.com/weopenprojects/WeOpen-Star


在查询合约过程中,有一个分支是判断是否是系统内部链的,如果是系统内部链,则合约查询走下面代码的分支,区别之处在于执行合约这里用的一个本地运行时实例,这个与虚拟机管理模块有什么区别,有待研究



//获取链idchainId := tx.Payload.ChainId
//获取store模块if store, err = s.chainMakerServer.GetStore(chainId); err != nil { errCode = commonErr.ERR_CODE_GET_STORE errMsg = s.getErrMsg(errCode, err) s.log.Error(errMsg) resp.Code = commonPb.TxStatusCode_INTERNAL_ERROR resp.Message = errMsg resp.TxId = tx.Payload.TxId return resp}
//获取日志模块var log = logger.GetLoggerByChain(logger.MODULE_SNAPSHOT, chainId)
//获取快照模块var snap protocol.Snapshotsnap, err = snapshot.NewQuerySnapshot(store, log)if err != nil { s.log.Error(err) resp.Code = commonPb.TxStatusCode_INTERNAL_ERROR resp.Message = err.Error() resp.TxId = tx.Payload.TxId return resp}
//创建一个上下文ctx := vm.NewTxSimContext(vmMgr, snap, tx, protocol.DefaultBlockVersion, log)
//定义一个默认gas,检查链配置中是否启动gas//如果启动,获取默认gasdefaultGas := uint64(0)chainConfig, _ := s.chainMakerServer.GetChainConf(chainId)if chainConfig.ChainConfig().AccountConfig != nil && chainConfig.ChainConfig().AccountConfig.EnableGas { defaultGas = chainConfig.ChainConfig().AccountConfig.DefaultGas}
//获取本地运行时实例模块runtimeInstance := native.GetRuntimeInstance(chainId, defaultGas, s.log)
//本地运行时实例模块调用合约,得到交易结果txResult := runtimeInstance.Invoke(&commonPb.Contract{ Name: tx.Payload.ContractName,}, tx.Payload.Method, nil, s.kvPair2Map(tx.Payload.Parameters), ctx,)
//如果监听打开,上传元数据信息if localconf.ChainMakerConfig.MonitorConfig.Enabled { if txResult.Code != 1 { s.metricQueryCounter.WithLabelValues(chainId, "true").Inc() } else { s.metricQueryCounter.WithLabelValues(chainId, "false").Inc() }}
//调用超时if txResult.Code == 1 { resp.Code = commonPb.TxStatusCode_CONTRACT_FAIL resp.Message = commonPb.TxStatusCode_CONTRACT_FAIL.String() resp.ContractResult = txResult resp.TxId = tx.Payload.TxId return resp}
//调用成功resp.Code = commonPb.TxStatusCode_SUCCESSresp.Message = commonPb.TxStatusCode_SUCCESS.String()resp.ContractResult = txResultresp.TxId = tx.Payload.TxIdreturn resp
复制代码


}

用户头像

关注

还未添加个人签名 2018-05-04 加入

还未添加个人简介

评论

发布
暂无评论
长安链源码分析之交易过程分析(3)_李_InfoQ写作社区