hypercore 9.12.0 → 10.0.0-alpha.11

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (86) hide show
  1. package/.github/workflows/test-node.yml +3 -4
  2. package/README.md +131 -404
  3. package/__snapshots__/test/storage.js.snapshot.cjs +15 -0
  4. package/examples/announce.js +19 -0
  5. package/examples/basic.js +10 -0
  6. package/examples/http.js +123 -0
  7. package/examples/lookup.js +20 -0
  8. package/index.js +365 -1600
  9. package/lib/bitfield.js +113 -285
  10. package/lib/block-encryption.js +68 -0
  11. package/lib/block-store.js +58 -0
  12. package/lib/core.js +468 -0
  13. package/lib/extensions.js +76 -0
  14. package/lib/merkle-tree.js +1110 -0
  15. package/lib/messages.js +571 -0
  16. package/lib/mutex.js +39 -0
  17. package/lib/oplog.js +224 -0
  18. package/lib/protocol.js +525 -0
  19. package/lib/random-iterator.js +46 -0
  20. package/lib/remote-bitfield.js +24 -0
  21. package/lib/replicator.js +857 -0
  22. package/lib/streams.js +39 -0
  23. package/package.json +44 -45
  24. package/test/basic.js +59 -471
  25. package/test/bitfield.js +48 -133
  26. package/test/core.js +290 -0
  27. package/test/encodings.js +18 -0
  28. package/test/encryption.js +123 -0
  29. package/test/extension.js +71 -0
  30. package/test/helpers/index.js +23 -0
  31. package/test/merkle-tree.js +518 -0
  32. package/test/mutex.js +137 -0
  33. package/test/oplog.js +399 -0
  34. package/test/preload.js +72 -0
  35. package/test/replicate.js +227 -824
  36. package/test/sessions.js +173 -0
  37. package/test/storage.js +31 -0
  38. package/test/streams.js +39 -146
  39. package/test/user-data.js +47 -0
  40. package/bench/all.sh +0 -65
  41. package/bench/copy-64kb-blocks.js +0 -51
  42. package/bench/helpers/read-throttled.js +0 -27
  43. package/bench/helpers/read.js +0 -47
  44. package/bench/helpers/write.js +0 -29
  45. package/bench/read-16kb-blocks-proof-throttled.js +0 -1
  46. package/bench/read-16kb-blocks-proof.js +0 -1
  47. package/bench/read-16kb-blocks-throttled.js +0 -1
  48. package/bench/read-16kb-blocks.js +0 -1
  49. package/bench/read-512b-blocks.js +0 -1
  50. package/bench/read-64kb-blocks-linear-batch.js +0 -18
  51. package/bench/read-64kb-blocks-linear.js +0 -18
  52. package/bench/read-64kb-blocks-proof.js +0 -1
  53. package/bench/read-64kb-blocks.js +0 -1
  54. package/bench/replicate-16kb-blocks.js +0 -19
  55. package/bench/replicate-64kb-blocks.js +0 -19
  56. package/bench/write-16kb-blocks.js +0 -1
  57. package/bench/write-512b-blocks.js +0 -1
  58. package/bench/write-64kb-blocks-static.js +0 -1
  59. package/bench/write-64kb-blocks.js +0 -1
  60. package/example.js +0 -23
  61. package/lib/cache.js +0 -26
  62. package/lib/crypto.js +0 -5
  63. package/lib/replicate.js +0 -829
  64. package/lib/safe-buffer-equals.js +0 -6
  65. package/lib/storage.js +0 -421
  66. package/lib/tree-index.js +0 -183
  67. package/test/ack.js +0 -306
  68. package/test/audit.js +0 -36
  69. package/test/cache.js +0 -93
  70. package/test/compat.js +0 -209
  71. package/test/copy.js +0 -377
  72. package/test/default-storage.js +0 -51
  73. package/test/extensions.js +0 -137
  74. package/test/get.js +0 -64
  75. package/test/head.js +0 -65
  76. package/test/helpers/create-tracking-ram.js +0 -27
  77. package/test/helpers/create.js +0 -6
  78. package/test/helpers/replicate.js +0 -4
  79. package/test/seek.js +0 -234
  80. package/test/selections.js +0 -95
  81. package/test/set-uploading-downloading.js +0 -91
  82. package/test/stats.js +0 -77
  83. package/test/timeouts.js +0 -22
  84. package/test/tree-index.js +0 -841
  85. package/test/update.js +0 -156
  86. package/test/value-encoding.js +0 -52
