兄弟連Go語言+區(qū)塊鏈技術(shù)培訓以太坊源碼分析(39)geth啟動流程分析_第1頁
兄弟連Go語言+區(qū)塊鏈技術(shù)培訓以太坊源碼分析(39)geth啟動流程分析_第2頁
兄弟連Go語言+區(qū)塊鏈技術(shù)培訓以太坊源碼分析(39)geth啟動流程分析_第3頁
已閱讀5頁,還剩6頁未讀, 繼續(xù)免費閱讀

付費下載

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

1、 11/11兄弟連Go語言+區(qū)鏈技術(shù)培訓以太坊源碼分析(39)geth啟動流程分析geth是我們的go-ethereum最主要的一個命令行工具。 也是我們的各種網(wǎng)絡的接入點(主網(wǎng)絡main-net 測試網(wǎng)絡test-net 和私有網(wǎng)絡)。支持運行在全節(jié)點模式或者輕量級節(jié)點模式。 其他程序可以通過它暴露的JSON RPC調(diào)用來訪問以太坊網(wǎng)絡的功能。如果什么命令都不輸入直接運行g(shù)eth。 就會默認啟動一個全節(jié)點模式的節(jié)點。 連接到主網(wǎng)絡。 我們看看啟動的主要流程是什么,涉及到了那些組件。# 啟動的main函數(shù) cmd/geth/main.go看到main函數(shù)一上來就直接運行了。 最開始看的時候是有

2、點懵逼的。 后面發(fā)現(xiàn)go語言里面有兩個默認的函數(shù),一個是main()函數(shù)。一個是init()函數(shù)。 go語言會自動按照一定的順序先調(diào)用所有包的init()函數(shù)。然后才會調(diào)用main()函數(shù)。func main() if err := app.Run(os.Args); err != nil fmt.Fprintln(os.Stderr, err)os.Exit(1)main.go的init函數(shù)app是一個三方包gopkg.in/urfave/cli.v1的實例。 這個三方包的用法大致就是首先構(gòu)造這個app對象。 通過代碼配置app對象的行為,提供一些回調(diào)函數(shù)。然后運行的時候直接在main函數(shù)里

3、面運行 app.Run(os.Args)就行了。import (.gopkg.in/urfave/cli.v1)var (app = utils.NewApp(gitCommit, the go-ethereum command line interface)/ flags that configure the nodenodeFlags = cli.Flagutils.IdentityFlag,utils.UnlockedAccountFlag,utils.PasswordFileFlag,utils.BootnodesFlag,.rpcFlags = cli.Flagutils.RPCEn

4、abledFlag,utils.RPCListenAddrFlag,.whisperFlags = cli.Flagutils.WhisperEnabledFlag,.)func init() / Initialize the CLI app and start Geth/ Action字段表示如果用戶沒有輸入其他的子命令的情況下,會調(diào)用這個字段指向的函數(shù)。app.Action = gethapp.HideVersion = true / we have a command to print the versionapp.Copyright = Copyright 2013-2017 The

5、go-ethereum Authors/ Commands 是所有支持的子命令app.Commands = cli.Command/ See chaincmd.go:initCommand,importCommand,exportCommand,removedbCommand,dumpCommand,/ See monitorcmd.go:monitorCommand,/ See accountcmd.go:accountCommand,walletCommand,/ See consolecmd.go:consoleCommand,attachCommand,javascriptComman

