Ejemplo n.º 1
0
// NewIpfsNode constructs a new IpfsNode based on the given config.
func NewIpfsNode(cfg *config.Config, online bool) (*IpfsNode, error) {
	if cfg == nil {
		return nil, fmt.Errorf("configuration required")
	}

	d, err := makeDatastore(cfg.Datastore)
	if err != nil {
		return nil, err
	}

	local, err := initIdentity(cfg)
	if err != nil {
		return nil, err
	}

	var (
		net   *swarm.Swarm
		peers *peer.Map
		// TODO: refactor so we can use IpfsRouting interface instead of being DHT-specific
		route *dht.IpfsDHT
		swap  *bitswap.BitSwap
	)

	if online {
		net = swarm.NewSwarm(local)
		err = net.Listen()
		if err != nil {
			return nil, err
		}

		peers = &peer.Map{}

		route = dht.NewDHT(local, net, d)
		route.Start()

		swap = bitswap.NewBitSwap(local, net, d, route)
		swap.SetStrategy(bitswap.YesManStrategy)

		go initConnections(cfg, peers, route)
	}

	bs, err := bserv.NewBlockService(d, swap)
	if err != nil {
		return nil, err
	}

	dag := &merkledag.DAGService{Blocks: bs}

	return &IpfsNode{
		Config:    cfg,
		PeerMap:   peers,
		Datastore: d,
		Blocks:    bs,
		DAG:       dag,
		Resolver:  &path.Resolver{DAG: dag},
		BitSwap:   swap,
		Identity:  local,
		Routing:   route,
	}, nil
}
Ejemplo n.º 2
0
func initConnections(cfg *config.Config, peers *peer.Map, route *dht.IpfsDHT) {
	for _, sp := range cfg.Peers {
		maddr, err := ma.NewMultiaddr(sp.Address)
		if err != nil {
			u.PErr("error: %v\n", err)
			continue
		}

		p, err := route.Connect(maddr)
		if err != nil {
			u.PErr("Bootstrapping error: %v\n", err)
		}

		(*peers)[p.Key()] = p
	}
}