恢复 Substrate 链: unexpected epoch changes

这篇具有很好参考价值的文章主要介绍了恢复 Substrate 链: unexpected epoch changes。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

问题描述

使用 Substrate 定制的区块链,所有节点听了一段时间后,链无法工作。

Substrate:polkadot-v0.9.25
共识协议: babe + grandpa
系统:macOS Big Sur (11.3)
cargo: cargo 1.63.0-nightly (a4c1cd0eb 2022-05-18)

babe 协议算法,要求每个 epoch(session) 周期内都需要出块,因此当链出现以下情况,导致无法正常出块时,链就会变成砖块(bricked),无法正常工作。

  • grandpa 节点少于拜占庭容错要求,无法确认块,地址不能在一个 epoch 内出块
  • 所有验证者节点离线

解决方法

出现这种问题时,可以用两种方式解决

Hard Spoon

这种方式的原理是通过 rpc 接口(或者状态数据库)获取到最后正常区块高度下的状态数据,生成一个新的创世块,基于新的创世块运行链。本质上完全是一条新的链,只是继承了状态数据。

如果不在乎区块的历史,只需要保持当前的状态数据,则可以使用此方式。

可参考 fork-off-substrate

我并没有基于这种方式实践成功。
依赖的 polkadot-js 版本过低,升级之后能生成新的创世块文件,用新的创世块运行,还是报错。

Time Warp

Babe 无法正常工作是因为,在最后出块的下一个 epoch 内,没有正常出块,那么如果所有的验证者节点把系统时间调整到最后出块的时间,理论上就可以让链恢复工作了。 正常情况下,区块链和外部时间是一致的,人为的让区块链回到历史时间(最后出块时间),再以加速的时间流逝赶上外部世界的时间。

修改代码

我的链是以 git 路径的方式依赖 substrate crates

需要替换要修改的两个 crates 依赖

修改项目的 Cargo.tom ,节选如下,路径设置为自己修改的 crates 目录即可:

[patch."https://github.com/paritytech/substrate"]
sc-consensus-slots = { path = "/path/to/custom/sc-consensus-slots" }
sp-timestamp = { path = "/path/to/custom/sp-timestamp" }

修改的两个 crates ,参考 d0decd9

这里我们修改为两倍速运行。

sc-consensus-slots
sc-consensus-slots/src/slots.rs

/// Returns the duration until the next slot from now.
pub fn time_until_next_slot(slot_duration: Duration) -> Duration {
	// HOTFIX: poll the slot 2 times as often since we might be in a time warp.
	let slot_duration = slot_duration / 2;
	...
}

sp-timestamp
sp-timestamp/src/lib.rs

WARP_FACTOR :即时间扭曲的倍数,对应被压缩的是出块时间,合理设置自己的倍数;
FORK_TIMESTAMP:分叉时刻,扭曲的基础时间,这里选择最后确认块的下一块出块时间;
REVIVE_TIMESTAMP: 计划的各验证节点开始运行的时刻,不需要很精确,小于验证节点都拿到修改后的可执行文件,运行的时间即可;文章来源地址https://www.toymoban.com/news/detail-795297.html

impl InherentDataProvider {
	/// Create `Self` while using the system time to get the timestamp.
	pub fn from_system_time() -> Self {
		let timestamp = current_timestamp().as_millis() as u64;

		// HOTFIX: mutate timestamp to make it revert back in time and have slots
		// happen at 2x their speed from then until we have caught up with the present time.
		const REVIVE_TIMESTAMP: u64 = 1642105111666; // 2022-08-25T20:18:31.666Z
		const FORK_TIMESTAMP: u64 =   1642006674001; // 2022-08-26T16:57:54.001Z
		const WARP_FACTOR: u64 = 2;

		let time_since_revival = timestamp.saturating_sub(REVIVE_TIMESTAMP);
		let warped_timestamp = FORK_TIMESTAMP + WARP_FACTOR * time_since_revival;

		// we want to ensure our timestamp is such that slots run monotonically with blocks
		// at 1/2th of the slot_duration from this slot onwards until we catch up to the
		// wall-clock time.
		let timestamp = timestamp.min(warped_timestamp);

		Self {
			max_drift: std::time::Duration::from_secs(60).into(),
			timestamp: timestamp.into(),
		}
	}
	...
}

执行恢复

  1. 备份本地数据
    如: cp -r node1 node1.bak
  2. 回滚未确认的块
    如:./node revert --chain ./specRaw.json --base-path ./node1
  3. 使用时间扭曲的程序启动链,指向原来的数据
  4. 观察日志或管理界面看是否能正常出块
  5. 等待追赶上外部系统时间
  6. 使用原程序继续运行

