从命令行开始解析同步区块的代码

区块链技术与应用环境部署day-02 无论是哪家公司,都很重视Spring框架技术,重视基础,所以千万别小看任何知识。面试是一个双向选择的过程,不要抱着畏惧的心态去面试,不利于自己的发挥。同时看中的应该不止薪资,还要看你是不是真的喜欢这家公司,好了希望这篇文章对大家有帮助!《一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码》点击传送门即可获取!m: 33%;" />无论是哪家公司,都很重视Spring框架技术,重视基础,所以千万别小看任何知识。面试是一个双向选择的过程,不要抱着畏惧的心态去面试,不利于自己的发挥。 阅读详情

从命令行开始解析同步区块的代码

一.同步简介

我们都知道geth支持三种同步模式

  • fast模式:从开始到结束,获取区块的header,获取区块的body,从创始块开始校验每一个元素,需要下载所有区块数据信息。速度最慢,但是能获取到所有的历史数据。

  • full模式:获取区块的header,获取区块的body,在同步到当前块之前不处理任何事务。然后获得一个快照,此后,像full节点一样进行后面的同步操作。这种方法用得最多,目的在不要在意历史数据,将历史数据按照快照的方式,不逐一验证,沿着区块下载最近数据库中的交易,有可能丢失历史数据。此方法可能会对历史数据有部分丢失,但是不影响今后的使用。

  • light模式:仅获取当前状态。验证元素需要向full节点发起相应的请求。

二.从命令行开始解析同步区块代码

geth的main包配置函数utils.SyncModeFlag,在util包中可以看到Name和Usage参数

nodeFlags = []cli.Flag{
		utils.IdentityFlag,
		utils.UnlockedAccountFlag,
		utils.PasswordFileFlag,
		utils.BootnodesFlag,
		utils.BootnodesV4Flag,
		utils.BootnodesV5Flag,
		utils.DataDirFlag,
		utils.KeyStoreDirFlag,
		utils.NoUSBFlag,
		utils.DashboardEnabledFlag,
		utils.DashboardAddrFlag,
		utils.DashboardPortFlag,
		utils.DashboardRefreshFlag,
		utils.EthashCacheDirFlag,
		utils.EthashCachesInMemoryFlag,
		utils.EthashCachesOnDiskFlag,
		utils.EthashDatasetDirFlag,
		utils.EthashDatasetsInMemoryFlag,
		utils.EthashDatasetsOnDiskFlag,
		utils.TxPoolNoLocalsFlag,
		utils.TxPoolJournalFlag,
		utils.TxPoolRejournalFlag,
		utils.TxPoolPriceLimitFlag,
		utils.TxPoolPriceBumpFlag,
		utils.TxPoolAccountSlotsFlag,
		utils.TxPoolGlobalSlotsFlag,
		utils.TxPoolAccountQueueFlag,
		utils.TxPoolGlobalQueueFlag,
		utils.TxPoolLifetimeFlag,
		utils.FastSyncFlag,
		utils.LightModeFlag,
		utils.SyncModeFlag,
		utils.GCModeFlag,
		utils.LightServFlag,
		utils.LightPeersFlag,
		utils.LightKDFFlag,
		utils.CacheFlag,
		utils.CacheDatabaseFlag,
		utils.CacheGCFlag,
		utils.TrieCacheGenFlag,
		utils.ListenPortFlag,
		utils.MaxPeersFlag,
		utils.MaxPendingPeersFlag,
		utils.EtherbaseFlag,
		utils.GasPriceFlag,
		utils.MinerThreadsFlag,
		utils.MiningEnabledFlag,
		utils.TargetGasLimitFlag,
		utils.NATFlag,
		utils.NoDiscoverFlag,
		utils.DiscoveryV5Flag,
		utils.NetrestrictFlag,
		utils.NodeKeyFileFlag,
		utils.NodeKeyHexFlag,
		utils.DeveloperFlag,
		utils.DeveloperPeriodFlag,
		utils.TestnetFlag,
		utils.RinkebyFlag,
		utils.VMEnableDebugFlag,
		utils.NetworkIdFlag,
		utils.RPCCORSDomainFlag,
		utils.RPCVirtualHostsFlag,
		utils.EthStatsURLFlag,
		utils.MetricsEnabledFlag,
		utils.FakePoWFlag,
		utils.NoCompactionFlag,
		utils.GpoBlocksFlag,
		utils.GpoPercentileFlag,
		utils.ExtraDataFlag,
		configFileFlag,
	}

