Skip to content

Broken TruncateDecimal #3870

Closed
Closed

Description

Summary of Bug

The following stracktrace shows how DecCoin/s#TruncateDecimal can lead to a panic:


Codespace: sdk
Code: 11
Message: \"102muon,0photino\"
stack:
goroutine 109833 [running]:
runtime/debug.Stack(0xc000aa9f28, 0xffa9a0, 0xc007db5230)
	/snap/go/3318/src/runtime/debug/stack.go:24 +0x9d
github.com/cosmos/cosmos-sdk/baseapp.(*BaseApp).runTx.func1(0xc000aabc50, 0xc000aabc78, 0xc000aabdb0)
	/home/nissa/go/src/github.com/cosmos/cosmos-sdk/baseapp/baseapp.go:757 +0x90
panic(0xffa9a0, 0xc007db5230)
	/snap/go/3318/src/runtime/panic.go:522 +0x1b5
github.com/cosmos/cosmos-sdk/x/distribution/keeper.Hooks.BeforeDelegationSharesModified(0x135cce0, 0xc000bed230, 0xc000157b20, 0xc000157b20, 0x135cce0, 0xc000bed280, 0x135cd20, 0xc000bed290, 0xc000a6f5a0, 0x5, ...)
	/home/nissa/go/src/github.com/cosmos/cosmos-sdk/x/distribution/keeper/hooks.go:87 +0x233
github.com/cosmos/cosmos-sdk/cmd/gaia/app.StakingHooks.BeforeDelegationSharesModified(...)
	/home/nissa/go/src/github.com/cosmos/cosmos-sdk/cmd/gaia/app/app.go:374
github.com/cosmos/cosmos-sdk/x/staking/keeper.Keeper.BeforeDelegationSharesModified(...)
	/home/nissa/go/src/github.com/cosmos/cosmos-sdk/x/staking/keeper/hooks.go:52
github.com/cosmos/cosmos-sdk/x/staking/keeper.Keeper.Delegate(0x135cce0, 0xc000bed200, 0x135cd20, 0xc000bed210, 0xc000157b20, 0x7f32d83533e8, 0xc0000d2780, 0x137a380, 0xc000b73200, 0xc000157b20, ...)
	/home/nissa/go/src/github.com/cosmos/cosmos-sdk/x/staking/keeper/delegation.go:465 +0x9a1
github.com/cosmos/cosmos-sdk/x/staking.handleMsgDelegate(0x136ac60, 0xc004bc6000, 0xc00206b540, 0x14, 0xc003f10a00, 0x14, 0x14, 0xc003f10a20, 0x14, 0x14, ...)
	/home/nissa/go/src/github.com/cosmos/cosmos-sdk/x/staking/handler.go:216 +0x357
github.com/cosmos/cosmos-sdk/x/staking.NewHandler.func1(0x136ac60, 0xc004bc6000, 0xc00206b540, 0x14, 0x136e4a0, 0xc00431f220, 0x0, 0x0, 0x0, 0x0, ...)
	/home/nissa/go/src/github.com/cosmos/cosmos-sdk/x/staking/handler.go:25 +0x485
github.com/cosmos/cosmos-sdk/baseapp.(*BaseApp).runMsgs(0xc0000eb000, 0x136ac60, 0xc004bc6000, 0xc00206b540, 0x14, 0xc003c01f10, 0x1, 0x1, 0x136ac02, 0x0, ...)
	/home/nissa/go/src/github.com/cosmos/cosmos-sdk/baseapp/baseapp.go:653 +0xb4e
github.com/cosmos/cosmos-sdk/baseapp.(*BaseApp).runTx(0xc0000eb000, 0x2, 0xc003d3ab60, 0xc9, 0xc9, 0x135f020, 0xc0054fad20, 0x0, 0x0, 0x0, ...)
	/home/nissa/go/src/github.com/cosmos/cosmos-sdk/baseapp/baseapp.go:830 +0x375
github.com/cosmos/cosmos-sdk/baseapp.(*BaseApp).DeliverTx(0xc0000eb000, 0xc003d3ab60, 0xc9, 0xc9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, ...)
	/home/nissa/go/src/github.com/cosmos/cosmos-sdk/baseapp/baseapp.go:587 +0x2a0
github.com/cosmos/cosmos-sdk/vendor/github.com/tendermint/tendermint/abci/client.(*localClient).DeliverTxAsync(0xc000bba600, 0xc003d3ab60, 0xc9, 0xc9, 0x0)
	/home/nissa/go/src/github.com/cosmos/cosmos-sdk/vendor/github.com/tendermint/tendermint/abci/client/local_client.go:88 +0xc5
github.com/cosmos/cosmos-sdk/vendor/github.com/tendermint/tendermint/proxy.(*appConnConsensus).DeliverTxAsync(0xc0004fab90, 0xc003d3ab60, 0xc9, 0xc9, 0xa)
	/home/nissa/go/src/github.com/cosmos/cosmos-sdk/vendor/github.com/tendermint/tendermint/proxy/app_conn.go:73 +0x51
