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