Browse Source

Documenting how to walk the network using keypings

Caleb James DeLisle 9 years ago
parent
commit
3f7f1c98f6
1 changed files with 294 additions and 0 deletions
  1. 294 0
      doc/switchfun.txt

+ 294 - 0
doc/switchfun.txt

@@ -0,0 +1,294 @@
+## Walking all peers manually on a node using the common 3x5x8 switch scheme.
+## We're exclusively using the 8 form because it's easier to stick to one form
+## The node is 0015 to us, therefor all paths end in 5.
+## The first entry in the 8 form is 0400
+
+user@toshitba:~/wrk/cjdns$ ./contrib/nodejs/tools/splice.js 0000.0000.0000.0400 0000.0000.0000.0015
+0000.0000.0000.4005
+
+## After splicing that with the path to our peer, we clearly see that everything
+## will have a 5 added to the end.
+
+user@toshitba:~/wrk/cjdns$ ./contrib/nodejs/tools/cexec.js 'SwitchPinger_ping("0000.0000.0000.4005", 3000, 1)'
+{
+  "data": "",
+  "key": "xp2f7m98uw24664ngwl47k8uyx59sblgp8qsbpk24sh10ppu9fz0.k",
+  "ms": "382",
+  "path": "0000.0000.0000.4005",
+  "result": "pong",
+  "txid": "824920922",
+  "version": "8"
+}
+
+## 0400 is analogus to 0013 (the first peer)
+
+user@toshitba:~/wrk/cjdns$ ./contrib/nodejs/tools/cexec.js 'SwitchPinger_ping("0000.0000.0000.0135", 3000, 1)'
+{
+  "data": "",
+  "key": "xp2f7m98uw24664ngwl47k8uyx59sblgp8qsbpk24sh10ppu9fz0.k",
+  "ms": "407",
+  "path": "0000.0000.0000.0135",
+  "result": "pong",
+  "txid": "1322201729",
+  "version": "8"
+}
+
+## Since the lowest 2 bits are reserved for specifying the encoding form (they're both 0)
+## numbers count 400, 404, 408, 40c, 410, 414, 418, 41c, 420 ...
+
+user@toshitba:~/wrk/cjdns$ ./contrib/nodejs/tools/cexec.js 'SwitchPinger_ping("0000.0000.0000.4045", 3000, 1)'
+{
+  "data": "",
+  "key": "2v6dt6f841hzhq2wsqwt263w2dswkt6fz82vcyxqptk88mtp8y50.k",
+  "ms": "897",
+  "path": "0000.0000.0000.4045",
+  "result": "pong",
+  "txid": "3621711461",
+  "version": "8"
+}
+
+## This is us, wow, we have slot 3, what luck!
+## the shortest version of this route is 0017
+user@toshitba:~/wrk/cjdns$ ./contrib/nodejs/tools/cexec.js 'SwitchPinger_ping("0000.0000.0000.4085", 3000, 1)'
+{
+  "data": "",
+  "key": "b8xn6kv9279k7mjdmg08ut6yc4n3d2lp3s3juq39qz83z9bzxgz0.k",
+  "ms": "638",
+  "path": "0000.0000.0000.4085",
+  "result": "pong",
+  "txid": "1345867629",
+  "version": "8"
+}
+
+## Oops! If you use a number which is not in the sequence you get a
+## switch error (or perhaps it will be interpreted and end up at another node)
+user@toshitba:~/wrk/cjdns$ ./contrib/nodejs/tools/cexec.js 'SwitchPinger_ping("0000.0000.0000.40d5", 3000, 1)'
+{
+  "data": "",
+  "ms": "539",
+  "path": "0000.0000.0000.40d5",
+  "result": "err_switch",
+  "txid": "3599763113",
+  "version": "0"
+}
+
+user@toshitba:~/wrk/cjdns$ ./contrib/nodejs/tools/cexec.js 'SwitchPinger_ping("0000.0000.0000.40c5", 3000, 1)'
+{
+  "data": "",
+  "key": "lpcvt3u85q837u402dlu3rfg107x92j5xlzd77tftsjy88zx0yf0.k",
+  "ms": "408",
+  "path": "0000.0000.0000.40c5",
+  "result": "pong",
+  "txid": "259944377",
+  "version": "7"
+}
+user@toshitba:~/wrk/cjdns$ ./contrib/nodejs/tools/cexec.js 'SwitchPinger_ping("0000.0000.0000.4105", 3000, 1)'
+{
+  "data": "",
+  "key": "wb0hdx8vu6khpfj32qzhvykjk7gq8bc691czhx3yp7zn04bh5gy0.k",
+  "ms": "363",
+  "path": "0000.0000.0000.4105",
+  "result": "pong",
+  "txid": "1099356221",
+  "version": "8"
+}
+user@toshitba:~/wrk/cjdns$ ./contrib/nodejs/tools/cexec.js 'SwitchPinger_ping("0000.0000.0000.4145", 3000, 1)'
+{
+  "data": "",
+  "key": "6q09l149vz0bqtx51jy557juj39wxmupmfd52h9w5xsdnsns1qj0.k",
+  "ms": "223",
+  "path": "0000.0000.0000.4145",
+  "result": "pong",
+  "txid": "542004376",
+  "version": "7"
+}
+user@toshitba:~/wrk/cjdns$ ./contrib/nodejs/tools/cexec.js 'SwitchPinger_ping("0000.0000.0000.4185", 3000, 1)'
+{
+  "data": "",
+  "key": "1cgrz7hmc4wzg7pu284u5b77y2mdzt261tr0rj0qf7j2vsqf5150.k",
+  "ms": "312",
+  "path": "0000.0000.0000.4185",
+  "result": "pong",
+  "txid": "87763052",
+  "version": "7"
+}
+user@toshitba:~/wrk/cjdns$ ./contrib/nodejs/tools/cexec.js 'SwitchPinger_ping("0000.0000.0000.41c5", 3000, 1)'
+{
+  "data": "",
+  "key": "w7xvbpmgwuwkv8x9wrpfmydtfxv6ydfmpktgc6tt8v8d3c9bn580.k",
+  "ms": "394",
+  "path": "0000.0000.0000.41c5",
+  "result": "pong",
+  "txid": "1682459805",
+  "version": "8"
+}
+user@toshitba:~/wrk/cjdns$ ./contrib/nodejs/tools/cexec.js 'SwitchPinger_ping("0000.0000.0000.4205", 3000, 1)'
+{
+  "data": "",
+  "key": "11sfkq2clbv4dgzgx8hm47p4ld9pwy82y7jluvjh91cyl1n7bwf0.k",
+  "ms": "329",
+  "path": "0000.0000.0000.4205",
+  "result": "pong",
+  "txid": "3712296271",
+  "version": "7"
+}
+user@toshitba:~/wrk/cjdns$ ./contrib/nodejs/tools/cexec.js 'SwitchPinger_ping("0000.0000.0000.4245", 3000, 1)'
+{
+  "data": "",
+  "key": "c94sls20x5shql6r4z4nvqlrs9pcppgj2h41m1bntzk60j5wrs40.k",
+  "ms": "362",
+  "path": "0000.0000.0000.4245",
+  "result": "pong",
+  "txid": "1883792007",
+  "version": "7"
+}
+user@toshitba:~/wrk/cjdns$ ./contrib/nodejs/tools/cexec.js 'SwitchPinger_ping("0000.0000.0000.4285", 3000, 1)'
+{
+  "data": "",
+  "key": "08pdl5mbcpx2b0uh6wj6wktq5v47kv9gpy40rnqr52t1ugctr430.k",
+  "ms": "252",
+  "path": "0000.0000.0000.4285",
+  "result": "pong",
+  "txid": "711411764",
+  "version": "7"
+}
+user@toshitba:~/wrk/cjdns$ ./contrib/nodejs/tools/cexec.js 'SwitchPinger_ping("0000.0000.0000.42c5", 3000, 1)'
+{
+  "data": "",
+  "key": "r5tmqf72mjzht1grqm34l1ldrx9tdubyzw33ucng6bfqp1y0mux0.k",
+  "ms": "452",
+  "path": "0000.0000.0000.42c5",
+  "result": "pong",
+  "txid": "2970256056",
+  "version": "7"
+}
+
+
+## This seems to be a node which is supposed to be connected but is not responding.
+user@toshitba:~/wrk/cjdns$ ./contrib/nodejs/tools/cexec.js 'SwitchPinger_ping("0000.0000.0000.4305", 3000, 1)'
+{
+  "ms": "3003",
+  "path": "0000.0000.0000.4305",
+  "result": "timeout",
+  "txid": "1014318430",
+  "version": "7"
+}
+## Try again for good measure
+user@toshitba:~/wrk/cjdns$ ./contrib/nodejs/tools/cexec.js 'SwitchPinger_ping("0000.0000.0000.4305", 3000, 1)'
+{
+  "ms": "3002",
+  "path": "0000.0000.0000.4305",
+  "result": "timeout",
+  "txid": "2282909610",
+  "version": "7"
+}
+
+
+user@toshitba:~/wrk/cjdns$ ./contrib/nodejs/tools/cexec.js 'SwitchPinger_ping("0000.0000.0000.42c5", 3000, 1)'
+{
+  "data": "",
+  "key": "r5tmqf72mjzht1grqm34l1ldrx9tdubyzw33ucng6bfqp1y0mux0.k",
+  "ms": "181",
+  "path": "0000.0000.0000.42c5",
+  "result": "pong",
+  "txid": "2432582962",
+  "version": "7"
+}
+user@toshitba:~/wrk/cjdns$ ./contrib/nodejs/tools/cexec.js 'SwitchPinger_ping("0000.0000.0000.4345", 3000, 1)'
+{
+  "data": "",
+  "key": "fj9q4s6fg8mjdjfks8lc8bp7ly05qm11z54crlb7tz1pl01fg3r0.k",
+  "ms": "329",
+  "path": "0000.0000.0000.4345",
+  "result": "pong",
+  "txid": "1698617630",
+  "version": "7"
+}
+
+
+## We have either reached the top of the list or there is an empty slot left by a node which
+## disconnected, we can't know for sure so lets ping a few more nodes in order to check.
+user@toshitba:~/wrk/cjdns$ ./contrib/nodejs/tools/cexec.js 'SwitchPinger_ping("0000.0000.0000.4385", 3000, 1)'
+{
+  "data": "",
+  "ms": "158",
+  "path": "0000.0000.0000.4385",
+  "result": "err_switch",
+  "txid": "880013604",
+  "version": "0"
+}
+user@toshitba:~/wrk/cjdns$ ./contrib/nodejs/tools/cexec.js 'SwitchPinger_ping("0000.0000.0000.43c5", 3000, 1)'
+{
+  "data": "",
+  "ms": "444",
+  "path": "0000.0000.0000.43c5",
+  "result": "err_switch",
+  "txid": "1175469204",
+  "version": "0"
+}
+user@toshitba:~/wrk/cjdns$ ./contrib/nodejs/tools/cexec.js 'SwitchPinger_ping("0000.0000.0000.4405", 3000, 1)'
+{
+  "data": "",
+  "ms": "347",
+  "path": "0000.0000.0000.4405",
+  "result": "err_switch",
+  "txid": "3258844093",
+  "version": "0"
+}
+user@toshitba:~/wrk/cjdns$ ./contrib/nodejs/tools/cexec.js 'SwitchPinger_ping("0000.0000.0000.4445", 3000, 1)'
+{
+  "data": "",
+  "ms": "321",
+  "path": "0000.0000.0000.4445",
+  "result": "err_switch",
+  "txid": "869243597",
+  "version": "0"
+}
+user@toshitba:~/wrk/cjdns$ 
+
+
+
+
+
+
+
+## Recall from above that we're 0408 aka 0017 (because we can be represented using the small encoding)
+## ping selves
+user@toshitba:~/wrk/cjdns$ ./contrib/nodejs/tools/cexec.js 'SwitchPinger_ping("0000.0000.0000.0175", 3000, 1)'{
+  "data": "",
+  "key": "b8xn6kv9279k7mjdmg08ut6yc4n3d2lp3s3juq39qz83z9bzxgz0.k",
+  "ms": "619",
+  "path": "0000.0000.0000.0175",
+  "result": "pong",
+  "txid": "1099734707",
+  "version": "8"
+}
+## just to verify that it's working, we'll create a loop packet
+## us->them->us->them and it works.
+user@toshitba:~/wrk/cjdns$ ./contrib/nodejs/tools/cexec.js 'SwitchPinger_ping("0000.0000.0000.1575", 3000, 1)'
+{
+  "data": "",
+  "key": "nx6k81p1nxw1b5ry8ub5u63hu0tlskp1t2fytcbrbf1709xh11g0.k",
+  "ms": "1251",
+  "path": "0000.0000.0000.1575",
+  "result": "pong",
+  "txid": "3109463617",
+  "version": "8"
+}
+## We can make it loop more but the latency gets very big!
+user@toshitba:~/wrk/cjdns$ ./contrib/nodejs/tools/cexec.js 'SwitchPinger_ping("0000.0001.7575.7575", 3000, 1)'
+{
+  "data": "",
+  "key": "b8xn6kv9279k7mjdmg08ut6yc4n3d2lp3s3juq39qz83z9bzxgz0.k",
+  "ms": "1900",
+  "path": "0000.0001.7575.7575",
+  "result": "pong",
+  "txid": "2807636566",
+  "version": "8"
+}
+
+## This only works because we and our peer are both using 3x5x8 encoding, if they were using
+## something different, it would still be possible but more complex to craft paths.
+## nodes describe their encoding schemes to one another so even the most complex encoding
+## schemes are supported by cjdns which has to craft paths through the network much like
+## we did here.