github.com/cosmos/cosmos-sdk/vendor/github.com/tendermint/tendermint/state.execBlockOnProxyApp(0x136b760, 0xc000199ba0, 0x1374140, 0xc0004fab90, 0xc0034661e0, 0xc00507ed20, 0x137c200, 0xc000010a68, 0xc000035d60, 0xa, ...)
	/home/nissa/go/src/github.com/cosmos/cosmos-sdk/vendor/github.com/tendermint/tendermint/state/execution.go:281 +0x5e2
github.com/cosmos/cosmos-sdk/vendor/github.com/tendermint/tendermint/state.(*BlockExecutor).ApplyBlock(0xc00016b6c0, 0xa, 0x0, 0xc000035d50, 0x6, 0xc000035d60, 0xa, 0x13841, 0x26ac, 0xc0065078a0, ...)
	/home/nissa/go/src/github.com/cosmos/cosmos-sdk/vendor/github.com/tendermint/tendermint/state/execution.go:119 +0x1b5
github.com/cosmos/cosmos-sdk/vendor/github.com/tendermint/tendermint/consensus.(*ConsensusState).finalizeCommit(0xc000079880, 0x13842)
	/home/nissa/go/src/github.com/cosmos/cosmos-sdk/vendor/github.com/tendermint/tendermint/consensus/state.go:1327 +0x9be
github.com/cosmos/cosmos-sdk/vendor/github.com/tendermint/tendermint/consensus.(*ConsensusState).tryFinalizeCommit(0xc000079880, 0x13842)
	/home/nissa/go/src/github.com/cosmos/cosmos-sdk/vendor/github.com/tendermint/tendermint/consensus/state.go:1258 +0x3e0
github.com/cosmos/cosmos-sdk/vendor/github.com/tendermint/tendermint/consensus.(*ConsensusState).enterCommit.func1(0xc000079880, 0x0, 0x13842)
	/home/nissa/go/src/github.com/cosmos/cosmos-sdk/vendor/github.com/tendermint/tendermint/consensus/state.go:1204 +0x91
github.com/cosmos/cosmos-sdk/vendor/github.com/tendermint/tendermint/consensus.(*ConsensusState).enterCommit(0xc000079880, 0x13842, 0x0)
	/home/nissa/go/src/github.com/cosmos/cosmos-sdk/vendor/github.com/tendermint/tendermint/consensus/state.go:1235 +0x61e
github.com/cosmos/cosmos-sdk/vendor/github.com/tendermint/tendermint/consensus.(*ConsensusState).addVote(0xc000079880, 0xc006c80fa0, 0xc005aecc90, 0x28, 0x109, 0x109, 0x109)
	/home/nissa/go/src/github.com/cosmos/cosmos-sdk/vendor/github.com/tendermint/tendermint/consensus/state.go:1660 +0xaec
github.com/cosmos/cosmos-sdk/vendor/github.com/tendermint/tendermint/consensus.(*ConsensusState).tryAddVote(0xc000079880, 0xc006c80fa0, 0xc005aecc90, 0x28, 0x0, 0x109, 0x101)
	/home/nissa/go/src/github.com/cosmos/cosmos-sdk/vendor/github.com/tendermint/tendermint/consensus/state.go:1506 +0x5c
github.com/cosmos/cosmos-sdk/vendor/github.com/tendermint/tendermint/consensus.(*ConsensusState).handleMsg(0xc000079880, 0x134ea60, 0xc00371a360, 0xc005aecc90, 0x28)
	/home/nissa/go/src/github.com/cosmos/cosmos-sdk/vendor/github.com/tendermint/tendermint/consensus/state.go:694 +0x6cc
github.com/cosmos/cosmos-sdk/vendor/github.com/tendermint/tendermint/consensus.(*ConsensusState).receiveRoutine(0xc000079880, 0x0)
	/home/nissa/go/src/github.com/cosmos/cosmos-sdk/vendor/github.com/tendermint/tendermint/consensus/state.go:642 +0x695
created by github.com/cosmos/cosmos-sdk/vendor/github.com/tendermint/tendermint/consensus.(*ConsensusState).OnStart
	/home/nissa/go/src/github.com/cosmos/cosmos-sdk/vendor/github.com/tendermint/tendermint/consensus/state.go:334 +0x13a

This is similar to the fix in #3836 (I should've caught all cases...sigh). We need to groom through all the decimal coins methods and make sure there is no case where zero coins can be returned. In this case, DecCoins#TruncateDecimal cannot return any zero coins in out.

This does not affect mainnet because there will exist only one token and IsZero will return true in such a case as above.

credit: @fkbenjamin


For Admin Use

  • Not duplicate issue
  • Appropriate labels applied
  • Appropriate contributors tagged
  • Contributor assigned/self-assigned
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Assignees

Labels

Type

No type

Projects

No projects

Milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions