Skip to content

Commit b43df5a

Browse files
authored
Merge pull request #3740 from Agoric/mfig-3739-simulated-txes
fix(cosmos): ensure simulated transactions can't trigger SwingSet
2 parents cf569cc + 997329a commit b43df5a

16 files changed

+53
-147
lines changed

golang/cosmos/app/app.go

+7-2
Original file line numberDiff line numberDiff line change
@@ -358,7 +358,12 @@ func NewAgoricApp(
358358
)
359359

360360
// This function is tricky to get right, so we build it ourselves.
361-
callToController := func(ctx sdk.Context, str string) (string, error) {
361+
callToController := func(ctx sdk.Context, str, simReturn string) (string, error) {
362+
if vm.IsSimulation(ctx) {
363+
// Just return the simReturn, since the message is being simulated.
364+
return simReturn, nil
365+
}
366+
// We use SwingSet-level metering to charge the user for the call.
362367
app.MustInitController(ctx)
363368
defer vm.SetControllerContext(ctx)()
364369
return sendToController(true, str)
@@ -565,7 +570,7 @@ func (app *GaiaApp) MustInitController(ctx sdk.Context) {
565570
}
566571
bz, err := json.Marshal(action)
567572
if err == nil {
568-
_, err = app.SwingSetKeeper.CallToController(ctx, string(bz))
573+
_, err = app.SwingSetKeeper.CallToController(ctx, string(bz), "")
569574
}
570575
if err != nil {
571576
fmt.Fprintln(os.Stderr, "Cannot initialize Controller", err)

golang/cosmos/vm/controller.go

+2
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,8 @@ var nameToPort = make(map[string]int)
2525
var lastPort = 0
2626

2727
func SetControllerContext(ctx sdk.Context) func() {
28+
// We are only called by the controller, so we assume that it is billing its
29+
// own meter usage.
2830
controllerContext.Context = ctx.WithGasMeter(sdk.NewInfiniteGasMeter())
2931
return func() {
3032
controllerContext.Context = sdk.Context{}

golang/cosmos/x/swingset/abci.go

+3-3
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@ func BeginBlock(ctx sdk.Context, req abci.RequestBeginBlock, keeper Keeper) erro
4949
return sdkerrors.Wrap(sdkerrors.ErrJSONMarshal, err.Error())
5050
}
5151

52-
_, err = keeper.CallToController(ctx, string(b))
52+
_, err = keeper.CallToController(ctx, string(b), "")
5353

5454
// fmt.Fprintln(os.Stderr, "Returned from SwingSet", out, err)
5555
return err
@@ -71,7 +71,7 @@ func EndBlock(ctx sdk.Context, req abci.RequestEndBlock, keeper Keeper) ([]abci.
7171
return nil, sdkerrors.Wrap(sdkerrors.ErrJSONMarshal, err.Error())
7272
}
7373

74-
_, err = keeper.CallToController(ctx, string(b))
74+
_, err = keeper.CallToController(ctx, string(b), "")
7575

7676
// fmt.Fprintln(os.Stderr, "Returned from SwingSet", out, err)
7777
if err != nil {
@@ -102,7 +102,7 @@ func CommitBlock(keeper Keeper) error {
102102
return sdkerrors.Wrap(sdkerrors.ErrJSONMarshal, err.Error())
103103
}
104104

105-
_, err = keeper.CallToController(sdk.Context{}, string(b))
105+
_, err = keeper.CallToController(sdk.Context{}, string(b), "")
106106

107107
// fmt.Fprintln(os.Stderr, "Returned from SwingSet", out, err)
108108
if err != nil {

golang/cosmos/x/swingset/genesis.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@ func InitGenesis(ctx sdk.Context, keeper Keeper, data *types.GenesisState) []abc
5353
panic(err)
5454
}
5555

56-
_, err = keeper.CallToController(ctx, string(b))
56+
_, err = keeper.CallToController(ctx, string(b), "")
5757

5858
if err != nil {
5959
// NOTE: A failed BOOTSTRAP_BLOCK means that the SwingSet state is inconsistent.

golang/cosmos/x/swingset/handler.go

-9
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@ import (
55
"fmt"
66
"strings"
77

8-
"github.com/Agoric/agoric-sdk/golang/cosmos/vm"
98
"github.com/Agoric/agoric-sdk/golang/cosmos/x/swingset/keeper"
109

1110
sdk "github.com/cosmos/cosmos-sdk/types"
@@ -17,14 +16,6 @@ func NewHandler(k Keeper) sdk.Handler {
1716
msgServer := keeper.NewMsgServerImpl(k)
1817

1918
return func(ctx sdk.Context, msg sdk.Msg) (*sdk.Result, error) {
20-
if vm.IsSimulation(ctx) {
21-
// We don't support simulation.
22-
return &sdk.Result{}, nil
23-
} else {
24-
// The simulation was done, so now allow infinite gas.
25-
ctx = ctx.WithGasMeter(sdk.NewInfiniteGasMeter())
26-
}
27-
2819
ctx = ctx.WithEventManager(sdk.NewEventManager())
2920

3021
switch msg := msg.(type) {

golang/cosmos/x/swingset/keeper/keeper.go

+2-2
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ type Keeper struct {
2626
bankKeeper bankkeeper.Keeper
2727

2828
// CallToController dispatches a message to the controlling process
29-
CallToController func(ctx sdk.Context, str string) (string, error)
29+
CallToController func(ctx sdk.Context, str, simReturn string) (string, error)
3030
}
3131

3232
// A prefix of bytes, since KVStores can't handle empty slices as keys.
@@ -48,7 +48,7 @@ func stringToKey(keyStr string) []byte {
4848
func NewKeeper(
4949
cdc codec.Codec, key sdk.StoreKey,
5050
accountKeeper authkeeper.AccountKeeper, bankKeeper bankkeeper.Keeper,
51-
callToController func(ctx sdk.Context, str string) (string, error),
51+
callToController func(ctx sdk.Context, str, simReturn string) (string, error),
5252
) Keeper {
5353

5454
return Keeper{

golang/cosmos/x/swingset/keeper/msg_server.go

+2-2
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,7 @@ func (keeper msgServer) DeliverInbound(goCtx context.Context, msg *types.MsgDeli
5858
return nil, sdkerrors.Wrap(sdkerrors.ErrJSONMarshal, err.Error())
5959
}
6060

61-
_, err = keeper.CallToController(ctx, string(b))
61+
_, err = keeper.CallToController(ctx, string(b), "")
6262
// fmt.Fprintln(os.Stderr, "Returned from SwingSet", out, err)
6363
if err != nil {
6464
return nil, err
@@ -104,7 +104,7 @@ func (keeper msgServer) Provision(goCtx context.Context, msg *types.MsgProvision
104104
return nil, err
105105
}
106106

107-
_, err = keeper.CallToController(ctx, string(b))
107+
_, err = keeper.CallToController(ctx, string(b), "")
108108
// fmt.Fprintln(os.Stderr, "Returned from SwingSet", out, err)
109109
if err != nil {
110110
return nil, err

golang/cosmos/x/swingset/storage.go

+11-11
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ func NewStorageHandler(keeper Keeper) storageHandler {
2323
return storageHandler{keeper: keeper}
2424
}
2525

26-
func (sh storageHandler) Receive(ctx *vm.ControllerContext, str string) (ret string, err error) {
26+
func (sh storageHandler) Receive(cctx *vm.ControllerContext, str string) (ret string, err error) {
2727
keeper := sh.keeper
2828
msg := new(storageMessage)
2929
err = json.Unmarshal([]byte(str), &msg)
@@ -38,7 +38,7 @@ func (sh storageHandler) Receive(ctx *vm.ControllerContext, str string) (ret str
3838
case sdk.ErrorOutOfGas:
3939
err = fmt.Errorf(
4040
"out of gas in location: %v; gasUsed: %d",
41-
rType.Descriptor, ctx.Context.GasMeter().GasConsumed(),
41+
rType.Descriptor, cctx.Context.GasMeter().GasConsumed(),
4242
)
4343
default:
4444
// Not ErrorOutOfGas, so panic again.
@@ -53,11 +53,11 @@ func (sh storageHandler) Receive(ctx *vm.ControllerContext, str string) (ret str
5353
storage := NewStorage()
5454
storage.Value = msg.Value
5555
//fmt.Printf("giving Keeper.SetStorage(%s) %s\n", msg.Key, storage.Value)
56-
keeper.SetStorage(ctx.Context, msg.Key, storage)
56+
keeper.SetStorage(cctx.Context, msg.Key, storage)
5757
return "true", nil
5858

5959
case "get":
60-
storage := keeper.GetStorage(ctx.Context, msg.Key)
60+
storage := keeper.GetStorage(cctx.Context, msg.Key)
6161
if storage.Value == "" {
6262
return "null", nil
6363
}
@@ -69,14 +69,14 @@ func (sh storageHandler) Receive(ctx *vm.ControllerContext, str string) (ret str
6969
return string(s), nil
7070

7171
case "has":
72-
storage := keeper.GetStorage(ctx.Context, msg.Key)
72+
storage := keeper.GetStorage(cctx.Context, msg.Key)
7373
if storage.Value == "" {
7474
return "false", nil
7575
}
7676
return "true", nil
7777

7878
case "keys":
79-
keys := keeper.GetKeys(ctx.Context, msg.Key)
79+
keys := keeper.GetKeys(cctx.Context, msg.Key)
8080
if keys.Keys == nil {
8181
return "[]", nil
8282
}
@@ -87,12 +87,12 @@ func (sh storageHandler) Receive(ctx *vm.ControllerContext, str string) (ret str
8787
return string(bytes), nil
8888

8989
case "entries":
90-
keys := keeper.GetKeys(ctx.Context, msg.Key)
90+
keys := keeper.GetKeys(cctx.Context, msg.Key)
9191
ents := make([][]string, len(keys.Keys))
9292
for i, key := range keys.Keys {
9393
ents[i] = make([]string, 2)
9494
ents[i][0] = key
95-
storage := keeper.GetStorage(ctx.Context, fmt.Sprintf("%s.%s", msg.Key, key))
95+
storage := keeper.GetStorage(cctx.Context, fmt.Sprintf("%s.%s", msg.Key, key))
9696
ents[i][1] = storage.Value
9797
}
9898
bytes, err := json.Marshal(ents)
@@ -102,10 +102,10 @@ func (sh storageHandler) Receive(ctx *vm.ControllerContext, str string) (ret str
102102
return string(bytes), nil
103103

104104
case "values":
105-
keys := keeper.GetKeys(ctx.Context, msg.Key)
105+
keys := keeper.GetKeys(cctx.Context, msg.Key)
106106
vals := make([]string, len(keys.Keys))
107107
for i, key := range keys.Keys {
108-
storage := keeper.GetStorage(ctx.Context, fmt.Sprintf("%s.%s", msg.Key, key))
108+
storage := keeper.GetStorage(cctx.Context, fmt.Sprintf("%s.%s", msg.Key, key))
109109
vals[i] = storage.Value
110110
}
111111
bytes, err := json.Marshal(vals)
@@ -115,7 +115,7 @@ func (sh storageHandler) Receive(ctx *vm.ControllerContext, str string) (ret str
115115
return string(bytes), nil
116116

117117
case "size":
118-
keys := keeper.GetKeys(ctx.Context, msg.Key)
118+
keys := keeper.GetKeys(cctx.Context, msg.Key)
119119
if keys.Keys == nil {
120120
return "0", nil
121121
}

golang/cosmos/x/vbank/handler.go

-9
Original file line numberDiff line numberDiff line change
@@ -3,22 +3,13 @@ package vbank
33
import (
44
"fmt"
55

6-
"github.com/Agoric/agoric-sdk/golang/cosmos/vm"
76
sdk "github.com/cosmos/cosmos-sdk/types"
87
sdkerrors "github.com/cosmos/cosmos-sdk/types/errors"
98
)
109

1110
// NewHandler returns a handler for "vbank" type messages.
1211
func NewHandler(keeper Keeper) sdk.Handler {
1312
return func(ctx sdk.Context, msg sdk.Msg) (*sdk.Result, error) {
14-
if vm.IsSimulation(ctx) {
15-
// We don't support simulation.
16-
return &sdk.Result{}, nil
17-
} else {
18-
// The simulation was done, so now allow infinite gas.
19-
ctx = ctx.WithGasMeter(sdk.NewInfiniteGasMeter())
20-
}
21-
2213
switch msg := msg.(type) {
2314
default:
2415
errMsg := fmt.Sprintf("Unrecognized vbank Msg type: %T", msg)

golang/cosmos/x/vbank/keeper/keeper.go

+2-2
Original file line numberDiff line numberDiff line change
@@ -20,15 +20,15 @@ type Keeper struct {
2020
bankKeeper types.BankKeeper
2121
feeCollectorName string
2222
// CallToController dispatches a message to the controlling process
23-
CallToController func(ctx sdk.Context, str string) (string, error)
23+
CallToController func(ctx sdk.Context, str, simReturn string) (string, error)
2424
}
2525

2626
// NewKeeper creates a new vbank Keeper instance
2727
func NewKeeper(
2828
cdc codec.Codec, key sdk.StoreKey, paramSpace paramtypes.Subspace,
2929
bankKeeper types.BankKeeper,
3030
feeCollectorName string,
31-
callToController func(ctx sdk.Context, str string) (string, error),
31+
callToController func(ctx sdk.Context, str, simReturn string) (string, error),
3232
) Keeper {
3333

3434
// set KeyTable if it has not already been set

golang/cosmos/x/vbank/module.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -192,7 +192,7 @@ func (am AppModule) EndBlock(ctx sdk.Context, req abci.RequestEndBlock) []abci.V
192192
panic(err)
193193
}
194194
if bz != nil {
195-
_, err := am.CallToController(ctx, string(bz))
195+
_, err := am.CallToController(ctx, string(bz), "")
196196
if err != nil {
197197
panic(err)
198198
}

golang/cosmos/x/vbank/vbank.go

+2-2
Original file line numberDiff line numberDiff line change
@@ -227,9 +227,9 @@ func (ch portHandler) Receive(ctx *vm.ControllerContext, str string) (ret string
227227
return
228228
}
229229

230-
func (am AppModule) CallToController(ctx sdk.Context, send string) (string, error) {
230+
func (am AppModule) CallToController(ctx sdk.Context, send, simReturn string) (string, error) {
231231
// fmt.Println("vbank.go upcall", send)
232-
reply, err := am.keeper.CallToController(ctx, send)
232+
reply, err := am.keeper.CallToController(ctx, send, simReturn)
233233
// fmt.Println("vbank.go upcall reply", reply, err)
234234
return reply, err
235235
}

golang/cosmos/x/vbank/vbank_test.go

+6-6
Original file line numberDiff line numberDiff line change
@@ -229,8 +229,8 @@ func (b *mockBank) SendCoinsFromModuleToModule(ctx sdk.Context, senderModule, re
229229
func makeTestKit(bank types.BankKeeper) (Keeper, sdk.Context) {
230230
encodingConfig := params.MakeEncodingConfig()
231231
cdc := encodingConfig.Marshaller
232-
callToController := func(ctx sdk.Context, str string) (string, error) {
233-
return "", nil
232+
callToController := func(ctx sdk.Context, str, simReturn string) (string, error) {
233+
return simReturn, nil
234234
}
235235

236236
paramsTStoreKey := sdk.NewTransientStoreKey(paramstypes.TStoreKey)
@@ -472,9 +472,9 @@ func Test_EndBlock_Events(t *testing.T) {
472472
}}
473473
keeper, ctx := makeTestKit(bank)
474474
msgsSent := []string{}
475-
keeper.CallToController = func(ctx sdk.Context, str string) (string, error) {
475+
keeper.CallToController = func(ctx sdk.Context, str, simReturn string) (string, error) {
476476
msgsSent = append(msgsSent, str)
477-
return "", nil
477+
return simReturn, nil
478478
}
479479
am := NewAppModule(keeper)
480480

@@ -546,9 +546,9 @@ func Test_EndBlock_Rewards(t *testing.T) {
546546
}
547547
keeper, ctx := makeTestKit(bank)
548548
msgsSent := []string{}
549-
keeper.CallToController = func(ctx sdk.Context, str string) (string, error) {
549+
keeper.CallToController = func(ctx sdk.Context, str, simReturn string) (string, error) {
550550
msgsSent = append(msgsSent, str)
551-
return "", nil
551+
return simReturn, nil
552552
}
553553
am := NewAppModule(keeper)
554554

golang/cosmos/x/vibc/handler.go

+1-10
Original file line numberDiff line numberDiff line change
@@ -4,22 +4,13 @@ import (
44
"encoding/json"
55
"fmt"
66

7-
"github.com/Agoric/agoric-sdk/golang/cosmos/vm"
87
sdk "github.com/cosmos/cosmos-sdk/types"
98
sdkerrors "github.com/cosmos/cosmos-sdk/types/errors"
109
)
1110

1211
// NewHandler returns a handler for "vibc" type messages.
1312
func NewHandler(keeper Keeper) sdk.Handler {
1413
return func(ctx sdk.Context, msg sdk.Msg) (*sdk.Result, error) {
15-
if vm.IsSimulation(ctx) {
16-
// We don't support simulation.
17-
return &sdk.Result{}, nil
18-
} else {
19-
// The simulation was done, so now allow infinite gas.
20-
ctx = ctx.WithGasMeter(sdk.NewInfiniteGasMeter())
21-
}
22-
2314
switch msg := msg.(type) {
2415
case *MsgSendPacket:
2516
return handleMsgSendPacket(ctx, keeper, msg)
@@ -62,7 +53,7 @@ func handleMsgSendPacket(ctx sdk.Context, keeper Keeper, msg *MsgSendPacket) (*s
6253
return nil, sdkerrors.Wrap(sdkerrors.ErrJSONMarshal, err.Error())
6354
}
6455

65-
_, err = keeper.CallToController(ctx, string(b))
56+
_, err = keeper.CallToController(ctx, string(b), "")
6657
// fmt.Fprintln(os.Stderr, "Returned from SwingSet", out, err)
6758
if err != nil {
6859
return nil, err

0 commit comments

Comments
 (0)