// 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 an initialized Host. func New(cs *consensus.State, hdb modules.HostDB, tpool modules.TransactionPool, wallet modules.Wallet, addr string, saveDir string) (*Host, error) { if cs == nil { return nil, errors.New("host cannot use a nil state") } if hdb == nil { return nil, errors.New("host cannot use a nil hostdb") } if tpool == nil { return nil, errors.New("host cannot use a nil tpool") } if wallet == nil { return nil, errors.New("host cannot use a nil wallet") } coinAddr, _, err := wallet.CoinAddress(false) // false indicates that the address should not be visible to the user. if err != nil { return nil, err } h := &Host{ cs: cs, hostdb: hdb, tpool: tpool, wallet: wallet, // default host settings HostSettings: modules.HostSettings{ TotalStorage: 10e9, // 10 GB MaxFilesize: 1e9, // 1 GB MaxDuration: 144 * 60, // 60 days WindowSize: 288, // 48 hours Price: types.NewCurrency64(100e12), // 0.1 siacoin / mb / week Collateral: types.NewCurrency64(0), UnlockHash: coinAddr, }, saveDir: saveDir, obligationsByID: make(map[types.FileContractID]contractObligation), obligationsByHeight: make(map[types.BlockHeight][]contractObligation), mu: sync.New(modules.SafeMutexDelay, 1), } h.spaceRemaining = h.TotalStorage // Create listener and set address. h.listener, err = net.Listen("tcp", addr) if err != nil { return nil, err } _, port, _ := net.SplitHostPort(h.listener.Addr().String()) h.myAddr = modules.NetAddress(net.JoinHostPort(modules.ExternalIP, port)) err = os.MkdirAll(saveDir, 0700) if err != nil { return nil, err } err = h.load() if err != nil && !os.IsNotExist(err) { return nil, err } // spawn listener go h.listen() h.cs.ConsensusSetSubscribe(h) return h, nil }