Merge pull request #3528 from filecoin-project/fix/sele-gas-reward
Fix calculation of GasReward in messagepool
This commit is contained in:
commit
01449e486c
@ -585,16 +585,18 @@ func (mp *MessagePool) getPendingMessages(curTs, ts *types.TipSet) (map[address.
|
|||||||
return result, nil
|
return result, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (mp *MessagePool) getGasReward(msg *types.SignedMessage, baseFee types.BigInt, ts *types.TipSet) *big.Int {
|
func (*MessagePool) getGasReward(msg *types.SignedMessage, baseFee types.BigInt) *big.Int {
|
||||||
maxPremium := types.BigSub(msg.Message.GasFeeCap, baseFee)
|
maxPremium := types.BigSub(msg.Message.GasFeeCap, baseFee)
|
||||||
if types.BigCmp(maxPremium, msg.Message.GasPremium) < 0 {
|
|
||||||
|
if types.BigCmp(maxPremium, msg.Message.GasPremium) > 0 {
|
||||||
maxPremium = msg.Message.GasPremium
|
maxPremium = msg.Message.GasPremium
|
||||||
}
|
}
|
||||||
|
|
||||||
gasReward := abig.Mul(maxPremium, types.NewInt(uint64(msg.Message.GasLimit)))
|
gasReward := abig.Mul(maxPremium, types.NewInt(uint64(msg.Message.GasLimit)))
|
||||||
return gasReward.Int
|
return gasReward.Int
|
||||||
}
|
}
|
||||||
|
|
||||||
func (mp *MessagePool) getGasPerf(gasReward *big.Int, gasLimit int64) float64 {
|
func (*MessagePool) getGasPerf(gasReward *big.Int, gasLimit int64) float64 {
|
||||||
// gasPerf = gasReward * build.BlockGasLimit / gasLimit
|
// gasPerf = gasReward * build.BlockGasLimit / gasLimit
|
||||||
a := new(big.Rat).SetInt(new(big.Int).Mul(gasReward, bigBlockGasLimit))
|
a := new(big.Rat).SetInt(new(big.Int).Mul(gasReward, bigBlockGasLimit))
|
||||||
b := big.NewRat(1, gasLimit)
|
b := big.NewRat(1, gasLimit)
|
||||||
@ -672,7 +674,7 @@ func (mp *MessagePool) createMessageChains(actor address.Address, mset map[uint6
|
|||||||
balance = new(big.Int).Sub(balance, value)
|
balance = new(big.Int).Sub(balance, value)
|
||||||
}
|
}
|
||||||
|
|
||||||
gasReward := mp.getGasReward(m, baseFee, ts)
|
gasReward := mp.getGasReward(m, baseFee)
|
||||||
rewards = append(rewards, gasReward)
|
rewards = append(rewards, gasReward)
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -776,7 +778,7 @@ func (mc *msgChain) Before(other *msgChain) bool {
|
|||||||
func (mc *msgChain) Trim(gasLimit int64, mp *MessagePool, baseFee types.BigInt, ts *types.TipSet) {
|
func (mc *msgChain) Trim(gasLimit int64, mp *MessagePool, baseFee types.BigInt, ts *types.TipSet) {
|
||||||
i := len(mc.msgs) - 1
|
i := len(mc.msgs) - 1
|
||||||
for i >= 0 && (mc.gasLimit > gasLimit || mc.gasPerf < 0) {
|
for i >= 0 && (mc.gasLimit > gasLimit || mc.gasPerf < 0) {
|
||||||
gasReward := mp.getGasReward(mc.msgs[i], baseFee, ts)
|
gasReward := mp.getGasReward(mc.msgs[i], baseFee)
|
||||||
mc.gasReward = new(big.Int).Sub(mc.gasReward, gasReward)
|
mc.gasReward = new(big.Int).Sub(mc.gasReward, gasReward)
|
||||||
mc.gasLimit -= mc.msgs[i].Message.GasLimit
|
mc.gasLimit -= mc.msgs[i].Message.GasLimit
|
||||||
if mc.gasLimit > 0 {
|
if mc.gasLimit > 0 {
|
||||||
|
@ -2,6 +2,7 @@ package messagepool
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
|
"fmt"
|
||||||
"math"
|
"math"
|
||||||
"math/big"
|
"math/big"
|
||||||
"math/rand"
|
"math/rand"
|
||||||
@ -1061,17 +1062,17 @@ func testCompetitiveMessageSelection(t *testing.T, rng *rand.Rand, getPremium fu
|
|||||||
|
|
||||||
greedyReward := big.NewInt(0)
|
greedyReward := big.NewInt(0)
|
||||||
for _, m := range greedyMsgs {
|
for _, m := range greedyMsgs {
|
||||||
greedyReward.Add(greedyReward, mp.getGasReward(m, baseFee, ts))
|
greedyReward.Add(greedyReward, mp.getGasReward(m, baseFee))
|
||||||
}
|
}
|
||||||
|
|
||||||
optReward := big.NewInt(0)
|
optReward := big.NewInt(0)
|
||||||
for _, m := range optMsgs {
|
for _, m := range optMsgs {
|
||||||
optReward.Add(optReward, mp.getGasReward(m, baseFee, ts))
|
optReward.Add(optReward, mp.getGasReward(m, baseFee))
|
||||||
}
|
}
|
||||||
|
|
||||||
bestTqReward := big.NewInt(0)
|
bestTqReward := big.NewInt(0)
|
||||||
for _, m := range bestMsgs {
|
for _, m := range bestMsgs {
|
||||||
bestTqReward.Add(bestTqReward, mp.getGasReward(m, baseFee, ts))
|
bestTqReward.Add(bestTqReward, mp.getGasReward(m, baseFee))
|
||||||
}
|
}
|
||||||
|
|
||||||
totalBestTQReward += float64(bestTqReward.Uint64())
|
totalBestTQReward += float64(bestTqReward.Uint64())
|
||||||
@ -1152,3 +1153,35 @@ func TestCompetitiveMessageSelectionZipf(t *testing.T) {
|
|||||||
t.Logf("Average reward boost across all seeds: %f", rewardBoost)
|
t.Logf("Average reward boost across all seeds: %f", rewardBoost)
|
||||||
t.Logf("Average reward of best ticket across all seeds: %f", tqReward)
|
t.Logf("Average reward of best ticket across all seeds: %f", tqReward)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestGasReward(t *testing.T) {
|
||||||
|
tests := []struct {
|
||||||
|
Premium uint64
|
||||||
|
FeeCap uint64
|
||||||
|
BaseFee uint64
|
||||||
|
GasReward int64
|
||||||
|
}{
|
||||||
|
{Premium: 100, FeeCap: 200, BaseFee: 100, GasReward: 100},
|
||||||
|
{Premium: 100, FeeCap: 200, BaseFee: 210, GasReward: -10},
|
||||||
|
{Premium: 200, FeeCap: 250, BaseFee: 210, GasReward: 40},
|
||||||
|
{Premium: 200, FeeCap: 250, BaseFee: 2000, GasReward: -1750},
|
||||||
|
}
|
||||||
|
|
||||||
|
mp := new(MessagePool)
|
||||||
|
for _, test := range tests {
|
||||||
|
test := test
|
||||||
|
t.Run(fmt.Sprintf("%v", test), func(t *testing.T) {
|
||||||
|
msg := &types.SignedMessage{
|
||||||
|
Message: types.Message{
|
||||||
|
GasLimit: 10,
|
||||||
|
GasFeeCap: types.NewInt(test.FeeCap),
|
||||||
|
GasPremium: types.NewInt(test.Premium),
|
||||||
|
},
|
||||||
|
}
|
||||||
|
rew := mp.getGasReward(msg, types.NewInt(test.BaseFee))
|
||||||
|
if rew.Cmp(big.NewInt(test.GasReward*10)) != 0 {
|
||||||
|
t.Errorf("bad reward: expected %d, got %s", test.GasReward*10, rew)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user