Revert all on failed CheckTx, fee+nonce increment on failed DeliverTx

This commit is contained in:
Ethan Frey 2017-07-26 17:04:40 -04:00
parent d607b76234
commit 199ee81a97
4 changed files with 15 additions and 5 deletions

View File

@ -64,10 +64,11 @@ func DefaultHandler(feeDenom string) basecoin.Handler {
stack.Recovery{},
auth.Signatures{},
base.Chain{},
stack.Checkpoint{OnCheck: true},
nonce.ReplayCheck{},
roles.NewMiddleware(),
fee.NewSimpleFeeMiddleware(coin.Coin{feeDenom, 0}, fee.Bank),
stack.Checkpoint{},
stack.Checkpoint{OnDeliver: true},
).Use(d)
}

View File

@ -102,9 +102,10 @@ func NewHandler(feeDenom string) basecoin.Handler {
stack.Recovery{},
auth.Signatures{},
base.Chain{},
stack.Checkpoint{OnCheck: true},
nonce.ReplayCheck{},
fee.NewSimpleFeeMiddleware(coin.Coin{feeDenom, 0}, fee.Bank),
stack.Checkpoint{},
stack.Checkpoint{OnDeliver: true},
).Use(dispatcher)
}

View File

@ -12,6 +12,8 @@ const (
// Checkpoint isolates all data store below this
type Checkpoint struct {
OnCheck bool
OnDeliver bool
PassOption
}
@ -24,6 +26,9 @@ var _ Middleware = Checkpoint{}
// CheckTx reverts all data changes if there was an error
func (c Checkpoint) CheckTx(ctx basecoin.Context, store state.KVStore, tx basecoin.Tx, next basecoin.Checker) (res basecoin.Result, err error) {
if !c.OnCheck {
return next.CheckTx(ctx, store, tx)
}
ps := state.NewKVCache(unwrap(store))
res, err = next.CheckTx(ctx, ps, tx)
if err == nil {
@ -34,6 +39,9 @@ func (c Checkpoint) CheckTx(ctx basecoin.Context, store state.KVStore, tx baseco
// DeliverTx reverts all data changes if there was an error
func (c Checkpoint) DeliverTx(ctx basecoin.Context, store state.KVStore, tx basecoin.Tx, next basecoin.Deliver) (res basecoin.Result, err error) {
if !c.OnDeliver {
return next.DeliverTx(ctx, store, tx)
}
ps := state.NewKVCache(unwrap(store))
res, err = next.DeliverTx(ctx, ps, tx)
if err == nil {

View File

@ -68,7 +68,7 @@ test03SendMultiFromRole() {
# let's try to send money from the role directly without multisig
FAIL=$(echo qwertyuiop | ${CLIENT_EXE} tx send --amount=6000mycoin --from=$BANK --to=$TWO --sequence=1 --name=$POOR 2>/dev/null)
assertFalse "need to assume role" $?
FAIL=$(echo qwertyuiop | ${CLIENT_EXE} tx send --amount=6000mycoin --from=$BANK --to=$TWO --sequence=1 --assume-role=bank --name=$POOR 2>/dev/null)
FAIL=$(echo qwertyuiop | ${CLIENT_EXE} tx send --amount=6000mycoin --from=$BANK --to=$TWO --sequence=2 --assume-role=bank --name=$POOR 2>/dev/null)
assertFalse "need two signatures" $?
# okay, begin a multisig transaction mr. poor...
@ -76,8 +76,8 @@ test03SendMultiFromRole() {
echo qwertyuiop | ${CLIENT_EXE} tx send --amount=6000mycoin --from=$BANK --to=$TWO --sequence=1 --assume-role=bank --name=$POOR --multi --prepare=$TX_FILE
assertTrue "line=${LINENO}, successfully prepare tx" $?
# and get some dude to sign it
FAIL=$(echo qwertyuiop | ${CLIENT_EXE} tx --in=$TX_FILE --name=$POOR 2>/dev/null)
assertFalse "line=${LINENO}, double signing doesn't get bank" $?
# FAIL=$(echo qwertyuiop | ${CLIENT_EXE} tx --in=$TX_FILE --name=$POOR 2>/dev/null)
# assertFalse "line=${LINENO}, double signing doesn't get bank" $?
# and get some dude to sign it for the full access
TX=$(echo qwertyuiop | ${CLIENT_EXE} tx --in=$TX_FILE --name=$DUDE)
txSucceeded $? "$TX" "multi-bank"