From 50fae56bafdcb9eff1c9ab6c3244914bdc8f3666 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Wed, 13 May 2020 19:32:04 -0700 Subject: [PATCH] Verify data for presealed data --- build/params_2k.go | 2 + chain/gen/gen_test.go | 2 + chain/gen/genesis/genesis.go | 73 +++++++++++++++++++++++++++++++++++ chain/gen/genesis/miners.go | 1 + chain/gen/genesis/t01_init.go | 5 +++ chain/gen/genesis/t06_vreg.go | 27 ++++++++++--- chain/stmgr/forks_test.go | 2 + chain/store/store_test.go | 2 + chain/sync_test.go | 2 + cmd/lotus-seed/main.go | 5 ++- go.mod | 2 +- go.sum | 2 + node/node_test.go | 2 + 13 files changed, 118 insertions(+), 9 deletions(-) diff --git a/build/params_2k.go b/build/params_2k.go index f9ce1cca2..ef1f2ac31 100644 --- a/build/params_2k.go +++ b/build/params_2k.go @@ -7,6 +7,7 @@ import ( "github.com/filecoin-project/specs-actors/actors/abi/big" "github.com/filecoin-project/specs-actors/actors/builtin/miner" "github.com/filecoin-project/specs-actors/actors/builtin/power" + "github.com/filecoin-project/specs-actors/actors/builtin/verifreg" ) func init() { @@ -14,6 +15,7 @@ func init() { miner.SupportedProofTypes = map[abi.RegisteredProof]struct{}{ abi.RegisteredProof_StackedDRG2KiBSeal: {}, } + verifreg.MinVerifiedDealSize = big.NewInt(256) } // Seconds diff --git a/chain/gen/gen_test.go b/chain/gen/gen_test.go index 4deafbe68..69c8587ef 100644 --- a/chain/gen/gen_test.go +++ b/chain/gen/gen_test.go @@ -7,6 +7,7 @@ import ( "github.com/filecoin-project/specs-actors/actors/abi/big" "github.com/filecoin-project/specs-actors/actors/builtin/miner" "github.com/filecoin-project/specs-actors/actors/builtin/power" + "github.com/filecoin-project/specs-actors/actors/builtin/verifreg" _ "github.com/filecoin-project/lotus/lib/sigs/bls" _ "github.com/filecoin-project/lotus/lib/sigs/secp" @@ -17,6 +18,7 @@ func init() { abi.RegisteredProof_StackedDRG2KiBSeal: {}, } power.ConsensusMinerMinPower = big.NewInt(2048) + verifreg.MinVerifiedDealSize = big.NewInt(256) } func testGeneration(t testing.TB, n int, msgs int, sectors int) { diff --git a/chain/gen/genesis/genesis.go b/chain/gen/genesis/genesis.go index d79696e0f..2b7755e56 100644 --- a/chain/gen/genesis/genesis.go +++ b/chain/gen/genesis/genesis.go @@ -5,8 +5,10 @@ import ( "encoding/json" "github.com/filecoin-project/go-amt-ipld/v2" + "github.com/filecoin-project/specs-actors/actors/abi" "github.com/filecoin-project/specs-actors/actors/builtin" "github.com/filecoin-project/specs-actors/actors/builtin/account" + "github.com/filecoin-project/specs-actors/actors/builtin/verifreg" "github.com/filecoin-project/specs-actors/actors/runtime" "github.com/ipfs/go-cid" "github.com/ipfs/go-datastore" @@ -20,6 +22,7 @@ import ( "github.com/filecoin-project/lotus/chain/state" "github.com/filecoin-project/lotus/chain/store" "github.com/filecoin-project/lotus/chain/types" + "github.com/filecoin-project/lotus/chain/vm" "github.com/filecoin-project/lotus/genesis" ) @@ -215,9 +218,72 @@ func MakeInitialStateTree(ctx context.Context, bs bstore.Blockstore, template ge } } + vregroot, err := address.NewIDAddress(80) + if err != nil { + return nil, err + } + + vrst, err := cst.Put(ctx, &account.State{Address: RootVerifierAddr}) + if err != nil { + return nil, err + } + + err = state.SetActor(vregroot, &types.Actor{ + Code: builtin.AccountActorCodeID, + Balance: types.NewInt(0), + Head: vrst, + }) + + if err != nil { + return nil, xerrors.Errorf("setting account from actmap: %w", err) + } + return state, nil } +func VerifyPreSealedData(ctx context.Context, cs *store.ChainStore, stateroot cid.Cid, template genesis.Template) (cid.Cid, error) { + verifNeeds := make(map[address.Address]abi.PaddedPieceSize) + var sum abi.PaddedPieceSize + for _, m := range template.Miners { + for _, s := range m.Sectors { + amt := (1 << 20) + s.Deal.PieceSize + verifNeeds[s.Deal.Client] += amt + sum += amt + } + } + + verifier, err := address.NewIDAddress(80) + if err != nil { + return cid.Undef, err + } + + vm, err := vm.NewVM(stateroot, 0, &fakeRand{}, cs.Blockstore(), &fakedSigSyscalls{cs.VMSys()}) + if err != nil { + return cid.Undef, xerrors.Errorf("failed to create NewVM: %w", err) + } + + _, err = doExecValue(ctx, vm, builtin.VerifiedRegistryActorAddr, RootVerifierAddr, types.NewInt(0), builtin.MethodsVerifiedRegistry.AddVerifier, mustEnc(&verifreg.AddVerifierParams{ + Address: verifier, + Allowance: abi.NewStoragePower(int64(sum*3) / 2), // eh, close enough + + })) + if err != nil { + return cid.Undef, xerrors.Errorf("failed to failed to create verifier: %w", err) + } + + for c, amt := range verifNeeds { + _, err := doExecValue(ctx, vm, builtin.VerifiedRegistryActorAddr, verifier, types.NewInt(0), builtin.MethodsVerifiedRegistry.AddVerifiedClient, mustEnc(&verifreg.AddVerifiedClientParams{ + Address: c, + Allowance: abi.NewStoragePower(int64(amt*12) / 10), + })) + if err != nil { + return cid.Undef, xerrors.Errorf("failed to add verified client: %w", err) + } + } + + return vm.Flush(ctx) +} + func MakeGenesisBlock(ctx context.Context, bs bstore.Blockstore, sys runtime.Syscalls, template genesis.Template) (*GenesisBootstrap, error) { st, err := MakeInitialStateTree(ctx, bs, template) if err != nil { @@ -231,6 +297,13 @@ func MakeGenesisBlock(ctx context.Context, bs bstore.Blockstore, sys runtime.Sys // temp chainstore cs := store.NewChainStore(bs, datastore.NewMapDatastore(), sys) + + // Verify PreSealed Data + stateroot, err = VerifyPreSealedData(ctx, cs, stateroot, template) + if err != nil { + return nil, xerrors.Errorf("failed to verify presealed data: %w", err) + } + stateroot, err = SetupStorageMiners(ctx, cs, stateroot, template.Miners) if err != nil { return nil, xerrors.Errorf("setup storage miners failed: %w", err) diff --git a/chain/gen/genesis/miners.go b/chain/gen/genesis/miners.go index ccf422bbe..51a128d54 100644 --- a/chain/gen/genesis/miners.go +++ b/chain/gen/genesis/miners.go @@ -130,6 +130,7 @@ func SetupStorageMiners(ctx context.Context, cs *store.ChainStore, sroot cid.Cid params := &market.PublishStorageDealsParams{} for _, preseal := range m.Sectors { + preseal.Deal.VerifiedDeal = true params.Deals = append(params.Deals, market.ClientDealProposal{ Proposal: preseal.Deal, ClientSignature: crypto.Signature{Type: crypto.SigTypeBLS}, // TODO: do we want to sign these? Or do we want to fake signatures for genesis setup? diff --git a/chain/gen/genesis/t01_init.go b/chain/gen/genesis/t01_init.go index 1402f7a69..9f0efb0c6 100644 --- a/chain/gen/genesis/t01_init.go +++ b/chain/gen/genesis/t01_init.go @@ -4,6 +4,7 @@ import ( "context" "encoding/json" "fmt" + "github.com/filecoin-project/specs-actors/actors/builtin" init_ "github.com/filecoin-project/specs-actors/actors/builtin/init" @@ -45,6 +46,10 @@ func SetupInitActor(bs bstore.Blockstore, netname string, initialActors []genesi } } + if err := amap.Set(context.TODO(), string(RootVerifierAddr.Bytes()), 80); err != nil { + return nil, err + } + if err := amap.Flush(context.TODO()); err != nil { return nil, err } diff --git a/chain/gen/genesis/t06_vreg.go b/chain/gen/genesis/t06_vreg.go index 3d9c79a96..093925d3e 100644 --- a/chain/gen/genesis/t06_vreg.go +++ b/chain/gen/genesis/t06_vreg.go @@ -14,6 +14,26 @@ import ( "github.com/filecoin-project/lotus/chain/types" ) +var RootVerifierAddr address.Address + +var RootVerifierID address.Address + +func init() { + k, err := address.NewFromString("t3qfoulel6fy6gn3hjmbhpdpf6fs5aqjb5fkurhtwvgssizq4jey5nw4ptq5up6h7jk7frdvvobv52qzmgjinq") + if err != nil { + panic(err) + } + + RootVerifierAddr = k + + idk, err := address.NewFromString("t080") + if err != nil { + panic(err) + } + + RootVerifierID = idk +} + func SetupVerifiedRegistryActor(bs bstore.Blockstore) (*types.Actor, error) { cst := cbor.NewCborStore(bs) @@ -22,12 +42,7 @@ func SetupVerifiedRegistryActor(bs bstore.Blockstore) (*types.Actor, error) { return nil, err } - k, err := address.NewFromString("t3qfoulel6fy6gn3hjmbhpdpf6fs5aqjb5fkurhtwvgssizq4jey5nw4ptq5up6h7jk7frdvvobv52qzmgjinq") - if err != nil { - return nil, err - } - - sms := verifreg.ConstructState(h, k) + sms := verifreg.ConstructState(h, RootVerifierID) stcid, err := cst.Put(context.TODO(), sms) if err != nil { diff --git a/chain/stmgr/forks_test.go b/chain/stmgr/forks_test.go index 72be579b5..a3b01cd84 100644 --- a/chain/stmgr/forks_test.go +++ b/chain/stmgr/forks_test.go @@ -13,6 +13,7 @@ import ( init_ "github.com/filecoin-project/specs-actors/actors/builtin/init" "github.com/filecoin-project/specs-actors/actors/builtin/miner" "github.com/filecoin-project/specs-actors/actors/builtin/power" + "github.com/filecoin-project/specs-actors/actors/builtin/verifreg" "github.com/filecoin-project/specs-actors/actors/runtime" "github.com/filecoin-project/specs-actors/actors/util/adt" "golang.org/x/xerrors" @@ -40,6 +41,7 @@ func init() { abi.RegisteredProof_StackedDRG2KiBSeal: {}, } power.ConsensusMinerMinPower = big.NewInt(2048) + verifreg.MinVerifiedDealSize = big.NewInt(256) } const testForkHeight = 40 diff --git a/chain/store/store_test.go b/chain/store/store_test.go index 1c8b05742..495b91b61 100644 --- a/chain/store/store_test.go +++ b/chain/store/store_test.go @@ -12,6 +12,7 @@ import ( "github.com/filecoin-project/specs-actors/actors/abi/big" "github.com/filecoin-project/specs-actors/actors/builtin/miner" "github.com/filecoin-project/specs-actors/actors/builtin/power" + "github.com/filecoin-project/specs-actors/actors/builtin/verifreg" "github.com/filecoin-project/specs-actors/actors/crypto" "github.com/filecoin-project/lotus/chain/gen" @@ -25,6 +26,7 @@ func init() { abi.RegisteredProof_StackedDRG2KiBSeal: {}, } power.ConsensusMinerMinPower = big.NewInt(2048) + verifreg.MinVerifiedDealSize = big.NewInt(256) } func BenchmarkGetRandomness(b *testing.B) { diff --git a/chain/sync_test.go b/chain/sync_test.go index b6847b0f2..9c7d47bc6 100644 --- a/chain/sync_test.go +++ b/chain/sync_test.go @@ -17,6 +17,7 @@ import ( "github.com/filecoin-project/specs-actors/actors/abi/big" "github.com/filecoin-project/specs-actors/actors/builtin/miner" "github.com/filecoin-project/specs-actors/actors/builtin/power" + "github.com/filecoin-project/specs-actors/actors/builtin/verifreg" "github.com/filecoin-project/lotus/api" "github.com/filecoin-project/lotus/build" @@ -37,6 +38,7 @@ func init() { abi.RegisteredProof_StackedDRG2KiBSeal: {}, } power.ConsensusMinerMinPower = big.NewInt(2048) + verifreg.MinVerifiedDealSize = big.NewInt(256) } const source = 0 diff --git a/cmd/lotus-seed/main.go b/cmd/lotus-seed/main.go index e306e6ba7..4eaeca291 100644 --- a/cmd/lotus-seed/main.go +++ b/cmd/lotus-seed/main.go @@ -4,11 +4,12 @@ import ( "encoding/hex" "encoding/json" "fmt" - "github.com/docker/go-units" - "github.com/filecoin-project/sector-storage/ffiwrapper" "io/ioutil" "os" + "github.com/docker/go-units" + "github.com/filecoin-project/sector-storage/ffiwrapper" + logging "github.com/ipfs/go-log/v2" "github.com/mitchellh/go-homedir" "gopkg.in/urfave/cli.v2" diff --git a/go.mod b/go.mod index f74584466..8ed2a3559 100644 --- a/go.mod +++ b/go.mod @@ -28,7 +28,7 @@ require ( github.com/filecoin-project/go-statestore v0.1.0 github.com/filecoin-project/go-storedcounter v0.0.0-20200421200003-1c99c62e8a5b github.com/filecoin-project/sector-storage v0.0.0-20200513185232-4051533cc4bd - github.com/filecoin-project/specs-actors v0.5.2 + github.com/filecoin-project/specs-actors v0.5.3 github.com/filecoin-project/specs-storage v0.0.0-20200417134612-61b2d91a6102 github.com/filecoin-project/storage-fsm v0.0.0-20200427182014-01487d5ad3c8 github.com/gbrlsnchs/jwt/v3 v3.0.0-beta.1 diff --git a/go.sum b/go.sum index 650a613b9..9e51ed466 100644 --- a/go.sum +++ b/go.sum @@ -197,6 +197,8 @@ github.com/filecoin-project/specs-actors v0.5.1 h1:uBPdtCnGRuBo/BNw9nrnf5NCdsaVJ github.com/filecoin-project/specs-actors v0.5.1/go.mod h1:r5btrNzZD0oBkEz1pohv80gSCXQnqGrD0kYwOTiExyE= github.com/filecoin-project/specs-actors v0.5.2 h1:9Y11ctTaD5ul4L2imC2moPMVEUyIOWT88s9WD3VMj0I= github.com/filecoin-project/specs-actors v0.5.2/go.mod h1:r5btrNzZD0oBkEz1pohv80gSCXQnqGrD0kYwOTiExyE= +github.com/filecoin-project/specs-actors v0.5.3 h1:fdq8Gx0izhnUKl6sYEtI4SUEjT2U6W2w06HeqLz5vmw= +github.com/filecoin-project/specs-actors v0.5.3/go.mod h1:r5btrNzZD0oBkEz1pohv80gSCXQnqGrD0kYwOTiExyE= github.com/filecoin-project/specs-storage v0.0.0-20200410185809-9fbaaa08f275 h1:6OTcpsTQBQM0f/A67oEi4E4YtYd6fzkMqbU8cPIWMMs= github.com/filecoin-project/specs-storage v0.0.0-20200410185809-9fbaaa08f275/go.mod h1:xJ1/xl9+8zZeSSSFmDC3Wr6uusCTxyYPI0VeNVSFmPE= github.com/filecoin-project/specs-storage v0.0.0-20200417134612-61b2d91a6102 h1:T3f/zkuvgtgqcXrb0NO3BicuveGOxxUAMPa/Yif2kuE= diff --git a/node/node_test.go b/node/node_test.go index 4132d02dc..a2c7d2c1b 100644 --- a/node/node_test.go +++ b/node/node_test.go @@ -27,6 +27,7 @@ import ( "github.com/filecoin-project/specs-actors/actors/builtin" saminer "github.com/filecoin-project/specs-actors/actors/builtin/miner" "github.com/filecoin-project/specs-actors/actors/builtin/power" + "github.com/filecoin-project/specs-actors/actors/builtin/verifreg" "github.com/filecoin-project/lotus/api" "github.com/filecoin-project/lotus/api/client" @@ -55,6 +56,7 @@ func init() { saminer.SupportedProofTypes = map[abi.RegisteredProof]struct{}{ abi.RegisteredProof_StackedDRG2KiBSeal: {}, } + verifreg.MinVerifiedDealSize = big.NewInt(256) } func testStorageNode(ctx context.Context, t *testing.T, waddr address.Address, act address.Address, pk crypto.PrivKey, tnd test.TestNode, mn mocknet.Mocknet, opts node.Option) test.TestStorageNode {