github.com/linapex/ethereum-dpos-chinese@v0.0.0-20190316121959-b78b3a4a1ece/swarm/network/simulations/overlay.go (about)

     1  
     2  //<developer>
     3  //    <name>linapex 曹一峰</name>
     4  //    <email>linapex@163.com</email>
     5  //    <wx>superexc</wx>
     6  //    <qqgroup>128148617</qqgroup>
     7  //    <url>https://jsq.ink</url>
     8  //    <role>pku engineer</role>
     9  //    <date>2019-03-16 12:09:48</date>
    10  //</624342674811392000>
    11  
    12  //
    13  //
    14  //
    15  //
    16  //
    17  //
    18  //
    19  //
    20  //
    21  //
    22  //
    23  //
    24  //
    25  //
    26  //
    27  
    28  //
    29  //
    30  //
    31  package main
    32  
    33  import (
    34  	"flag"
    35  	"fmt"
    36  	"net/http"
    37  	"runtime"
    38  	"sync"
    39  	"time"
    40  
    41  	"github.com/ethereum/go-ethereum/log"
    42  	"github.com/ethereum/go-ethereum/node"
    43  	"github.com/ethereum/go-ethereum/p2p/discover"
    44  	"github.com/ethereum/go-ethereum/p2p/simulations"
    45  	"github.com/ethereum/go-ethereum/p2p/simulations/adapters"
    46  	"github.com/ethereum/go-ethereum/swarm/network"
    47  	"github.com/ethereum/go-ethereum/swarm/state"
    48  	colorable "github.com/mattn/go-colorable"
    49  )
    50  
    51  var (
    52  	noDiscovery = flag.Bool("no-discovery", false, "disable discovery (useful if you want to load a snapshot)")
    53  	vmodule     = flag.String("vmodule", "", "log filters for logger via Vmodule")
    54  	verbosity   = flag.Int("verbosity", 0, "log filters for logger via Vmodule")
    55  	httpSimPort = 8888
    56  )
    57  
    58  func init() {
    59  	flag.Parse()
    60  //
    61  //
    62  //
    63  //
    64  //
    65  	if *vmodule != "" {
    66  //
    67  		glogger := log.NewGlogHandler(log.StreamHandler(colorable.NewColorableStderr(), log.TerminalFormat(true)))
    68  		if *verbosity > 0 {
    69  			glogger.Verbosity(log.Lvl(*verbosity))
    70  		}
    71  		glogger.Vmodule(*vmodule)
    72  		log.Root().SetHandler(glogger)
    73  	}
    74  }
    75  
    76  type Simulation struct {
    77  	mtx    sync.Mutex
    78  	stores map[discover.NodeID]*state.InmemoryStore
    79  }
    80  
    81  func NewSimulation() *Simulation {
    82  	return &Simulation{
    83  		stores: make(map[discover.NodeID]*state.InmemoryStore),
    84  	}
    85  }
    86  
    87  func (s *Simulation) NewService(ctx *adapters.ServiceContext) (node.Service, error) {
    88  	id := ctx.Config.ID
    89  	s.mtx.Lock()
    90  	store, ok := s.stores[id]
    91  	if !ok {
    92  		store = state.NewInmemoryStore()
    93  		s.stores[id] = store
    94  	}
    95  	s.mtx.Unlock()
    96  
    97  	addr := network.NewAddrFromNodeID(id)
    98  
    99  	kp := network.NewKadParams()
   100  	kp.MinProxBinSize = 2
   101  	kp.MaxBinSize = 4
   102  	kp.MinBinSize = 1
   103  	kp.MaxRetries = 1000
   104  	kp.RetryExponent = 2
   105  	kp.RetryInterval = 1000000
   106  	kad := network.NewKademlia(addr.Over(), kp)
   107  	hp := network.NewHiveParams()
   108  	hp.Discovery = !*noDiscovery
   109  	hp.KeepAliveInterval = 300 * time.Millisecond
   110  
   111  	config := &network.BzzConfig{
   112  		OverlayAddr:  addr.Over(),
   113  		UnderlayAddr: addr.Under(),
   114  		HiveParams:   hp,
   115  	}
   116  
   117  	return network.NewBzz(config, kad, store, nil, nil), nil
   118  }
   119  
   120  //
   121  func newSimulationNetwork() *simulations.Network {
   122  
   123  	s := NewSimulation()
   124  	services := adapters.Services{
   125  		"overlay": s.NewService,
   126  	}
   127  	adapter := adapters.NewSimAdapter(services)
   128  	simNetwork := simulations.NewNetwork(adapter, &simulations.NetworkConfig{
   129  		DefaultService: "overlay",
   130  	})
   131  	return simNetwork
   132  }
   133  
   134  //
   135  func newOverlaySim(sim *simulations.Network) *simulations.Server {
   136  	return simulations.NewServer(sim)
   137  }
   138  
   139  //
   140  func main() {
   141  //
   142  	runtime.GOMAXPROCS(runtime.NumCPU())
   143  //
   144  	runOverlaySim()
   145  }
   146  
   147  func runOverlaySim() {
   148  //
   149  	net := newSimulationNetwork()
   150  //
   151  	sim := newOverlaySim(net)
   152  	log.Info(fmt.Sprintf("starting simulation server on 0.0.0.0:%d...", httpSimPort))
   153  //
   154  	http.ListenAndServe(fmt.Sprintf(":%d", httpSimPort), sim)
   155  }
   156