diff --git a/contractmgr/contract_manager.go b/contractmgr/contract_manager.go index a63d50e9d3adad3f6d7a5201ccfd5317eb1aee4b..bed248a7fb2357b6cc050cd349fb16a2970a20ae 100644 --- a/contractmgr/contract_manager.go +++ b/contractmgr/contract_manager.go @@ -375,6 +375,17 @@ func (r *ContractManagerRuntime) GetAllContracts(context protocol.TxSimContext) return result, nil } +func differentiateErr(version uint32, rtType commonPb.RuntimeType, msg string) (*commonPb.Contract, uint64, error) { + if version < 2218 { + return nil, 0, fmt.Errorf("%s, %s", errContractInitFail, msg) + } + + if rtType == commonPb.RuntimeType_EVM { + return nil, 0, errors.New(msg) + } + return nil, 0, fmt.Errorf("%s, %s", errContractInitFail, msg) +} + //InstallContract 安装新合约 func (r *ContractManagerRuntime) InstallContract(context protocol.TxSimContext, name, version string, byteCode []byte, runTime commonPb.RuntimeType, initParameters map[string][]byte) (*commonPb.Contract, uint64, error) { @@ -413,13 +424,16 @@ func (r *ContractManagerRuntime) InstallContract(context protocol.TxSimContext, return nil, 0, err } //实例化合约,并init合约,产生读写集 + blockVersion := context.GetBlockVersion() result, _, statusCode := context.CallContract(contract, protocol.ContractInitMethod, byteCode, initParameters, 0, commonPb.TxType_INVOKE_CONTRACT) if statusCode != commonPb.TxStatusCode_SUCCESS { - return nil, 0, fmt.Errorf("%s, %s", errContractInitFail, result.Message) + //return nil, 0, fmt.Errorf("%s, %s", errContractInitFail, result.Message) + return differentiateErr(blockVersion, runTime, result.Message) } if result.Code > 0 { //throw error - return nil, 0, fmt.Errorf("%s, %s", errContractInitFail, result.Message) + //return nil, 0, fmt.Errorf("%s, %s", errContractInitFail, result.Message) + return differentiateErr(blockVersion, runTime, result.Message) } if runTime == commonPb.RuntimeType_EVM { //save bytecode body @@ -427,7 +441,8 @@ func (r *ContractManagerRuntime) InstallContract(context protocol.TxSimContext, if len(result.Result) > 0 { err := context.Put(ContractName, byteCodeKey, result.Result) if err != nil { - return nil, 0, fmt.Errorf("%s, %s", errContractInitFail, err) + //return nil, 0, fmt.Errorf("%s, %s", errContractInitFail, err) + return differentiateErr(blockVersion, runTime, err.Error()) } } }