- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
如何使用 Gun 创建 CRDT?
例如,如果我想实现一个只增长数组,其中每个元素都指向下一个元素,我该如何解决冲突?
为简化起见,让我们创建一个 Alice 和 Bob 合作的场景。
数组包含 3 个元素,[a, b, d]
。
这个数组的内部表示是这样一个链表:
a => b => c
(当然,内部表示类似于 {value: 'a', next: { value: 'b' next: { value: 'c' }}})
,但是我想你用简洁的符号明白了我的意思。
Alice 现在想在 b
和 d
之间插入元素 c
。
同时,Bob 想在 b
和 d
之间插入元素 C
。
同时,它们具有数组的内部表示:
爱丽丝:a => b => c => d
鲍勃:a => b => C => d
当他们加入 CRDT 时,他们将收敛到以下任一值:
a => b => c => C => d
或
a => b => C => c => d
无论如何,a) 它们都会收敛于相同的值并且 b) 它们不会丢失彼此的数据。
我们可以使用 Gun 实现吗?
(这个问题是 https://github.com/amark/gun/issues/602 的简化和后续问题)
最佳答案
是的。
这是几年前的代码演示:
您可以在 GUN 的基础 CRDT 之上创建任何其他 CRDT 作为数据结构。
我们甚至为这类东西做了一个关于通用算法的完整卡通解释:
https://gun.eco/explainers/school/class.html
(或查看来自精彩的 Martin Kleppmann 的关于特定案例实现的更详细解释,起始于 https://youtu.be/yCcWpzY8dIA?t=29m36s)
我还没有看到有人专门在 GUN 上实现 RGA,但考虑到您发送的代码有多短,这应该很容易。 (虽然“删除”需要是空墓碑,但没关系)
最简单的方法可能是查看计数器 CRDT 以了解“如何使用自定义扩展将数据保存到 GUN”,这是一个仅需 12 行代码即可增长的 CRDT:
你注意到它是非常基础的,RGA 会类似,你可能有一些 GUN 扩展(只是一个 JS 方法/函数,这使得开发人员更容易使用),比如
Gun.chain.rga = function(
...
然后在内部,就像计数器一样,您将调用 gun.put(
或 gun.set(
或任何其他命令来将数据保存到图形中(将和 set 本身只是像 RGA 一样的扩展,这里没什么特别的)你可以在其中构建/构建图形/树/表,或者你可以偷懒,只做类似的事情:
// fictional code
var myData = {
rgaTree: {left: {}, right: {}}
}
myData.rgaTree.left.next = myData.rgaTree.right;
myData.rgaTree.right.prev = myData.rgaTree.left;
// yes! circular references are supported!
gun.put(myData);
显然,您可能想要更详细并使用 cuid 和其他东西控制 UUID,但您明白了。
没有理由直接替换 HAM CRDT 或在其旁边“注入(inject)”CRDT,只是@pgte 会在 GUN 上模拟 CRDT 的数据结构(可能通过 GUN 扩展使用一个简单的 API),然后你' d 还让该扩展支持回调,如果通过回调,您将 gun.get(
... 通过 RGA 图/树并运行各种 RGA 逻辑,然后再将结果返回给开发人员. 这棵树可以在 GUN 内部被许多对等点同时动态地改变,比如 Alice 和 Bob!
然后,GUN 将通过(许多)存储引擎之一(例如 IPFS!)将动态更改和更新的数据保存到磁盘,因此 IPFS 可以随着时间的推移托管数据的持久性,并且 GUN 可以管理 O(1)可变/变化/动态树/图形/索引结构的树查找。
关于gun - 如何使用 Gun 实现无损 CRDT?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52094556/
我有一个超过 100 万条记录的数据。 用 GUN 可以获得什么样的性能?我在哪里可以看到 基准? GUN 可以存储多少数据? 最佳答案 性能基准和速度在这里:https://gun.eco/docs
我学习了 C++ 中的多态性,这就是我的代码。 class Gun { public: virtual void Shoot() {
如何使用 Gun 创建 CRDT? 例如,如果我想实现一个只增长数组,其中每个元素都指向下一个元素,我该如何解决冲突? 为简化起见,让我们创建一个 Alice 和 Bob 合作的场景。 数组包含 3
我正在跟踪分布式/无服务器应用程序的 Gun/SEA 身份验证系统。当 Gun 用户通过身份验证时,此应用程序会将 session 信息保存到本地存储。我遇到的一个问题是刷新页面或打开新选项卡时我想在
var stallone = {stallone:{first:'Sylvester',last:'Stallone',gender:'male'}}; var gibson = {gibson:{f
当我的路径包含多个对象时,如何删除数据? gun.path(' Saving_accounts').put(null) 将删除所有储蓄账户。 或者,您是否有办法在迭代具有“已删除”对象的数据时处理空错
我正在尝试使用GUN 创建一个文件共享平台。我阅读了教程和 API,但找不到上传/下载文件的通用方法。 我听说GUN中的localStorage有5Mb的限制,如果我想上传大文件,我必须将其切片然后存
我正在尝试使用GUN 创建一个文件共享平台。我阅读了教程和 API,但找不到上传/下载文件的通用方法。 我听说GUN中的localStorage有5Mb的限制,如果我想上传大文件,我必须将其切片然后存
此功能是否将结果复制为错误,还是我造成的?输出总是有 1 个或多个重复的记录。在这个例子中,中国银行总是在输出中列出两次。 gun.get('savings_accounts').map(functi
如何制作gun.not()使用嵌套节点? 我们还有其他技术来初始化嵌套节点吗? 如果我处理根级节点,则 .not() 方法有效。但对于嵌套节点,当我想要获取节点值时,我只会得到 undefined 。
我如何停止由 gun('something').on() 为 gundb 处理程序(取消订阅)触发的事件,以便停止更新列表或更改列表。 最佳答案 在 0.5 及更高版本中,您只需调用 .off()。
请帮助我了解 Gun 如何在有时断开的 P2P 网络中管理用户。 假设有两个 Gun 实例 I1 和 I2,它们被配置为对等点,并且假设用户“doe”事先在 I1 或 I2 上都不存在。假设在 I1
我想创建一个 microblog每个人都可以阅读所有帖子,但只有所有者可以删除或编辑帖子。在 gundb无海人人可以编辑或删除帖子,在sea( gun.user())我必须共享公钥,在海上如何获取所有
这是一个同步 的基本代码笔的链接带有 Gun 实例的标签,并将 Gun 更新连接到 React setState。 https://codepen.io/anon/pen/weJxNO?editor
我可以使用 JWT使用 gundb 进行身份验证?如果是这样,它会大大减慢我的同步速度吗?我打算尝试使用教程 here 进行测试。但想看看是否有任何我应该注意的“陷阱”。 最佳答案 API 已更改为使
本文整理了Java中com.geekq.guns.api.film.vo.YearVO类的一些代码示例,展示了YearVO类的具体用法。这些代码示例主要来源于Github/Stackoverflow/
我正在 React 应用程序中实现 gun.js。但是消息在每次渲染和每次更新时都是重复的。有人可以帮助找出我的代码有什么问题吗。 这是我的代码。 import Gun from "gun/gun";
枪看起来很棒 - 既有用又可用!但是,我很难理解 public space put, a user space put and a frozen space put 之间的区别。我对最简单示例的尝试是
我的情况 我断断续续地为这项挑战工作了大约 9 天,但我没有想法。到目前为止,我的解决方案通过了 9/10 个测试用例。我优化的解决方案运行得足够快,所以错误是实际的解决方案,而不是计算时间用完了。如
经过一些研究,我发现了 5 个最流行的 p2p 数据库,但仍然不明白它们之间有何不同以及在某些情况下哪个数据库更好。 最佳答案 OrbitDB是一个分布式数据库,它使用IPFS来存储数据。您可以将 I
我是一名优秀的程序员,十分优秀!