From 464e3d7f657d38260aef3226fd30ab08af015998 Mon Sep 17 00:00:00 2001 From: Yongwoo Lee Date: Thu, 29 Apr 2021 19:37:26 +0900 Subject: [PATCH 1/2] refactor: remove tm-db dependency - remove legacy_store - remove rm-db dependency --- go.mod | 4 +- go.sum | 14 +++--- store/prefix/legacy_store.go | 80 -------------------------------- x/wasm/internal/keeper/keeper.go | 48 ++++++++++--------- x/wasm/internal/keeper/relay.go | 18 ++++--- x/wasm/internal/types/store.go | 30 ++++++++++++ 6 files changed, 78 insertions(+), 116 deletions(-) delete mode 100644 store/prefix/legacy_store.go create mode 100644 x/wasm/internal/types/store.go diff --git a/go.mod b/go.mod index 73b480708d..75bd623b33 100644 --- a/go.mod +++ b/go.mod @@ -51,7 +51,6 @@ require ( github.com/tendermint/btcd v0.1.1 github.com/tendermint/crypto v0.0.0-20191022145703-50d29ede1e15 github.com/tendermint/go-amino v0.16.0 - github.com/tendermint/tm-db v0.6.4 golang.org/x/crypto v0.0.0-20210220033148-5ea612d1eb83 golang.org/x/net v0.0.0-20210226172049-e18ecbb05110 // indirect golang.org/x/sys v0.0.0-20210228012217-479acdf4ea46 // indirect @@ -63,8 +62,7 @@ require ( ) replace ( - github.com/CosmWasm/wasmvm => github.com/line/wasmvm v0.14.0-0.3.0 + github.com/CosmWasm/wasmvm => github.com/line/wasmvm v0.12.1-0.20210430083214-14f8d67fd14f github.com/gogo/protobuf => github.com/regen-network/protobuf v1.3.3-alpha.regen.1 - github.com/tendermint/tm-db => github.com/line/tm-db v0.5.2 google.golang.org/grpc => google.golang.org/grpc v1.33.2 ) diff --git a/go.sum b/go.sum index 6ab35a7417..b867d16743 100644 --- a/go.sum +++ b/go.sum @@ -120,6 +120,7 @@ github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSs github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/decred/dcrd/lru v1.0.0/go.mod h1:mxKOwFd7lFjN2GZYsiz/ecgqR6kkYAl+0pz0tEMk218= +github.com/dgraph-io/badger/v2 v2.2007.1/go.mod h1:26P/7fbL4kUZVEVKLAKXkBXKOydDmM2p1e+NhhnBCAE= github.com/dgraph-io/badger/v2 v2.2007.2 h1:EjjK0KqwaFMlPin1ajhP943VPENHJdEz1KLIegjaI3k= github.com/dgraph-io/badger/v2 v2.2007.2/go.mod h1:26P/7fbL4kUZVEVKLAKXkBXKOydDmM2p1e+NhhnBCAE= github.com/dgraph-io/ristretto v0.0.3-0.20200630154024-f66de99634de h1:t0UHb5vdojIDUqktM6+xJAfScFBsVpXZmqC9dsgJmeA= @@ -337,13 +338,11 @@ github.com/line/ostracon v0.34.9-0.20210315041958-2a1f43c788f5/go.mod h1:1THU+kF github.com/line/ostracon v0.34.9-0.20210419031811-5254cabf172e/go.mod h1:w/itWXCU8Wttz/2Ftp+yJz0UXv9gX6qT1dASn+3kX5M= github.com/line/ostracon v0.34.9-0.20210429084710-ef4fe0a40c7d h1:/6vnjrk3SpCUUiIDBv8UzbYexabZBYXxkwyc3Bp9hPo= github.com/line/ostracon v0.34.9-0.20210429084710-ef4fe0a40c7d/go.mod h1:ttnbq+yQJMQ9a2MT5SEisOoa/+pOgh2KenTiK/rVdiw= -github.com/line/tm-db v0.5.2 h1:P8kMpcrm9Xyfl6QLyafssNIoIeC01k0fhw2zDvKhtl4= -github.com/line/tm-db v0.5.2/go.mod h1:VrPTx04QJhQ9d8TFUTc2GpPBvBf/U9vIdBIzkjBk7Lk= github.com/line/tm-db/v2 v2.0.0-init.1.0.20210406062110-9424ca70955a/go.mod h1:wmkyPabXjtVZ1dvRofmurjaceghywtCSYGqFuFS+TbI= github.com/line/tm-db/v2 v2.0.0-init.1.0.20210413083915-5bb60e117524 h1:eKXXnUm1SblC0AIXAMNDaSyvIbQ50yXqFbh9+Q8Kjvg= github.com/line/tm-db/v2 v2.0.0-init.1.0.20210413083915-5bb60e117524/go.mod h1:wmkyPabXjtVZ1dvRofmurjaceghywtCSYGqFuFS+TbI= -github.com/line/wasmvm v0.14.0-0.3.0 h1:T2caIGAOyj1FB3g3h0RqVy99XL7P0caEh0XnQoLa5i0= -github.com/line/wasmvm v0.14.0-0.3.0/go.mod h1:Id107qllDJyJjVQQsKMOy2YYF98sqPJ2t+jX1QES40A= +github.com/line/wasmvm v0.12.1-0.20210430083214-14f8d67fd14f h1:373f43K2wEWlLYUBIVkrZcs4LpR+zDu1sdG39fdTCsk= +github.com/line/wasmvm v0.12.1-0.20210430083214-14f8d67fd14f/go.mod h1:iCSHAV56VCjsrPFcLywh32bdha88AH/imzTTn/8Xuao= github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= github.com/magiconair/properties v1.8.1/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= github.com/magiconair/properties v1.8.4 h1:8KGKTcQQGm0Kv7vEbKFErAoAOFyyacLStRtQSeYtvkY= @@ -545,7 +544,6 @@ github.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoH github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= -github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.0 h1:nwc3DEeHmmLAfoZucVR881uASk0Mfjw8xYJ99tb5CcY= github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= @@ -566,6 +564,11 @@ github.com/tendermint/tendermint v0.34.0-rc4/go.mod h1:yotsojf2C1QBOw4dZrTcxbyxm github.com/tendermint/tendermint v0.34.0-rc6/go.mod h1:ugzyZO5foutZImv0Iyx/gOFCX6mjJTgbLHTwi17VDVg= github.com/tendermint/tendermint v0.34.0/go.mod h1:Aj3PIipBFSNO21r+Lq3TtzQ+uKESxkbA3yo/INM4QwQ= github.com/tendermint/tendermint v0.34.7/go.mod h1:JVuu3V1ZexOaZG8VJMRl8lnfrGw6hEB2TVnoUwKRbss= +github.com/tendermint/tm-db v0.6.0/go.mod h1:xj3AWJ08kBDlCHKijnhJ7mTcDMOikT1r8Poxy2pJn7Q= +github.com/tendermint/tm-db v0.6.2/go.mod h1:GYtQ67SUvATOcoY8/+x6ylk8Qo02BQyLrAs+yAcLvGI= +github.com/tendermint/tm-db v0.6.3/go.mod h1:lfA1dL9/Y/Y8wwyPp2NMLyn5P5Ptr/gvDFNWtrCWSf8= +github.com/tendermint/tm-db v0.6.4 h1:3N2jlnYQkXNQclQwd/eKV/NzlqPlfK21cpRRIx80XXQ= +github.com/tendermint/tm-db v0.6.4/go.mod h1:dptYhIpJ2M5kUuenLr+Yyf3zQOv1SgBZcl8/BmWlMBw= github.com/tmc/grpc-websocket-proxy v0.0.0-20170815181823-89b8d40f7ca8/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= github.com/tv42/httpunix v0.0.0-20150427012821-b75d8614f926/go.mod h1:9ESjWnEqriFuLhtthL60Sar/7RFoluCcXsuvEwTV5KM= @@ -581,7 +584,6 @@ github.com/zondax/hid v0.9.0 h1:eiT3P6vNxAEVxXMw66eZUAAnU2zD33JBkfG/EnfAKl8= github.com/zondax/hid v0.9.0/go.mod h1:l5wttcP0jwtdLjqjMMWFVEE7d1zO0jvSPA9OPZxWpEM= go.etcd.io/bbolt v1.3.2/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= go.etcd.io/bbolt v1.3.3/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= -go.etcd.io/bbolt v1.3.4/go.mod h1:G5EMThwa9y8QZGBClrRx5EY+Yw9kAhnjy3bSjsnlVTQ= go.etcd.io/bbolt v1.3.5 h1:XAzx9gjCb0Rxj7EoqcClPD1d5ZBxZJk0jbuoPHenBt0= go.etcd.io/bbolt v1.3.5/go.mod h1:G5EMThwa9y8QZGBClrRx5EY+Yw9kAhnjy3bSjsnlVTQ= go.etcd.io/etcd v0.0.0-20191023171146-3cf2f69b5738/go.mod h1:dnLIgRNXwCJa5e+c6mIZCrds/GIG4ncV9HhK5PX7jPg= diff --git a/store/prefix/legacy_store.go b/store/prefix/legacy_store.go deleted file mode 100644 index 616cb1b3ec..0000000000 --- a/store/prefix/legacy_store.go +++ /dev/null @@ -1,80 +0,0 @@ -package prefix - -import ( - "bytes" - - "github.com/line/lbm-sdk/v2/store/types" - tmdb "github.com/tendermint/tm-db" -) - -// LegacyStore is an implementation to pass the store -// to the wasmvm for tendermint/tm-db dependency. -// line/tm-db/v2 has a modification to the Iterator interface, occurred a type mismatch. -// Do not use it for any purpose other than passing it to wasmvm in x/wasm. -type LegacyStore struct { - Store -} - -func NewLegacyStore(parent types.KVStore, prefix []byte) LegacyStore { - return LegacyStore{ - Store{ - parent: parent, - prefix: prefix, - }, - } -} - -func (s LegacyStore) Iterator(start, end []byte) tmdb.Iterator { - newstart := cloneAppend(s.prefix, start) - - var newend []byte - if end == nil { - newend = cpIncr(s.prefix) - } else { - newend = cloneAppend(s.prefix, end) - } - - iter := s.parent.Iterator(newstart, newend) - - return newLegacyPrefixIterator(s.prefix, start, end, iter) -} - -func (s LegacyStore) ReverseIterator(start, end []byte) tmdb.Iterator { - newstart := cloneAppend(s.prefix, start) - - var newend []byte - if end == nil { - newend = cpIncr(s.prefix) - } else { - newend = cloneAppend(s.prefix, end) - } - - iter := s.parent.ReverseIterator(newstart, newend) - - return newLegacyPrefixIterator(s.prefix, start, end, iter) -} - -func (s LegacyStore) SdkIterator(start, end []byte) types.Iterator { - return s.Store.Iterator(start, end) -} - -type legacyPrefixIterator struct { - prefixIterator -} - -func newLegacyPrefixIterator(prefix, start, end []byte, parent types.Iterator) *legacyPrefixIterator { - return &legacyPrefixIterator{ - prefixIterator{ - prefix: prefix, - start: start, - end: end, - iter: parent, - valid: parent.Valid() && bytes.HasPrefix(parent.Key(), prefix), - }, - } -} - -// Implements Iterator -func (pi *legacyPrefixIterator) Close() { - pi.iter.Close() -} diff --git a/x/wasm/internal/keeper/keeper.go b/x/wasm/internal/keeper/keeper.go index 442ef4e050..fb8dceff68 100644 --- a/x/wasm/internal/keeper/keeper.go +++ b/x/wasm/internal/keeper/keeper.go @@ -270,14 +270,15 @@ func (k Keeper) instantiate(ctx sdk.Context, codeID uint64, creator, admin sdk.A // create prefixed data store // 0x03 | contractAddress (sdk.AccAddress) prefixStoreKey := types.GetContractStorePrefix(contractAddress) - prefixStore := prefix.NewLegacyStore(ctx.KVStore(k.storeKey), prefixStoreKey) + prefixStore := prefix.NewStore(ctx.KVStore(k.storeKey), prefixStoreKey) + wasmStore := types.NewWasmStore(prefixStore) // prepare querier querier := NewQueryHandler(ctx, k.queryPlugins, contractAddress, k.getGasMultiplier(ctx)) // instantiate wasm contract gas := gasForContract(ctx, k.getGasMultiplier(ctx)) - res, gasUsed, err := k.wasmer.Instantiate(codeInfo.CodeHash, env, info, initMsg, prefixStore, k.cosmwasmAPI(ctx), querier, k.gasMeter(ctx), gas) + res, gasUsed, err := k.wasmer.Instantiate(codeInfo.CodeHash, env, info, initMsg, wasmStore, k.cosmwasmAPI(ctx), querier, k.gasMeter(ctx), gas) k.consumeGas(ctx, gasUsed) if err != nil { return contractAddress, nil, sdkerrors.Wrap(types.ErrInstantiateFailed, err.Error()) @@ -342,7 +343,8 @@ func (k Keeper) Execute(ctx sdk.Context, contractAddress sdk.AccAddress, caller // prepare querier querier := NewQueryHandler(ctx, k.queryPlugins, contractAddress, k.getGasMultiplier(ctx)) gas := gasForContract(ctx, k.getGasMultiplier(ctx)) - res, gasUsed, execErr := k.wasmer.Execute(codeInfo.CodeHash, env, info, msg, prefixStore, k.cosmwasmAPI(ctx), querier, k.gasMeter(ctx), gas) + wasmStore := types.NewWasmStore(prefixStore) + res, gasUsed, execErr := k.wasmer.Execute(codeInfo.CodeHash, env, info, msg, wasmStore, k.cosmwasmAPI(ctx), querier, k.gasMeter(ctx), gas) k.consumeGas(ctx, gasUsed) if execErr != nil { return nil, sdkerrors.Wrap(types.ErrExecuteFailed, execErr.Error()) @@ -408,9 +410,10 @@ func (k Keeper) migrate(ctx sdk.Context, contractAddress sdk.AccAddress, caller querier := NewQueryHandler(ctx, k.queryPlugins, contractAddress, k.getGasMultiplier(ctx)) prefixStoreKey := types.GetContractStorePrefix(contractAddress) - prefixStore := prefix.NewLegacyStore(ctx.KVStore(k.storeKey), prefixStoreKey) + prefixStore := prefix.NewStore(ctx.KVStore(k.storeKey), prefixStoreKey) + wasmStore := types.NewWasmStore(prefixStore) gas := gasForContract(ctx, k.getGasMultiplier(ctx)) - res, gasUsed, err := k.wasmer.Migrate(newCodeInfo.CodeHash, env, msg, &prefixStore, k.cosmwasmAPI(ctx), &querier, k.gasMeter(ctx), gas) + res, gasUsed, err := k.wasmer.Migrate(newCodeInfo.CodeHash, env, msg, &wasmStore, k.cosmwasmAPI(ctx), &querier, k.gasMeter(ctx), gas) k.consumeGas(ctx, gasUsed) if err != nil { return nil, sdkerrors.Wrap(types.ErrMigrationFailed, err.Error()) @@ -456,7 +459,8 @@ func (k Keeper) Sudo(ctx sdk.Context, contractAddress sdk.AccAddress, msg []byte // prepare querier querier := NewQueryHandler(ctx, k.queryPlugins, contractAddress, k.getGasMultiplier(ctx)) gas := gasForContract(ctx, k.getGasMultiplier(ctx)) - res, gasUsed, execErr := k.wasmer.Sudo(codeInfo.CodeHash, env, msg, prefixStore, k.cosmwasmAPI(ctx), querier, k.gasMeter(ctx), gas) + wasmStore := types.NewWasmStore(prefixStore) + res, gasUsed, execErr := k.wasmer.Sudo(codeInfo.CodeHash, env, msg, wasmStore, k.cosmwasmAPI(ctx), querier, k.gasMeter(ctx), gas) k.consumeGas(ctx, gasUsed) if execErr != nil { return nil, sdkerrors.Wrap(types.ErrExecuteFailed, execErr.Error()) @@ -499,7 +503,8 @@ func (k Keeper) reply(ctx sdk.Context, contractAddress sdk.AccAddress, reply was GasMultiplier: k.getGasMultiplier(ctx), } gas := gasForContract(ctx, k.getGasMultiplier(ctx)) - res, gasUsed, execErr := k.wasmer.Reply(codeInfo.CodeHash, env, reply, prefixStore, k.cosmwasmAPI(ctx), querier, k.gasMeter(ctx), gas) + wasmStore := types.NewWasmStore(prefixStore) + res, gasUsed, execErr := k.wasmer.Reply(codeInfo.CodeHash, env, reply, wasmStore, k.cosmwasmAPI(ctx), querier, k.gasMeter(ctx), gas) k.consumeGas(ctx, gasUsed) if execErr != nil { return nil, sdkerrors.Wrap(types.ErrExecuteFailed, execErr.Error()) @@ -551,7 +556,7 @@ func (k Keeper) appendToContractHistory(ctx sdk.Context, contractAddr sdk.AccAdd store := ctx.KVStore(k.storeKey) // find last element position var pos uint64 - prefixStore := prefix.NewLegacyStore(store, types.GetContractCodeHistoryElementPrefix(contractAddr)) + prefixStore := prefix.NewStore(store, types.GetContractCodeHistoryElementPrefix(contractAddr)) if iter := prefixStore.ReverseIterator(nil, nil); iter.Valid() { pos = sdk.BigEndianToUint64(iter.Value()) } @@ -564,7 +569,7 @@ func (k Keeper) appendToContractHistory(ctx sdk.Context, contractAddr sdk.AccAdd } func (k Keeper) GetContractHistory(ctx sdk.Context, contractAddr sdk.AccAddress) []types.ContractCodeHistoryEntry { - prefixStore := prefix.NewLegacyStore(ctx.KVStore(k.storeKey), types.GetContractCodeHistoryElementPrefix(contractAddr)) + prefixStore := prefix.NewStore(ctx.KVStore(k.storeKey), types.GetContractCodeHistoryElementPrefix(contractAddr)) r := make([]types.ContractCodeHistoryEntry, 0) iter := prefixStore.Iterator(nil, nil) for ; iter.Valid(); iter.Next() { @@ -589,7 +594,8 @@ func (k Keeper) QuerySmart(ctx sdk.Context, contractAddr sdk.AccAddress, req []b querier := NewQueryHandler(ctx, k.queryPlugins, contractAddr, k.getGasMultiplier(ctx)) env := types.NewEnv(ctx, contractAddr) - queryResult, gasUsed, qErr := k.wasmer.Query(codeInfo.CodeHash, env, req, prefixStore, k.cosmwasmAPI(ctx), querier, k.gasMeter(ctx), gasForContract(ctx, k.getGasMultiplier(ctx))) + wasmStore := types.NewWasmStore(prefixStore) + queryResult, gasUsed, qErr := k.wasmer.Query(codeInfo.CodeHash, env, req, wasmStore, k.cosmwasmAPI(ctx), querier, k.gasMeter(ctx), gasForContract(ctx, k.getGasMultiplier(ctx))) k.consumeGas(ctx, gasUsed) if qErr != nil { return nil, sdkerrors.Wrap(types.ErrQueryFailed, qErr.Error()) @@ -603,28 +609,28 @@ func (k Keeper) QueryRaw(ctx sdk.Context, contractAddress sdk.AccAddress, key [] return nil } prefixStoreKey := types.GetContractStorePrefix(contractAddress) - prefixStore := prefix.NewLegacyStore(ctx.KVStore(k.storeKey), prefixStoreKey) + prefixStore := prefix.NewStore(ctx.KVStore(k.storeKey), prefixStoreKey) return prefixStore.Get(key) } -func (k Keeper) contractInstance(ctx sdk.Context, contractAddress sdk.AccAddress) (types.ContractInfo, types.CodeInfo, prefix.LegacyStore, error) { +func (k Keeper) contractInstance(ctx sdk.Context, contractAddress sdk.AccAddress) (types.ContractInfo, types.CodeInfo, prefix.Store, error) { store := ctx.KVStore(k.storeKey) contractBz := store.Get(types.GetContractAddressKey(contractAddress)) if contractBz == nil { - return types.ContractInfo{}, types.CodeInfo{}, prefix.LegacyStore{}, sdkerrors.Wrap(types.ErrNotFound, "contract") + return types.ContractInfo{}, types.CodeInfo{}, prefix.Store{}, sdkerrors.Wrap(types.ErrNotFound, "contract") } var contractInfo types.ContractInfo k.cdc.MustUnmarshalBinaryBare(contractBz, &contractInfo) codeInfoBz := store.Get(types.GetCodeKey(contractInfo.CodeID)) if codeInfoBz == nil { - return contractInfo, types.CodeInfo{}, prefix.LegacyStore{}, sdkerrors.Wrap(types.ErrNotFound, "code info") + return contractInfo, types.CodeInfo{}, prefix.Store{}, sdkerrors.Wrap(types.ErrNotFound, "code info") } var codeInfo types.CodeInfo k.cdc.MustUnmarshalBinaryBare(codeInfoBz, &codeInfo) prefixStoreKey := types.GetContractStorePrefix(contractAddress) - prefixStore := prefix.NewLegacyStore(ctx.KVStore(k.storeKey), prefixStoreKey) + prefixStore := prefix.NewStore(ctx.KVStore(k.storeKey), prefixStoreKey) return contractInfo, codeInfo, prefixStore, nil } @@ -651,7 +657,7 @@ func (k Keeper) storeContractInfo(ctx sdk.Context, contractAddress sdk.AccAddres } func (k Keeper) IterateContractInfo(ctx sdk.Context, cb func(sdk.AccAddress, types.ContractInfo) bool) { - prefixStore := prefix.NewLegacyStore(ctx.KVStore(k.storeKey), types.ContractKeyPrefix) + prefixStore := prefix.NewStore(ctx.KVStore(k.storeKey), types.ContractKeyPrefix) iter := prefixStore.Iterator(nil, nil) for ; iter.Valid(); iter.Next() { var contract types.ContractInfo @@ -665,13 +671,13 @@ func (k Keeper) IterateContractInfo(ctx sdk.Context, cb func(sdk.AccAddress, typ func (k Keeper) GetContractState(ctx sdk.Context, contractAddress sdk.AccAddress) sdk.Iterator { prefixStoreKey := types.GetContractStorePrefix(contractAddress) - prefixStore := prefix.NewLegacyStore(ctx.KVStore(k.storeKey), prefixStoreKey) - return prefixStore.SdkIterator(nil, nil) + prefixStore := prefix.NewStore(ctx.KVStore(k.storeKey), prefixStoreKey) + return prefixStore.Iterator(nil, nil) } func (k Keeper) importContractState(ctx sdk.Context, contractAddress sdk.AccAddress, models []types.Model) error { prefixStoreKey := types.GetContractStorePrefix(contractAddress) - prefixStore := prefix.NewLegacyStore(ctx.KVStore(k.storeKey), prefixStoreKey) + prefixStore := prefix.NewStore(ctx.KVStore(k.storeKey), prefixStoreKey) for _, model := range models { if model.Value == nil { model.Value = []byte{} @@ -701,7 +707,7 @@ func (k Keeper) containsCodeInfo(ctx sdk.Context, codeID uint64) bool { } func (k Keeper) IterateCodeInfos(ctx sdk.Context, cb func(uint64, types.CodeInfo) bool) { - prefixStore := prefix.NewLegacyStore(ctx.KVStore(k.storeKey), types.CodeKeyPrefix) + prefixStore := prefix.NewStore(ctx.KVStore(k.storeKey), types.CodeKeyPrefix) iter := prefixStore.Iterator(nil, nil) for ; iter.Valid(); iter.Next() { var c types.CodeInfo @@ -763,7 +769,7 @@ func (k Keeper) IsPinnedCode(ctx sdk.Context, codeID uint64) bool { // InitializePinnedCodes updates wasmvm to pin to cache all contracts marked as pinned func (k Keeper) InitializePinnedCodes(ctx sdk.Context) error { - store := prefix.NewLegacyStore(ctx.KVStore(k.storeKey), types.PinnedCodeIndexPrefix) + store := prefix.NewStore(ctx.KVStore(k.storeKey), types.PinnedCodeIndexPrefix) iter := store.Iterator(nil, nil) for ; iter.Valid(); iter.Next() { codeInfo := k.GetCodeInfo(ctx, types.ParsePinnedCodeIndex(iter.Value())) diff --git a/x/wasm/internal/keeper/relay.go b/x/wasm/internal/keeper/relay.go index 56b45d925b..292027943f 100644 --- a/x/wasm/internal/keeper/relay.go +++ b/x/wasm/internal/keeper/relay.go @@ -26,7 +26,8 @@ func (k Keeper) OnOpenChannel( querier := NewQueryHandler(ctx, k.queryPlugins, contractAddr, k.getGasMultiplier(ctx)) gas := gasForContract(ctx, k.getGasMultiplier(ctx)) - gasUsed, execErr := k.wasmer.IBCChannelOpen(codeInfo.CodeHash, env, channel, prefixStore, k.cosmwasmAPI(ctx), querier, ctx.GasMeter(), gas) + wasmStore := types.NewWasmStore(prefixStore) + gasUsed, execErr := k.wasmer.IBCChannelOpen(codeInfo.CodeHash, env, channel, wasmStore, k.cosmwasmAPI(ctx), querier, ctx.GasMeter(), gas) k.consumeGas(ctx, gasUsed) if execErr != nil { return sdkerrors.Wrap(types.ErrExecuteFailed, execErr.Error()) @@ -56,7 +57,8 @@ func (k Keeper) OnConnectChannel( querier := NewQueryHandler(ctx, k.queryPlugins, contractAddr, k.getGasMultiplier(ctx)) gas := gasForContract(ctx, k.getGasMultiplier(ctx)) - res, gasUsed, execErr := k.wasmer.IBCChannelConnect(codeInfo.CodeHash, env, channel, prefixStore, k.cosmwasmAPI(ctx), querier, ctx.GasMeter(), gas) + wasmStore := types.NewWasmStore(prefixStore) + res, gasUsed, execErr := k.wasmer.IBCChannelConnect(codeInfo.CodeHash, env, channel, wasmStore, k.cosmwasmAPI(ctx), querier, ctx.GasMeter(), gas) k.consumeGas(ctx, gasUsed) if execErr != nil { return sdkerrors.Wrap(types.ErrExecuteFailed, execErr.Error()) @@ -92,7 +94,8 @@ func (k Keeper) OnCloseChannel( querier := NewQueryHandler(ctx, k.queryPlugins, contractAddr, k.getGasMultiplier(ctx)) gas := gasForContract(ctx, k.getGasMultiplier(ctx)) - res, gasUsed, execErr := k.wasmer.IBCChannelClose(codeInfo.CodeHash, params, channel, prefixStore, k.cosmwasmAPI(ctx), querier, ctx.GasMeter(), gas) + wasmStore := types.NewWasmStore(prefixStore) + res, gasUsed, execErr := k.wasmer.IBCChannelClose(codeInfo.CodeHash, params, channel, wasmStore, k.cosmwasmAPI(ctx), querier, ctx.GasMeter(), gas) k.consumeGas(ctx, gasUsed) if execErr != nil { return sdkerrors.Wrap(types.ErrExecuteFailed, execErr.Error()) @@ -128,7 +131,8 @@ func (k Keeper) OnRecvPacket( querier := NewQueryHandler(ctx, k.queryPlugins, contractAddr, k.getGasMultiplier(ctx)) gas := gasForContract(ctx, k.getGasMultiplier(ctx)) - res, gasUsed, execErr := k.wasmer.IBCPacketReceive(codeInfo.CodeHash, env, packet, prefixStore, k.cosmwasmAPI(ctx), querier, ctx.GasMeter(), gas) + wasmStore := types.NewWasmStore(prefixStore) + res, gasUsed, execErr := k.wasmer.IBCPacketReceive(codeInfo.CodeHash, env, packet, wasmStore, k.cosmwasmAPI(ctx), querier, ctx.GasMeter(), gas) k.consumeGas(ctx, gasUsed) if execErr != nil { return nil, sdkerrors.Wrap(types.ErrExecuteFailed, execErr.Error()) @@ -165,7 +169,8 @@ func (k Keeper) OnAckPacket( querier := NewQueryHandler(ctx, k.queryPlugins, contractAddr, k.getGasMultiplier(ctx)) gas := gasForContract(ctx, k.getGasMultiplier(ctx)) - res, gasUsed, execErr := k.wasmer.IBCPacketAck(codeInfo.CodeHash, env, acknowledgement, prefixStore, k.cosmwasmAPI(ctx), querier, ctx.GasMeter(), gas) + wasmStore := types.NewWasmStore(prefixStore) + res, gasUsed, execErr := k.wasmer.IBCPacketAck(codeInfo.CodeHash, env, acknowledgement, wasmStore, k.cosmwasmAPI(ctx), querier, ctx.GasMeter(), gas) k.consumeGas(ctx, gasUsed) if execErr != nil { return sdkerrors.Wrap(types.ErrExecuteFailed, execErr.Error()) @@ -198,7 +203,8 @@ func (k Keeper) OnTimeoutPacket( querier := NewQueryHandler(ctx, k.queryPlugins, contractAddr, k.getGasMultiplier(ctx)) gas := gasForContract(ctx, k.getGasMultiplier(ctx)) - res, gasUsed, execErr := k.wasmer.IBCPacketTimeout(codeInfo.CodeHash, env, packet, prefixStore, k.cosmwasmAPI(ctx), querier, ctx.GasMeter(), gas) + wasmStore := types.NewWasmStore(prefixStore) + res, gasUsed, execErr := k.wasmer.IBCPacketTimeout(codeInfo.CodeHash, env, packet, wasmStore, k.cosmwasmAPI(ctx), querier, ctx.GasMeter(), gas) k.consumeGas(ctx, gasUsed) if execErr != nil { return sdkerrors.Wrap(types.ErrExecuteFailed, execErr.Error()) diff --git a/x/wasm/internal/types/store.go b/x/wasm/internal/types/store.go new file mode 100644 index 0000000000..784001262e --- /dev/null +++ b/x/wasm/internal/types/store.go @@ -0,0 +1,30 @@ +package types + +import ( + wasmvm "github.com/CosmWasm/wasmvm" + storetypes "github.com/line/lbm-sdk/v2/store/types" +) + +var _ wasmvm.KVStore = (*WasmStore)(nil) + +// WasmStore is a wrapper struct of `KVStore` +// It translates from cosmos KVStore to wasmvm-defined KVStore. +// The spec of interface `Iterator` is a bit different so we cannot use cosmos KVStore directly. +type WasmStore struct { + storetypes.KVStore +} + +// Iterator re-define for wasmvm's `Iterator` +func (s WasmStore) Iterator(start, end []byte) wasmvm.Iterator { + return s.KVStore.Iterator(start, end) +} + +// ReverseIterator re-define for wasmvm's `Iterator` +func (s WasmStore) ReverseIterator(start, end []byte) wasmvm.Iterator { + return s.KVStore.ReverseIterator(start, end) +} + +// NewWasmStore creates a instance of WasmStore +func NewWasmStore(kvStore storetypes.KVStore) WasmStore { + return WasmStore{kvStore} +} From da3f26dca3f422510b9eecdcb6e65f8bbdca0254 Mon Sep 17 00:00:00 2001 From: Yongwoo Lee Date: Mon, 3 May 2021 17:42:37 +0900 Subject: [PATCH 2/2] bump up wasmvm@v0.14.0-0.4.0 --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index 85fd844b46..ab09fb5bf3 100644 --- a/go.mod +++ b/go.mod @@ -62,7 +62,7 @@ require ( ) replace ( - github.com/CosmWasm/wasmvm => github.com/line/wasmvm v0.12.1-0.20210430083214-14f8d67fd14f + github.com/CosmWasm/wasmvm => github.com/line/wasmvm v0.14.0-0.4.0 github.com/gogo/protobuf => github.com/regen-network/protobuf v1.3.3-alpha.regen.1 google.golang.org/grpc => google.golang.org/grpc v1.33.2 ) diff --git a/go.sum b/go.sum index 6021868646..ed1707666c 100644 --- a/go.sum +++ b/go.sum @@ -330,8 +330,8 @@ github.com/line/ostracon v0.34.9-0.20210429084710-ef4fe0a40c7d h1:/6vnjrk3SpCUUi github.com/line/ostracon v0.34.9-0.20210429084710-ef4fe0a40c7d/go.mod h1:ttnbq+yQJMQ9a2MT5SEisOoa/+pOgh2KenTiK/rVdiw= github.com/line/tm-db/v2 v2.0.0-init.1.0.20210413083915-5bb60e117524 h1:eKXXnUm1SblC0AIXAMNDaSyvIbQ50yXqFbh9+Q8Kjvg= github.com/line/tm-db/v2 v2.0.0-init.1.0.20210413083915-5bb60e117524/go.mod h1:wmkyPabXjtVZ1dvRofmurjaceghywtCSYGqFuFS+TbI= -github.com/line/wasmvm v0.12.1-0.20210430083214-14f8d67fd14f h1:373f43K2wEWlLYUBIVkrZcs4LpR+zDu1sdG39fdTCsk= -github.com/line/wasmvm v0.12.1-0.20210430083214-14f8d67fd14f/go.mod h1:iCSHAV56VCjsrPFcLywh32bdha88AH/imzTTn/8Xuao= +github.com/line/wasmvm v0.14.0-0.4.0 h1:XvJZ0HO7xNtQ/+IEjF2WtK93PC1e+dT0McomCwRTZnQ= +github.com/line/wasmvm v0.14.0-0.4.0/go.mod h1:iCSHAV56VCjsrPFcLywh32bdha88AH/imzTTn/8Xuao= github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= github.com/magiconair/properties v1.8.1/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= github.com/magiconair/properties v1.8.4 h1:8KGKTcQQGm0Kv7vEbKFErAoAOFyyacLStRtQSeYtvkY=