code: func (s *Simulation) AddNode(opts ...AddNodeOption) (id enode.ID, err error) {
  	conf := adapters.RandomNodeConfig()
  	for _, o := range opts {
  		o(conf)
  	}
  	if len(conf.Services) == 0 {
  		conf.Services = s.serviceNames
  	}
  
  	// add ENR records to the underlying node
  	// most importantly the bzz overlay address
  	//
  	// for now we have no way of setting bootnodes or lightnodes in sims
  	// so we just let them be set to false
  	// they should perhaps be possible to override them with AddNodeOption
  	bzzPrivateKey, err := BzzPrivateKeyFromConfig(conf)
  	if err != nil {
  		return enode.ID{}, err
  	}
  
  	enodeParams := &network.EnodeParams{
  		PrivateKey: bzzPrivateKey,
  	}
  	record, err := network.NewEnodeRecord(enodeParams)
  	conf.Record = *record
  
  	// Add the bzz address to the node config
  	node, err := s.Net.NewNodeWithConfig(conf)
  	if err != nil {
  		return id, err
  	}
  	s.buckets[node.ID()] = new(sync.Map)
  	s.SetNodeItem(node.ID(), BucketKeyBzzPrivateKey, bzzPrivateKey)
  
  	return node.ID(), s.Net.Start(node.ID())
  }
docs: // AddNode creates a new node with random configuration,
  // applies provided options to the config and adds the node to network.
  // By default all services will be started on a node. If one or more
  // AddNodeWithService option are provided, only specified services will be started.