长安链源码分析之交易过程分析(3)
作者:李
- 2022-10-25 湖南
本文字数:1186 字
阅读完需:约 4 分钟
本文已参与「开源摘星计划」,欢迎正在阅读的你加入。活动链接:https://github.com/weopenprojects/WeOpen-Star
在查询合约过程中,有一个分支是判断是否是系统内部链的,如果是系统内部链,则合约查询走下面代码的分支,区别之处在于执行合约这里用的一个本地运行时实例,这个与虚拟机管理模块有什么区别,有待研究
//获取链id
chainId := 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.Snapshot
snap, 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
//如果启动,获取默认gas
defaultGas := 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_SUCCESS
resp.Message = commonPb.TxStatusCode_SUCCESS.String()
resp.ContractResult = txResult
resp.TxId = tx.Payload.TxId
return resp
复制代码
}
划线
评论
复制
发布于: 刚刚阅读数: 5
李
关注
还未添加个人签名 2018-05-04 加入
还未添加个人简介
评论