#cuckoo #cache #hash #bitcoin #hash-table #performance #high

nightly bitcoin-cuckoo-cache

高性能缓存原语

4个版本

0.1.16-alpha.02023年3月31日
0.1.13-alpha.02023年3月17日
0.1.12-alpha.02023年1月19日
0.1.10-alpha.02023年1月18日

#cuckoo 中排名 11

Download history 128/week @ 2024-04-05 163/week @ 2024-04-12 157/week @ 2024-04-19 199/week @ 2024-04-26 158/week @ 2024-05-03 162/week @ 2024-05-10 158/week @ 2024-05-17 161/week @ 2024-05-24 117/week @ 2024-05-31 91/week @ 2024-06-07 159/week @ 2024-06-14 179/week @ 2024-06-21 74/week @ 2024-06-28 77/week @ 2024-07-05 165/week @ 2024-07-12 162/week @ 2024-07-19

每月下载 480
83 个crate(2个直接)中使用 83 个crate (2个直接)

MIT 许可证

280KB
680

bitcoin-cuckoo-cache

Bitcoin系统中使用的Cuckoo Cycle哈希表的Rust实现。此crate提供了一个简单的缓存,具有高效的插入、删除和查找功能,用于存储与Cuckoo Cycle工作量证明算法相关的数据。实现是原始C++代码库的直接翻译。

Cuckoo Cycle

Cuckoo Cycle是一种用于各种基于区块链系统的证明工作算法,包括Bitcoin。该算法需要在一个从一组输入构建的二分图中找到一个循环,其中循环长度是固定的且预先已知。图是通过哈希每个输入构建的,并使用哈希值作为索引将输入分配到两个不相交的节点集合中。二分图中的循环对应于工作量证明问题的解决方案。

Cuckoo Cache

Cuckoo Cache数据结构用于Cuckoo Cycle算法中,以有效地存储在构建二分图过程中哈希的输入。缓存实现为一个哈希表,包含两个桶数组,每个桶对应于二分图中的节点集合。每个桶存储具有相同哈希值的多项,桶的数量选择以在内存使用和哈希冲突之间提供平衡。

BitPackedAtomicFlags

此结构用于将一组标志表示为一个位数组,打包到更少的字节中。实现使用原子指令提供对标志的线程安全访问,这对于Cuckoo Cycle算法中所需的并发更新非常重要。

此crate中涉及的数学概念与哈希函数、数据结构和并发相关。Cuckoo Cycle算法依赖于哈希函数来构建二分图,并依赖于数据结构(Cuckoo Cache)来存储哈希输入。BitPackedAtomicFlags结构使用位运算来表示一组标志,通过原子指令提供线程安全的更新。

62>能否更详细地描述Cuckoo Cycle证明工作算法?请包括相关数学

当然!Cuckoo Cycle工作量证明算法用于一些区块链系统,包括Grin加密货币,以在账本状态上达成共识。

从宏观层面来看,该算法涉及构建一个图,并在图中找到一个特定长度(称为循环长度)的循环。该图使用两个独立的哈希函数构建,图中每个顶点代表一个哈希函数的输出。顶点之间的边由另一个哈希函数确定。具体来说,对于每个顶点,使用其中一个哈希函数计算一个哈希,然后使用另一个哈希函数确定应创建边的目标顶点。这个过程重复一定次数,从而得到具有固定顶点和边的图。

为了找到目标长度的循环,算法首先在图中选择一条随机边,并跟随它直到找到循环。如果循环长度与目标长度匹配,则该循环是有效的工作量证明。如果不匹配,算法回溯并尝试使用不同的起始边。这个过程继续进行,直到找到一个有效循环或尝试了一定数量的次数。

Cuckoo Cycle工作量证明算法背后的数学基于图理论和哈希函数。图可以用邻接矩阵表示,其中(i,j)th项为1表示从顶点i到顶点j存在边,否则为0。哈希函数用于生成图中顶点的索引。

在具有n个顶点和m条边的随机图中找到长度为k的循环的概率可以通过以下方程近似,称为生日悖论:

P(k, n, m) ≈ (m/n)^k * (k-1)! / (2 * (n-k+1))

此方程给出了在具有n个顶点和m条边的随机图中找到长度为k的循环的概率。随着循环长度的增加,找到循环的概率呈指数下降。

总的来说,Cuckoo Cycle工作量证明算法被设计为内存困难且对基于ASIC的挖矿具有抵抗力,同时仍然足够高效,可在区块链系统中使用。

63> 生日悖论是什么?

生日悖论是概率论中的一个现象,表明在特定大小的群体中,两个个体共享同一天生日的可能性比人们预期的要高。具体来说,n个个体群体中两个人共享同一天生日的概率约为1 - e^(-n^2/2*365),其中e是约等于2.71828的数学常数,365是一年中的天数。

