@leofcoin/chain 1.5.31 → 1.5.32
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.
- package/exports/browser/{index-329e0324-f8858eb6.js → index-8868bdd8-0d28073e.js} +1 -1
- package/exports/browser/{messages-000b7f84-2f945543.js → messages-eb6e5c71-584b278f.js} +174 -174
- package/exports/browser/{node-browser-ccafb3fc.js → node-browser-dafb0aab.js} +2005 -1915
- package/exports/browser/node-browser.js +1 -1
- package/package.json +1 -1
|
@@ -4958,11 +4958,27 @@ var index$2 = {
|
|
|
4958
4958
|
};
|
|
4959
4959
|
|
|
4960
4960
|
class BasicInterface {
|
|
4961
|
-
encoded;
|
|
4962
|
-
decoded;
|
|
4961
|
+
#encoded;
|
|
4962
|
+
#decoded;
|
|
4963
4963
|
keys;
|
|
4964
4964
|
name;
|
|
4965
4965
|
#proto;
|
|
4966
|
+
get encoded() {
|
|
4967
|
+
if (!this.#encoded)
|
|
4968
|
+
this.#encoded = this.encode();
|
|
4969
|
+
return this.#encoded;
|
|
4970
|
+
}
|
|
4971
|
+
set encoded(value) {
|
|
4972
|
+
this.#encoded = value;
|
|
4973
|
+
}
|
|
4974
|
+
get decoded() {
|
|
4975
|
+
if (!this.#decoded)
|
|
4976
|
+
this.#decoded = this.decode();
|
|
4977
|
+
return this.#decoded;
|
|
4978
|
+
}
|
|
4979
|
+
set decoded(value) {
|
|
4980
|
+
this.#decoded = value;
|
|
4981
|
+
}
|
|
4966
4982
|
set proto(value) {
|
|
4967
4983
|
this.#proto = value;
|
|
4968
4984
|
this.keys = Object.keys(value);
|
|
@@ -5031,7 +5047,7 @@ class BasicInterface {
|
|
|
5031
5047
|
toHex() {
|
|
5032
5048
|
if (!this.encoded)
|
|
5033
5049
|
this.encode();
|
|
5034
|
-
return toHex$2(this.encoded);
|
|
5050
|
+
return toHex$2(this.encoded.toString().split(',').map(number => Number(number)));
|
|
5035
5051
|
}
|
|
5036
5052
|
/**
|
|
5037
5053
|
* @return {String} encoded
|
|
@@ -5051,1732 +5067,1209 @@ class BasicInterface {
|
|
|
5051
5067
|
}
|
|
5052
5068
|
}
|
|
5053
5069
|
|
|
5054
|
-
|
|
5055
|
-
|
|
5056
|
-
|
|
5057
|
-
|
|
5058
|
-
|
|
5059
|
-
|
|
5060
|
-
|
|
5061
|
-
|
|
5062
|
-
|
|
5063
|
-
|
|
5064
|
-
|
|
5065
|
-
|
|
5066
|
-
|
|
5067
|
-
|
|
5068
|
-
|
|
5069
|
-
|
|
5070
|
-
|
|
5071
|
-
|
|
5072
|
-
|
|
5073
|
-
|
|
5074
|
-
|
|
5075
|
-
|
|
5076
|
-
|
|
5077
|
-
|
|
5078
|
-
|
|
5079
|
-
|
|
5080
|
-
|
|
5081
|
-
|
|
5082
|
-
|
|
5083
|
-
|
|
5084
|
-
}
|
|
5085
|
-
|
|
5086
|
-
|
|
5087
|
-
|
|
5088
|
-
|
|
5089
|
-
|
|
5090
|
-
|
|
5091
|
-
|
|
5092
|
-
|
|
5093
|
-
|
|
5094
|
-
|
|
5095
|
-
|
|
5096
|
-
|
|
5097
|
-
|
|
5098
|
-
|
|
5099
|
-
|
|
5100
|
-
|
|
5101
|
-
|
|
5070
|
+
const blockchainCodecs = [
|
|
5071
|
+
{
|
|
5072
|
+
name: 'leofcoin-block',
|
|
5073
|
+
codec: '0x6c62',
|
|
5074
|
+
hashAlg: 'dbl-keccak-512',
|
|
5075
|
+
},
|
|
5076
|
+
{
|
|
5077
|
+
name: 'leofcoin-tx',
|
|
5078
|
+
codec: '0x6c74',
|
|
5079
|
+
hashAlg: 'dbl-keccak-512',
|
|
5080
|
+
},
|
|
5081
|
+
{
|
|
5082
|
+
name: 'leofcoin-itx',
|
|
5083
|
+
codec: '0x6c69',
|
|
5084
|
+
hashAlg: 'keccak-512',
|
|
5085
|
+
},
|
|
5086
|
+
{
|
|
5087
|
+
name: 'leofcoin-pr',
|
|
5088
|
+
codec: '0x6c70',
|
|
5089
|
+
hashAlg: 'keccak-256',
|
|
5090
|
+
},
|
|
5091
|
+
{
|
|
5092
|
+
name: 'contract-message',
|
|
5093
|
+
codec: '0x63636d',
|
|
5094
|
+
hashAlg: 'keccak-256'
|
|
5095
|
+
},
|
|
5096
|
+
{
|
|
5097
|
+
name: 'transaction-message',
|
|
5098
|
+
codec: '0x746d',
|
|
5099
|
+
hashAlg: 'keccak-256'
|
|
5100
|
+
},
|
|
5101
|
+
{
|
|
5102
|
+
name: 'raw-transaction-message',
|
|
5103
|
+
codec: '0x772746d',
|
|
5104
|
+
hashAlg: 'keccak-256'
|
|
5105
|
+
},
|
|
5106
|
+
{
|
|
5107
|
+
name: 'block-message',
|
|
5108
|
+
codec: '0x626d',
|
|
5109
|
+
hashAlg: 'keccak-256'
|
|
5110
|
+
},
|
|
5111
|
+
{
|
|
5112
|
+
name: 'bw-message',
|
|
5113
|
+
codec: '0x62776d',
|
|
5114
|
+
hashAlg: 'keccak-256'
|
|
5115
|
+
},
|
|
5116
|
+
{
|
|
5117
|
+
name: 'bw-request-message',
|
|
5118
|
+
codec: '0x6277726d',
|
|
5119
|
+
hashAlg: 'keccak-256'
|
|
5120
|
+
},
|
|
5121
|
+
{
|
|
5122
|
+
name: 'validator-message',
|
|
5123
|
+
codec: '0x766d',
|
|
5124
|
+
hashAlg: 'keccak-256'
|
|
5102
5125
|
}
|
|
5103
|
-
|
|
5104
|
-
|
|
5105
|
-
|
|
5106
|
-
|
|
5107
|
-
|
|
5108
|
-
|
|
5109
|
-
|
|
5110
|
-
|
|
5111
|
-
|
|
5112
|
-
|
|
5126
|
+
];
|
|
5127
|
+
|
|
5128
|
+
const internalCodecs = [
|
|
5129
|
+
{
|
|
5130
|
+
name: 'disco-hash',
|
|
5131
|
+
codec: '0x30',
|
|
5132
|
+
hashAlg: 'dbl-keccak-256',
|
|
5133
|
+
},
|
|
5134
|
+
{
|
|
5135
|
+
name: 'peernet-peer-response',
|
|
5136
|
+
codec: '0x707072',
|
|
5137
|
+
hashAlg: 'keccak-256',
|
|
5138
|
+
},
|
|
5139
|
+
{
|
|
5140
|
+
name: 'peernet-peer',
|
|
5141
|
+
codec: '0x7070',
|
|
5142
|
+
hashAlg: 'keccak-256',
|
|
5143
|
+
},
|
|
5144
|
+
{
|
|
5145
|
+
name: 'peernet-dht',
|
|
5146
|
+
codec: '0x706468',
|
|
5147
|
+
hashAlg: 'keccak-256',
|
|
5148
|
+
},
|
|
5149
|
+
{
|
|
5150
|
+
name: 'peernet-dht-response',
|
|
5151
|
+
codec: '0x706472',
|
|
5152
|
+
hashAlg: 'keccak-256',
|
|
5153
|
+
},
|
|
5154
|
+
{
|
|
5155
|
+
name: 'peernet-data',
|
|
5156
|
+
codec: '0x706461',
|
|
5157
|
+
hashAlg: 'keccak-256',
|
|
5158
|
+
},
|
|
5159
|
+
{
|
|
5160
|
+
name: 'peernet-data-response',
|
|
5161
|
+
codec: '0x70646172',
|
|
5162
|
+
hashAlg: 'keccak-256',
|
|
5163
|
+
},
|
|
5164
|
+
{
|
|
5165
|
+
name: 'peernet-message',
|
|
5166
|
+
codec: '0x706d65',
|
|
5167
|
+
hashAlg: 'keccak-256',
|
|
5168
|
+
},
|
|
5169
|
+
{
|
|
5170
|
+
name: 'peernet-ps',
|
|
5171
|
+
codec: '707073',
|
|
5172
|
+
hashAlg: 'keccak-256',
|
|
5173
|
+
},
|
|
5174
|
+
{
|
|
5175
|
+
name: 'peernet-response',
|
|
5176
|
+
codec: '0x7072',
|
|
5177
|
+
hashAlg: 'keccak-256',
|
|
5178
|
+
},
|
|
5179
|
+
{
|
|
5180
|
+
name: 'peernet-request',
|
|
5181
|
+
codec: '0x707271',
|
|
5182
|
+
hashAlg: 'keccak-256',
|
|
5183
|
+
},
|
|
5184
|
+
{
|
|
5185
|
+
name: 'peernet-file',
|
|
5186
|
+
codec: '0x7066',
|
|
5187
|
+
hashAlg: 'keccak-256',
|
|
5188
|
+
},
|
|
5189
|
+
{
|
|
5190
|
+
name: 'peernet-file-response',
|
|
5191
|
+
codec: '0x706672',
|
|
5192
|
+
hashAlg: 'keccak-256',
|
|
5113
5193
|
}
|
|
5114
|
-
|
|
5194
|
+
];
|
|
5115
5195
|
|
|
5116
|
-
|
|
5117
|
-
|
|
5118
|
-
|
|
5119
|
-
|
|
5120
|
-
|
|
5121
|
-
|
|
5122
|
-
|
|
5123
|
-
|
|
5124
|
-
|
|
5125
|
-
|
|
5126
|
-
|
|
5127
|
-
|
|
5196
|
+
var social = [{
|
|
5197
|
+
name: 'chat-message',
|
|
5198
|
+
codec: '0x70636d',
|
|
5199
|
+
hashAlg: 'dbl-keccak-256',
|
|
5200
|
+
}];
|
|
5201
|
+
|
|
5202
|
+
const codecs = [
|
|
5203
|
+
...internalCodecs,
|
|
5204
|
+
...blockchainCodecs,
|
|
5205
|
+
...social
|
|
5206
|
+
];
|
|
5207
|
+
|
|
5208
|
+
globalThis.peernetCodecs = globalThis.peernetCodecs || {};
|
|
5209
|
+
const addCodec = (codecInput) => {
|
|
5210
|
+
let { hashAlg, codec, name } = codecInput;
|
|
5211
|
+
if (!globalThis.peernetCodecs[name])
|
|
5212
|
+
globalThis.peernetCodecs[name] = {
|
|
5213
|
+
hashAlg,
|
|
5214
|
+
codec: typeof codec === 'string' ? parseInt(codec, 16) : codec
|
|
5215
|
+
};
|
|
5216
|
+
};
|
|
5217
|
+
const getCodec = (name) => {
|
|
5218
|
+
if (typeof name === 'number')
|
|
5219
|
+
return name;
|
|
5220
|
+
return getCodecByName(name).codec;
|
|
5221
|
+
};
|
|
5222
|
+
const getCodecName = (codec) => {
|
|
5223
|
+
return Object.keys(globalThis.peernetCodecs).reduce((p, c) => {
|
|
5224
|
+
const item = globalThis.peernetCodecs[c];
|
|
5225
|
+
if (item.codec === codec)
|
|
5226
|
+
return c;
|
|
5227
|
+
else
|
|
5228
|
+
return p;
|
|
5229
|
+
}, undefined);
|
|
5230
|
+
};
|
|
5231
|
+
const getCodecByName = (name) => globalThis.peernetCodecs[name];
|
|
5232
|
+
const getHashAlg = (name) => {
|
|
5233
|
+
if (typeof name === 'number')
|
|
5234
|
+
return getCodecByName(getCodecName(name)).hashAlg;
|
|
5235
|
+
return getCodecByName(name).hashAlg;
|
|
5236
|
+
};
|
|
5237
|
+
const isCodec = (codec) => {
|
|
5238
|
+
if (codec.codec !== undefined && codec.hashAlg)
|
|
5239
|
+
return true;
|
|
5240
|
+
return false;
|
|
5241
|
+
};
|
|
5242
|
+
const validateCodec = (codec) => {
|
|
5243
|
+
if (codec.codec === undefined ||
|
|
5244
|
+
codec.hashAlg === undefined ||
|
|
5245
|
+
codec.name === undefined)
|
|
5246
|
+
throw new Error(`invalid codecInput: ${codec}`);
|
|
5247
|
+
};
|
|
5248
|
+
for (const codec of codecs) {
|
|
5249
|
+
addCodec(codec);
|
|
5128
5250
|
}
|
|
5129
|
-
|
|
5130
|
-
|
|
5131
|
-
|
|
5132
|
-
|
|
5133
|
-
|
|
5134
|
-
|
|
5135
|
-
|
|
5136
|
-
|
|
5137
|
-
|
|
5138
|
-
|
|
5139
|
-
|
|
5251
|
+
var utils$p = {
|
|
5252
|
+
isCodec,
|
|
5253
|
+
addCodec,
|
|
5254
|
+
getCodec,
|
|
5255
|
+
getHashAlg,
|
|
5256
|
+
getCodecName,
|
|
5257
|
+
validateCodec,
|
|
5258
|
+
codecs: globalThis.peernetCodecs
|
|
5259
|
+
};
|
|
5260
|
+
|
|
5261
|
+
let Codec$1 = class Codec extends BasicInterface {
|
|
5262
|
+
codecBuffer;
|
|
5263
|
+
codec;
|
|
5264
|
+
hashAlg;
|
|
5265
|
+
constructor(buffer) {
|
|
5266
|
+
super();
|
|
5267
|
+
if (buffer) {
|
|
5268
|
+
if (buffer instanceof Uint8Array) {
|
|
5269
|
+
const codec = index$8.decode(buffer);
|
|
5270
|
+
const name = this.getCodecName(codec);
|
|
5271
|
+
if (name) {
|
|
5272
|
+
this.name = name;
|
|
5273
|
+
this.encoded = buffer;
|
|
5274
|
+
this.decode(buffer);
|
|
5275
|
+
}
|
|
5276
|
+
else {
|
|
5277
|
+
this.encode(Number(new TextDecoder().decode(buffer)));
|
|
5278
|
+
}
|
|
5279
|
+
}
|
|
5280
|
+
else if (buffer instanceof ArrayBuffer) {
|
|
5281
|
+
const codec = index$8.decode(buffer);
|
|
5282
|
+
const name = this.getCodecName(codec);
|
|
5283
|
+
if (name) {
|
|
5284
|
+
this.name = name;
|
|
5285
|
+
this.decode(buffer);
|
|
5286
|
+
}
|
|
5287
|
+
else {
|
|
5288
|
+
this.encode(Number(new TextDecoder().decode(new Uint8Array(buffer))));
|
|
5289
|
+
}
|
|
5290
|
+
}
|
|
5291
|
+
else if (typeof buffer === 'string') {
|
|
5292
|
+
if (utils$p.getCodec(buffer))
|
|
5293
|
+
this.fromName(buffer);
|
|
5294
|
+
else if (this.isHex(buffer))
|
|
5295
|
+
this.fromHex(buffer);
|
|
5296
|
+
else if (this.isBase32(buffer))
|
|
5297
|
+
this.fromBs32(buffer);
|
|
5298
|
+
else if (this.isBase58(buffer))
|
|
5299
|
+
this.fromBs58(buffer);
|
|
5300
|
+
else
|
|
5301
|
+
this.fromString(buffer);
|
|
5302
|
+
}
|
|
5303
|
+
if (!isNaN(buffer))
|
|
5304
|
+
if (utils$p.getCodec(buffer))
|
|
5305
|
+
this.fromCodec(buffer);
|
|
5306
|
+
}
|
|
5140
5307
|
}
|
|
5141
|
-
|
|
5142
|
-
|
|
5143
|
-
|
|
5144
|
-
|
|
5308
|
+
fromEncoded(encoded) {
|
|
5309
|
+
const codec = index$8.decode(encoded);
|
|
5310
|
+
const name = this.getCodecName(codec);
|
|
5311
|
+
this.name = name;
|
|
5312
|
+
this.encoded = encoded;
|
|
5313
|
+
return this.decode(encoded);
|
|
5145
5314
|
}
|
|
5146
|
-
|
|
5147
|
-
|
|
5148
|
-
if (buf[i] !== hexCharCodesToInt(str.charCodeAt(strIndex), str.charCodeAt(strIndex + 1))) {
|
|
5149
|
-
return false;
|
|
5150
|
-
}
|
|
5315
|
+
getCodec(name) {
|
|
5316
|
+
return utils$p.getCodec(name);
|
|
5151
5317
|
}
|
|
5152
|
-
|
|
5153
|
-
|
|
5154
|
-
const alpha = 'a'.charCodeAt(0) - 10;
|
|
5155
|
-
const digit = '0'.charCodeAt(0);
|
|
5156
|
-
function getDigestHex(tmpBuffer, input, hashLength) {
|
|
5157
|
-
let p = 0;
|
|
5158
|
-
/* eslint-disable no-plusplus */
|
|
5159
|
-
for (let i = 0; i < hashLength; i++) {
|
|
5160
|
-
let nibble = input[i] >>> 4;
|
|
5161
|
-
tmpBuffer[p++] = nibble > 9 ? nibble + alpha : nibble + digit;
|
|
5162
|
-
nibble = input[i] & 0xF;
|
|
5163
|
-
tmpBuffer[p++] = nibble > 9 ? nibble + alpha : nibble + digit;
|
|
5318
|
+
getCodecName(codec) {
|
|
5319
|
+
return utils$p.getCodecName(codec);
|
|
5164
5320
|
}
|
|
5165
|
-
|
|
5166
|
-
|
|
5167
|
-
}
|
|
5168
|
-
|
|
5169
|
-
|
|
5170
|
-
|
|
5171
|
-
|
|
5172
|
-
|
|
5321
|
+
getHashAlg(name) {
|
|
5322
|
+
return utils$p.getHashAlg(name);
|
|
5323
|
+
}
|
|
5324
|
+
fromCodec(codec) {
|
|
5325
|
+
this.name = this.getCodecName(codec);
|
|
5326
|
+
this.hashAlg = this.getHashAlg(this.name);
|
|
5327
|
+
this.codec = this.getCodec(this.name);
|
|
5328
|
+
this.codecBuffer = index$8.encode(this.codec);
|
|
5329
|
+
this.decoded = {
|
|
5330
|
+
name: this.name,
|
|
5331
|
+
hashAlg: this.hashAlg,
|
|
5332
|
+
codec: this.codec,
|
|
5333
|
+
codecBuffer: this.codecBuffer
|
|
5334
|
+
};
|
|
5335
|
+
}
|
|
5336
|
+
fromName(name) {
|
|
5337
|
+
const codec = this.getCodec(name);
|
|
5338
|
+
this.name = name;
|
|
5339
|
+
this.codec = codec;
|
|
5340
|
+
this.hashAlg = this.getHashAlg(name);
|
|
5341
|
+
this.codecBuffer = index$8.encode(this.codec);
|
|
5342
|
+
this.decoded = {
|
|
5343
|
+
name: this.name,
|
|
5344
|
+
hashAlg: this.hashAlg,
|
|
5345
|
+
codec: this.codec,
|
|
5346
|
+
codecBuffer: this.codecBuffer
|
|
5347
|
+
};
|
|
5348
|
+
}
|
|
5349
|
+
decode(encoded) {
|
|
5350
|
+
encoded = encoded || this.encoded;
|
|
5351
|
+
const codec = index$8.decode(encoded);
|
|
5352
|
+
this.fromCodec(codec);
|
|
5353
|
+
return this.decoded;
|
|
5354
|
+
}
|
|
5355
|
+
encode(codec) {
|
|
5356
|
+
codec = codec || this.codec;
|
|
5357
|
+
this.encoded = index$8.encode(codec);
|
|
5358
|
+
return this.encoded;
|
|
5359
|
+
}
|
|
5360
|
+
};
|
|
5361
|
+
|
|
5362
|
+
class CodecHash extends BasicInterface {
|
|
5363
|
+
codec;
|
|
5364
|
+
discoCodec;
|
|
5365
|
+
constructor(buffer, options = {}) {
|
|
5366
|
+
super();
|
|
5367
|
+
if (options.name)
|
|
5368
|
+
this.name = options.name;
|
|
5369
|
+
else
|
|
5370
|
+
this.name = 'disco-hash';
|
|
5371
|
+
if (options.codecs)
|
|
5372
|
+
this.codecs = options.codecs;
|
|
5373
|
+
return this.init(buffer);
|
|
5374
|
+
}
|
|
5375
|
+
async init(uint8Array) {
|
|
5376
|
+
if (uint8Array) {
|
|
5377
|
+
if (uint8Array instanceof Uint8Array) {
|
|
5378
|
+
this.discoCodec = new Codec$1(uint8Array, this.codecs);
|
|
5379
|
+
const name = this.discoCodec.name;
|
|
5380
|
+
if (name) {
|
|
5381
|
+
this.name = name;
|
|
5382
|
+
this.decode(uint8Array);
|
|
5383
|
+
}
|
|
5384
|
+
else {
|
|
5385
|
+
await this.encode(uint8Array);
|
|
5386
|
+
}
|
|
5387
|
+
}
|
|
5388
|
+
if (typeof uint8Array === 'string') {
|
|
5389
|
+
if (this.isHex(uint8Array))
|
|
5390
|
+
await this.fromHex(uint8Array);
|
|
5391
|
+
if (this.isBase32(uint8Array))
|
|
5392
|
+
await this.fromBs32(uint8Array);
|
|
5393
|
+
else if (this.isBase58(uint8Array))
|
|
5394
|
+
await this.fromBs58(uint8Array);
|
|
5395
|
+
else
|
|
5396
|
+
throw new Error(`unsupported string ${uint8Array}`);
|
|
5397
|
+
}
|
|
5398
|
+
else if (typeof uint8Array === 'object')
|
|
5399
|
+
await this.fromJSON(uint8Array);
|
|
5173
5400
|
}
|
|
5174
|
-
|
|
5175
|
-
|
|
5401
|
+
return this;
|
|
5402
|
+
}
|
|
5403
|
+
get prefix() {
|
|
5404
|
+
const length = this.length;
|
|
5405
|
+
const uint8Array = new Uint8Array(length.length + this.discoCodec.codecBuffer.length);
|
|
5406
|
+
uint8Array.set(length);
|
|
5407
|
+
uint8Array.set(this.discoCodec.codecBuffer, length.length);
|
|
5408
|
+
return uint8Array;
|
|
5409
|
+
}
|
|
5410
|
+
get length() {
|
|
5411
|
+
return index$8.encode(this.size);
|
|
5412
|
+
}
|
|
5413
|
+
get buffer() {
|
|
5414
|
+
return this.encoded;
|
|
5415
|
+
}
|
|
5416
|
+
get hash() {
|
|
5417
|
+
return this.encoded;
|
|
5418
|
+
}
|
|
5419
|
+
fromJSON(json) {
|
|
5420
|
+
return this.encode(new TextEncoder().encode(JSON.stringify(json)));
|
|
5421
|
+
}
|
|
5422
|
+
async encode(buffer, name) {
|
|
5423
|
+
if (!this.name && name)
|
|
5424
|
+
this.name = name;
|
|
5425
|
+
if (!buffer)
|
|
5426
|
+
buffer = this.buffer;
|
|
5427
|
+
this.discoCodec = new Codec$1(this.name);
|
|
5428
|
+
this.discoCodec.fromName(this.name);
|
|
5429
|
+
let hashAlg = this.discoCodec.hashAlg;
|
|
5430
|
+
const hashVariant = Number(hashAlg.split('-')[hashAlg.split('-').length - 1]);
|
|
5431
|
+
if (hashAlg.includes('dbl')) {
|
|
5432
|
+
hashAlg = hashAlg.replace('dbl-', '');
|
|
5433
|
+
// const hasher = await createKeccak(hashVariant)
|
|
5434
|
+
// await hasher.init()
|
|
5435
|
+
// hasher.update(buffer)
|
|
5436
|
+
// buffer = hasher.digest('binary')
|
|
5437
|
+
buffer = await crypto.subtle.digest(`SHA-${hashVariant}`, buffer);
|
|
5176
5438
|
}
|
|
5177
|
-
|
|
5178
|
-
|
|
5439
|
+
// const hasher = await createKeccak(hashVariant)
|
|
5440
|
+
// await hasher.init()
|
|
5441
|
+
// hasher.update(buffer)
|
|
5442
|
+
// this.digest = hasher.digest('binary')
|
|
5443
|
+
this.digest = await crypto.subtle.digest(`SHA-${hashVariant}`, buffer);
|
|
5444
|
+
if (this.digest instanceof ArrayBuffer) {
|
|
5445
|
+
this.digest = new Uint8Array(this.digest);
|
|
5179
5446
|
}
|
|
5180
|
-
|
|
5447
|
+
this.size = this.digest.length;
|
|
5448
|
+
this.codec = this.discoCodec.encode();
|
|
5449
|
+
this.codec = this.discoCodec.codecBuffer;
|
|
5450
|
+
const uint8Array = new Uint8Array(this.digest.length + this.prefix.length);
|
|
5451
|
+
uint8Array.set(this.prefix);
|
|
5452
|
+
uint8Array.set(this.digest, this.prefix.length);
|
|
5453
|
+
this.encoded = uint8Array;
|
|
5454
|
+
return this.encoded;
|
|
5181
5455
|
}
|
|
5182
|
-
|
|
5183
|
-
if (
|
|
5184
|
-
|
|
5185
|
-
|
|
5186
|
-
|
|
5187
|
-
|
|
5456
|
+
async validate(buffer) {
|
|
5457
|
+
if (Buffer.isBuffer(buffer)) {
|
|
5458
|
+
const codec = index$8.decode(buffer);
|
|
5459
|
+
if (this.codecs[codec]) {
|
|
5460
|
+
this.decode(buffer);
|
|
5461
|
+
}
|
|
5462
|
+
else {
|
|
5463
|
+
await this.encode(buffer);
|
|
5464
|
+
}
|
|
5188
5465
|
}
|
|
5189
|
-
|
|
5190
|
-
|
|
5191
|
-
|
|
5192
|
-
|
|
5193
|
-
|
|
5194
|
-
base64Lookup[base64Chars.charCodeAt(i)] = i;
|
|
5195
|
-
}
|
|
5196
|
-
function getDecodeBase64Length(data) {
|
|
5197
|
-
let bufferLength = Math.floor(data.length * 0.75);
|
|
5198
|
-
const len = data.length;
|
|
5199
|
-
if (data[len - 1] === '=') {
|
|
5200
|
-
bufferLength -= 1;
|
|
5201
|
-
if (data[len - 2] === '=') {
|
|
5202
|
-
bufferLength -= 1;
|
|
5466
|
+
if (typeof buffer === 'string') {
|
|
5467
|
+
if (this.isHex(buffer))
|
|
5468
|
+
this.fromHex(buffer);
|
|
5469
|
+
if (this.isBase32(buffer))
|
|
5470
|
+
this.fromBs32(buffer);
|
|
5203
5471
|
}
|
|
5472
|
+
if (typeof buffer === 'object')
|
|
5473
|
+
this.fromJSON(buffer);
|
|
5204
5474
|
}
|
|
5205
|
-
|
|
5206
|
-
|
|
5207
|
-
|
|
5208
|
-
|
|
5209
|
-
|
|
5210
|
-
|
|
5211
|
-
|
|
5212
|
-
|
|
5213
|
-
|
|
5214
|
-
|
|
5215
|
-
const encoded3 = base64Lookup[data.charCodeAt(i + 2)];
|
|
5216
|
-
const encoded4 = base64Lookup[data.charCodeAt(i + 3)];
|
|
5217
|
-
bytes[p] = (encoded1 << 2) | (encoded2 >> 4);
|
|
5218
|
-
p += 1;
|
|
5219
|
-
bytes[p] = ((encoded2 & 15) << 4) | (encoded3 >> 2);
|
|
5220
|
-
p += 1;
|
|
5221
|
-
bytes[p] = ((encoded3 & 3) << 6) | (encoded4 & 63);
|
|
5222
|
-
p += 1;
|
|
5223
|
-
}
|
|
5224
|
-
return bytes;
|
|
5225
|
-
}
|
|
5226
|
-
|
|
5227
|
-
const MAX_HEAP = 16 * 1024;
|
|
5228
|
-
const WASM_FUNC_HASH_LENGTH = 4;
|
|
5229
|
-
const wasmMutex = new Mutex();
|
|
5230
|
-
const wasmModuleCache = new Map();
|
|
5231
|
-
function WASMInterface(binary, hashLength) {
|
|
5232
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
5233
|
-
let wasmInstance = null;
|
|
5234
|
-
let memoryView = null;
|
|
5235
|
-
let initialized = false;
|
|
5236
|
-
if (typeof WebAssembly === 'undefined') {
|
|
5237
|
-
throw new Error('WebAssembly is not supported in this environment!');
|
|
5238
|
-
}
|
|
5239
|
-
const writeMemory = (data, offset = 0) => {
|
|
5240
|
-
memoryView.set(data, offset);
|
|
5241
|
-
};
|
|
5242
|
-
const getMemory = () => memoryView;
|
|
5243
|
-
const getExports = () => wasmInstance.exports;
|
|
5244
|
-
const setMemorySize = (totalSize) => {
|
|
5245
|
-
wasmInstance.exports.Hash_SetMemorySize(totalSize);
|
|
5246
|
-
const arrayOffset = wasmInstance.exports.Hash_GetBuffer();
|
|
5247
|
-
const memoryBuffer = wasmInstance.exports.memory.buffer;
|
|
5248
|
-
memoryView = new Uint8Array(memoryBuffer, arrayOffset, totalSize);
|
|
5249
|
-
};
|
|
5250
|
-
const getStateSize = () => {
|
|
5251
|
-
const view = new DataView(wasmInstance.exports.memory.buffer);
|
|
5252
|
-
const stateSize = view.getUint32(wasmInstance.exports.STATE_SIZE, true);
|
|
5253
|
-
return stateSize;
|
|
5254
|
-
};
|
|
5255
|
-
const loadWASMPromise = wasmMutex.dispatch(() => __awaiter(this, void 0, void 0, function* () {
|
|
5256
|
-
if (!wasmModuleCache.has(binary.name)) {
|
|
5257
|
-
const asm = decodeBase64(binary.data);
|
|
5258
|
-
const promise = WebAssembly.compile(asm);
|
|
5259
|
-
wasmModuleCache.set(binary.name, promise);
|
|
5260
|
-
}
|
|
5261
|
-
const module = yield wasmModuleCache.get(binary.name);
|
|
5262
|
-
wasmInstance = yield WebAssembly.instantiate(module, {
|
|
5263
|
-
// env: {
|
|
5264
|
-
// emscripten_memcpy_big: (dest, src, num) => {
|
|
5265
|
-
// const memoryBuffer = wasmInstance.exports.memory.buffer;
|
|
5266
|
-
// const memView = new Uint8Array(memoryBuffer, 0);
|
|
5267
|
-
// memView.set(memView.subarray(src, src + num), dest);
|
|
5268
|
-
// },
|
|
5269
|
-
// print_memory: (offset, len) => {
|
|
5270
|
-
// const memoryBuffer = wasmInstance.exports.memory.buffer;
|
|
5271
|
-
// const memView = new Uint8Array(memoryBuffer, 0);
|
|
5272
|
-
// console.log('print_int32', memView.subarray(offset, offset + len));
|
|
5273
|
-
// },
|
|
5274
|
-
// },
|
|
5275
|
-
});
|
|
5276
|
-
// wasmInstance.exports._start();
|
|
5277
|
-
}));
|
|
5278
|
-
const setupInterface = () => __awaiter(this, void 0, void 0, function* () {
|
|
5279
|
-
if (!wasmInstance) {
|
|
5280
|
-
yield loadWASMPromise;
|
|
5281
|
-
}
|
|
5282
|
-
const arrayOffset = wasmInstance.exports.Hash_GetBuffer();
|
|
5283
|
-
const memoryBuffer = wasmInstance.exports.memory.buffer;
|
|
5284
|
-
memoryView = new Uint8Array(memoryBuffer, arrayOffset, MAX_HEAP);
|
|
5285
|
-
});
|
|
5286
|
-
const init = (bits = null) => {
|
|
5287
|
-
initialized = true;
|
|
5288
|
-
wasmInstance.exports.Hash_Init(bits);
|
|
5289
|
-
};
|
|
5290
|
-
const updateUInt8Array = (data) => {
|
|
5291
|
-
let read = 0;
|
|
5292
|
-
while (read < data.length) {
|
|
5293
|
-
const chunk = data.subarray(read, read + MAX_HEAP);
|
|
5294
|
-
read += chunk.length;
|
|
5295
|
-
memoryView.set(chunk);
|
|
5296
|
-
wasmInstance.exports.Hash_Update(chunk.length);
|
|
5297
|
-
}
|
|
5298
|
-
};
|
|
5299
|
-
const update = (data) => {
|
|
5300
|
-
if (!initialized) {
|
|
5301
|
-
throw new Error('update() called before init()');
|
|
5302
|
-
}
|
|
5303
|
-
const Uint8Buffer = getUInt8Buffer(data);
|
|
5304
|
-
updateUInt8Array(Uint8Buffer);
|
|
5305
|
-
};
|
|
5306
|
-
const digestChars = new Uint8Array(hashLength * 2);
|
|
5307
|
-
const digest = (outputType, padding = null) => {
|
|
5308
|
-
if (!initialized) {
|
|
5309
|
-
throw new Error('digest() called before init()');
|
|
5310
|
-
}
|
|
5311
|
-
initialized = false;
|
|
5312
|
-
wasmInstance.exports.Hash_Final(padding);
|
|
5313
|
-
if (outputType === 'binary') {
|
|
5314
|
-
// the data is copied to allow GC of the original memory object
|
|
5315
|
-
return memoryView.slice(0, hashLength);
|
|
5316
|
-
}
|
|
5317
|
-
return getDigestHex(digestChars, memoryView, hashLength);
|
|
5318
|
-
};
|
|
5319
|
-
const save = () => {
|
|
5320
|
-
if (!initialized) {
|
|
5321
|
-
throw new Error('save() can only be called after init() and before digest()');
|
|
5322
|
-
}
|
|
5323
|
-
const stateOffset = wasmInstance.exports.Hash_GetState();
|
|
5324
|
-
const stateLength = getStateSize();
|
|
5325
|
-
const memoryBuffer = wasmInstance.exports.memory.buffer;
|
|
5326
|
-
const internalState = new Uint8Array(memoryBuffer, stateOffset, stateLength);
|
|
5327
|
-
// prefix is 4 bytes from SHA1 hash of the WASM binary
|
|
5328
|
-
// it is used to detect incompatible internal states between different versions of hash-wasm
|
|
5329
|
-
const prefixedState = new Uint8Array(WASM_FUNC_HASH_LENGTH + stateLength);
|
|
5330
|
-
writeHexToUInt8(prefixedState, binary.hash);
|
|
5331
|
-
prefixedState.set(internalState, WASM_FUNC_HASH_LENGTH);
|
|
5332
|
-
return prefixedState;
|
|
5333
|
-
};
|
|
5334
|
-
const load = (state) => {
|
|
5335
|
-
if (!(state instanceof Uint8Array)) {
|
|
5336
|
-
throw new Error('load() expects an Uint8Array generated by save()');
|
|
5337
|
-
}
|
|
5338
|
-
const stateOffset = wasmInstance.exports.Hash_GetState();
|
|
5339
|
-
const stateLength = getStateSize();
|
|
5340
|
-
const overallLength = WASM_FUNC_HASH_LENGTH + stateLength;
|
|
5341
|
-
const memoryBuffer = wasmInstance.exports.memory.buffer;
|
|
5342
|
-
if (state.length !== overallLength) {
|
|
5343
|
-
throw new Error(`Bad state length (expected ${overallLength} bytes, got ${state.length})`);
|
|
5344
|
-
}
|
|
5345
|
-
if (!hexStringEqualsUInt8(binary.hash, state.subarray(0, WASM_FUNC_HASH_LENGTH))) {
|
|
5346
|
-
throw new Error('This state was written by an incompatible hash implementation');
|
|
5347
|
-
}
|
|
5348
|
-
const internalState = state.subarray(WASM_FUNC_HASH_LENGTH);
|
|
5349
|
-
new Uint8Array(memoryBuffer, stateOffset, stateLength).set(internalState);
|
|
5350
|
-
initialized = true;
|
|
5351
|
-
};
|
|
5352
|
-
const isDataShort = (data) => {
|
|
5353
|
-
if (typeof data === 'string') {
|
|
5354
|
-
// worst case is 4 bytes / char
|
|
5355
|
-
return data.length < MAX_HEAP / 4;
|
|
5356
|
-
}
|
|
5357
|
-
return data.byteLength < MAX_HEAP;
|
|
5358
|
-
};
|
|
5359
|
-
let canSimplify = isDataShort;
|
|
5360
|
-
switch (binary.name) {
|
|
5361
|
-
case 'argon2':
|
|
5362
|
-
case 'scrypt':
|
|
5363
|
-
canSimplify = () => true;
|
|
5364
|
-
break;
|
|
5365
|
-
case 'blake2b':
|
|
5366
|
-
case 'blake2s':
|
|
5367
|
-
// if there is a key at blake2 then cannot simplify
|
|
5368
|
-
canSimplify = (data, initParam) => initParam <= 512 && isDataShort(data);
|
|
5369
|
-
break;
|
|
5370
|
-
case 'blake3':
|
|
5371
|
-
// if there is a key at blake3 then cannot simplify
|
|
5372
|
-
canSimplify = (data, initParam) => initParam === 0 && isDataShort(data);
|
|
5373
|
-
break;
|
|
5374
|
-
case 'xxhash64': // cannot simplify
|
|
5375
|
-
case 'xxhash3':
|
|
5376
|
-
case 'xxhash128':
|
|
5377
|
-
canSimplify = () => false;
|
|
5378
|
-
break;
|
|
5475
|
+
decode(buffer) {
|
|
5476
|
+
this.encoded = buffer;
|
|
5477
|
+
const codec = index$8.decode(buffer);
|
|
5478
|
+
this.discoCodec = new Codec$1(codec, this.codecs);
|
|
5479
|
+
// TODO: validate codec
|
|
5480
|
+
buffer = buffer.slice(index$8.decode.bytes);
|
|
5481
|
+
this.size = index$8.decode(buffer);
|
|
5482
|
+
this.digest = buffer.slice(index$8.decode.bytes);
|
|
5483
|
+
if (this.digest.length !== this.size) {
|
|
5484
|
+
throw new Error(`hash length inconsistent: 0x${this.encoded.toString('hex')}`);
|
|
5379
5485
|
}
|
|
5380
|
-
//
|
|
5381
|
-
|
|
5382
|
-
|
|
5383
|
-
init(initParam);
|
|
5384
|
-
update(data);
|
|
5385
|
-
return digest('hex', digestParam);
|
|
5386
|
-
}
|
|
5387
|
-
const buffer = getUInt8Buffer(data);
|
|
5388
|
-
memoryView.set(buffer);
|
|
5389
|
-
wasmInstance.exports.Hash_Calculate(buffer.length, initParam, digestParam);
|
|
5390
|
-
return getDigestHex(digestChars, memoryView, hashLength);
|
|
5391
|
-
};
|
|
5392
|
-
yield setupInterface();
|
|
5486
|
+
// const discoCodec = new Codec(codec, this.codecs)
|
|
5487
|
+
this.name = this.discoCodec.name;
|
|
5488
|
+
this.size = this.digest.length;
|
|
5393
5489
|
return {
|
|
5394
|
-
|
|
5395
|
-
|
|
5396
|
-
|
|
5397
|
-
|
|
5398
|
-
|
|
5399
|
-
update,
|
|
5400
|
-
digest,
|
|
5401
|
-
save,
|
|
5402
|
-
load,
|
|
5403
|
-
calculate,
|
|
5404
|
-
hashLength,
|
|
5490
|
+
codec: this.codec,
|
|
5491
|
+
name: this.name,
|
|
5492
|
+
size: this.size,
|
|
5493
|
+
length: this.length,
|
|
5494
|
+
digest: this.digest,
|
|
5405
5495
|
};
|
|
5406
|
-
}
|
|
5496
|
+
}
|
|
5407
5497
|
}
|
|
5408
5498
|
|
|
5409
|
-
|
|
5410
|
-
|
|
5411
|
-
|
|
5412
|
-
|
|
5413
|
-
|
|
5414
|
-
|
|
5415
|
-
|
|
5416
|
-
|
|
5417
|
-
|
|
5418
|
-
|
|
5419
|
-
|
|
5420
|
-
|
|
5421
|
-
|
|
5422
|
-
|
|
5423
|
-
|
|
5424
|
-
|
|
5425
|
-
|
|
5426
|
-
|
|
5427
|
-
|
|
5428
|
-
|
|
5429
|
-
|
|
5430
|
-
|
|
5431
|
-
|
|
5432
|
-
|
|
5433
|
-
hash: hash$b
|
|
5434
|
-
};
|
|
5435
|
-
|
|
5436
|
-
new Mutex();
|
|
5437
|
-
|
|
5438
|
-
new Mutex();
|
|
5439
|
-
function validateBits(bits) {
|
|
5440
|
-
if (![224, 256, 384, 512].includes(bits)) {
|
|
5441
|
-
return new Error('Invalid variant! Valid values: 224, 256, 384, 512');
|
|
5499
|
+
let FormatInterface$1 = class FormatInterface extends BasicInterface {
|
|
5500
|
+
hashFormat;
|
|
5501
|
+
#hash;
|
|
5502
|
+
init(buffer) {
|
|
5503
|
+
if (buffer instanceof Uint8Array)
|
|
5504
|
+
this.fromUint8Array(buffer);
|
|
5505
|
+
else if (buffer instanceof ArrayBuffer)
|
|
5506
|
+
this.fromArrayBuffer(buffer);
|
|
5507
|
+
else if (buffer instanceof FormatInterface && buffer?.name === this.name)
|
|
5508
|
+
return buffer;
|
|
5509
|
+
else if (typeof buffer === 'string') {
|
|
5510
|
+
if (this.isHex(buffer))
|
|
5511
|
+
this.fromHex(buffer);
|
|
5512
|
+
else if (this.isBase58(buffer))
|
|
5513
|
+
this.fromBs58(buffer);
|
|
5514
|
+
else if (this.isBase32(buffer))
|
|
5515
|
+
this.fromBs32(buffer);
|
|
5516
|
+
else
|
|
5517
|
+
this.fromString(buffer);
|
|
5518
|
+
}
|
|
5519
|
+
else {
|
|
5520
|
+
this.create(buffer);
|
|
5521
|
+
}
|
|
5522
|
+
return this;
|
|
5442
5523
|
}
|
|
5443
|
-
|
|
5444
|
-
|
|
5445
|
-
|
|
5446
|
-
|
|
5447
|
-
|
|
5448
|
-
|
|
5449
|
-
function createKeccak(bits = 512) {
|
|
5450
|
-
if (validateBits(bits)) {
|
|
5451
|
-
return Promise.reject(validateBits(bits));
|
|
5524
|
+
hasCodec() {
|
|
5525
|
+
if (!this.encoded)
|
|
5526
|
+
return false;
|
|
5527
|
+
const codec = new Codec$1(this.encoded);
|
|
5528
|
+
if (codec.name)
|
|
5529
|
+
return true;
|
|
5452
5530
|
}
|
|
5453
|
-
|
|
5454
|
-
|
|
5455
|
-
|
|
5456
|
-
|
|
5457
|
-
|
|
5458
|
-
|
|
5459
|
-
|
|
5460
|
-
|
|
5461
|
-
|
|
5462
|
-
|
|
5463
|
-
|
|
5464
|
-
}
|
|
5465
|
-
|
|
5466
|
-
|
|
5467
|
-
}
|
|
5468
|
-
|
|
5469
|
-
|
|
5531
|
+
decode(encoded) {
|
|
5532
|
+
encoded = encoded || this.encoded;
|
|
5533
|
+
const codec = new Codec$1(encoded);
|
|
5534
|
+
if (codec.codecBuffer) {
|
|
5535
|
+
encoded = encoded.slice(codec.codecBuffer.length);
|
|
5536
|
+
this.name = codec.name;
|
|
5537
|
+
this.decoded = this.protoDecode(encoded);
|
|
5538
|
+
// try {
|
|
5539
|
+
// this.decoded = JSON.parse(this.decoded)
|
|
5540
|
+
// } catch {
|
|
5541
|
+
// }
|
|
5542
|
+
}
|
|
5543
|
+
else {
|
|
5544
|
+
throw new Error(`no codec found`);
|
|
5545
|
+
}
|
|
5546
|
+
return this.decoded;
|
|
5547
|
+
}
|
|
5548
|
+
encode(decoded) {
|
|
5549
|
+
let encoded;
|
|
5550
|
+
decoded = decoded || this.decoded;
|
|
5551
|
+
const codec = new Codec$1(this.name);
|
|
5552
|
+
if (decoded instanceof Uint8Array)
|
|
5553
|
+
encoded = decoded;
|
|
5554
|
+
else
|
|
5555
|
+
encoded = this.protoEncode(decoded);
|
|
5556
|
+
if (codec.codecBuffer) {
|
|
5557
|
+
const uint8Array = new Uint8Array(encoded.length + codec.codecBuffer.length);
|
|
5558
|
+
uint8Array.set(codec.codecBuffer);
|
|
5559
|
+
uint8Array.set(encoded, codec.codecBuffer.length);
|
|
5560
|
+
this.encoded = uint8Array;
|
|
5561
|
+
}
|
|
5562
|
+
else {
|
|
5563
|
+
throw new Error(`invalid codec`);
|
|
5564
|
+
}
|
|
5565
|
+
return this.encoded;
|
|
5566
|
+
}
|
|
5567
|
+
/**
|
|
5568
|
+
* @param {Buffer|String|Object} buffer - data - The data needed to create the desired message
|
|
5569
|
+
* @param {Object} proto - {protoObject}
|
|
5570
|
+
* @param {Object} options - {hashFormat, name}
|
|
5571
|
+
*/
|
|
5572
|
+
constructor(buffer, proto, options) {
|
|
5573
|
+
super();
|
|
5574
|
+
this.proto = proto;
|
|
5575
|
+
this.hashFormat = options?.hashFormat ? options.hashFormat : 'bs32';
|
|
5576
|
+
if (options?.name)
|
|
5577
|
+
this.name = options.name;
|
|
5578
|
+
this.init(buffer);
|
|
5579
|
+
}
|
|
5580
|
+
get format() {
|
|
5581
|
+
const upper = this.hashFormat.charAt(0).toUpperCase();
|
|
5582
|
+
return `${upper}${this.hashFormat.substring(1, this.hashFormat.length)}`;
|
|
5583
|
+
}
|
|
5584
|
+
/**
|
|
5585
|
+
* @return {PeernetHash}
|
|
5586
|
+
*/
|
|
5587
|
+
get peernetHash() {
|
|
5588
|
+
const decoded = this.decoded;
|
|
5589
|
+
// @ts-ignore
|
|
5590
|
+
delete decoded.hash;
|
|
5591
|
+
return new CodecHash(decoded, { name: this.name });
|
|
5592
|
+
}
|
|
5593
|
+
/**
|
|
5594
|
+
* @return {peernetHash}
|
|
5595
|
+
*/
|
|
5596
|
+
async hash() {
|
|
5597
|
+
if (this.#hash)
|
|
5598
|
+
return this.#hash;
|
|
5599
|
+
const upper = this.hashFormat.charAt(0).toUpperCase();
|
|
5600
|
+
const format = `${upper}${this.hashFormat.substring(1, this.hashFormat.length)}`;
|
|
5601
|
+
this.#hash = (await this.peernetHash)[`to${format}`]();
|
|
5602
|
+
return this.#hash;
|
|
5603
|
+
}
|
|
5604
|
+
fromUint8Array(buffer) {
|
|
5605
|
+
this.encoded = buffer;
|
|
5606
|
+
return this.hasCodec() ? this.decode() : this.create(JSON.parse(new TextDecoder().decode(this.encoded)));
|
|
5607
|
+
}
|
|
5608
|
+
fromArrayBuffer(buffer) {
|
|
5609
|
+
this.encoded = new Uint8Array(buffer, buffer.byteOffset, buffer.byteLength);
|
|
5610
|
+
return this.hasCodec() ? this.decode() : this.create(JSON.parse(new TextDecoder().decode(this.encoded)));
|
|
5611
|
+
}
|
|
5612
|
+
/**
|
|
5613
|
+
* @param {Object} data
|
|
5614
|
+
*/
|
|
5615
|
+
create(data) {
|
|
5616
|
+
const decoded = {};
|
|
5617
|
+
if (data.hash)
|
|
5618
|
+
this.#hash = data.hash;
|
|
5619
|
+
if (this.keys?.length > 0) {
|
|
5620
|
+
for (const key of this.keys) {
|
|
5621
|
+
decoded[key] = data[key];
|
|
5622
|
+
}
|
|
5623
|
+
this.decoded = decoded;
|
|
5624
|
+
// return this.encode(decoded)
|
|
5625
|
+
}
|
|
5626
|
+
}
|
|
5627
|
+
};
|
|
5470
5628
|
|
|
5471
|
-
|
|
5629
|
+
const FormatInterface = FormatInterface$1;
|
|
5630
|
+
const Codec = Codec$1;
|
|
5472
5631
|
|
|
5473
|
-
|
|
5474
|
-
var data$9 = "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";
|
|
5475
|
-
|
|
5476
|
-
|
|
5477
|
-
|
|
5478
|
-
|
|
5479
|
-
|
|
5632
|
+
const BufferToUint8Array = data => {
|
|
5633
|
+
if (data.type === 'Buffer') {
|
|
5634
|
+
data = new Uint8Array(data.data);
|
|
5635
|
+
}
|
|
5636
|
+
return data
|
|
5637
|
+
};
|
|
5638
|
+
|
|
5639
|
+
const protoFor = (message) => {
|
|
5640
|
+
const codec = new Codec(message);
|
|
5641
|
+
if (!codec.name) throw new Error('proto not found')
|
|
5642
|
+
const Proto = globalThis.peernet.protos[codec.name];
|
|
5643
|
+
if (!Proto) throw (new Error(`No proto defined for ${codec.name}`))
|
|
5644
|
+
return new Proto(message)
|
|
5645
|
+
};
|
|
5646
|
+
|
|
5647
|
+
/**
|
|
5648
|
+
* wether or not a peernet daemon is active
|
|
5649
|
+
* @return {Boolean}
|
|
5650
|
+
*/
|
|
5651
|
+
const hasDaemon = async () => {
|
|
5652
|
+
try {
|
|
5653
|
+
let response = await fetch('http://127.0.0.1:1000/api/version');
|
|
5654
|
+
response = await response.json();
|
|
5655
|
+
return Boolean(response.client === '@peernet/api/http')
|
|
5656
|
+
} catch (e) {
|
|
5657
|
+
return false
|
|
5658
|
+
}
|
|
5659
|
+
};
|
|
5660
|
+
|
|
5661
|
+
const https = () => {
|
|
5662
|
+
if (!globalThis.location) return false;
|
|
5663
|
+
return Boolean(globalThis.location.protocol === 'https:')
|
|
5664
|
+
};
|
|
5665
|
+
|
|
5666
|
+
/**
|
|
5667
|
+
* Get current environment
|
|
5668
|
+
* @return {String} current environment [node, electron, browser]
|
|
5669
|
+
*/
|
|
5670
|
+
const environment = () => {
|
|
5671
|
+
const _navigator = globalThis.navigator;
|
|
5672
|
+
if (!_navigator) {
|
|
5673
|
+
return 'node'
|
|
5674
|
+
} else if (_navigator && /electron/i.test(_navigator.userAgent)) {
|
|
5675
|
+
return 'electron'
|
|
5676
|
+
} else {
|
|
5677
|
+
return 'browser'
|
|
5678
|
+
}
|
|
5679
|
+
};
|
|
5680
|
+
|
|
5681
|
+
/**
|
|
5682
|
+
* * Get current environment
|
|
5683
|
+
* @return {Object} result
|
|
5684
|
+
* @property {Boolean} reult.daemon whether or not daemon is running
|
|
5685
|
+
* @property {Boolean} reult.environment Current environment
|
|
5686
|
+
*/
|
|
5687
|
+
const target = async () => {
|
|
5688
|
+
let daemon = false;
|
|
5689
|
+
if (!https()) daemon = await hasDaemon();
|
|
5690
|
+
|
|
5691
|
+
return {daemon, environment: environment()}
|
|
5480
5692
|
};
|
|
5481
5693
|
|
|
5482
|
-
|
|
5483
|
-
|
|
5484
|
-
|
|
5485
|
-
|
|
5486
|
-
|
|
5487
|
-
|
|
5488
|
-
|
|
5489
|
-
|
|
5490
|
-
|
|
5491
|
-
|
|
5492
|
-
|
|
5493
|
-
|
|
5494
|
-
|
|
5495
|
-
|
|
5496
|
-
|
|
5497
|
-
|
|
5498
|
-
|
|
5499
|
-
|
|
5500
|
-
|
|
5501
|
-
|
|
5694
|
+
class PeerDiscovery {
|
|
5695
|
+
constructor(id) {
|
|
5696
|
+
this.id = id;
|
|
5697
|
+
}
|
|
5698
|
+
|
|
5699
|
+
_getPeerId(id) {
|
|
5700
|
+
if (!peernet.peerMap || peernet.peerMap && peernet.peerMap.size === 0) return false
|
|
5701
|
+
|
|
5702
|
+
for (const entry of [...peernet.peerMap.entries()]) {
|
|
5703
|
+
for (const _id of entry[1]) {
|
|
5704
|
+
if (_id === id) return entry[0]
|
|
5705
|
+
}
|
|
5706
|
+
}
|
|
5707
|
+
}
|
|
5708
|
+
|
|
5709
|
+
async discover(peer) {
|
|
5710
|
+
let id = this._getPeerId(peer.id);
|
|
5711
|
+
if (id) return id
|
|
5712
|
+
const data = await new peernet.protos['peernet-peer']({id: this.id});
|
|
5713
|
+
const node = await peernet.prepareMessage(peer.id, data.encoded);
|
|
5714
|
+
|
|
5715
|
+
let response = await peer.request(node.encoded);
|
|
5716
|
+
response = await protoFor(response);
|
|
5717
|
+
response = await new peernet.protos['peernet-peer-response'](response.decoded.data);
|
|
5718
|
+
|
|
5719
|
+
id = response.decoded.id;
|
|
5720
|
+
if (id === this.id) return;
|
|
5721
|
+
|
|
5722
|
+
if (!peernet.peerMap.has(id)) peernet.peerMap.set(id, [peer.id]);
|
|
5723
|
+
else {
|
|
5724
|
+
const connections = peernet.peerMap.get(id);
|
|
5725
|
+
if (connections.indexOf(peer.id) === -1) {
|
|
5726
|
+
connections.push(peer.id);
|
|
5727
|
+
peernet.peerMap.set(peer.id, connections);
|
|
5728
|
+
}
|
|
5729
|
+
}
|
|
5730
|
+
return id
|
|
5731
|
+
}
|
|
5732
|
+
|
|
5733
|
+
async discoverHandler(message, peer) {
|
|
5734
|
+
const {id, proto} = message;
|
|
5735
|
+
// if (typeof message.data === 'string') message.data = Buffer.from(message.data)
|
|
5736
|
+
if (proto.name === 'peernet-peer') {
|
|
5737
|
+
const from = proto.decoded.id;
|
|
5738
|
+
if (from === this.id) return;
|
|
5739
|
+
|
|
5740
|
+
if (!peernet.peerMap.has(from)) peernet.peerMap.set(from, [peer.id]);
|
|
5741
|
+
else {
|
|
5742
|
+
const connections = peernet.peerMap.get(from);
|
|
5743
|
+
if (connections.indexOf(peer.id) === -1) {
|
|
5744
|
+
connections.push(peer.id);
|
|
5745
|
+
peernet.peerMap.set(from, connections);
|
|
5746
|
+
}
|
|
5747
|
+
}
|
|
5748
|
+
const data = await new peernet.protos['peernet-peer-response']({id: this.id});
|
|
5749
|
+
const node = await peernet.prepareMessage(from, data.encoded);
|
|
5750
|
+
|
|
5751
|
+
peer.write(Buffer.from(JSON.stringify({id, data: node.encoded})));
|
|
5752
|
+
} else if (proto.name === 'peernet-peer-response') {
|
|
5753
|
+
const from = proto.decoded.id;
|
|
5754
|
+
if (from === this.id) return;
|
|
5755
|
+
|
|
5756
|
+
if (!peernet.peerMap.has(from)) peernet.peerMap.set(from, [peer.id]);
|
|
5757
|
+
else {
|
|
5758
|
+
const connections = peernet.peerMap.get(from);
|
|
5759
|
+
if (connections.indexOf(peer.id) === -1) {
|
|
5760
|
+
connections.push(peer.id);
|
|
5761
|
+
peernet.peerMap.set(from, connections);
|
|
5762
|
+
}
|
|
5763
|
+
}
|
|
5764
|
+
}
|
|
5765
|
+
}
|
|
5502
5766
|
}
|
|
5503
5767
|
|
|
5504
|
-
new Mutex();
|
|
5505
|
-
|
|
5506
|
-
new Mutex();
|
|
5507
|
-
|
|
5508
|
-
new Mutex();
|
|
5509
|
-
|
|
5510
|
-
new Mutex();
|
|
5511
|
-
|
|
5512
|
-
var name$4 = "ripemd160";
|
|
5513
|
-
var data$4 = "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";
|
|
5514
|
-
var hash$4 = "c089a7ca";
|
|
5515
|
-
var wasmJson$4 = {
|
|
5516
|
-
name: name$4,
|
|
5517
|
-
data: data$4,
|
|
5518
|
-
hash: hash$4
|
|
5519
|
-
};
|
|
5520
|
-
|
|
5521
|
-
new Mutex();
|
|
5522
5768
|
/**
|
|
5523
|
-
*
|
|
5769
|
+
* Keep history of fetched address and ptr
|
|
5770
|
+
* @property {Object} address
|
|
5771
|
+
* @property {Object} ptr
|
|
5524
5772
|
*/
|
|
5525
|
-
|
|
5526
|
-
|
|
5527
|
-
|
|
5528
|
-
|
|
5529
|
-
|
|
5530
|
-
|
|
5531
|
-
|
|
5532
|
-
|
|
5533
|
-
|
|
5534
|
-
|
|
5535
|
-
|
|
5536
|
-
|
|
5537
|
-
|
|
5538
|
-
|
|
5539
|
-
|
|
5540
|
-
|
|
5541
|
-
|
|
5542
|
-
|
|
5543
|
-
const buf = getUInt8Buffer(key);
|
|
5544
|
-
if (buf.length > blockSize) {
|
|
5545
|
-
hasher.update(buf);
|
|
5546
|
-
const uintArr = hasher.digest('binary');
|
|
5547
|
-
hasher.init();
|
|
5548
|
-
return uintArr;
|
|
5773
|
+
const lastFetched = {
|
|
5774
|
+
address: {
|
|
5775
|
+
value: undefined,
|
|
5776
|
+
timestamp: 0,
|
|
5777
|
+
},
|
|
5778
|
+
ptr: {
|
|
5779
|
+
value: undefined,
|
|
5780
|
+
timestamp: 0,
|
|
5781
|
+
},
|
|
5782
|
+
};
|
|
5783
|
+
const fetchedCoordinates = {};
|
|
5784
|
+
const getAddress = async () => {
|
|
5785
|
+
const { address } = lastFetched;
|
|
5786
|
+
if (address) {
|
|
5787
|
+
address.value = await fetch('https://icanhazip.com/');
|
|
5788
|
+
address.value = await address.value.text();
|
|
5789
|
+
address.timestamp = Math.round(new Date().getTime() / 1000);
|
|
5790
|
+
lastFetched.address = address;
|
|
5549
5791
|
}
|
|
5550
|
-
return
|
|
5551
|
-
}
|
|
5552
|
-
|
|
5553
|
-
|
|
5554
|
-
|
|
5555
|
-
|
|
5556
|
-
const
|
|
5557
|
-
|
|
5558
|
-
const
|
|
5559
|
-
|
|
5560
|
-
|
|
5561
|
-
|
|
5562
|
-
|
|
5792
|
+
return address.value;
|
|
5793
|
+
};
|
|
5794
|
+
const degreesToRadians = (degrees) => {
|
|
5795
|
+
return degrees * Math.PI / 180;
|
|
5796
|
+
};
|
|
5797
|
+
const distanceInKmBetweenEarthCoordinates = (lat1, lon1, lat2, lon2) => {
|
|
5798
|
+
const earthRadiusKm = 6371;
|
|
5799
|
+
const dLat = degreesToRadians(lat2 - lat1);
|
|
5800
|
+
const dLon = degreesToRadians(lon2 - lon1);
|
|
5801
|
+
lat1 = degreesToRadians(lat1);
|
|
5802
|
+
lat2 = degreesToRadians(lat2);
|
|
5803
|
+
const a = Math.sin(dLat / 2) * Math.sin(dLat / 2) +
|
|
5804
|
+
Math.sin(dLon / 2) * Math.sin(dLon / 2) * Math.cos(lat1) * Math.cos(lat2);
|
|
5805
|
+
const c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a));
|
|
5806
|
+
return earthRadiusKm * c;
|
|
5807
|
+
};
|
|
5808
|
+
class DhtEarth {
|
|
5809
|
+
providerMap = new Map;
|
|
5810
|
+
/**
|
|
5811
|
+
*
|
|
5812
|
+
*/
|
|
5813
|
+
constructor() {
|
|
5814
|
+
this.providerMap = new Map();
|
|
5563
5815
|
}
|
|
5564
|
-
|
|
5565
|
-
|
|
5566
|
-
|
|
5567
|
-
|
|
5568
|
-
|
|
5569
|
-
|
|
5570
|
-
}
|
|
5571
|
-
|
|
5572
|
-
|
|
5573
|
-
|
|
5574
|
-
|
|
5575
|
-
|
|
5576
|
-
|
|
5577
|
-
|
|
5578
|
-
|
|
5579
|
-
|
|
5580
|
-
|
|
5581
|
-
|
|
5582
|
-
|
|
5583
|
-
|
|
5584
|
-
|
|
5585
|
-
|
|
5586
|
-
|
|
5587
|
-
|
|
5588
|
-
|
|
5589
|
-
|
|
5590
|
-
|
|
5591
|
-
|
|
5592
|
-
|
|
5593
|
-
|
|
5594
|
-
|
|
5595
|
-
|
|
5596
|
-
|
|
5597
|
-
|
|
5598
|
-
|
|
5599
|
-
|
|
5600
|
-
|
|
5816
|
+
async getCoordinates(address) {
|
|
5817
|
+
if (!fetchedCoordinates[address]) {
|
|
5818
|
+
const request = `https://whereis.leofcoin.org/?ip=${address}`;
|
|
5819
|
+
let response = await fetch(request);
|
|
5820
|
+
const { lat, lon } = await response.json();
|
|
5821
|
+
fetchedCoordinates[address] = { latitude: lat, longitude: lon };
|
|
5822
|
+
}
|
|
5823
|
+
return fetchedCoordinates[address];
|
|
5824
|
+
}
|
|
5825
|
+
/**
|
|
5826
|
+
* @param {Object} peer
|
|
5827
|
+
* @param {Object} provider
|
|
5828
|
+
* @return {Object} {provider, distance}
|
|
5829
|
+
*/
|
|
5830
|
+
async getDistance(peer, provider) {
|
|
5831
|
+
const { latitude, longitude } = await this.getCoordinates(provider.address);
|
|
5832
|
+
return { provider, distance: distanceInKmBetweenEarthCoordinates(peer.latitude, peer.longitude, latitude, longitude) };
|
|
5833
|
+
}
|
|
5834
|
+
async closestPeer(providers) {
|
|
5835
|
+
let all = [];
|
|
5836
|
+
const address = await getAddress();
|
|
5837
|
+
const peerLoc = await this.getCoordinates(address);
|
|
5838
|
+
for (const provider of providers) {
|
|
5839
|
+
if (provider.address === '127.0.0.1' || provider.address === '::1')
|
|
5840
|
+
all.push({ provider, distance: 0 });
|
|
5841
|
+
else
|
|
5842
|
+
all.push(this.getDistance(peerLoc, provider));
|
|
5843
|
+
}
|
|
5844
|
+
// todo queue
|
|
5845
|
+
all = await Promise.all(all);
|
|
5846
|
+
all = all.sort((previous, current) => previous.distance - current.distance);
|
|
5847
|
+
return all[0].provider;
|
|
5848
|
+
}
|
|
5849
|
+
hasProvider(hash) {
|
|
5850
|
+
return this.providerMap.has(hash);
|
|
5851
|
+
}
|
|
5852
|
+
providersFor(hash) {
|
|
5853
|
+
let providers;
|
|
5854
|
+
if (this.providerMap.has(hash))
|
|
5855
|
+
providers = this.providerMap.get(hash);
|
|
5856
|
+
return providers;
|
|
5857
|
+
}
|
|
5858
|
+
addProvider(provider, hash) {
|
|
5859
|
+
let providers = {};
|
|
5860
|
+
if (this.providerMap.has(hash)) {
|
|
5861
|
+
providers = this.providerMap.get(hash);
|
|
5862
|
+
}
|
|
5863
|
+
providers[provider.address] = provider;
|
|
5864
|
+
this.providerMap.set(hash, providers);
|
|
5865
|
+
}
|
|
5866
|
+
removeProvider(address, hash) {
|
|
5867
|
+
if (this.providerMap.has(hash)) {
|
|
5868
|
+
const providers = this.providerMap.get(hash);
|
|
5869
|
+
delete providers[address];
|
|
5870
|
+
this.providerMap.set(hash, providers);
|
|
5871
|
+
}
|
|
5601
5872
|
}
|
|
5602
|
-
return hash.then((hasher) => calculateHmac(hasher, key));
|
|
5603
5873
|
}
|
|
5604
5874
|
|
|
5605
|
-
|
|
5875
|
+
class MessageHandler {
|
|
5876
|
+
constructor(network) {
|
|
5877
|
+
this.network = network;
|
|
5878
|
+
}
|
|
5879
|
+
/**
|
|
5880
|
+
* hash and sign message
|
|
5881
|
+
*
|
|
5882
|
+
* @param {object} message
|
|
5883
|
+
* @param {Buffer} message.from peer id
|
|
5884
|
+
* @param {Buffer} message.to peer id
|
|
5885
|
+
* @param {string} message.data Peernet message
|
|
5886
|
+
* (PeernetMessage excluded) encoded as a string
|
|
5887
|
+
* @return message
|
|
5888
|
+
*/
|
|
5889
|
+
async hashAndSignMessage(message) {
|
|
5890
|
+
const hash = await message.peernetHash;
|
|
5891
|
+
message.decoded.signature = globalThis.identity.sign(hash.buffer);
|
|
5892
|
+
return message
|
|
5893
|
+
}
|
|
5894
|
+
|
|
5895
|
+
/**
|
|
5896
|
+
* @param {String} from - peer id
|
|
5897
|
+
* @param {String} to - peer id
|
|
5898
|
+
* @param {String|PeernetMessage} data - data encoded message string
|
|
5899
|
+
* or the messageNode itself
|
|
5900
|
+
*/
|
|
5901
|
+
async prepareMessage(message) {
|
|
5902
|
+
if (message.keys.includes('signature')) {
|
|
5903
|
+
message = await this.hashAndSignMessage(message);
|
|
5904
|
+
}
|
|
5905
|
+
|
|
5906
|
+
return message
|
|
5907
|
+
}
|
|
5908
|
+
}
|
|
5606
5909
|
|
|
5607
|
-
|
|
5910
|
+
const dataHandler = async message => {
|
|
5911
|
+
if (!message) return
|
|
5912
|
+
|
|
5913
|
+
const {data, id, from, peer} = message;
|
|
5914
|
+
const proto = await protoFor(data);
|
|
5915
|
+
peernet._protoHandler({id, proto}, peernet.connections[from] || peer, from);
|
|
5916
|
+
};
|
|
5608
5917
|
|
|
5609
|
-
const
|
|
5610
|
-
|
|
5611
|
-
|
|
5612
|
-
|
|
5613
|
-
|
|
5614
|
-
|
|
5615
|
-
|
|
5616
|
-
|
|
5617
|
-
codec: '0x6c74',
|
|
5618
|
-
hashAlg: 'dbl-keccak-512',
|
|
5619
|
-
},
|
|
5620
|
-
{
|
|
5621
|
-
name: 'leofcoin-itx',
|
|
5622
|
-
codec: '0x6c69',
|
|
5623
|
-
hashAlg: 'keccak-512',
|
|
5624
|
-
},
|
|
5625
|
-
{
|
|
5626
|
-
name: 'leofcoin-pr',
|
|
5627
|
-
codec: '0x6c70',
|
|
5628
|
-
hashAlg: 'keccak-256',
|
|
5629
|
-
},
|
|
5630
|
-
{
|
|
5631
|
-
name: 'contract-message',
|
|
5632
|
-
codec: '0x63636d',
|
|
5633
|
-
hashAlg: 'keccak-256'
|
|
5634
|
-
},
|
|
5635
|
-
{
|
|
5636
|
-
name: 'transaction-message',
|
|
5637
|
-
codec: '0x746d',
|
|
5638
|
-
hashAlg: 'keccak-256'
|
|
5639
|
-
},
|
|
5640
|
-
{
|
|
5641
|
-
name: 'raw-transaction-message',
|
|
5642
|
-
codec: '0x772746d',
|
|
5643
|
-
hashAlg: 'keccak-256'
|
|
5644
|
-
},
|
|
5645
|
-
{
|
|
5646
|
-
name: 'block-message',
|
|
5647
|
-
codec: '0x626d',
|
|
5648
|
-
hashAlg: 'keccak-256'
|
|
5649
|
-
},
|
|
5650
|
-
{
|
|
5651
|
-
name: 'bw-message',
|
|
5652
|
-
codec: '0x62776d',
|
|
5653
|
-
hashAlg: 'keccak-256'
|
|
5654
|
-
},
|
|
5655
|
-
{
|
|
5656
|
-
name: 'bw-request-message',
|
|
5657
|
-
codec: '0x6277726d',
|
|
5658
|
-
hashAlg: 'keccak-256'
|
|
5659
|
-
},
|
|
5660
|
-
{
|
|
5661
|
-
name: 'validator-message',
|
|
5662
|
-
codec: '0x766d',
|
|
5663
|
-
hashAlg: 'keccak-256'
|
|
5664
|
-
}
|
|
5665
|
-
];
|
|
5918
|
+
const dhtError = (proto) => {
|
|
5919
|
+
const text = `Received proto ${proto.name} expected peernet-dht-response`;
|
|
5920
|
+
return new Error(`Routing error: ${text}`)
|
|
5921
|
+
};
|
|
5922
|
+
|
|
5923
|
+
const nothingFoundError = (hash) => {
|
|
5924
|
+
return new Error(`nothing found for ${hash}`)
|
|
5925
|
+
};
|
|
5666
5926
|
|
|
5667
|
-
const
|
|
5668
|
-
|
|
5669
|
-
|
|
5670
|
-
|
|
5671
|
-
|
|
5672
|
-
|
|
5673
|
-
|
|
5674
|
-
|
|
5675
|
-
codec: '0x707072',
|
|
5676
|
-
hashAlg: 'keccak-256',
|
|
5677
|
-
},
|
|
5678
|
-
{
|
|
5679
|
-
name: 'peernet-peer',
|
|
5680
|
-
codec: '0x7070',
|
|
5681
|
-
hashAlg: 'keccak-256',
|
|
5682
|
-
},
|
|
5683
|
-
{
|
|
5684
|
-
name: 'peernet-dht',
|
|
5685
|
-
codec: '0x706468',
|
|
5686
|
-
hashAlg: 'keccak-256',
|
|
5687
|
-
},
|
|
5688
|
-
{
|
|
5689
|
-
name: 'peernet-dht-response',
|
|
5690
|
-
codec: '0x706472',
|
|
5691
|
-
hashAlg: 'keccak-256',
|
|
5692
|
-
},
|
|
5693
|
-
{
|
|
5694
|
-
name: 'peernet-data',
|
|
5695
|
-
codec: '0x706461',
|
|
5696
|
-
hashAlg: 'keccak-256',
|
|
5697
|
-
},
|
|
5698
|
-
{
|
|
5699
|
-
name: 'peernet-data-response',
|
|
5700
|
-
codec: '0x70646172',
|
|
5701
|
-
hashAlg: 'keccak-256',
|
|
5702
|
-
},
|
|
5703
|
-
{
|
|
5704
|
-
name: 'peernet-message',
|
|
5705
|
-
codec: '0x706d65',
|
|
5706
|
-
hashAlg: 'keccak-256',
|
|
5707
|
-
},
|
|
5708
|
-
{
|
|
5709
|
-
name: 'peernet-ps',
|
|
5710
|
-
codec: '707073',
|
|
5711
|
-
hashAlg: 'keccak-256',
|
|
5712
|
-
},
|
|
5713
|
-
{
|
|
5714
|
-
name: 'peernet-response',
|
|
5715
|
-
codec: '0x7072',
|
|
5716
|
-
hashAlg: 'keccak-256',
|
|
5717
|
-
},
|
|
5718
|
-
{
|
|
5719
|
-
name: 'peernet-request',
|
|
5720
|
-
codec: '0x707271',
|
|
5721
|
-
hashAlg: 'keccak-256',
|
|
5722
|
-
},
|
|
5723
|
-
{
|
|
5724
|
-
name: 'peernet-file',
|
|
5725
|
-
codec: '0x7066',
|
|
5726
|
-
hashAlg: 'keccak-256',
|
|
5727
|
-
},
|
|
5728
|
-
{
|
|
5729
|
-
name: 'peernet-file-response',
|
|
5730
|
-
codec: '0x706672',
|
|
5731
|
-
hashAlg: 'keccak-256',
|
|
5927
|
+
const isBrowser = globalThis.navigator ? true : false;
|
|
5928
|
+
let LeofcoinStorage$1 = class LeofcoinStorage {
|
|
5929
|
+
name;
|
|
5930
|
+
root;
|
|
5931
|
+
db;
|
|
5932
|
+
constructor(name = 'storage', root = '.leofcoin') {
|
|
5933
|
+
this.name = name;
|
|
5934
|
+
this.root = root;
|
|
5732
5935
|
}
|
|
5733
|
-
|
|
5734
|
-
|
|
5735
|
-
|
|
5736
|
-
|
|
5737
|
-
|
|
5738
|
-
|
|
5739
|
-
}];
|
|
5740
|
-
|
|
5741
|
-
const codecs = [
|
|
5742
|
-
...internalCodecs,
|
|
5743
|
-
...blockchainCodecs,
|
|
5744
|
-
...social
|
|
5745
|
-
];
|
|
5746
|
-
|
|
5747
|
-
globalThis.peernetCodecs = globalThis.peernetCodecs || {};
|
|
5748
|
-
const addCodec = (codecInput) => {
|
|
5749
|
-
let { hashAlg, codec, name } = codecInput;
|
|
5750
|
-
if (!globalThis.peernetCodecs[name])
|
|
5751
|
-
globalThis.peernetCodecs[name] = {
|
|
5752
|
-
hashAlg,
|
|
5753
|
-
codec: typeof codec === 'string' ? parseInt(codec, 16) : codec
|
|
5754
|
-
};
|
|
5755
|
-
};
|
|
5756
|
-
const getCodec = (name) => {
|
|
5757
|
-
if (typeof name === 'number')
|
|
5758
|
-
return name;
|
|
5759
|
-
return getCodecByName(name).codec;
|
|
5760
|
-
};
|
|
5761
|
-
const getCodecName = (codec) => {
|
|
5762
|
-
return Object.keys(globalThis.peernetCodecs).reduce((p, c) => {
|
|
5763
|
-
const item = globalThis.peernetCodecs[c];
|
|
5764
|
-
if (item.codec === codec)
|
|
5765
|
-
return c;
|
|
5766
|
-
else
|
|
5767
|
-
return p;
|
|
5768
|
-
}, undefined);
|
|
5769
|
-
};
|
|
5770
|
-
const getCodecByName = (name) => globalThis.peernetCodecs[name];
|
|
5771
|
-
const getHashAlg = (name) => {
|
|
5772
|
-
if (typeof name === 'number')
|
|
5773
|
-
return getCodecByName(getCodecName(name)).hashAlg;
|
|
5774
|
-
return getCodecByName(name).hashAlg;
|
|
5775
|
-
};
|
|
5776
|
-
const isCodec = (codec) => {
|
|
5777
|
-
if (codec.codec !== undefined && codec.hashAlg)
|
|
5778
|
-
return true;
|
|
5779
|
-
return false;
|
|
5780
|
-
};
|
|
5781
|
-
const validateCodec = (codec) => {
|
|
5782
|
-
if (codec.codec === undefined ||
|
|
5783
|
-
codec.hashAlg === undefined ||
|
|
5784
|
-
codec.name === undefined)
|
|
5785
|
-
throw new Error(`invalid codecInput: ${codec}`);
|
|
5786
|
-
};
|
|
5787
|
-
for (const codec of codecs) {
|
|
5788
|
-
addCodec(codec);
|
|
5789
|
-
}
|
|
5790
|
-
var utils$p = {
|
|
5791
|
-
isCodec,
|
|
5792
|
-
addCodec,
|
|
5793
|
-
getCodec,
|
|
5794
|
-
getHashAlg,
|
|
5795
|
-
getCodecName,
|
|
5796
|
-
validateCodec,
|
|
5797
|
-
codecs: globalThis.peernetCodecs
|
|
5798
|
-
};
|
|
5799
|
-
|
|
5800
|
-
let Codec$1 = class Codec extends BasicInterface {
|
|
5801
|
-
codecBuffer;
|
|
5802
|
-
codec;
|
|
5803
|
-
hashAlg;
|
|
5804
|
-
constructor(buffer) {
|
|
5805
|
-
super();
|
|
5806
|
-
if (buffer) {
|
|
5807
|
-
if (buffer instanceof Uint8Array) {
|
|
5808
|
-
const codec = index$8.decode(buffer);
|
|
5809
|
-
const name = this.getCodecName(codec);
|
|
5810
|
-
if (name) {
|
|
5811
|
-
this.name = name;
|
|
5812
|
-
this.encoded = buffer;
|
|
5813
|
-
this.decode(buffer);
|
|
5814
|
-
}
|
|
5815
|
-
else {
|
|
5816
|
-
this.encode(Number(new TextDecoder().decode(buffer)));
|
|
5817
|
-
}
|
|
5818
|
-
}
|
|
5819
|
-
else if (buffer instanceof ArrayBuffer) {
|
|
5820
|
-
const codec = index$8.decode(new Uint8Array(buffer));
|
|
5821
|
-
const name = this.getCodecName(codec);
|
|
5822
|
-
if (name) {
|
|
5823
|
-
this.name = name;
|
|
5824
|
-
this.decode(buffer);
|
|
5825
|
-
}
|
|
5826
|
-
else {
|
|
5827
|
-
this.encode(Number(new TextDecoder().decode(new Uint8Array(buffer))));
|
|
5828
|
-
}
|
|
5829
|
-
}
|
|
5830
|
-
else if (typeof buffer === 'string') {
|
|
5831
|
-
if (utils$p.getCodec(buffer))
|
|
5832
|
-
this.fromName(buffer);
|
|
5833
|
-
else if (this.isHex(buffer))
|
|
5834
|
-
this.fromHex(buffer);
|
|
5835
|
-
else if (this.isBase32(buffer))
|
|
5836
|
-
this.fromBs32(buffer);
|
|
5837
|
-
else if (this.isBase58(buffer))
|
|
5838
|
-
this.fromBs58(buffer);
|
|
5839
|
-
else
|
|
5840
|
-
this.fromString(buffer);
|
|
5841
|
-
}
|
|
5842
|
-
if (!isNaN(buffer))
|
|
5843
|
-
if (utils$p.getCodec(buffer))
|
|
5844
|
-
this.fromCodec(buffer);
|
|
5936
|
+
async init() {
|
|
5937
|
+
const importee = await import(isBrowser ? './browser-store.js' : './store.js');
|
|
5938
|
+
this.db = new importee.default();
|
|
5939
|
+
if (!isBrowser) {
|
|
5940
|
+
// @ts-ignore
|
|
5941
|
+
await this.db.init(this.name, this.root);
|
|
5845
5942
|
}
|
|
5846
5943
|
}
|
|
5847
|
-
|
|
5848
|
-
|
|
5849
|
-
|
|
5850
|
-
this.
|
|
5851
|
-
this.encoded = encoded;
|
|
5852
|
-
return this.decode(encoded);
|
|
5853
|
-
}
|
|
5854
|
-
getCodec(name) {
|
|
5855
|
-
return utils$p.getCodec(name);
|
|
5944
|
+
async get(key) {
|
|
5945
|
+
if (typeof key === 'object')
|
|
5946
|
+
return this.many('get', key);
|
|
5947
|
+
return this.db.get(new KeyPath(key));
|
|
5856
5948
|
}
|
|
5857
|
-
|
|
5858
|
-
|
|
5949
|
+
/**
|
|
5950
|
+
*
|
|
5951
|
+
* @param {*} key
|
|
5952
|
+
* @param {*} value
|
|
5953
|
+
* @returns Promise
|
|
5954
|
+
*/
|
|
5955
|
+
put(key, value) {
|
|
5956
|
+
if (typeof key === 'object')
|
|
5957
|
+
return this.many('put', key);
|
|
5958
|
+
return this.db.put(new KeyPath(key), new KeyValue(value));
|
|
5859
5959
|
}
|
|
5860
|
-
|
|
5861
|
-
|
|
5960
|
+
async has(key) {
|
|
5961
|
+
if (typeof key === 'object')
|
|
5962
|
+
return this.many('has', key);
|
|
5963
|
+
try {
|
|
5964
|
+
const has = await this.db.get(new KeyPath(key));
|
|
5965
|
+
return Boolean(has);
|
|
5966
|
+
}
|
|
5967
|
+
catch (e) {
|
|
5968
|
+
return false;
|
|
5969
|
+
}
|
|
5862
5970
|
}
|
|
5863
|
-
|
|
5864
|
-
|
|
5865
|
-
this.hashAlg = this.getHashAlg(this.name);
|
|
5866
|
-
this.codec = this.getCodec(this.name);
|
|
5867
|
-
this.codecBuffer = index$8.encode(this.codec);
|
|
5971
|
+
async delete(key) {
|
|
5972
|
+
return this.db.delete(new KeyPath(key));
|
|
5868
5973
|
}
|
|
5869
|
-
|
|
5870
|
-
|
|
5871
|
-
this.name = name;
|
|
5872
|
-
this.codec = codec;
|
|
5873
|
-
this.hashAlg = this.getHashAlg(name);
|
|
5874
|
-
this.codecBuffer = index$8.encode(this.codec);
|
|
5974
|
+
keys(limit = -1) {
|
|
5975
|
+
return this.db.keys(limit);
|
|
5875
5976
|
}
|
|
5876
|
-
|
|
5877
|
-
|
|
5878
|
-
const codec = index$8.decode(encoded);
|
|
5879
|
-
this.fromCodec(codec);
|
|
5880
|
-
return this.decoded;
|
|
5977
|
+
async values(limit = -1) {
|
|
5978
|
+
return this.db.values(limit);
|
|
5881
5979
|
}
|
|
5882
|
-
|
|
5883
|
-
|
|
5884
|
-
|
|
5885
|
-
|
|
5980
|
+
async many(type, _value) {
|
|
5981
|
+
const jobs = [];
|
|
5982
|
+
for (const key of Object.keys(_value)) {
|
|
5983
|
+
jobs.push(this[type](key, _value[key]));
|
|
5984
|
+
}
|
|
5985
|
+
return Promise.all(jobs);
|
|
5886
5986
|
}
|
|
5887
|
-
|
|
5888
|
-
|
|
5889
|
-
|
|
5890
|
-
codec;
|
|
5891
|
-
codecs;
|
|
5892
|
-
digest;
|
|
5893
|
-
size;
|
|
5894
|
-
constructor(buffer, options) {
|
|
5895
|
-
super();
|
|
5896
|
-
if (options.name)
|
|
5897
|
-
this.name = options.name;
|
|
5898
|
-
else
|
|
5899
|
-
this.name = 'disco-hash';
|
|
5900
|
-
if (options.codecs)
|
|
5901
|
-
this.codecs = options.codecs;
|
|
5902
|
-
// @ts-ignore
|
|
5903
|
-
return this.init(buffer);
|
|
5987
|
+
async length() {
|
|
5988
|
+
const keys = await this.keys();
|
|
5989
|
+
return keys.length;
|
|
5904
5990
|
}
|
|
5905
|
-
async
|
|
5906
|
-
|
|
5907
|
-
|
|
5908
|
-
|
|
5909
|
-
|
|
5910
|
-
|
|
5911
|
-
this.name = name;
|
|
5912
|
-
this.decode(uint8Array);
|
|
5913
|
-
}
|
|
5914
|
-
else {
|
|
5915
|
-
await this.encode(uint8Array);
|
|
5916
|
-
}
|
|
5917
|
-
}
|
|
5918
|
-
if (typeof uint8Array === 'string') {
|
|
5919
|
-
if (this.isHex(uint8Array))
|
|
5920
|
-
await this.fromHex(uint8Array);
|
|
5921
|
-
if (this.isBase32(uint8Array))
|
|
5922
|
-
await this.fromBs32(uint8Array);
|
|
5923
|
-
else if (this.isBase58(uint8Array))
|
|
5924
|
-
await this.fromBs58(uint8Array);
|
|
5925
|
-
else
|
|
5926
|
-
throw new Error(`unsupported string ${uint8Array}`);
|
|
5927
|
-
}
|
|
5928
|
-
else if (typeof uint8Array === 'object')
|
|
5929
|
-
await this.fromJSON(uint8Array);
|
|
5991
|
+
async size() {
|
|
5992
|
+
let size = 0;
|
|
5993
|
+
const query = await this.db.iterate();
|
|
5994
|
+
for await (const item of query) {
|
|
5995
|
+
// @ts-ignore
|
|
5996
|
+
size += item.value ? item.value.length : item[1].length;
|
|
5930
5997
|
}
|
|
5931
|
-
return
|
|
5932
|
-
}
|
|
5933
|
-
get prefix() {
|
|
5934
|
-
const length = this.length;
|
|
5935
|
-
const uint8Array = new Uint8Array(length.length + this.codec.codecBuffer.length);
|
|
5936
|
-
uint8Array.set(length);
|
|
5937
|
-
uint8Array.set(this.codec.codecBuffer, length.length);
|
|
5938
|
-
return uint8Array;
|
|
5998
|
+
return size;
|
|
5939
5999
|
}
|
|
5940
|
-
|
|
5941
|
-
return
|
|
6000
|
+
async clear() {
|
|
6001
|
+
return this.db.clear();
|
|
5942
6002
|
}
|
|
5943
|
-
|
|
5944
|
-
return this.
|
|
6003
|
+
async iterate() {
|
|
6004
|
+
return this.db.iterate();
|
|
5945
6005
|
}
|
|
5946
|
-
get hash() {
|
|
5947
|
-
return this.encoded;
|
|
5948
|
-
}
|
|
5949
|
-
fromJSON(json) {
|
|
5950
|
-
return this.encode(new TextEncoder().encode(JSON.stringify(json)));
|
|
5951
|
-
}
|
|
5952
|
-
async encode(buffer, name) {
|
|
5953
|
-
if (!this.name && name)
|
|
5954
|
-
this.name = name;
|
|
5955
|
-
if (!buffer)
|
|
5956
|
-
buffer = this.buffer;
|
|
5957
|
-
this.codec = new Codec$1(this.name);
|
|
5958
|
-
this.codec.fromName(this.name);
|
|
5959
|
-
let hashAlg = this.codec.hashAlg;
|
|
5960
|
-
const hashVariant = Number(hashAlg.split('-')[hashAlg.split('-').length - 1]);
|
|
5961
|
-
if (hashAlg.includes('dbl')) {
|
|
5962
|
-
hashAlg = hashAlg.replace('dbl-', '');
|
|
5963
|
-
const hasher = await createKeccak(hashVariant);
|
|
5964
|
-
await hasher.init();
|
|
5965
|
-
hasher.update(buffer);
|
|
5966
|
-
buffer = hasher.digest('binary');
|
|
5967
|
-
}
|
|
5968
|
-
const hasher = await createKeccak(hashVariant);
|
|
5969
|
-
await hasher.init();
|
|
5970
|
-
hasher.update(buffer);
|
|
5971
|
-
this.digest = hasher.digest('binary');
|
|
5972
|
-
this.size = this.digest.length;
|
|
5973
|
-
const uint8Array = new Uint8Array(this.digest.length + this.prefix.length);
|
|
5974
|
-
uint8Array.set(this.prefix);
|
|
5975
|
-
uint8Array.set(this.digest, this.prefix.length);
|
|
5976
|
-
this.encoded = uint8Array;
|
|
5977
|
-
return this.encoded;
|
|
5978
|
-
}
|
|
5979
|
-
async validate(buffer) {
|
|
5980
|
-
if (Buffer.isBuffer(buffer)) {
|
|
5981
|
-
const codec = index$8.decode(buffer);
|
|
5982
|
-
if (this.codecs[codec]) {
|
|
5983
|
-
this.decode(buffer);
|
|
5984
|
-
}
|
|
5985
|
-
else {
|
|
5986
|
-
await this.encode(buffer);
|
|
5987
|
-
}
|
|
5988
|
-
}
|
|
5989
|
-
if (typeof buffer === 'string') {
|
|
5990
|
-
if (this.isHex(buffer))
|
|
5991
|
-
this.fromHex(buffer);
|
|
5992
|
-
if (this.isBase32(buffer))
|
|
5993
|
-
this.fromBs32(buffer);
|
|
5994
|
-
}
|
|
5995
|
-
if (typeof buffer === 'object')
|
|
5996
|
-
this.fromJSON(buffer);
|
|
5997
|
-
}
|
|
5998
|
-
decode(encoded) {
|
|
5999
|
-
this.encoded = encoded;
|
|
6000
|
-
const codec = index$8.decode(encoded);
|
|
6001
|
-
this.codec = new Codec$1(codec);
|
|
6002
|
-
// TODO: validate codec
|
|
6003
|
-
encoded = encoded.slice(index$8.decode.bytes);
|
|
6004
|
-
this.size = index$8.decode(encoded);
|
|
6005
|
-
this.digest = encoded.slice(index$8.decode.bytes);
|
|
6006
|
-
if (this.digest.length !== this.size) {
|
|
6007
|
-
throw new Error(`hash length inconsistent: ${this.encoded.toString()}`);
|
|
6008
|
-
}
|
|
6009
|
-
// const codec = new Codec(codec, this.codecs)
|
|
6010
|
-
this.name = this.codec.name;
|
|
6011
|
-
this.size = this.digest.length;
|
|
6012
|
-
return {
|
|
6013
|
-
codec: this.codec,
|
|
6014
|
-
name: this.name,
|
|
6015
|
-
size: this.size,
|
|
6016
|
-
length: this.length,
|
|
6017
|
-
digest: this.digest,
|
|
6018
|
-
};
|
|
6019
|
-
}
|
|
6020
|
-
}
|
|
6021
|
-
|
|
6022
|
-
let FormatInterface$1 = class FormatInterface extends BasicInterface {
|
|
6023
|
-
hashFormat;
|
|
6024
|
-
init(buffer) {
|
|
6025
|
-
if (buffer instanceof Uint8Array)
|
|
6026
|
-
this.fromUint8Array(buffer);
|
|
6027
|
-
else if (buffer instanceof ArrayBuffer)
|
|
6028
|
-
this.fromArrayBuffer(buffer);
|
|
6029
|
-
else if (buffer instanceof FormatInterface && buffer?.name === this.name)
|
|
6030
|
-
return buffer;
|
|
6031
|
-
else if (typeof buffer === 'string') {
|
|
6032
|
-
if (this.isHex(buffer))
|
|
6033
|
-
this.fromHex(buffer);
|
|
6034
|
-
else if (this.isBase58(buffer))
|
|
6035
|
-
this.fromBs58(buffer);
|
|
6036
|
-
else if (this.isBase32(buffer))
|
|
6037
|
-
this.fromBs32(buffer);
|
|
6038
|
-
else
|
|
6039
|
-
this.fromString(buffer);
|
|
6040
|
-
}
|
|
6041
|
-
else {
|
|
6042
|
-
this.create(buffer);
|
|
6043
|
-
}
|
|
6044
|
-
return this;
|
|
6045
|
-
}
|
|
6046
|
-
hasCodec() {
|
|
6047
|
-
if (!this.encoded)
|
|
6048
|
-
return false;
|
|
6049
|
-
const codec = new Codec$1(this.encoded);
|
|
6050
|
-
if (codec.name)
|
|
6051
|
-
return true;
|
|
6052
|
-
}
|
|
6053
|
-
decode(encoded) {
|
|
6054
|
-
encoded = encoded || this.encoded;
|
|
6055
|
-
const codec = new Codec$1(this.encoded);
|
|
6056
|
-
if (codec.codecBuffer) {
|
|
6057
|
-
encoded = encoded.slice(codec.codecBuffer.length);
|
|
6058
|
-
this.name = codec.name;
|
|
6059
|
-
this.decoded = this.protoDecode(encoded);
|
|
6060
|
-
// try {
|
|
6061
|
-
// this.decoded = JSON.parse(this.decoded)
|
|
6062
|
-
// } catch {
|
|
6063
|
-
// }
|
|
6064
|
-
}
|
|
6065
|
-
else {
|
|
6066
|
-
throw new Error(`no codec found`);
|
|
6067
|
-
}
|
|
6068
|
-
return this.decoded;
|
|
6069
|
-
}
|
|
6070
|
-
encode(decoded) {
|
|
6071
|
-
let encoded;
|
|
6072
|
-
if (!decoded)
|
|
6073
|
-
decoded = this.decoded;
|
|
6074
|
-
const codec = new Codec$1(this.name);
|
|
6075
|
-
if (decoded instanceof Uint8Array)
|
|
6076
|
-
encoded = decoded;
|
|
6077
|
-
else
|
|
6078
|
-
encoded = this.protoEncode(decoded);
|
|
6079
|
-
if (codec.codecBuffer) {
|
|
6080
|
-
const uint8Array = new Uint8Array(encoded.length + codec.codecBuffer.length);
|
|
6081
|
-
uint8Array.set(codec.codecBuffer);
|
|
6082
|
-
uint8Array.set(encoded, codec.codecBuffer.length);
|
|
6083
|
-
this.encoded = uint8Array;
|
|
6084
|
-
}
|
|
6085
|
-
else {
|
|
6086
|
-
throw new Error(`invalid codec`);
|
|
6087
|
-
}
|
|
6088
|
-
return this.encoded;
|
|
6089
|
-
}
|
|
6090
|
-
/**
|
|
6091
|
-
* @param {Buffer|String|Object} buffer - data - The data needed to create the desired message
|
|
6092
|
-
* @param {Object} proto - {protoObject}
|
|
6093
|
-
* @param {Object} options - {hashFormat, name}
|
|
6094
|
-
*/
|
|
6095
|
-
constructor(buffer, proto, options) {
|
|
6096
|
-
super();
|
|
6097
|
-
this.proto = proto;
|
|
6098
|
-
this.hashFormat = options?.hashFormat ? options.hashFormat : 'bs32';
|
|
6099
|
-
if (options?.name)
|
|
6100
|
-
this.name = options.name;
|
|
6101
|
-
this.init(buffer);
|
|
6102
|
-
}
|
|
6103
|
-
/**
|
|
6104
|
-
* @return {PeernetHash}
|
|
6105
|
-
*/
|
|
6106
|
-
get peernetHash() {
|
|
6107
|
-
return new CodecHash(this.decoded, { name: this.name });
|
|
6108
|
-
}
|
|
6109
|
-
/**
|
|
6110
|
-
* @return {peernetHash}
|
|
6111
|
-
*/
|
|
6112
|
-
async hash() {
|
|
6113
|
-
const upper = this.hashFormat.charAt(0).toUpperCase();
|
|
6114
|
-
const format = `${upper}${this.hashFormat.substring(1, this.hashFormat.length)}`;
|
|
6115
|
-
return (await this.peernetHash)[`to${format}`]();
|
|
6116
|
-
}
|
|
6117
|
-
fromUint8Array(buffer) {
|
|
6118
|
-
this.encoded = buffer;
|
|
6119
|
-
return this.hasCodec() ? this.decode() : this.create(JSON.parse(new TextDecoder().decode(this.encoded)));
|
|
6120
|
-
}
|
|
6121
|
-
fromArrayBuffer(buffer) {
|
|
6122
|
-
this.encoded = new Uint8Array(buffer, buffer.byteOffset, buffer.byteLength);
|
|
6123
|
-
return this.hasCodec() ? this.decode() : this.create(JSON.parse(new TextDecoder().decode(this.encoded)));
|
|
6124
|
-
}
|
|
6125
|
-
/**
|
|
6126
|
-
* @param {Object} data
|
|
6127
|
-
*/
|
|
6128
|
-
create(data) {
|
|
6129
|
-
const decoded = {};
|
|
6130
|
-
if (this.keys?.length > 0) {
|
|
6131
|
-
for (const key of this.keys) {
|
|
6132
|
-
decoded[key] = data[key];
|
|
6133
|
-
}
|
|
6134
|
-
this.decoded = decoded;
|
|
6135
|
-
return this.encode(decoded);
|
|
6136
|
-
}
|
|
6137
|
-
}
|
|
6138
|
-
};
|
|
6139
|
-
|
|
6140
|
-
const FormatInterface = FormatInterface$1;
|
|
6141
|
-
const Codec = Codec$1;
|
|
6142
|
-
|
|
6143
|
-
const BufferToUint8Array = data => {
|
|
6144
|
-
if (data.type === 'Buffer') {
|
|
6145
|
-
data = new Uint8Array(data.data);
|
|
6146
|
-
}
|
|
6147
|
-
return data
|
|
6148
|
-
};
|
|
6149
|
-
|
|
6150
|
-
const protoFor = (message) => {
|
|
6151
|
-
const codec = new Codec(message);
|
|
6152
|
-
if (!codec.name) throw new Error('proto not found')
|
|
6153
|
-
const Proto = globalThis.peernet.protos[codec.name];
|
|
6154
|
-
if (!Proto) throw (new Error(`No proto defined for ${codec.name}`))
|
|
6155
|
-
return new Proto(message)
|
|
6156
6006
|
};
|
|
6157
6007
|
|
|
6158
|
-
|
|
6159
|
-
* wether or not a peernet daemon is active
|
|
6160
|
-
* @return {Boolean}
|
|
6161
|
-
*/
|
|
6162
|
-
const hasDaemon = async () => {
|
|
6163
|
-
try {
|
|
6164
|
-
let response = await fetch('http://127.0.0.1:1000/api/version');
|
|
6165
|
-
response = await response.json();
|
|
6166
|
-
return Boolean(response.client === '@peernet/api/http')
|
|
6167
|
-
} catch (e) {
|
|
6168
|
-
return false
|
|
6169
|
-
}
|
|
6170
|
-
};
|
|
6008
|
+
const randombytes = strength => crypto.getRandomValues(new Uint8Array(strength));
|
|
6171
6009
|
|
|
6172
|
-
const
|
|
6173
|
-
if (!globalThis.location) return false;
|
|
6174
|
-
return Boolean(globalThis.location.protocol === 'https:')
|
|
6175
|
-
};
|
|
6010
|
+
const {subtle} = crypto;
|
|
6176
6011
|
|
|
6177
6012
|
/**
|
|
6178
|
-
*
|
|
6179
|
-
*
|
|
6013
|
+
* ```js
|
|
6014
|
+
* const {createHash} = await import('@leofcoin/crypto')
|
|
6015
|
+
* createHash(data, algorithm)
|
|
6016
|
+
* ```
|
|
6017
|
+
* @param {Uint8Array} data
|
|
6018
|
+
* @param {string} algorithm
|
|
6019
|
+
* @returns Uint8Array
|
|
6180
6020
|
*/
|
|
6181
|
-
const
|
|
6182
|
-
const _navigator = globalThis.navigator;
|
|
6183
|
-
if (!_navigator) {
|
|
6184
|
-
return 'node'
|
|
6185
|
-
} else if (_navigator && /electron/i.test(_navigator.userAgent)) {
|
|
6186
|
-
return 'electron'
|
|
6187
|
-
} else {
|
|
6188
|
-
return 'browser'
|
|
6189
|
-
}
|
|
6190
|
-
};
|
|
6021
|
+
const createHash = (data, algorithm = 'SHA-512') => subtle.digest(algorithm, data);
|
|
6191
6022
|
|
|
6192
6023
|
/**
|
|
6193
|
-
*
|
|
6194
|
-
*
|
|
6195
|
-
*
|
|
6196
|
-
*
|
|
6024
|
+
* Hashes the created hash again
|
|
6025
|
+
* ```js
|
|
6026
|
+
* const {createDoubleHash} = await import('@leofcoin/crypto')
|
|
6027
|
+
* createDoubleHash(data, algorithm)
|
|
6028
|
+
* ```
|
|
6029
|
+
* @param {Uint8Array} data
|
|
6030
|
+
* @param {string} algorithm
|
|
6031
|
+
* @returns Uint8Array
|
|
6197
6032
|
*/
|
|
6198
|
-
const
|
|
6199
|
-
|
|
6200
|
-
if (!https()) daemon = await hasDaemon();
|
|
6033
|
+
const createDoubleHash = async (data, algorithm = 'SHA-512') =>
|
|
6034
|
+
subtle.digest(algorithm, await subtle.digest(algorithm, data));
|
|
6201
6035
|
|
|
6202
|
-
|
|
6036
|
+
const generatePbkdf2 = async (password) => {
|
|
6037
|
+
return subtle.importKey(
|
|
6038
|
+
'raw',
|
|
6039
|
+
password,
|
|
6040
|
+
'PBKDF2',
|
|
6041
|
+
false,
|
|
6042
|
+
['deriveBits']
|
|
6043
|
+
)
|
|
6203
6044
|
};
|
|
6204
6045
|
|
|
6205
|
-
|
|
6206
|
-
|
|
6207
|
-
|
|
6208
|
-
|
|
6046
|
+
const pbkdf2 = async (password, salt, iterations = 4096, length = 64, hash = 'SHA-512') => {
|
|
6047
|
+
const key = await generatePbkdf2(password);
|
|
6048
|
+
return subtle.deriveBits({
|
|
6049
|
+
name: 'PBKDF2',
|
|
6050
|
+
hash,
|
|
6051
|
+
salt,
|
|
6052
|
+
iterations,
|
|
6053
|
+
}, key, length)
|
|
6054
|
+
};
|
|
6209
6055
|
|
|
6210
|
-
|
|
6211
|
-
|
|
6056
|
+
var typedArrayConcat = (input, options = {length: undefined, seperator: undefined}) => {
|
|
6057
|
+
if (!options) options = {};
|
|
6058
|
+
|
|
6059
|
+
if (typeof options.seperator === 'string')
|
|
6060
|
+
options.seperator = new TextEncoder().encode(options.seperator);
|
|
6061
|
+
|
|
6062
|
+
const length = options.length || input.reduce((total, current, i) => {
|
|
6063
|
+
total += current.length;
|
|
6064
|
+
if (options.seperator && input.length - 1 > i) total+= options.seperator.length;
|
|
6065
|
+
return total
|
|
6066
|
+
}, 0);
|
|
6067
|
+
|
|
6068
|
+
const typedArray = new Uint8Array(length);
|
|
6069
|
+
|
|
6070
|
+
let currentIndex = 0;
|
|
6071
|
+
let index = 0;
|
|
6072
|
+
for (const source of input) {
|
|
6073
|
+
typedArray.set(source, currentIndex);
|
|
6074
|
+
if (options.seperator && input.length - 1 > index) {
|
|
6075
|
+
typedArray.set(options.seperator, currentIndex + source.length);
|
|
6076
|
+
currentIndex+= options.seperator.length;
|
|
6077
|
+
}
|
|
6078
|
+
currentIndex += source.length;
|
|
6079
|
+
index += 1;
|
|
6080
|
+
}
|
|
6081
|
+
|
|
6082
|
+
return typedArray
|
|
6083
|
+
};
|
|
6212
6084
|
|
|
6213
|
-
|
|
6214
|
-
|
|
6215
|
-
|
|
6216
|
-
|
|
6217
|
-
|
|
6218
|
-
|
|
6219
|
-
|
|
6220
|
-
|
|
6221
|
-
|
|
6222
|
-
|
|
6223
|
-
|
|
6224
|
-
|
|
6225
|
-
|
|
6226
|
-
|
|
6227
|
-
|
|
6228
|
-
|
|
6229
|
-
|
|
6230
|
-
|
|
6231
|
-
|
|
6232
|
-
|
|
6233
|
-
|
|
6234
|
-
|
|
6235
|
-
|
|
6236
|
-
|
|
6237
|
-
|
|
6238
|
-
|
|
6239
|
-
|
|
6240
|
-
|
|
6241
|
-
|
|
6242
|
-
|
|
6243
|
-
|
|
6244
|
-
|
|
6245
|
-
|
|
6246
|
-
|
|
6247
|
-
|
|
6248
|
-
|
|
6249
|
-
|
|
6250
|
-
|
|
6251
|
-
|
|
6252
|
-
|
|
6253
|
-
|
|
6254
|
-
|
|
6255
|
-
|
|
6256
|
-
|
|
6257
|
-
|
|
6258
|
-
|
|
6259
|
-
|
|
6260
|
-
|
|
6261
|
-
|
|
6262
|
-
|
|
6263
|
-
|
|
6264
|
-
|
|
6265
|
-
if (from === this.id) return;
|
|
6266
|
-
|
|
6267
|
-
if (!peernet.peerMap.has(from)) peernet.peerMap.set(from, [peer.id]);
|
|
6268
|
-
else {
|
|
6269
|
-
const connections = peernet.peerMap.get(from);
|
|
6270
|
-
if (connections.indexOf(peer.id) === -1) {
|
|
6271
|
-
connections.push(peer.id);
|
|
6272
|
-
peernet.peerMap.set(from, connections);
|
|
6273
|
-
}
|
|
6274
|
-
}
|
|
6275
|
-
}
|
|
6276
|
-
}
|
|
6277
|
-
}
|
|
6085
|
+
const concatAndDoubleHash = async (input) => {
|
|
6086
|
+
return new Uint8Array(await createDoubleHash(typedArrayConcat(input), 'SHA-256'));
|
|
6087
|
+
};
|
|
6088
|
+
|
|
6089
|
+
const encode$2 = async (source, prefix = new TextEncoder().encode('00'), hex) => {
|
|
6090
|
+
if (!(source instanceof Uint8Array) || !(prefix instanceof Uint8Array)) {
|
|
6091
|
+
throw new TypeError('Expected Uint8Array');
|
|
6092
|
+
}
|
|
6093
|
+
const hash = await concatAndDoubleHash([
|
|
6094
|
+
prefix,
|
|
6095
|
+
source
|
|
6096
|
+
]);
|
|
6097
|
+
const uint8Array = typedArrayConcat([
|
|
6098
|
+
prefix,
|
|
6099
|
+
source,
|
|
6100
|
+
hash.subarray(0, 4)
|
|
6101
|
+
]);
|
|
6102
|
+
if (hex)
|
|
6103
|
+
return base58$1.encodeHex(uint8Array);
|
|
6104
|
+
return base58$1.encode(uint8Array);
|
|
6105
|
+
};
|
|
6106
|
+
const decode$3 = async (string, hex) => {
|
|
6107
|
+
let uint8Array = hex ? base58$1.decodeHex(string) : base58$1.decode(string);
|
|
6108
|
+
const prefix = uint8Array.subarray(0, 2);
|
|
6109
|
+
const source = uint8Array.subarray(2, -4);
|
|
6110
|
+
const hash = await concatAndDoubleHash([
|
|
6111
|
+
prefix,
|
|
6112
|
+
source
|
|
6113
|
+
]);
|
|
6114
|
+
let index = 0;
|
|
6115
|
+
const slice = uint8Array.subarray(-4);
|
|
6116
|
+
for (const check of slice) {
|
|
6117
|
+
if (check !== hash[index]) {
|
|
6118
|
+
throw new Error('Invalid checksum');
|
|
6119
|
+
}
|
|
6120
|
+
index++;
|
|
6121
|
+
}
|
|
6122
|
+
return { prefix, data: source };
|
|
6123
|
+
};
|
|
6124
|
+
const isBase58check = (string, hex) => {
|
|
6125
|
+
try {
|
|
6126
|
+
hex ? decode$3(string, true) : decode$3(string);
|
|
6127
|
+
return true;
|
|
6128
|
+
}
|
|
6129
|
+
catch (e) {
|
|
6130
|
+
return false;
|
|
6131
|
+
}
|
|
6132
|
+
};
|
|
6133
|
+
const encodeHex = (uint8Array, prefix = new TextEncoder().encode('00')) => encode$2(uint8Array, prefix, true);
|
|
6134
|
+
const decodeHex = (string) => decode$3(string, true);
|
|
6135
|
+
const isBase58checkHex = (string) => isBase58check(string, true);
|
|
6136
|
+
var base58check = { encode: encode$2, decode: decode$3, encodeHex, decodeHex, isBase58check, isBase58checkHex };
|
|
6278
6137
|
|
|
6279
|
-
|
|
6280
|
-
|
|
6281
|
-
|
|
6282
|
-
|
|
6283
|
-
|
|
6284
|
-
|
|
6285
|
-
|
|
6286
|
-
|
|
6287
|
-
|
|
6288
|
-
}
|
|
6289
|
-
|
|
6290
|
-
|
|
6291
|
-
|
|
6292
|
-
|
|
6293
|
-
|
|
6294
|
-
|
|
6295
|
-
|
|
6296
|
-
|
|
6297
|
-
|
|
6298
|
-
|
|
6299
|
-
|
|
6300
|
-
|
|
6301
|
-
|
|
6302
|
-
|
|
6303
|
-
|
|
6304
|
-
|
|
6305
|
-
|
|
6306
|
-
|
|
6138
|
+
const decode$2 = (multiWif, expectedVersion, expectedCodec) => {
|
|
6139
|
+
const decoded = base58$1.decode(multiWif);
|
|
6140
|
+
let [version, codec, privateKey] = index$6(decoded);
|
|
6141
|
+
version = Number(new TextDecoder().decode(version));
|
|
6142
|
+
codec = Number(new TextDecoder().decode(codec));
|
|
6143
|
+
if (expectedVersion && version !== expectedVersion)
|
|
6144
|
+
throw new Error(`invalid version: expected ${expectedVersion} but got ${version}`);
|
|
6145
|
+
if (expectedCodec && codec !== expectedCodec)
|
|
6146
|
+
throw new Error(`invalid codec: expected ${expectedCodec} but got ${codec}`);
|
|
6147
|
+
return { version, codec, privateKey };
|
|
6148
|
+
};
|
|
6149
|
+
var index$1 = {
|
|
6150
|
+
encode: (version, codec, privateKey) => {
|
|
6151
|
+
return base58$1.encode(index$7([
|
|
6152
|
+
new TextEncoder().encode(version.toString()),
|
|
6153
|
+
new TextEncoder().encode(codec.toString()),
|
|
6154
|
+
privateKey
|
|
6155
|
+
]));
|
|
6156
|
+
},
|
|
6157
|
+
decode: decode$2,
|
|
6158
|
+
isMultiWif: (multiWif) => {
|
|
6159
|
+
try {
|
|
6160
|
+
const { version, codec, privateKey } = decode$2(multiWif);
|
|
6161
|
+
if (version === undefined)
|
|
6162
|
+
return false;
|
|
6163
|
+
if (codec === undefined)
|
|
6164
|
+
return false;
|
|
6165
|
+
if (privateKey === undefined)
|
|
6166
|
+
return false;
|
|
6167
|
+
if (privateKey && privateKey.length !== 32)
|
|
6168
|
+
return false;
|
|
6169
|
+
}
|
|
6170
|
+
catch {
|
|
6171
|
+
return false;
|
|
6172
|
+
}
|
|
6173
|
+
return true;
|
|
6174
|
+
}
|
|
6307
6175
|
};
|
|
6308
|
-
|
|
6309
|
-
|
|
6310
|
-
|
|
6311
|
-
|
|
6312
|
-
|
|
6313
|
-
|
|
6314
|
-
|
|
6315
|
-
|
|
6316
|
-
|
|
6317
|
-
|
|
6176
|
+
|
|
6177
|
+
const errors = {
|
|
6178
|
+
IMPOSSIBLE_CASE: 'Impossible case. Please create issue.',
|
|
6179
|
+
TWEAK_ADD:
|
|
6180
|
+
'The tweak was out of range or the resulted private key is invalid',
|
|
6181
|
+
TWEAK_MUL: 'The tweak was out of range or equal to zero',
|
|
6182
|
+
CONTEXT_RANDOMIZE_UNKNOW: 'Unknow error on context randomization',
|
|
6183
|
+
SECKEY_INVALID: 'Private Key is invalid',
|
|
6184
|
+
PUBKEY_PARSE: 'Public Key could not be parsed',
|
|
6185
|
+
PUBKEY_SERIALIZE: 'Public Key serialization error',
|
|
6186
|
+
PUBKEY_COMBINE: 'The sum of the public keys is not valid',
|
|
6187
|
+
SIG_PARSE: 'Signature could not be parsed',
|
|
6188
|
+
SIGN: 'The nonce generation function failed, or the private key was invalid',
|
|
6189
|
+
RECOVER: 'Public key could not be recover',
|
|
6190
|
+
ECDH: 'Scalar was invalid (zero or overflow)'
|
|
6318
6191
|
};
|
|
6319
|
-
|
|
6320
|
-
|
|
6321
|
-
|
|
6322
|
-
*
|
|
6323
|
-
*/
|
|
6324
|
-
constructor() {
|
|
6325
|
-
this.providerMap = new Map();
|
|
6326
|
-
}
|
|
6327
|
-
async getCoordinates(address) {
|
|
6328
|
-
if (!fetchedCoordinates[address]) {
|
|
6329
|
-
const request = `https://whereis.leofcoin.org/?ip=${address}`;
|
|
6330
|
-
let response = await fetch(request);
|
|
6331
|
-
const { lat, lon } = await response.json();
|
|
6332
|
-
fetchedCoordinates[address] = { latitude: lat, longitude: lon };
|
|
6333
|
-
}
|
|
6334
|
-
return fetchedCoordinates[address];
|
|
6335
|
-
}
|
|
6336
|
-
/**
|
|
6337
|
-
* @param {Object} peer
|
|
6338
|
-
* @param {Object} provider
|
|
6339
|
-
* @return {Object} {provider, distance}
|
|
6340
|
-
*/
|
|
6341
|
-
async getDistance(peer, provider) {
|
|
6342
|
-
const { latitude, longitude } = await this.getCoordinates(provider.address);
|
|
6343
|
-
return { provider, distance: distanceInKmBetweenEarthCoordinates(peer.latitude, peer.longitude, latitude, longitude) };
|
|
6344
|
-
}
|
|
6345
|
-
async closestPeer(providers) {
|
|
6346
|
-
let all = [];
|
|
6347
|
-
const address = await getAddress();
|
|
6348
|
-
const peerLoc = await this.getCoordinates(address);
|
|
6349
|
-
for (const provider of providers) {
|
|
6350
|
-
if (provider.address === '127.0.0.1' || provider.address === '::1')
|
|
6351
|
-
all.push({ provider, distance: 0 });
|
|
6352
|
-
else
|
|
6353
|
-
all.push(this.getDistance(peerLoc, provider));
|
|
6354
|
-
}
|
|
6355
|
-
// todo queue
|
|
6356
|
-
all = await Promise.all(all);
|
|
6357
|
-
all = all.sort((previous, current) => previous.distance - current.distance);
|
|
6358
|
-
return all[0].provider;
|
|
6359
|
-
}
|
|
6360
|
-
hasProvider(hash) {
|
|
6361
|
-
return this.providerMap.has(hash);
|
|
6362
|
-
}
|
|
6363
|
-
providersFor(hash) {
|
|
6364
|
-
let providers;
|
|
6365
|
-
if (this.providerMap.has(hash))
|
|
6366
|
-
providers = this.providerMap.get(hash);
|
|
6367
|
-
return providers;
|
|
6368
|
-
}
|
|
6369
|
-
addProvider(provider, hash) {
|
|
6370
|
-
let providers = {};
|
|
6371
|
-
if (this.providerMap.has(hash)) {
|
|
6372
|
-
providers = this.providerMap.get(hash);
|
|
6373
|
-
}
|
|
6374
|
-
providers[provider.address] = provider;
|
|
6375
|
-
this.providerMap.set(hash, providers);
|
|
6376
|
-
}
|
|
6377
|
-
removeProvider(address, hash) {
|
|
6378
|
-
if (this.providerMap.has(hash)) {
|
|
6379
|
-
const providers = this.providerMap.get(hash);
|
|
6380
|
-
delete providers[address];
|
|
6381
|
-
this.providerMap.set(hash, providers);
|
|
6382
|
-
}
|
|
6383
|
-
}
|
|
6192
|
+
|
|
6193
|
+
function assert$g (cond, msg) {
|
|
6194
|
+
if (!cond) throw new Error(msg)
|
|
6384
6195
|
}
|
|
6385
6196
|
|
|
6386
|
-
|
|
6387
|
-
|
|
6388
|
-
this.network = network;
|
|
6389
|
-
}
|
|
6390
|
-
/**
|
|
6391
|
-
* hash and sign message
|
|
6392
|
-
*
|
|
6393
|
-
* @param {object} message
|
|
6394
|
-
* @param {Buffer} message.from peer id
|
|
6395
|
-
* @param {Buffer} message.to peer id
|
|
6396
|
-
* @param {string} message.data Peernet message
|
|
6397
|
-
* (PeernetMessage excluded) encoded as a string
|
|
6398
|
-
* @return message
|
|
6399
|
-
*/
|
|
6400
|
-
async hashAndSignMessage(message) {
|
|
6401
|
-
const hash = await message.peernetHash;
|
|
6402
|
-
message.decoded.signature = globalThis.identity.sign(hash.buffer);
|
|
6403
|
-
return message
|
|
6404
|
-
}
|
|
6197
|
+
function isUint8Array (name, value, length) {
|
|
6198
|
+
assert$g(value instanceof Uint8Array, `Expected ${name} to be an Uint8Array`);
|
|
6405
6199
|
|
|
6406
|
-
|
|
6407
|
-
|
|
6408
|
-
|
|
6409
|
-
|
|
6410
|
-
|
|
6411
|
-
|
|
6412
|
-
|
|
6413
|
-
|
|
6414
|
-
message = await this.hashAndSignMessage(message);
|
|
6200
|
+
if (length !== undefined) {
|
|
6201
|
+
if (Array.isArray(length)) {
|
|
6202
|
+
const numbers = length.join(', ');
|
|
6203
|
+
const msg = `Expected ${name} to be an Uint8Array with length [${numbers}]`;
|
|
6204
|
+
assert$g(length.includes(value.length), msg);
|
|
6205
|
+
} else {
|
|
6206
|
+
const msg = `Expected ${name} to be an Uint8Array with length ${length}`;
|
|
6207
|
+
assert$g(value.length === length, msg);
|
|
6415
6208
|
}
|
|
6416
|
-
|
|
6417
|
-
return message
|
|
6418
6209
|
}
|
|
6419
6210
|
}
|
|
6420
6211
|
|
|
6421
|
-
|
|
6422
|
-
|
|
6423
|
-
|
|
6424
|
-
const {data, id, from, peer} = message;
|
|
6425
|
-
const proto = await protoFor(data);
|
|
6426
|
-
peernet._protoHandler({id, proto}, peernet.connections[from] || peer, from);
|
|
6427
|
-
};
|
|
6212
|
+
function isCompressed (value) {
|
|
6213
|
+
assert$g(toTypeString(value) === 'Boolean', 'Expected compressed to be a Boolean');
|
|
6214
|
+
}
|
|
6428
6215
|
|
|
6429
|
-
|
|
6430
|
-
|
|
6431
|
-
|
|
6432
|
-
|
|
6216
|
+
function getAssertedOutput (output = (len) => new Uint8Array(len), length) {
|
|
6217
|
+
if (typeof output === 'function') output = output(length);
|
|
6218
|
+
isUint8Array('output', output, length);
|
|
6219
|
+
return output
|
|
6220
|
+
}
|
|
6433
6221
|
|
|
6434
|
-
|
|
6435
|
-
return
|
|
6436
|
-
}
|
|
6222
|
+
function toTypeString (value) {
|
|
6223
|
+
return Object.prototype.toString.call(value).slice(8, -1)
|
|
6224
|
+
}
|
|
6437
6225
|
|
|
6438
|
-
|
|
6439
|
-
|
|
6440
|
-
|
|
6441
|
-
|
|
6442
|
-
|
|
6443
|
-
|
|
6444
|
-
|
|
6445
|
-
|
|
6446
|
-
async init() {
|
|
6447
|
-
const importee = await import(globalThis.navigator ? './browser-store.js' : './store.js');
|
|
6448
|
-
const Store = importee.default;
|
|
6449
|
-
this.db = new Store(this.name, this.root);
|
|
6450
|
-
}
|
|
6451
|
-
async get(key) {
|
|
6452
|
-
if (typeof key === 'object')
|
|
6453
|
-
return this.many('get', key);
|
|
6454
|
-
return this.db.get(new KeyPath(key));
|
|
6455
|
-
}
|
|
6456
|
-
/**
|
|
6457
|
-
*
|
|
6458
|
-
* @param {*} key
|
|
6459
|
-
* @param {*} value
|
|
6460
|
-
* @returns Promise
|
|
6461
|
-
*/
|
|
6462
|
-
put(key, value) {
|
|
6463
|
-
if (typeof key === 'object')
|
|
6464
|
-
return this.many('put', key);
|
|
6465
|
-
return this.db.put(new KeyPath(key), new KeyValue(value));
|
|
6466
|
-
}
|
|
6467
|
-
async has(key) {
|
|
6468
|
-
if (typeof key === 'object')
|
|
6469
|
-
return this.many('has', key);
|
|
6470
|
-
try {
|
|
6471
|
-
const has = await this.db.get(new KeyPath(key));
|
|
6472
|
-
return Boolean(has);
|
|
6473
|
-
}
|
|
6474
|
-
catch (e) {
|
|
6475
|
-
return false;
|
|
6476
|
-
}
|
|
6477
|
-
}
|
|
6478
|
-
async delete(key) {
|
|
6479
|
-
return this.db.delete(new KeyPath(key));
|
|
6480
|
-
}
|
|
6481
|
-
keys(limit = -1) {
|
|
6482
|
-
return this.db.keys(limit);
|
|
6483
|
-
}
|
|
6484
|
-
async values(limit = -1) {
|
|
6485
|
-
return this.db.values(limit);
|
|
6486
|
-
}
|
|
6487
|
-
async many(type, _value) {
|
|
6488
|
-
const jobs = [];
|
|
6489
|
-
for (const key of Object.keys(_value)) {
|
|
6490
|
-
jobs.push(this[type](key, _value[key]));
|
|
6491
|
-
}
|
|
6492
|
-
return Promise.all(jobs);
|
|
6493
|
-
}
|
|
6494
|
-
async length() {
|
|
6495
|
-
const keys = await this.keys();
|
|
6496
|
-
return keys.length;
|
|
6497
|
-
}
|
|
6498
|
-
async size() {
|
|
6499
|
-
let size = 0;
|
|
6500
|
-
const query = await this.db.iterate();
|
|
6501
|
-
for await (const item of query) {
|
|
6502
|
-
// @ts-ignore
|
|
6503
|
-
size += item.value ? item.value.length : item[1].length;
|
|
6504
|
-
}
|
|
6505
|
-
return size;
|
|
6506
|
-
}
|
|
6507
|
-
async clear() {
|
|
6508
|
-
return this.db.clear();
|
|
6509
|
-
}
|
|
6510
|
-
async iterate() {
|
|
6511
|
-
return this.db.iterate();
|
|
6512
|
-
}
|
|
6513
|
-
};
|
|
6226
|
+
var lib = (secp256k1) => {
|
|
6227
|
+
return {
|
|
6228
|
+
contextRandomize (seed) {
|
|
6229
|
+
assert$g(
|
|
6230
|
+
seed === null || seed instanceof Uint8Array,
|
|
6231
|
+
'Expected seed to be an Uint8Array or null'
|
|
6232
|
+
);
|
|
6233
|
+
if (seed !== null) isUint8Array('seed', seed, 32);
|
|
6514
6234
|
|
|
6515
|
-
|
|
6235
|
+
switch (secp256k1.contextRandomize(seed)) {
|
|
6236
|
+
case 1:
|
|
6237
|
+
throw new Error(errors.CONTEXT_RANDOMIZE_UNKNOW)
|
|
6238
|
+
}
|
|
6239
|
+
},
|
|
6516
6240
|
|
|
6517
|
-
|
|
6241
|
+
privateKeyVerify (seckey) {
|
|
6242
|
+
isUint8Array('private key', seckey, 32);
|
|
6518
6243
|
|
|
6519
|
-
|
|
6520
|
-
|
|
6521
|
-
* const {createHash} = await import('@leofcoin/crypto')
|
|
6522
|
-
* createHash(data, algorithm)
|
|
6523
|
-
* ```
|
|
6524
|
-
* @param {Uint8Array} data
|
|
6525
|
-
* @param {string} algorithm
|
|
6526
|
-
* @returns Uint8Array
|
|
6527
|
-
*/
|
|
6528
|
-
const createHash = (data, algorithm = 'SHA-512') => subtle.digest(algorithm, data);
|
|
6244
|
+
return secp256k1.privateKeyVerify(seckey) === 0
|
|
6245
|
+
},
|
|
6529
6246
|
|
|
6530
|
-
|
|
6531
|
-
|
|
6532
|
-
* ```js
|
|
6533
|
-
* const {createDoubleHash} = await import('@leofcoin/crypto')
|
|
6534
|
-
* createDoubleHash(data, algorithm)
|
|
6535
|
-
* ```
|
|
6536
|
-
* @param {Uint8Array} data
|
|
6537
|
-
* @param {string} algorithm
|
|
6538
|
-
* @returns Uint8Array
|
|
6539
|
-
*/
|
|
6540
|
-
const createDoubleHash = async (data, algorithm = 'SHA-512') =>
|
|
6541
|
-
subtle.digest(algorithm, await subtle.digest(algorithm, data));
|
|
6247
|
+
privateKeyNegate (seckey) {
|
|
6248
|
+
isUint8Array('private key', seckey, 32);
|
|
6542
6249
|
|
|
6543
|
-
|
|
6544
|
-
|
|
6545
|
-
|
|
6546
|
-
|
|
6547
|
-
|
|
6548
|
-
|
|
6549
|
-
|
|
6550
|
-
)
|
|
6551
|
-
};
|
|
6250
|
+
switch (secp256k1.privateKeyNegate(seckey)) {
|
|
6251
|
+
case 0:
|
|
6252
|
+
return seckey
|
|
6253
|
+
case 1:
|
|
6254
|
+
throw new Error(errors.IMPOSSIBLE_CASE)
|
|
6255
|
+
}
|
|
6256
|
+
},
|
|
6552
6257
|
|
|
6553
|
-
|
|
6554
|
-
|
|
6555
|
-
|
|
6556
|
-
name: 'PBKDF2',
|
|
6557
|
-
hash,
|
|
6558
|
-
salt,
|
|
6559
|
-
iterations,
|
|
6560
|
-
}, key, length)
|
|
6561
|
-
};
|
|
6258
|
+
privateKeyTweakAdd (seckey, tweak) {
|
|
6259
|
+
isUint8Array('private key', seckey, 32);
|
|
6260
|
+
isUint8Array('tweak', tweak, 32);
|
|
6562
6261
|
|
|
6563
|
-
|
|
6564
|
-
|
|
6565
|
-
|
|
6566
|
-
|
|
6567
|
-
|
|
6568
|
-
|
|
6569
|
-
|
|
6570
|
-
total += current.length;
|
|
6571
|
-
if (options.seperator && input.length - 1 > i) total+= options.seperator.length;
|
|
6572
|
-
return total
|
|
6573
|
-
}, 0);
|
|
6574
|
-
|
|
6575
|
-
const typedArray = new Uint8Array(length);
|
|
6576
|
-
|
|
6577
|
-
let currentIndex = 0;
|
|
6578
|
-
let index = 0;
|
|
6579
|
-
for (const source of input) {
|
|
6580
|
-
typedArray.set(source, currentIndex);
|
|
6581
|
-
if (options.seperator && input.length - 1 > index) {
|
|
6582
|
-
typedArray.set(options.seperator, currentIndex + source.length);
|
|
6583
|
-
currentIndex+= options.seperator.length;
|
|
6584
|
-
}
|
|
6585
|
-
currentIndex += source.length;
|
|
6586
|
-
index += 1;
|
|
6587
|
-
}
|
|
6588
|
-
|
|
6589
|
-
return typedArray
|
|
6590
|
-
};
|
|
6262
|
+
switch (secp256k1.privateKeyTweakAdd(seckey, tweak)) {
|
|
6263
|
+
case 0:
|
|
6264
|
+
return seckey
|
|
6265
|
+
case 1:
|
|
6266
|
+
throw new Error(errors.TWEAK_ADD)
|
|
6267
|
+
}
|
|
6268
|
+
},
|
|
6591
6269
|
|
|
6592
|
-
|
|
6593
|
-
|
|
6594
|
-
|
|
6595
|
-
|
|
6596
|
-
const encode$2 = async (source, prefix = new TextEncoder().encode('00'), hex) => {
|
|
6597
|
-
if (!(source instanceof Uint8Array) || !(prefix instanceof Uint8Array)) {
|
|
6598
|
-
throw new TypeError('Expected Uint8Array');
|
|
6599
|
-
}
|
|
6600
|
-
const hash = await concatAndDoubleHash([
|
|
6601
|
-
prefix,
|
|
6602
|
-
source
|
|
6603
|
-
]);
|
|
6604
|
-
const uint8Array = typedArrayConcat([
|
|
6605
|
-
prefix,
|
|
6606
|
-
source,
|
|
6607
|
-
hash.subarray(0, 4)
|
|
6608
|
-
]);
|
|
6609
|
-
if (hex)
|
|
6610
|
-
return base58$1.encodeHex(uint8Array);
|
|
6611
|
-
return base58$1.encode(uint8Array);
|
|
6612
|
-
};
|
|
6613
|
-
const decode$3 = async (string, hex) => {
|
|
6614
|
-
let uint8Array = hex ? base58$1.decodeHex(string) : base58$1.decode(string);
|
|
6615
|
-
const prefix = uint8Array.subarray(0, 2);
|
|
6616
|
-
const source = uint8Array.subarray(2, -4);
|
|
6617
|
-
const hash = await concatAndDoubleHash([
|
|
6618
|
-
prefix,
|
|
6619
|
-
source
|
|
6620
|
-
]);
|
|
6621
|
-
let index = 0;
|
|
6622
|
-
const slice = uint8Array.subarray(-4);
|
|
6623
|
-
for (const check of slice) {
|
|
6624
|
-
if (check !== hash[index]) {
|
|
6625
|
-
throw new Error('Invalid checksum');
|
|
6626
|
-
}
|
|
6627
|
-
index++;
|
|
6628
|
-
}
|
|
6629
|
-
return { prefix, data: source };
|
|
6630
|
-
};
|
|
6631
|
-
const isBase58check = (string, hex) => {
|
|
6632
|
-
try {
|
|
6633
|
-
hex ? decode$3(string, true) : decode$3(string);
|
|
6634
|
-
return true;
|
|
6635
|
-
}
|
|
6636
|
-
catch (e) {
|
|
6637
|
-
return false;
|
|
6638
|
-
}
|
|
6639
|
-
};
|
|
6640
|
-
const encodeHex = (uint8Array, prefix = new TextEncoder().encode('00')) => encode$2(uint8Array, prefix, true);
|
|
6641
|
-
const decodeHex = (string) => decode$3(string, true);
|
|
6642
|
-
const isBase58checkHex = (string) => isBase58check(string, true);
|
|
6643
|
-
var base58check = { encode: encode$2, decode: decode$3, encodeHex, decodeHex, isBase58check, isBase58checkHex };
|
|
6644
|
-
|
|
6645
|
-
const decode$2 = (multiWif, expectedVersion, expectedCodec) => {
|
|
6646
|
-
const decoded = base58$1.decode(multiWif);
|
|
6647
|
-
let [version, codec, privateKey] = index$6(decoded);
|
|
6648
|
-
version = Number(new TextDecoder().decode(version));
|
|
6649
|
-
codec = Number(new TextDecoder().decode(codec));
|
|
6650
|
-
if (expectedVersion && version !== expectedVersion)
|
|
6651
|
-
throw new Error(`invalid version: expected ${expectedVersion} but got ${version}`);
|
|
6652
|
-
if (expectedCodec && codec !== expectedCodec)
|
|
6653
|
-
throw new Error(`invalid codec: expected ${expectedCodec} but got ${codec}`);
|
|
6654
|
-
return { version, codec, privateKey };
|
|
6655
|
-
};
|
|
6656
|
-
var index$1 = {
|
|
6657
|
-
encode: (version, codec, privateKey) => {
|
|
6658
|
-
return base58$1.encode(index$7([
|
|
6659
|
-
new TextEncoder().encode(version.toString()),
|
|
6660
|
-
new TextEncoder().encode(codec.toString()),
|
|
6661
|
-
privateKey
|
|
6662
|
-
]));
|
|
6663
|
-
},
|
|
6664
|
-
decode: decode$2,
|
|
6665
|
-
isMultiWif: (multiWif) => {
|
|
6666
|
-
try {
|
|
6667
|
-
const { version, codec, privateKey } = decode$2(multiWif);
|
|
6668
|
-
if (version === undefined)
|
|
6669
|
-
return false;
|
|
6670
|
-
if (codec === undefined)
|
|
6671
|
-
return false;
|
|
6672
|
-
if (privateKey === undefined)
|
|
6673
|
-
return false;
|
|
6674
|
-
if (privateKey && privateKey.length !== 32)
|
|
6675
|
-
return false;
|
|
6676
|
-
}
|
|
6677
|
-
catch {
|
|
6678
|
-
return false;
|
|
6679
|
-
}
|
|
6680
|
-
return true;
|
|
6681
|
-
}
|
|
6682
|
-
};
|
|
6683
|
-
|
|
6684
|
-
const errors = {
|
|
6685
|
-
IMPOSSIBLE_CASE: 'Impossible case. Please create issue.',
|
|
6686
|
-
TWEAK_ADD:
|
|
6687
|
-
'The tweak was out of range or the resulted private key is invalid',
|
|
6688
|
-
TWEAK_MUL: 'The tweak was out of range or equal to zero',
|
|
6689
|
-
CONTEXT_RANDOMIZE_UNKNOW: 'Unknow error on context randomization',
|
|
6690
|
-
SECKEY_INVALID: 'Private Key is invalid',
|
|
6691
|
-
PUBKEY_PARSE: 'Public Key could not be parsed',
|
|
6692
|
-
PUBKEY_SERIALIZE: 'Public Key serialization error',
|
|
6693
|
-
PUBKEY_COMBINE: 'The sum of the public keys is not valid',
|
|
6694
|
-
SIG_PARSE: 'Signature could not be parsed',
|
|
6695
|
-
SIGN: 'The nonce generation function failed, or the private key was invalid',
|
|
6696
|
-
RECOVER: 'Public key could not be recover',
|
|
6697
|
-
ECDH: 'Scalar was invalid (zero or overflow)'
|
|
6698
|
-
};
|
|
6699
|
-
|
|
6700
|
-
function assert$g (cond, msg) {
|
|
6701
|
-
if (!cond) throw new Error(msg)
|
|
6702
|
-
}
|
|
6703
|
-
|
|
6704
|
-
function isUint8Array (name, value, length) {
|
|
6705
|
-
assert$g(value instanceof Uint8Array, `Expected ${name} to be an Uint8Array`);
|
|
6706
|
-
|
|
6707
|
-
if (length !== undefined) {
|
|
6708
|
-
if (Array.isArray(length)) {
|
|
6709
|
-
const numbers = length.join(', ');
|
|
6710
|
-
const msg = `Expected ${name} to be an Uint8Array with length [${numbers}]`;
|
|
6711
|
-
assert$g(length.includes(value.length), msg);
|
|
6712
|
-
} else {
|
|
6713
|
-
const msg = `Expected ${name} to be an Uint8Array with length ${length}`;
|
|
6714
|
-
assert$g(value.length === length, msg);
|
|
6715
|
-
}
|
|
6716
|
-
}
|
|
6717
|
-
}
|
|
6718
|
-
|
|
6719
|
-
function isCompressed (value) {
|
|
6720
|
-
assert$g(toTypeString(value) === 'Boolean', 'Expected compressed to be a Boolean');
|
|
6721
|
-
}
|
|
6722
|
-
|
|
6723
|
-
function getAssertedOutput (output = (len) => new Uint8Array(len), length) {
|
|
6724
|
-
if (typeof output === 'function') output = output(length);
|
|
6725
|
-
isUint8Array('output', output, length);
|
|
6726
|
-
return output
|
|
6727
|
-
}
|
|
6728
|
-
|
|
6729
|
-
function toTypeString (value) {
|
|
6730
|
-
return Object.prototype.toString.call(value).slice(8, -1)
|
|
6731
|
-
}
|
|
6732
|
-
|
|
6733
|
-
var lib = (secp256k1) => {
|
|
6734
|
-
return {
|
|
6735
|
-
contextRandomize (seed) {
|
|
6736
|
-
assert$g(
|
|
6737
|
-
seed === null || seed instanceof Uint8Array,
|
|
6738
|
-
'Expected seed to be an Uint8Array or null'
|
|
6739
|
-
);
|
|
6740
|
-
if (seed !== null) isUint8Array('seed', seed, 32);
|
|
6741
|
-
|
|
6742
|
-
switch (secp256k1.contextRandomize(seed)) {
|
|
6743
|
-
case 1:
|
|
6744
|
-
throw new Error(errors.CONTEXT_RANDOMIZE_UNKNOW)
|
|
6745
|
-
}
|
|
6746
|
-
},
|
|
6747
|
-
|
|
6748
|
-
privateKeyVerify (seckey) {
|
|
6749
|
-
isUint8Array('private key', seckey, 32);
|
|
6750
|
-
|
|
6751
|
-
return secp256k1.privateKeyVerify(seckey) === 0
|
|
6752
|
-
},
|
|
6753
|
-
|
|
6754
|
-
privateKeyNegate (seckey) {
|
|
6755
|
-
isUint8Array('private key', seckey, 32);
|
|
6756
|
-
|
|
6757
|
-
switch (secp256k1.privateKeyNegate(seckey)) {
|
|
6758
|
-
case 0:
|
|
6759
|
-
return seckey
|
|
6760
|
-
case 1:
|
|
6761
|
-
throw new Error(errors.IMPOSSIBLE_CASE)
|
|
6762
|
-
}
|
|
6763
|
-
},
|
|
6764
|
-
|
|
6765
|
-
privateKeyTweakAdd (seckey, tweak) {
|
|
6766
|
-
isUint8Array('private key', seckey, 32);
|
|
6767
|
-
isUint8Array('tweak', tweak, 32);
|
|
6768
|
-
|
|
6769
|
-
switch (secp256k1.privateKeyTweakAdd(seckey, tweak)) {
|
|
6770
|
-
case 0:
|
|
6771
|
-
return seckey
|
|
6772
|
-
case 1:
|
|
6773
|
-
throw new Error(errors.TWEAK_ADD)
|
|
6774
|
-
}
|
|
6775
|
-
},
|
|
6776
|
-
|
|
6777
|
-
privateKeyTweakMul (seckey, tweak) {
|
|
6778
|
-
isUint8Array('private key', seckey, 32);
|
|
6779
|
-
isUint8Array('tweak', tweak, 32);
|
|
6270
|
+
privateKeyTweakMul (seckey, tweak) {
|
|
6271
|
+
isUint8Array('private key', seckey, 32);
|
|
6272
|
+
isUint8Array('tweak', tweak, 32);
|
|
6780
6273
|
|
|
6781
6274
|
switch (secp256k1.privateKeyTweakMul(seckey, tweak)) {
|
|
6782
6275
|
case 0:
|
|
@@ -16195,240 +15688,795 @@ var elliptic$1 = {
|
|
|
16195
15688
|
if (sig[4] & 0x80) return 1
|
|
16196
15689
|
if (lenR > 1 && (sig[4] === 0x00) && !(sig[5] & 0x80)) return 1
|
|
16197
15690
|
|
|
16198
|
-
if (sig[lenR + 6] & 0x80) return 1
|
|
16199
|
-
if (lenS > 1 && (sig[lenR + 6] === 0x00) && !(sig[lenR + 7] & 0x80)) return 1
|
|
15691
|
+
if (sig[lenR + 6] & 0x80) return 1
|
|
15692
|
+
if (lenS > 1 && (sig[lenR + 6] === 0x00) && !(sig[lenR + 7] & 0x80)) return 1
|
|
15693
|
+
|
|
15694
|
+
let sigR = sig.subarray(4, 4 + lenR);
|
|
15695
|
+
if (sigR.length === 33 && sigR[0] === 0x00) sigR = sigR.subarray(1);
|
|
15696
|
+
if (sigR.length > 32) return 1
|
|
15697
|
+
|
|
15698
|
+
let sigS = sig.subarray(6 + lenR);
|
|
15699
|
+
if (sigS.length === 33 && sigS[0] === 0x00) sigS = sigS.slice(1);
|
|
15700
|
+
if (sigS.length > 32) throw new Error('S length is too long')
|
|
15701
|
+
|
|
15702
|
+
let r = new BN(sigR);
|
|
15703
|
+
if (r.cmp(ecparams.n) >= 0) r = new BN(0);
|
|
15704
|
+
|
|
15705
|
+
let s = new BN(sig.subarray(6 + lenR));
|
|
15706
|
+
if (s.cmp(ecparams.n) >= 0) s = new BN(0);
|
|
15707
|
+
|
|
15708
|
+
output.set(r.toArrayLike(Uint8Array, 'be', 32), 0);
|
|
15709
|
+
output.set(s.toArrayLike(Uint8Array, 'be', 32), 32);
|
|
15710
|
+
|
|
15711
|
+
return 0
|
|
15712
|
+
},
|
|
15713
|
+
|
|
15714
|
+
ecdsaSign (obj, message, seckey, data, noncefn) {
|
|
15715
|
+
if (noncefn) {
|
|
15716
|
+
const _noncefn = noncefn;
|
|
15717
|
+
noncefn = (counter) => {
|
|
15718
|
+
const nonce = _noncefn(message, seckey, null, data, counter);
|
|
15719
|
+
|
|
15720
|
+
const isValid = nonce instanceof Uint8Array && nonce.length === 32;
|
|
15721
|
+
if (!isValid) throw new Error('This is the way')
|
|
15722
|
+
|
|
15723
|
+
return new BN(nonce)
|
|
15724
|
+
};
|
|
15725
|
+
}
|
|
15726
|
+
|
|
15727
|
+
const d = new BN(seckey);
|
|
15728
|
+
if (d.cmp(ecparams.n) >= 0 || d.isZero()) return 1
|
|
15729
|
+
|
|
15730
|
+
let sig;
|
|
15731
|
+
try {
|
|
15732
|
+
sig = ec.sign(message, seckey, { canonical: true, k: noncefn, pers: data });
|
|
15733
|
+
} catch (err) {
|
|
15734
|
+
return 1
|
|
15735
|
+
}
|
|
15736
|
+
|
|
15737
|
+
obj.signature.set(sig.r.toArrayLike(Uint8Array, 'be', 32), 0);
|
|
15738
|
+
obj.signature.set(sig.s.toArrayLike(Uint8Array, 'be', 32), 32);
|
|
15739
|
+
obj.recid = sig.recoveryParam;
|
|
15740
|
+
|
|
15741
|
+
return 0
|
|
15742
|
+
},
|
|
15743
|
+
|
|
15744
|
+
ecdsaVerify (sig, msg32, pubkey) {
|
|
15745
|
+
const sigObj = { r: sig.subarray(0, 32), s: sig.subarray(32, 64) };
|
|
15746
|
+
|
|
15747
|
+
const sigr = new BN(sigObj.r);
|
|
15748
|
+
const sigs = new BN(sigObj.s);
|
|
15749
|
+
if (sigr.cmp(ecparams.n) >= 0 || sigs.cmp(ecparams.n) >= 0) return 1
|
|
15750
|
+
if (sigs.cmp(ec.nh) === 1 || sigr.isZero() || sigs.isZero()) return 3
|
|
15751
|
+
|
|
15752
|
+
const pair = loadPublicKey(pubkey);
|
|
15753
|
+
if (pair === null) return 2
|
|
15754
|
+
|
|
15755
|
+
const point = pair.getPublic();
|
|
15756
|
+
const isValid = ec.verify(msg32, sigObj, point);
|
|
15757
|
+
return isValid ? 0 : 3
|
|
15758
|
+
},
|
|
15759
|
+
|
|
15760
|
+
ecdsaRecover (output, sig, recid, msg32) {
|
|
15761
|
+
const sigObj = { r: sig.slice(0, 32), s: sig.slice(32, 64) };
|
|
15762
|
+
|
|
15763
|
+
const sigr = new BN(sigObj.r);
|
|
15764
|
+
const sigs = new BN(sigObj.s);
|
|
15765
|
+
if (sigr.cmp(ecparams.n) >= 0 || sigs.cmp(ecparams.n) >= 0) return 1
|
|
15766
|
+
|
|
15767
|
+
if (sigr.isZero() || sigs.isZero()) return 2
|
|
15768
|
+
|
|
15769
|
+
// Can throw `throw new Error('Unable to find sencond key candinate');`
|
|
15770
|
+
let point;
|
|
15771
|
+
try {
|
|
15772
|
+
point = ec.recoverPubKey(msg32, sigObj, recid);
|
|
15773
|
+
} catch (err) {
|
|
15774
|
+
return 2
|
|
15775
|
+
}
|
|
15776
|
+
|
|
15777
|
+
savePublicKey(output, point);
|
|
15778
|
+
|
|
15779
|
+
return 0
|
|
15780
|
+
},
|
|
15781
|
+
|
|
15782
|
+
ecdh (output, pubkey, seckey, data, hashfn, xbuf, ybuf) {
|
|
15783
|
+
const pair = loadPublicKey(pubkey);
|
|
15784
|
+
if (pair === null) return 1
|
|
15785
|
+
|
|
15786
|
+
const scalar = new BN(seckey);
|
|
15787
|
+
if (scalar.cmp(ecparams.n) >= 0 || scalar.isZero()) return 2
|
|
15788
|
+
|
|
15789
|
+
const point = pair.getPublic().mul(scalar);
|
|
15790
|
+
|
|
15791
|
+
if (hashfn === undefined) {
|
|
15792
|
+
const data = point.encode(null, true);
|
|
15793
|
+
const sha256 = ec.hash().update(data).digest();
|
|
15794
|
+
for (let i = 0; i < 32; ++i) output[i] = sha256[i];
|
|
15795
|
+
} else {
|
|
15796
|
+
if (!xbuf) xbuf = new Uint8Array(32);
|
|
15797
|
+
const x = point.getX().toArray('be', 32);
|
|
15798
|
+
for (let i = 0; i < 32; ++i) xbuf[i] = x[i];
|
|
15799
|
+
|
|
15800
|
+
if (!ybuf) ybuf = new Uint8Array(32);
|
|
15801
|
+
const y = point.getY().toArray('be', 32);
|
|
15802
|
+
for (let i = 0; i < 32; ++i) ybuf[i] = y[i];
|
|
15803
|
+
|
|
15804
|
+
const hash = hashfn(xbuf, ybuf, data);
|
|
15805
|
+
|
|
15806
|
+
const isValid = hash instanceof Uint8Array && hash.length === output.length;
|
|
15807
|
+
if (!isValid) return 2
|
|
15808
|
+
|
|
15809
|
+
output.set(hash);
|
|
15810
|
+
}
|
|
15811
|
+
|
|
15812
|
+
return 0
|
|
15813
|
+
}
|
|
15814
|
+
};
|
|
15815
|
+
|
|
15816
|
+
var elliptic = lib(elliptic$1);
|
|
15817
|
+
|
|
15818
|
+
var secp256k1 = /*@__PURE__*/getDefaultExportFromCjs(elliptic);
|
|
15819
|
+
|
|
15820
|
+
const leofcoinOlivia = {
|
|
15821
|
+
messagePrefix: '\u0019Leofcoin Signed Message:',
|
|
15822
|
+
version: 1,
|
|
15823
|
+
pubKeyHash: 0x73,
|
|
15824
|
+
scriptHash: 0x76,
|
|
15825
|
+
multiTxHash: 0x8b4125,
|
|
15826
|
+
payments: {
|
|
15827
|
+
version: 0,
|
|
15828
|
+
unspent: 0x1fa443d7 // ounsp
|
|
15829
|
+
},
|
|
15830
|
+
wif: 0x7D,
|
|
15831
|
+
multiCodec: 0x7c4,
|
|
15832
|
+
bip32: { public: 0x13BBF2D5, private: 0x13BBCBC5 }
|
|
15833
|
+
};
|
|
15834
|
+
const bitcoinTestnet = {
|
|
15835
|
+
messagePrefix: '\x18Bitcoin Signed Message:\n',
|
|
15836
|
+
version: 1,
|
|
15837
|
+
bech32: 'tb',
|
|
15838
|
+
pubKeyHash: 0x6f,
|
|
15839
|
+
scriptHash: 0xc4,
|
|
15840
|
+
wif: 0xef,
|
|
15841
|
+
bip32: {
|
|
15842
|
+
public: 0x043587cf,
|
|
15843
|
+
private: 0x04358394
|
|
15844
|
+
},
|
|
15845
|
+
multiCodec: 0
|
|
15846
|
+
};
|
|
15847
|
+
var testnets = {
|
|
15848
|
+
'leofcoin:olivia': leofcoinOlivia,
|
|
15849
|
+
'bitcoin:testnet': bitcoinTestnet
|
|
15850
|
+
};
|
|
15851
|
+
|
|
15852
|
+
// https://en.bitcoin.it/wiki/List_of_address_prefixes
|
|
15853
|
+
// usage:
|
|
15854
|
+
// networks['bitcoin']['testnet']
|
|
15855
|
+
// networks.bitcoin.testnet
|
|
15856
|
+
/**
|
|
15857
|
+
* Main network
|
|
15858
|
+
* @return {messagePrefix, pubKeyHash, scriptHash, wif, bip32}
|
|
15859
|
+
*/
|
|
15860
|
+
const leofcoin = {
|
|
15861
|
+
messagePrefix: '\u0019Leofcoin Signed Message:',
|
|
15862
|
+
version: 1,
|
|
15863
|
+
pubKeyHash: 0x30,
|
|
15864
|
+
scriptHash: 0x37,
|
|
15865
|
+
multiTxHash: 0x3adeed,
|
|
15866
|
+
payments: {
|
|
15867
|
+
version: 0,
|
|
15868
|
+
unspent: 0x0d6e0327 // Lunsp
|
|
15869
|
+
},
|
|
15870
|
+
coin_type: 640,
|
|
15871
|
+
wif: 0x3F,
|
|
15872
|
+
multiCodec: 0x3c4,
|
|
15873
|
+
bip32: { public: 0x13BBF2D4, private: 0x13BBCBC4 },
|
|
15874
|
+
testnet: testnets['leofcoin:olivia']
|
|
15875
|
+
};
|
|
15876
|
+
const bitcoin = {
|
|
15877
|
+
messagePrefix: '\x18Bitcoin Signed Message:\n',
|
|
15878
|
+
version: 1,
|
|
15879
|
+
bech32: 'bc',
|
|
15880
|
+
pubKeyHash: 0x00,
|
|
15881
|
+
multiCodec: 0x00,
|
|
15882
|
+
scriptHash: 0x05,
|
|
15883
|
+
wif: 0x80,
|
|
15884
|
+
coin_type: 0,
|
|
15885
|
+
bip32: {
|
|
15886
|
+
public: 0x0488b21e, private: 0x0488ade4
|
|
15887
|
+
},
|
|
15888
|
+
testnet: testnets['bitcoin:testnet']
|
|
15889
|
+
};
|
|
15890
|
+
const litecoin = {
|
|
15891
|
+
messagePrefix: '\x19Litecoin Signed Message:\n',
|
|
15892
|
+
version: 1,
|
|
15893
|
+
pubKeyHash: 0x30,
|
|
15894
|
+
scriptHash: 0x32,
|
|
15895
|
+
wif: 0xb0,
|
|
15896
|
+
bip32: {
|
|
15897
|
+
public: 0x019da462,
|
|
15898
|
+
private: 0x019d9cfe
|
|
15899
|
+
},
|
|
15900
|
+
bech32: '',
|
|
15901
|
+
multiCodec: 0
|
|
15902
|
+
};
|
|
15903
|
+
const ethereum = {
|
|
15904
|
+
messagePrefix: '\x19Ethereum Signed Message:\n',
|
|
15905
|
+
version: 1,
|
|
15906
|
+
pubKeyHash: 0x30,
|
|
15907
|
+
scriptHash: 0x32,
|
|
15908
|
+
bip32: {
|
|
15909
|
+
private: 0x0488ADE4, public: 0x0488B21E
|
|
15910
|
+
},
|
|
15911
|
+
coin_type: 60,
|
|
15912
|
+
wif: 0x45,
|
|
15913
|
+
multiCodec: 0x3c5
|
|
15914
|
+
};
|
|
15915
|
+
/**
|
|
15916
|
+
* Our & supported networks
|
|
15917
|
+
* @return {leofcoin, olivia}
|
|
15918
|
+
*/
|
|
15919
|
+
var networks$1 = {
|
|
15920
|
+
leofcoin,
|
|
15921
|
+
bitcoin,
|
|
15922
|
+
litecoin,
|
|
15923
|
+
ethereum
|
|
15924
|
+
};
|
|
15925
|
+
|
|
15926
|
+
/*!
|
|
15927
|
+
* hash-wasm (https://www.npmjs.com/package/hash-wasm)
|
|
15928
|
+
* (c) Dani Biro
|
|
15929
|
+
* @license MIT
|
|
15930
|
+
*/
|
|
15931
|
+
|
|
15932
|
+
/******************************************************************************
|
|
15933
|
+
Copyright (c) Microsoft Corporation.
|
|
15934
|
+
|
|
15935
|
+
Permission to use, copy, modify, and/or distribute this software for any
|
|
15936
|
+
purpose with or without fee is hereby granted.
|
|
15937
|
+
|
|
15938
|
+
THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
|
|
15939
|
+
REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
|
|
15940
|
+
AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
|
|
15941
|
+
INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
|
|
15942
|
+
LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
|
|
15943
|
+
OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
|
|
15944
|
+
PERFORMANCE OF THIS SOFTWARE.
|
|
15945
|
+
***************************************************************************** */
|
|
15946
|
+
/* global Reflect, Promise, SuppressedError, Symbol */
|
|
15947
|
+
|
|
15948
|
+
|
|
15949
|
+
function __awaiter(thisArg, _arguments, P, generator) {
|
|
15950
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
15951
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
15952
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
15953
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
15954
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
15955
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
15956
|
+
});
|
|
15957
|
+
}
|
|
15958
|
+
|
|
15959
|
+
typeof SuppressedError === "function" ? SuppressedError : function (error, suppressed, message) {
|
|
15960
|
+
var e = new Error(message);
|
|
15961
|
+
return e.name = "SuppressedError", e.error = error, e.suppressed = suppressed, e;
|
|
15962
|
+
};
|
|
15963
|
+
|
|
15964
|
+
class Mutex {
|
|
15965
|
+
constructor() {
|
|
15966
|
+
this.mutex = Promise.resolve();
|
|
15967
|
+
}
|
|
15968
|
+
lock() {
|
|
15969
|
+
let begin = () => { };
|
|
15970
|
+
this.mutex = this.mutex.then(() => new Promise(begin));
|
|
15971
|
+
return new Promise((res) => {
|
|
15972
|
+
begin = res;
|
|
15973
|
+
});
|
|
15974
|
+
}
|
|
15975
|
+
dispatch(fn) {
|
|
15976
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
15977
|
+
const unlock = yield this.lock();
|
|
15978
|
+
try {
|
|
15979
|
+
return yield Promise.resolve(fn());
|
|
15980
|
+
}
|
|
15981
|
+
finally {
|
|
15982
|
+
unlock();
|
|
15983
|
+
}
|
|
15984
|
+
});
|
|
15985
|
+
}
|
|
15986
|
+
}
|
|
15987
|
+
|
|
15988
|
+
/* eslint-disable import/prefer-default-export */
|
|
15989
|
+
/* eslint-disable no-bitwise */
|
|
15990
|
+
var _a;
|
|
15991
|
+
function getGlobal() {
|
|
15992
|
+
if (typeof globalThis !== 'undefined')
|
|
15993
|
+
return globalThis;
|
|
15994
|
+
// eslint-disable-next-line no-restricted-globals
|
|
15995
|
+
if (typeof self !== 'undefined')
|
|
15996
|
+
return self;
|
|
15997
|
+
if (typeof window !== 'undefined')
|
|
15998
|
+
return window;
|
|
15999
|
+
return global;
|
|
16000
|
+
}
|
|
16001
|
+
const globalObject = getGlobal();
|
|
16002
|
+
const nodeBuffer = (_a = globalObject.Buffer) !== null && _a !== void 0 ? _a : null;
|
|
16003
|
+
const textEncoder = globalObject.TextEncoder ? new globalObject.TextEncoder() : null;
|
|
16004
|
+
function hexCharCodesToInt(a, b) {
|
|
16005
|
+
return (((a & 0xF) + ((a >> 6) | ((a >> 3) & 0x8))) << 4) | ((b & 0xF) + ((b >> 6) | ((b >> 3) & 0x8)));
|
|
16006
|
+
}
|
|
16007
|
+
function writeHexToUInt8(buf, str) {
|
|
16008
|
+
const size = str.length >> 1;
|
|
16009
|
+
for (let i = 0; i < size; i++) {
|
|
16010
|
+
const index = i << 1;
|
|
16011
|
+
buf[i] = hexCharCodesToInt(str.charCodeAt(index), str.charCodeAt(index + 1));
|
|
16012
|
+
}
|
|
16013
|
+
}
|
|
16014
|
+
function hexStringEqualsUInt8(str, buf) {
|
|
16015
|
+
if (str.length !== buf.length * 2) {
|
|
16016
|
+
return false;
|
|
16017
|
+
}
|
|
16018
|
+
for (let i = 0; i < buf.length; i++) {
|
|
16019
|
+
const strIndex = i << 1;
|
|
16020
|
+
if (buf[i] !== hexCharCodesToInt(str.charCodeAt(strIndex), str.charCodeAt(strIndex + 1))) {
|
|
16021
|
+
return false;
|
|
16022
|
+
}
|
|
16023
|
+
}
|
|
16024
|
+
return true;
|
|
16025
|
+
}
|
|
16026
|
+
const alpha = 'a'.charCodeAt(0) - 10;
|
|
16027
|
+
const digit = '0'.charCodeAt(0);
|
|
16028
|
+
function getDigestHex(tmpBuffer, input, hashLength) {
|
|
16029
|
+
let p = 0;
|
|
16030
|
+
/* eslint-disable no-plusplus */
|
|
16031
|
+
for (let i = 0; i < hashLength; i++) {
|
|
16032
|
+
let nibble = input[i] >>> 4;
|
|
16033
|
+
tmpBuffer[p++] = nibble > 9 ? nibble + alpha : nibble + digit;
|
|
16034
|
+
nibble = input[i] & 0xF;
|
|
16035
|
+
tmpBuffer[p++] = nibble > 9 ? nibble + alpha : nibble + digit;
|
|
16036
|
+
}
|
|
16037
|
+
/* eslint-enable no-plusplus */
|
|
16038
|
+
return String.fromCharCode.apply(null, tmpBuffer);
|
|
16039
|
+
}
|
|
16040
|
+
const getUInt8Buffer = nodeBuffer !== null
|
|
16041
|
+
? (data) => {
|
|
16042
|
+
if (typeof data === 'string') {
|
|
16043
|
+
const buf = nodeBuffer.from(data, 'utf8');
|
|
16044
|
+
return new Uint8Array(buf.buffer, buf.byteOffset, buf.length);
|
|
16045
|
+
}
|
|
16046
|
+
if (nodeBuffer.isBuffer(data)) {
|
|
16047
|
+
return new Uint8Array(data.buffer, data.byteOffset, data.length);
|
|
16048
|
+
}
|
|
16049
|
+
if (ArrayBuffer.isView(data)) {
|
|
16050
|
+
return new Uint8Array(data.buffer, data.byteOffset, data.byteLength);
|
|
16051
|
+
}
|
|
16052
|
+
throw new Error('Invalid data type!');
|
|
16053
|
+
}
|
|
16054
|
+
: (data) => {
|
|
16055
|
+
if (typeof data === 'string') {
|
|
16056
|
+
return textEncoder.encode(data);
|
|
16057
|
+
}
|
|
16058
|
+
if (ArrayBuffer.isView(data)) {
|
|
16059
|
+
return new Uint8Array(data.buffer, data.byteOffset, data.byteLength);
|
|
16060
|
+
}
|
|
16061
|
+
throw new Error('Invalid data type!');
|
|
16062
|
+
};
|
|
16063
|
+
const base64Chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';
|
|
16064
|
+
const base64Lookup = new Uint8Array(256);
|
|
16065
|
+
for (let i = 0; i < base64Chars.length; i++) {
|
|
16066
|
+
base64Lookup[base64Chars.charCodeAt(i)] = i;
|
|
16067
|
+
}
|
|
16068
|
+
function getDecodeBase64Length(data) {
|
|
16069
|
+
let bufferLength = Math.floor(data.length * 0.75);
|
|
16070
|
+
const len = data.length;
|
|
16071
|
+
if (data[len - 1] === '=') {
|
|
16072
|
+
bufferLength -= 1;
|
|
16073
|
+
if (data[len - 2] === '=') {
|
|
16074
|
+
bufferLength -= 1;
|
|
16075
|
+
}
|
|
16076
|
+
}
|
|
16077
|
+
return bufferLength;
|
|
16078
|
+
}
|
|
16079
|
+
function decodeBase64(data) {
|
|
16080
|
+
const bufferLength = getDecodeBase64Length(data);
|
|
16081
|
+
const len = data.length;
|
|
16082
|
+
const bytes = new Uint8Array(bufferLength);
|
|
16083
|
+
let p = 0;
|
|
16084
|
+
for (let i = 0; i < len; i += 4) {
|
|
16085
|
+
const encoded1 = base64Lookup[data.charCodeAt(i)];
|
|
16086
|
+
const encoded2 = base64Lookup[data.charCodeAt(i + 1)];
|
|
16087
|
+
const encoded3 = base64Lookup[data.charCodeAt(i + 2)];
|
|
16088
|
+
const encoded4 = base64Lookup[data.charCodeAt(i + 3)];
|
|
16089
|
+
bytes[p] = (encoded1 << 2) | (encoded2 >> 4);
|
|
16090
|
+
p += 1;
|
|
16091
|
+
bytes[p] = ((encoded2 & 15) << 4) | (encoded3 >> 2);
|
|
16092
|
+
p += 1;
|
|
16093
|
+
bytes[p] = ((encoded3 & 3) << 6) | (encoded4 & 63);
|
|
16094
|
+
p += 1;
|
|
16095
|
+
}
|
|
16096
|
+
return bytes;
|
|
16097
|
+
}
|
|
16098
|
+
|
|
16099
|
+
const MAX_HEAP = 16 * 1024;
|
|
16100
|
+
const WASM_FUNC_HASH_LENGTH = 4;
|
|
16101
|
+
const wasmMutex = new Mutex();
|
|
16102
|
+
const wasmModuleCache = new Map();
|
|
16103
|
+
function WASMInterface(binary, hashLength) {
|
|
16104
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
16105
|
+
let wasmInstance = null;
|
|
16106
|
+
let memoryView = null;
|
|
16107
|
+
let initialized = false;
|
|
16108
|
+
if (typeof WebAssembly === 'undefined') {
|
|
16109
|
+
throw new Error('WebAssembly is not supported in this environment!');
|
|
16110
|
+
}
|
|
16111
|
+
const writeMemory = (data, offset = 0) => {
|
|
16112
|
+
memoryView.set(data, offset);
|
|
16113
|
+
};
|
|
16114
|
+
const getMemory = () => memoryView;
|
|
16115
|
+
const getExports = () => wasmInstance.exports;
|
|
16116
|
+
const setMemorySize = (totalSize) => {
|
|
16117
|
+
wasmInstance.exports.Hash_SetMemorySize(totalSize);
|
|
16118
|
+
const arrayOffset = wasmInstance.exports.Hash_GetBuffer();
|
|
16119
|
+
const memoryBuffer = wasmInstance.exports.memory.buffer;
|
|
16120
|
+
memoryView = new Uint8Array(memoryBuffer, arrayOffset, totalSize);
|
|
16121
|
+
};
|
|
16122
|
+
const getStateSize = () => {
|
|
16123
|
+
const view = new DataView(wasmInstance.exports.memory.buffer);
|
|
16124
|
+
const stateSize = view.getUint32(wasmInstance.exports.STATE_SIZE, true);
|
|
16125
|
+
return stateSize;
|
|
16126
|
+
};
|
|
16127
|
+
const loadWASMPromise = wasmMutex.dispatch(() => __awaiter(this, void 0, void 0, function* () {
|
|
16128
|
+
if (!wasmModuleCache.has(binary.name)) {
|
|
16129
|
+
const asm = decodeBase64(binary.data);
|
|
16130
|
+
const promise = WebAssembly.compile(asm);
|
|
16131
|
+
wasmModuleCache.set(binary.name, promise);
|
|
16132
|
+
}
|
|
16133
|
+
const module = yield wasmModuleCache.get(binary.name);
|
|
16134
|
+
wasmInstance = yield WebAssembly.instantiate(module, {
|
|
16135
|
+
// env: {
|
|
16136
|
+
// emscripten_memcpy_big: (dest, src, num) => {
|
|
16137
|
+
// const memoryBuffer = wasmInstance.exports.memory.buffer;
|
|
16138
|
+
// const memView = new Uint8Array(memoryBuffer, 0);
|
|
16139
|
+
// memView.set(memView.subarray(src, src + num), dest);
|
|
16140
|
+
// },
|
|
16141
|
+
// print_memory: (offset, len) => {
|
|
16142
|
+
// const memoryBuffer = wasmInstance.exports.memory.buffer;
|
|
16143
|
+
// const memView = new Uint8Array(memoryBuffer, 0);
|
|
16144
|
+
// console.log('print_int32', memView.subarray(offset, offset + len));
|
|
16145
|
+
// },
|
|
16146
|
+
// },
|
|
16147
|
+
});
|
|
16148
|
+
// wasmInstance.exports._start();
|
|
16149
|
+
}));
|
|
16150
|
+
const setupInterface = () => __awaiter(this, void 0, void 0, function* () {
|
|
16151
|
+
if (!wasmInstance) {
|
|
16152
|
+
yield loadWASMPromise;
|
|
16153
|
+
}
|
|
16154
|
+
const arrayOffset = wasmInstance.exports.Hash_GetBuffer();
|
|
16155
|
+
const memoryBuffer = wasmInstance.exports.memory.buffer;
|
|
16156
|
+
memoryView = new Uint8Array(memoryBuffer, arrayOffset, MAX_HEAP);
|
|
16157
|
+
});
|
|
16158
|
+
const init = (bits = null) => {
|
|
16159
|
+
initialized = true;
|
|
16160
|
+
wasmInstance.exports.Hash_Init(bits);
|
|
16161
|
+
};
|
|
16162
|
+
const updateUInt8Array = (data) => {
|
|
16163
|
+
let read = 0;
|
|
16164
|
+
while (read < data.length) {
|
|
16165
|
+
const chunk = data.subarray(read, read + MAX_HEAP);
|
|
16166
|
+
read += chunk.length;
|
|
16167
|
+
memoryView.set(chunk);
|
|
16168
|
+
wasmInstance.exports.Hash_Update(chunk.length);
|
|
16169
|
+
}
|
|
16170
|
+
};
|
|
16171
|
+
const update = (data) => {
|
|
16172
|
+
if (!initialized) {
|
|
16173
|
+
throw new Error('update() called before init()');
|
|
16174
|
+
}
|
|
16175
|
+
const Uint8Buffer = getUInt8Buffer(data);
|
|
16176
|
+
updateUInt8Array(Uint8Buffer);
|
|
16177
|
+
};
|
|
16178
|
+
const digestChars = new Uint8Array(hashLength * 2);
|
|
16179
|
+
const digest = (outputType, padding = null) => {
|
|
16180
|
+
if (!initialized) {
|
|
16181
|
+
throw new Error('digest() called before init()');
|
|
16182
|
+
}
|
|
16183
|
+
initialized = false;
|
|
16184
|
+
wasmInstance.exports.Hash_Final(padding);
|
|
16185
|
+
if (outputType === 'binary') {
|
|
16186
|
+
// the data is copied to allow GC of the original memory object
|
|
16187
|
+
return memoryView.slice(0, hashLength);
|
|
16188
|
+
}
|
|
16189
|
+
return getDigestHex(digestChars, memoryView, hashLength);
|
|
16190
|
+
};
|
|
16191
|
+
const save = () => {
|
|
16192
|
+
if (!initialized) {
|
|
16193
|
+
throw new Error('save() can only be called after init() and before digest()');
|
|
16194
|
+
}
|
|
16195
|
+
const stateOffset = wasmInstance.exports.Hash_GetState();
|
|
16196
|
+
const stateLength = getStateSize();
|
|
16197
|
+
const memoryBuffer = wasmInstance.exports.memory.buffer;
|
|
16198
|
+
const internalState = new Uint8Array(memoryBuffer, stateOffset, stateLength);
|
|
16199
|
+
// prefix is 4 bytes from SHA1 hash of the WASM binary
|
|
16200
|
+
// it is used to detect incompatible internal states between different versions of hash-wasm
|
|
16201
|
+
const prefixedState = new Uint8Array(WASM_FUNC_HASH_LENGTH + stateLength);
|
|
16202
|
+
writeHexToUInt8(prefixedState, binary.hash);
|
|
16203
|
+
prefixedState.set(internalState, WASM_FUNC_HASH_LENGTH);
|
|
16204
|
+
return prefixedState;
|
|
16205
|
+
};
|
|
16206
|
+
const load = (state) => {
|
|
16207
|
+
if (!(state instanceof Uint8Array)) {
|
|
16208
|
+
throw new Error('load() expects an Uint8Array generated by save()');
|
|
16209
|
+
}
|
|
16210
|
+
const stateOffset = wasmInstance.exports.Hash_GetState();
|
|
16211
|
+
const stateLength = getStateSize();
|
|
16212
|
+
const overallLength = WASM_FUNC_HASH_LENGTH + stateLength;
|
|
16213
|
+
const memoryBuffer = wasmInstance.exports.memory.buffer;
|
|
16214
|
+
if (state.length !== overallLength) {
|
|
16215
|
+
throw new Error(`Bad state length (expected ${overallLength} bytes, got ${state.length})`);
|
|
16216
|
+
}
|
|
16217
|
+
if (!hexStringEqualsUInt8(binary.hash, state.subarray(0, WASM_FUNC_HASH_LENGTH))) {
|
|
16218
|
+
throw new Error('This state was written by an incompatible hash implementation');
|
|
16219
|
+
}
|
|
16220
|
+
const internalState = state.subarray(WASM_FUNC_HASH_LENGTH);
|
|
16221
|
+
new Uint8Array(memoryBuffer, stateOffset, stateLength).set(internalState);
|
|
16222
|
+
initialized = true;
|
|
16223
|
+
};
|
|
16224
|
+
const isDataShort = (data) => {
|
|
16225
|
+
if (typeof data === 'string') {
|
|
16226
|
+
// worst case is 4 bytes / char
|
|
16227
|
+
return data.length < MAX_HEAP / 4;
|
|
16228
|
+
}
|
|
16229
|
+
return data.byteLength < MAX_HEAP;
|
|
16230
|
+
};
|
|
16231
|
+
let canSimplify = isDataShort;
|
|
16232
|
+
switch (binary.name) {
|
|
16233
|
+
case 'argon2':
|
|
16234
|
+
case 'scrypt':
|
|
16235
|
+
canSimplify = () => true;
|
|
16236
|
+
break;
|
|
16237
|
+
case 'blake2b':
|
|
16238
|
+
case 'blake2s':
|
|
16239
|
+
// if there is a key at blake2 then cannot simplify
|
|
16240
|
+
canSimplify = (data, initParam) => initParam <= 512 && isDataShort(data);
|
|
16241
|
+
break;
|
|
16242
|
+
case 'blake3':
|
|
16243
|
+
// if there is a key at blake3 then cannot simplify
|
|
16244
|
+
canSimplify = (data, initParam) => initParam === 0 && isDataShort(data);
|
|
16245
|
+
break;
|
|
16246
|
+
case 'xxhash64': // cannot simplify
|
|
16247
|
+
case 'xxhash3':
|
|
16248
|
+
case 'xxhash128':
|
|
16249
|
+
canSimplify = () => false;
|
|
16250
|
+
break;
|
|
16251
|
+
}
|
|
16252
|
+
// shorthand for (init + update + digest) for better performance
|
|
16253
|
+
const calculate = (data, initParam = null, digestParam = null) => {
|
|
16254
|
+
if (!canSimplify(data, initParam)) {
|
|
16255
|
+
init(initParam);
|
|
16256
|
+
update(data);
|
|
16257
|
+
return digest('hex', digestParam);
|
|
16258
|
+
}
|
|
16259
|
+
const buffer = getUInt8Buffer(data);
|
|
16260
|
+
memoryView.set(buffer);
|
|
16261
|
+
wasmInstance.exports.Hash_Calculate(buffer.length, initParam, digestParam);
|
|
16262
|
+
return getDigestHex(digestChars, memoryView, hashLength);
|
|
16263
|
+
};
|
|
16264
|
+
yield setupInterface();
|
|
16265
|
+
return {
|
|
16266
|
+
getMemory,
|
|
16267
|
+
writeMemory,
|
|
16268
|
+
getExports,
|
|
16269
|
+
setMemorySize,
|
|
16270
|
+
init,
|
|
16271
|
+
update,
|
|
16272
|
+
digest,
|
|
16273
|
+
save,
|
|
16274
|
+
load,
|
|
16275
|
+
calculate,
|
|
16276
|
+
hashLength,
|
|
16277
|
+
};
|
|
16278
|
+
});
|
|
16279
|
+
}
|
|
16280
|
+
|
|
16281
|
+
new Mutex();
|
|
16200
16282
|
|
|
16201
|
-
|
|
16202
|
-
if (sigR.length === 33 && sigR[0] === 0x00) sigR = sigR.subarray(1);
|
|
16203
|
-
if (sigR.length > 32) return 1
|
|
16283
|
+
new Mutex();
|
|
16204
16284
|
|
|
16205
|
-
|
|
16206
|
-
if (sigS.length === 33 && sigS[0] === 0x00) sigS = sigS.slice(1);
|
|
16207
|
-
if (sigS.length > 32) throw new Error('S length is too long')
|
|
16285
|
+
new Mutex();
|
|
16208
16286
|
|
|
16209
|
-
|
|
16210
|
-
if (r.cmp(ecparams.n) >= 0) r = new BN(0);
|
|
16287
|
+
new Mutex();
|
|
16211
16288
|
|
|
16212
|
-
|
|
16213
|
-
if (s.cmp(ecparams.n) >= 0) s = new BN(0);
|
|
16289
|
+
new Mutex();
|
|
16214
16290
|
|
|
16215
|
-
|
|
16216
|
-
output.set(s.toArrayLike(Uint8Array, 'be', 32), 32);
|
|
16291
|
+
new Mutex();
|
|
16217
16292
|
|
|
16218
|
-
|
|
16219
|
-
},
|
|
16293
|
+
new Mutex();
|
|
16220
16294
|
|
|
16221
|
-
|
|
16222
|
-
if (noncefn) {
|
|
16223
|
-
const _noncefn = noncefn;
|
|
16224
|
-
noncefn = (counter) => {
|
|
16225
|
-
const nonce = _noncefn(message, seckey, null, data, counter);
|
|
16295
|
+
new Mutex();
|
|
16226
16296
|
|
|
16227
|
-
|
|
16228
|
-
if (!isValid) throw new Error('This is the way')
|
|
16297
|
+
new Mutex();
|
|
16229
16298
|
|
|
16230
|
-
|
|
16231
|
-
|
|
16232
|
-
|
|
16299
|
+
var name$b = "sha3";
|
|
16300
|
+
var data$b = "AGFzbQEAAAABFARgAAF/YAF/AGACf38AYAN/f38AAwgHAAEBAgEAAwUEAQECAgYOAn8BQZCNBQt/AEGACAsHcAgGbWVtb3J5AgAOSGFzaF9HZXRCdWZmZXIAAAlIYXNoX0luaXQAAQtIYXNoX1VwZGF0ZQACCkhhc2hfRmluYWwABA1IYXNoX0dldFN0YXRlAAUOSGFzaF9DYWxjdWxhdGUABgpTVEFURV9TSVpFAwEKqBwHBQBBgAoL1wMAQQBCADcDgI0BQQBCADcD+IwBQQBCADcD8IwBQQBCADcD6IwBQQBCADcD4IwBQQBCADcD2IwBQQBCADcD0IwBQQBCADcDyIwBQQBCADcDwIwBQQBCADcDuIwBQQBCADcDsIwBQQBCADcDqIwBQQBCADcDoIwBQQBCADcDmIwBQQBCADcDkIwBQQBCADcDiIwBQQBCADcDgIwBQQBCADcD+IsBQQBCADcD8IsBQQBCADcD6IsBQQBCADcD4IsBQQBCADcD2IsBQQBCADcD0IsBQQBCADcDyIsBQQBCADcDwIsBQQBCADcDuIsBQQBCADcDsIsBQQBCADcDqIsBQQBCADcDoIsBQQBCADcDmIsBQQBCADcDkIsBQQBCADcDiIsBQQBCADcDgIsBQQBCADcD+IoBQQBCADcD8IoBQQBCADcD6IoBQQBCADcD4IoBQQBCADcD2IoBQQBCADcD0IoBQQBCADcDyIoBQQBCADcDwIoBQQBCADcDuIoBQQBCADcDsIoBQQBCADcDqIoBQQBCADcDoIoBQQBCADcDmIoBQQBCADcDkIoBQQBCADcDiIoBQQBCADcDgIoBQQBBwAwgAEEBdGtBA3Y2AoyNAUEAQQA2AoiNAQuMAwEIfwJAQQAoAoiNASIBQQBIDQBBACABIABqQQAoAoyNASICcDYCiI0BAkACQCABDQBBgAohAwwBCwJAIAIgAWsiBCAAIAQgAEkbIgNFDQAgA0EDcSEFQQAhBgJAIANBBEkNACABQYCKAWohByADQXxxIQhBACEGA0AgByAGaiIDQcgBaiAGQYAKai0AADoAACADQckBaiAGQYEKai0AADoAACADQcoBaiAGQYIKai0AADoAACADQcsBaiAGQYMKai0AADoAACAIIAZBBGoiBkcNAAsLIAVFDQAgAUHIiwFqIQMDQCADIAZqIAZBgApqLQAAOgAAIAZBAWohBiAFQX9qIgUNAAsLIAQgAEsNAUHIiwEgAhADIAAgBGshACAEQYAKaiEDCwJAIAAgAkkNAANAIAMgAhADIAMgAmohAyAAIAJrIgAgAk8NAAsLIABFDQBBACECQcgBIQYDQCAGQYCKAWogAyAGakG4fmotAAA6AAAgBkEBaiEGIAAgAkEBaiICQf8BcUsNAAsLC+QLAS1+IAApA0AhAkEAKQPAigEhAyAAKQM4IQRBACkDuIoBIQUgACkDMCEGQQApA7CKASEHIAApAyghCEEAKQOoigEhCSAAKQMgIQpBACkDoIoBIQsgACkDGCEMQQApA5iKASENIAApAxAhDkEAKQOQigEhDyAAKQMIIRBBACkDiIoBIREgACkDACESQQApA4CKASETQQApA8iKASEUAkACQCABQcgASw0AQQApA9CKASEVQQApA+CKASEWQQApA9iKASEXDAELQQApA+CKASAAKQNghSEWQQApA9iKASAAKQNYhSEXQQApA9CKASAAKQNQhSEVIBQgACkDSIUhFCABQekASQ0AQQBBACkD6IoBIAApA2iFNwPoigFBAEEAKQPwigEgACkDcIU3A/CKAUEAQQApA/iKASAAKQN4hTcD+IoBQQBBACkDgIsBIAApA4ABhTcDgIsBIAFBiQFJDQBBAEEAKQOIiwEgACkDiAGFNwOIiwELIAMgAoUhGCAFIASFIRkgByAGhSEHIAkgCIUhCCALIAqFIRogDSAMhSEJIA8gDoUhCiARIBCFIQsgEyAShSEMQQApA7iLASESQQApA5CLASETQQApA+iKASEbQQApA6CLASEcQQApA/iKASENQQApA7CLASEdQQApA4iLASEOQQApA8CLASEPQQApA5iLASEeQQApA/CKASEQQQApA6iLASERQQApA4CLASEfQcB+IQADQCAaIAcgC4UgF4UgH4UgEYVCAYmFIBSFIBCFIB6FIA+FIQIgDCAZIAqFIBaFIA6FIB2FQgGJhSAIhSAVhSANhSAchSIDIAeFISAgCSAIIAyFIBWFIA2FIByFQgGJhSAYhSAbhSAThSAShSIEIA+FISEgGCAKIBQgGoUgEIUgHoUgD4VCAYmFIBmFIBaFIA6FIB2FIgWFQjeJIiIgCyAYIAmFIBuFIBOFIBKFQgGJhSAHhSAXhSAfhSARhSIGIAqFQj6JIiNCf4WDIAMgEYVCAokiJIUhDyANIAKFQimJIiUgBCAQhUIniSImQn+FgyAihSERIBIgBYVCOIkiEiAGIA6FQg+JIidCf4WDIAMgF4VCCokiKIUhDiAEIBqFQhuJIikgKCAIIAKFQiSJIipCf4WDhSENIAYgGYVCBokiKyADIAuFQgGJIixCf4WDIBwgAoVCEokiLYUhECArIAQgHoVCCIkiLiAbIAWFQhmJIhtCf4WDhSEXIAYgHYVCPYkiGSAEIBSFQhSJIgQgCSAFhUIciSIIQn+Fg4UhFCAIIBlCf4WDIAMgH4VCLYkiA4UhGCAZIANCf4WDIBUgAoVCA4kiCYUhGSAEIAMgCUJ/hYOFIQcgCSAEQn+FgyAIhSEIIAwgAoUiAiAhQg6JIgNCf4WDIBMgBYVCFYkiBIUhCSAGIBaFQiuJIgUgAyAEQn+Fg4UhCiAEIAVCf4WDICBCLIkiBIUhCyAAQdAJaikDACAFIARCf4WDhSAChSEMICcgKEJ/hYMgKoUiBSEfIAMgBCACQn+Fg4UiAiEaICogKUJ/hYMgEoUiAyEeIC0gLkJ/hYMgG4UiBCEWICYgJCAlQn+Fg4UiBiEdIBsgK0J/hYMgLIUiKCEVICMgJiAiQn+Fg4UiIiEcIC4gLCAtQn+Fg4UiJiEbICcgKSASQn+Fg4UiJyETICMgJEJ/hYMgJYUiIyESIABBCGoiAA0AC0EAIBE3A6iLAUEAIAU3A4CLAUEAIBc3A9iKAUEAIAc3A7CKAUEAIAs3A4iKAUEAIA83A8CLAUEAIAM3A5iLAUEAIBA3A/CKAUEAIBQ3A8iKAUEAIAI3A6CKAUEAIAY3A7CLAUEAIA43A4iLAUEAIAQ3A+CKAUEAIBk3A7iKAUEAIAo3A5CKAUEAICI3A6CLAUEAIA03A/iKAUEAICg3A9CKAUEAIAg3A6iKAUEAIAw3A4CKAUEAICM3A7iLAUEAICc3A5CLAUEAICY3A+iKAUEAIBg3A8CKAUEAIAk3A5iKAQv4AgEFf0HkAEEAKAKMjQEiAUEBdmshAgJAQQAoAoiNASIDQQBIDQAgASEEAkAgASADRg0AIANByIsBaiEFQQAhAwNAIAUgA2pBADoAACADQQFqIgMgAUEAKAKIjQEiBGtJDQALCyAEQciLAWoiAyADLQAAIAByOgAAIAFBx4sBaiIDIAMtAABBgAFyOgAAQciLASABEANBAEGAgICAeDYCiI0BCwJAIAJBBEkNACACQQJ2IgNBA3EhBUEAIQQCQCADQX9qQQNJDQAgA0H8////A3EhAUEAIQNBACEEA0AgA0GACmogA0GAigFqKAIANgIAIANBhApqIANBhIoBaigCADYCACADQYgKaiADQYiKAWooAgA2AgAgA0GMCmogA0GMigFqKAIANgIAIANBEGohAyABIARBBGoiBEcNAAsLIAVFDQAgBUECdCEBIARBAnQhAwNAIANBgApqIANBgIoBaigCADYCACADQQRqIQMgAUF8aiIBDQALCwsGAEGAigEL0QYBA39BAEIANwOAjQFBAEIANwP4jAFBAEIANwPwjAFBAEIANwPojAFBAEIANwPgjAFBAEIANwPYjAFBAEIANwPQjAFBAEIANwPIjAFBAEIANwPAjAFBAEIANwO4jAFBAEIANwOwjAFBAEIANwOojAFBAEIANwOgjAFBAEIANwOYjAFBAEIANwOQjAFBAEIANwOIjAFBAEIANwOAjAFBAEIANwP4iwFBAEIANwPwiwFBAEIANwPoiwFBAEIANwPgiwFBAEIANwPYiwFBAEIANwPQiwFBAEIANwPIiwFBAEIANwPAiwFBAEIANwO4iwFBAEIANwOwiwFBAEIANwOoiwFBAEIANwOgiwFBAEIANwOYiwFBAEIANwOQiwFBAEIANwOIiwFBAEIANwOAiwFBAEIANwP4igFBAEIANwPwigFBAEIANwPoigFBAEIANwPgigFBAEIANwPYigFBAEIANwPQigFBAEIANwPIigFBAEIANwPAigFBAEIANwO4igFBAEIANwOwigFBAEIANwOoigFBAEIANwOgigFBAEIANwOYigFBAEIANwOQigFBAEIANwOIigFBAEIANwOAigFBAEHADCABQQF0a0EDdjYCjI0BQQBBADYCiI0BIAAQAkHkAEEAKAKMjQEiAEEBdmshAwJAQQAoAoiNASIBQQBIDQAgACEEAkAgACABRg0AIAFByIsBaiEFQQAhAQNAIAUgAWpBADoAACABQQFqIgEgAEEAKAKIjQEiBGtJDQALCyAEQciLAWoiASABLQAAIAJyOgAAIABBx4sBaiIBIAEtAABBgAFyOgAAQciLASAAEANBAEGAgICAeDYCiI0BCwJAIANBBEkNACADQQJ2IgFBA3EhBUEAIQQCQCABQX9qQQNJDQAgAUH8////A3EhAEEAIQFBACEEA0AgAUGACmogAUGAigFqKAIANgIAIAFBhApqIAFBhIoBaigCADYCACABQYgKaiABQYiKAWooAgA2AgAgAUGMCmogAUGMigFqKAIANgIAIAFBEGohASAAIARBBGoiBEcNAAsLIAVFDQAgBUECdCEAIARBAnQhAQNAIAFBgApqIAFBgIoBaigCADYCACABQQRqIQEgAEF8aiIADQALCwsL2AEBAEGACAvQAZABAAAAAAAAAAAAAAAAAAABAAAAAAAAAIKAAAAAAAAAioAAAAAAAIAAgACAAAAAgIuAAAAAAAAAAQAAgAAAAACBgACAAAAAgAmAAAAAAACAigAAAAAAAACIAAAAAAAAAAmAAIAAAAAACgAAgAAAAACLgACAAAAAAIsAAAAAAACAiYAAAAAAAIADgAAAAAAAgAKAAAAAAACAgAAAAAAAAIAKgAAAAAAAAAoAAIAAAACAgYAAgAAAAICAgAAAAAAAgAEAAIAAAAAACIAAgAAAAIA=";
|
|
16301
|
+
var hash$b = "f2f6f5b2";
|
|
16302
|
+
var wasmJson$b = {
|
|
16303
|
+
name: name$b,
|
|
16304
|
+
data: data$b,
|
|
16305
|
+
hash: hash$b
|
|
16306
|
+
};
|
|
16233
16307
|
|
|
16234
|
-
|
|
16235
|
-
if (d.cmp(ecparams.n) >= 0 || d.isZero()) return 1
|
|
16308
|
+
new Mutex();
|
|
16236
16309
|
|
|
16237
|
-
|
|
16238
|
-
|
|
16239
|
-
|
|
16240
|
-
|
|
16241
|
-
return 1
|
|
16310
|
+
new Mutex();
|
|
16311
|
+
function validateBits(bits) {
|
|
16312
|
+
if (![224, 256, 384, 512].includes(bits)) {
|
|
16313
|
+
return new Error('Invalid variant! Valid values: 224, 256, 384, 512');
|
|
16242
16314
|
}
|
|
16243
|
-
|
|
16244
|
-
|
|
16245
|
-
|
|
16246
|
-
|
|
16247
|
-
|
|
16248
|
-
|
|
16249
|
-
|
|
16250
|
-
|
|
16251
|
-
|
|
16252
|
-
const sigObj = { r: sig.subarray(0, 32), s: sig.subarray(32, 64) };
|
|
16253
|
-
|
|
16254
|
-
const sigr = new BN(sigObj.r);
|
|
16255
|
-
const sigs = new BN(sigObj.s);
|
|
16256
|
-
if (sigr.cmp(ecparams.n) >= 0 || sigs.cmp(ecparams.n) >= 0) return 1
|
|
16257
|
-
if (sigs.cmp(ec.nh) === 1 || sigr.isZero() || sigs.isZero()) return 3
|
|
16258
|
-
|
|
16259
|
-
const pair = loadPublicKey(pubkey);
|
|
16260
|
-
if (pair === null) return 2
|
|
16261
|
-
|
|
16262
|
-
const point = pair.getPublic();
|
|
16263
|
-
const isValid = ec.verify(msg32, sigObj, point);
|
|
16264
|
-
return isValid ? 0 : 3
|
|
16265
|
-
},
|
|
16266
|
-
|
|
16267
|
-
ecdsaRecover (output, sig, recid, msg32) {
|
|
16268
|
-
const sigObj = { r: sig.slice(0, 32), s: sig.slice(32, 64) };
|
|
16269
|
-
|
|
16270
|
-
const sigr = new BN(sigObj.r);
|
|
16271
|
-
const sigs = new BN(sigObj.s);
|
|
16272
|
-
if (sigr.cmp(ecparams.n) >= 0 || sigs.cmp(ecparams.n) >= 0) return 1
|
|
16273
|
-
|
|
16274
|
-
if (sigr.isZero() || sigs.isZero()) return 2
|
|
16275
|
-
|
|
16276
|
-
// Can throw `throw new Error('Unable to find sencond key candinate');`
|
|
16277
|
-
let point;
|
|
16278
|
-
try {
|
|
16279
|
-
point = ec.recoverPubKey(msg32, sigObj, recid);
|
|
16280
|
-
} catch (err) {
|
|
16281
|
-
return 2
|
|
16315
|
+
return null;
|
|
16316
|
+
}
|
|
16317
|
+
/**
|
|
16318
|
+
* Creates a new Keccak hash instance
|
|
16319
|
+
* @param bits Number of output bits. Valid values: 224, 256, 384, 512
|
|
16320
|
+
*/
|
|
16321
|
+
function createKeccak(bits = 512) {
|
|
16322
|
+
if (validateBits(bits)) {
|
|
16323
|
+
return Promise.reject(validateBits(bits));
|
|
16282
16324
|
}
|
|
16325
|
+
const outputSize = bits / 8;
|
|
16326
|
+
return WASMInterface(wasmJson$b, outputSize).then((wasm) => {
|
|
16327
|
+
wasm.init(bits);
|
|
16328
|
+
const obj = {
|
|
16329
|
+
init: () => { wasm.init(bits); return obj; },
|
|
16330
|
+
update: (data) => { wasm.update(data); return obj; },
|
|
16331
|
+
digest: (outputType) => wasm.digest(outputType, 0x01),
|
|
16332
|
+
save: () => wasm.save(),
|
|
16333
|
+
load: (data) => { wasm.load(data); return obj; },
|
|
16334
|
+
blockSize: 200 - 2 * outputSize,
|
|
16335
|
+
digestSize: outputSize,
|
|
16336
|
+
};
|
|
16337
|
+
return obj;
|
|
16338
|
+
});
|
|
16339
|
+
}
|
|
16283
16340
|
|
|
16284
|
-
|
|
16285
|
-
|
|
16286
|
-
return 0
|
|
16287
|
-
},
|
|
16288
|
-
|
|
16289
|
-
ecdh (output, pubkey, seckey, data, hashfn, xbuf, ybuf) {
|
|
16290
|
-
const pair = loadPublicKey(pubkey);
|
|
16291
|
-
if (pair === null) return 1
|
|
16292
|
-
|
|
16293
|
-
const scalar = new BN(seckey);
|
|
16294
|
-
if (scalar.cmp(ecparams.n) >= 0 || scalar.isZero()) return 2
|
|
16295
|
-
|
|
16296
|
-
const point = pair.getPublic().mul(scalar);
|
|
16341
|
+
new Mutex();
|
|
16297
16342
|
|
|
16298
|
-
|
|
16299
|
-
const data = point.encode(null, true);
|
|
16300
|
-
const sha256 = ec.hash().update(data).digest();
|
|
16301
|
-
for (let i = 0; i < 32; ++i) output[i] = sha256[i];
|
|
16302
|
-
} else {
|
|
16303
|
-
if (!xbuf) xbuf = new Uint8Array(32);
|
|
16304
|
-
const x = point.getX().toArray('be', 32);
|
|
16305
|
-
for (let i = 0; i < 32; ++i) xbuf[i] = x[i];
|
|
16343
|
+
new Mutex();
|
|
16306
16344
|
|
|
16307
|
-
|
|
16308
|
-
const y = point.getY().toArray('be', 32);
|
|
16309
|
-
|
|
16345
|
+
var name$9 = "sha512";
|
|
16346
|
+
var data$9 = "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";
|
|
16347
|
+
var hash$9 = "cdd57f6a";
|
|
16348
|
+
var wasmJson$9 = {
|
|
16349
|
+
name: name$9,
|
|
16350
|
+
data: data$9,
|
|
16351
|
+
hash: hash$9
|
|
16352
|
+
};
|
|
16310
16353
|
|
|
16311
|
-
|
|
16354
|
+
new Mutex();
|
|
16312
16355
|
|
|
16313
|
-
|
|
16314
|
-
|
|
16356
|
+
new Mutex();
|
|
16357
|
+
/**
|
|
16358
|
+
* Creates a new SHA-2 (SHA-512) hash instance
|
|
16359
|
+
*/
|
|
16360
|
+
function createSHA512() {
|
|
16361
|
+
return WASMInterface(wasmJson$9, 64).then((wasm) => {
|
|
16362
|
+
wasm.init(512);
|
|
16363
|
+
const obj = {
|
|
16364
|
+
init: () => { wasm.init(512); return obj; },
|
|
16365
|
+
update: (data) => { wasm.update(data); return obj; },
|
|
16366
|
+
digest: (outputType) => wasm.digest(outputType),
|
|
16367
|
+
save: () => wasm.save(),
|
|
16368
|
+
load: (data) => { wasm.load(data); return obj; },
|
|
16369
|
+
blockSize: 128,
|
|
16370
|
+
digestSize: 64,
|
|
16371
|
+
};
|
|
16372
|
+
return obj;
|
|
16373
|
+
});
|
|
16374
|
+
}
|
|
16315
16375
|
|
|
16316
|
-
|
|
16317
|
-
}
|
|
16376
|
+
new Mutex();
|
|
16318
16377
|
|
|
16319
|
-
|
|
16320
|
-
}
|
|
16321
|
-
};
|
|
16378
|
+
new Mutex();
|
|
16322
16379
|
|
|
16323
|
-
|
|
16380
|
+
new Mutex();
|
|
16324
16381
|
|
|
16325
|
-
|
|
16382
|
+
new Mutex();
|
|
16326
16383
|
|
|
16327
|
-
|
|
16328
|
-
|
|
16329
|
-
|
|
16330
|
-
|
|
16331
|
-
|
|
16332
|
-
|
|
16333
|
-
|
|
16334
|
-
version: 0,
|
|
16335
|
-
unspent: 0x1fa443d7 // ounsp
|
|
16336
|
-
},
|
|
16337
|
-
wif: 0x7D,
|
|
16338
|
-
multiCodec: 0x7c4,
|
|
16339
|
-
bip32: { public: 0x13BBF2D5, private: 0x13BBCBC5 }
|
|
16340
|
-
};
|
|
16341
|
-
const bitcoinTestnet = {
|
|
16342
|
-
messagePrefix: '\x18Bitcoin Signed Message:\n',
|
|
16343
|
-
version: 1,
|
|
16344
|
-
bech32: 'tb',
|
|
16345
|
-
pubKeyHash: 0x6f,
|
|
16346
|
-
scriptHash: 0xc4,
|
|
16347
|
-
wif: 0xef,
|
|
16348
|
-
bip32: {
|
|
16349
|
-
public: 0x043587cf,
|
|
16350
|
-
private: 0x04358394
|
|
16351
|
-
},
|
|
16352
|
-
multiCodec: 0
|
|
16353
|
-
};
|
|
16354
|
-
var testnets = {
|
|
16355
|
-
'leofcoin:olivia': leofcoinOlivia,
|
|
16356
|
-
'bitcoin:testnet': bitcoinTestnet
|
|
16384
|
+
var name$4 = "ripemd160";
|
|
16385
|
+
var data$4 = "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";
|
|
16386
|
+
var hash$4 = "c089a7ca";
|
|
16387
|
+
var wasmJson$4 = {
|
|
16388
|
+
name: name$4,
|
|
16389
|
+
data: data$4,
|
|
16390
|
+
hash: hash$4
|
|
16357
16391
|
};
|
|
16358
16392
|
|
|
16359
|
-
|
|
16360
|
-
// usage:
|
|
16361
|
-
// networks['bitcoin']['testnet']
|
|
16362
|
-
// networks.bitcoin.testnet
|
|
16393
|
+
new Mutex();
|
|
16363
16394
|
/**
|
|
16364
|
-
*
|
|
16365
|
-
* @return {messagePrefix, pubKeyHash, scriptHash, wif, bip32}
|
|
16395
|
+
* Creates a new RIPEMD-160 hash instance
|
|
16366
16396
|
*/
|
|
16367
|
-
|
|
16368
|
-
|
|
16369
|
-
|
|
16370
|
-
|
|
16371
|
-
|
|
16372
|
-
|
|
16373
|
-
|
|
16374
|
-
|
|
16375
|
-
|
|
16376
|
-
|
|
16377
|
-
|
|
16378
|
-
|
|
16379
|
-
|
|
16380
|
-
|
|
16381
|
-
|
|
16382
|
-
|
|
16383
|
-
|
|
16384
|
-
|
|
16385
|
-
|
|
16386
|
-
|
|
16387
|
-
|
|
16388
|
-
|
|
16389
|
-
|
|
16390
|
-
|
|
16391
|
-
|
|
16392
|
-
|
|
16393
|
-
|
|
16394
|
-
|
|
16395
|
-
|
|
16396
|
-
};
|
|
16397
|
-
const
|
|
16398
|
-
|
|
16399
|
-
|
|
16400
|
-
|
|
16401
|
-
|
|
16402
|
-
|
|
16403
|
-
|
|
16404
|
-
|
|
16405
|
-
|
|
16406
|
-
|
|
16407
|
-
|
|
16408
|
-
|
|
16409
|
-
|
|
16410
|
-
|
|
16411
|
-
|
|
16412
|
-
|
|
16413
|
-
|
|
16414
|
-
|
|
16415
|
-
|
|
16416
|
-
|
|
16417
|
-
|
|
16418
|
-
|
|
16419
|
-
|
|
16420
|
-
|
|
16421
|
-
|
|
16397
|
+
function createRIPEMD160() {
|
|
16398
|
+
return WASMInterface(wasmJson$4, 20).then((wasm) => {
|
|
16399
|
+
wasm.init();
|
|
16400
|
+
const obj = {
|
|
16401
|
+
init: () => { wasm.init(); return obj; },
|
|
16402
|
+
update: (data) => { wasm.update(data); return obj; },
|
|
16403
|
+
digest: (outputType) => wasm.digest(outputType),
|
|
16404
|
+
save: () => wasm.save(),
|
|
16405
|
+
load: (data) => { wasm.load(data); return obj; },
|
|
16406
|
+
blockSize: 64,
|
|
16407
|
+
digestSize: 20,
|
|
16408
|
+
};
|
|
16409
|
+
return obj;
|
|
16410
|
+
});
|
|
16411
|
+
}
|
|
16412
|
+
|
|
16413
|
+
function calculateKeyBuffer(hasher, key) {
|
|
16414
|
+
const { blockSize } = hasher;
|
|
16415
|
+
const buf = getUInt8Buffer(key);
|
|
16416
|
+
if (buf.length > blockSize) {
|
|
16417
|
+
hasher.update(buf);
|
|
16418
|
+
const uintArr = hasher.digest('binary');
|
|
16419
|
+
hasher.init();
|
|
16420
|
+
return uintArr;
|
|
16421
|
+
}
|
|
16422
|
+
return new Uint8Array(buf.buffer, buf.byteOffset, buf.length);
|
|
16423
|
+
}
|
|
16424
|
+
function calculateHmac(hasher, key) {
|
|
16425
|
+
hasher.init();
|
|
16426
|
+
const { blockSize } = hasher;
|
|
16427
|
+
const keyBuf = calculateKeyBuffer(hasher, key);
|
|
16428
|
+
const keyBuffer = new Uint8Array(blockSize);
|
|
16429
|
+
keyBuffer.set(keyBuf);
|
|
16430
|
+
const opad = new Uint8Array(blockSize);
|
|
16431
|
+
for (let i = 0; i < blockSize; i++) {
|
|
16432
|
+
const v = keyBuffer[i];
|
|
16433
|
+
opad[i] = v ^ 0x5C;
|
|
16434
|
+
keyBuffer[i] = v ^ 0x36;
|
|
16435
|
+
}
|
|
16436
|
+
hasher.update(keyBuffer);
|
|
16437
|
+
const obj = {
|
|
16438
|
+
init: () => {
|
|
16439
|
+
hasher.init();
|
|
16440
|
+
hasher.update(keyBuffer);
|
|
16441
|
+
return obj;
|
|
16442
|
+
},
|
|
16443
|
+
update: (data) => {
|
|
16444
|
+
hasher.update(data);
|
|
16445
|
+
return obj;
|
|
16446
|
+
},
|
|
16447
|
+
digest: ((outputType) => {
|
|
16448
|
+
const uintArr = hasher.digest('binary');
|
|
16449
|
+
hasher.init();
|
|
16450
|
+
hasher.update(opad);
|
|
16451
|
+
hasher.update(uintArr);
|
|
16452
|
+
return hasher.digest(outputType);
|
|
16453
|
+
}),
|
|
16454
|
+
save: () => {
|
|
16455
|
+
throw new Error('save() not supported');
|
|
16456
|
+
},
|
|
16457
|
+
load: () => {
|
|
16458
|
+
throw new Error('load() not supported');
|
|
16459
|
+
},
|
|
16460
|
+
blockSize: hasher.blockSize,
|
|
16461
|
+
digestSize: hasher.digestSize,
|
|
16462
|
+
};
|
|
16463
|
+
return obj;
|
|
16464
|
+
}
|
|
16422
16465
|
/**
|
|
16423
|
-
*
|
|
16424
|
-
* @return
|
|
16466
|
+
* Calculates HMAC hash
|
|
16467
|
+
* @param hash Hash algorithm to use. It has to be the return value of a function like createSHA1()
|
|
16468
|
+
* @param key Key (string, Buffer or TypedArray)
|
|
16425
16469
|
*/
|
|
16426
|
-
|
|
16427
|
-
|
|
16428
|
-
|
|
16429
|
-
|
|
16430
|
-
|
|
16431
|
-
}
|
|
16470
|
+
function createHMAC(hash, key) {
|
|
16471
|
+
if (!hash || !hash.then) {
|
|
16472
|
+
throw new Error('Invalid hash function is provided! Usage: createHMAC(createMD5(), "key").');
|
|
16473
|
+
}
|
|
16474
|
+
return hash.then((hasher) => calculateHmac(hasher, key));
|
|
16475
|
+
}
|
|
16476
|
+
|
|
16477
|
+
new Mutex();
|
|
16478
|
+
|
|
16479
|
+
new Mutex();
|
|
16432
16480
|
|
|
16433
16481
|
const encode$1 = (version, privateKey, compressed) => {
|
|
16434
16482
|
if (privateKey.length !== 32)
|
|
@@ -20216,7 +20264,7 @@ class Identity {
|
|
|
20216
20264
|
this.selectedAccount = new TextDecoder().decode(selected);
|
|
20217
20265
|
}
|
|
20218
20266
|
else {
|
|
20219
|
-
const importee = await import(/* webpackChunkName: "generate-account" */ './index-
|
|
20267
|
+
const importee = await import(/* webpackChunkName: "generate-account" */ './index-8868bdd8-0d28073e.js');
|
|
20220
20268
|
const { identity, accounts } = await importee.default(password, this.network);
|
|
20221
20269
|
await globalThis.accountStore.put('public', JSON.stringify({ walletId: identity.walletId }));
|
|
20222
20270
|
await globalThis.walletStore.put('version', String(1));
|
|
@@ -20312,17 +20360,20 @@ class Peernet {
|
|
|
20312
20360
|
/**
|
|
20313
20361
|
* @property {String} network - current network
|
|
20314
20362
|
*/
|
|
20315
|
-
this.network = options.network ||
|
|
20363
|
+
this.network = options.network || "leofcoin";
|
|
20316
20364
|
this.autoStart = options.autoStart === undefined ? true : options.autoStart;
|
|
20317
20365
|
this.stars = options.stars;
|
|
20318
|
-
const parts = this.network.split(
|
|
20319
|
-
this.networkVersion =
|
|
20366
|
+
const parts = this.network.split(":");
|
|
20367
|
+
this.networkVersion =
|
|
20368
|
+
options.networkVersion || parts.length > 1 ? parts[1] : "mainnet";
|
|
20320
20369
|
if (!options.storePrefix)
|
|
20321
|
-
options.storePrefix =
|
|
20370
|
+
options.storePrefix = "lfc";
|
|
20322
20371
|
if (!options.port)
|
|
20323
20372
|
options.port = 2000;
|
|
20324
20373
|
if (!options.root) {
|
|
20325
|
-
parts[1]
|
|
20374
|
+
parts[1]
|
|
20375
|
+
? (options.root = `.${parts[0]}/${parts[1]}`)
|
|
20376
|
+
: (options.root = `.${this.network}`);
|
|
20326
20377
|
}
|
|
20327
20378
|
globalThis.peernet = this;
|
|
20328
20379
|
this.bw = {
|
|
@@ -20342,7 +20393,15 @@ class Peernet {
|
|
|
20342
20393
|
return this.identity.accounts;
|
|
20343
20394
|
}
|
|
20344
20395
|
get defaultStores() {
|
|
20345
|
-
return [
|
|
20396
|
+
return [
|
|
20397
|
+
"account",
|
|
20398
|
+
"wallet",
|
|
20399
|
+
"block",
|
|
20400
|
+
"transaction",
|
|
20401
|
+
"chain",
|
|
20402
|
+
"data",
|
|
20403
|
+
"message",
|
|
20404
|
+
];
|
|
20346
20405
|
}
|
|
20347
20406
|
selectAccount(account) {
|
|
20348
20407
|
return this.identity.selectAccount(account);
|
|
@@ -20355,11 +20414,16 @@ class Peernet {
|
|
|
20355
20414
|
return utils$p.addCodec(codec);
|
|
20356
20415
|
}
|
|
20357
20416
|
async addStore(name, prefix, root, isPrivate = true) {
|
|
20358
|
-
if (name ===
|
|
20359
|
-
name ===
|
|
20417
|
+
if (name === "block" ||
|
|
20418
|
+
name === "transaction" ||
|
|
20419
|
+
name === "chain" ||
|
|
20420
|
+
name === "data" ||
|
|
20421
|
+
name === "message")
|
|
20360
20422
|
isPrivate = false;
|
|
20361
20423
|
let Storage;
|
|
20362
|
-
this.hasDaemon
|
|
20424
|
+
this.hasDaemon
|
|
20425
|
+
? (Storage = LeofcoinStorageClient)
|
|
20426
|
+
: (Storage = LeofcoinStorage);
|
|
20363
20427
|
if (!globalThis[`${name}Store`]) {
|
|
20364
20428
|
globalThis[`${name}Store`] = new Storage(name, root);
|
|
20365
20429
|
await globalThis[`${name}Store`].init();
|
|
@@ -20405,9 +20469,9 @@ class Peernet {
|
|
|
20405
20469
|
async _init(options, password) {
|
|
20406
20470
|
this.storePrefix = options.storePrefix;
|
|
20407
20471
|
this.root = options.root;
|
|
20408
|
-
const { RequestMessage, ResponseMessage, PeerMessage, PeerMessageResponse, PeernetMessage, DHTMessage, DHTMessageResponse, DataMessage, DataMessageResponse, PsMessage, ChatMessage, PeernetFile
|
|
20472
|
+
const { RequestMessage, ResponseMessage, PeerMessage, PeerMessageResponse, PeernetMessage, DHTMessage, DHTMessageResponse, DataMessage, DataMessageResponse, PsMessage, ChatMessage, PeernetFile,
|
|
20409
20473
|
// FolderMessageResponse
|
|
20410
|
-
} = await import(/* webpackChunkName: "messages" */ './messages-
|
|
20474
|
+
} = await import(/* webpackChunkName: "messages" */ './messages-eb6e5c71-584b278f.js');
|
|
20411
20475
|
/**
|
|
20412
20476
|
* proto Object containing protos
|
|
20413
20477
|
* @type {Object}
|
|
@@ -20418,18 +20482,18 @@ class Peernet {
|
|
|
20418
20482
|
* @property {DataMessageResponse} protos[peernet-data-response] messageNode
|
|
20419
20483
|
*/
|
|
20420
20484
|
globalThis.peernet.protos = {
|
|
20421
|
-
|
|
20422
|
-
|
|
20423
|
-
|
|
20424
|
-
|
|
20425
|
-
|
|
20426
|
-
|
|
20427
|
-
|
|
20428
|
-
|
|
20429
|
-
|
|
20430
|
-
|
|
20431
|
-
|
|
20432
|
-
|
|
20485
|
+
"peernet-request": RequestMessage,
|
|
20486
|
+
"peernet-response": ResponseMessage,
|
|
20487
|
+
"peernet-peer": PeerMessage,
|
|
20488
|
+
"peernet-peer-response": PeerMessageResponse,
|
|
20489
|
+
"peernet-message": PeernetMessage,
|
|
20490
|
+
"peernet-dht": DHTMessage,
|
|
20491
|
+
"peernet-dht-response": DHTMessageResponse,
|
|
20492
|
+
"peernet-data": DataMessage,
|
|
20493
|
+
"peernet-data-response": DataMessageResponse,
|
|
20494
|
+
"peernet-ps": PsMessage,
|
|
20495
|
+
"chat-message": ChatMessage,
|
|
20496
|
+
"peernet-file": PeernetFile,
|
|
20433
20497
|
};
|
|
20434
20498
|
this._messageHandler = new MessageHandler(this.network);
|
|
20435
20499
|
const { daemon, environment } = await target();
|
|
@@ -20441,38 +20505,44 @@ class Peernet {
|
|
|
20441
20505
|
await this.identity.load(password);
|
|
20442
20506
|
this._peerHandler = new PeerDiscovery(this.id);
|
|
20443
20507
|
this.peerId = this.id;
|
|
20444
|
-
this.addRequestHandler(
|
|
20445
|
-
return new peernet.protos[
|
|
20508
|
+
this.addRequestHandler("handshake", () => {
|
|
20509
|
+
return new peernet.protos["peernet-response"]({
|
|
20510
|
+
response: { peerId: this.id },
|
|
20511
|
+
});
|
|
20446
20512
|
});
|
|
20447
|
-
pubsub.subscribe(
|
|
20513
|
+
pubsub.subscribe("peer:discovered", async (peer) => {
|
|
20448
20514
|
// console.log(peer);
|
|
20449
|
-
if (this.requestProtos[
|
|
20450
|
-
let data = await new globalThis.peernet.protos[
|
|
20515
|
+
if (this.requestProtos["version"]) {
|
|
20516
|
+
let data = await new globalThis.peernet.protos["peernet-request"]({
|
|
20517
|
+
request: "version",
|
|
20518
|
+
});
|
|
20451
20519
|
let node = await globalThis.peernet.prepareMessage(data);
|
|
20452
20520
|
let response = await peer.request(node.encoded);
|
|
20453
|
-
response = await new globalThis.peernet.protos[
|
|
20521
|
+
response = await new globalThis.peernet.protos["peernet-response"](new Uint8Array(Object.values(response)));
|
|
20454
20522
|
peer.version = response.decoded.response.version;
|
|
20455
20523
|
}
|
|
20456
|
-
let data = await new globalThis.peernet.protos[
|
|
20524
|
+
let data = await new globalThis.peernet.protos["peernet-request"]({
|
|
20525
|
+
request: "handshake",
|
|
20526
|
+
});
|
|
20457
20527
|
let node = await globalThis.peernet.prepareMessage(data);
|
|
20458
20528
|
let response = await peer.request(node.encoded);
|
|
20459
|
-
response = await new globalThis.peernet.protos[
|
|
20529
|
+
response = await new globalThis.peernet.protos["peernet-response"](new Uint8Array(Object.values(response)));
|
|
20460
20530
|
// todo: response.decoded should be the response and not response.peerId
|
|
20461
20531
|
this.#connections[response.decoded.response.peerId] = peer;
|
|
20462
|
-
pubsub.publish(
|
|
20532
|
+
pubsub.publish("peer:connected", peer);
|
|
20463
20533
|
// todo: cleanup discovered
|
|
20464
20534
|
});
|
|
20465
|
-
pubsub.subscribe(
|
|
20535
|
+
pubsub.subscribe("peer:left", this.#peerLeft.bind(this));
|
|
20466
20536
|
/**
|
|
20467
20537
|
* converts data -> message -> proto
|
|
20468
20538
|
* @see DataHandler
|
|
20469
20539
|
*/
|
|
20470
|
-
pubsub.subscribe(
|
|
20540
|
+
pubsub.subscribe("peer:data", dataHandler);
|
|
20471
20541
|
if (globalThis.navigator) {
|
|
20472
|
-
globalThis.addEventListener(
|
|
20542
|
+
globalThis.addEventListener("beforeunload", async () => this.client.destroy());
|
|
20473
20543
|
}
|
|
20474
20544
|
else {
|
|
20475
|
-
process.on(
|
|
20545
|
+
process.on("SIGTERM", async () => {
|
|
20476
20546
|
process.stdin.resume();
|
|
20477
20547
|
try {
|
|
20478
20548
|
await this.client.destroy();
|
|
@@ -20503,7 +20573,9 @@ class Peernet {
|
|
|
20503
20573
|
}
|
|
20504
20574
|
#peerLeft(peer) {
|
|
20505
20575
|
for (const [id, _peer] of Object.entries(this.#connections)) {
|
|
20506
|
-
if (_peer.id === peer.id &&
|
|
20576
|
+
if (_peer.id === peer.id &&
|
|
20577
|
+
this.#connections[id] &&
|
|
20578
|
+
!this.#connections[id].connected) {
|
|
20507
20579
|
delete this.#connections[id];
|
|
20508
20580
|
this.removePeer(_peer);
|
|
20509
20581
|
}
|
|
@@ -20530,18 +20602,26 @@ class Peernet {
|
|
|
20530
20602
|
else {
|
|
20531
20603
|
has = await this.has(hash);
|
|
20532
20604
|
}
|
|
20533
|
-
const data = await new globalThis.peernet.protos[
|
|
20605
|
+
const data = await new globalThis.peernet.protos["peernet-dht-response"]({
|
|
20606
|
+
hash,
|
|
20607
|
+
has,
|
|
20608
|
+
});
|
|
20534
20609
|
const node = await this.prepareMessage(data);
|
|
20535
20610
|
this.sendMessage(peer, id, node.encoded);
|
|
20536
20611
|
}
|
|
20537
20612
|
async handleData(peer, id, proto) {
|
|
20538
20613
|
let { hash, store } = proto.decoded;
|
|
20539
20614
|
let data;
|
|
20540
|
-
store =
|
|
20615
|
+
store =
|
|
20616
|
+
globalThis[`${store}Store`] ||
|
|
20617
|
+
(await this.whichStore([...this.stores], hash));
|
|
20541
20618
|
if (store && !store.private) {
|
|
20542
20619
|
data = await store.get(hash);
|
|
20543
20620
|
if (data) {
|
|
20544
|
-
data = await new globalThis.peernet.protos[
|
|
20621
|
+
data = await new globalThis.peernet.protos["peernet-data-response"]({
|
|
20622
|
+
hash,
|
|
20623
|
+
data,
|
|
20624
|
+
});
|
|
20545
20625
|
const node = await this.prepareMessage(data);
|
|
20546
20626
|
this.sendMessage(peer, id, node.encoded);
|
|
20547
20627
|
}
|
|
@@ -20565,21 +20645,20 @@ class Peernet {
|
|
|
20565
20645
|
const { id, proto } = message;
|
|
20566
20646
|
this.bw.down += proto.encoded.length;
|
|
20567
20647
|
switch (proto.name) {
|
|
20568
|
-
case
|
|
20648
|
+
case "peernet-dht": {
|
|
20569
20649
|
this.handleDHT(peer, id, proto);
|
|
20570
20650
|
break;
|
|
20571
20651
|
}
|
|
20572
|
-
case
|
|
20652
|
+
case "peernet-data": {
|
|
20573
20653
|
this.handleData(peer, id, proto);
|
|
20574
20654
|
break;
|
|
20575
20655
|
}
|
|
20576
|
-
case
|
|
20656
|
+
case "peernet-request": {
|
|
20577
20657
|
this.handleRequest(peer, id, proto);
|
|
20578
20658
|
break;
|
|
20579
20659
|
}
|
|
20580
|
-
case
|
|
20581
|
-
|
|
20582
|
-
globalSub.publish(proto.decoded.topic, proto.decoded.data);
|
|
20660
|
+
case "peernet-ps": {
|
|
20661
|
+
globalSub.publish(new TextDecoder().decode(proto.decoded.topic), proto.decoded.data);
|
|
20583
20662
|
}
|
|
20584
20663
|
}
|
|
20585
20664
|
}
|
|
@@ -20590,14 +20669,14 @@ class Peernet {
|
|
|
20590
20669
|
*/
|
|
20591
20670
|
async walk(hash) {
|
|
20592
20671
|
if (!hash)
|
|
20593
|
-
throw new Error(
|
|
20594
|
-
const data = await new globalThis.peernet.protos[
|
|
20672
|
+
throw new Error("hash expected, received undefined");
|
|
20673
|
+
const data = await new globalThis.peernet.protos["peernet-dht"]({ hash });
|
|
20595
20674
|
const walk = async (peer, peerId) => {
|
|
20596
20675
|
const node = await this.prepareMessage(data);
|
|
20597
20676
|
let result = await peer.request(node.encoded);
|
|
20598
20677
|
result = new Uint8Array(Object.values(result));
|
|
20599
20678
|
const proto = await protoFor(result);
|
|
20600
|
-
if (proto.name !==
|
|
20679
|
+
if (proto.name !== "peernet-dht-response")
|
|
20601
20680
|
throw dhtError(proto.name);
|
|
20602
20681
|
const peerInfo = {
|
|
20603
20682
|
...peer.connectionStats,
|
|
@@ -20623,7 +20702,8 @@ class Peernet {
|
|
|
20623
20702
|
let providers = this.dht.providersFor(hash);
|
|
20624
20703
|
// walk the network to find a provider
|
|
20625
20704
|
let tries = 0;
|
|
20626
|
-
while (!providers && tries < 3 ||
|
|
20705
|
+
while ((!providers && tries < 3) ||
|
|
20706
|
+
(Object.keys(providers).length === 0 && tries < 3)) {
|
|
20627
20707
|
tries += 1;
|
|
20628
20708
|
await this.walk(hash);
|
|
20629
20709
|
providers = this.dht.providersFor(hash);
|
|
@@ -20637,7 +20717,7 @@ class Peernet {
|
|
|
20637
20717
|
const data = await blockStore.has(hash);
|
|
20638
20718
|
if (data)
|
|
20639
20719
|
return blockStore.get(hash);
|
|
20640
|
-
return this.requestData(hash,
|
|
20720
|
+
return this.requestData(hash, "block");
|
|
20641
20721
|
},
|
|
20642
20722
|
put: async (hash, data) => {
|
|
20643
20723
|
if (await blockStore.has(hash))
|
|
@@ -20653,7 +20733,7 @@ class Peernet {
|
|
|
20653
20733
|
const data = await transactionStore.has(hash);
|
|
20654
20734
|
if (data)
|
|
20655
20735
|
return await transactionStore.get(hash);
|
|
20656
|
-
return this.requestData(hash,
|
|
20736
|
+
return this.requestData(hash, "transaction");
|
|
20657
20737
|
},
|
|
20658
20738
|
put: async (hash, data) => {
|
|
20659
20739
|
if (await transactionStore.has(hash))
|
|
@@ -20665,7 +20745,7 @@ class Peernet {
|
|
|
20665
20745
|
}
|
|
20666
20746
|
async requestData(hash, store) {
|
|
20667
20747
|
const providers = await this.providersFor(hash);
|
|
20668
|
-
if (!providers || providers && Object.keys(providers).length === 0)
|
|
20748
|
+
if (!providers || (providers && Object.keys(providers).length === 0))
|
|
20669
20749
|
throw nothingFoundError(hash);
|
|
20670
20750
|
debug(`found ${Object.keys(providers).length} provider(s) for ${hash}`);
|
|
20671
20751
|
// get closest peer on earth
|
|
@@ -20676,7 +20756,10 @@ class Peernet {
|
|
|
20676
20756
|
const id = closestPeer.id;
|
|
20677
20757
|
const peer = this.#connections[id];
|
|
20678
20758
|
if (peer?.connected) {
|
|
20679
|
-
let data = await new globalThis.peernet.protos[
|
|
20759
|
+
let data = await new globalThis.peernet.protos["peernet-data"]({
|
|
20760
|
+
hash,
|
|
20761
|
+
store: store?.name || store,
|
|
20762
|
+
});
|
|
20680
20763
|
const node = await this.prepareMessage(data);
|
|
20681
20764
|
if (peer)
|
|
20682
20765
|
data = await peer.request(node.encoded);
|
|
@@ -20715,7 +20798,7 @@ class Peernet {
|
|
|
20715
20798
|
const message = await messageStore.has(hash);
|
|
20716
20799
|
if (message)
|
|
20717
20800
|
return await messageStore.get(hash);
|
|
20718
|
-
return this.requestData(hash,
|
|
20801
|
+
return this.requestData(hash, "message");
|
|
20719
20802
|
},
|
|
20720
20803
|
/**
|
|
20721
20804
|
* put message content
|
|
@@ -20743,7 +20826,7 @@ class Peernet {
|
|
|
20743
20826
|
const data = await dataStore.has(hash);
|
|
20744
20827
|
if (data)
|
|
20745
20828
|
return await dataStore.get(hash);
|
|
20746
|
-
return this.requestData(hash,
|
|
20829
|
+
return this.requestData(hash, "data");
|
|
20747
20830
|
},
|
|
20748
20831
|
/**
|
|
20749
20832
|
* put data content
|
|
@@ -20771,7 +20854,7 @@ class Peernet {
|
|
|
20771
20854
|
const data = await dataStore.has(hash);
|
|
20772
20855
|
if (data)
|
|
20773
20856
|
return await dataStore.get(hash);
|
|
20774
|
-
return this.requestData(hash,
|
|
20857
|
+
return this.requestData(hash, "data");
|
|
20775
20858
|
},
|
|
20776
20859
|
/**
|
|
20777
20860
|
* put data content
|
|
@@ -20790,12 +20873,15 @@ class Peernet {
|
|
|
20790
20873
|
async addFolder(files) {
|
|
20791
20874
|
const links = [];
|
|
20792
20875
|
for (const file of files) {
|
|
20793
|
-
const fileNode = await new globalThis.peernet.protos[
|
|
20876
|
+
const fileNode = await new globalThis.peernet.protos["peernet-file"](file);
|
|
20794
20877
|
const hash = await fileNode.hash;
|
|
20795
20878
|
await dataStore.put(hash, fileNode.encoded);
|
|
20796
20879
|
links.push({ hash, path: file.path });
|
|
20797
20880
|
}
|
|
20798
|
-
const node = await new globalThis.peernet.protos[
|
|
20881
|
+
const node = await new globalThis.peernet.protos["peernet-file"]({
|
|
20882
|
+
path: "/",
|
|
20883
|
+
links,
|
|
20884
|
+
});
|
|
20799
20885
|
const hash = await node.hash;
|
|
20800
20886
|
await dataStore.put(hash, node.encoded);
|
|
20801
20887
|
return hash;
|
|
@@ -20803,8 +20889,10 @@ class Peernet {
|
|
|
20803
20889
|
async ls(hash, options) {
|
|
20804
20890
|
let data;
|
|
20805
20891
|
const has = await dataStore.has(hash);
|
|
20806
|
-
data = has
|
|
20807
|
-
|
|
20892
|
+
data = has
|
|
20893
|
+
? await dataStore.get(hash)
|
|
20894
|
+
: await this.requestData(hash, "data");
|
|
20895
|
+
const node = await new peernet.protos["peernet-file"](data);
|
|
20808
20896
|
await node.decode();
|
|
20809
20897
|
console.log(data);
|
|
20810
20898
|
const paths = [];
|
|
@@ -20820,8 +20908,10 @@ class Peernet {
|
|
|
20820
20908
|
async cat(hash, options) {
|
|
20821
20909
|
let data;
|
|
20822
20910
|
const has = await dataStore.has(hash);
|
|
20823
|
-
data = has
|
|
20824
|
-
|
|
20911
|
+
data = has
|
|
20912
|
+
? await dataStore.get(hash)
|
|
20913
|
+
: await this.requestData(hash, "data");
|
|
20914
|
+
const node = await new peernet.protos["peernet-file"](data);
|
|
20825
20915
|
if (node.decoded?.links.length > 0)
|
|
20826
20916
|
throw new Error(`${hash} is a directory`);
|
|
20827
20917
|
if (options?.pin)
|
|
@@ -20859,7 +20949,7 @@ class Peernet {
|
|
|
20859
20949
|
store = globalThis[`${store}Store`];
|
|
20860
20950
|
if (!store)
|
|
20861
20951
|
store = await this.whichStore([...this.stores], hash);
|
|
20862
|
-
if (store && await store.has(hash))
|
|
20952
|
+
if (store && (await store.has(hash)))
|
|
20863
20953
|
data = await store.get(hash);
|
|
20864
20954
|
if (data)
|
|
20865
20955
|
return data;
|
|
@@ -20872,7 +20962,7 @@ class Peernet {
|
|
|
20872
20962
|
* @param {Buffer} data
|
|
20873
20963
|
* @param {String} storeName - storeName to access
|
|
20874
20964
|
*/
|
|
20875
|
-
async put(hash, data, storeName =
|
|
20965
|
+
async put(hash, data, storeName = "data") {
|
|
20876
20966
|
const store = globalThis[`${storeName}Store`];
|
|
20877
20967
|
return store.put(hash, data);
|
|
20878
20968
|
}
|
|
@@ -20895,7 +20985,7 @@ class Peernet {
|
|
|
20895
20985
|
async publish(topic, data) {
|
|
20896
20986
|
// globalSub.publish(topic, data)
|
|
20897
20987
|
const id = Math.random().toString(36).slice(-12);
|
|
20898
|
-
data = await new globalThis.peernet.protos[
|
|
20988
|
+
data = await new globalThis.peernet.protos["peernet-ps"]({ data, topic });
|
|
20899
20989
|
for (const [peerId, peer] of Object.entries(this.#connections)) {
|
|
20900
20990
|
if (peerId !== this.id) {
|
|
20901
20991
|
const node = await this.prepareMessage(data);
|
|
@@ -20917,7 +21007,7 @@ class Peernet {
|
|
|
20917
21007
|
globalSub.subscribe(topic, callback);
|
|
20918
21008
|
}
|
|
20919
21009
|
async removePeer(peer) {
|
|
20920
|
-
console.log(
|
|
21010
|
+
console.log("removepeer", peer.id);
|
|
20921
21011
|
const id = peer.id;
|
|
20922
21012
|
await this.client._removePeer(peer);
|
|
20923
21013
|
if (this.client.peers[id]) {
|
|
@@ -20925,7 +21015,7 @@ class Peernet {
|
|
|
20925
21015
|
// if (this.client.peers[id][connection].connected === false) delete this.client.peers[id][connection]
|
|
20926
21016
|
// @ts-ignore
|
|
20927
21017
|
if (this.client.peers[id][connection].connected)
|
|
20928
|
-
return this.client.emit(
|
|
21018
|
+
return this.client.emit("peerconnect", connection);
|
|
20929
21019
|
}
|
|
20930
21020
|
}
|
|
20931
21021
|
}
|