flag配置详情

defaultSyncMode = eth.DefaultConfig.SyncMode
	SyncModeFlag    = TextMarshalerFlag{
		Name:  "syncmode",
		Usage: `Blockchain sync mode ("fast", "full", or "light")`,
		Value: &defaultSyncMode,
	}

flag相关配置的结构体类型

type TextMarshalerFlag struct {
	Name  string
	Value TextMarshaler
	Usage string
}

TextMarshalerFlag操作的成员方法

func (f TextMarshalerFlag) GetName() string {
	return f.Name
}

func (f TextMarshalerFlag) String() string {
	return fmt.Sprintf("%s \"%v\"\t%v", prefixedNames(f.Name), f.Value, f.Usage)
}

func (f TextMarshalerFlag) Apply(set *flag.FlagSet) {
	eachName(f.Name, func(name string) {
		set.Var(textMarshalerVal{f.Value}, f.Name, f.Usage)
	})
}

从全局的flag配置中返回一个TextMarshalerFlag配置标志

func GlobalTextMarshaler(ctx *cli.Context, name string) TextMarshaler {
	val := ctx.GlobalGeneric(name)
	if val == nil {
		return nil
	}
	return val.(textMarshalerVal).v
}

默认配置使用主网络的代码

var DefaultConfig = Config{
	SyncMode: downloader.FastSync,
	Ethash: ethash.Config{
		CacheDir:       "ethash",
		CachesInMem:    2,
		CachesOnDisk:   3,
		DatasetsInMem:  1,
		DatasetsOnDisk: 2,
	},
	NetworkId:     1,
	LightPeers:    100,
	DatabaseCache: 768,
	TrieCache:     256,
	TrieTimeout:   5 * time.Minute,
	GasPrice:      big.NewInt(18 * params.Shannon),

	TxPool: core.DefaultTxPoolConfig,
	GPO: gasprice.Config{
		Blocks:     20,
		Percentile: 60,
	},
}

下载模式配置的代码,本段代码存在于eth包中的config.go的config结构体内部

SyncMode  downloader.SyncMode

同步的类型是SyncMode,而SyncMode的真实类型是int。const常量的定义给不同模式分别赋值:

  • full:0

  • fast: 1

  • light: 2

      type SyncMode int
      
      const (
      	FullSync  SyncMode = iota // Synchronise the entire blockchain history from full blocks
      	FastSync                  // Quickly download the headers, full sync only at the chain head
      	LightSync                 // Download only the headers and terminate afterwards
      )
    

整个模式的变更代码请看downloader包中的modes.go

此方法比较简单,当传入的mode大于等于0并且小于等于2时返回true。可以简单理解为是一个合法性的校验

func (mode SyncMode) IsValid() bool {
	return mode >= FullSync && mode <= LightSync
}

此段代码实现了stringer的接口,当被调用时会返回对应的字符串描述:full,fast,light,unknown。此方法类似与Java中的toString方法。

func (mode SyncMode) String() string {
	switch mode {
	case FullSync:
		return "full"
	case FastSync:
		return "fast"
	case LightSync:
		return "light"
	default:
		return "unknown"
	}
}

此方法实现了encoding包下的TextMarshaler接口的MarshalText方法,根据传入的同步类型值返回字符串编码(UTF-8-encoded)之后的文本内容。可以简单理解为SyncMode(int)和文本内容的转换。

