// New returns a ready-to-go miner that is not mining. func New(cs modules.ConsensusSet, tpool modules.TransactionPool, w modules.Wallet, persistDir string) (*Miner, error) { // Create the miner and its dependencies. if cs == nil { return nil, errors.New("miner cannot use a nil state") } if tpool == nil { return nil, errors.New("miner cannot use a nil transaction pool") } if w == nil { return nil, errors.New("miner cannot use a nil wallet") } // Grab some starting block variables. currentBlock := cs.GenesisBlock().ID() currentTarget, exists1 := cs.ChildTarget(currentBlock) earliestTimestamp, exists2 := cs.EarliestChildTimestamp(currentBlock) if build.DEBUG { if !exists1 { panic("could not get child target") } if !exists2 { panic("could not get child earliest timestamp") } } addr, _, err := w.CoinAddress(false) // false indicates that the address should not be visible to the user. if err != nil { return nil, err } // Assemble the miner. m := &Miner{ cs: cs, tpool: tpool, wallet: w, parent: currentBlock, target: currentTarget, earliestTimestamp: earliestTimestamp, address: addr, blockMem: make(map[types.BlockHeader]types.Block), headerMem: make([]types.BlockHeader, headerForWorkMemory), persistDir: persistDir, mu: sync.New(modules.SafeMutexDelay, 1), } err = m.initPersist() if err != nil { return nil, err } m.tpool.TransactionPoolSubscribe(m) return m, nil }
// New returns a ready-to-go miner that is not mining. func New(cs modules.ConsensusSet, tpool modules.TransactionPool, w modules.Wallet, persistDir string) (*Miner, error) { // Create the miner and its dependencies. if cs == nil { return nil, errors.New("miner cannot use a nil state") } if tpool == nil { return nil, errors.New("miner cannot use a nil transaction pool") } if w == nil { return nil, errors.New("miner cannot use a nil wallet") } // Grab some starting block variables. currentBlock := cs.GenesisBlock().ID() currentTarget, exists1 := cs.ChildTarget(currentBlock) earliestTimestamp, exists2 := cs.EarliestChildTimestamp(currentBlock) if build.DEBUG { if !exists1 { panic("could not get child target") } if !exists2 { panic("could not get child earliest timestamp") } } // Assemble the miner. The miner is assembled without an address because // the wallet is likely not unlocked yet. The miner will grab an address // after the miner is unlocked (this must be coded manually for each // function that potentially requires the miner to have an address. m := &Miner{ cs: cs, tpool: tpool, wallet: w, parent: currentBlock, target: currentTarget, earliestTimestamp: earliestTimestamp, blockMem: make(map[types.BlockHeader]*types.Block), arbDataMem: make(map[types.BlockHeader][]byte), headerMem: make([]types.BlockHeader, headerForWorkMemory), persistDir: persistDir, mu: sync.New(modules.SafeMutexDelay, 1), } err := m.initPersist() if err != nil { return nil, err } m.tpool.TransactionPoolSubscribe(m) return m, nil }