Skip to content

Commit cf93ad3

Browse files
authored
fix(lib/babe): always use 2/3 of slot to produce block, re-add potentially valid txs to queue (#1679)
1 parent a9b3ccc commit cf93ad3

File tree

3 files changed

+47
-20
lines changed

3 files changed

+47
-20
lines changed

lib/babe/build.go

Lines changed: 14 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -244,11 +244,6 @@ func (b *BlockBuilder) buildBlockExtrinsics(slot Slot) []*transaction.ValidTrans
244244
txn := b.transactionState.Pop()
245245
// Transaction queue is empty.
246246
if txn == nil {
247-
return included
248-
}
249-
250-
// Move to next extrinsic.
251-
if txn.Extrinsic == nil {
252247
continue
253248
}
254249

@@ -270,6 +265,20 @@ func (b *BlockBuilder) buildBlockExtrinsics(slot Slot) []*transaction.ValidTrans
270265
if _, ok := err.(*DispatchOutcomeError); !ok {
271266
continue
272267
}
268+
269+
// don't drop transactions that may be valid in a later block ie.
270+
// run out of gas for this block or have a nonce that may be valid in a later block
271+
var e *TransactionValidityError
272+
if !errors.As(err, &e) {
273+
continue
274+
}
275+
276+
if errors.Is(e.msg, errExhaustsResources) || errors.Is(e.msg, errInvalidTransaction) {
277+
hash, err := b.transactionState.Push(txn)
278+
if err != nil {
279+
logger.Debug("failed to re-add transaction to queue", "tx", hash, "error", err)
280+
}
281+
}
273282
}
274283

275284
logger.Debug("build block applied extrinsic", "extrinsic", extrinsic)

lib/babe/errors.go

Lines changed: 32 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -86,13 +86,31 @@ func (e DispatchOutcomeError) Error() string {
8686

8787
// A TransactionValidityError is possible errors while checking the validity of a transaction
8888
type TransactionValidityError struct {
89-
msg string // description of error
89+
msg error // description of error
9090
}
9191

9292
func (e TransactionValidityError) Error() string {
9393
return fmt.Sprintf("transaction validity error: %s", e.msg)
9494
}
9595

96+
var (
97+
errUnexpectedTxCall = errors.New("call of the transaction is not expected")
98+
errInvalidPayment = errors.New("invalid payment")
99+
errInvalidTransaction = errors.New("invalid transaction")
100+
errOutdatedTransaction = errors.New("outdated transaction")
101+
errBadProof = errors.New("bad proof")
102+
errAncientBirthBlock = errors.New("ancient birth block")
103+
errExhaustsResources = errors.New("exhausts resources")
104+
errMandatoryDispatchError = errors.New("mandatory dispatch error")
105+
errInvalidMandatoryDispatch = errors.New("invalid mandatory dispatch")
106+
errLookupFailed = errors.New("lookup failed")
107+
errValidatorNotFound = errors.New("validator not found")
108+
)
109+
110+
func newUnknownError(data scale.VaryingDataTypeValue) error {
111+
return fmt.Errorf("unknown error: %d", data)
112+
}
113+
96114
// UnmarshalError occurs when unmarshalling fails
97115
type UnmarshalError struct {
98116
msg string
@@ -223,31 +241,31 @@ func determineErrType(vdt scale.VaryingDataType) error {
223241
case Module:
224242
return &DispatchOutcomeError{fmt.Sprintf("custom module error: %s", val.string())}
225243
case Call:
226-
return &TransactionValidityError{"call of the transaction is not expected"}
244+
return &TransactionValidityError{errUnexpectedTxCall}
227245
case Payment:
228-
return &TransactionValidityError{"invalid payment"}
246+
return &TransactionValidityError{errInvalidPayment}
229247
case Future:
230-
return &TransactionValidityError{"invalid transaction"}
248+
return &TransactionValidityError{errInvalidTransaction}
231249
case Stale:
232-
return &TransactionValidityError{"outdated transaction"}
250+
return &TransactionValidityError{errOutdatedTransaction}
233251
case BadProof:
234-
return &TransactionValidityError{"bad proof"}
252+
return &TransactionValidityError{errBadProof}
235253
case AncientBirthBlock:
236-
return &TransactionValidityError{"ancient birth block"}
254+
return &TransactionValidityError{errAncientBirthBlock}
237255
case ExhaustsResources:
238-
return &TransactionValidityError{"exhausts resources"}
256+
return &TransactionValidityError{errExhaustsResources}
239257
case InvalidCustom:
240-
return &TransactionValidityError{fmt.Sprintf("unknown error: %d", val)}
258+
return &TransactionValidityError{newUnknownError(val)}
241259
case BadMandatory:
242-
return &TransactionValidityError{"mandatory dispatch error"}
260+
return &TransactionValidityError{errMandatoryDispatchError}
243261
case MandatoryDispatch:
244-
return &TransactionValidityError{"invalid mandatory dispatch"}
262+
return &TransactionValidityError{errInvalidMandatoryDispatch}
245263
case ValidityCannotLookup:
246-
return &TransactionValidityError{"lookup failed"}
264+
return &TransactionValidityError{errLookupFailed}
247265
case NoUnsignedValidator:
248-
return &TransactionValidityError{"validator not found"}
266+
return &TransactionValidityError{errValidatorNotFound}
249267
case UnknownCustom:
250-
return &TransactionValidityError{fmt.Sprintf("unknown error: %d", val)}
268+
return &TransactionValidityError{newUnknownError(val)}
251269
}
252270

253271
return errInvalidResult

lib/babe/errors_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -79,7 +79,7 @@ func TestApplyExtrinsicErrors(t *testing.T) {
7979
_, ok := err.(*TransactionValidityError)
8080
require.True(t, ok)
8181
}
82-
require.Equal(t, err.Error(), c.expected)
82+
require.Equal(t, c.expected, err.Error())
8383
})
8484
}
8585
}

0 commit comments

Comments
 (0)