postchain-client 1.0.2 → 1.1.0

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 (98) hide show
  1. package/README.md +30 -49
  2. package/built/cjs/index.js +2571 -0
  3. package/built/cjs/index.js.map +1 -0
  4. package/built/esm/index.js +29927 -0
  5. package/built/esm/index.js.map +1 -0
  6. package/built/index.js +21 -3
  7. package/built/index.js.map +1 -0
  8. package/built/src/chromia/chromiaClientProvider.js +35 -0
  9. package/built/src/chromia/chromiaClientProvider.js.map +1 -0
  10. package/built/src/chromia/errors.js +6 -0
  11. package/built/src/chromia/errors.js.map +1 -0
  12. package/built/src/chromia/interfaces.js +2 -0
  13. package/built/src/chromia/interfaces.js.map +1 -0
  14. package/built/src/encryption/encryption.js +105 -0
  15. package/built/src/encryption/encryption.js.map +1 -0
  16. package/built/src/encryption/errors.js +11 -0
  17. package/built/src/encryption/errors.js.map +1 -0
  18. package/built/src/encryption/types.js +2 -0
  19. package/built/src/encryption/types.js.map +1 -0
  20. package/built/src/formatter.d.ts +2 -0
  21. package/built/src/formatter.js +119 -0
  22. package/built/src/formatter.js.map +1 -0
  23. package/built/src/gtv/definition.js +20 -0
  24. package/built/src/gtv/definition.js.map +1 -0
  25. package/built/src/gtv/index.d.ts +1 -0
  26. package/built/src/gtv/index.js +11 -0
  27. package/built/src/gtv/index.js.map +1 -0
  28. package/built/src/gtv/types.d.ts +2 -3
  29. package/built/src/gtv/types.js +2 -0
  30. package/built/src/gtv/types.js.map +1 -0
  31. package/built/src/gtx/errors.js +26 -0
  32. package/built/src/gtx/errors.js.map +1 -0
  33. package/built/src/gtx/gtx.d.ts +1 -1
  34. package/built/src/gtx/gtx.js +115 -0
  35. package/built/src/gtx/gtx.js.map +1 -0
  36. package/built/src/gtx/gtxclient.js +77 -0
  37. package/built/src/gtx/gtxclient.js.map +1 -0
  38. package/built/src/gtx/index.js +5 -0
  39. package/built/src/gtx/index.js.map +1 -0
  40. package/built/src/gtx/interfaces.js +2 -0
  41. package/built/src/gtx/interfaces.js.map +1 -0
  42. package/built/src/gtx/serialization.d.ts +3 -2
  43. package/built/src/gtx/serialization.js +95 -0
  44. package/built/src/gtx/serialization.js.map +1 -0
  45. package/built/src/gtx/types.d.ts +10 -1
  46. package/built/src/gtx/types.js +2 -0
  47. package/built/src/gtx/types.js.map +1 -0
  48. package/built/src/logger.d.ts +2 -1
  49. package/built/src/logger.js +53 -0
  50. package/built/src/logger.js.map +1 -0
  51. package/built/src/merkle/binarytree.d.ts +137 -0
  52. package/built/src/merkle/binarytree.js +146 -0
  53. package/built/src/merkle/binarytree.js.map +1 -0
  54. package/built/src/merkle/binarytreefactory.d.ts +86 -0
  55. package/built/src/merkle/binarytreefactory.js +235 -0
  56. package/built/src/merkle/binarytreefactory.js.map +1 -0
  57. package/built/src/merkle/merkleHelper.js +109 -0
  58. package/built/src/merkle/merkleHelper.js.map +1 -0
  59. package/built/src/merkle/merklehashcalculator.d.ts +35 -0
  60. package/built/src/merkle/merklehashcalculator.js +71 -0
  61. package/built/src/merkle/merklehashcalculator.js.map +1 -0
  62. package/built/src/merkle/path.d.ts +155 -0
  63. package/built/src/merkle/path.js +306 -0
  64. package/built/src/merkle/path.js.map +1 -0
  65. package/built/src/merkle/proof/merklehashcarrier.d.ts +17 -0
  66. package/built/src/merkle/proof/merklehashcarrier.js +23 -0
  67. package/built/src/merkle/proof/merklehashcarrier.js.map +1 -0
  68. package/built/src/merkle/proof/merklehashsummaryfactory.d.ts +53 -0
  69. package/built/src/merkle/proof/merklehashsummaryfactory.js +81 -0
  70. package/built/src/merkle/proof/merklehashsummaryfactory.js.map +1 -0
  71. package/built/src/merkle/proof/merkleproof.d.ts +35 -0
  72. package/built/src/merkle/proof/merkleproof.js +59 -0
  73. package/built/src/merkle/proof/merkleproof.js.map +1 -0
  74. package/built/src/merkle/proof/merkleprooftree.d.ts +130 -0
  75. package/built/src/merkle/proof/merkleprooftree.js +116 -0
  76. package/built/src/merkle/proof/merkleprooftree.js.map +1 -0
  77. package/built/src/merkle/proof/merkleprooftreefactory.d.ts +47 -0
  78. package/built/src/merkle/proof/merkleprooftreefactory.js +121 -0
  79. package/built/src/merkle/proof/merkleprooftreefactory.js.map +1 -0
  80. package/built/src/merkle/types.js +2 -0
  81. package/built/src/merkle/types.js.map +1 -0
  82. package/built/src/restclient/errors.js +54 -0
  83. package/built/src/restclient/errors.js.map +1 -0
  84. package/built/src/restclient/interfaces.d.ts +2 -1
  85. package/built/src/restclient/interfaces.js +2 -0
  86. package/built/src/restclient/interfaces.js.map +1 -0
  87. package/built/src/restclient/restclient.js +309 -0
  88. package/built/src/restclient/restclient.js.map +1 -0
  89. package/built/src/restclient/restclientutil.d.ts +4 -0
  90. package/built/src/restclient/restclientutil.js +137 -0
  91. package/built/src/restclient/restclientutil.js.map +1 -0
  92. package/built/src/restclient/types.d.ts +4 -0
  93. package/built/src/restclient/types.js +13 -0
  94. package/built/src/restclient/types.js.map +1 -0
  95. package/built/umd/index.js +29931 -0
  96. package/built/umd/index.js.map +1 -0
  97. package/package.json +30 -17
  98. package/built/index.js.LICENSE.txt +0 -657