6、d,/ See misccmd.go:makecacheCommand,makedagCommand,versionCommand,bugCommand,licenseCommand,/ See config.godumpConfigCommand,sort.Sort(cli.CommandsByName(app.Commands)/ 所有能夠解析的Optionsapp.Flags = append(app.Flags, nodeFlags.)app.Flags = append(app.Flags, rpcFlags.)app.Flags = append(app.Flags, consol

7、eFlags.)app.Flags = append(app.Flags, debug.Flags.)app.Flags = append(app.Flags, whisperFlags.)app.Before = func(ctx *cli.Context) error runtime.GOMAXPROCS(runtime.NumCPU()if err := debug.Setup(ctx); err != nil return err/ Start system runtime metrics collectiongo metrics.CollectProcessMetrics(3 * t

8、ime.Second)utils.SetupNetwork(ctx)return nilapp.After = func(ctx *cli.Context) error debug.Exit()console.Stdin.Close() / Resets terminal mode.return nil如果我們沒有輸入任何的參數(shù),那么會自動調(diào)用geth方法。/ geth is the main entry point into the system if no special subcommand is ran./ It creates a default node based on the

9、command line arguments and runs it in/ blocking mode, waiting for it to be shut down./ 如果沒有指定特殊的子命令,那么geth是系統(tǒng)主要的入口。/ 它會根據(jù)提供的參數(shù)創(chuàng)建一個默認的節(jié)點。并且以阻塞的模式運行這個節(jié)點,等待著節(jié)點被終止。func geth(ctx *cli.Context) error node := makeFullNode(ctx)startNode(ctx, node)node.Wait()return nilmakeFullNode函數(shù),func makeFullNode(ctx *cl

10、i.Context) *node.Node / 根據(jù)命令行參數(shù)和一些特殊的配置來創(chuàng)建一個nodestack, cfg := makeConfigNode(ctx)/ 把eth的服務注冊到這個節(jié)點上面。 eth服務是以太坊的主要的服務。 是以太坊功能的提供者。utils.RegisterEthService(stack, &cfg.Eth)/ Whisper must be explicitly enabled by specifying at least 1 whisper flag or in dev mode/ Whisper是一個新的模塊,用來進行加密通訊的功能。 需要顯式的提供參數(shù)來啟

11、用,或者是處于開發(fā)模式。shhEnabled := enableWhisper(ctx)shhAutoEnabled := !ctx.GlobalIsSet(utils.WhisperEnabledFlag.Name) & ctx.GlobalIsSet(utils.DevModeFlag.Name)if shhEnabled | shhAutoEnabled if ctx.GlobalIsSet(utils.WhisperMaxMessageSizeFlag.Name) cfg.Shh.MaxMessageSize = uint32(ctx.Int(utils.WhisperMaxMessa

12、geSizeFlag.Name)if ctx.GlobalIsSet(utils.WhisperMinPOWFlag.Name) cfg.Shh.MinimumAcceptedPOW = ctx.Float64(utils.WhisperMinPOWFlag.Name)/ 注冊Shh服務utils.RegisterShhService(stack, &cfg.Shh)/ Add the Ethereum Stats daemon if requested.if cfg.Ethstats.URL != / 注冊 以太坊的狀態(tài)服務。 默認情況下是沒有啟動的。utils.RegisterEthSta

13、tsService(stack, cfg.Ethstats.URL)/ Add the release oracle service so it boots along with node./ release oracle服務是用來查看客戶端版本是否是最新版本的服務。/ 如果需要更新。 那么會通過打印日志來提示版本更新。/ release 是通過智能合約的形式來運行的。 后續(xù)會詳細討論這個服務。if err := stack.Register(func(ctx *node.ServiceContext) (node.Service, error) config := release.Confi

14、gOracle: relOracle,Major: uint32(params.VersionMajor),Minor: uint32(params.VersionMinor),Patch: uint32(params.VersionPatch),commit, _ := hex.DecodeString(gitCommit)copy(config.Commit:, commit)return release.NewReleaseService(ctx, config); err != nil utils.Fatalf(Failed to register the Geth release o

15、racle service: %v, err)return stackmakeConfigNode。 這個函數(shù)主要是通過配置文件和flag來生成整個系統(tǒng)的運行配置。func makeConfigNode(ctx *cli.Context) (*node.Node, gethConfig) / Load defaults.cfg := gethConfigEth: eth.DefaultConfig,Shh: whisper.DefaultConfig,Node: defaultNodeConfig(),/ Load config file.if file := ctx.GlobalString

16、(configFileFlag.Name); file != if err := loadConfig(file, &cfg); err != nil utils.Fatalf(%v, err)/ Apply flags.utils.SetNodeConfig(ctx, &cfg.Node)stack, err := node.New(&cfg.Node)if err != nil utils.Fatalf(Failed to create the protocol stack: %v, err)utils.SetEthConfig(ctx, stack, &cfg.Eth)if ctx.Gl

17、obalIsSet(utils.EthStatsURLFlag.Name) cfg.Ethstats.URL = ctx.GlobalString(utils.EthStatsURLFlag.Name)utils.SetShhConfig(ctx, stack, &cfg.Shh)return stack, cfgRegisterEthService/ RegisterEthService adds an Ethereum client to the stack.func RegisterEthService(stack *node.Node, cfg *eth.Config) var err

18、 error/ 如果同步模式是輕量級的同步模式。 那么啟動輕量級的客戶端。if cfg.SyncMode = downloader.LightSync err = stack.Register(func(ctx *node.ServiceContext) (node.Service, error) return les.New(ctx, cfg) else / 否則會啟動全節(jié)點err = stack.Register(func(ctx *node.ServiceContext) (node.Service, error) fullNode, err := eth.New(ctx, cfg)if

19、 fullNode != nil & cfg.LightServ 0 / 默認LightServ的大小是0 也就是不會啟動LesServer/ LesServer是給輕量級節(jié)點提供服務的。ls, _ := les.NewLesServer(fullNode, cfg)fullNode.AddLesServer(ls)return fullNode, err)if err != nil Fatalf(Failed to register the Ethereum service: %v, err)startNode/ startNode boots up the system node and

20、all registered protocols, after which/ it unlocks any requested accounts, and starts the RPC/IPC interfaces and the/ miner.func startNode(ctx *cli.Context, stack *node.Node) / Start up the node itselfutils.StartNode(stack)/ Unlock any account specifically requestedks := stack.AccountManager().Backen

21、ds(keystore.KeyStoreType)0.(*keystore.KeyStore)passwords := utils.MakePasswordList(ctx)unlocks := strings.Split(ctx.GlobalString(utils.UnlockedAccountFlag.Name), ,)for i, account := range unlocks if trimmed := strings.TrimSpace(account); trimmed != unlockAccount(ctx, ks, trimmed, i, passwords)/ Regi

22、ster wallet event handlers to open and auto-derive walletsevents := make(chan accounts.WalletEvent, 16)stack.AccountManager().Subscribe(events)go func() / Create an chain state reader for self-derivationrpcClient, err := stack.Attach()if err != nil utils.Fatalf(Failed to attach to self: %v, err)stat

23、eReader := ethclient.NewClient(rpcClient)/ Open any wallets already attachedfor _, wallet := range stack.AccountManager().Wallets() if err := wallet.Open(); err != nil log.Warn(Failed to open wallet, url, wallet.URL(), err, err)/ Listen for wallet event till terminationfor event := range events swit

24、ch event.Kind case accounts.WalletArrived:if err := event.Wallet.Open(); err != nil log.Warn(New wallet appeared, failed to open, url, event.Wallet.URL(), err, err)case accounts.WalletOpened:status, _ := event.Wallet.Status()log.Info(New wallet appeared, url, event.Wallet.URL(), status, status)if event.Wallet.URL().Scheme = ledger event.Wallet.SelfDerive(accounts.DefaultLedgerBaseDerivationPath, stateReader) else event.Wallet.SelfDerive(accounts.DefaultBaseDerivationPath, stateReader)case accounts.WalletDropped:log.Info(Old wallet dropped, url, event.W

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論