func (mode SyncMode) MarshalText() ([]byte, error) {
	switch mode {
	case FullSync:
		return []byte("full"), nil
	case FastSync:
		return []byte("fast"), nil
	case LightSync:
		return []byte("light"), nil
	default:
		return nil, fmt.Errorf("unknown sync mode %d", mode)
	}
}

此方法实现了encoding包下的TextUnmarshaler接口的UnmarshalText方法,根据传入的文本内容
返回SyncMode类型对应的值。可以简单理解为文本内容和SyncMode(int)的转换。

func (mode *SyncMode) UnmarshalText(text []byte) error {
	switch string(text) {
	case "full":
		*mode = FullSync
	case "fast":
		*mode = FastSync
	case "light":
		*mode = LightSync
	default:
		return fmt.Errorf(`unknown sync mode %q, want "full", "fast" or "light"`, text)
	}
	return nil
}

同步模式中途的变更经过上面的代码分析我们是否就确定,如果不传递参数geth一直就是通过fast模式进行同步的么?那么,再看看下面的代码分析吧。

在eth/handler.go中方法NewProtocolManager中的代码:

// Figure out whether to allow fast sync or not
if mode == downloader.FastSync && blockchain.CurrentBlock().NumberU64() > 0 {
      log.Warn("Blockchain not empty, fast sync disabled")
      mode = downloader.FullSync
  }
if mode == downloader.FastSync {
      manager.fastSync = uint32(1)
  }

这段代码是在创建ProtocolManager时进行同步模式的参数设置。blockchain.CurrentBlock()获得当前的区块信息,NumberU64()返回的是最新区块的头部的number

func (b *Block) NumberU64() uint64 { 
	return b.header.Number.Uint64() 
}

现在整理一下这段代码的整体逻辑就是,当同步模式为fast并最新区块的高度大于0(已经同步过一部分数据)时,程序自动将同步模式转变为full,并打印警告信息。

GitHub地址:

https://github.com/guoshijiang/go-ethereum-code-analysis

关注问我技术公众号,加小问,拉您入技术交流群:

在这里插入图片描述

complier lab2 只需支持定义 main 函数即可不带参数 int main(){...}带参数 int main(int argc, int argv){...} 阅读详情

相关推荐

Cesium进阶学习四、shadertoy(着色器)

Cesium进阶学习着色器

程迷学习的博客 4321

Linux文件、块设备实时同步(备份)技术介绍

Inotify是Linux中用于监控文件系统变化的API,自Linux 2.6.13开始集成到Linux内核中,该API可以实现近似实时地监控目录或文件发生的变化。和文件系统一样,Linux提供了块设备块BIO的事件监听,Blktrace就是Linux 下对块IO监控的工具,常用于分析块设备读写性能问题。需要注意的是,块级别同步仅能保证落盘的数据同步。)处理,这一层主要实现BIO调度逻辑,比如将一个大BIO请求拆分为多个小的BIO请求,将相邻的BIO请求合并,实现各种BIO调度等。

u013214505的博客 1828

螺丝锁付系统软件设计 C# Winform

视觉螺丝锁付系统软件设计 C# Winform ,这是其中通信子模块设计

weixin_42522973的博客 340

以太坊源码解读(3)以太坊启动流程简析

启动命令: geth --identity "TestNode1" --datadir "data0" --rpc --rpcapi "db,eth,net,web3" --port "30303" --networkid "29382" --ws --wsorigins="*" --rpccorsdomain="*" console 启动后,我们可以从日志来分

lj900911的专栏 3421

微信小程序 - 实现Java微信支付退款功能以及退款流程,微信小程序前端+java后端完整示例源码,微信小程序退款功能详解,小程序订单申请退款和退款回调方法、查询退款等(新版微信支付,详细示例代码)

