Skip to content

Commit

Permalink
fix(miner)!: remove DEAL_WEIGHT_MULTIPLIER and its input to QAP calc
Browse files Browse the repository at this point in the history
  • Loading branch information
rvagg committed Sep 10, 2024
1 parent 6e096a2 commit d1961e0
Show file tree
Hide file tree
Showing 3 changed files with 68 additions and 21 deletions.
1 change: 1 addition & 0 deletions builtin/network.go
Original file line number Diff line number Diff line change
Expand Up @@ -51,6 +51,7 @@ var TotalFilecoin = big.Mul(big.NewIntUnsigned(2_000_000_000), TokenPrecision)
var QualityBaseMultiplier = big.NewInt(10)

// Quality multiplier for unverified deals in a sector
// DEPRECATED: This is no longer used, but is kept here for reference.
var DealWeightMultiplier = big.NewInt(10)

// Quality multiplier for verified deals in a sector
Expand Down
36 changes: 15 additions & 21 deletions builtin/v15/miner/policy.go
Original file line number Diff line number Diff line change
Expand Up @@ -141,30 +141,24 @@ const MinSectorExpiration = 180 * builtin.EpochsInDay // PARAM_SPEC
// the associated seal proof's maximum lifetime.
const MaxSectorExpirationExtension = 1278 * builtin.EpochsInDay // PARAM_SPEC