参考链接

  1. https://github.com/paritytech/substrate/issues/4464
  2. https://github.com/paritytech/substrate/issues/11673
  3. https://substrate.stackexchange.com/questions/168/how-to-unbrick-a-substrate-chain-revert/175#175%EF%BC%89
  4. https://medium.com/polkadot-network/kusamas-first-adventure-2cd4f439a7a4
  5. https://github.com/maxsam4/fork-off-substrate

到了这里,关于恢复 Substrate 链: unexpected epoch changes的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Substrate 基础教程(Tutorials) -- 授权特定节点

    在添加可信节点中, 您看到了如何使用一组已知的验证器节点构建一个简单的网络 。该教程演示了一个简化版的许可网络(permissioned network)。在一个被许可的网络中,只有被授权的节点(authorized nodes)被允许执行特定的网络活动。例如,您可以授予一些节点验证块的权限

    2024年02月16日
    浏览(31)
  • 区块链中slot、epoch、以及在slot和epoch中的出块机制,分叉原理(自己备用)

    以太坊2.0中有两个时间概念:时隙槽slot 和 时段(周期)epoch。其中一个slot为12秒,而每个 epoch 由 32 个 slots 组成,所以每个epoch共384秒,也就是 6.4 分钟。 对于每个epoch,使用RANDAO伪随机算法将全部的验证节点分成多个委员会(committee),这些委员会的职责主要包括出块 、

    2024年02月12日
    浏览(38)
  • OneBlock | 区块链人才聚集地,面向全球的Substrate 开发者社区

    OneBlock是面向全球的 Substrate 开发者用户的技术社区,通过由浅入深的提供系统化技术相关原创内容、直播、技术课程及 Workshop、Hackathon 等活动,让区块链技术开发者们能最轻松最便捷近乎零成本的获得区块链技术相关知识并快速掌握。 目前社区已经聚集了来自 Google、 Fac

    2024年02月05日
    浏览(54)
  • Epoch、Batch和Iteration有什么区别?

    Epoch,使用训练集的全部数据对模型进行一次完整训练,被称之为一代训练 Batch,使用训练集中的一小部分样本对模型权重进行一次反向传插的参数更新,这一小部分样本被称为“一批数据” Iteration,使用一个 Batch数据对模型进行一次参数更新的过程,被称之为“一次训练

    2024年02月05日
    浏览(36)
  • 神经网络中epoch、batch、batchsize区别

    目录 1 epoch 2 batch 3 batchsize 4 区别 当数据集中的 全部数据样本通过神经网络一次并且返回一次的过程即完成一次训练 称为一个epoch。 当我们分批学习时,每次使用过全部训练数据完成一次Forword运算以及一次BP运算,称为完成了一次epoch。 epoch时期 = 所有训练样本的一个正向传

    2024年02月08日
    浏览(33)
  • 深度学习中Epoch和Batch Size的关系

    在深度学习中,Epoch(周期)和 Batch Size(批大小)是训练神经网络时经常使用的两个重要的超参数。它们之间的关系是通过以下方式连接的: Epoch 表示整个训练数据集被神经网络完整地通过了一次。在一个 Epoch 内,神经网络会看到训练数据集中的所有样本一次,进行前向传

    2024年01月16日
    浏览(43)
  • 【目标检测】epoch、、batch、、batch_size理解

    1 epoch         当一个完整的数据集通过神经网络一次并且返回一次的过程称为一个epoch。 然而,当一个epoch对于计算机太过庞大时,就需要把它分成多个小块。 2 batch         在不能将数据一次性通过神经网络的适合,就需要将数据集分成几个batch。 3 batch_size      

    2024年02月16日
    浏览(33)
  • 深度学习中epoch、batch、batch size和iterations详解

    1.epoch 在训练一个模型时所用到的全部数据; 备注:一般在训练时都要使用多于一个的epoch,因为在神经网络中传递完整的数据集仅仅一次是不够的,只有将完整的数据集在同样的神经网络中传递多次,才会得到比较优秀的训练效果,当然也不行,容易过拟合,所以要根据实

    2023年04月25日
    浏览(37)
  • 【pytorch】随着epoch增加,显存逐渐增加?解决pytorch显存释放问题

    在训练时,检测 “out of memory” 的error并通过torch.cuda.empty_cache()处理 如: 在测试时,避免忘记设置 torch.no_grad() 如: Pytroch - 显存释放问题

    2024年02月11日
    浏览(61)
  • tf和pytorch每轮epoch显示输出的auc是如何计算的

    tf和pytorch每轮epoch显示输出的auc是如何计算的? 近似 ROC 或 PR 曲线的 AUC(曲线下面积)。 tf1 通过计算真阳性,假阳性,假阴性,真阴性值的计算策略。 tensorflow AUC streaming_auc_我爱写报告的博客-CSDN博客 Tf2通过黎曼和进行计算的。 torcheval.metrics.AUC — TorchEval main documentation (

    2024年02月10日
    浏览(43)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包