微信小程序开发-微信支付退款功能以及退款回调方法,微信支付退款API详解,微信小程序支付V3(支付、退款)Java实现微信小程序开发 小程序支付开发-小程序退款功能,微信小程序小程序和公众号 退款功能教程(含申请退款和退款回调,退款回调地址在商户后台配置或者代码自定义)最新版微信小程序支付,退款问题,小程序支付和退款功能详解,小程序申请退款,小程序处理退款,微信小程序支付与退款java,微信小程序退款及回调,JAVA实现微信小程序支付退款功能,退款api调用报错,如何解决退款申请无响应,如何用实现小程序订单

🏆 前端领域优质创作者 4159

【时时三省】vector cast 常见错误解决/vcast常见错误解决

介绍在使用 vector cast/vcast 软件的过程中,遇到的异常问题。其它异常可以私信解决(购买专栏的前提下)。

时时三省的博客 449

Java实现Gas Tracker(支持EIP-1559提案)

Java实现Gas Tracker(支持EIP-1559提案)

子衿的博客 5489

【产品经理修炼之道】-如何搭建企业级账务系统?

笔者公司的业务模式具有一定的独特性,不同于我们常见的市面上供应链类公司的进销存模式。公司主要为各大银行和金融机构提供信贷领域的风控服务,客户主要通过请求公司的数据产品接口产生费用,可以简单地理解为请求一次接口收费0.5元,一个月若是有1w人请求同一个接口则公司需要收费5000元。

xiaoli8748的专栏 5405

以太坊同步模式源码解析

以太坊节点同步的时候支持三种模式:fast,light,full。而官方文档中已经明确–fast和–light参数选项已经被废弃。那么本篇博客就带大家看一下关于此参数的源代码,深入了解同步模式的底层转变。 方法定义源代码解析 首选从源代码中找到eth/downloader/modes.go。从文件的名字就可得知此文件是用来定义模式的,所谓modes就是指的同步模式。下面我们看一下此...

程序新视界 6426

33、密码学中的选择密文攻击与Cramer - Shoup加密方案

本文详细介绍了密码学中选择密文攻击的背景及其对Cramer-Shoup公钥加密方案的影响。该方案在决策Diffie-Hellman假设和抗碰撞哈希函数的基础上,能够有效抵御自适应选择密文攻击,并且其安全性无需依赖随机预言机模型。文章还分析了Cramer-Shoup方案的设计原理、加密与解密过程,以及其在标准假设下的安全性证明方法。此外,通过一系列相关练习,帮助读者进一步理解密码学概念如密文不可区分性、ElGamal加密、Goldwasser-Micali方案等。最后,文章展望了密码学的未来发展趋势,包括量子

vscode6remote的博客 99

2024年游戏策划最新面试题及答案

1. **游戏策划**:负责游戏设计和开发的创意和技术过程。2. **主要职责**:设计游戏玩法、故事、角色、世界等。4. **游戏机制**:定义玩家如何与游戏世界互动的规则。13. **引人入胜的角色**:深入的背景故事、个性特征。3. **游戏平衡**:确保游戏公平、有趣且具有挑战性。7. **RPG特点**:角色发展、故事驱动、玩家选择。12. **关卡设计技巧**:挑战性、流动性、视觉引导。11. **游戏关卡设计**:创建游戏世界的不同阶段。5. **游戏循环**:玩家在游戏中重复的行为模式。

guo162308的博客 2320

Ethereum geth 同步区块的三种模式

Ethereum(以太坊)当前交易多,截止当前(2018-02-04)已经有5029238个区块,区块大小在150G左右。 如果全部同步,并且严格逐个验证,需要太多的时间和计算。作者曾经用一台实体机,8核,16GB内存,2TB机械硬盘的dell立式服务器,在办公网络下同步区块,结果半个月没有同步完,同步的速度还没有新出区块的速度快。。。。 查找了一下,以太坊有三种同步的模式,full, fa

