前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >NFT+DeFi流动性挖矿系统开发策划细节

NFT+DeFi流动性挖矿系统开发策划细节

原创
作者头像
KFZ433
发布2022-06-17 17:25:06
3500
发布2022-06-17 17:25:06
举报
文章被收录于专栏:NFT链游的应用NFT链游的应用

初始化工作

Geth 的 main() 函数非常的简洁,通过 app.Run() 来启动程序

代码语言:javascript
复制
[./cmd/geth/main.go]
func main() {
    if err := app.Run(os.Args); err != nil {
        fmt.Fprintln(os.Stderr, err)
        os.Exit(1)
    }
}

其简洁是得力于 Geth 使用了 gopkg.in/urfave/cli.v1 扩展包,该扩展包用于管理程序的启动,以及命令行解析,其中 app 是该扩展包的一个实例。

在 Go 语言中,在有 init() 函数的情况下,会默认先调用 init() 函数,然后再调用 main() 函数;Geth 几乎在 ./cmd/geth/main.go#init() 中完成了所有的初始化操作:设置程序的子命令集,设置程序入口函数等,下面看下 init() 函数片段:

代码语言:javascript
复制
[./cmd/geth/main.go]
func init() {
    // Initialize the CLI app and start Geth
    app.Action = geth
    app.HideVersion = true // we have a command to print the version 
    app.Copyright = "Copyright 2013-2018 The go-ethereum Authors"
    app.Commands = []cli.Command{
        // See chaincmd.go:
        initCommand,
        importCommand,
        exportCommand,
        importPreimagesCommand,
        ...
    }
    ...
}

在以上代码中,预设了 app 实例的值,其中 app.Action = geth 作为 app.Run() 调用的默认函数,而 app.Commands 保存了子命令实例,通过匹配命令行参数可以调用不同的函数(而不调用 app.Action),使用 Geth 不同的功能,如:开启带控制台的 Geth、使用 Geth 创造创世块等。

节点启动流程

无论是通过 geth() 函数还是其他的命令行参数启动节点,节点的启动流程大致都是相同的,这里以 geth() 为例:

代码语言:javascript
复制
[./cmd/geth/main.go]
func geth(ctx *cli.Context) error {
    node := makeFullNode(ctx)
    startNode(ctx, node)
    node.Wait()
    return nil
}

其中 makeFullNode() 函数将返回一个节点实例,然后通过 startNode() 启动。在 Geth 中,每一个功能模块都被视为一个服务,每一个服务的正常运行驱动着 Geth 的各项功能;makeFullNode() 通过解析命令行参数,注册指定的服务。以下是 makeFullNode() 代码片段:

代码语言:javascript
复制
[./cmd/geth/config.go]
func makeFullNode(ctx *cli.Context) *node.Node {
    stack, cfg := makeConfigNode(ctx)

    utils.RegisterEthService(stack, &cfg.Eth)

    if ctx.GlobalBool(utils.DashboardEnabledFlag.Name) {
        utils.RegisterDashboardService(stack, &cfg.Dashboard, gitCommit)
    }

    ...

    // Add the Ethereum Stats daemon if requested.
    if cfg.Ethstats.URL != "" {
        utils.RegisterEthStatsService(stack, cfg.Ethstats.URL)
    }
    return stack
}

然后通过 startNode() 启动各项服务并运行节点。以下是 Geth 启动流程图:

每个服务正常运行,相互协作,构成了 Geth:

0x03 网络架构

通过 main() 函数的调用,最终启动了 p2p 网络,这一小节对网络架构做详细的分析。

三层架构 以太坊是去中心化的数字货币系统,天然适用 p2p 通信架构,并且在其上还支持了多种协议。在以太坊中,p2p 作为通信链路,用于负载上层协议的传输,可以将其分为三层结构:

  1. 最上层是以太坊中各个协议的具体实现,如 eth 协议、les 协议。
  2. 第二层是以太坊中的 p2p 通信链路层,主要负责启动监听、处理新加入连接或维护连接,为上层协议提供了信道。
  3. 最下面的一层,是由 Go 语言所提供的网络 IO 层,也就是对 TCP/IP 中的网络层及以下的封装。

p2p 通信链路层 从最下层开始逐步分析,第三层是由 Go 语言所封装的网络 IO 层,这里就跳过了,直接分析 p2p 通信链路层。p2p 通信链路层主要做了三项工作:

  1. 由上层协议的数据交付给 p2p 层后,首先通过 RLP 编码。
  2. RLP 编码后的数据将由共享密钥进行加密,保证通信过程中数据的安全。
  3. 最后,将数据流转换为 RLPXFrameRW 帧,便于数据的加密传输和解析。 (以上三点由下文做分析)

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 0x03 网络架构
相关产品与服务
区块链
云链聚未来,协同无边界。腾讯云区块链作为中国领先的区块链服务平台和技术提供商,致力于构建技术、数据、价值、产业互联互通的区块链基础设施,引领区块链底层技术及行业应用创新,助力传统产业转型升级,推动实体经济与数字经济深度融合。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档