@@ -0,0 +1,235 @@
1
+ "use strict";
2
+ var util = require('../formatter');
3
+ var PathSet = require('./path').PathSet;
4
+ var PathLeafElement = require('./path').PathLeafElement;
5
+ var EmptyLeaf = require('./binarytree').EmptyLeaf;
6
+ var Leaf = require('./binarytree').Leaf;
7
+ var Node = require('./binarytree').Node;
8
+ var BinaryTree = require('./binarytree').BinaryTree;
9
+ var ArrayHeadNode = require('./binarytree').ArrayHeadNode;
10
+ var DictHeadNode = require('./binarytree').DictHeadNode;
11
+ const NO_PATHS = new PathSet([]);
12
+ /**
13
+ * The factory does the conversion between list of elements and tree of elements.
14
+ *
15
+ * Note: The idea is that you should sub class for each type of element you want to build.
16
+ */
17
+ function BinaryTreeFactory() { }
18
+ /**
19
+ * Transforms the incoming leaf into an [BinaryTreeElement]
20
+ * The idea with this function is that it can be recursive (if the leaf in turn is complex object with sub objects).
21
+ *
22
+ * Note: If we don't have a path here we can try to find the leaf in the cache.
23
+ *
24
+ * @param leaf the raw data we should wrap in a leaf
25
+ * @param paths a collection of proof paths that might point to this leaf
26
+ * @return the resulting [BinaryTreeElement] the leaf got converted to
27
+ */
28
+ BinaryTreeFactory.prototype.handleLeaf = function (leaf, paths, isRoot = false) {
29
+ if (paths.length == 0 && !isRoot) {
30
+ return this.innerHandleLeaf(leaf, this.getEmptyPathSet());
31
+ }
32
+ else {
33
+ return this.innerHandleLeaf(leaf, paths);
34
+ }
35
+ };
36
+ /**
37
+ *
38
+ */
39
+ BinaryTreeFactory.prototype.getEmptyPathSet = function () {
40
+ return NO_PATHS;
41
+ };
42
+ /**
43
+ * At this point we should have looked in cache.
44
+ *
45
+ * @param leaf we should turn into a tree element
46
+ * @param {PathSet} paths
47
+ * @return the tree element we created.
48
+ */
49
+ BinaryTreeFactory.prototype.innerHandleLeaf = function (leaf, paths) {
50
+ if (leaf == null) {
51
+ return this.handlePrimitiveLeaf(leaf, paths);
52
+ }
53
+ if (Buffer.isBuffer(leaf)) {
54
+ return this.handlePrimitiveLeaf(leaf, paths);
55
+ }
56
+ if (typeof leaf === 'string') {
57
+ return this.handlePrimitiveLeaf(leaf, paths);
58
+ }
59
+ if (typeof leaf === 'number') {
60
+ return this.handlePrimitiveLeaf(leaf, paths);
61
+ }
62
+ if (typeof leaf === 'boolean') {
63
+ return this.handlePrimitiveLeaf(leaf ? 1 : 0, paths);
64
+ }
65
+ if (leaf.constructor === Array) {
66
+ return this.buildFromArray(leaf, paths);
67
+ }
68
+ if (typeof leaf === 'object') {
69
+ return this.buildFromDictionary(leaf, paths);
70
+ }
71
+ else {
72
+ throw new Error("Unsupporting data type");
73
+ }
74
+ };
75
+ /**
76
+ * Just like [handleLeaf] but we know that this leaf should not be a complex type, but something we can
77
+ * immediately wrap
78
+ *
79
+ * @param leaf
80
+ * @param {PathSet} paths
81
+ */
82
+ BinaryTreeFactory.prototype.handlePrimitiveLeaf = function (leaf, paths) {
83
+ var pathElem = paths.getPathLeafOrElseAnyCurrentPathElement();
84
+ if (pathElem != null && !(pathElem instanceof PathLeafElement)) {
85
+ throw new Error("Path does not match the tree structure. We are at a leaf " + leaf + " but found path element " + pathElem);
86
+ }
87
+ return new Leaf(leaf, pathElem);
88
+ };
89
+ /**
90
+ * Calls itself until the return value only holds 1 element
91
+ *
92
+ * Note: This method can only create standard [Node] that fills up the area between the "top" and the leaves.
93
+ * These "in-between" nodes cannot be "path leaf" or have any interesting properties.
94
+ *
95
+ * @param layer What layer we aim calculate
96
+ * @param inList The args of nodes we should build from
97
+ * @return All [BinaryTreeElement] nodes of the next layer
98
+ */
99
+ BinaryTreeFactory.prototype.buildHigherLayer = function (layer, inList) {
100
+ if (inList.length === 0) {
101
+ throw new Error("Cannot work on empty arrays. Layer: " + layer);
102
+ }
103
+ else if (inList.length === 1) {
104
+ return inList;
105
+ }
106
+ var returnArray = new Array();
107
+ var nrOfNodesToCreate = Math.floor(inList.length / 2);
108
+ var leftValue = null;
109
+ var isLeft = true;
110
+ for (var i = 0; i < inList.length; i++) {
111
+ if (isLeft) {
112
+ leftValue = inList[i];
113
+ isLeft = false;
114
+ }
115
+ else {
116
+ var tempNode = new Node(leftValue, inList[i]);
117
+ returnArray.push(tempNode);
118
+ nrOfNodesToCreate--;
119
+ isLeft = true;
120
+ leftValue = null;
121
+ }
122
+ }
123
+ if (!isLeft) {
124
+ // If there is odd number of nodes, then move the last node up one level
125
+ returnArray.push(leftValue);
126
+ }
127
+ // Extra check
128
+ if (nrOfNodesToCreate != 0) {
129
+ util.logDebug("Why didn't we build exactly the correct amount? Layer: " + layer + " , residue: " + nrOfNodesToCreate + " , input args size: " + inList.length + ".");
130
+ }
131
+ return this.buildHigherLayer((layer + 1), returnArray);
132
+ };
133
+ BinaryTreeFactory.prototype.build = function (data) {
134
+ return this.buildWithPath(data, NO_PATHS);
135
+ };
136
+ /**
137
+ * @param {PathSet} paths
138
+ */
139
+ BinaryTreeFactory.prototype.buildWithPath = function (data, paths) {
140
+ var result = this.handleLeaf(data, paths, true);
141
+ return new BinaryTree(result);
142
+ };
143
+ /**
144
+ * @param {Array} array
145
+ * @param {PathSet} paths
146
+ */
147
+ BinaryTreeFactory.prototype.buildFromArray = function (array, paths) {
148
+ var pathElem = paths.getPathLeafOrElseAnyCurrentPathElement();
149
+ // 1. Build leaf layer
150
+ if (array.length == 0) {
151
+ return new ArrayHeadNode(new EmptyLeaf(), new EmptyLeaf(), array, 0, 0, pathElem);
152
+ }
153
+ var leafArray = this.buildLeafElements(array, paths);
154
+ // 2. Build all higher layers
155
+ var result = this.buildHigherLayer(1, leafArray);
156
+ // 3. Fix and return the root node
157
+ var orgRoot = result[0];
158
+ if (orgRoot instanceof Node) {
159
+ return new ArrayHeadNode(orgRoot.left, orgRoot.right, array, array.length, pathElem);
160
+ }
161
+ if (orgRoot instanceof Leaf) {
162
+ return this.buildFromOneLeaf(array, orgRoot, pathElem);
163
+ }
164
+ else {
165
+ throw new Error("Should not find element of this type here");
166
+ }
167
+ };
168
+ /**
169
+ *
170
+ */
171
+ BinaryTreeFactory.prototype.buildFromOneLeaf = function (array, orgRoot, pathElem) {
172
+ if (array.length > 1) {
173
+ throw new Error("How come we got a leaf returned when we had " + array.length + " elements is the args?");
174
+ }
175
+ else {
176
+ return new ArrayHeadNode(orgRoot, new EmptyLeaf(), array, array.length, pathElem);
177
+ }
178
+ };
179
+ /**
180
+ * @param {PathSet} paths
181
+ */
182
+ BinaryTreeFactory.prototype.buildLeafElements = function (leafList, paths) {
183
+ var leafArray = new Array();
184
+ var onlyArrayPaths = paths.keepOnlyArrayPaths(); // For performance, since we will loop soon
185
+ for (var i = 0; i < leafList.length; i++) {
186
+ var pathsRelevantForThisLeaf = onlyArrayPaths.getTailIfFirstElementIsArrayOfThisIndexFromList(i);
187
+ var leaf = leafList[i];
188
+ var binaryTreeElement = this.handleLeaf(leaf, pathsRelevantForThisLeaf);
189
+ leafArray.push(binaryTreeElement);
190
+ }
191
+ return leafArray;
192
+ };
193
+ /**
194
+ * @param {PathSet} paths
195
+ */
196
+ BinaryTreeFactory.prototype.buildFromDictionary = function (dict, paths) {
197
+ var pathElem = paths.getPathLeafOrElseAnyCurrentPathElement();
198
+ // Needs to be sorted, or else the order is undefined
199
+ var keys = Object.keys(dict).sort();
200
+ if (keys.length == 0) {
201
+ return new DictHeadNode(new EmptyLeaf(), new EmptyLeaf(), dict, keys.length, 0, pathElem);
202
+ }
203
+ // 1. Build first (leaf) layer
204
+ var leafArray = this.buildLeafElementFromDict(keys, dict, paths);
205
+ // 2. Build all higher layers
206
+ var result = this.buildHigherLayer(1, leafArray);
207
+ // 3. Fix and return the root node
208
+ var orgRoot = result[0];
209
+ if (orgRoot instanceof Node) {
210
+ return new DictHeadNode(orgRoot.left, orgRoot.right, dict, keys.length, pathElem);
211
+ }
212
+ else {
213
+ throw new Error("Should not find element of this type here: " + typeof orgRoot);
214
+ }
215
+ };
216
+ /**
217
+ * @param {PathSet} paths
218
+ */
219
+ BinaryTreeFactory.prototype.buildLeafElementFromDict = function (keys, dict, paths) {
220
+ var leafArray = new Array();
221
+ var onlyDictPaths = paths.keepOnlyDictPaths(); // For performance, since we will loop soon
222
+ for (var i = 0; i < keys.length; i++) {
223
+ // The key cannot not be proved, so NO_PATHS
224
+ var key = keys[i];
225
+ var keyElement = this.handleLeaf(key, NO_PATHS);
226
+ leafArray.push(keyElement);
227
+ var content = dict[key];
228
+ var pathsRelevantForThisLeaf = onlyDictPaths.getTailIfFirstElementIsDictOfThisKeyFromList(key);
229
+ var contentElement = this.handleLeaf(content, pathsRelevantForThisLeaf);
230
+ leafArray.push(contentElement);
231
+ }
232
+ return leafArray;
233
+ };
234
+ module.exports = { BinaryTreeFactory };
235
+ //# sourceMappingURL=binarytreefactory.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"binarytreefactory.js","sourceRoot":"","sources":["../../../src/merkle/binarytreefactory.js"],"names":[],"mappings":"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"}
@@ -0,0 +1,109 @@
1
+ import { hashConcat } from "../encryption/encryption";
2
+ var internalNodePrefix = Buffer.alloc(1, 0);
3
+ var leafPrefix = Buffer.alloc(1, 1);
4
+ var nonExistingNodeHash = Buffer.alloc(32);
5
+ export function calculateRoot(hashes, depth, leafDepth) {
6
+ var numTransactions = hashes.length;
7
+ if (numTransactions === 0) {
8
+ return Buffer.alloc(32);
9
+ }
10
+ if (depth === undefined) {
11
+ depth = 0;
12
+ }
13
+ if (!leafDepth) {
14
+ leafDepth = Math.ceil(Math.log2(numTransactions));
15
+ }
16
+ if (depth === leafDepth) {
17
+ return hashes[0];
18
+ }
19
+ var maxLeavesPerChild = Math.pow(2, leafDepth - depth - 1);
20
+ var prefix = depth === leafDepth - 1 ? leafPrefix : internalNodePrefix;
21
+ if (numTransactions <= maxLeavesPerChild) {
22
+ var left = calculateRoot(hashes, depth + 1, leafDepth);
23
+ return hashConcat([prefix, left, nonExistingNodeHash]);
24
+ }
25
+ var left = calculateRoot(hashes.slice(0, maxLeavesPerChild), depth + 1, leafDepth);
26
+ var right = calculateRoot(hashes.slice(maxLeavesPerChild), depth + 1, leafDepth);
27
+ return hashConcat([prefix, left, prefix, right]);
28
+ }
29
+ function internalMerklePath(hashes, targetIndex, depth, leafDepth) {
30
+ var numTransactions = hashes.length;
31
+ if (depth === leafDepth) {
32
+ return [];
33
+ }
34
+ var maxLeavesPerChild = Math.pow(2, leafDepth - depth - 1);
35
+ var prefix = depth == leafDepth - 1 ? leafPrefix : internalNodePrefix;
36
+ if (numTransactions <= maxLeavesPerChild) {
37
+ var path = internalMerklePath(hashes, targetIndex, depth + 1, leafDepth);
38
+ path.push({ side: 1, hash: nonExistingNodeHash });
39
+ return path;
40
+ }
41
+ if (targetIndex < maxLeavesPerChild) {
42
+ var path = internalMerklePath(hashes.slice(0, maxLeavesPerChild), targetIndex, depth + 1, leafDepth);
43
+ var right = calculateRoot(hashes.slice(maxLeavesPerChild), depth + 1, leafDepth);
44
+ path.push({ side: 1, hash: right });
45
+ }
46
+ else {
47
+ var left = calculateRoot(hashes.slice(0, maxLeavesPerChild), depth + 1, leafDepth);
48
+ var path = internalMerklePath(hashes.slice(maxLeavesPerChild), targetIndex - maxLeavesPerChild, depth + 1, leafDepth);
49
+ path.push({ side: 0, hash: left });
50
+ }
51
+ return path;
52
+ }
53
+ /*
54
+ * a path looks like this:
55
+ * {merklePath: [{side: <0|1>, hash: <hash buffer depth n-1>},
56
+ * {side: <0|1>, hash: <hash buffer depth n-2>},
57
+ * ...
58
+ * {side: <0|1>, hash: <hash buffer depth 1>}]}
59
+ */
60
+ export function merklePath(hashes, target) {
61
+ if (!hashes || hashes.length == 0) {
62
+ throw new Error("Cannot make merkle path from empty transaction set");
63
+ }
64
+ var index = -1;
65
+ for (var i = 0; i < hashes.length; i++) {
66
+ if (hashes[i].equals(target)) {
67
+ index = i;
68
+ break;
69
+ }
70
+ }
71
+ if (index === -1) {
72
+ throw new Error("Target is not in list of hashes");
73
+ }
74
+ var leafDepth = Math.ceil(Math.log2(hashes.length));
75
+ var path = internalMerklePath(hashes, index, 0, leafDepth);
76
+ return path;
77
+ }
78
+ /**
79
+ *
80
+ * @param path The merkle path to validate.
81
+ * Format [{side: <0|1>, hash: <hash buffer depth n-1>},
82
+ * {side: <0|1>, hash: <hash buffer depth n-2>},
83
+ * ...,
84
+ * {side: <0|1>, hash: <hash buffer depth 1>}]
85
+
86
+ * @param target the leaf hash that the path proves belongs in the merkleRoot
87
+ * @param merkleRoot The merkle root that supposedly contains the target via the supplied path.
88
+ * The merkle root is typically taken from a block header.
89
+ */
90
+ export function validateMerklePath(path, target, merkleRoot) {
91
+ let currentHash = target;
92
+ for (let i = 0; i < path.length; i++) {
93
+ const item = path[i];
94
+ const prefix = (i === 0) ? Buffer.from([1]) : Buffer.from([0]);
95
+ if (item.side === 0) {
96
+ currentHash = hashConcat([prefix, item.hash, prefix, currentHash]);
97
+ }
98
+ else {
99
+ if (item.hash.equals(nonExistingNodeHash)) {
100
+ currentHash = hashConcat([prefix, currentHash, nonExistingNodeHash]);
101
+ }
102
+ else {
103
+ currentHash = hashConcat([prefix, currentHash, prefix, item.hash]);
104
+ }
105
+ }
106
+ }
107
+ return merkleRoot.equals(currentHash);
108
+ }
109
+ //# sourceMappingURL=merkleHelper.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"merkleHelper.js","sourceRoot":"","sources":["../../../src/merkle/merkleHelper.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,35 @@
1
+ /**
2
+ *
3
+ * @param {CryptoSystem} cryptoSystem
4
+ */
5
+ export function MerkleHashCalculator(cryptoSystem: CryptoSystem): void;
6
+ export class MerkleHashCalculator {
7
+ /**
8
+ *
9
+ * @param {CryptoSystem} cryptoSystem
10
+ */
11
+ constructor(cryptoSystem: CryptoSystem);
12
+ cryptoSystem: CryptoSystem;
13
+ /**
14
+ * @param {number} prefix
15
+ * @param {Buffer} hashLeft
16
+ * @param {Buffer} hashRight
17
+ */
18
+ calculateNodeHash(prefix: number, hashLeft: Buffer, hashRight: Buffer): any;
19
+ /**
20
+ * @param {*} value
21
+ */
22
+ calculateLeafHash(value: any): any;
23
+ /**
24
+ * @param {number} prefix
25
+ * @param {Buffer} hashLeft
26
+ * @param {Buffer} hashRight
27
+ */
28
+ calculateNodeHashInternal(prefix: number, hashLeft: Buffer, hashRight: Buffer, hashFunc: any): any;
29
+ calculateHashOfValueInternal(valuetoHash: any, serializeFun: any, hashFunc: any): any;
30
+ isContainerProofValueLeaf(value: any): boolean;
31
+ }
32
+ export function CryptoSystem(): void;
33
+ export class CryptoSystem {
34
+ digest(buffer: any): Buffer;
35
+ }
@@ -0,0 +1,71 @@
1
+ var serialization = require('../gtx/serialization');
2
+ var HASH_PREFIX_LEAF = require('./binarytree').HASH_PREFIX_LEAF;
3
+ var encryption = require('../../src/encryption/encryption');
4
+ function CryptoSystem() { }
5
+ CryptoSystem.prototype.digest = function (buffer) {
6
+ return encryption.hash256(buffer);
7
+ };
8
+ /**
9
+ *
10
+ * @param {Buffer} buffer
11
+ * @param {CryptoSystem} cryptoSystem
12
+ */
13
+ function hashingFun(buffer, cryptoSystem) {
14
+ if (cryptoSystem === null) {
15
+ throw new Error("In this case we need the CryptoSystem to calculate the hash");
16
+ }
17
+ else {
18
+ return cryptoSystem.digest(buffer);
19
+ }
20
+ }
21
+ /**
22
+ *
23
+ * @param {CryptoSystem} cryptoSystem
24
+ */
25
+ function MerkleHashCalculator(cryptoSystem) {
26
+ this.cryptoSystem = cryptoSystem;
27
+ }
28
+ /**
29
+ * @param {number} prefix
30
+ * @param {Buffer} hashLeft
31
+ * @param {Buffer} hashRight
32
+ */
33
+ MerkleHashCalculator.prototype.calculateNodeHash = function (prefix, hashLeft, hashRight) {
34
+ return this.calculateNodeHashInternal(prefix, hashLeft, hashRight, hashingFun);
35
+ };
36
+ /**
37
+ * @param {*} value
38
+ */
39
+ MerkleHashCalculator.prototype.calculateLeafHash = function (value) {
40
+ return this.calculateHashOfValueInternal(value, serialization.encodeValue, hashingFun);
41
+ };
42
+ /**
43
+ * @param {number} prefix
44
+ * @param {Buffer} hashLeft
45
+ * @param {Buffer} hashRight
46
+ */
47
+ MerkleHashCalculator.prototype.calculateNodeHashInternal = function (prefix, hashLeft, hashRight, hashFunc) {
48
+ var buf = Buffer.alloc(1);
49
+ buf.writeInt8(prefix);
50
+ var bufferSum = Buffer.concat([buf, hashLeft, hashRight]);
51
+ return hashFunc(bufferSum, this.cryptoSystem);
52
+ };
53
+ MerkleHashCalculator.prototype.calculateHashOfValueInternal = function (valuetoHash, serializeFun, hashFunc) {
54
+ var buf = Buffer.alloc(1);
55
+ buf.writeInt8(HASH_PREFIX_LEAF);
56
+ var bufferSum = Buffer.concat([buf, serializeFun(valuetoHash)]);
57
+ return hashFunc(bufferSum, this.cryptoSystem);
58
+ };
59
+ MerkleHashCalculator.prototype.isContainerProofValueLeaf = function (value) {
60
+ if (value == null) {
61
+ return false;
62
+ }
63
+ if (value.constructor === Array || typeof value === 'object') {
64
+ return true;
65
+ }
66
+ else {
67
+ return false;
68
+ }
69
+ };
70
+ module.exports = { MerkleHashCalculator, CryptoSystem };
71
+ //# sourceMappingURL=merklehashcalculator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"merklehashcalculator.js","sourceRoot":"","sources":["../../../src/merkle/merklehashcalculator.js"],"names":[],"mappings":"AAAA,IAAI,aAAa,GAAG,OAAO,CAAC,sBAAsB,CAAC,CAAA;AACnD,IAAI,gBAAgB,GAAG,OAAO,CAAC,cAAc,CAAC,CAAC,gBAAgB,CAAA;AAC/D,IAAI,UAAU,GAAG,OAAO,CAAC,iCAAiC,CAAC,CAAA;AAE3D,SAAS,YAAY,KAAI,CAAC;AAC1B,YAAY,CAAC,SAAS,CAAC,MAAM,GAAG,UAAS,MAAM;IAC7C,OAAO,UAAU,CAAC,OAAO,CAAC,MAAM,CAAC,CAAA;AACnC,CAAC,CAAA;AAED;;;;GAIG;AACH,SAAS,UAAU,CAAC,MAAM,EAAE,YAAY;IACtC,IAAI,YAAY,KAAK,IAAI,EAAE;QACzB,MAAM,IAAI,KAAK,CAAC,6DAA6D,CAAC,CAAA;KAC/E;SAAM;QACL,OAAO,YAAY,CAAC,MAAM,CAAC,MAAM,CAAC,CAAA;KACnC;AACH,CAAC;AAED;;;GAGG;AACH,SAAS,oBAAoB,CAAC,YAAY;IACxC,IAAI,CAAC,YAAY,GAAG,YAAY,CAAA;AAClC,CAAC;AAED;;;;GAIG;AACH,oBAAoB,CAAC,SAAS,CAAC,iBAAiB,GAAG,UAAS,MAAM,EAAE,QAAQ,EAAE,SAAS;IACrF,OAAO,IAAI,CAAC,yBAAyB,CAAC,MAAM,EAAE,QAAQ,EAAE,SAAS,EAAE,UAAU,CAAC,CAAA;AAChF,CAAC,CAAA;AAED;;GAEG;AACH,oBAAoB,CAAC,SAAS,CAAC,iBAAiB,GAAG,UAAS,KAAK;IAC/D,OAAO,IAAI,CAAC,4BAA4B,CAAC,KAAK,EAAE,aAAa,CAAC,WAAW,EAAE,UAAU,CAAC,CAAA;AACxF,CAAC,CAAA;AAED;;;;GAIG;AACH,oBAAoB,CAAC,SAAS,CAAC,yBAAyB,GAAG,UAAS,MAAM,EAAE,QAAQ,EAAE,SAAS,EAAE,QAAQ;IACvG,IAAI,GAAG,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAA;IACzB,GAAG,CAAC,SAAS,CAAC,MAAM,CAAC,CAAA;IACrB,IAAI,SAAS,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,QAAQ,EAAE,SAAS,CAAC,CAAC,CAAA;IACzD,OAAO,QAAQ,CAAC,SAAS,EAAE,IAAI,CAAC,YAAY,CAAC,CAAA;AAC/C,CAAC,CAAA;AAED,oBAAoB,CAAC,SAAS,CAAC,4BAA4B,GAAG,UAAS,WAAW,EAAE,YAAY,EAAE,QAAQ;IACxG,IAAI,GAAG,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAA;IACzB,GAAG,CAAC,SAAS,CAAC,gBAAgB,CAAC,CAAA;IAC/B,IAAI,SAAS,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,YAAY,CAAC,WAAW,CAAC,CAAC,CAAC,CAAA;IAC/D,OAAO,QAAQ,CAAC,SAAS,EAAE,IAAI,CAAC,YAAY,CAAC,CAAA;AAC/C,CAAC,CAAA;AAED,oBAAoB,CAAC,SAAS,CAAC,yBAAyB,GAAG,UAAS,KAAK;IACvE,IAAI,KAAK,IAAI,IAAI,EAAE;QACjB,OAAO,KAAK,CAAA;KACb;IACD,IAAI,KAAK,CAAC,WAAW,KAAK,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE;QAC5D,OAAO,IAAI,CAAA;KACZ;SAAM;QACL,OAAO,KAAK,CAAA;KACb;AACH,CAAC,CAAA;AAED,MAAM,CAAC,OAAO,GAAG,EAAC,oBAAoB,EAAE,YAAY,EAAC,CAAC"}
@@ -0,0 +1,155 @@
1
+ /**
2
+ *
3
+ * @param {Array} pathElements
4
+ */
5
+ export function Path(pathElements: any[]): void;
6
+ export class Path {
7
+ /**
8
+ *
9
+ * @param {Array} pathElements
10
+ */
11
+ constructor(pathElements: any[]);
12
+ pathElements: any[];
13
+ /**
14
+ *
15
+ */
16
+ getCurrentPathElement(): any;
17
+ /**
18
+ *
19
+ */
20
+ size(): number;
21
+ /**
22
+ *
23
+ */
24
+ tail(): Path;
25
+ debugString(): string;
26
+ /**
27
+ * @param {Path} other
28
+ */
29
+ equals(other: Path): boolean;
30
+ }
31
+ export function PathElement(previous: any): void;
32
+ export class PathElement {
33
+ constructor(previous: any);
34
+ previous: any;
35
+ getSearchKey(): void;
36
+ }
37
+ export function PathLeafElement(previous: any): void;
38
+ export class PathLeafElement {
39
+ constructor(previous: any);
40
+ constructor: typeof PathLeafElement;
41
+ equals(other: any): boolean;
42
+ }
43
+ /**
44
+ *
45
+ * @param {SearchablePathElement} previous
46
+ * @param {number} index
47
+ */
48
+ export function ArrayPathElement(previous: SearchablePathElement, index: number): void;
49
+ export class ArrayPathElement {
50
+ /**
51
+ *
52
+ * @param {SearchablePathElement} previous
53
+ * @param {number} index
54
+ */
55
+ constructor(previous: SearchablePathElement, index: number);
56
+ index: number;
57
+ constructor: typeof ArrayPathElement;
58
+ getSearchKey(): number;
59
+ /**
60
+ * @param {ArrayPathElement} other
61
+ */
62
+ equals(other: ArrayPathElement): boolean;
63
+ }
64
+ export function SearchablePathElement(previous: any): void;
65
+ export class SearchablePathElement {
66
+ constructor(previous: any);
67
+ constructor: typeof SearchablePathElement;
68
+ getSearchKey(): void;
69
+ }
70
+ /**
71
+ *
72
+ * @param {SearchablePathElement} previous
73
+ * @param {string} key
74
+ */
75
+ export function DictPathElement(previous: SearchablePathElement, key: string): void;
76
+ export class DictPathElement {
77
+ /**
78
+ *
79
+ * @param {SearchablePathElement} previous
80
+ * @param {string} key
81
+ */
82
+ constructor(previous: SearchablePathElement, key: string);
83
+ key: string;
84
+ constructor: typeof DictPathElement;
85
+ getSearchKey(): string;
86
+ /**
87
+ * @param {DictPathElement} other
88
+ */
89
+ equals(other: DictPathElement): boolean;
90
+ }
91
+ /**
92
+ *
93
+ * @param {Array} paths
94
+ */
95
+ export function PathSet(paths: any[]): void;
96
+ export class PathSet {
97
+ /**
98
+ *
99
+ * @param {Array} paths
100
+ */
101
+ constructor(paths: any[]);
102
+ paths: any[];
103
+ /**
104
+ *
105
+ */
106
+ isEmpty(): boolean;
107
+ /**
108
+ *
109
+ */
110
+ getPathLeafOrElseAnyCurrentPathElement(): any;
111
+ /**
112
+ * Yeah, this might be a completely un-needed check (but it MIGHT save us later on if we forget this rule).
113
+ * What we are looking for here is an impossible state where two paths in the same set don't have the same parent.
114
+ * (Since we usually only have one path in a path set, this check should be cheap)
115
+ *
116
+ * @param {Path} currPath
117
+ * @param {PathElement} currElem
118
+ * @param {Path} prevPath
119
+ * @param {PathElement} prevElem
120
+ */
121
+ errorCheckUnequalParent(currPath: Path, currElem: PathElement, prevPath: Path, prevElem: PathElement): {
122
+ path: Path;
123
+ elem: PathElement;
124
+ };
125
+ /**
126
+ *
127
+ */
128
+ keepOnlyArrayPaths(): PathSet;
129
+ /**
130
+ *
131
+ */
132
+ keepOnlyDictPaths(): PathSet;
133
+ /**
134
+ *
135
+ */
136
+ getTailIfFirstElementIsArrayOfThisIndexFromList(index: any): PathSet;
137
+ /**
138
+ *
139
+ */
140
+ getTailIfFirstElementIsDictOfThisKeyFromList(key: any): PathSet;
141
+ /**
142
+ *
143
+ */
144
+ getTailFromList(searchKey: any, filterFunc: any): PathSet;
145
+ }
146
+ /**
147
+ * @param {number} index
148
+ * @param {Path} path
149
+ */
150
+ export function getTailIfFirstElementIsArrayOfThisIndex(index: number, path: Path): Path;
151
+ /**
152
+ *
153
+ * @param {Array} arr
154
+ */
155
+ export function buildPathFromArray(arr: any[]): Path;