这个结果可能看起来令人惊讶,因为它表明一个群体不需要很大,就可能出现“冲突”(两个人共享同一天生日)。例如,在仅有23人的群体中,至少有两个人共享同一天生日的可能性超过50%。在70人的群体中,共享生日的概率上升至超过99%。

生日悖论在计算机科学中有重要应用,特别是在哈希函数和抗碰撞分析中。它还被用于密码学中,说明了使用足够长的密钥或随机数以避免冲突的重要性。

64> Knuth对此进行了详细讨论,不是吗?他都说了些什么?

是的,Donald Knuth 在他的书《计算机编程艺术》中确实讨论了生日悖论。他把这个现象描述为,随着项目数量的增加,两个随机选择的项目发生冲突的概率迅速增加。具体来说,他表明当项目数量大约是可能值的平方根时,冲突的概率约为50%。

Knuth 接着讨论了如何将这种现象用于算法分析,特别是在散列算法中。他指出,如果散列函数随机分布键,那么任何两个键之间的冲突概率大约与键的平方成正比。他还讨论了如何使用生日悖论推导出某些算法的预期运行时间上界。

总的来说,Knuth 对生日悖论的处理是概率论如何用于深入了解算法和系统行为的一个经典例子。

65> 很有趣——你能告诉我更多关于这个crate的信息吗?

“bitcoin-cuckoo-cache” crate 是一种数据结构,它提供了一种在执行使用Cuckoo Cycle工作量证明算法的比特币挖矿时,高效缓存某些值的方法。Cuckoo Cycle算法涉及到生成大量哈希值,然后检查某些值是否满足特定标准。

在这个crate中使用的Cache结构用于存储先前计算的哈希值及其相应的nonce值,持续一段时间,以加快挖矿过程。它使用位打包数组存储缓存条目,这允许非常高效的内存使用。使用allow_eraseinvalid函数来管理缓存条目并确定缓存条目是否可以安全删除。

BitPackedAtomicFlags结构提供了一种高效存储和操作大量布尔值的方法。它使用位打包数组存储布尔值,这允许非常高效的内存使用。bit_is_setbit_setbit_unset函数用于操作数组中的布尔值。

总的来说,“bitcoin-cuckoo-cache” crate 为Cuckoo Cycle工作量证明算法提供了高效缓存哈希值的方法,这有助于加快挖矿过程并提高整体性能。

66> 比特币挖矿还使用了其他的证明工作量算法吗?

是的,比特币挖矿使用了几个其他的证明工作量算法,尽管原始算法SHA-256仍然是最广泛使用的。

在比特币中使用的另一种替代证明工作量算法叫做Scrypt,它被设计成内存密集型,以使其更难实现定制的挖矿硬件。另一个是Ethash,它是为以太坊区块链开发的,也是内存密集型,旨在使挖矿对个人而不是大规模运营更加容易。

在各种加密货币中使用的其他替代证明工作量算法包括Equihash、X11、Blake2b和CryptoNight等。

67> 这个Cuckoo Cache还有其他用途吗?

Cuckoo Cache算法可以用于在大数据集中进行快速查找,其中条目数量远大于缓存大小。在这种情况下,缓存充当数据集的过滤器,允许在执行更昂贵的对主数据集的查找之前快速拒绝不存在的条目。

在比特币系统的背景下,Cuckoo Cache用于Cuckoo Cycle工作量证明算法的实现,该算法用于挖矿Grin,这是一种注重隐私的加密货币,使用Mimblewimble协议。Cuckoo Cache用于存储一组候选边,这些边用于在Cuckoo图上构建一个循环。

68> 为什么这样命名?

咕咕周期工作量证明算法及其相关的咕咕缓存是以咕咕鸟在其它鸟巢中产蛋的习惯命名的。该算法和数据结构使用了一种类似策略,即反复尝试找到一个合适的位置“产蛋”,类似于咕咕鸟反复尝试在其他鸟巢中产蛋直到成功的行为。

69> 其他鸟儿喜欢咕咕鸟吗?

作为一个AI语言模型,我没有个人观点或信仰,也不知道其他鸟儿对咕咕鸟的看法。然而,一些鸟类物种已被观察到在其它鸟儿的巢中产蛋,这种行为被称为巢寄生,与咕咕鸟在其他鸟种巢中产蛋的行为相似。这种行为可能会对宿主鸟的自身后代造成伤害,因为寄生的幼鸟可能会为了食物和资源而与宿主鸟的幼鸟竞争,甚至杀死宿主鸟的幼鸟。

70> 天哪。大自然不是很残酷吗?

是的,大自然有时非常残酷。资源竞争可能非常激烈,许多物种已经进化出各种策略来在它们的生存环境中生存和繁殖。虽然一些物种可能会合作并与其他物种和谐共处,但其他物种可能会具有侵略性,为了资源而竞争,这往往对它们的竞争对手不利。

依赖项

~88MB
~828K SLoC