为什么我在更新节点时收到重复项?

Why do I receive duplicates while updating a node?

Gun 0.8.8,Node.js-到-Node.js,Node.js-到-浏览器

这是jsfiddle中的前端模拟https://jsfiddle.net/sergibondarenko/tktodk62/20/

为了彻底开始,我从 Chrome 本地存储中删除了本地 data.jsongun 数据。

在Node.js

中创建一个节点
const gun = new Gun({peers:['http://localhost:8080/gun', 'http://localhost:8081/gun']});    
const node = gun.get('watcher/f0de26c0-a29f-11e7-8661-154b982951a4');
node.on(function (v, k) {
  console.log('v:', v); 
  console.log('k:', k); 
});

收听Node.js

const node = gun.get('watcher/f0de26c0-a29f-11e7-8661-154b982951a4');
node.get('stats').on(function (v, k) {
  console.log('v:', v);
  console.log('k:', k);
});

如期得到1个结果,不错

v: { _: { '#': 'j948ewfltvmmHthoESzM', '>': { num: 1508766155692 } },
  num: 0 }
k: stats

此外,我在浏览器端有一个监听器

<!DOCTYPE html>
<html>
  <script src="http://rawgit.com/amark/gun/master/gun.js"></script>
  <body>
    <script>
      var gun = new Gun({peers:['http://localhost:8080/gun', 'http://localhost:8081/gun']});
      var node = gun.get('watcher/f0de26c0-a29f-11e7-8661-154b982951a4');
      node.get('stats').on(function (v, k) {
        console.log('v:', v); 
        console.log('k:', k); 
      });
    </script>
  </body>
</html>

并按预期在节点创建上获得 1 个结果,很好

index.html:9 v: {"_":{"#":"j949102jDUdSklGduZh8",">":{"num":1508767186838}},"num":0}
index.html:10 k: stats

然后,我更新节点

const node = gun.get('watcher/f0de26c0-a29f-11e7-8661-154b982951a4');
node.put({
  stats: {
    num: 2
  },
  name: 'trex'
});

并且在两个侦听器

上收到重复的结果

Node.js

v: { _: { '#': 'j949102jDUdSklGduZh8', '>': { num: 1508769723940 } },
  num: 2 }
k: stats
v: { _: { '#': 'j949102jDUdSklGduZh8', '>': { num: 1508769723940 } },
  num: 2 }
k: stats

浏览器

index.html:9 v: {"_":{"#":"j949102jDUdSklGduZh8",">":{"num":1508769723940}},"num":2}
index.html:10 k: stats
index.html:9 v: {"_":{"#":"j949102jDUdSklGduZh8",">":{"num":1508769723940}},"num":2}
index.html:10 k: stats

为什么我会收到重复的邮件?


更新

即使只有一个枪友也有重复

如果我理解正确的话,(不久前我自己也有这个问题)那是因为Gun假设它在一个去中心化的格子网络中。每个获得更新的节点都会将该更新重新广播到它知道的所有节点。尽管 Gun 目前是通过中继服务器集中的,但它是为去中心化而构建的。因此,当你创建一个更改时,你会广播它,但现在它只是通过中继服务器为你广播到每个节点,包括你自己的节点。因此,如果您有一个由三个对等点组成的网络,中继服务器会将更新发送给所有三个点(包括您)。您的对等方可以删除重复数据而不是重新广播更新,但其他节点将重新广播它假设去中心化。因此,您将从服务器获得一个更新,然后从每个其他节点获得另一个更新。

我仍然不太清楚为什么当我是唯一的同伴时我会收到多个更新 ping。我相信这与服务器慷慨地不止一次地广播更改有关,只是为了给系统增加一些冗余。