From a454fcd5a1bdce1eb761ca972f193da7fa51aa26 Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Thu, 15 May 2025 14:06:35 +0200 Subject: [PATCH 1/5] Implement RawRange query --- x/wasm/keeper/keeper.go | 36 ++++++ x/wasm/keeper/keeper_test.go | 170 ++++++++++++++++++++++++++++ x/wasm/keeper/query_plugins.go | 18 +++ x/wasm/keeper/query_plugins_test.go | 8 ++ x/wasm/keeper/testdata/queue.wasm | Bin 0 -> 199808 bytes 5 files changed, 232 insertions(+) create mode 100644 x/wasm/keeper/testdata/queue.wasm diff --git a/x/wasm/keeper/keeper.go b/x/wasm/keeper/keeper.go index a4155f28f..70cec6299 100644 --- a/x/wasm/keeper/keeper.go +++ b/x/wasm/keeper/keeper.go @@ -939,6 +939,42 @@ func (k Keeper) QueryRaw(ctx context.Context, contractAddress sdk.AccAddress, ke return prefixStore.Get(key) } +func (k Keeper) QueryRawRange(ctx context.Context, contractAddress sdk.AccAddress, start, end []byte, limit uint16, reverse bool) (results []wasmvmtypes.RawRangeEntry, nextKey []byte) { + defer telemetry.MeasureSince(time.Now(), "wasm", "contract", "query-raw-range") + + prefixStoreKey := types.GetContractStorePrefix(contractAddress) + prefixStore := prefix.NewStore(runtime.KVStoreAdapter(k.storeService.OpenKVStore(ctx)), prefixStoreKey) + var iter storetypes.Iterator + if reverse { + iter = prefixStore.ReverseIterator(start, end) + } else { + iter = prefixStore.Iterator(start, end) + } + defer iter.Close() + + var count uint16 = 0 + for ; iter.Valid(); iter.Next() { + // keep track of count to honor the limit + if count == limit { + break + } + count++ + + // add key-value pair + results = append(results, wasmvmtypes.RawRangeEntry{Key: iter.Key(), Value: iter.Value()}) + } + + if iter.Valid() { + // if there are more results, set the next key + key := iter.Key() + nextKey = key + } else { + nextKey = nil + } + + return +} + // internal helper function func (k Keeper) contractInstance(ctx context.Context, contractAddress sdk.AccAddress) (types.ContractInfo, types.CodeInfo, wasmvm.KVStore, error) { store := k.storeService.OpenKVStore(ctx) diff --git a/x/wasm/keeper/keeper_test.go b/x/wasm/keeper/keeper_test.go index 3bb82234b..aa7c614fa 100644 --- a/x/wasm/keeper/keeper_test.go +++ b/x/wasm/keeper/keeper_test.go @@ -3,6 +3,7 @@ package keeper import ( "bytes" _ "embed" + "encoding/binary" "encoding/json" "errors" "fmt" @@ -51,6 +52,9 @@ var hackatomWasm []byte //go:embed testdata/replier.wasm var replierWasm []byte +//go:embed testdata/queue.wasm +var queueWasm []byte + var AvailableCapabilities = []string{ "iterator", "staking", "stargate", "cosmwasm_1_1", "cosmwasm_1_2", "cosmwasm_1_3", "cosmwasm_1_4", "cosmwasm_2_0", "cosmwasm_2_1", "cosmwasm_2_2", "ibc2", @@ -2985,3 +2989,169 @@ func TestCheckDiscountEligibility(t *testing.T) { }) } } + +func TestQueryRawRange(t *testing.T) { + ctx, keepers := CreateTestInput(t, false, AvailableCapabilities) + k := keepers.WasmKeeper + + // Create queue contract and instantiate + creator := RandomAccountAddress(t) + codeID, _, err := keepers.ContractKeeper.Create(ctx, creator, queueWasm, nil) + require.NoError(t, err) + initMsgBz := []byte("{}") + contractAddress, _, err := keepers.ContractKeeper.Instantiate(ctx, codeID, creator, nil, initMsgBz, "queue", nil) + + type EnqueueMsg struct { + Value int32 `json:"value"` + } + type QueueExecMsg struct { + Enqueue *EnqueueMsg `json:"enqueue"` + // ... + } + + // fill contract storage with 100 items + for i := range 100 { + enqueueMsg := QueueExecMsg{ + Enqueue: &EnqueueMsg{Value: int32(i)}, + } + execMsg, err := json.Marshal(enqueueMsg) + require.NoError(t, err) + _, err = keepers.ContractKeeper.Execute(ctx, contractAddress, creator, execMsg, nil) + require.NoError(t, err) + } + + type QueueEntry struct { + key uint32 + val int32 + } + + optUint32 := func(v uint32) *uint32 { + return &v + } + + specs := map[string]struct { + start *uint32 + end *uint32 + limit uint16 + reverse bool + expEntries []QueueEntry + expNext *uint32 + }{ + "non-existent range": { + start: optUint32(100), + end: optUint32(200), + limit: 10, + expEntries: []QueueEntry{}, + expNext: nil, + }, + "limited middle range": { + start: optUint32(10), + end: optUint32(50), + limit: 5, + expEntries: []QueueEntry{ + {key: 10, val: 10}, + {key: 11, val: 11}, + {key: 12, val: 12}, + {key: 13, val: 13}, + {key: 14, val: 14}, + }, + expNext: optUint32(15), + }, + "limited range with no end": { + start: optUint32(10), + end: nil, + limit: 2, + expEntries: []QueueEntry{ + {key: 10, val: 10}, + {key: 11, val: 11}, + }, + expNext: optUint32(12), + }, + "limited range with no start": { + start: nil, + end: optUint32(50), + limit: 2, + expEntries: []QueueEntry{ + {key: 0, val: 0}, + {key: 1, val: 1}, + }, + expNext: optUint32(2), + }, + "unbounded range": { + start: nil, + end: nil, + limit: 1, + expEntries: []QueueEntry{ + {key: 0, val: 0}, + }, + expNext: optUint32(1), + }, + "unbounded reversed range": { + start: nil, + end: nil, + limit: 1, + reverse: true, + expEntries: []QueueEntry{ + {key: 99, val: 99}, + }, + expNext: optUint32(98), + }, + "full bounded reversed range": { + start: optUint32(0), + end: optUint32(2), + limit: 100, + reverse: true, + expEntries: []QueueEntry{ + {key: 1, val: 1}, + {key: 0, val: 0}, + }, + expNext: nil, // no next key because range is fully covered + }, + "start > end, reversed": { + start: optUint32(50), + end: optUint32(10), + limit: 5, + reverse: true, + expEntries: []QueueEntry{}, + expNext: nil, + }, + } + + toBytes := func(v *uint32) []byte { + if v == nil { + return nil + } + return binary.BigEndian.AppendUint32(nil, *v) + } + + for name, spec := range specs { + t.Run(name, func(t *testing.T) { + // queue contract uses big endian encoded uint32 as key + startBytes := toBytes(spec.start) + endBytes := toBytes(spec.end) + + entries, next := k.QueryRawRange(ctx, contractAddress, startBytes, endBytes, spec.limit, spec.reverse) + + // converting the entries we get back instead of the entries we put in the spec because + // it makes for easier to read test outputs (actual integers instead of byte arrays) + convertedEntries := make([]QueueEntry, len(entries)) + for i, entry := range entries { + // values are json-encoded as `{"value":}` + // so we need to unmarshal it and extract the value + var value EnqueueMsg + err := json.Unmarshal(entry.Value, &value) + require.NoError(t, err) + + convertedEntries[i] = QueueEntry{ + key: binary.BigEndian.Uint32(entry.Key), + val: value.Value, + } + } + + expNextBz := toBytes(spec.expNext) + assert.Equal(t, spec.expEntries, convertedEntries) + assert.Equal(t, expNextBz, next) + }) + } + +} diff --git a/x/wasm/keeper/query_plugins.go b/x/wasm/keeper/query_plugins.go index 691480595..e36196521 100644 --- a/x/wasm/keeper/query_plugins.go +++ b/x/wasm/keeper/query_plugins.go @@ -108,6 +108,7 @@ type wasmQueryKeeper interface { contractMetaDataSource GetCodeInfo(ctx context.Context, codeID uint64) *types.CodeInfo QueryRaw(ctx context.Context, contractAddress sdk.AccAddress, key []byte) []byte + QueryRawRange(ctx context.Context, contractAddress sdk.AccAddress, start, end []byte, limit uint16, reverse bool) (results []wasmvmtypes.RawRangeEntry, nextKey []byte) QuerySmart(ctx context.Context, contractAddr sdk.AccAddress, req []byte) ([]byte, error) IsPinnedCode(ctx context.Context, codeID uint64) bool } @@ -705,6 +706,23 @@ func WasmQuerier(k wasmQueryKeeper) func(ctx sdk.Context, request *wasmvmtypes.W Checksum: info.CodeHash, } return json.Marshal(res) + case request.RawRange != nil: + contractAddr := request.RawRange.ContractAddr + addr, err := sdk.AccAddressFromBech32(contractAddr) + if err != nil { + return nil, errorsmod.Wrap(sdkerrors.ErrInvalidAddress, contractAddr) + } + + var reverse bool + switch request.RawRange.Order { + case "ascending": + reverse = false + case "descending": + reverse = true + default: + return nil, errorsmod.Wrapf(sdkerrors.ErrInvalidRequest, "unknown order %s", request.RawRange.Order) + } + k.QueryRawRange(ctx, addr, request.RawRange.Start, request.RawRange.End, request.RawRange.Limit, reverse) } return nil, wasmvmtypes.UnsupportedRequest{Kind: "unknown WasmQuery variant"} } diff --git a/x/wasm/keeper/query_plugins_test.go b/x/wasm/keeper/query_plugins_test.go index f122e42b7..8d7133860 100644 --- a/x/wasm/keeper/query_plugins_test.go +++ b/x/wasm/keeper/query_plugins_test.go @@ -628,6 +628,7 @@ type mockWasmQueryKeeper struct { GetContractInfoFn func(ctx context.Context, contractAddress sdk.AccAddress) *types.ContractInfo QueryRawFn func(ctx context.Context, contractAddress sdk.AccAddress, key []byte) []byte QuerySmartFn func(ctx context.Context, contractAddr sdk.AccAddress, req types.RawContractMessage) ([]byte, error) + QueryRawRangeFn func(ctx context.Context, contractAddress sdk.AccAddress, start, end []byte, limit uint16, reverse bool) (results []wasmvmtypes.RawRangeEntry, nextKey []byte) IsPinnedCodeFn func(ctx context.Context, codeID uint64) bool GetCodeInfoFn func(ctx context.Context, codeID uint64) *types.CodeInfo } @@ -646,6 +647,13 @@ func (m mockWasmQueryKeeper) QueryRaw(ctx context.Context, contractAddress sdk.A return m.QueryRawFn(ctx, contractAddress, key) } +func (m mockWasmQueryKeeper) QueryRawRange(ctx context.Context, contractAddress sdk.AccAddress, start, end []byte, limit uint16, reverse bool) (results []wasmvmtypes.RawRangeEntry, nextKey []byte) { + if m.QueryRawRangeFn == nil { + panic("not expected to be called") + } + return m.QueryRawRangeFn(ctx, contractAddress, start, end, limit, reverse) +} + func (m mockWasmQueryKeeper) QuerySmart(ctx context.Context, contractAddr sdk.AccAddress, req []byte) ([]byte, error) { if m.QuerySmartFn == nil { panic("not expected to be called") diff --git a/x/wasm/keeper/testdata/queue.wasm b/x/wasm/keeper/testdata/queue.wasm new file mode 100644 index 0000000000000000000000000000000000000000..1959e702b2240aafb3693341590fbccb6d93193b GIT binary patch literal 199808 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 U`))B#zk|04$2?hhSLNCN4N)M(^b literal 0 HcmV?d00001 From bb80664a91e233e9c4c91f3f8ce1709ad5328f83 Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Fri, 16 May 2025 16:20:28 +0200 Subject: [PATCH 2/5] Fix nil RawRange response --- x/wasm/keeper/keeper.go | 3 +++ x/wasm/keeper/keeper_test.go | 2 ++ 2 files changed, 5 insertions(+) diff --git a/x/wasm/keeper/keeper.go b/x/wasm/keeper/keeper.go index 70cec6299..e7e6d688d 100644 --- a/x/wasm/keeper/keeper.go +++ b/x/wasm/keeper/keeper.go @@ -952,6 +952,9 @@ func (k Keeper) QueryRawRange(ctx context.Context, contractAddress sdk.AccAddres } defer iter.Close() + // Make sure to set to empty array because the contract doesn't expect a null JSON value + results = []wasmvmtypes.RawRangeEntry{} + var count uint16 = 0 for ; iter.Valid(); iter.Next() { // keep track of count to honor the limit diff --git a/x/wasm/keeper/keeper_test.go b/x/wasm/keeper/keeper_test.go index aa7c614fa..f2e27f918 100644 --- a/x/wasm/keeper/keeper_test.go +++ b/x/wasm/keeper/keeper_test.go @@ -3131,6 +3131,8 @@ func TestQueryRawRange(t *testing.T) { endBytes := toBytes(spec.end) entries, next := k.QueryRawRange(ctx, contractAddress, startBytes, endBytes, spec.limit, spec.reverse) + // contract cannot handle nil, so we disallow it + require.NotNil(t, entries) // converting the entries we get back instead of the entries we put in the spec because // it makes for easier to read test outputs (actual integers instead of byte arrays) From 88f2bedbadacfa3809779987f82da108c62d103f Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Mon, 19 May 2025 11:33:11 +0200 Subject: [PATCH 3/5] Finish RawRange query implementation --- x/wasm/keeper/query_plugins.go | 8 ++- x/wasm/keeper/query_plugins_test.go | 92 +++++++++++++++++++++++++++++ 2 files changed, 99 insertions(+), 1 deletion(-) diff --git a/x/wasm/keeper/query_plugins.go b/x/wasm/keeper/query_plugins.go index e36196521..2bef85baa 100644 --- a/x/wasm/keeper/query_plugins.go +++ b/x/wasm/keeper/query_plugins.go @@ -722,7 +722,13 @@ func WasmQuerier(k wasmQueryKeeper) func(ctx sdk.Context, request *wasmvmtypes.W default: return nil, errorsmod.Wrapf(sdkerrors.ErrInvalidRequest, "unknown order %s", request.RawRange.Order) } - k.QueryRawRange(ctx, addr, request.RawRange.Start, request.RawRange.End, request.RawRange.Limit, reverse) + data, nextKey := k.QueryRawRange(ctx, addr, request.RawRange.Start, request.RawRange.End, request.RawRange.Limit, reverse) + res := wasmvmtypes.RawRangeResponse{ + Data: data, + NextKey: nextKey, + } + return json.Marshal(res) + } return nil, wasmvmtypes.UnsupportedRequest{Kind: "unknown WasmQuery variant"} } diff --git a/x/wasm/keeper/query_plugins_test.go b/x/wasm/keeper/query_plugins_test.go index 8d7133860..47d6d4b0d 100644 --- a/x/wasm/keeper/query_plugins_test.go +++ b/x/wasm/keeper/query_plugins_test.go @@ -587,6 +587,98 @@ func TestCodeInfoWasmQuerier(t *testing.T) { } } +func TestRawRangeWasmQuerier(t *testing.T) { + myValidContractAddr := keeper.RandomBech32AccountAddress(t) + validResponse := wasmvmtypes.RawRangeResponse{ + Data: []wasmvmtypes.RawRangeEntry{ + { + Key: []byte("key1"), + Value: []byte("value"), + }, + }, + NextKey: nil, + } + var ctx sdk.Context + specs := map[string]struct { + req *wasmvmtypes.WasmQuery + mock mockWasmQueryKeeper + expRes wasmvmtypes.RawRangeResponse + expErr bool + }{ + "all good": { + req: &wasmvmtypes.WasmQuery{ + RawRange: &wasmvmtypes.RawRangeQuery{ + ContractAddr: myValidContractAddr, + Start: []byte("key0"), + End: []byte("key2"), + Limit: 10, + Order: "ascending", + }, + }, + mock: mockWasmQueryKeeper{ + QueryRawRangeFn: func(ctx context.Context, contractAddress sdk.AccAddress, start, end []byte, limit uint16, reverse bool) (results []wasmvmtypes.RawRangeEntry, nextKey []byte) { + return validResponse.Data, validResponse.NextKey + }, + }, + expRes: validResponse, + }, + "all good - descending": { + req: &wasmvmtypes.WasmQuery{ + RawRange: &wasmvmtypes.RawRangeQuery{ + ContractAddr: myValidContractAddr, + Start: []byte("start"), + End: []byte("end"), + Limit: 10, + Order: "descending", + }, + }, + mock: mockWasmQueryKeeper{ + QueryRawRangeFn: func(ctx context.Context, contractAddress sdk.AccAddress, start, end []byte, limit uint16, reverse bool) (results []wasmvmtypes.RawRangeEntry, nextKey []byte) { + return []wasmvmtypes.RawRangeEntry{}, nil + }, + }, + expRes: wasmvmtypes.RawRangeResponse{ + Data: []wasmvmtypes.RawRangeEntry{}, + NextKey: nil, + }, + }, + "invalid addr": { + req: &wasmvmtypes.WasmQuery{ + RawRange: &wasmvmtypes.RawRangeQuery{ + ContractAddr: "not a valid addr", + Order: "ascending", + }, + }, + expErr: true, + }, + "invalid order": { + req: &wasmvmtypes.WasmQuery{ + RawRange: &wasmvmtypes.RawRangeQuery{ + ContractAddr: myValidContractAddr, + Order: "not a valid order", + }, + }, + expErr: true, + }, + } + + for name, spec := range specs { + t.Run(name, func(t *testing.T) { + q := keeper.WasmQuerier(spec.mock) + gotBz, gotErr := q(ctx, spec.req) + if spec.expErr { + require.Error(t, gotErr) + return + } + require.NoError(t, gotErr) + var gotRes wasmvmtypes.RawRangeResponse + require.NoError(t, json.Unmarshal(gotBz, &gotRes)) + assert.Equal(t, spec.expRes, gotRes) + }) + } + +} + func TestQueryErrors(t *testing.T) { specs := map[string]struct { src error From 8bf7d7260134c86cb5eb16a5b0e816953ca8d695 Mon Sep 17 00:00:00 2001 From: Christoph Otter Date: Mon, 19 May 2025 12:02:04 +0200 Subject: [PATCH 4/5] Fix naked return lint --- x/wasm/keeper/keeper.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/x/wasm/keeper/keeper.go b/x/wasm/keeper/keeper.go index e7e6d688d..1fe34688d 100644 --- a/x/wasm/keeper/keeper.go +++ b/x/wasm/keeper/keeper.go @@ -975,7 +975,7 @@ func (k Keeper) QueryRawRange(ctx context.Context, contractAddress sdk.AccAddres nextKey = nil } - return + return results, nextKey } // internal helper function From e1bc372751907ff73077e71bcb9bead263c11b9a Mon Sep 17 00:00:00 2001 From: "autofix-ci[bot]" <114827586+autofix-ci[bot]@users.noreply.github.com> Date: Mon, 23 Jun 2025 12:07:51 +0000 Subject: [PATCH 5/5] [autofix.ci] apply automated fixes --- x/wasm/keeper/keeper_test.go | 1 - x/wasm/keeper/query_plugins_test.go | 1 - 2 files changed, 2 deletions(-) diff --git a/x/wasm/keeper/keeper_test.go b/x/wasm/keeper/keeper_test.go index f2e27f918..3485b9861 100644 --- a/x/wasm/keeper/keeper_test.go +++ b/x/wasm/keeper/keeper_test.go @@ -3155,5 +3155,4 @@ func TestQueryRawRange(t *testing.T) { assert.Equal(t, expNextBz, next) }) } - } diff --git a/x/wasm/keeper/query_plugins_test.go b/x/wasm/keeper/query_plugins_test.go index 47d6d4b0d..f662a3cdc 100644 --- a/x/wasm/keeper/query_plugins_test.go +++ b/x/wasm/keeper/query_plugins_test.go @@ -676,7 +676,6 @@ func TestRawRangeWasmQuerier(t *testing.T) { assert.Equal(t, spec.expRes, gotRes) }) } - } func TestQueryErrors(t *testing.T) {