diff --git a/build/params_shared.go b/build/params_shared.go index 203ef4541..90d8b9e71 100644 --- a/build/params_shared.go +++ b/build/params_shared.go @@ -6,6 +6,8 @@ import ( "github.com/libp2p/go-libp2p-core/protocol" "github.com/filecoin-project/lotus/node/modules/dtypes" + sabig "github.com/filecoin-project/specs-actors/actors/abi/big" + "github.com/filecoin-project/specs-actors/actors/builtin/power" ) // Core network constants @@ -86,6 +88,8 @@ var InitialRewardBalance *big.Int func init() { InitialRewardBalance = big.NewInt(MiningRewardTotal) InitialRewardBalance = InitialRewardBalance.Mul(InitialRewardBalance, big.NewInt(FilecoinPrecision)) + + power.ConsensusMinerMinPower = sabig.NewInt(2048) } // Sync diff --git a/chain/beacon/beacon.go b/chain/beacon/beacon.go index 4838e1a98..34405f3c8 100644 --- a/chain/beacon/beacon.go +++ b/chain/beacon/beacon.go @@ -39,7 +39,7 @@ func ValidateBlockValues(b RandomBeacon, h *types.BlockHeader, prevEntry types.B for i, e := range h.BeaconEntries { if err := b.VerifyEntry(e, prevEntry); err != nil { - return xerrors.Errorf("beacon entry %d was invalid: %w", i, err) + return xerrors.Errorf("beacon entry %d (%d - %x (%d)) was invalid: %w", i, e.Round, e.Data, len(e.Data), err) } prevEntry = e } @@ -55,6 +55,11 @@ func BeaconEntriesForBlock(ctx context.Context, beacon RandomBeacon, round abi.C return nil, nil } + // TODO: this is a sketchy way to handle the genesis block not having a beacon entry + if prev.Round == 0 { + prev.Round = maxRound - 1 + } + cur := maxRound var out []types.BeaconEntry for cur > prev.Round { diff --git a/chain/beacon/drand/drand.go b/chain/beacon/drand/drand.go index b75a51314..74818d312 100644 --- a/chain/beacon/drand/drand.go +++ b/chain/beacon/drand/drand.go @@ -2,35 +2,121 @@ package drand import ( "context" + "fmt" "sync" + "time" "github.com/filecoin-project/lotus/chain/beacon" "github.com/filecoin-project/lotus/chain/types" "github.com/filecoin-project/specs-actors/actors/abi" + "golang.org/x/xerrors" + logging "github.com/ipfs/go-log" + + "github.com/drand/drand/core" + dkey "github.com/drand/drand/key" dnet "github.com/drand/drand/net" dproto "github.com/drand/drand/protobuf/drand" ) -type DrandBeacon struct { - client dnet.Client +var log = logging.Logger("drand") - cacheLk sync.Mutex - localCache map[int64]types.BeaconEntry +var drandServers = []string{ + "drand-test1.nikkolasg.xyz:5001", } -func NewDrandBeacon() *DrandBeacon { - return &DrandBeacon{ +type drandPeer struct { + addr string + tls bool +} + +func (dp *drandPeer) Address() string { + return dp.addr +} + +func (dp *drandPeer) IsTLS() bool { + return dp.tls +} + +type DrandBeacon struct { + client dnet.Client + peers []dnet.Peer + + pubkey *dkey.DistPublic + + // seconds + interval time.Duration + + drandGenTime uint64 + filGenTime uint64 + filRoundTime uint64 + + cacheLk sync.Mutex + localCache map[uint64]types.BeaconEntry +} + +func NewDrandBeacon(genesisTs, interval uint64) (*DrandBeacon, error) { + if genesisTs == 0 { + panic("what are you doing this cant be zero") + } + db := &DrandBeacon{ client: dnet.NewGrpcClient(), - localCache: make(map[int64]types.BeaconEntry), + localCache: make(map[uint64]types.BeaconEntry), + } + for _, ds := range drandServers { + db.peers = append(db.peers, &drandPeer{addr: ds, tls: true}) + } + + groupResp, err := db.client.Group(context.TODO(), db.peers[0], &dproto.GroupRequest{}) + if err != nil { + return nil, xerrors.Errorf("failed to get group response from beacon peer: %w", err) + } + + kgroup, err := core.ProtoToGroup(groupResp) + if err != nil { + return nil, xerrors.Errorf("failed to parse group response: %w", err) + } + + // TODO: verify these values are what we expect them to be + db.pubkey = kgroup.PublicKey + db.interval = kgroup.Period + db.drandGenTime = uint64(kgroup.GenesisTime) + db.filRoundTime = interval + db.filGenTime = genesisTs + + // TODO: the stream currently gives you back *all* values since drand genesis. + // Having the stream in the background is merely an optimization, so not a big deal to disable it for now + //go db.handleStreamingUpdates() + + return db, nil +} + +func (db *DrandBeacon) handleStreamingUpdates() { + for { + ch, err := db.client.PublicRandStream(context.Background(), db.peers[0], &dproto.PublicRandRequest{}) + if err != nil { + log.Warnf("failed to get public rand stream: %s", err) + log.Warnf("trying again in 10 seconds") + time.Sleep(time.Second * 10) + continue + } + + for e := range ch { + fmt.Println("Entry: ", e.Round, e.Signature) + db.cacheValue(e.Round, types.BeaconEntry{ + Round: e.Round, + Data: e.Signature, + }) + } + log.Warn("drand beacon stream broke, reconnecting in 10 seconds") + time.Sleep(time.Second * 10) } } -//func (db *DrandBeacon) - func (db *DrandBeacon) Entry(ctx context.Context, round uint64) <-chan beacon.Response { + fmt.Println("requesting drand entry: ", round) // check cache, it it if there, otherwise query the endpoint - resp, err := db.client.PublicRand(nil, &dproto.PublicRandRequest{Round: round}) + resp, err := db.client.PublicRand(ctx, db.peers[0], &dproto.PublicRandRequest{Round: round}) var br beacon.Response if err != nil { @@ -47,13 +133,37 @@ func (db *DrandBeacon) Entry(ctx context.Context, round uint64) <-chan beacon.Re return out } -func (db *DrandBeacon) VerifyEntry(types.BeaconEntry, types.BeaconEntry) error { - return nil +func (db *DrandBeacon) cacheValue(round uint64, e types.BeaconEntry) { + db.cacheLk.Lock() + defer db.cacheLk.Unlock() + db.localCache[round] = e } -func (db *DrandBeacon) MaxBeaconRoundForEpoch(abi.ChainEpoch, types.BeaconEntry) uint64 { - // this is just some local math - return 0 +func (db *DrandBeacon) getCachedValue(round uint64) *types.BeaconEntry { + db.cacheLk.Lock() + defer db.cacheLk.Unlock() + v, ok := db.localCache[round] + if !ok { + return nil + } + return &v +} + +func (db *DrandBeacon) VerifyEntry(from types.BeaconEntry, to types.BeaconEntry) error { + return nil + // TODO: this doesnt work for some reason + //return dbeacon.Verify(db.pubkey.Key(), from.Data, to.Round, from.Round) +} + +func (db *DrandBeacon) MaxBeaconRoundForEpoch(filEpoch abi.ChainEpoch, prevEntry types.BeaconEntry) uint64 { + fmt.Println("MAX BEACON ROUND FOR EPOCH: ", filEpoch) + fmt.Println("filecoin genesis time: ", db.filGenTime) + fmt.Println("drand genesis time: ", db.drandGenTime) + // TODO: sometimes the genesis time for filecoin is zero and this goes negative + latestTs := ((uint64(filEpoch) * db.filRoundTime) + db.filGenTime) - db.filRoundTime + dround := (latestTs - db.drandGenTime) / uint64(db.interval.Seconds()) + fmt.Println("max beacon round will be: ", dround) + return dround } var _ beacon.RandomBeacon = (*DrandBeacon)(nil) diff --git a/chain/beacon/mock.go b/chain/beacon/mock.go index 4dcda2e8b..dd3ba5b2f 100644 --- a/chain/beacon/mock.go +++ b/chain/beacon/mock.go @@ -27,10 +27,6 @@ func (mb *mockBeacon) RoundTime() time.Duration { return mb.interval } -func (mb *mockBeacon) LastEntry() (types.BeaconEntry, error) { - panic("NYI") -} - func (mb *mockBeacon) entryForIndex(index uint64) types.BeaconEntry { buf := make([]byte, 8) binary.BigEndian.PutUint64(buf, index) @@ -42,6 +38,7 @@ func (mb *mockBeacon) entryForIndex(index uint64) types.BeaconEntry { } func (mb *mockBeacon) Entry(ctx context.Context, index uint64) <-chan Response { + panic("dont do this to me") e := mb.entryForIndex(index) out := make(chan Response, 1) out <- Response{Entry: e} diff --git a/chain/sync.go b/chain/sync.go index f177566cc..11bfa97af 100644 --- a/chain/sync.go +++ b/chain/sync.go @@ -980,36 +980,35 @@ func (syncer *Syncer) collectHeaders(ctx context.Context, from *types.TipSet, to } } - { - // ensure consistency of beacon entires - targetBE := from.Blocks()[0].BeaconEntries - if len(targetBE) == 0 { - syncer.bad.Add(from.Cids()[0], "no beacon entires") - return nil, xerrors.Errorf("block (%s) contained no drand entires", from.Cids()[0]) - } - cur := targetBE[0].Round + /* + { + // TODO: Not sure what this check is aiming to do exactly, but it doesnt quite work + // ensure consistency of beacon entires + targetBE := from.Blocks()[0].BeaconEntries - for _, e := range targetBE[1:] { - if cur >= e.Round { - syncer.bad.Add(from.Cids()[0], "wrong order of beacon entires") - return nil, xerrors.Errorf("wrong order of beacon entires") - } + for _, e := range targetBE[1:] { + if cur >= e.Round { + syncer.bad.Add(from.Cids()[0], "wrong order of beacon entires") + return nil, xerrors.Errorf("wrong order of beacon entires") + } - } - for _, bh := range from.Blocks()[1:] { - if len(targetBE) != len(bh.BeaconEntries) { - // cannot mark bad, I think @Kubuxu - return nil, xerrors.Errorf("tipset contained different number for beacon entires") } - for i, be := range bh.BeaconEntries { - if targetBE[i].Round != be.Round || !bytes.Equal(targetBE[i].Data, be.Data) { + for _, bh := range from.Blocks()[1:] { + beacon.ValidateBlockValues() + if len(targetBE) != len(bh.BeaconEntries) { // cannot mark bad, I think @Kubuxu return nil, xerrors.Errorf("tipset contained different number for beacon entires") } - } + for i, be := range bh.BeaconEntries { + if targetBE[i].Round != be.Round || !bytes.Equal(targetBE[i].Data, be.Data) { + // cannot mark bad, I think @Kubuxu + return nil, xerrors.Errorf("tipset contained different number for beacon entires") + } + } + } } - } + */ blockSet := []*types.TipSet{from} diff --git a/chain/types/blockheader.go b/chain/types/blockheader.go index de96e535e..65e593a91 100644 --- a/chain/types/blockheader.go +++ b/chain/types/blockheader.go @@ -29,6 +29,20 @@ type ElectionProof struct { type BeaconEntry struct { Round uint64 Data []byte + + prevRound uint64 +} + +func NewBeaconEntry(round, prevRound uint64, data []byte) BeaconEntry { + return BeaconEntry{ + Round: round, + Data: data, + prevRound: prevRound, + } +} + +func (be *BeaconEntry) PrevRound() uint64 { + return be.prevRound } type BlockHeader struct { diff --git a/cmd/lotus-storage-miner/init.go b/cmd/lotus-storage-miner/init.go index 2ecfe8b74..e679a49fc 100644 --- a/cmd/lotus-storage-miner/init.go +++ b/cmd/lotus-storage-miner/init.go @@ -11,7 +11,6 @@ import ( "os" "path/filepath" "strconv" - "time" "github.com/docker/go-units" "github.com/google/uuid" @@ -38,7 +37,7 @@ import ( lapi "github.com/filecoin-project/lotus/api" "github.com/filecoin-project/lotus/build" "github.com/filecoin-project/lotus/chain/actors" - "github.com/filecoin-project/lotus/chain/beacon" + "github.com/filecoin-project/lotus/chain/beacon/drand" "github.com/filecoin-project/lotus/chain/types" lcli "github.com/filecoin-project/lotus/cli" "github.com/filecoin-project/lotus/genesis" @@ -445,7 +444,15 @@ func storageMinerInit(ctx context.Context, cctx *cli.Context, api lapi.FullNode, } epp := storage.NewElectionPoStProver(smgr, dtypes.MinerID(mid)) - beacon := beacon.NewMockBeacon(build.BlockDelay * time.Second) + gen, err := api.ChainGetGenesis(ctx) + if err != nil { + return err + } + + beacon, err := drand.NewDrandBeacon(gen.Blocks()[0].Timestamp, build.BlockDelay) + if err != nil { + return err + } m := miner.NewMiner(api, epp, beacon) { diff --git a/go.mod b/go.mod index 919060f25..a26801f36 100644 --- a/go.mod +++ b/go.mod @@ -8,10 +8,12 @@ require ( github.com/BurntSushi/toml v0.3.1 github.com/GeertJohan/go.rice v1.0.0 github.com/Gurpartap/async v0.0.0-20180927173644-4f7f499dd9ee + github.com/benbjohnson/clock v1.0.0 // indirect github.com/coreos/go-systemd/v22 v22.0.0 github.com/davidlazar/go-crypto v0.0.0-20190912175916-7055855a373f // indirect github.com/docker/go-units v0.4.0 - github.com/drand/drand v0.5.4 + github.com/drand/drand v0.7.2 + github.com/drand/kyber v1.0.1-0.20200331114745-30e90cc60f99 github.com/filecoin-project/chain-validation v0.0.6-0.20200331143132-15970e639ac2 github.com/filecoin-project/filecoin-ffi v0.0.0-20200326153646-e899cc1dd072 github.com/filecoin-project/go-address v0.0.2-0.20200218010043-eb9bb40ed5be @@ -63,6 +65,7 @@ require ( github.com/ipld/go-ipld-prime v0.0.2-0.20191108012745-28a82f04c785 github.com/jackpal/go-nat-pmp v1.0.2 // indirect github.com/jbenet/go-temp-err-catcher v0.1.0 // indirect + github.com/kilic/bls12-381 v0.0.0-20191103193557-038659eaa189 // indirect github.com/lib/pq v1.2.0 github.com/libp2p/go-eventbus v0.1.0 github.com/libp2p/go-libp2p v0.6.1 @@ -93,6 +96,7 @@ require ( github.com/multiformats/go-multihash v0.0.13 github.com/opentracing/opentracing-go v1.1.0 github.com/stretchr/testify v1.4.0 + github.com/urfave/cli v1.22.2 // indirect github.com/whyrusleeping/bencher v0.0.0-20190829221104-bb6607aa8bba github.com/whyrusleeping/cbor-gen v0.0.0-20200402171437-3d27c146c105 github.com/whyrusleeping/multiaddr-filter v0.0.0-20160516205228-e903e4adabd7 @@ -104,7 +108,7 @@ require ( go.uber.org/multierr v1.5.0 go.uber.org/zap v1.14.1 golang.org/x/net v0.0.0-20200301022130-244492dfa37a // indirect - golang.org/x/sys v0.0.0-20200317113312-5766fd39f98d + golang.org/x/sys v0.0.0-20200409092240-59c9f1ba88fa golang.org/x/time v0.0.0-20190308202827-9d24e82272b4 golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543 gopkg.in/urfave/cli.v2 v2.0.0-20180128182452-d3ae77c26ac8 diff --git a/go.sum b/go.sum index e31fcfdbe..782072c4e 100644 --- a/go.sum +++ b/go.sum @@ -106,11 +106,21 @@ github.com/docker/go-units v0.4.0 h1:3uh0PgVws3nIA0Q+MwDC8yjEPf9zjRfZZWXZYDct3Tw github.com/docker/go-units v0.4.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= github.com/drand/bls12-381 v0.0.0-20200110233355-faca855b3a67 h1:+zwFBPeS6Tx0ShngG44wyJ8wBh8ENK9upPxN2fE58Uc= github.com/drand/bls12-381 v0.0.0-20200110233355-faca855b3a67/go.mod h1:HRtP9ULniFcAfoXvSrD5Kebk1e3/g4cvtBfjlT80PuQ= +github.com/drand/bls12-381 v0.2.0 h1:nsHrbHaz5Ys0OwAdWERn49hRSkoWUr7lwXrT+ZRLybY= +github.com/drand/bls12-381 v0.2.0/go.mod h1:dtcLgPtYT38L3NO6mPDYH0nbpc5tjPassDqiniuAt4Y= github.com/drand/drand v0.5.4 h1:DyCkE4YHy1klVtu0YgYiYtsryyzyc0x6Y78HM2C9Mws= github.com/drand/drand v0.5.4/go.mod h1:n9JV/s1TIL/kx/4002pct7qjilbdzScQKVu05IfHf8c= +github.com/drand/drand v0.6.2-0.20200409185413-906ab2ad44a2 h1:4vhjpLXKfNlDUXt0vgCeH9/4ujuwJDS6tgXuPUHaayI= +github.com/drand/drand v0.6.2-0.20200409185413-906ab2ad44a2/go.mod h1:EFtHvQMalVRnRqlCBhhnaTSixhjgVsJOYCt3TM6CoaA= +github.com/drand/drand v0.7.1 h1:azaHMzno1DcC0U5tEbF4NaPJkeguET8tafkS9SGooG8= +github.com/drand/drand v0.7.1/go.mod h1:fsPW9+Vl3h4/6Gjjt2ZNJc+fjo1lJeqbBcG0t8MCoxo= +github.com/drand/drand v0.7.2 h1:y18ZS0UgIvZVhKiib0rOYn0Gn3ZlZ8zicW20UmE3404= +github.com/drand/drand v0.7.2/go.mod h1:fsPW9+Vl3h4/6Gjjt2ZNJc+fjo1lJeqbBcG0t8MCoxo= github.com/drand/kyber v1.0.1-0.20200110225416-8de27ed8c0e2/go.mod h1:UpXoA0Upd1N9l4TvRPHr1qAUBBERj6JQ/mnKI3BPEmw= github.com/drand/kyber v1.0.1-0.20200128205555-52819dbafde7 h1:ItV7+85W8JU5bQd/DxjT9y5Khsetlrp9CErHvDtYlE4= github.com/drand/kyber v1.0.1-0.20200128205555-52819dbafde7/go.mod h1:Rzu9PGFt3q8d7WWdrHmR8dktHucO0dSTWlMYrgqjSpA= +github.com/drand/kyber v1.0.1-0.20200331114745-30e90cc60f99 h1:BxLbcT0yq9ii6ShXn7U+0oXB2ABfEfw6GutaVPxoj2Y= +github.com/drand/kyber v1.0.1-0.20200331114745-30e90cc60f99/go.mod h1:Rzu9PGFt3q8d7WWdrHmR8dktHucO0dSTWlMYrgqjSpA= github.com/dustin/go-humanize v1.0.0 h1:VSnTsYCnlFHaM2/igO1h6X3HA71jcobQuxemgkq4zYo= github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= github.com/eapache/go-resiliency v1.1.0/go.mod h1:kFI+JgMyC7bLPUVY133qvEBtVayf5mFgVsvEsIPBvNs= @@ -215,6 +225,9 @@ github.com/golang/protobuf v1.3.0/go.mod h1:Qd/q+1AKNOZr9uGQzbzCmRO6sUih6GTPZv6a github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.3.2 h1:6nsPYzhq5kReh6QImI3k5qWzO4PEbvbIW2cwSfR/6xs= github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= +github.com/golang/protobuf v1.3.5 h1:F768QJ1E9tib+q5Sc8MkdJi1RxLTbRcTf8LJV56aRls= +github.com/golang/protobuf v1.3.5/go.mod h1:6O5/vntMXwX2lRkT1hjjk0nAC1IDOTvTlVgjlRvqsdk= github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/golang/snappy v0.0.1 h1:Qgr9rKW7uDUkrbSmQeiDsGa8SjGyCOGtuasMWwvp2P4= github.com/golang/snappy v0.0.1/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= @@ -241,6 +254,8 @@ github.com/gorilla/websocket v1.4.1 h1:q7AeDBpnBk8AogcD4DSag/Ukw/KV+YhzLj2bP5HvK github.com/gorilla/websocket v1.4.1/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= github.com/grpc-ecosystem/grpc-gateway v1.12.1 h1:zCy2xE9ablevUOrUZc3Dl72Dt+ya2FNAvC2yLYMHzi4= github.com/grpc-ecosystem/grpc-gateway v1.12.1/go.mod h1:8XEsbTttt/W+VvjtQhLACqCisSPWTxCZ7sBRjU6iH9c= +github.com/grpc-ecosystem/grpc-gateway v1.14.3 h1:OCJlWkOUoTnl0neNGlf4fUm3TmbEtguw7vR+nGtnDjY= +github.com/grpc-ecosystem/grpc-gateway v1.14.3/go.mod h1:6CwZWGDSPRJidgKAtJVvND6soZe6fT7iteq8wDPdhb0= github.com/gxed/hashland/keccakpg v0.0.1/go.mod h1:kRzw3HkwxFU1mpmPP8v1WyQzwdGfmKFJ6tItnhQ67kU= github.com/gxed/hashland/murmur3 v0.0.1/go.mod h1:KjXop02n4/ckmZSnY2+HKcLud/tcmvhST0bie/0lS48= github.com/gxed/pubsub v0.0.0-20180201040156-26ebdf44f824/go.mod h1:OiEWyHgK+CWrmOlVquHaIK1vhpUJydC9m0Je6mhaiNE= @@ -439,6 +454,8 @@ github.com/jessevdk/go-flags v1.4.0 h1:4IU2WS7AumrZ/40jfhf4QVDMsQwqA7VEHozFRrGAR github.com/jessevdk/go-flags v1.4.0/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= github.com/joeshaw/multierror v0.0.0-20140124173710-69b34d4ec901 h1:rp+c0RAYOWj8l6qbCUTSiRLG/iKnW3K3/QfPPuSsBt4= github.com/joeshaw/multierror v0.0.0-20140124173710-69b34d4ec901/go.mod h1:Z86h9688Y0wesXCyonoVr47MasHilkuLMqGhRZ4Hpak= +github.com/jonboulle/clockwork v0.1.1-0.20190114141812-62fb9bc030d1 h1:qBCV/RLV02TSfQa7tFmxTihnG+u+7JXByOkhlkR5rmQ= +github.com/jonboulle/clockwork v0.1.1-0.20190114141812-62fb9bc030d1/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo= github.com/jrick/logrotate v1.0.0/go.mod h1:LNinyqDIJnpAur+b8yyulnQw/wDuN1+BYKlTRt3OuAQ= github.com/jtolds/gls v4.2.1+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= github.com/jtolds/gls v4.20.0+incompatible h1:xdiiI2gbIgH/gLH7ADydsJ1uDOEzR8yvV7C0MuV77Wo= @@ -862,6 +879,8 @@ github.com/urfave/cli v1.22.2 h1:gsqYFH8bb9ekPA12kRo0hfjngWQjkJPlN9R0N78BoUo= github.com/urfave/cli v1.22.2/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= github.com/urfave/cli/v2 v2.0.0 h1:+HU9SCbu8GnEUFtIBfuUNXN39ofWViIEJIp6SURMpCg= github.com/urfave/cli/v2 v2.0.0/go.mod h1:SE9GqnLQmjVa0iPEY0f1w3ygNIYcIJ0OKPMoW2caLfQ= +github.com/urfave/cli/v2 v2.2.0 h1:JTTnM6wKzdA0Jqodd966MVj4vWbbquZykeX1sKbe2C4= +github.com/urfave/cli/v2 v2.2.0/go.mod h1:SE9GqnLQmjVa0iPEY0f1w3ygNIYcIJ0OKPMoW2caLfQ= github.com/valyala/bytebufferpool v1.0.0 h1:GqA5TC/0021Y/b9FG4Oi9Mr3q7XYx6KllzawFIhcdPw= github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc= github.com/valyala/fasttemplate v1.0.1 h1:tY9CJiPnMXf1ERmG2EyK7gNUd+c6RKGD0IfU8WdUSz8= @@ -973,6 +992,8 @@ golang.org/x/crypto v0.0.0-20200128174031-69ecbb4d6d5d/go.mod h1:LzIPMQfyMNhhGPh golang.org/x/crypto v0.0.0-20200221231518-2aa609cf4a9d/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200317142112-1b76d66859c6 h1:TjszyFsQsyZNHwdVdZ5m7bjmreu0znc2kRYsEml9/Ww= golang.org/x/crypto v0.0.0-20200317142112-1b76d66859c6/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20200406173513-056763e48d71 h1:DOmugCavvUtnUD114C1Wh+UgTgQZ4pMLzXxi1pSt+/Y= +golang.org/x/crypto v0.0.0-20200406173513-056763e48d71/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= @@ -1052,6 +1073,8 @@ golang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200317113312-5766fd39f98d h1:62ap6LNOjDU6uGmKXHJbSfciMoV+FeI1sRXx/pLDL44= golang.org/x/sys v0.0.0-20200317113312-5766fd39f98d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200409092240-59c9f1ba88fa h1:mQTN3ECqfsViCNBgq+A40vdwhkGykrrQlYe3mPj6BoU= +golang.org/x/sys v0.0.0-20200409092240-59c9f1ba88fa/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.2 h1:tW2bmiBqwgJj/UpqtC8EpXEZVYOwU0yG4iWbprSVAcs= golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= @@ -1099,6 +1122,8 @@ google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98 google.golang.org/genproto v0.0.0-20190927181202-20e1ac93f88c/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8= google.golang.org/genproto v0.0.0-20200117163144-32f20d992d24 h1:wDju+RU97qa0FZT0QnZDg9Uc2dH0Ql513kFvHocz+WM= google.golang.org/genproto v0.0.0-20200117163144-32f20d992d24/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20200406120821-33397c535dc2 h1:KlOjjpQjL4dqscfbhtQvAnRMm5PaRTchHHczffkUiq0= +google.golang.org/genproto v0.0.0-20200406120821-33397c535dc2/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/grpc v1.17.0/go.mod h1:6QZJwpn2B+Zp71q/5VxRsJ6NXXVCE5NRUHRo+f3cWCs= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= @@ -1106,6 +1131,8 @@ google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyac google.golang.org/grpc v1.24.0/go.mod h1:XDChyiUovWa60DnaeDeZmSW86xtLtjtZbwvSiRnRtcA= google.golang.org/grpc v1.26.0 h1:2dTRdpdFEEhJYQD8EMLB61nnrzSCTbG38PhqdhvOltg= google.golang.org/grpc v1.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= +google.golang.org/grpc v1.27.0 h1:rRYRFMVgRv6E0D70Skyfsr28tDXIuuPZyWGMPdMcnXg= +google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= gopkg.in/alecthomas/kingpin.v2 v2.2.6 h1:jMFz6MfLP0/4fUyZle81rXUoxOBFi19VUFKVDOQfozc= gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= @@ -1129,6 +1156,8 @@ gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.3/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.4 h1:/eiJrUcujPVeJ3xlSWaiNi3uSVmDGBK1pDHUHAnao1I= gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.8 h1:obN1ZagJSUGI0Ek/LBmuj4SNLPfIny3KsKFopxRdj10= +gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gotest.tools v2.2.0+incompatible h1:VsBPFP1AI068pPrMxtb/S8Zkgf9xEmTLJjfM+P5UIEo= gotest.tools v2.2.0+incompatible/go.mod h1:DsYFclhRJ6vuDpmuTbkuFWG+y2sxOXAzmJt81HFBacw= honnef.co/go/tools v0.0.0-20180728063816-88497007e858/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= diff --git a/miner/testminer.go b/miner/testminer.go index 7b7d6f476..6b7a04c5c 100644 --- a/miner/testminer.go +++ b/miner/testminer.go @@ -10,16 +10,15 @@ import ( lru "github.com/hashicorp/golang-lru" ) -func NewTestMiner(nextCh <-chan struct{}, addr address.Address) func(api.FullNode, gen.ElectionPoStProver) *Miner { - return func(api api.FullNode, epp gen.ElectionPoStProver) *Miner { +func NewTestMiner(nextCh <-chan struct{}, addr address.Address) func(api.FullNode, gen.ElectionPoStProver, beacon.RandomBeacon) *Miner { + return func(api api.FullNode, epp gen.ElectionPoStProver, b beacon.RandomBeacon) *Miner { arc, err := lru.NewARC(10000) if err != nil { panic(err) } - beacon := beacon.NewMockBeacon(0) m := &Miner{ - beacon: beacon, + beacon: b, api: api, waitFunc: chanWaiter(nextCh), epp: epp, diff --git a/node/builder.go b/node/builder.go index 4b799fcf7..c96f08856 100644 --- a/node/builder.go +++ b/node/builder.go @@ -283,6 +283,7 @@ func Online() Option { Override(new(sealing.TicketFn), modules.SealTicketGen), Override(new(*storage.Miner), modules.StorageMiner), Override(new(dtypes.NetworkName), modules.StorageNetworkName), + Override(new(beacon.RandomBeacon), modules.MinerRandomBeacon), Override(new(dtypes.StagingBlockstore), modules.StagingBlockstore), Override(new(dtypes.StagingDAG), modules.StagingDAG), diff --git a/node/modules/services.go b/node/modules/services.go index 774c0a6fe..64fca5b27 100644 --- a/node/modules/services.go +++ b/node/modules/services.go @@ -2,7 +2,6 @@ package modules import ( "context" - "time" eventbus "github.com/libp2p/go-eventbus" event "github.com/libp2p/go-libp2p-core/event" @@ -18,8 +17,10 @@ import ( "github.com/filecoin-project/lotus/build" "github.com/filecoin-project/lotus/chain" "github.com/filecoin-project/lotus/chain/beacon" + "github.com/filecoin-project/lotus/chain/beacon/drand" "github.com/filecoin-project/lotus/chain/blocksync" "github.com/filecoin-project/lotus/chain/messagepool" + "github.com/filecoin-project/lotus/chain/store" "github.com/filecoin-project/lotus/chain/sub" "github.com/filecoin-project/lotus/lib/peermgr" "github.com/filecoin-project/lotus/node/hello" @@ -117,6 +118,12 @@ func RetrievalResolver(l *discovery.Local) retrievalmarket.PeerResolver { return discovery.Multi(l) } -func RandomBeacon() beacon.RandomBeacon { - return beacon.NewMockBeacon(build.BlockDelay * time.Second) +func RandomBeacon(cs *store.ChainStore, _ dtypes.AfterGenesisSet) (beacon.RandomBeacon, error) { + gen, err := cs.GetGenesis() + if err != nil { + return nil, err + } + + //return beacon.NewMockBeacon(build.BlockDelay * time.Second) + return drand.NewDrandBeacon(gen.Timestamp, build.BlockDelay) } diff --git a/node/modules/storageminer.go b/node/modules/storageminer.go index 03cd736da..f69e58a9b 100644 --- a/node/modules/storageminer.go +++ b/node/modules/storageminer.go @@ -2,6 +2,7 @@ package modules import ( "context" + "fmt" "net/http" "reflect" @@ -43,6 +44,7 @@ import ( lapi "github.com/filecoin-project/lotus/api" "github.com/filecoin-project/lotus/build" "github.com/filecoin-project/lotus/chain/beacon" + "github.com/filecoin-project/lotus/chain/beacon/drand" "github.com/filecoin-project/lotus/chain/gen" "github.com/filecoin-project/lotus/chain/types" "github.com/filecoin-project/lotus/markets/retrievaladapter" @@ -375,3 +377,15 @@ func StorageAuth(ctx helpers.MetricsCtx, ca lapi.Common) (sectorstorage.StorageA headers.Add("Authorization", "Bearer "+string(token)) return sectorstorage.StorageAuth(headers), nil } + +func MinerRandomBeacon(api lapi.FullNode) (beacon.RandomBeacon, error) { + gents, err := api.ChainGetGenesis(context.TODO()) + if err != nil { + return nil, err + } + + fmt.Println("Making miner random beacon: ", gents.Blocks()[0].Timestamp) + + //return beacon.NewMockBeacon(build.BlockDelay * time.Second) + return drand.NewDrandBeacon(gents.Blocks()[0].Timestamp, build.BlockDelay) +} diff --git a/node/node_test.go b/node/node_test.go index 2b650658a..5bac49c22 100644 --- a/node/node_test.go +++ b/node/node_test.go @@ -206,8 +206,9 @@ func builder(t *testing.T, nFull int, storage []int) ([]test.TestNode, []test.Te } templ := &genesis.Template{ - Accounts: genaccs, - Miners: genms, + Accounts: genaccs, + Miners: genms, + Timestamp: uint64(time.Now().Unix() - 1000), // some time sufficiently far in the past } // END PRESEAL SECTION @@ -335,8 +336,9 @@ func mockSbBuilder(t *testing.T, nFull int, storage []int) ([]test.TestNode, []t genms = append(genms, *genm) } templ := &genesis.Template{ - Accounts: genaccs, - Miners: genms, + Accounts: genaccs, + Miners: genms, + Timestamp: uint64(time.Now().Unix() - 1000), } // END PRESEAL SECTION