From 2a644e2c042f2f597860f3c2bd78401e857ed043 Mon Sep 17 00:00:00 2001 From: Aayush Date: Tue, 10 Oct 2023 16:34:45 -0400 Subject: [PATCH] feat: limit PoSted partitions to 3 --- chain/actors/policy/policy.go | 10 +++++++++- chain/actors/policy/policy.go.template | 10 +++++++++- chain/actors/policy/policy_test.go | 11 ---------- .../en/default-lotus-miner-config.toml | 7 ++----- go.mod | 2 +- go.sum | 4 ++-- node/config/doc_gen.go | 7 ++----- node/config/types.go | 7 ++----- node/impl/full/state.go | 18 +++++++++-------- storage/wdpost/wdpost_run_test.go | 20 +++++++++---------- 10 files changed, 47 insertions(+), 49 deletions(-) diff --git a/chain/actors/policy/policy.go b/chain/actors/policy/policy.go index d927f369f..a0e4728fe 100644 --- a/chain/actors/policy/policy.go +++ b/chain/actors/policy/policy.go @@ -622,7 +622,8 @@ func GetMaxPoStPartitions(nv network.Version, p abi.RegisteredPoStProof) (int, e if err != nil { return 0, err } - return int(uint64(maxSectors) / sectorsPerPart), nil + + return min(miner12.PoStedPartitionsMax, int(uint64(maxSectors)/sectorsPerPart)), nil } func GetDefaultAggregationProof() abi.RegisteredAggregationProof { @@ -865,3 +866,10 @@ func AggregatePreCommitNetworkFee(nwVer network.Version, aggregateSize int, base return big.Zero(), xerrors.Errorf("unsupported network version") } } + +func min(a, b int) int { + if a < b { + return a + } + return b +} diff --git a/chain/actors/policy/policy.go.template b/chain/actors/policy/policy.go.template index c3ce4a9d9..8803c97e6 100644 --- a/chain/actors/policy/policy.go.template +++ b/chain/actors/policy/policy.go.template @@ -252,7 +252,8 @@ func GetMaxPoStPartitions(nv network.Version, p abi.RegisteredPoStProof) (int, e if err != nil { return 0, err } - return int(uint64(maxSectors) / sectorsPerPart), nil + + return min(miner{{.latestVersion}}.PoStedPartitionsMax, int(uint64(maxSectors) / sectorsPerPart)), nil } func GetDefaultAggregationProof() abi.RegisteredAggregationProof { @@ -341,3 +342,10 @@ func AggregatePreCommitNetworkFee(nwVer network.Version, aggregateSize int, base return big.Zero(), xerrors.Errorf("unsupported network version") } } + +func min(a, b int) int { + if a < b { + return a + } + return b +} \ No newline at end of file diff --git a/chain/actors/policy/policy_test.go b/chain/actors/policy/policy_test.go index 726fca95a..5fd4bd7b0 100644 --- a/chain/actors/policy/policy_test.go +++ b/chain/actors/policy/policy_test.go @@ -7,7 +7,6 @@ import ( "github.com/stretchr/testify/require" "github.com/filecoin-project/go-state-types/abi" - "github.com/filecoin-project/go-state-types/network" builtin0 "github.com/filecoin-project/specs-actors/actors/builtin" miner0 "github.com/filecoin-project/specs-actors/actors/builtin/miner" paych0 "github.com/filecoin-project/specs-actors/actors/builtin/paych" @@ -74,13 +73,3 @@ func TestPartitionSizes(t *testing.T) { require.Equal(t, sizeOld, sizeNew) } } - -func TestPoStSize(t *testing.T) { - //stm: @BLOCKCHAIN_POLICY_GET_MAX_POST_PARTITIONS_001 - v12PoStSize, err := GetMaxPoStPartitions(network.Version12, abi.RegisteredPoStProof_StackedDrgWindow64GiBV1) - require.Equal(t, 4, v12PoStSize) - require.NoError(t, err) - v13PoStSize, err := GetMaxPoStPartitions(network.Version13, abi.RegisteredPoStProof_StackedDrgWindow64GiBV1) - require.NoError(t, err) - require.Equal(t, 10, v13PoStSize) -} diff --git a/documentation/en/default-lotus-miner-config.toml b/documentation/en/default-lotus-miner-config.toml index 6f0b2aa7c..794e5cb0f 100644 --- a/documentation/en/default-lotus-miner-config.toml +++ b/documentation/en/default-lotus-miner-config.toml @@ -427,13 +427,10 @@ # env var: LOTUS_PROVING_DISABLEWDPOSTPRECHECKS #DisableWDPoStPreChecks = false - # Maximum number of partitions to prove in a single SubmitWindowPoSt messace. 0 = network limit (10 in nv16) + # Maximum number of partitions to prove in a single SubmitWindowPoSt messace. 0 = network limit (3 in nv21) # # A single partition may contain up to 2349 32GiB sectors, or 2300 64GiB sectors. - # - # The maximum number of sectors which can be proven in a single PoSt message is 25000 in network version 16, which - # means that a single message can prove at most 10 partitions - # + # // # Note that setting this value lower may result in less efficient gas use - more messages will be sent, # to prove each deadline, resulting in more total gas use (but each message will have lower gas limit) # diff --git a/go.mod b/go.mod index 49ca2ff64..4e4d58462 100644 --- a/go.mod +++ b/go.mod @@ -45,7 +45,7 @@ require ( github.com/filecoin-project/go-jsonrpc v0.3.1 github.com/filecoin-project/go-padreader v0.0.1 github.com/filecoin-project/go-paramfetch v0.0.4 - github.com/filecoin-project/go-state-types v0.12.4-0.20231002153316-c656c180c4d2 + github.com/filecoin-project/go-state-types v0.12.4 github.com/filecoin-project/go-statemachine v1.0.3 github.com/filecoin-project/go-statestore v0.2.0 github.com/filecoin-project/go-storedcounter v0.1.0 diff --git a/go.sum b/go.sum index 9f15520e7..1aaf76f5f 100644 --- a/go.sum +++ b/go.sum @@ -338,8 +338,8 @@ github.com/filecoin-project/go-state-types v0.1.0/go.mod h1:ezYnPf0bNkTsDibL/psS github.com/filecoin-project/go-state-types v0.1.6/go.mod h1:UwGVoMsULoCK+bWjEdd/xLCvLAQFBC7EDT477SKml+Q= github.com/filecoin-project/go-state-types v0.1.10/go.mod h1:UwGVoMsULoCK+bWjEdd/xLCvLAQFBC7EDT477SKml+Q= github.com/filecoin-project/go-state-types v0.11.2-0.20230712101859-8f37624fa540/go.mod h1:SyNPwTsU7I22gL2r0OAPcImvLoTVfgRwdK/Y5rR1zz8= -github.com/filecoin-project/go-state-types v0.12.4-0.20231002153316-c656c180c4d2 h1:eZvCTWl1Z3FxKB45gKN4RdDbaI0qBt+w2mG/lFEE3rs= -github.com/filecoin-project/go-state-types v0.12.4-0.20231002153316-c656c180c4d2/go.mod h1:iJTqGdWDvzXhuVf64Lw0hzt4TIoitMo0VgHdxdjNDZI= +github.com/filecoin-project/go-state-types v0.12.4 h1:F1yQRCgFGvg+UmBGWxskHcvNswjh061Ok/kOk0OWhQY= +github.com/filecoin-project/go-state-types v0.12.4/go.mod h1:iJTqGdWDvzXhuVf64Lw0hzt4TIoitMo0VgHdxdjNDZI= github.com/filecoin-project/go-statemachine v0.0.0-20200925024713-05bd7c71fbfe/go.mod h1:FGwQgZAt2Gh5mjlwJUlVB62JeYdo+if0xWxSEfBD9ig= github.com/filecoin-project/go-statemachine v1.0.3 h1:N07o6alys+V1tNoSTi4WuuoeNC4erS/6jE74+NsgQuk= github.com/filecoin-project/go-statemachine v1.0.3/go.mod h1:jZdXXiHa61n4NmgWFG4w8tnqgvZVHYbJ3yW7+y8bF54= diff --git a/node/config/doc_gen.go b/node/config/doc_gen.go index b3df012ea..0aa63bf3a 100644 --- a/node/config/doc_gen.go +++ b/node/config/doc_gen.go @@ -853,13 +853,10 @@ After changing this option, confirm that the new value works in your setup by in Name: "MaxPartitionsPerPoStMessage", Type: "int", - Comment: `Maximum number of partitions to prove in a single SubmitWindowPoSt messace. 0 = network limit (10 in nv16) + Comment: `Maximum number of partitions to prove in a single SubmitWindowPoSt messace. 0 = network limit (3 in nv21) A single partition may contain up to 2349 32GiB sectors, or 2300 64GiB sectors. - -The maximum number of sectors which can be proven in a single PoSt message is 25000 in network version 16, which -means that a single message can prove at most 10 partitions - +// Note that setting this value lower may result in less efficient gas use - more messages will be sent, to prove each deadline, resulting in more total gas use (but each message will have lower gas limit) diff --git a/node/config/types.go b/node/config/types.go index 78f2d1361..28d671a87 100644 --- a/node/config/types.go +++ b/node/config/types.go @@ -290,13 +290,10 @@ type ProvingConfig struct { // 'lotus-miner proving compute window-post 0' DisableWDPoStPreChecks bool - // Maximum number of partitions to prove in a single SubmitWindowPoSt messace. 0 = network limit (10 in nv16) + // Maximum number of partitions to prove in a single SubmitWindowPoSt messace. 0 = network limit (3 in nv21) // // A single partition may contain up to 2349 32GiB sectors, or 2300 64GiB sectors. - // - // The maximum number of sectors which can be proven in a single PoSt message is 25000 in network version 16, which - // means that a single message can prove at most 10 partitions - // + // // // Note that setting this value lower may result in less efficient gas use - more messages will be sent, // to prove each deadline, resulting in more total gas use (but each message will have lower gas limit) // diff --git a/node/impl/full/state.go b/node/impl/full/state.go index 5e137bfc4..b392083e1 100644 --- a/node/impl/full/state.go +++ b/node/impl/full/state.go @@ -934,10 +934,11 @@ func (a *StateAPI) stateComputeDataCIDv1(ctx context.Context, maddr address.Addr return cid.Undef, xerrors.Errorf("computing params for ComputeDataCommitment: %w", err) } ccmt := &types.Message{ - To: market.Address, - From: maddr, - Value: types.NewInt(0), - Method: market.Methods.ComputeDataCommitment, + To: market.Address, + From: maddr, + Value: types.NewInt(0), + // Hard coded, because the method has since been deprecated + Method: 8, Params: ccparams, } r, err := a.StateCall(ctx, ccmt, tsk) @@ -971,10 +972,11 @@ func (a *StateAPI) stateComputeDataCIDv2(ctx context.Context, maddr address.Addr return cid.Undef, xerrors.Errorf("computing params for ComputeDataCommitment: %w", err) } ccmt := &types.Message{ - To: market.Address, - From: maddr, - Value: types.NewInt(0), - Method: market.Methods.ComputeDataCommitment, + To: market.Address, + From: maddr, + Value: types.NewInt(0), + // Hard coded, because the method has since been deprecated + Method: 8, Params: ccparams, } r, err := a.StateCall(ctx, ccmt, tsk) diff --git a/storage/wdpost/wdpost_run_test.go b/storage/wdpost/wdpost_run_test.go index bfc9ef9c1..a3847a6f6 100644 --- a/storage/wdpost/wdpost_run_test.go +++ b/storage/wdpost/wdpost_run_test.go @@ -298,7 +298,7 @@ func TestWDPostDoPostPartLimitConfig(t *testing.T) { //stm: @CHAIN_SYNCER_COLLECT_CHAIN_001, @CHAIN_SYNCER_COLLECT_HEADERS_001, @CHAIN_SYNCER_VALIDATE_TIPSET_001 //stm: @CHAIN_SYNCER_NEW_PEER_HEAD_001, @CHAIN_SYNCER_VALIDATE_MESSAGE_META_001, @CHAIN_SYNCER_STOP_001 ctx := context.Background() - expectedMsgCount := 364 + expectedMsgCount := 8 proofType := abi.RegisteredPoStProof_StackedDrgWindow2KiBV1 postAct := tutils.NewIDAddr(t, 100) @@ -318,15 +318,15 @@ func TestWDPostDoPostPartLimitConfig(t *testing.T) { partitionsPerMsg = minertypes.AddressedPartitionsMax } - partitionCount := 4 * partitionsPerMsg + partitionCount := 5 * partitionsPerMsg // Assert that user config is less than network limit - userPartLimit := 33 - lastMsgParts := 21 - require.Greater(t, partitionCount, userPartLimit) + userPartLimit := 2 + lastMsgParts := 1 + require.Greater(t, partitionsPerMsg, userPartLimit) // Assert that we consts are correct - require.Equal(t, (expectedMsgCount-1)*userPartLimit+lastMsgParts, 4*partitionsPerMsg) + require.Equal(t, (expectedMsgCount-1)*userPartLimit+lastMsgParts, partitionCount) var partitions []api.Partition for p := 0; p < partitionCount; p++ { @@ -398,7 +398,7 @@ func TestBatchPartitionsRecoverySectors(t *testing.T) { mockStgMinerAPI := newMockStorageMinerAPI() - userPartLimit := 4 + userPartLimit := 2 scheduler := &WindowPoStScheduler{ api: mockStgMinerAPI, @@ -426,12 +426,12 @@ func TestBatchPartitionsRecoverySectors(t *testing.T) { } partitions = append(partitions, generatePartition(100, 10)) - expectedBatchLens := []int{4, 1, 1, 4, 2, 1} + expectedBatchLens := []int{2, 2, 1, 1, 2, 2, 2, 1} - batches, err := scheduler.BatchPartitions(partitions, network.Version16) + batches, err := scheduler.BatchPartitions(partitions, network.Version21) require.NoError(t, err) - require.Equal(t, len(batches), 6) + require.Equal(t, len(batches), len(expectedBatchLens)) for i, batch := range batches { require.Equal(t, len(batch), expectedBatchLens[i])