1

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

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

为了重新开始,我从 Chrome 本地存储中删除了本地data.json和数据。gun

在 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'
});

并在两个听众上收到重复的结果

节点.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

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


更新

即使只有一个枪同行,也会有重复。

4

1 回答 1

2

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

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

于 2017-10-23T19:02:27.550 回答