code: func (sn *SimNode) Start(snapshots map[string][]byte) error {
  	newService := func(name string) func(ctx *node.ServiceContext) (node.Service, error) {
  		return func(nodeCtx *node.ServiceContext) (node.Service, error) {
  			ctx := &ServiceContext{
  				RPCDialer:   sn.adapter,
  				NodeContext: nodeCtx,
  				Config:      sn.config,
  			}
  			if snapshots != nil {
  				ctx.Snapshot = snapshots[name]
  			}
  			serviceFunc := sn.adapter.services[name]
  			service, err := serviceFunc(ctx)
  			if err != nil {
  				return nil, err
  			}
  			sn.running[name] = service
  			return service, nil
  		}
  	}
  
  	// ensure we only register the services once in the case of the node
  	// being stopped and then started again
  	var regErr error
  	sn.registerOnce.Do(func() {
  		for _, name := range sn.config.Services {
  			if err := sn.node.Register(newService(name)); err != nil {
  				regErr = err
  				break
  			}
  		}
  	})
  	if regErr != nil {
  		return regErr
  	}
  
  	if err := sn.node.Start(); err != nil {
  		return err
  	}
  
  	// create an in-process RPC client
  	handler, err := sn.node.RPCHandler()
  	if err != nil {
  		return err
  	}
  
  	sn.lock.Lock()
  	sn.client = rpc.DialInProc(handler)
  	sn.lock.Unlock()
  
  	return nil
  }
docs: // Start registers the services and starts the underlying devp2p node