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")
 | |
| 		})
 | |
| 	}
 | |
| 
 | |
| }
 |