1f754bdb78
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.
79 lines
2.0 KiB
Go
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")
|
|
})
|
|
}
|
|
|
|
}
|