From 07fcc28676606e59d4c43d2b6a14c4db37bb4978 Mon Sep 17 00:00:00 2001 From: lyh169 Date: Mon, 26 Jun 2023 21:26:21 +0800 Subject: [PATCH 1/6] add callback for cross call --- go.mod | 1 + x/wasm/keeper/cross_contarct_call.go | 41 ++++++++++++++++++++++++++++ x/wasm/keeper/keeper.go | 6 ++++ 3 files changed, 48 insertions(+) create mode 100644 x/wasm/keeper/cross_contarct_call.go diff --git a/go.mod b/go.mod index 9c468ea80e..3a117b25e0 100644 --- a/go.mod +++ b/go.mod @@ -187,4 +187,5 @@ replace ( github.com/gogo/protobuf => github.com/regen-network/protobuf v1.3.3-alpha.regen.1 github.com/keybase/go-keychain => github.com/99designs/go-keychain v0.0.0-20191008050251-8e49817e8af4 github.com/tendermint/go-amino => github.com/okex/go-amino v0.15.1-okc4 + github.com/CosmWasm/wasmvm => /Volumes/E/project/github.com/okx/wasmvm ) diff --git a/x/wasm/keeper/cross_contarct_call.go b/x/wasm/keeper/cross_contarct_call.go new file mode 100644 index 0000000000..3b920f9adf --- /dev/null +++ b/x/wasm/keeper/cross_contarct_call.go @@ -0,0 +1,41 @@ +package keeper + +import "C" + +import ( + "fmt" + wasmvm "github.com/CosmWasm/wasmvm" + wasmvmtypes "github.com/CosmWasm/wasmvm/types" + sdk "github.com/okex/exchain/libs/cosmos-sdk/types" + "github.com/okex/exchain/x/wasm/types" + "unsafe" +) + +var ( + wasmKeeper Keeper +) + +func SetWasmKeeper(k *Keeper) { + wasmKeeper = *k +} + +func GenerateCallerInfo(q unsafe.Pointer, contractAddress string) ([]byte, wasmvm.KVStore, wasmvm.Querier) { + goQuerier := *(*wasmvm.Querier)(q) + qq := goQuerier.(QueryHandler) + code, _, store, querier := generateCallerInfo(qq.Ctx, contractAddress) + return code, store, querier +} + +func generateCallerInfo(ctx sdk.Context, addr string) ([]byte, wasmvmtypes.Env, wasmvm.KVStore, wasmvm.Querier) { + contractAddress, err := sdk.WasmAddressFromBech32(addr) + if err != nil { + panic(fmt.Sprintln("WasmAddressFromBech32 err", err)) + } + env := types.NewEnv(ctx, contractAddress) + _, codeInfo, prefixStore, err := wasmKeeper.contractInstance(ctx, contractAddress) + if err != nil { + return nil, env, nil, nil + } + queryHandler := wasmKeeper.newQueryHandler(ctx, contractAddress) + return codeInfo.CodeHash, env, prefixStore, &queryHandler +} diff --git a/x/wasm/keeper/keeper.go b/x/wasm/keeper/keeper.go index 6c9fffb549..a01cbd5eeb 100644 --- a/x/wasm/keeper/keeper.go +++ b/x/wasm/keeper/keeper.go @@ -1,5 +1,6 @@ package keeper +import "C" import ( "bytes" "context" @@ -12,6 +13,7 @@ import ( "strings" wasmvm "github.com/CosmWasm/wasmvm" + wasmapi "github.com/CosmWasm/wasmvm/api" wasmvmtypes "github.com/CosmWasm/wasmvm/types" "github.com/gogo/protobuf/proto" @@ -211,6 +213,10 @@ func newKeeper(cdc *codec.CodecProxy, } // not updateable, yet keeper.wasmVMResponseHandler = NewDefaultWasmVMContractResponseHandler(NewMessageDispatcher(keeper.messenger, keeper)) + + // register + wasmapi.RegisterGenerateCallerInfo(GenerateCallerInfo) + SetWasmKeeper(keeper) return *keeper } From b377e3caae20f587b1a97ebb197d9784fb751686 Mon Sep 17 00:00:00 2001 From: lyh169 Date: Tue, 27 Jun 2023 22:17:56 +0800 Subject: [PATCH 2/6] adaptive the return result --- x/wasm/keeper/cross_contarct_call.go | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/x/wasm/keeper/cross_contarct_call.go b/x/wasm/keeper/cross_contarct_call.go index 3b920f9adf..42445bf606 100644 --- a/x/wasm/keeper/cross_contarct_call.go +++ b/x/wasm/keeper/cross_contarct_call.go @@ -19,14 +19,14 @@ func SetWasmKeeper(k *Keeper) { wasmKeeper = *k } -func GenerateCallerInfo(q unsafe.Pointer, contractAddress string) ([]byte, wasmvm.KVStore, wasmvm.Querier) { +func GenerateCallerInfo(q unsafe.Pointer, contractAddress string) ([]byte, wasmvm.KVStore, wasmvm.Querier, wasmvm.GasMeter) { goQuerier := *(*wasmvm.Querier)(q) qq := goQuerier.(QueryHandler) - code, _, store, querier := generateCallerInfo(qq.Ctx, contractAddress) - return code, store, querier + code, _, store, querier, gasMeter := generateCallerInfo(qq.Ctx, contractAddress) + return code, store, querier, gasMeter } -func generateCallerInfo(ctx sdk.Context, addr string) ([]byte, wasmvmtypes.Env, wasmvm.KVStore, wasmvm.Querier) { +func generateCallerInfo(ctx sdk.Context, addr string) ([]byte, wasmvmtypes.Env, wasmvm.KVStore, wasmvm.Querier, wasmvm.GasMeter) { contractAddress, err := sdk.WasmAddressFromBech32(addr) if err != nil { panic(fmt.Sprintln("WasmAddressFromBech32 err", err)) @@ -34,8 +34,8 @@ func generateCallerInfo(ctx sdk.Context, addr string) ([]byte, wasmvmtypes.Env, env := types.NewEnv(ctx, contractAddress) _, codeInfo, prefixStore, err := wasmKeeper.contractInstance(ctx, contractAddress) if err != nil { - return nil, env, nil, nil + return nil, env, nil, nil, nil } queryHandler := wasmKeeper.newQueryHandler(ctx, contractAddress) - return codeInfo.CodeHash, env, prefixStore, &queryHandler + return codeInfo.CodeHash, env, prefixStore, &queryHandler, wasmKeeper.gasMeter(ctx) } From 9353b40309cac4e77cb7ee1d888f6a8e9e8caa3d Mon Sep 17 00:00:00 2001 From: lyh169 Date: Thu, 6 Jul 2023 10:04:41 +0800 Subject: [PATCH 3/6] add cache and modify a bug --- x/wasm/keeper/cross_contarct_call.go | 32 +++++++++++++++++++++++++++- x/wasm/keeper/keeper.go | 2 ++ 2 files changed, 33 insertions(+), 1 deletion(-) diff --git a/x/wasm/keeper/cross_contarct_call.go b/x/wasm/keeper/cross_contarct_call.go index 42445bf606..653f1b2582 100644 --- a/x/wasm/keeper/cross_contarct_call.go +++ b/x/wasm/keeper/cross_contarct_call.go @@ -5,6 +5,7 @@ import "C" import ( "fmt" wasmvm "github.com/CosmWasm/wasmvm" + "github.com/CosmWasm/wasmvm/api" wasmvmtypes "github.com/CosmWasm/wasmvm/types" sdk "github.com/okex/exchain/libs/cosmos-sdk/types" "github.com/okex/exchain/x/wasm/types" @@ -13,12 +14,41 @@ import ( var ( wasmKeeper Keeper + + // wasmvm cache param + filePath string + supportedFeatures string + contractMemoryLimit uint32 = ContractMemoryLimit + contractDebugMode bool + memoryCacheSize uint32 + + wasmCache api.Cache ) func SetWasmKeeper(k *Keeper) { wasmKeeper = *k } +func SetWasmCache(cache api.Cache) { + wasmCache = cache +} + +func SetWasmCacheParam(dataDir string, + supportedFeatures string, + memoryLimit uint32, + printDebug bool, + cacheSize uint32) { + filePath = dataDir + supportedFeatures = supportedFeatures + contractMemoryLimit = memoryLimit + contractDebugMode = printDebug + memoryCacheSize = cacheSize +} + +func GetCacheInfo() (wasmvm.GoAPI, api.Cache) { + return cosmwasmAPI, wasmCache +} + func GenerateCallerInfo(q unsafe.Pointer, contractAddress string) ([]byte, wasmvm.KVStore, wasmvm.Querier, wasmvm.GasMeter) { goQuerier := *(*wasmvm.Querier)(q) qq := goQuerier.(QueryHandler) @@ -37,5 +67,5 @@ func generateCallerInfo(ctx sdk.Context, addr string) ([]byte, wasmvmtypes.Env, return nil, env, nil, nil, nil } queryHandler := wasmKeeper.newQueryHandler(ctx, contractAddress) - return codeInfo.CodeHash, env, prefixStore, &queryHandler, wasmKeeper.gasMeter(ctx) + return codeInfo.CodeHash, env, prefixStore, queryHandler, wasmKeeper.gasMeter(ctx) } diff --git a/x/wasm/keeper/keeper.go b/x/wasm/keeper/keeper.go index a01cbd5eeb..31f4e36c29 100644 --- a/x/wasm/keeper/keeper.go +++ b/x/wasm/keeper/keeper.go @@ -216,7 +216,9 @@ func newKeeper(cdc *codec.CodecProxy, // register wasmapi.RegisterGenerateCallerInfo(GenerateCallerInfo) + wasmapi.RegisterGetCacheInfo(GetCacheInfo) SetWasmKeeper(keeper) + SetWasmCache(wasmer.GetCache()) return *keeper } From 1c931a8f86ac88e4881413d13bb4d65ff7914212 Mon Sep 17 00:00:00 2001 From: lyh169 Date: Thu, 6 Jul 2023 16:40:38 +0800 Subject: [PATCH 4/6] adjust some code --- x/wasm/keeper/cross_contarct_call.go | 23 ++++------------------- x/wasm/keeper/keeper.go | 2 ++ 2 files changed, 6 insertions(+), 19 deletions(-) diff --git a/x/wasm/keeper/cross_contarct_call.go b/x/wasm/keeper/cross_contarct_call.go index 653f1b2582..8659617a98 100644 --- a/x/wasm/keeper/cross_contarct_call.go +++ b/x/wasm/keeper/cross_contarct_call.go @@ -6,9 +6,7 @@ import ( "fmt" wasmvm "github.com/CosmWasm/wasmvm" "github.com/CosmWasm/wasmvm/api" - wasmvmtypes "github.com/CosmWasm/wasmvm/types" sdk "github.com/okex/exchain/libs/cosmos-sdk/types" - "github.com/okex/exchain/x/wasm/types" "unsafe" ) @@ -33,18 +31,6 @@ func SetWasmCache(cache api.Cache) { wasmCache = cache } -func SetWasmCacheParam(dataDir string, - supportedFeatures string, - memoryLimit uint32, - printDebug bool, - cacheSize uint32) { - filePath = dataDir - supportedFeatures = supportedFeatures - contractMemoryLimit = memoryLimit - contractDebugMode = printDebug - memoryCacheSize = cacheSize -} - func GetCacheInfo() (wasmvm.GoAPI, api.Cache) { return cosmwasmAPI, wasmCache } @@ -52,20 +38,19 @@ func GetCacheInfo() (wasmvm.GoAPI, api.Cache) { func GenerateCallerInfo(q unsafe.Pointer, contractAddress string) ([]byte, wasmvm.KVStore, wasmvm.Querier, wasmvm.GasMeter) { goQuerier := *(*wasmvm.Querier)(q) qq := goQuerier.(QueryHandler) - code, _, store, querier, gasMeter := generateCallerInfo(qq.Ctx, contractAddress) + code, store, querier, gasMeter := generateCallerInfo(qq.Ctx, contractAddress) return code, store, querier, gasMeter } -func generateCallerInfo(ctx sdk.Context, addr string) ([]byte, wasmvmtypes.Env, wasmvm.KVStore, wasmvm.Querier, wasmvm.GasMeter) { +func generateCallerInfo(ctx sdk.Context, addr string) ([]byte, wasmvm.KVStore, wasmvm.Querier, wasmvm.GasMeter) { contractAddress, err := sdk.WasmAddressFromBech32(addr) if err != nil { panic(fmt.Sprintln("WasmAddressFromBech32 err", err)) } - env := types.NewEnv(ctx, contractAddress) _, codeInfo, prefixStore, err := wasmKeeper.contractInstance(ctx, contractAddress) if err != nil { - return nil, env, nil, nil, nil + return nil, nil, nil, nil } queryHandler := wasmKeeper.newQueryHandler(ctx, contractAddress) - return codeInfo.CodeHash, env, prefixStore, queryHandler, wasmKeeper.gasMeter(ctx) + return codeInfo.CodeHash, prefixStore, queryHandler, wasmKeeper.gasMeter(ctx) } diff --git a/x/wasm/keeper/keeper.go b/x/wasm/keeper/keeper.go index 31f4e36c29..fcad69a2fa 100644 --- a/x/wasm/keeper/keeper.go +++ b/x/wasm/keeper/keeper.go @@ -596,7 +596,9 @@ func (k Keeper) execute(ctx sdk.Context, contractAddress sdk.WasmAddress, caller } } + fmt.Println("************* start wasmvm execute *************") res, gasUsed, execErr := k.wasmVM.Execute(codeInfo.CodeHash, env, info, msg, prefixStore, cosmwasmAPI, querier, k.gasMeter(ctx), gas, costJSONDeserialization) + fmt.Println("************* end wasmvm execute *************", gasUsed) k.consumeRuntimeGas(ctx, gasUsed) if !ctx.IsCheckTx() && k.innertxKeeper != nil { k.innertxKeeper.UpdateWasmInnerTx(ctx.TxBytes(), ctx.BlockHeight(), innertx.CosmosDepth, caller, contractAddress, innertx.CosmosCallType, types.ExecuteInnertxName, coins, err, k.gasRegister.FromWasmVMGas(gasUsed), string(msg)) From 30bd58fbaa56c0c536e7a898abbff189bc572653 Mon Sep 17 00:00:00 2001 From: lyh169 Date: Fri, 7 Jul 2023 12:15:05 +0800 Subject: [PATCH 5/6] adjust some code about get the call info --- x/wasm/keeper/cross_contarct_call.go | 43 +++++++++++++++++++--------- x/wasm/keeper/keeper.go | 4 +-- 2 files changed, 32 insertions(+), 15 deletions(-) diff --git a/x/wasm/keeper/cross_contarct_call.go b/x/wasm/keeper/cross_contarct_call.go index 8659617a98..6af17a9424 100644 --- a/x/wasm/keeper/cross_contarct_call.go +++ b/x/wasm/keeper/cross_contarct_call.go @@ -3,7 +3,7 @@ package keeper import "C" import ( - "fmt" + "errors" wasmvm "github.com/CosmWasm/wasmvm" "github.com/CosmWasm/wasmvm/api" sdk "github.com/okex/exchain/libs/cosmos-sdk/types" @@ -31,26 +31,43 @@ func SetWasmCache(cache api.Cache) { wasmCache = cache } -func GetCacheInfo() (wasmvm.GoAPI, api.Cache) { +func GetWasmCacheInfo() (wasmvm.GoAPI, api.Cache) { return cosmwasmAPI, wasmCache } -func GenerateCallerInfo(q unsafe.Pointer, contractAddress string) ([]byte, wasmvm.KVStore, wasmvm.Querier, wasmvm.GasMeter) { +func GetWasmCallInfo(q unsafe.Pointer, contractAddress, storeAddress string) ([]byte, wasmvm.KVStore, wasmvm.Querier, wasmvm.GasMeter, error) { goQuerier := *(*wasmvm.Querier)(q) - qq := goQuerier.(QueryHandler) - code, store, querier, gasMeter := generateCallerInfo(qq.Ctx, contractAddress) - return code, store, querier, gasMeter + qq, ok := goQuerier.(QueryHandler) + if !ok { + return nil, nil, nil, nil, errors.New("can not switch the pointer to the QueryHandler") + } + return getCallerInfo(qq.Ctx, contractAddress, storeAddress) } -func generateCallerInfo(ctx sdk.Context, addr string) ([]byte, wasmvm.KVStore, wasmvm.Querier, wasmvm.GasMeter) { - contractAddress, err := sdk.WasmAddressFromBech32(addr) +func getCallerInfo(ctx sdk.Context, contractAddress, storeAddress string) ([]byte, wasmvm.KVStore, wasmvm.Querier, wasmvm.GasMeter, error) { + cAddr, err := sdk.WasmAddressFromBech32(contractAddress) + if err != nil { + return nil, nil, nil, nil, err + } + // 1. get wasm code from contractAddress + _, codeInfo, prefixStore, err := wasmKeeper.contractInstance(ctx, cAddr) + if err != nil { + return nil, nil, nil, nil, err + } + // 2. contractAddress == storeAddress and direct return + if contractAddress == storeAddress { + queryHandler := wasmKeeper.newQueryHandler(ctx, cAddr) + return codeInfo.CodeHash, prefixStore, queryHandler, wasmKeeper.gasMeter(ctx), nil + } + // 3. get store from storeaddress + sAddr, err := sdk.WasmAddressFromBech32(storeAddress) if err != nil { - panic(fmt.Sprintln("WasmAddressFromBech32 err", err)) + return nil, nil, nil, nil, err } - _, codeInfo, prefixStore, err := wasmKeeper.contractInstance(ctx, contractAddress) + _, _, prefixStore, err = wasmKeeper.contractInstance(ctx, sAddr) if err != nil { - return nil, nil, nil, nil + return nil, nil, nil, nil, err } - queryHandler := wasmKeeper.newQueryHandler(ctx, contractAddress) - return codeInfo.CodeHash, prefixStore, queryHandler, wasmKeeper.gasMeter(ctx) + queryHandler := wasmKeeper.newQueryHandler(ctx, sAddr) + return codeInfo.CodeHash, prefixStore, queryHandler, wasmKeeper.gasMeter(ctx), nil } diff --git a/x/wasm/keeper/keeper.go b/x/wasm/keeper/keeper.go index fcad69a2fa..278b7f1000 100644 --- a/x/wasm/keeper/keeper.go +++ b/x/wasm/keeper/keeper.go @@ -215,8 +215,8 @@ func newKeeper(cdc *codec.CodecProxy, keeper.wasmVMResponseHandler = NewDefaultWasmVMContractResponseHandler(NewMessageDispatcher(keeper.messenger, keeper)) // register - wasmapi.RegisterGenerateCallerInfo(GenerateCallerInfo) - wasmapi.RegisterGetCacheInfo(GetCacheInfo) + wasmapi.RegisterGetWasmCallInfo(GetWasmCallInfo) + wasmapi.RegisterGetWasmCacheInfo(GetWasmCacheInfo) SetWasmKeeper(keeper) SetWasmCache(wasmer.GetCache()) return *keeper From fd0391c72b7d04010fe7f6a98a95494559b7bf0b Mon Sep 17 00:00:00 2001 From: lyh169 Date: Fri, 7 Jul 2023 15:08:38 +0800 Subject: [PATCH 6/6] del debug --- x/wasm/keeper/keeper.go | 2 -- 1 file changed, 2 deletions(-) diff --git a/x/wasm/keeper/keeper.go b/x/wasm/keeper/keeper.go index 278b7f1000..653540e311 100644 --- a/x/wasm/keeper/keeper.go +++ b/x/wasm/keeper/keeper.go @@ -596,9 +596,7 @@ func (k Keeper) execute(ctx sdk.Context, contractAddress sdk.WasmAddress, caller } } - fmt.Println("************* start wasmvm execute *************") res, gasUsed, execErr := k.wasmVM.Execute(codeInfo.CodeHash, env, info, msg, prefixStore, cosmwasmAPI, querier, k.gasMeter(ctx), gas, costJSONDeserialization) - fmt.Println("************* end wasmvm execute *************", gasUsed) k.consumeRuntimeGas(ctx, gasUsed) if !ctx.IsCheckTx() && k.innertxKeeper != nil { k.innertxKeeper.UpdateWasmInnerTx(ctx.TxBytes(), ctx.BlockHeight(), innertx.CosmosDepth, caller, contractAddress, innertx.CosmosCallType, types.ExecuteInnertxName, coins, err, k.gasRegister.FromWasmVMGas(gasUsed), string(msg))