lotus/chain/vm/burn_test.go
Steven Allen 1f754bdb78 disable gas burning for window post messages
While over-estimation fees and miner tips are still paid, gas is no longer burnt
for direct, successful window PoSt messages.

Usually, gas is burnt to prevent an attacker from spamming the network and to
allow clients to "price" messages (using the base fee cap) based on how urgently
they need them to be processed. However:

1. Window PoSt is already a "proof of work".
2. Miners need to submit WindowedPoSts on-time so all window post messages are urgent.
3. Work is already under way to move window post verification off-chain (making
it effectively free). This change simply introduces the "free" part a bit earlier.
2020-12-16 00:10:25 -05:00

79 lines
2.0 KiB
Go

package vm
import (
"fmt"
"testing"
"github.com/filecoin-project/lotus/chain/types"
"github.com/stretchr/testify/assert"
)
func TestGasBurn(t *testing.T) {
tests := []struct {
used int64
limit int64
refund int64
burn int64
}{
{100, 200, 10, 90},
{100, 150, 30, 20},
{1000, 1300, 240, 60},
{500, 700, 140, 60},
{200, 200, 0, 0},
{20000, 21000, 1000, 0},
{0, 2000, 0, 2000},
{500, 651, 121, 30},
{500, 5000, 0, 4500},
{7499e6, 7500e6, 1000000, 0},
{7500e6 / 2, 7500e6, 375000000, 3375000000},
{1, 7500e6, 0, 7499999999},
}
for _, test := range tests {
test := test
t.Run(fmt.Sprintf("%v", test), func(t *testing.T) {
refund, toBurn := ComputeGasOverestimationBurn(test.used, test.limit)
assert.Equal(t, test.refund, refund, "refund")
assert.Equal(t, test.burn, toBurn, "burned")
})
}
}
func TestGasOutputs(t *testing.T) {
baseFee := types.NewInt(10)
tests := []struct {
used int64
limit int64
feeCap uint64
premium uint64
BaseFeeBurn uint64
OverEstimationBurn uint64
MinerPenalty uint64
MinerTip uint64
Refund uint64
}{
{100, 110, 11, 1, 1000, 0, 0, 110, 100},
{100, 130, 11, 1, 1000, 60, 0, 130, 240},
{100, 110, 10, 1, 1000, 0, 0, 0, 100},
{100, 110, 6, 1, 600, 0, 400, 0, 60},
}
for _, test := range tests {
test := test
t.Run(fmt.Sprintf("%v", test), func(t *testing.T) {
output := ComputeGasOutputs(test.used, test.limit, baseFee, types.NewInt(test.feeCap), types.NewInt(test.premium), true)
i2s := func(i uint64) string {
return fmt.Sprintf("%d", i)
}
assert.Equal(t, i2s(test.BaseFeeBurn), output.BaseFeeBurn.String(), "BaseFeeBurn")
assert.Equal(t, i2s(test.OverEstimationBurn), output.OverEstimationBurn.String(), "OverEstimationBurn")
assert.Equal(t, i2s(test.MinerPenalty), output.MinerPenalty.String(), "MinerPenalty")
assert.Equal(t, i2s(test.MinerTip), output.MinerTip.String(), "MinerTip")
assert.Equal(t, i2s(test.Refund), output.Refund.String(), "Refund")
})
}
}