-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy pathmemPool.js
108 lines (101 loc) · 4.22 KB
/
memPool.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
/* ===== Mempool Class ==========================
| Class with a constructor for new mempool |
| ================================================*/
const bitcoinMessage = require('bitcoinjs-message');
class Mempool {
constructor() {
this.memPool = [];
this.memPoolValid = [];
}
// Add request validation to memPool
addRequestValidation(req){
let self = this;
let memPoolIndex;
let requestObject = {
walletAddress: req.body.address,
requestTimeStamp: new Date().getTime().toString().slice(0,-3),
message: req.body.address + ':' + new Date().getTime().toString().slice(0,-3) + ':' + 'starRegistry',
validationWindow: 0
};
if (self.memPool.length > 0) {
for (let i = 0; i < self.memPool.length; i++) {
if (self.memPool[i].walletAddress === req.body.address) {
memPoolIndex = i;
}
}
}
if (memPoolIndex >= 0) {
requestObject = self.memPool[memPoolIndex]
let timeElapse = new Date().getTime().toString().slice(0,-3) - requestObject.requestTimeStamp;
let timeLeft = (self.TimeoutRequestsWindowTime/1000) - timeElapse;
requestObject.validationWindow = timeLeft;
return new Promise (function(resolve) {
resolve(requestObject);
})
} else {
return new Promise (function(resolve, reject) {
self.setTimeOut(requestObject)
.then(result => {
self.memPool.push(result);
console.log('\nMemPool contents:\n', self.memPool) // VERBOSE
resolve(result);
});
})
}
}
// Set timeout for the memPool
setTimeOut(request){
let self = this;
self.TimeoutRequestsWindowTime = 5 * 60 * 1000;
let timeElapse = new Date().getTime().toString().slice(0,-3) - request.requestTimeStamp;
let timeLeft = (self.TimeoutRequestsWindowTime/1000) - timeElapse;
request.validationWindow = timeLeft;
return new Promise (function(resolve) {
setTimeout(function(){
self.memPool.splice(self.memPool.indexOf(request), 1)},
self.TimeoutRequestsWindowTime);
resolve(request);
})
}
// Set validation by wallet
async validateWalletSignature(request) {
let self = this;
let isIncludedinMemPool;
let requestObject;
let validRequest;
for (let i = 0; i < self.memPool.length; i++) {
if (self.memPool[i].walletAddress === request.body.address) {
isIncludedinMemPool = i;
}
}
if (isIncludedinMemPool >= 0) {
requestObject = self.memPool[isIncludedinMemPool];
requestObject.messageSignature = request.body.signature;
validRequest = {
registerStar: false,
status: requestObject
}
console.log('validRequest:', validRequest); // VERBOSE
let timeElapse = new Date().getTime().toString().slice(0,-3) - requestObject.requestTimeStamp;
let timeLeft = (self.TimeoutRequestsWindowTime/1000) - timeElapse;
requestObject.validationWindow = timeLeft;
let isValidSignature = await bitcoinMessage.verify(validRequest.status.message, validRequest.status.walletAddress, validRequest.status.messageSignature);
if (isValidSignature === true) {
validRequest.status.messageSignature = 'valid';
validRequest.registerStar = true;
self.memPoolValid.push(validRequest.status.walletAddress);
self.memPool.splice(self.memPool.indexOf(requestObject), 1);
console.log('\nMemPoolValid contents:\n', self.memPoolValid);
}
} else {
throw new Error;
}
return validRequest;
}
validateAddressRequest(requestAddress) {
let isValid = this.memPoolValid.includes(requestAddress);
this.memPoolValid.splice(this.memPoolValid.indexOf(requestAddress), 1);
return isValid;
}
}
module.exports.Mempool = Mempool;