2. 历史账本丢失问题
问题提出
在 Kaspa 早期,部分历史交易记录没有被保存下来。原因是:
Kaspa 的数据修剪机制
在项目早期,团队对完整历史记录的保存工作不重视(因为不影响安全)。
很多人担心,没有完整的账本历史,可能意味着链的安全性或透明度存在问题。
(1). 快速的回答
历史账本不完整,不影响 Kaspa 的安全。
Kaspa 本身就自带数据修剪功能。网络的安全性和透明度由密码学保证(硬编码创世块和创世证明),而非依赖于存储所有历史数据。
关于 Kaspa 网络完整性校验,参考 检查点区块 这一章节,其中包含了网友自己实现的完整性校验。
(2). Kaspa 是安全的
- Shai 在下面这篇文章中,详细回答了这个问题:
翻译
大家好,$Kas。显然,有些人担心我们的账本历史存在一些数据间隙。有人问这是否意味着链的安全性或透明度存在问题(并且像往常一样,我们所熟知的一些喷子甚至声称这“证明”了我们在“隐瞒”“速度挖矿”的“事实”)。让我来让大家放心:正如我即将解释的,这完全不是一个问题。
在开始之前,你必须理解数据修剪是至关重要的。如果不进行修剪,在满负荷(10BPS)运行下,账本数据每年会增长近30TB。如果我们希望Kaspa保持去中心化,这是极其不可持续的。
主要的担忧似乎是,缺乏完整的账本数据意味着无法从创世区块验证当前状态(特别是,无法证明没有预挖矿)。但事实并非如此。 创世区块本身被硬编码在节点的代码中,正如你在这里看到的: https://github.com/kaspanet/rusty-kaspa/blob/ce3e231d0ae103557dc4c44a4dcf31265961a2e4/consensus/core/src/config/genesis.rs#L163
我链接的第163行特别显示,硬编码的创世区块有一个空的UTXO集合,也就是说,没有预挖矿(细心的读者可以克隆代码库并验证
EMPTY_MUHASH确实被定义为一个空集的哈希值)。节点存储的数据中包含一个创世证明。这个证明是一个简短的字符串,它用密码学方法证明了当前状态确实是从硬编码的创世区块演化而来,并且有一个神奇的特性:伪造这样一个证明需要消耗与创建整个账本相同的工作量。也就是说,这个字符串提供了创世区块和当前状态是真实的证明,并且这个证明的可靠性与拥有整个账本一样强。
用于生成该证明的技术在这里有讨论:https://eprint.iacr.org/2021/623.pdf
你也可以参考GHOSTDAG 101研讨会的“修剪区块头”部分来大致了解该技术:https://youtu.be/nhI2zo44dfc?t=6354
关键是,每个节点可用的数据足以从创世区块验证当前状态。
没有从第一天起就运行一个存档节点可能有点缺乏远见,但坦率地说,主网上线后我们有太多事情要处理,这件事被搁置了,主要是因为我们知道它对于网络的安全性或完整性并不关键,所以优先级不高。
账本数据大多没什么意思,我真的不明白大多数用户期望在那里找到什么。 话虽如此,确实有理由需要整个账本数据,主要是:
a. 美观性。也就是说,如果全部数据都可用,我根本不需要解释所有这些。
b. 统计和研究:这些数据可用于调查趋势和全局现象。
c. 用户需求:有些用户可能需要这些数据,例如出于税务审计原因(例如,在以色列,挖矿收益和交易收益的税率不同,长期持币的矿工需要根据挖矿时的价值为挖出的币纳税,因此他们应该能够证明是在何时挖出的,等等)。
因此,我们正在努力拼凑完整的历史记录(所以,特别是,如果你恰好有旧的数据目录,请在我们的Discord服务器的 #datadir-exchange 频道中联系我们)。
...
总结:
Kaspa的数据修剪机制是一项经过深思熟虑的设计选择,旨在保证网络的长期可扩展性和去中心化。
网络的安全性和透明度由密码学保证(硬编码创世块和创世证明),而非依赖于存储所有历史数据。
(2). 有多少未找回的历史账本数据
| 时间 | 历史账本数据情况 |
|---|---|
| 2022-02-10 之前 | 已大概找回 75% |
| 2022-02-10 之后 | 已找回全部 100% |
TIP
目前,团队似乎没有动力和精力去找回 2022-02-10 之前的全部历史账本数据。
信息来源(2025年5月):