Archmage的专栏 1万+

要理解成本中心与利润中心的根本区别与适用场景,需从 “责任范围、考核核心、管理目标” 三个核心维度切入,同时明确二者在企业管理体系中的联动关系

摘要: 成本中心与利润核心区别在于责任范围、考核目标和管理权限。成本中心仅对成本负责(如生产、行政部门),考核成本控制能力;利润中心需同时管控成本与收入(如独立产品线、区域分公司),以利润为核心指标。选择标准取决于单元是否拥有收入决策权:无收入权的支持/执行部门设为成本中心,能独立经营、核算盈亏的单元设为利润中心。二者协同运作,成本中心为利润中心提供基础支持,利润中心的需求动态影响成本中心资源配置,共同实现企业整体目标。划分本质是确保考核指标与责任范围匹配,避免管理失效。

金牌架构师 657

Naivechain区块链开发环境搭建:从零开始的完整教程

想要理解区块链技术却觉得太复杂?Naivechain是一个用200行代码实现的区块链项目,专为初学者设计!🚀 这个简洁的实现让你能够快速搭建区块链开发环境,深入理解区块链核心概念。 ## 什么是Naivechain区块链? Naivechain是一个极简的区块链实现,它剥离了复杂的共识机制和加密算法,专注于展示区块链的基本工作原理。通过这个项目,你可以学习到: - 区块的创建和验证 - 节

gitblog_00369的博客 506

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

Parity Bitcoin源码阅读指南:从main.rs开始的代码探索

想要深入理解比特币客户端的内部工作原理吗?Parity Bitcoin是一个用Rust语言编写的完整比特币客户端实现,它提供了绝佳的学习机会。本文将为你提供一份完整的**Parity Bitcoin源码阅读指南**,帮助你从入口点main.rs开始,逐步探索这个复杂的分布式系统。🚀 ## 为什么选择Parity Bitcoin作为学习对象? Parity Bitcoin是由Parity Te

gitblog_00989的博客 295

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

视频教程-手把手教你掌握区块链技术视频教程-区块链

手把手教你掌握区块链技术视频教程 张长志技术全才、擅长领域:区块链、大数据、...

weixin_32170237的博客 1246

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

告别画面撕裂:Craft游戏帧同步与垂直同步优化指南

你是否曾在游戏中遇到画面撕裂、卡顿或帧率波动的问题?这些现象不仅影响游戏体验,还可能导致操作延迟。本文将深入解析Craft游戏引擎中的帧同步技术,重点介绍垂直同步(VSync)的实现原理与帧率稳定方案,帮助你打造流畅的游戏体验。读完本文,你将掌握如何通过简单配置优化游戏性能,理解Craft引擎的渲染机制。 ## 什么是垂直同步(VSync)? 垂直同步(Vertical Synchroniza

gitblog_00746的博客 526

TurtleCoin完全指南:从零开始掌握这个有趣的加密货币项目

TurtleCoin是一个有趣、快速且简单的加密货币项目,旨在让发送资金给朋友和企业变得更加轻松愉快。这个基于CryptoNote协议的开源项目以其友好的社区和易于使用的特性而闻名,为初学者提供了一个完美的加密货币入门平台。虽然TurtleCoin网络已于2023年3月15日在区块5,500,000处停止运行,但它仍然是一个值得学习和研究的优秀开源项目。 ## 🚀 TurtleCoin项目概述

gitblog_00523的博客 407

如何解释“我篡改了区块链”这个问题

区块链数据“全局一致”、“难以篡改”这两个特性已经广为人知,是区块链营造“信任”的基石。为了达到这两个效果,区块链的共识、同步、校验等技术细节足可大书特书,而本文要从“我篡改了区块链数据”讲起。

FISCO_BCOS的博客 939

Groestlcoin Core完全指南:从区块链基础到钱包安全的终极教程

