From 51683987bb840f1bc77fa0a5d9bb86171006743a Mon Sep 17 00:00:00 2001 From: zemyblue Date: Wed, 9 Feb 2022 18:06:21 +0900 Subject: [PATCH 1/4] fix: add `x/wasm` feature to `simapp` --- Dockerfile | 37 ++++++++++++++++---- Makefile | 48 +++++++++++++++++++++++++ server/export_test.go | 6 ++-- simapp/app.go | 70 ++++++++++++++++++++++++++++++++----- simapp/app_test.go | 12 +++---- simapp/sim_bench_test.go | 4 +-- simapp/sim_test.go | 12 +++---- simapp/simd/cmd/root.go | 12 +++++-- simapp/test_helpers.go | 2 +- testutil/network/network.go | 1 + x/crisis/handler_test.go | 2 +- x/gov/genesis_test.go | 2 +- x/upgrade/abci_test.go | 2 +- 13 files changed, 173 insertions(+), 37 deletions(-) diff --git a/Dockerfile b/Dockerfile index 72349483bc..02a50d0d30 100644 --- a/Dockerfile +++ b/Dockerfile @@ -11,28 +11,53 @@ # > docker run -it -p 26657:26657 -p 26656:26656 -v ~/.simappcli:/root/.simapp simapp simd keys list # TODO: demo connecting rest-server (or is this in server now?) FROM golang:alpine AS build-env +ARG LBM_BUILD_OPTIONS="" # Install minimum necessary dependencies, -ENV PACKAGES curl make git libc-dev bash gcc linux-headers eudev-dev python3 -RUN apk add --no-cache $PACKAGES +ENV PACKAGES curl wget make cmake git libc-dev bash gcc g++ linux-headers eudev-dev python3 perl +RUN apk add --update --no-cache $PACKAGES # Set working directory for the build WORKDIR /go/src/github.com/line/lbm-sdk +# prepare dbbackend before building; this can be cached +COPY ./Makefile ./ +COPY ./contrib ./contrib +RUN make dbbackend LBM_BUILD_OPTIONS="$LBM_BUILD_OPTIONS" + +# Install GO dependencies +COPY ./go.mod /go/src/github.com/line/lbm-sdk/go.mod +COPY ./go.sum /go/src/github.com/line/lbm-sdk/go.sum +RUN go mod download + +# Build cosmwasm +ENV RUSTUP_HOME=/usr/local/rustup +ENV CARGO_HOME=/usr/local/cargo +ENV PATH=$CARGO_HOME/bin:$PATH + +RUN wget "https://static.rust-lang.org/rustup/dist/x86_64-unknown-linux-musl/rustup-init" +RUN chmod +x rustup-init +RUN ./rustup-init -y --no-modify-path --default-toolchain 1.53.0; rm rustup-init +RUN chmod -R a+w $RUSTUP_HOME $CARGO_HOME +RUN cd $(go list -f "{{ .Dir }}" -m github.com/line/wasmvm) && \ + RUSTFLAGS='-C target-feature=-crt-static' cargo build --release --example staticlib && \ + mv -f target/release/examples/libstaticlib.a /usr/lib/libwasmvm_static.a && \ + rm -rf target + # Add source files COPY . . # install simapp, remove packages -RUN make build-linux - +RUN BUILD_TAGS=static make build CGO_ENABLED=1 LBM_BUILD_OPTIONS="$LBM_BUILD_OPTIONS" # Final image FROM alpine:edge -# Install ca-certificates -RUN apk add --update ca-certificates WORKDIR /root +# Set up OS dependencies +RUN apk add --update --no-cache libstdc++ ca-certificates + # Copy over binaries from the build-env COPY --from=build-env /go/src/github.com/line/lbm-sdk/build/simd /usr/bin/simd diff --git a/Makefile b/Makefile index 5b248255a7..98ec964c02 100644 --- a/Makefile +++ b/Makefile @@ -12,6 +12,7 @@ MOCKS_DIR = $(CURDIR)/tests/mocks HTTPS_GIT := https://github.com/line/lbm-sdk.git DOCKER := $(shell which docker) DOCKER_BUF := $(DOCKER) run --rm -v $(CURDIR):/workspace --workdir /workspace bufbuild/buf +CGO_ENABLED ?= 1 export GO111MODULE = on @@ -50,6 +51,9 @@ else CGO_ENABLED=1 BUILD_TAGS += gcc cleveldb DB_BACKEND = cleveldb + CLEVELDB_DIR = leveldb + CGO_CFLAGS=-I$(shell pwd)/$(CLEVELDB_DIR)/include + CGO_LDFLAGS="-L$(shell pwd)/$(CLEVELDB_DIR)/build -L$(shell pwd)/snappy/build -lleveldb -lm -lstdc++ -lsnappy" endif ifeq (badgerdb,$(findstring badgerdb,$(LBM_BUILD_OPTIONS))) BUILD_TAGS += badgerdb @@ -59,6 +63,9 @@ else CGO_ENABLED=1 BUILD_TAGS += gcc rocksdb DB_BACKEND = rocksdb + ROCKSDB_DIR=$(shell pwd)/rocksdb + CGO_CFLAGS=-I$(ROCKSDB_DIR)/include + CGO_LDFLAGS="-L$(ROCKSDB_DIR) -lrocksdb -lm -lstdc++ $(shell awk '/PLATFORM_LDFLAGS/ {sub("PLATFORM_LDFLAGS=", ""); print}' < $(ROCKSDB_DIR)/make_config.mk)" endif ifeq (boltdb,$(findstring boltdb,$(LBM_BUILD_OPTIONS))) BUILD_TAGS += boltdb @@ -113,6 +120,11 @@ include contrib/devtools/Makefile BUILD_TARGETS := build install build: BUILD_ARGS=-o $(BUILDDIR)/ + +build: go.sum $(BUILDDIR)/ dbbackend + CGO_CFLAGS=$(CGO_CFLAGS) CGO_LDFLAGS=$(CGO_LDFLAGS) CGO_ENABLED=$(CGO_ENABLED) go build -mod=readonly $(BUILD_FLAGS) $(BUILD_ARGS) ./... + +# todo: should be fix build-linux: GOOS=linux GOARCH=amd64 LEDGER_ENABLED=false $(MAKE) build @@ -122,6 +134,42 @@ $(BUILD_TARGETS): go.sum $(BUILDDIR)/ $(BUILDDIR)/: mkdir -p $(BUILDDIR)/ +.PHONY: dbbackend +# for more faster building use -j8; but it will be failed in docker building because of low memory +ifeq ($(DB_BACKEND), rocksdb) +dbbackend: + @if [ ! -e $(ROCKSDB_DIR) ]; then \ + sh ./contrib/get_rocksdb.sh; \ + fi + @if [ ! -e $(ROCKSDB_DIR)/librocksdb.a ]; then \ + cd $(ROCKSDB_DIR) && make -j2 static_lib; \ + fi + @if [ ! -e $(ROCKSDB_DIR)/libsnappy.a ]; then \ + cd $(ROCKSDB_DIR) && make libsnappy.a DEBUG_LEVEL=0; \ + fi +else ifeq ($(DB_BACKEND), cleveldb) +dbbackend: + @if [ ! -e $(CLEVELDB_DIR) ]; then \ + sh contrib/get_cleveldb.sh; \ + fi + @if [ ! -e $(CLEVELDB_DIR)/libcleveldb.a ]; then \ + cd $(CLEVELDB_DIR); \ + mkdir build; \ + cd build; \ + cmake -DCMAKE_BUILD_TYPE=Release -DBUILD_SHARED_LIBS=OFF -DLEVELDB_BUILD_TESTS=OFF -DLEVELDB_BUILD_BENCHMARKS=OFF ..; \ + make; \ + fi + @if [ ! -e snappy ]; then \ + sh contrib/get_snappy.sh; \ + cd snappy; \ + mkdir build && cd build; \ + cmake -DBUILD_SHARED_LIBS=OFF -DSNAPPY_BUILD_TESTS=OFF -DSNAPPY_REQUIRE_AVX2=ON ..;\ + make; \ + fi +else +dbbackend: +endif + build-simd-all: go.sum $(DOCKER) rm latest-build || true $(DOCKER) run --volume=$(CURDIR):/sources:ro \ diff --git a/server/export_test.go b/server/export_test.go index 70c5721906..5ac0c89113 100644 --- a/server/export_test.go +++ b/server/export_test.go @@ -131,7 +131,7 @@ func setupApp(t *testing.T, tempDir string) (*simapp.SimApp, context.Context, *o logger := log.NewOCLogger(log.NewSyncWriter(os.Stdout)) db := memdb.NewDB() encCfg := simapp.MakeTestEncodingConfig() - app := simapp.NewSimApp(logger, db, nil, true, map[int64]bool{}, tempDir, 0, encCfg, simapp.EmptyAppOptions{}) + app := simapp.NewSimApp(logger, db, nil, true, map[int64]bool{}, tempDir, 0, encCfg, simapp.EmptyAppOptions{}, nil) serverCtx := server.NewDefaultContext() serverCtx.Config.RootDir = tempDir @@ -155,13 +155,13 @@ func setupApp(t *testing.T, tempDir string) (*simapp.SimApp, context.Context, *o var simApp *simapp.SimApp if height != -1 { - simApp = simapp.NewSimApp(logger, db, nil, false, map[int64]bool{}, "", 0, encCfg, appOptons) + simApp = simapp.NewSimApp(logger, db, nil, false, map[int64]bool{}, "", 0, encCfg, appOptons, nil) if err := simApp.LoadHeight(height); err != nil { return types.ExportedApp{}, err } } else { - simApp = simapp.NewSimApp(logger, db, nil, true, map[int64]bool{}, "", 0, encCfg, appOptons) + simApp = simapp.NewSimApp(logger, db, nil, true, map[int64]bool{}, "", 0, encCfg, appOptons, nil) } return simApp.ExportAppStateAndValidators(forZeroHeight, jailAllowedAddrs) diff --git a/simapp/app.go b/simapp/app.go index bca0d2a526..f308b6fa44 100644 --- a/simapp/app.go +++ b/simapp/app.go @@ -1,6 +1,8 @@ package simapp import ( + "github.com/line/lbm-sdk/x/wasm" + wasmclient "github.com/line/lbm-sdk/x/wasm/client" "io" "net/http" "os" @@ -120,12 +122,15 @@ var ( distr.AppModuleBasic{}, consortium.AppModuleBasic{}, gov.NewAppModuleBasic( - consortiumclient.UpdateConsortiumParamsProposalHandler, - consortiumclient.UpdateValidatorAuthsProposalHandler, - paramsclient.ProposalHandler, - distrclient.ProposalHandler, - upgradeclient.ProposalHandler, - upgradeclient.CancelProposalHandler, + append( + wasmclient.ProposalHandlers, + consortiumclient.UpdateConsortiumParamsProposalHandler, + consortiumclient.UpdateValidatorAuthsProposalHandler, + paramsclient.ProposalHandler, + distrclient.ProposalHandler, + upgradeclient.ProposalHandler, + upgradeclient.CancelProposalHandler, + )..., ), params.AppModuleBasic{}, crisis.AppModuleBasic{}, @@ -136,6 +141,7 @@ var ( evidence.AppModuleBasic{}, transfer.AppModuleBasic{}, vesting.AppModuleBasic{}, + wasm.AppModuleBasic{}, ) // module account permissions @@ -192,11 +198,13 @@ type SimApp struct { EvidenceKeeper evidencekeeper.Keeper TransferKeeper ibctransferkeeper.Keeper FeeGrantKeeper feegrantkeeper.Keeper + WasmKeeper wasm.Keeper // make scoped keepers public for test purposes ScopedIBCKeeper capabilitykeeper.ScopedKeeper ScopedTransferKeeper capabilitykeeper.ScopedKeeper ScopedIBCMockKeeper capabilitykeeper.ScopedKeeper + ScopedWasmKeeper capabilitykeeper.ScopedKeeper // the module manager mm *module.Manager @@ -221,7 +229,7 @@ func init() { func NewSimApp( logger log.Logger, db tmdb.DB, traceStore io.Writer, loadLatest bool, skipUpgradeHeights map[int64]bool, homePath string, invCheckPeriod uint, encodingConfig simappparams.EncodingConfig, - appOpts servertypes.AppOptions, baseAppOptions ...func(*baseapp.BaseApp), + appOpts servertypes.AppOptions, wasmOpts []wasm.Option, baseAppOptions ...func(*baseapp.BaseApp), ) *SimApp { // TODO: Remove cdc in favor of appCodec once all modules are migrated. @@ -239,7 +247,7 @@ func NewSimApp( minttypes.StoreKey, distrtypes.StoreKey, slashingtypes.StoreKey, govtypes.StoreKey, paramstypes.StoreKey, ibchost.StoreKey, upgradetypes.StoreKey, evidencetypes.StoreKey, ibctransfertypes.StoreKey, capabilitytypes.StoreKey, - feegranttypes.StoreKey, consortiumtypes.StoreKey, + feegranttypes.StoreKey, consortiumtypes.StoreKey, wasm.StoreKey, ) memKeys := sdk.NewMemoryStoreKeys(capabilitytypes.MemStoreKey) @@ -262,6 +270,8 @@ func NewSimApp( app.CapabilityKeeper = capabilitykeeper.NewKeeper(appCodec, keys[capabilitytypes.StoreKey], memKeys[capabilitytypes.MemStoreKey]) scopedIBCKeeper := app.CapabilityKeeper.ScopeToModule(ibchost.ModuleName) scopedTransferKeeper := app.CapabilityKeeper.ScopeToModule(ibctransfertypes.ModuleName) + scopedWasmKeeper := app.CapabilityKeeper.ScopeToModule(wasm.ModuleName) + // NOTE: the IBC mock keeper and application module is used only for testing core IBC. Do // note replicate if you do not need to test core IBC or light clients. scopedIBCMockKeeper := app.CapabilityKeeper.ScopeToModule(ibcmock.ModuleName) @@ -305,6 +315,38 @@ func NewSimApp( appCodec, keys[ibchost.StoreKey], app.GetSubspace(ibchost.ModuleName), app.StakingKeeper, scopedIBCKeeper, ) + wasmDir := filepath.Join(homePath, "wasm") + wasmConfig, err := wasm.ReadWasmConfig(appOpts) + if err != nil { + panic("error while reading wasm config: " + err.Error()) + } + + // The last arguments can contain custom message handlers, and custom query handlers, + // if we want to allow any custom callbacks + supportedFeatures := "staking,stargate" + app.WasmKeeper = wasm.NewKeeper( + appCodec, + keys[wasm.StoreKey], + app.GetSubspace(wasm.ModuleName), + app.AccountKeeper, + app.BankKeeper, + app.StakingKeeper, + app.DistrKeeper, + app.IBCKeeper.ChannelKeeper, + &app.IBCKeeper.PortKeeper, + scopedWasmKeeper, + app.TransferKeeper, + app.Router(), + nil, + app.GRPCQueryRouter(), + wasmDir, + wasmConfig, + supportedFeatures, + nil, + nil, + wasmOpts..., + ) + // register the proposal types govRouter := govtypes.NewRouter() govRouter.AddRoute(govtypes.RouterKey, govtypes.ProposalHandler). @@ -334,6 +376,7 @@ func NewSimApp( ibcRouter := porttypes.NewRouter() ibcRouter.AddRoute(ibctransfertypes.ModuleName, transferModule) ibcRouter.AddRoute(ibcmock.ModuleName, mockModule) + ibcRouter.AddRoute(wasm.ModuleName, wasm.NewIBCHandler(app.WasmKeeper, app.IBCKeeper.ChannelKeeper)) app.IBCKeeper.SetRouter(ibcRouter) // create evidence keeper with router @@ -369,6 +412,7 @@ func NewSimApp( distr.NewAppModule(appCodec, app.DistrKeeper, app.AccountKeeper, app.BankKeeper, app.StakingKeeper), stakingplus.NewAppModule(appCodec, app.StakingKeeper, app.AccountKeeper, app.BankKeeper, app.ConsortiumKeeper), upgrade.NewAppModule(app.UpgradeKeeper), + wasm.NewAppModule(appCodec, &app.WasmKeeper, app.StakingKeeper), evidence.NewAppModule(app.EvidenceKeeper), ibc.NewAppModule(app.IBCKeeper), params.NewAppModule(app.ParamsKeeper), @@ -395,6 +439,8 @@ func NewSimApp( slashingtypes.ModuleName, govtypes.ModuleName, minttypes.ModuleName, crisistypes.ModuleName, ibchost.ModuleName, genutiltypes.ModuleName, evidencetypes.ModuleName, ibctransfertypes.ModuleName, feegranttypes.ModuleName, consortiumtypes.ModuleName, + // wasm after ibc transfer + wasm.ModuleName, ) app.mm.RegisterInvariants(&app.CrisisKeeper) @@ -420,6 +466,7 @@ func NewSimApp( distr.NewAppModule(appCodec, app.DistrKeeper, app.AccountKeeper, app.BankKeeper, app.StakingKeeper), slashing.NewAppModule(appCodec, app.SlashingKeeper, app.AccountKeeper, app.BankKeeper, app.StakingKeeper), params.NewAppModule(app.ParamsKeeper), + wasm.NewAppModule(appCodec, &app.WasmKeeper, app.StakingKeeper), evidence.NewAppModule(app.EvidenceKeeper), ibc.NewAppModule(app.IBCKeeper), transferModule, @@ -457,12 +504,18 @@ func NewSimApp( ctx := app.BaseApp.NewUncachedContext(true, ocproto.Header{}) app.CapabilityKeeper.InitializeAndSeal(ctx) + // Initialize pinned codes in wasmvm as they are not persisted there + if err := app.WasmKeeper.InitializePinnedCodes(ctx); err != nil { + panic(err) + } + // Initialize the keeper of bankkeeper app.BankKeeper.(bankpluskeeper.Keeper).InitializeBankPlus(ctx) } app.ScopedIBCKeeper = scopedIBCKeeper app.ScopedTransferKeeper = scopedTransferKeeper + app.ScopedWasmKeeper = scopedWasmKeeper // NOTE: the IBC mock keeper and application module is used only for testing core IBC. Do // note replicate if you do not need to test core IBC or light clients. @@ -664,6 +717,7 @@ func initParamsKeeper(appCodec codec.BinaryMarshaler, legacyAmino *codec.LegacyA paramsKeeper.Subspace(crisistypes.ModuleName) paramsKeeper.Subspace(ibctransfertypes.ModuleName) paramsKeeper.Subspace(ibchost.ModuleName) + paramsKeeper.Subspace(wasm.ModuleName) return paramsKeeper } diff --git a/simapp/app_test.go b/simapp/app_test.go index 489d0272cd..2132d1878b 100644 --- a/simapp/app_test.go +++ b/simapp/app_test.go @@ -21,12 +21,12 @@ import ( "github.com/line/lbm-sdk/x/auth/vesting" banktypes "github.com/line/lbm-sdk/x/bank/types" "github.com/line/lbm-sdk/x/capability" + "github.com/line/lbm-sdk/x/consortium" "github.com/line/lbm-sdk/x/crisis" "github.com/line/lbm-sdk/x/distribution" "github.com/line/lbm-sdk/x/evidence" "github.com/line/lbm-sdk/x/genutil" "github.com/line/lbm-sdk/x/gov" - "github.com/line/lbm-sdk/x/consortium" transfer "github.com/line/lbm-sdk/x/ibc/applications/transfer" ibc "github.com/line/lbm-sdk/x/ibc/core" "github.com/line/lbm-sdk/x/mint" @@ -39,7 +39,7 @@ import ( func TestSimAppExportAndBlockedAddrs(t *testing.T) { encCfg := MakeTestEncodingConfig() db := memdb.NewDB() - app := NewSimApp(log.NewOCLogger(log.NewSyncWriter(os.Stdout)), db, nil, true, map[int64]bool{}, DefaultNodeHome, 0, encCfg, EmptyAppOptions{}) + app := NewSimApp(log.NewOCLogger(log.NewSyncWriter(os.Stdout)), db, nil, true, map[int64]bool{}, DefaultNodeHome, 0, encCfg, EmptyAppOptions{}, nil) for acc := range maccPerms { ex, _ := allowedReceivingModAcc[acc] @@ -63,7 +63,7 @@ func TestSimAppExportAndBlockedAddrs(t *testing.T) { app.Commit() // Making a new app object with the db, so that initchain hasn't been called - app2 := NewSimApp(log.NewOCLogger(log.NewSyncWriter(os.Stdout)), db, nil, true, map[int64]bool{}, DefaultNodeHome, 0, encCfg, EmptyAppOptions{}) + app2 := NewSimApp(log.NewOCLogger(log.NewSyncWriter(os.Stdout)), db, nil, true, map[int64]bool{}, DefaultNodeHome, 0, encCfg, EmptyAppOptions{}, nil) _, err = app2.ExportAppStateAndValidators(false, []string{}) require.NoError(t, err, "ExportAppStateAndValidators should not have an error") } @@ -77,7 +77,7 @@ func TestRunMigrations(t *testing.T) { db := memdb.NewDB() encCfg := MakeTestEncodingConfig() logger := log.NewOCLogger(log.NewSyncWriter(os.Stdout)) - app := NewSimApp(logger, db, nil, true, map[int64]bool{}, DefaultNodeHome, 0, encCfg, EmptyAppOptions{}) + app := NewSimApp(logger, db, nil, true, map[int64]bool{}, DefaultNodeHome, 0, encCfg, EmptyAppOptions{}, nil) // Create a new baseapp and configurator for the purpose of this test. bApp := baseapp.NewBaseApp(appName, logger, db, encCfg.TxConfig.TxDecoder()) @@ -200,7 +200,7 @@ func TestInitGenesisOnMigration(t *testing.T) { db := memdb.NewDB() encCfg := MakeTestEncodingConfig() logger := log.NewOCLogger(log.NewSyncWriter(os.Stdout)) - app := NewSimApp(logger, db, nil, true, map[int64]bool{}, DefaultNodeHome, 0, encCfg, EmptyAppOptions{}) + app := NewSimApp(logger, db, nil, true, map[int64]bool{}, DefaultNodeHome, 0, encCfg, EmptyAppOptions{}, nil) ctx := app.NewContext(true, ocproto.Header{Height: app.LastBlockHeight()}) // Create a mock module. This module will serve as the new module we're @@ -246,7 +246,7 @@ func TestInitGenesisOnMigration(t *testing.T) { func TestUpgradeStateOnGenesis(t *testing.T) { encCfg := MakeTestEncodingConfig() db := memdb.NewDB() - app := NewSimApp(log.NewOCLogger(log.NewSyncWriter(os.Stdout)), db, nil, true, map[int64]bool{}, DefaultNodeHome, 0, encCfg, EmptyAppOptions{}) + app := NewSimApp(log.NewOCLogger(log.NewSyncWriter(os.Stdout)), db, nil, true, map[int64]bool{}, DefaultNodeHome, 0, encCfg, EmptyAppOptions{}, nil) genesisState := NewDefaultGenesisState(encCfg.Marshaler) stateBytes, err := json.MarshalIndent(genesisState, "", " ") require.NoError(t, err) diff --git a/simapp/sim_bench_test.go b/simapp/sim_bench_test.go index f8c345e637..1d08ee0a29 100644 --- a/simapp/sim_bench_test.go +++ b/simapp/sim_bench_test.go @@ -27,7 +27,7 @@ func BenchmarkFullAppSimulation(b *testing.B) { } }() - app := NewSimApp(logger, db, nil, true, map[int64]bool{}, DefaultNodeHome, FlagPeriodValue, MakeTestEncodingConfig(), EmptyAppOptions{}, interBlockCacheOpt()) + app := NewSimApp(logger, db, nil, true, map[int64]bool{}, DefaultNodeHome, FlagPeriodValue, MakeTestEncodingConfig(), EmptyAppOptions{}, nil, interBlockCacheOpt()) // run randomized simulation _, simParams, simErr := simulation.SimulateFromSeed( @@ -72,7 +72,7 @@ func BenchmarkInvariants(b *testing.B) { } }() - app := NewSimApp(logger, db, nil, true, map[int64]bool{}, DefaultNodeHome, FlagPeriodValue, MakeTestEncodingConfig(), EmptyAppOptions{}, interBlockCacheOpt()) + app := NewSimApp(logger, db, nil, true, map[int64]bool{}, DefaultNodeHome, FlagPeriodValue, MakeTestEncodingConfig(), EmptyAppOptions{}, nil, interBlockCacheOpt()) // run randomized simulation _, simParams, simErr := simulation.SimulateFromSeed( diff --git a/simapp/sim_test.go b/simapp/sim_test.go index 7b677778f0..a4d48a92b4 100644 --- a/simapp/sim_test.go +++ b/simapp/sim_test.go @@ -70,7 +70,7 @@ func TestFullAppSimulation(t *testing.T) { require.NoError(t, os.RemoveAll(dir)) }() - app := NewSimApp(logger, db, nil, true, map[int64]bool{}, DefaultNodeHome, FlagPeriodValue, MakeTestEncodingConfig(), EmptyAppOptions{}, fauxMerkleModeOpt) + app := NewSimApp(logger, db, nil, true, map[int64]bool{}, DefaultNodeHome, FlagPeriodValue, MakeTestEncodingConfig(), EmptyAppOptions{}, nil, fauxMerkleModeOpt) require.Equal(t, "SimApp", app.Name()) // run randomized simulation @@ -108,7 +108,7 @@ func TestAppImportExport(t *testing.T) { require.NoError(t, os.RemoveAll(dir)) }() - app := NewSimApp(logger, db, nil, true, map[int64]bool{}, DefaultNodeHome, FlagPeriodValue, MakeTestEncodingConfig(), EmptyAppOptions{}, fauxMerkleModeOpt) + app := NewSimApp(logger, db, nil, true, map[int64]bool{}, DefaultNodeHome, FlagPeriodValue, MakeTestEncodingConfig(), EmptyAppOptions{}, nil, fauxMerkleModeOpt) require.Equal(t, "SimApp", app.Name()) // Run randomized simulation @@ -148,7 +148,7 @@ func TestAppImportExport(t *testing.T) { require.NoError(t, os.RemoveAll(newDir)) }() - newApp := NewSimApp(log.NewNopLogger(), newDB, nil, true, map[int64]bool{}, DefaultNodeHome, FlagPeriodValue, MakeTestEncodingConfig(), EmptyAppOptions{}, fauxMerkleModeOpt) + newApp := NewSimApp(log.NewNopLogger(), newDB, nil, true, map[int64]bool{}, DefaultNodeHome, FlagPeriodValue, MakeTestEncodingConfig(), EmptyAppOptions{}, nil, fauxMerkleModeOpt) require.Equal(t, "SimApp", newApp.Name()) var genesisState GenesisState @@ -205,7 +205,7 @@ func TestAppSimulationAfterImport(t *testing.T) { require.NoError(t, os.RemoveAll(dir)) }() - app := NewSimApp(logger, db, nil, true, map[int64]bool{}, DefaultNodeHome, FlagPeriodValue, MakeTestEncodingConfig(), EmptyAppOptions{}, fauxMerkleModeOpt) + app := NewSimApp(logger, db, nil, true, map[int64]bool{}, DefaultNodeHome, FlagPeriodValue, MakeTestEncodingConfig(), EmptyAppOptions{}, nil, fauxMerkleModeOpt) require.Equal(t, "SimApp", app.Name()) // Run randomized simulation @@ -250,7 +250,7 @@ func TestAppSimulationAfterImport(t *testing.T) { require.NoError(t, os.RemoveAll(newDir)) }() - newApp := NewSimApp(log.NewNopLogger(), newDB, nil, true, map[int64]bool{}, DefaultNodeHome, FlagPeriodValue, MakeTestEncodingConfig(), EmptyAppOptions{}, fauxMerkleModeOpt) + newApp := NewSimApp(log.NewNopLogger(), newDB, nil, true, map[int64]bool{}, DefaultNodeHome, FlagPeriodValue, MakeTestEncodingConfig(), EmptyAppOptions{}, nil, fauxMerkleModeOpt) require.Equal(t, "SimApp", newApp.Name()) newApp.InitChain(abci.RequestInitChain{ @@ -302,7 +302,7 @@ func TestAppStateDeterminism(t *testing.T) { db := memdb.NewDB() app := NewSimApp(logger, db, nil, true, map[int64]bool{}, DefaultNodeHome, FlagPeriodValue, - MakeTestEncodingConfig(), EmptyAppOptions{}, interBlockCacheOpt()) + MakeTestEncodingConfig(), EmptyAppOptions{}, nil, interBlockCacheOpt()) fmt.Printf( "running non-determinism simulation; seed %d: %d/%d, attempt: %d/%d\n", diff --git a/simapp/simd/cmd/root.go b/simapp/simd/cmd/root.go index 2b5cb27ac5..8767b769e1 100644 --- a/simapp/simd/cmd/root.go +++ b/simapp/simd/cmd/root.go @@ -2,6 +2,9 @@ package cmd import ( "errors" + "github.com/line/lbm-sdk/x/wasm" + wasmkeeper "github.com/line/lbm-sdk/x/wasm/keeper" + "github.com/prometheus/client_golang/prometheus" "io" "os" "path/filepath" @@ -189,6 +192,10 @@ func (a appCreator) newApp(logger log.Logger, db tmdb.DB, traceStore io.Writer, if err != nil { panic(err) } + var wasmOpts []wasm.Option + if cast.ToBool(appOpts.Get("telemetry.enabled")) { + wasmOpts = append(wasmOpts, wasmkeeper.WithVMCacheMetrics(prometheus.DefaultRegisterer)) + } return simapp.NewSimApp( logger, db, traceStore, true, skipUpgradeHeights, @@ -196,6 +203,7 @@ func (a appCreator) newApp(logger log.Logger, db tmdb.DB, traceStore io.Writer, cast.ToUint(appOpts.Get(server.FlagInvCheckPeriod)), a.encCfg, appOpts, + wasmOpts, baseapp.SetPruning(pruningOpts), baseapp.SetMinGasPrices(cast.ToString(appOpts.Get(server.FlagMinGasPrices))), baseapp.SetHaltHeight(cast.ToUint64(appOpts.Get(server.FlagHaltHeight))), @@ -224,13 +232,13 @@ func (a appCreator) appExport( } if height != -1 { - simApp = simapp.NewSimApp(logger, db, traceStore, false, map[int64]bool{}, homePath, uint(1), a.encCfg, appOpts) + simApp = simapp.NewSimApp(logger, db, traceStore, false, map[int64]bool{}, homePath, uint(1), a.encCfg, appOpts, nil) if err := simApp.LoadHeight(height); err != nil { return servertypes.ExportedApp{}, err } } else { - simApp = simapp.NewSimApp(logger, db, traceStore, true, map[int64]bool{}, homePath, uint(1), a.encCfg, appOpts) + simApp = simapp.NewSimApp(logger, db, traceStore, true, map[int64]bool{}, homePath, uint(1), a.encCfg, appOpts, nil) } return simApp.ExportAppStateAndValidators(forZeroHeight, jailAllowedAddrs) diff --git a/simapp/test_helpers.go b/simapp/test_helpers.go index 76b137e1ff..4d759e4bb9 100644 --- a/simapp/test_helpers.go +++ b/simapp/test_helpers.go @@ -53,7 +53,7 @@ var DefaultConsensusParams = &abci.ConsensusParams{ func setup(withGenesis bool, invCheckPeriod uint) (*SimApp, GenesisState) { db := memdb.NewDB() encCdc := MakeTestEncodingConfig() - app := NewSimApp(log.NewNopLogger(), db, nil, true, map[int64]bool{}, DefaultNodeHome, invCheckPeriod, encCdc, EmptyAppOptions{}) + app := NewSimApp(log.NewNopLogger(), db, nil, true, map[int64]bool{}, DefaultNodeHome, invCheckPeriod, encCdc, EmptyAppOptions{}, nil) if withGenesis { return app, NewDefaultGenesisState(encCdc.Marshaler) } diff --git a/testutil/network/network.go b/testutil/network/network.go index 97e91870a6..304fa92ae9 100644 --- a/testutil/network/network.go +++ b/testutil/network/network.go @@ -60,6 +60,7 @@ func NewAppConstructor(encodingCfg params.EncodingConfig) AppConstructor { val.Ctx.Logger, memdb.NewDB(), nil, true, make(map[int64]bool), val.Ctx.Config.RootDir, 0, encodingCfg, simapp.EmptyAppOptions{}, + nil, baseapp.SetPruning(storetypes.NewPruningOptionsFromString(val.AppConfig.Pruning)), baseapp.SetMinGasPrices(val.AppConfig.MinGasPrices), ) diff --git a/x/crisis/handler_test.go b/x/crisis/handler_test.go index a66869e817..770cf248d7 100644 --- a/x/crisis/handler_test.go +++ b/x/crisis/handler_test.go @@ -27,7 +27,7 @@ var ( func createTestApp() (*simapp.SimApp, sdk.Context, []sdk.AccAddress) { db := memdb.NewDB() - app := simapp.NewSimApp(log.NewNopLogger(), db, nil, true, map[int64]bool{}, simapp.DefaultNodeHome, 1, simapp.MakeTestEncodingConfig(), simapp.EmptyAppOptions{}) + app := simapp.NewSimApp(log.NewNopLogger(), db, nil, true, map[int64]bool{}, simapp.DefaultNodeHome, 1, simapp.MakeTestEncodingConfig(), simapp.EmptyAppOptions{}, nil) ctx := app.NewContext(true, ocproto.Header{}) constantFee := sdk.NewInt64Coin(sdk.DefaultBondDenom, 10) diff --git a/x/gov/genesis_test.go b/x/gov/genesis_test.go index 33fd90dfd7..68db4bfbe4 100644 --- a/x/gov/genesis_test.go +++ b/x/gov/genesis_test.go @@ -68,7 +68,7 @@ func TestImportExportQueues(t *testing.T) { } db := memdb.NewDB() - app2 := simapp.NewSimApp(log.NewNopLogger(), db, nil, true, map[int64]bool{}, simapp.DefaultNodeHome, 0, simapp.MakeTestEncodingConfig(), simapp.EmptyAppOptions{}) + app2 := simapp.NewSimApp(log.NewNopLogger(), db, nil, true, map[int64]bool{}, simapp.DefaultNodeHome, 0, simapp.MakeTestEncodingConfig(), simapp.EmptyAppOptions{}, nil) app2.InitChain( abci.RequestInitChain{ diff --git a/x/upgrade/abci_test.go b/x/upgrade/abci_test.go index 6eb6845c05..f76f9164bf 100644 --- a/x/upgrade/abci_test.go +++ b/x/upgrade/abci_test.go @@ -40,7 +40,7 @@ var s TestSuite func setupTest(height int64, skip map[int64]bool) TestSuite { db := memdb.NewDB() - app := simapp.NewSimApp(log.NewNopLogger(), db, nil, true, skip, simapp.DefaultNodeHome, 0, simapp.MakeTestEncodingConfig(), simapp.EmptyAppOptions{}) + app := simapp.NewSimApp(log.NewNopLogger(), db, nil, true, skip, simapp.DefaultNodeHome, 0, simapp.MakeTestEncodingConfig(), simapp.EmptyAppOptions{}, nil) genesisState := simapp.NewDefaultGenesisState(app.AppCodec()) stateBytes, err := json.MarshalIndent(genesisState, "", " ") if err != nil { From 23ecfa42bb770a6d66d61fe4f26da8348027e7fe Mon Sep 17 00:00:00 2001 From: zemyblue Date: Wed, 9 Feb 2022 22:05:36 +0900 Subject: [PATCH 2/4] chore: fix lint warning, fix `make lint` to use specific version. --- CHANGELOG.md | 1 + Makefile | 13 ++++++++----- simapp/app.go | 4 ++-- simapp/simd/cmd/root.go | 7 ++++--- 4 files changed, 15 insertions(+), 10 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index a43d03ded3..e45cfe433b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,7 @@ ### Improvements ### Bug Fixes +* (simapp) [\#430](https://github.com/line/lbm-sdk/pull/430) add x/wasm feature to simapp ### Breaking Changes diff --git a/Makefile b/Makefile index 98ec964c02..181a69292f 100644 --- a/Makefile +++ b/Makefile @@ -120,10 +120,11 @@ include contrib/devtools/Makefile BUILD_TARGETS := build install build: BUILD_ARGS=-o $(BUILDDIR)/ - -build: go.sum $(BUILDDIR)/ dbbackend CGO_CFLAGS=$(CGO_CFLAGS) CGO_LDFLAGS=$(CGO_LDFLAGS) CGO_ENABLED=$(CGO_ENABLED) go build -mod=readonly $(BUILD_FLAGS) $(BUILD_ARGS) ./... +#build: go.sum $(BUILDDIR)/ dbbackend +# CGO_CFLAGS=$(CGO_CFLAGS) CGO_LDFLAGS=$(CGO_LDFLAGS) CGO_ENABLED=$(CGO_ENABLED) go build -mod=readonly $(BUILD_FLAGS) $(BUILD_ARGS) ./... + # todo: should be fix build-linux: GOOS=linux GOARCH=amd64 LEDGER_ENABLED=false $(MAKE) build @@ -409,11 +410,13 @@ benchmark: ############################################################################### lint: golangci-lint - golangci-lint run --out-format=tab - find . -name '*.go' -type f -not -path "*.git*" | xargs gofmt -d -s + @golangci-lint run --out-format=tab + find . -name '*.go' -type f -not -path "./vendor*" -not -path "*.git*" -not -path "*_test.go" | xargs gofmt -d -s golangci-lint: - @go get github.com/golangci/golangci-lint/cmd/golangci-lint +ifneq (,$(shell which golangci-lint>/dev/null)) + @go install github.com/golangci/golangci-lint/cmd/golangci-lint@v1.28.0 +endif lint-fix: golangci-lint run --fix --out-format=tab --issues-exit-code=0 diff --git a/simapp/app.go b/simapp/app.go index f308b6fa44..b3521449a0 100644 --- a/simapp/app.go +++ b/simapp/app.go @@ -1,8 +1,6 @@ package simapp import ( - "github.com/line/lbm-sdk/x/wasm" - wasmclient "github.com/line/lbm-sdk/x/wasm/client" "io" "net/http" "os" @@ -98,6 +96,8 @@ import ( upgradeclient "github.com/line/lbm-sdk/x/upgrade/client" upgradekeeper "github.com/line/lbm-sdk/x/upgrade/keeper" upgradetypes "github.com/line/lbm-sdk/x/upgrade/types" + "github.com/line/lbm-sdk/x/wasm" + wasmclient "github.com/line/lbm-sdk/x/wasm/client" // unnamed import of statik for swagger UI support _ "github.com/line/lbm-sdk/client/docs/statik" diff --git a/simapp/simd/cmd/root.go b/simapp/simd/cmd/root.go index 8767b769e1..4479b62617 100644 --- a/simapp/simd/cmd/root.go +++ b/simapp/simd/cmd/root.go @@ -2,9 +2,7 @@ package cmd import ( "errors" - "github.com/line/lbm-sdk/x/wasm" - wasmkeeper "github.com/line/lbm-sdk/x/wasm/keeper" - "github.com/prometheus/client_golang/prometheus" + "io" "os" "path/filepath" @@ -12,6 +10,7 @@ import ( ostcli "github.com/line/ostracon/libs/cli" "github.com/line/ostracon/libs/log" tmdb "github.com/line/tm-db/v2" + "github.com/prometheus/client_golang/prometheus" "github.com/spf13/cast" "github.com/spf13/cobra" "github.com/spf13/viper" @@ -36,6 +35,8 @@ import ( banktypes "github.com/line/lbm-sdk/x/bank/types" "github.com/line/lbm-sdk/x/crisis" genutilcli "github.com/line/lbm-sdk/x/genutil/client/cli" + "github.com/line/lbm-sdk/x/wasm" + wasmkeeper "github.com/line/lbm-sdk/x/wasm/keeper" ) // NewRootCmd creates a new root command for simd. It is called once in the From ae5c0023fb9248e20e387fee7f3031b5ac44056e Mon Sep 17 00:00:00 2001 From: zemyblue Date: Wed, 16 Feb 2022 19:05:37 +0900 Subject: [PATCH 3/4] chore: fix build fail because NewSimApp parameter is changed. --- go.mod | 1 - go.sum | 4 ++-- x/capability/genesis_test.go | 2 +- 3 files changed, 3 insertions(+), 4 deletions(-) diff --git a/go.mod b/go.mod index 6e60cef27b..2518b3e9e5 100644 --- a/go.mod +++ b/go.mod @@ -35,7 +35,6 @@ require ( github.com/magiconair/properties v1.8.5 github.com/mailru/easyjson v0.7.7 github.com/mattn/go-isatty v0.0.14 - github.com/onsi/ginkgo v1.16.4 // indirect github.com/pkg/errors v0.9.1 github.com/prometheus/client_golang v1.12.1 github.com/prometheus/common v0.32.1 diff --git a/go.sum b/go.sum index cd7a908ab3..179628ae88 100644 --- a/go.sum +++ b/go.sum @@ -588,9 +588,8 @@ github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+W github.com/onsi/ginkgo v1.7.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk= github.com/onsi/ginkgo v1.14.0/go.mod h1:iSB4RoI2tjJc9BBv4NKIKWKya62Rps+oPG/Lv9klQyY= +github.com/onsi/ginkgo v1.16.2 h1:HFB2fbVIlhIfCfOW81bZFbiC/RvnpXSdhbF2/DJr134= github.com/onsi/ginkgo v1.16.2/go.mod h1:CObGmKUOKaSC0RjmoAK7tKyn4Azo5P2IWuoMnvwxz1E= -github.com/onsi/ginkgo v1.16.4 h1:29JGrr5oVBm5ulCWet69zQkzWipVXIol6ygQUe/EzNc= -github.com/onsi/ginkgo v1.16.4/go.mod h1:dX+/inL/fNMqNlz0e9LfyB9TswhZpCVdJM/Z6Vvnwo0= github.com/onsi/gomega v1.4.1/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA= github.com/onsi/gomega v1.4.3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY= @@ -1171,6 +1170,7 @@ gonum.org/v1/gonum v0.0.0-20180816165407-929014505bf4/go.mod h1:Y+Yx5eoAFn32cQvJ gonum.org/v1/gonum v0.8.2/go.mod h1:oe/vMfY3deqTw+1EZJhuvEW2iwGF1bW9wwu7XCu0+v0= gonum.org/v1/gonum v0.9.3 h1:DnoIG+QAMaF5NvxnGe/oKsgKcAc6PcUyl8q0VetfQ8s= gonum.org/v1/gonum v0.9.3/go.mod h1:TZumC3NeyVQskjXqmyWt4S3bINhy7B4eYwW69EbyX+0= +gonum.org/v1/netlib v0.0.0-20190313105609-8cb42192e0e0 h1:OE9mWmgKkjJyEmDAAtGMPjXu+YNeGvK9VTSHY6+Qihc= gonum.org/v1/netlib v0.0.0-20190313105609-8cb42192e0e0/go.mod h1:wa6Ws7BG/ESfp6dHfk7C6KdzKA7wR7u/rKwOGE66zvw= gonum.org/v1/plot v0.0.0-20190515093506-e2840ee46a6b/go.mod h1:Wt8AAjI+ypCyYX3nZBvf6cAIx93T+c/OS2HFAYskSZc= gonum.org/v1/plot v0.9.0/go.mod h1:3Pcqqmp6RHvJI72kgb8fThyUnav364FOsdDo2aGW5lY= diff --git a/x/capability/genesis_test.go b/x/capability/genesis_test.go index f953b60521..a6a87b9a9e 100644 --- a/x/capability/genesis_test.go +++ b/x/capability/genesis_test.go @@ -35,7 +35,7 @@ func (suite *CapabilityTestSuite) TestGenesis() { // and initialize app from exported genesis state above. db := memdb.NewDB() encCdc := simapp.MakeTestEncodingConfig() - newApp := simapp.NewSimApp(log.NewNopLogger(), db, nil, true, map[int64]bool{}, simapp.DefaultNodeHome, 5, encCdc, simapp.EmptyAppOptions{}) + newApp := simapp.NewSimApp(log.NewNopLogger(), db, nil, true, map[int64]bool{}, simapp.DefaultNodeHome, 5, encCdc, simapp.EmptyAppOptions{}, nil) newKeeper := keeper.NewKeeper(suite.cdc, newApp.GetKey(types.StoreKey), newApp.GetMemKey(types.MemStoreKey)) newSk1 := newKeeper.ScopeToModule(banktypes.ModuleName) From 57b270b2079ea0e9afd0108a043cc70eec8d2922 Mon Sep 17 00:00:00 2001 From: zemyblue Date: Fri, 4 Mar 2022 23:10:42 +0900 Subject: [PATCH 4/4] build: change the wasmvm directory for static build --- Dockerfile | 1 + 1 file changed, 1 insertion(+) diff --git a/Dockerfile b/Dockerfile index 02a50d0d30..21b56e40e4 100644 --- a/Dockerfile +++ b/Dockerfile @@ -40,6 +40,7 @@ RUN chmod +x rustup-init RUN ./rustup-init -y --no-modify-path --default-toolchain 1.53.0; rm rustup-init RUN chmod -R a+w $RUSTUP_HOME $CARGO_HOME RUN cd $(go list -f "{{ .Dir }}" -m github.com/line/wasmvm) && \ + cd ./libwasmvm && \ RUSTFLAGS='-C target-feature=-crt-static' cargo build --release --example staticlib && \ mv -f target/release/examples/libstaticlib.a /usr/lib/libwasmvm_static.a && \ rm -rf target