From defeba5576398b243cd198e000dc3e6a7cc6beee Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Wed, 21 Oct 2020 15:47:52 -0700 Subject: [PATCH 1/3] Fix lookback for worker key when computing ticket We need to compute the ticket based on our worker key from the lookback epoch, not the current epoch. --- miner/miner.go | 18 +++++++----------- 1 file changed, 7 insertions(+), 11 deletions(-) diff --git a/miner/miner.go b/miner/miner.go index 7451d617adf..7916e0405f1 100644 --- a/miner/miner.go +++ b/miner/miner.go @@ -386,7 +386,7 @@ func (m *Miner) mineOne(ctx context.Context, base *MiningBase) (*types.BlockMsg, rbase = bvals[len(bvals)-1] } - ticket, err := m.computeTicket(ctx, &rbase, base) + ticket, err := m.computeTicket(ctx, &rbase, base, mbi) if err != nil { return nil, xerrors.Errorf("scratching ticket failed: %w", err) } @@ -456,16 +456,7 @@ func (m *Miner) mineOne(ctx context.Context, base *MiningBase) (*types.BlockMsg, return b, nil } -func (m *Miner) computeTicket(ctx context.Context, brand *types.BeaconEntry, base *MiningBase) (*types.Ticket, error) { - mi, err := m.api.StateMinerInfo(ctx, m.address, types.EmptyTSK) - if err != nil { - return nil, err - } - worker, err := m.api.StateAccountKey(ctx, mi.Worker, types.EmptyTSK) - if err != nil { - return nil, err - } - +func (m *Miner) computeTicket(ctx context.Context, brand *types.BeaconEntry, base *MiningBase, mbi *api.MiningBaseInfo) (*types.Ticket, error) { buf := new(bytes.Buffer) if err := m.address.MarshalCBOR(buf); err != nil { return nil, xerrors.Errorf("failed to marshal address to cbor: %w", err) @@ -476,6 +467,11 @@ func (m *Miner) computeTicket(ctx context.Context, brand *types.BeaconEntry, bas buf.Write(base.TipSet.MinTicket().VRFProof) } + worker, err := m.api.StateAccountKey(ctx, mbi.WorkerKey, types.EmptyTSK) + if err != nil { + return nil, err + } + input, err := store.DrawRandomness(brand.Data, crypto.DomainSeparationTag_TicketProduction, round-build.TicketRandomnessLookback, buf.Bytes()) if err != nil { return nil, err From b05613445e709cd89f2f016aeff36fbb0e276a6a Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Wed, 21 Oct 2020 16:08:24 -0700 Subject: [PATCH 2/3] Sign blocks with the worker key from the correct lookback epoch --- chain/gen/mining.go | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/chain/gen/mining.go b/chain/gen/mining.go index 4889c632f2a..5fc56e8b2be 100644 --- a/chain/gen/mining.go +++ b/chain/gen/mining.go @@ -27,7 +27,17 @@ func MinerCreateBlock(ctx context.Context, sm *stmgr.StateManager, w api.WalletA return nil, xerrors.Errorf("failed to load tipset state: %w", err) } - worker, err := stmgr.GetMinerWorkerRaw(ctx, sm, st, bt.Miner) + lbts, err := stmgr.GetLookbackTipSetForRound(ctx, sm, pts, bt.Epoch) + if err != nil { + return nil, xerrors.Errorf("getting lookback miner actor state: %w", err) + } + + lbst, _, err := sm.TipSetState(ctx, lbts) + if err != nil { + return nil, err + } + + worker, err := stmgr.GetMinerWorkerRaw(ctx, sm, lbst, bt.Miner) if err != nil { return nil, xerrors.Errorf("failed to get miner worker: %w", err) } From 59cfabf8a4496716c79a3f449c33019964473e13 Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Thu, 22 Oct 2020 15:48:09 -0700 Subject: [PATCH 3/3] don't resolve the worker key twice --- miner/miner.go | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/miner/miner.go b/miner/miner.go index 7916e0405f1..7de7f5b734b 100644 --- a/miner/miner.go +++ b/miner/miner.go @@ -467,17 +467,12 @@ func (m *Miner) computeTicket(ctx context.Context, brand *types.BeaconEntry, bas buf.Write(base.TipSet.MinTicket().VRFProof) } - worker, err := m.api.StateAccountKey(ctx, mbi.WorkerKey, types.EmptyTSK) - if err != nil { - return nil, err - } - input, err := store.DrawRandomness(brand.Data, crypto.DomainSeparationTag_TicketProduction, round-build.TicketRandomnessLookback, buf.Bytes()) if err != nil { return nil, err } - vrfOut, err := gen.ComputeVRF(ctx, m.api.WalletSign, worker, input) + vrfOut, err := gen.ComputeVRF(ctx, m.api.WalletSign, mbi.WorkerKey, input) if err != nil { return nil, err }