Groestlcoin Core是Groestlcoin的官方参考钱包,基于比特币核心代码库开发,自2014年3月从比特币0.8.6版本分叉以来,持续同步比特币核心的最新技术更新。它连接Groestlcoin点对点网络,提供区块交易的完整验证功能,同时包含可选的钱包和图形用户界面,是参与Groestlcoin网络的核心工具。 ## 一、Groestlcoin Core简介:数字资产的安全基石 ?

gitblog_00453的博客 969

Sui项目开发环境搭建与代码结构解析

Sui项目开发环境搭建与代码结构解析 【免费下载链接】sui Sui, a next-generation smart contract platform with high throughput, low latency, and an asset-oriented programming model powered...

gitblog_00871的博客 442

Thunderbird for Android 偏好设置迁移指南:从数据库结构到迁移实现与单元测试

本文面向 Thunderbird for Android(前身 K-9 Mail)的开发者,完整讲解如何安全地修改、迁移应用内的偏好设置(Preferences)。Thunderbird for Android 将全部偏好设置以键值对形式存储于独立的 SQLite 数据库 `preferences_storage` 中,任何键的重命名、值格式变更、存储位置迁移或旧键删除,都必须通过"数据库版本号

gitblog_00093的博客 140

用C++来搭建一条迷你区块链!

原文转载于:https://blog.youkuaiyun.com/DP29syM41zyGndVF/article/details/81187427 程序员的天赋技能就是通过代码实践自己的想法,完成一个作品会有相当的成就感,所以今天我们以 C++14 的代码为例子,和你分享设计并实现一个迷你区块链例子。 目标和范围 首先我们要知道达成的目标,根据目标划定工作范围。 考虑到我们无法搭建一个类似比特币的...

农村的我的专栏 1265

深度解析rclone:构建专业级云存储同步解决方案

rclone作为"云端rsync",是当今最强大的开源云存储同步工具,专为技术爱好者和中级用户设计。这款用Go语言开发的命令行工具能够无缝连接超过50种云存储服务,实现跨平台文件管理和高效数据同步。无论是个人数据备份、企业级文件迁移,还是复杂的多云端架构管理,rclone都提供了专业级的解决方案。 ## 云存储生态整合的核心挑战 在现代云计算环境中,企业和技术团队面临的最大挑战之一是云存储服务

gitblog_00839的博客 919

tinychain源码解读:从创世区块到链上交易的完整流程

**tinychain**是一个极简的比特币实现,用不到700行Python代码完整再现了比特币的核心机制。本文将从**创世区块**开始,深入解析**区块链交易**的完整生命周期,带你理解这个**迷你比特币**如何实现**去中心化账本**的核心功能。无论你是区块链新手还是开发者,都能通过这个简化版本快速掌握比特币的工作原理。 ## 🔍 tinychain项目概览 tinychain是一个**

gitblog_00336的博客 330

基于Geth搭建多节点以太坊私链:从创世区块到集群部署实战

区块链网络的核心在于多节点间的分布式共识与数据同步,其技术原理通过P2P通信、共识算法和状态机复制确保数据的一致性与不可篡改性。在工程实践中,搭建私有测试网络是深入理解区块链架构、验证智能合约逻辑和模拟复杂网络场景的关键基础设施。通过配置网络ID、创世区块和独立数据目录,开发者可以构建一个完全可控的沙盒环境,其中Geth客户端因其完善的文档和工具链成为首选。这种多节点私链特别适用于测试DApp的完整业务流程、模拟节点故障以及学习以太坊客户端交互,为从理论认知到工程实践提供了重要支撑。

weixin_33724659的博客 344
上一篇: 从命令行开始解析以太坊新建账户过程(geth account new命令)
下一篇: 从命令行开始解析生成创世块源码
The_Web3_社区
博客等级 码龄10年 388粉丝 154原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

The_Web3_社区

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值