// DealWeight and VerifiedDealWeight are spacetime occupied by regular deals and verified deals in a sector.
// Sum of DealWeight and VerifiedDealWeight should be less than or equal to total SpaceTime of a sector.
// Sectors full of VerifiedDeals will have a SectorQuality of VerifiedDealWeightMultiplier/QualityBaseMultiplier.
// Sectors full of Deals will have a SectorQuality of DealWeightMultiplier/QualityBaseMultiplier.
// Sectors with neither will have a SectorQuality of QualityBaseMultiplier/QualityBaseMultiplier.
// SectorQuality of a sector is a weighted average of multipliers based on their proportions.
func QualityForWeight(size abi.SectorSize, duration abi.ChainEpoch, dealWeight, verifiedWeight abi.DealWeight) abi.SectorQuality {
// QualityForWeight calculates the quality of a sector with the given size, duration, and verified weight.
// VerifiedDealWeight is spacetime occupied by verified pieces in a sector.
// VerifiedDealWeight should be less than or equal to total SpaceTime of a sector.
// Sectors full of VerifiedDeals will have a BigInt of VerifiedDealWeightMultiplier/QualityBaseMultiplier.
// Sectors without VerifiedDeals will have a BigInt of QualityBaseMultiplier/QualityBaseMultiplier.
// BigInt of a sector is a weighted average of multipliers based on their proportions.
func QualityForWeight(size abi.SectorSize, duration abi.ChainEpoch, verifiedWeight abi.DealWeight) abi.SectorQuality {
// sectorSpaceTime = size * duration
sectorSpaceTime := big.Mul(big.NewIntUnsigned(uint64(size)), big.NewInt(int64(duration)))
// totalDealSpaceTime = dealWeight + verifiedWeight
totalDealSpaceTime := big.Add(dealWeight, verifiedWeight)

// Base - all size * duration of non-deals
// weightedBaseSpaceTime = (sectorSpaceTime - totalDealSpaceTime) * QualityBaseMultiplier
weightedBaseSpaceTime := big.Mul(big.Sub(sectorSpaceTime, totalDealSpaceTime), builtin.QualityBaseMultiplier)
// Deal - all deal size * deal duration * 10
// weightedDealSpaceTime = dealWeight * DealWeightMultiplier
weightedDealSpaceTime := big.Mul(dealWeight, builtin.DealWeightMultiplier)
// Base - all size * duration of non-verified deals
// weightedBaseSpaceTime = (sectorSpaceTime - verifiedWeight) * QualityBaseMultiplier
weightedBaseSpaceTime := big.Mul(big.Sub(sectorSpaceTime, verifiedWeight), builtin.QualityBaseMultiplier)
// Verified - all verified deal size * verified deal duration * 100
// weightedVerifiedSpaceTime = verifiedWeight * VerifiedDealWeightMultiplier
weightedVerifiedSpaceTime := big.Mul(verifiedWeight, builtin.VerifiedDealWeightMultiplier)
// Sum - sum of all spacetime
// weightedSumSpaceTime = weightedBaseSpaceTime + weightedDealSpaceTime + weightedVerifiedSpaceTime
weightedSumSpaceTime := big.Sum(weightedBaseSpaceTime, weightedDealSpaceTime, weightedVerifiedSpaceTime)
// weightedSumSpaceTime = weightedBaseSpaceTime + weightedVerifiedSpaceTime
weightedSumSpaceTime := big.Sum(weightedBaseSpaceTime, weightedVerifiedSpaceTime)
// scaledUpWeightedSumSpaceTime = weightedSumSpaceTime * 2^20
scaledUpWeightedSumSpaceTime := big.Lsh(weightedSumSpaceTime, builtin.SectorQualityPrecision)

Expand All @@ -173,15 +167,15 @@ func QualityForWeight(size abi.SectorSize, duration abi.ChainEpoch, dealWeight,
}

// The power for a sector size, committed duration, and weight.
func QAPowerForWeight(size abi.SectorSize, duration abi.ChainEpoch, dealWeight, verifiedWeight abi.DealWeight) abi.StoragePower {
quality := QualityForWeight(size, duration, dealWeight, verifiedWeight)
func QAPowerForWeight(size abi.SectorSize, duration abi.ChainEpoch, verifiedWeight abi.DealWeight) abi.StoragePower {
quality := QualityForWeight(size, duration, verifiedWeight)
return big.Rsh(big.Mul(big.NewIntUnsigned(uint64(size)), quality), builtin.SectorQualityPrecision)
}

// The quality-adjusted power for a sector.
func QAPowerForSector(size abi.SectorSize, sector *SectorOnChainInfo) abi.StoragePower {
duration := sector.Expiration - sector.PowerBaseEpoch
return QAPowerForWeight(size, duration, sector.DealWeight, sector.VerifiedDealWeight)
return QAPowerForWeight(size, duration, sector.VerifiedDealWeight)
}

const MaxAggregatedSectors = 819
Expand Down
52 changes: 52 additions & 0 deletions builtin/v15/miner/policy_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
package miner_test

import (
"testing"

abi "github.com/filecoin-project/go-state-types/abi"
"github.com/filecoin-project/go-state-types/big"
"github.com/filecoin-project/go-state-types/builtin"
v14miner "github.com/filecoin-project/go-state-types/builtin/v14/miner"
"github.com/filecoin-project/go-state-types/builtin/v15/miner"
"github.com/stretchr/testify/require"
)

func TestQualityForWeight(t *testing.T) {
emptyQuality := big.NewInt(1 << builtin.SectorQualityPrecision)
verifiedQuality := big.Mul(emptyQuality, big.Div(builtin.VerifiedDealWeightMultiplier, builtin.QualityBaseMultiplier))
halfVerifiedQuality := big.Add(big.Div(emptyQuality, big.NewInt(2)), big.Div(verifiedQuality, big.NewInt(2)))

sizeRange := []abi.SectorSize{
abi.SectorSize(2 << 10),
abi.SectorSize(8 << 20),
abi.SectorSize(512 << 20),
abi.SectorSize(32 << 30),
abi.SectorSize(64 << 30),
}
durationRange := []abi.ChainEpoch{
abi.ChainEpoch(1),
abi.ChainEpoch(10),
abi.ChainEpoch(1000),
1000 * builtin.EpochsInDay,
}

for _, size := range sizeRange {
for _, duration := range durationRange {
fullWeight := big.NewInt(int64(size) * int64(duration))
halfWeight := big.Div(fullWeight, big.NewInt(2))

require.Equal(t, emptyQuality, miner.QualityForWeight(size, duration, big.Zero()))
require.Equal(t, verifiedQuality, miner.QualityForWeight(size, duration, fullWeight))
require.Equal(t, halfVerifiedQuality, miner.QualityForWeight(size, duration, halfWeight))

// test against old form that takes a dealWeight argument
require.Equal(t, emptyQuality, v14miner.QualityForWeight(size, duration, big.Zero(), big.Zero()))
require.Equal(t, emptyQuality, v14miner.QualityForWeight(size, duration, halfWeight, big.Zero()))
require.Equal(t, emptyQuality, v14miner.QualityForWeight(size, duration, fullWeight, big.Zero()))
require.Equal(t, verifiedQuality, v14miner.QualityForWeight(size, duration, big.Zero(), fullWeight))
require.Equal(t, verifiedQuality, v14miner.QualityForWeight(size, duration, fullWeight, fullWeight))
require.Equal(t, halfVerifiedQuality, v14miner.QualityForWeight(size, duration, big.Zero(), halfWeight))
require.Equal(t, halfVerifiedQuality, v14miner.QualityForWeight(size, duration, halfWeight, halfWeight))
}
}
}

0 comments on commit d1961e0

Please sign in to comment.