github.com/linapex/ethereum-go-chinese@v0.0.0-20190316121929-f8b7a73c3fa1/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 19:16:43</date> 10 //</624450115016331264> 11 12 13 //您可以使用 14 // 15 //开始运行/swarm/network/simulations/overlay.go 16 package main 17 18 import ( 19 "flag" 20 "fmt" 21 "net/http" 22 "runtime" 23 "sync" 24 "time" 25 26 "github.com/ethereum/go-ethereum/log" 27 "github.com/ethereum/go-ethereum/node" 28 "github.com/ethereum/go-ethereum/p2p/enode" 29 "github.com/ethereum/go-ethereum/p2p/simulations" 30 "github.com/ethereum/go-ethereum/p2p/simulations/adapters" 31 "github.com/ethereum/go-ethereum/swarm/network" 32 "github.com/ethereum/go-ethereum/swarm/state" 33 colorable "github.com/mattn/go-colorable" 34 ) 35 36 var ( 37 noDiscovery = flag.Bool("no-discovery", false, "disable discovery (useful if you want to load a snapshot)") 38 vmodule = flag.String("vmodule", "", "log filters for logger via Vmodule") 39 verbosity = flag.Int("verbosity", 0, "log filters for logger via Vmodule") 40 httpSimPort = 8888 41 ) 42 43 func init() { 44 flag.Parse() 45 //初始化记录器 46 //这是有关如何使用vmodule筛选日志的演示 47 //提供-vmodule作为参数和逗号分隔值,例如: 48 //-vmodule overlay_test.go=4,simulations=3 49 //以上示例将overlay-test.go日志设置为级别4,而以“模拟”结尾的包设置为3 50 if *vmodule != "" { 51 //仅当已提供标志时才启用模式匹配处理程序 52 glogger := log.NewGlogHandler(log.StreamHandler(colorable.NewColorableStderr(), log.TerminalFormat(true))) 53 if *verbosity > 0 { 54 glogger.Verbosity(log.Lvl(*verbosity)) 55 } 56 glogger.Vmodule(*vmodule) 57 log.Root().SetHandler(glogger) 58 } 59 } 60 61 type Simulation struct { 62 mtx sync.Mutex 63 stores map[enode.ID]state.Store 64 } 65 66 func NewSimulation() *Simulation { 67 return &Simulation{ 68 stores: make(map[enode.ID]state.Store), 69 } 70 } 71 72 func (s *Simulation) NewService(ctx *adapters.ServiceContext) (node.Service, error) { 73 node := ctx.Config.Node() 74 s.mtx.Lock() 75 store, ok := s.stores[node.ID()] 76 if !ok { 77 store = state.NewInmemoryStore() 78 s.stores[node.ID()] = store 79 } 80 s.mtx.Unlock() 81 82 addr := network.NewAddr(node) 83 84 kp := network.NewKadParams() 85 kp.NeighbourhoodSize = 2 86 kp.MaxBinSize = 4 87 kp.MinBinSize = 1 88 kp.MaxRetries = 1000 89 kp.RetryExponent = 2 90 kp.RetryInterval = 1000000 91 kad := network.NewKademlia(addr.Over(), kp) 92 hp := network.NewHiveParams() 93 hp.Discovery = !*noDiscovery 94 hp.KeepAliveInterval = 300 * time.Millisecond 95 96 config := &network.BzzConfig{ 97 OverlayAddr: addr.Over(), 98 UnderlayAddr: addr.Under(), 99 HiveParams: hp, 100 } 101 102 return network.NewBzz(config, kad, store, nil, nil), nil 103 } 104 105 //创建模拟网络 106 func newSimulationNetwork() *simulations.Network { 107 108 s := NewSimulation() 109 services := adapters.Services{ 110 "overlay": s.NewService, 111 } 112 adapter := adapters.NewSimAdapter(services) 113 simNetwork := simulations.NewNetwork(adapter, &simulations.NetworkConfig{ 114 DefaultService: "overlay", 115 }) 116 return simNetwork 117 } 118 119 //返回新的HTTP服务器 120 func newOverlaySim(sim *simulations.Network) *simulations.Server { 121 return simulations.NewServer(sim) 122 } 123 124 //无功服务器 125 func main() { 126 //CPU优化 127 runtime.GOMAXPROCS(runtime.NumCPU()) 128 //运行SIM 129 runOverlaySim() 130 } 131 132 func runOverlaySim() { 133 //创建模拟网络 134 net := newSimulationNetwork() 135 //用它创建一个HTTP服务器 136 sim := newOverlaySim(net) 137 log.Info(fmt.Sprintf("starting simulation server on 0.0.0.0:%d...", httpSimPort)) 138 //启动HTTP服务器 139 http.ListenAndServe(fmt.Sprintf(":%d", httpSimPort), sim) 140 } 141