防止哈希链中的无限循环?

Prevent infinite loops in hash chains?

好的,所以我想实现一个简单的网络算法,其中每个参与者选择其对等方并轮流查看他们的最新哈希值,从而产生自己的哈希值链,如下所示:

H[n+1] = hash( H[n] + P[n][k] )

其中 P[n][k] 是所选节点的最新哈希值。我们称之为 "timestamping".

这样做的目的是生成一个网络,通过生成从 AB。网络以无需许可的方式执行此操作 - 这意味着如果任何参与者为您的事件添加时间戳A,那么最终他们都会这样做。

我面临的问题是,if participant X2 timestamps X1, X3 timestamps X2 等等,如果X[n]真的是peer X1 这可能会自行加倍,并且即使没有真正提交新事件,它们也会循环地为自己加上时间戳。

当我将我的更改从 fork B 合并回 A 时,git 或 mercurial 也会发生同样的问题,生成一个新的散列,然后合并头部(提示) A 变成 B,依此类推。换句话说,工作副本中没有任何变化,但每次新合并都会产生一个新的哈希值,从而导致虚假更改。

Mercurial 通过返回上次检查任何东西来防止它 "really changed"。意思是,如果自上次在分支上提交以来没有文件更改,它基本上会说 "merging with direct ancestor has no effect".

我同样可以通过遍历整个哈希链直到找到循环来防止循环。但这可能是一个非常长的遍历。如果我将它切断,比如说,10 个哈希,那么 11 个或更多参与者的循环仍然会导致哈希循环,即使实际上没有 "changed"。或者我可能对 "really changed".

有一些概念

有什么办法可以解决这个问题,或者 google 的一些条款吗?

您可能需要比散列更多的元数据来确定它是否已经来自某个节点。可以想象,此元数据可能是散列数据的一部分(除了 "timestamp" 之外)。这样就可以确认元数据的真实性。例如,在 git 的情况下,哈希值不仅是父提交哈希值的哈希值,而且是提交消息、author/committer 信息、日期和树哈希值的哈希值。

关于要搜索的术语:通常此类系统(git、Mercurial、比特币、各种文件系统等)使用Merkle Trees 来实现交易验证和完整性检查。