package/test/ack.js DELETED
@@ -1,306 +0,0 @@
1
- var create = require('./helpers/create')
2
- var tape = require('tape')
3
-
4
- tape('replicate with ack', function (t) {
5
- var feed = create()
6
- feed.on('ready', function () {
7
- var clone = create(feed.key)
8
-
9
- var stream = feed.replicate(true, { live: true, ack: true })
10
- stream.pipe(clone.replicate(false, { live: true })).pipe(stream)
11
-
12
- stream.once('duplex-channel', function () {
13
- feed.append(['a', 'b', 'c'])
14
- })
15
- var seen = 0
16
- stream.on('ack', function (ack) {
17
- seen++
18
- if (seen > 3) t.fail()
19
- if (seen === 3) t.end()
20
- })
21
- })
22
- })
23
-
24
- tape('ack only when something is downloaded', function (t) {
25
- t.plan(1)
26
- var feed = create()
27
- feed.on('ready', function () {
28
- var clone = create(feed.key)
29
- var stream1 = clone.replicate(true)
30
- stream1.on('ack', function (ack) {
31
- t.fail('unexpected ack')
32
- })
33
- feed.append(['a', 'b', 'c'], function () {
34
- // pre-populate with 3 records
35
- stream1.pipe(feed.replicate(false)).pipe(stream1)
36
- })
37
- stream1.on('end', function () {
38
- feed.append(['d', 'e'])
39
- // add 2 more records. only these should be ACK'd
40
- var acks = []
41
- var stream2 = feed.replicate(true, { ack: true })
42
- stream2.on('ack', function (ack) {
43
- acks.push(ack.start)
44
- })
45
- stream2.pipe(clone.replicate(false)).pipe(stream2)
46
- stream2.on('end', function () {
47
- t.deepEqual(acks.sort(), [3, 4])
48
- t.end()
49
- })
50
- })
51
- })
52
- })
53
-
54
- tape('simultaneous replication with ack and no-ack', function (t) {
55
- t.plan(1)
56
- var feed = create()
57
- feed.on('ready', function () {
58
- feed.append(['a', 'b', 'c'])
59
-
60
- var clone1 = create(feed.key)
61
- var clone2 = create(feed.key)
62
- var stream0 = feed.replicate(true, { ack: true })
63
- var stream1 = clone1.replicate(false)
64
- var stream2 = clone2.replicate(false)
65
- var stream3 = feed.replicate(true)
66
- stream1.pipe(stream0).pipe(stream1)
67
- stream2.pipe(stream3).pipe(stream2)
68
-
69
- var acks = []
70
- stream0.on('ack', function (ack) {
71
- acks.push(ack.start)
72
- })
73
- stream1.on('ack', function (ack) {
74
- t.fail('unexpected ack')
75
- })
76
- stream2.on('ack', function (ack) {
77
- t.fail('unexpected ack')
78
- })
79
- stream3.on('ack', function (ack) {
80
- t.fail('unexpected ack')
81
- })
82
- stream1.on('end', function () {
83
- t.deepEqual(acks.sort(), [0, 1, 2])
84
- t.end()
85
- })
86
- })
87
- })
88
-
89
- tape('simultaneous replication with two acks', function (t) {
90
- t.plan(1)
91
- var feed = create()
92
- feed.on('ready', function () {
93
- feed.append(['a', 'b', 'c'])
94
-
95
- var clone1 = create(feed.key)
96
- var clone2 = create(feed.key)
97
- var stream0 = feed.replicate(true, { ack: true })
98
- var stream1 = clone1.replicate(false)
99
- var stream2 = clone2.replicate(false)
100
- var stream3 = feed.replicate(true, { ack: true })
101
- stream1.pipe(stream0).pipe(stream1)
102
- stream2.pipe(stream3).pipe(stream2)
103
-
104
- var acks = [[], []]
105
- stream0.on('ack', function (ack) {
106
- acks[0].push(ack.start)
107
- })
108
- stream1.on('ack', function (ack) {
109
- t.fail('unexpected ack')
110
- })
111
- stream2.on('ack', function (ack) {
112
- t.fail('unexpected ack')
113
- })
114
- stream3.on('ack', function (ack) {
115
- acks[1].push(ack.start)
116
- })
117
- var pending = 2
118
- stream1.on('end', function () {
119
- if (--pending === 0) check()
120
- })
121
- stream2.on('end', function () {
122
- if (--pending === 0) check()
123
- })
124
- function check () {
125
- acks.forEach(function (r) { r.sort() })
126
- t.deepEqual(acks, [[0, 1, 2], [0, 1, 2]])
127
- t.end()
128
- }
129
- })
130
- })
131
-
132
- tape('acks where clones should not ack', function (t) {
133
- t.plan(1)
134
- var feed = create()
135
- feed.on('ready', function () {
136
- feed.append(['a', 'b', 'c'])
137
-
138
- var clone1 = create(feed.key)
139
- var clone2 = create(feed.key)
140
- var stream1 = feed.replicate(true, { ack: true })
141
- var stream2 = feed.replicate(true, { ack: true })
142
- var cstream1 = clone1.replicate(false, { ack: true }) // but shouldn't get any acks
143
- var cstream2 = clone2.replicate(false, { ack: true }) // but shouldn't get any acks
144
- stream1.pipe(cstream1).pipe(stream1)
145
- stream2.pipe(cstream2).pipe(stream2)
146
-
147
- cstream1.on('ack', function (ack) {
148
- t.fail('unexpected ack')
149
- })
150
- cstream2.on('ack', function (ack) {
151
- t.fail('unexpected ack')
152
- })
153
- var acks = [[], []]
154
- stream1.on('ack', function (ack) {
155
- acks[0].push(ack.start)
156
- })
157
- stream2.on('ack', function (ack) {
158
- acks[1].push(ack.start)
159
- })
160
- var pending = 2
161
- stream1.on('end', function () {
162
- if (--pending === 0) check()
163
- })
164
- stream2.on('end', function () {
165
- if (--pending === 0) check()
166
- })
167
- function check () {
168
- acks.forEach(function (r) { r.sort() })
169
- t.deepEqual(acks, [[0, 1, 2], [0, 1, 2]])
170
- t.end()
171
- }
172
- })
173
- })
174
-
175
- tape('transitive clone acks', function (t) {
176
- t.plan(2)
177
- var feed = create()
178
- feed.on('ready', function () {
179
- feed.append(['a', 'b', 'c'], ready)
180
- })
181
- function ready (err) {
182
- t.ifError(err)
183
- var clone1 = create(feed.key)
184
- var clone2 = create(feed.key)
185
- var stream1 = feed.replicate(true, { live: true, ack: true })
186
- var stream2 = clone1.replicate(false, { live: true, ack: true })
187
- var stream3 = clone1.replicate(true, { live: true, ack: true })
188
- var stream4 = clone2.replicate(false, { live: true, ack: true })
189
- var acks = [[], [], [], []]
190
- ;[stream1, stream2, stream3, stream4].forEach(function (stream, i) {
191
- stream.on('ack', function (ack) {
192
- acks[i].push(ack.start)
193
- })
194
- })
195
- stream1.pipe(stream2).pipe(stream1)
196
- stream3.pipe(stream4).pipe(stream3)
197
- var dl = 0
198
- clone2.on('download', function () {
199
- // allow an extra tick for ack response to arrive
200
- if (++dl === 3) setImmediate(check)
201
- })
202
- function check () {
203
- acks.forEach(function (r) { r.sort() })
204
- t.deepEqual(acks, [[0, 1, 2], [], [0, 1, 2], []])
205
- }
206
- }
207
- })
208
-
209
- tape('larger gossip network acks', function (t) {
210
- t.plan(16)
211
- var feed = create()
212
- var cores = [feed]
213
- var acks = {}
214
- feed.on('ready', function () {
215
- for (var i = 1; i < 10; i++) {
216
- cores.push(create(feed.key))
217
- }
218
- next(0)
219
- })
220
- var ops = [
221
- ['append', 'A'],
222
- ['connect', 0, 1], // acks["0,1"].push(0)
223
- ['append', 'B'],
224
- ['append', 'C'],
225
- ['connect', 1, 2], // acks["1,2"].push(0)
226
- ['connect', 0, 1], // acks["0,1"].push(1,2)
227
- ['append', 'D'],
228
- ['append', 'E'],
229
- ['append', 'F'],
230
- ['connect', 0, 5], // acks["0,5"].push(0,1,2,3,4,5)
231
- ['connect', 2, 5], // acks["5,2"].push(1,2,3,4,5)
232
- ['connect', 5, 6], // acks["5,6"].push(0,1,2,3,4,5)
233
- ['connect', 1, 6], // acks["6,1"].push(3,4,5)
234
- ['append', 'G'],
235
- ['append', 'H'],
236
- ['connect', 4, 2], // acks["2,4"].push(0,1,2,3,4,5)
237
- ['connect', 0, 7], // acks["0,7"].push(0,1,2,3,4,5,6,7)
238
- ['connect', 4, 7], // acks["7,4"].push(6,7)
239
- ['connect', 4, 5], // acks["4,5"].push(6,7)
240
- ['connect', 5, 8], // acks["5,8"].push(0,1,2,3,4,5,6,7)
241
- ['append', 'I'],
242
- ['append', 'J'],
243
- ['append', 'K'],
244
- ['connect', 0, 8], // acks["0,8"].push(8,9,10)
245
- ['connect', 5, 9], // acks["5,9"].push(0,1,2,3,4,5,6,7)
246
- ['connect', 8, 4], // acks["8,4"].push(8,9,10)
247
- ['append', 'L'],
248
- ['append', 'M'],
249
- ['append', 'N'],
250
- ['append', 'O'],
251
- ['connect', 9, 0], // acks["0,9"].push(8,9,10,11,12,13,14)
252
- ['connect', 2, 9] // acks["9,2"].push(6,7,8,9,10,11,12,13,14)
253
- ]
254
- function next (i) {
255
- var op = ops[i]
256
- if (!op) return check()
257
- if (op[0] === 'append') {
258
- feed.append(op[1], function (err) {
259
- t.ifError(err)
260
- next(i + 1)
261
- })
262
- } else if (op[0] === 'connect') {
263
- var src = cores[op[1]]
264
- var dst = cores[op[2]]
265
- var sr = src.replicate(true, { ack: true })
266
- var dr = dst.replicate(false, { ack: true })
267
- sr.on('ack', function (ack) {
268
- var key = op[1] + ',' + op[2]
269
- if (!acks[key]) acks[key] = []
270
- acks[key].push(ack.start)
271
- })
272
- dr.on('ack', function (ack) {
273
- var key = op[2] + ',' + op[1]
274
- if (!acks[key]) acks[key] = []
275
- acks[key].push(ack.start)
276
- })
277
- sr.pipe(dr).pipe(sr)
278
- var pending = 2
279
- sr.on('end', function () { if (--pending === 0) next(i + 1) })
280
- dr.on('end', function () { if (--pending === 0) next(i + 1) })
281
- }
282
- }
283
- function check () {
284
- Object.keys(acks).forEach(function (key) {
285
- acks[key].sort(function (a, b) { return a - b })
286
- })
287
- t.deepEqual(acks, {
288
- '0,1': [0, 1, 2],
289
- '1,2': [0],
290
- '0,5': [0, 1, 2, 3, 4, 5],
291
- '5,2': [1, 2, 3, 4, 5],
292
- '5,6': [0, 1, 2, 3, 4, 5],
293
- '6,1': [3, 4, 5],
294
- '2,4': [0, 1, 2, 3, 4, 5],
295
- '0,7': [0, 1, 2, 3, 4, 5, 6, 7],
296
- '7,4': [6, 7],
297
- '4,5': [6, 7],
298
- '5,8': [0, 1, 2, 3, 4, 5, 6, 7],
299
- '0,8': [8, 9, 10],
300
- '5,9': [0, 1, 2, 3, 4, 5, 6, 7],
301
- '8,4': [8, 9, 10],
302
- '0,9': [8, 9, 10, 11, 12, 13, 14],
303
- '9,2': [6, 7, 8, 9, 10, 11, 12, 13, 14]
304
- })
305
- }
306
- })
package/test/audit.js DELETED
@@ -1,36 +0,0 @@
1
- var tape = require('tape')
2
- var create = require('./helpers/create')
3
-
4
- tape('basic audit', function (t) {
5
- var feed = create()
6
-
7
- feed.append('hello')
8
- feed.append('world', function () {
9
- feed.audit(function (err, report) {
10
- t.error(err, 'no error')
11
- t.same(report, { valid: 2, invalid: 0 })
12
- t.end()
13
- })
14
- })
15
- })
16
-
17
- tape('basic audit with bad data', function (t) {
18
- var feed = create()
19
-
20
- feed.append('hello')
21
- feed.append('world', function () {
22
- feed._storage.data.write(0, Buffer.from('H'), function () {
23
- t.ok(feed.has(0))
24
- feed.audit(function (err, report) {
25
- t.error(err, 'no error')
26
- t.same(report, { valid: 1, invalid: 1 })
27
- t.notOk(feed.has(0))
28
- feed.audit(function (err, report) {
29
- t.error(err, 'no error')
30
- t.same(report, { valid: 1, invalid: 0 })
31
- t.end()
32
- })
33
- })
34
- })
35
- })
36
- })
package/test/cache.js DELETED
@@ -1,93 +0,0 @@
1
- var tape = require('tape')
2
- var create = require('./helpers/create')
3
-
4
- tape('default options does not use data cache', function (t) {
5
- var feed = create()
6
- feed.append(['hello', 'world'], err => {
7
- t.error(err, 'no error')
8
- feed.get(0, function (err, block) {
9
- t.error(err, 'no error')
10
- t.same(feed._storage.treeCache.byteSize, 40)
11
- feed.get(1, function (err, block) {
12
- t.error(err, 'no error')
13
- t.same(feed._storage.treeCache.byteSize, 80)
14
- t.false(feed._storage.dataCache)
15
- t.end()
16
- })
17
- })
18
- })
19
- })
20
-
21
- tape('numeric data cache opt creates data cache', function (t) {
22
- var feed = create({ cache: { data: 1024 } })
23
- var firstLength = Buffer.byteLength('hello')
24
- var secondLength = Buffer.byteLength('world')
25
-
26
- feed.append(['hello', 'world'], err => {
27
- t.error(err, 'no error')
28
- feed.get(0, function (err, block) {
29
- t.error(err, 'no error')
30
- t.true(feed._storage.dataCache)
31
- t.same(feed._storage.dataCache.byteSize, firstLength)
32
- feed.get(1, function (err, block) {
33
- t.error(err, 'no error')
34
- t.same(feed._storage.dataCache.byteSize, firstLength + secondLength)
35
- t.end()
36
- })
37
- })
38
- })
39
- })
40
-
41
- tape('can use a custom cache object', function (t) {
42
- var treeStorage = []
43
- var dataStorage = []
44
- var createCache = function (storage) {
45
- return {
46
- get: function (key) {
47
- return storage[key]
48
- },
49
- set: function (key, value) {
50
- storage[key] = value
51
- }
52
- }
53
- }
54
-
55
- var feed = create({
56
- cache: {
57
- tree: createCache(treeStorage),
58
- data: createCache(dataStorage)
59
- }
60
- })
61
- feed.append(['hello', 'world'], err => {
62
- t.error(err, 'no error')
63
- feed.get(0, function (err, block) {
64
- t.error(err, 'no error')
65
- t.same(dataStorage.length, 1)
66
- t.same(treeStorage.length, 1)
67
- feed.get(1, function (err, block) {
68
- t.error(err, 'no error')
69
- t.same(dataStorage.length, 2)
70
- // tree storage should have entries at 0 and 2
71
- t.same(treeStorage.length, 3)
72
- t.end()
73
- })
74
- })
75
- })
76
- })
77
-
78
- tape('can disable all caching', function (t) {
79
- var feed = create({ cache: { tree: false } })
80
-
81
- feed.append(['hello', 'world'], err => {
82
- t.error(err, 'no error')
83
- feed.get(0, function (err, block) {
84
- t.error(err, 'no error')
85
- feed.get(1, function (err, block) {
86
- t.error(err, 'no error')
87
- t.false(feed._storage.dataCache)
88
- t.false(feed._storage.treeCache)
89
- t.end()
90
- })
91
- })
92
- })
93
- })
package/test/compat.js DELETED
@@ -1,209 +0,0 @@
1
- var tape = require('tape')
2
- var hypercore = require('../')
3
- var ram = require('random-access-memory')
4
- var replicate = require('./helpers/replicate')
5
-
6
- tape('deterministic data and tree', function (t) {
7
- t.plan(10)
8
-
9
- var expectedTree = Buffer.from(
10
- '0502570200002807424c414b4532620000000000000000000000000000000000ab27d45f509274' +
11
- 'ce0d08f4f09ba2d0e0d8df61a0c2a78932e81b5ef26ef398df0000000000000001064321a8413b' +
12
- 'e8c604599689e2c7a59367b031b598bceeeb16556a8f3252e0de000000000000000294c1705400' +
13
- '5942a002c7c39fbb9c6183518691fb401436f1a2f329b380230af800000000000000018dfe81d5' +
14
- '76464773f848b9aba1c886fde57a49c283ab57f4a297d976d986651e00000000000000041d2fad' +
15
- 'c9ce604c7e592949edc964e45aaa10990d7ee53328439ef9b2cf8aa6ff00000000000000013a8d' +
16
- 'cc74e80b8314e8e13e1e462358cf58cf5fc4413a9b18a891ffacc551c395000000000000000228' +
17
- '28647a654a712738e35f49d1c05c676010be0b33882affc1d1e7e9fee59d400000000000000001' +
18
- '000000000000000000000000000000000000000000000000000000000000000000000000000000' +
19
- '00baac70b6d38243efa028ee977c462e4bec73d21d09ceb8cc16f4d4b1ee228a45000000000000' +
20
- '0001d1b021632c7fab84544053379112ca7b165bb21283821816c5b6c89ff7f78e2d0000000000' +
21
- '000002d2ab421cece792033058787a5ba72f3a701fddc25540d5924e9819d7c12e02f200000000' +
22
- '00000001',
23
- 'hex'
24
- )
25
-
26
- for (var i = 0; i < 5; i++) run()
27
-
28
- function run () {
29
- var st = storage()
30
- var feed = hypercore(st)
31
-
32
- feed.append(['a', 'b', 'c', 'd', 'e', 'f'], function () {
33
- t.same(st.data.toBuffer().toString(), 'abcdef')
34
- t.same(st.tree.toBuffer(), expectedTree)
35
- })
36
- }
37
- })
38
-
39
- tape('deterministic data and tree after replication', function (t) {
40
- t.plan(10)
41
-
42
- var expectedTree = Buffer.from(
43
- '0502570200002807424c414b4532620000000000000000000000000000000000ab27d45f509274' +
44
- 'ce0d08f4f09ba2d0e0d8df61a0c2a78932e81b5ef26ef398df0000000000000001064321a8413b' +
45
- 'e8c604599689e2c7a59367b031b598bceeeb16556a8f3252e0de000000000000000294c1705400' +
46
- '5942a002c7c39fbb9c6183518691fb401436f1a2f329b380230af800000000000000018dfe81d5' +
47
- '76464773f848b9aba1c886fde57a49c283ab57f4a297d976d986651e00000000000000041d2fad' +
48
- 'c9ce604c7e592949edc964e45aaa10990d7ee53328439ef9b2cf8aa6ff00000000000000013a8d' +
49
- 'cc74e80b8314e8e13e1e462358cf58cf5fc4413a9b18a891ffacc551c395000000000000000228' +
50
- '28647a654a712738e35f49d1c05c676010be0b33882affc1d1e7e9fee59d400000000000000001' +
51
- '000000000000000000000000000000000000000000000000000000000000000000000000000000' +
52
- '00baac70b6d38243efa028ee977c462e4bec73d21d09ceb8cc16f4d4b1ee228a45000000000000' +
53
- '0001d1b021632c7fab84544053379112ca7b165bb21283821816c5b6c89ff7f78e2d0000000000' +
54
- '000002d2ab421cece792033058787a5ba72f3a701fddc25540d5924e9819d7c12e02f200000000' +
55
- '00000001',
56
- 'hex'
57
- )
58
-
59
- for (var i = 0; i < 5; i++) run()
60
-
61
- function run () {
62
- var feed = hypercore(ram)
63
-
64
- feed.append(['a', 'b', 'c', 'd', 'e', 'f'], function () {
65
- var st = storage()
66
- var clone = hypercore(st, feed.key)
67
-
68
- replicate(feed, clone).on('end', function () {
69
- t.same(st.data.toBuffer().toString(), 'abcdef')
70
- t.same(st.tree.toBuffer(), expectedTree)
71
- })
72
- })
73
- }
74
- })
75
-
76
- tape('deterministic signatures', function (t) {
77
- t.plan(20)
78
-
79
- var key = Buffer.from('9718a1ff1c4ca79feac551c0c7212a65e4091278ec886b88be01ee4039682238', 'hex')
80
- var secretKey = Buffer.from(
81
- '53729c0311846cca9cc0eded07aaf9e6689705b6a0b1bb8c3a2a839b72fda383' +
82
- '9718a1ff1c4ca79feac551c0c7212a65e4091278ec886b88be01ee4039682238',
83
- 'hex'
84
- )
85
-
86
- var compatExpectedSignatures = Buffer.from(
87
- '050257010000400745643235353139000000000000000000000000000000000084684e8dd76c339' +
88
- 'd6f5754e813204906ee818e6c6cdc6a816a2ac785a3e0d926ac08641a904013194fe6121847b7da' +
89
- 'd4e361965d47715428eb0a0ededbdd5909d037ff3c3614fa0100ed9264a712d3b77cbe7a4f6eadd' +
90
- '8f342809be99dfb9154a19e278d7a5de7d2b4d890f7701a38b006469f6bab1aff66ac6125d48baf' +
91
- 'dc0711057675ed57d445ce7ed4613881be37ebc56bb40556b822e431bb4dc3517421f9a5e3ed124' +
92
- 'eb5c4db8367386d9ce12b2408613b9fec2837022772a635ffd807',
93
- 'hex'
94
- )
95
-
96
- var expectedSignature = Buffer.from(
97
- '42e057f2c225b4c5b97876a15959324931ad84646a8bf2e4d14487c0f117966a585edcdda54670d' +
98
- 'd5def829ca85924ce44ae307835e57d5729aef8cd91678b06',
99
- 'hex'
100
- )
101
-
102
- for (var i = 0; i < 5; i++) run()
103
-
104
- function run () {
105
- var st = storage()
106
- var feed = hypercore(st, key, {
107
- secretKey: secretKey
108
- })
109
-
110
- feed.append(['a', 'b', 'c'], function () {
111
- t.same(st.data.toBuffer().toString(), 'abc')
112
- feed.verify(feed.length - 1, compatExpectedSignatures.slice(-64), function (err, valid) {
113
- t.error(err, 'no error')
114
- t.ok(valid, 'compat sigs still valid')
115
- })
116
- t.same(st.signatures.toBuffer().slice(-64), expectedSignature, 'only needs last sig')
117
- })
118
- }
119
- })
120
-
121
- tape('deterministic signatures after replication', function (t) {
122
- t.plan(10)
123
-
124
- var key = Buffer.from('9718a1ff1c4ca79feac551c0c7212a65e4091278ec886b88be01ee4039682238', 'hex')
125
- var secretKey = Buffer.from(
126
- '53729c0311846cca9cc0eded07aaf9e6689705b6a0b1bb8c3a2a839b72fda383' +
127
- '9718a1ff1c4ca79feac551c0c7212a65e4091278ec886b88be01ee4039682238',
128
- 'hex'
129
- )
130
-
131
- var expectedSignature = Buffer.from(
132
- '42e057f2c225b4c5b97876a15959324931ad84646a8bf2e4d14487c0f117966a585edcdda54670d' +
133
- 'd5def829ca85924ce44ae307835e57d5729aef8cd91678b06',
134
- 'hex'
135
- )
136
-
137
- for (var i = 0; i < 5; i++) run()
138
-
139
- function run () {
140
- var feed = hypercore(ram, key, {
141
- secretKey: secretKey
142
- })
143
-
144
- feed.append(['a', 'b', 'c'], function () {
145
- var st = storage()
146
- var clone = hypercore(st, feed.key)
147
-
148
- replicate(feed, clone).on('end', function () {
149
- t.same(st.data.toBuffer().toString(), 'abc')
150
- t.same(st.signatures.toBuffer().slice(-64), expectedSignature, 'only needs last sig')
151
- })
152
- })
153
- }
154
- })
155
-
156
- tape('compat signatures work', function (t) {
157
- var key = Buffer.from('9718a1ff1c4ca79feac551c0c7212a65e4091278ec886b88be01ee4039682238', 'hex')
158
- var secretKey = Buffer.from(
159
- '53729c0311846cca9cc0eded07aaf9e6689705b6a0b1bb8c3a2a839b72fda383' +
160
- '9718a1ff1c4ca79feac551c0c7212a65e4091278ec886b88be01ee4039682238',
161
- 'hex'
162
- )
163
-
164
- var compatExpectedSignatures = Buffer.from(
165
- '050257010000400745643235353139000000000000000000000000000000000084684e8dd76c339' +
166
- 'd6f5754e813204906ee818e6c6cdc6a816a2ac785a3e0d926ac08641a904013194fe6121847b7da' +
167
- 'd4e361965d47715428eb0a0ededbdd5909d037ff3c3614fa0100ed9264a712d3b77cbe7a4f6eadd' +
168
- '8f342809be99dfb9154a19e278d7a5de7d2b4d890f7701a38b006469f6bab1aff66ac6125d48baf' +
169
- 'dc0711057675ed57d445ce7ed4613881be37ebc56bb40556b822e431bb4dc3517421f9a5e3ed124' +
170
- 'eb5c4db8367386d9ce12b2408613b9fec2837022772a635ffd807',
171
- 'hex'
172
- )
173
-
174
- var st = storage()
175
-
176
- var feed = hypercore(st, key, {
177
- secretKey
178
- })
179
-
180
- feed.append(['a', 'b', 'c'], function () {
181
- st.signatures.write(0, compatExpectedSignatures, function () {
182
- var clone = hypercore(ram, key)
183
-
184
- replicate(feed, clone).on('end', function () {
185
- t.same(clone.length, 3)
186
- clone.proof(2, function (err, proof) {
187
- t.error(err)
188
- t.same(proof.signature, compatExpectedSignatures.slice(-64))
189
-
190
- feed.append('d', function () {
191
- replicate(feed, clone).on('end', function () {
192
- t.same(clone.length, 4)
193
- t.end()
194
- })
195
- })
196
- })
197
- })
198
- })
199
- })
200
- })
201
-
202
- function storage () {
203
- return create
204
-
205
- function create (name) {
206
- create[name] = ram()
207
- return create[name]
208
- }
209
- }