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