block gas meter working
This commit is contained in:
parent
0345f38639
commit
2f73cf4193
|
@ -68,8 +68,10 @@ type BaseApp struct {
|
||||||
deliverState *state // for DeliverTx
|
deliverState *state // for DeliverTx
|
||||||
voteInfos []abci.VoteInfo // absent validators from begin block
|
voteInfos []abci.VoteInfo // absent validators from begin block
|
||||||
|
|
||||||
// minimum fees for spam prevention
|
// spam prevention
|
||||||
minimumFees sdk.Coins
|
minimumFees sdk.Coins
|
||||||
|
maximumBlockGas int64
|
||||||
|
deliverGas
|
||||||
|
|
||||||
// flag for sealing
|
// flag for sealing
|
||||||
sealed bool
|
sealed bool
|
||||||
|
@ -194,6 +196,9 @@ func (app *BaseApp) initFromStore(mainKey sdk.StoreKey) error {
|
||||||
// SetMinimumFees sets the minimum fees.
|
// SetMinimumFees sets the minimum fees.
|
||||||
func (app *BaseApp) SetMinimumFees(fees sdk.Coins) { app.minimumFees = fees }
|
func (app *BaseApp) SetMinimumFees(fees sdk.Coins) { app.minimumFees = fees }
|
||||||
|
|
||||||
|
// SetMaximumBlockGas sets the maximum gas allowable per block.
|
||||||
|
func (app *BaseApp) SetMaximumBlockGas(gas int64) { app.maximumBlockGas = gas }
|
||||||
|
|
||||||
// NewContext returns a new Context with the correct store, the given header, and nil txBytes.
|
// NewContext returns a new Context with the correct store, the given header, and nil txBytes.
|
||||||
func (app *BaseApp) NewContext(isCheckTx bool, header abci.Header) sdk.Context {
|
func (app *BaseApp) NewContext(isCheckTx bool, header abci.Header) sdk.Context {
|
||||||
if isCheckTx {
|
if isCheckTx {
|
||||||
|
@ -422,12 +427,19 @@ func (app *BaseApp) BeginBlock(req abci.RequestBeginBlock) (res abci.ResponseBeg
|
||||||
// Initialize the DeliverTx state. If this is the first block, it should
|
// Initialize the DeliverTx state. If this is the first block, it should
|
||||||
// already be initialized in InitChain. Otherwise app.deliverState will be
|
// already be initialized in InitChain. Otherwise app.deliverState will be
|
||||||
// nil, since it is reset on Commit.
|
// nil, since it is reset on Commit.
|
||||||
|
blockGasMeter := sdk.NewGasMeter(app.maximumBlockGas)
|
||||||
if app.deliverState == nil {
|
if app.deliverState == nil {
|
||||||
app.setDeliverState(req.Header)
|
app.setDeliverState(req.Header)
|
||||||
|
app.deliverState.ctx = app.deliverState.ctx.
|
||||||
|
WithBlockGasMeter(blockGasMeter)
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
// In the first block, app.deliverState.ctx will already be initialized
|
// In the first block, app.deliverState.ctx will already be initialized
|
||||||
// by InitChain. Context is now updated with Header information.
|
// by InitChain. Context is now updated with Header information.
|
||||||
app.deliverState.ctx = app.deliverState.ctx.WithBlockHeader(req.Header).WithBlockHeight(req.Header.Height)
|
app.deliverState.ctx = app.deliverState.ctx.
|
||||||
|
WithBlockHeader(req.Header).
|
||||||
|
WithBlockHeight(req.Header.Height).
|
||||||
|
WithBlockGasMeter(blockGasMeter)
|
||||||
}
|
}
|
||||||
|
|
||||||
if app.beginBlocker != nil {
|
if app.beginBlocker != nil {
|
||||||
|
@ -467,9 +479,10 @@ func (app *BaseApp) CheckTx(txBytes []byte) (res abci.ResponseCheckTx) {
|
||||||
|
|
||||||
// Implements ABCI
|
// Implements ABCI
|
||||||
func (app *BaseApp) DeliverTx(txBytes []byte) (res abci.ResponseDeliverTx) {
|
func (app *BaseApp) DeliverTx(txBytes []byte) (res abci.ResponseDeliverTx) {
|
||||||
|
|
||||||
// Decode the Tx.
|
// Decode the Tx.
|
||||||
var result sdk.Result
|
|
||||||
var tx, err = app.txDecoder(txBytes)
|
var tx, err = app.txDecoder(txBytes)
|
||||||
|
var result sdk.Result
|
||||||
if err != nil {
|
if err != nil {
|
||||||
result = err.Result()
|
result = err.Result()
|
||||||
} else {
|
} else {
|
||||||
|
@ -655,6 +668,10 @@ func (app *BaseApp) runTx(mode runTxMode, txBytes []byte, tx sdk.Tx) (result sdk
|
||||||
result = app.runMsgs(ctx, msgs, mode)
|
result = app.runMsgs(ctx, msgs, mode)
|
||||||
result.GasWanted = gasWanted
|
result.GasWanted = gasWanted
|
||||||
|
|
||||||
|
// consume block gas
|
||||||
|
ctx.BlockGasMeter.ConsumeGas(
|
||||||
|
ctx.GasMeter().GasConsumed(), "block gas meter")
|
||||||
|
|
||||||
// only update state if all messages pass
|
// only update state if all messages pass
|
||||||
if result.IsOK() {
|
if result.IsOK() {
|
||||||
msCache.Write()
|
msCache.Write()
|
||||||
|
|
|
@ -140,6 +140,7 @@ const (
|
||||||
contextKeyLogger
|
contextKeyLogger
|
||||||
contextKeyVoteInfos
|
contextKeyVoteInfos
|
||||||
contextKeyGasMeter
|
contextKeyGasMeter
|
||||||
|
contextKeyBlockGasMeter
|
||||||
contextKeyMinimumFees
|
contextKeyMinimumFees
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -170,6 +171,8 @@ func (c Context) VoteInfos() []abci.VoteInfo {
|
||||||
|
|
||||||
func (c Context) GasMeter() GasMeter { return c.Value(contextKeyGasMeter).(GasMeter) }
|
func (c Context) GasMeter() GasMeter { return c.Value(contextKeyGasMeter).(GasMeter) }
|
||||||
|
|
||||||
|
func (c Context) BlockGasMeter() GasMeter { return c.Value(contextKeyBlockGasMeter).(GasMeter) }
|
||||||
|
|
||||||
func (c Context) IsCheckTx() bool { return c.Value(contextKeyIsCheckTx).(bool) }
|
func (c Context) IsCheckTx() bool { return c.Value(contextKeyIsCheckTx).(bool) }
|
||||||
|
|
||||||
func (c Context) MinimumFees() Coins { return c.Value(contextKeyMinimumFees).(Coins) }
|
func (c Context) MinimumFees() Coins { return c.Value(contextKeyMinimumFees).(Coins) }
|
||||||
|
@ -219,6 +222,10 @@ func (c Context) WithVoteInfos(VoteInfos []abci.VoteInfo) Context {
|
||||||
|
|
||||||
func (c Context) WithGasMeter(meter GasMeter) Context { return c.withValue(contextKeyGasMeter, meter) }
|
func (c Context) WithGasMeter(meter GasMeter) Context { return c.withValue(contextKeyGasMeter, meter) }
|
||||||
|
|
||||||
|
func (c Context) WithBlockGasMeter(meter GasMeter) Context {
|
||||||
|
return c.withValue(contextKeyBlockGasMeter, meter)
|
||||||
|
}
|
||||||
|
|
||||||
func (c Context) WithIsCheckTx(isCheckTx bool) Context {
|
func (c Context) WithIsCheckTx(isCheckTx bool) Context {
|
||||||
return c.withValue(contextKeyIsCheckTx, isCheckTx)
|
return c.withValue(contextKeyIsCheckTx, isCheckTx)
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue