solvoid 1.2.0 → 1.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +116 -258
- package/SECURITY.md +27 -24
- package/dist/cli/commands/ghost.d.ts +3 -3
- package/dist/cli/commands/ghost.d.ts.map +1 -1
- package/dist/cli/commands/ghost.js +67 -91
- package/dist/cli/commands/ghost.js.map +1 -1
- package/dist/cli/commands/rescue.d.ts +4 -0
- package/dist/cli/commands/rescue.d.ts.map +1 -1
- package/dist/cli/commands/rescue.js +102 -199
- package/dist/cli/commands/rescue.js.map +1 -1
- package/dist/cli/demo-scan.js +48 -130
- package/dist/cli/demo-scan.js.map +1 -1
- package/dist/cli/solvoid-scan.d.ts +4 -3
- package/dist/cli/solvoid-scan.d.ts.map +1 -1
- package/dist/cli/solvoid-scan.js +55 -46
- package/dist/cli/solvoid-scan.js.map +1 -1
- package/dist/cli/utils/asset-scanner.d.ts.map +1 -1
- package/dist/cli/utils/asset-scanner.js +7 -5
- package/dist/cli/utils/asset-scanner.js.map +1 -1
- package/dist/cli/utils/badge-generator.d.ts.map +1 -1
- package/dist/cli/utils/badge-generator.js +11 -9
- package/dist/cli/utils/badge-generator.js.map +1 -1
- package/dist/cli/utils/enhanced-monitoring.d.ts +13 -0
- package/dist/cli/utils/enhanced-monitoring.d.ts.map +1 -0
- package/dist/cli/utils/enhanced-monitoring.js +46 -0
- package/dist/cli/utils/enhanced-monitoring.js.map +1 -0
- package/dist/cli/utils/enhanced-pyth-feed.d.ts +20 -0
- package/dist/cli/utils/enhanced-pyth-feed.d.ts.map +1 -0
- package/dist/cli/utils/enhanced-pyth-feed.js +64 -0
- package/dist/cli/utils/enhanced-pyth-feed.js.map +1 -0
- package/dist/cli/utils/enhanced-threat-intel.d.ts +20 -0
- package/dist/cli/utils/enhanced-threat-intel.d.ts.map +1 -0
- package/dist/cli/utils/enhanced-threat-intel.js +57 -0
- package/dist/cli/utils/enhanced-threat-intel.js.map +1 -0
- package/dist/cli/utils/env-validator.d.ts.map +1 -1
- package/dist/cli/utils/env-validator.js +6 -3
- package/dist/cli/utils/env-validator.js.map +1 -1
- package/dist/cli/utils/jito-mev-bundle.d.ts +9 -0
- package/dist/cli/utils/jito-mev-bundle.d.ts.map +1 -0
- package/dist/cli/utils/jito-mev-bundle.js +40 -0
- package/dist/cli/utils/jito-mev-bundle.js.map +1 -0
- package/dist/cli/utils/rescue-engine.d.ts +0 -4
- package/dist/cli/utils/rescue-engine.d.ts.map +1 -1
- package/dist/cli/utils/rescue-engine.js +28 -46
- package/dist/cli/utils/rescue-engine.js.map +1 -1
- package/dist/cli/utils/shadow-bridge.d.ts +20 -0
- package/dist/cli/utils/shadow-bridge.d.ts.map +1 -0
- package/dist/cli/utils/shadow-bridge.js +33 -0
- package/dist/cli/utils/shadow-bridge.js.map +1 -0
- package/dist/relayer/key-manager.d.ts +52 -0
- package/dist/relayer/key-manager.d.ts.map +1 -0
- package/dist/relayer/key-manager.js +356 -0
- package/dist/relayer/key-manager.js.map +1 -0
- package/dist/relayer/replay-protection.d.ts +94 -0
- package/dist/relayer/replay-protection.d.ts.map +1 -0
- package/dist/relayer/replay-protection.js +189 -0
- package/dist/relayer/replay-protection.js.map +1 -0
- package/dist/relayer/secure-service.d.ts +46 -0
- package/dist/relayer/secure-service.d.ts.map +1 -0
- package/dist/relayer/secure-service.js +538 -0
- package/dist/relayer/secure-service.js.map +1 -0
- package/dist/relayer/service.d.ts +25 -0
- package/dist/relayer/service.d.ts.map +1 -0
- package/dist/relayer/service.js +380 -0
- package/dist/relayer/service.js.map +1 -0
- package/dist/sdk/client.d.ts +42 -8
- package/dist/sdk/client.d.ts.map +1 -1
- package/dist/sdk/client.js +115 -242
- package/dist/sdk/client.js.map +1 -1
- package/dist/sdk/crypto/poseidon.d.ts +4 -4
- package/dist/sdk/crypto/poseidon.d.ts.map +1 -1
- package/dist/sdk/crypto/poseidon.js +34 -17
- package/dist/sdk/crypto/poseidon.js.map +1 -1
- package/dist/sdk/integrity.d.ts +3 -3
- package/dist/sdk/integrity.d.ts.map +1 -1
- package/dist/sdk/integrity.js +2 -2
- package/dist/sdk/integrity.js.map +1 -1
- package/dist/sdk/passport/manager.d.ts +15 -3
- package/dist/sdk/passport/manager.d.ts.map +1 -1
- package/dist/sdk/passport/manager.js +30 -17
- package/dist/sdk/passport/manager.js.map +1 -1
- package/dist/sdk/pipeline.d.ts.map +1 -1
- package/dist/sdk/pipeline.js +69 -12
- package/dist/sdk/pipeline.js.map +1 -1
- package/dist/sdk/polyfill.d.ts +8 -0
- package/dist/sdk/polyfill.d.ts.map +1 -0
- package/dist/sdk/polyfill.js +21 -0
- package/dist/sdk/polyfill.js.map +1 -0
- package/dist/sdk/privacy/shield.d.ts +46 -0
- package/dist/sdk/privacy/shield.d.ts.map +1 -1
- package/dist/sdk/privacy/shield.js +117 -35
- package/dist/sdk/privacy/shield.js.map +1 -1
- package/dist/sdk/privacy-engine.d.ts +17 -3
- package/dist/sdk/privacy-engine.d.ts.map +1 -1
- package/dist/sdk/privacy-engine.js +46 -20
- package/dist/sdk/privacy-engine.js.map +1 -1
- package/package.json +2 -2
|
@@ -0,0 +1,538 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
"use strict";
|
|
3
|
+
/**
|
|
4
|
+
* SolVoid Secure Relayer Service
|
|
5
|
+
*
|
|
6
|
+
* This is a production-grade relayer with proper security controls:
|
|
7
|
+
* - Authentication with registered public keys
|
|
8
|
+
* - Rate limiting and DOS protection
|
|
9
|
+
* - Transaction validation and replay protection
|
|
10
|
+
* - Economic incentives with slashing conditions
|
|
11
|
+
* - Comprehensive logging and monitoring
|
|
12
|
+
*/
|
|
13
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
14
|
+
if (k2 === undefined) k2 = k;
|
|
15
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
16
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
17
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
18
|
+
}
|
|
19
|
+
Object.defineProperty(o, k2, desc);
|
|
20
|
+
}) : (function(o, m, k, k2) {
|
|
21
|
+
if (k2 === undefined) k2 = k;
|
|
22
|
+
o[k2] = m[k];
|
|
23
|
+
}));
|
|
24
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
25
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
26
|
+
}) : function(o, v) {
|
|
27
|
+
o["default"] = v;
|
|
28
|
+
});
|
|
29
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
30
|
+
var ownKeys = function(o) {
|
|
31
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
32
|
+
var ar = [];
|
|
33
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
34
|
+
return ar;
|
|
35
|
+
};
|
|
36
|
+
return ownKeys(o);
|
|
37
|
+
};
|
|
38
|
+
return function (mod) {
|
|
39
|
+
if (mod && mod.__esModule) return mod;
|
|
40
|
+
var result = {};
|
|
41
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
42
|
+
__setModuleDefault(result, mod);
|
|
43
|
+
return result;
|
|
44
|
+
};
|
|
45
|
+
})();
|
|
46
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
47
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
48
|
+
};
|
|
49
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
50
|
+
exports.SecureRelayerService = void 0;
|
|
51
|
+
const express_1 = __importDefault(require("express"));
|
|
52
|
+
const cors_1 = __importDefault(require("cors"));
|
|
53
|
+
const crypto = __importStar(require("crypto"));
|
|
54
|
+
const tweetnacl = __importStar(require("tweetnacl"));
|
|
55
|
+
const web3_js_1 = require("@solana/web3.js");
|
|
56
|
+
const key_manager_1 = require("./key-manager");
|
|
57
|
+
const replay_protection_1 = require("./replay-protection");
|
|
58
|
+
const index_1 = require("../sdk/index");
|
|
59
|
+
// Configuration
|
|
60
|
+
const PORT = parseInt(process.env.PORT || '8080');
|
|
61
|
+
const RPC_ENDPOINT = process.env.RPC_ENDPOINT || 'https://api.mainnet-beta.solana.com';
|
|
62
|
+
const NODE_ID = process.env.NODE_ID || `secure-relayer-${crypto.randomBytes(4).toString('hex')}`;
|
|
63
|
+
const BOUNTY_RATE_SOL = parseFloat(process.env.BOUNTY_RATE || '0.001'); // 0.001 SOL per relay
|
|
64
|
+
const MAX_RELAY_SIZE = parseInt(process.env.MAX_RELAY_SIZE || '1664'); // Solana transaction size limit
|
|
65
|
+
const RATE_LIMIT_WINDOW = 60000; // 1 minute
|
|
66
|
+
const RATE_LIMIT_MAX = 100; // Max requests per minute per key
|
|
67
|
+
class SecureRelayerService {
|
|
68
|
+
constructor() {
|
|
69
|
+
this.registeredRelayers = new Map();
|
|
70
|
+
this.rateLimits = new Map();
|
|
71
|
+
this.processedTransactions = new Set();
|
|
72
|
+
this.usedSignatures = new Map(); // Signature cache for replay protection
|
|
73
|
+
this.app = (0, express_1.default)();
|
|
74
|
+
this.connection = new web3_js_1.Connection(RPC_ENDPOINT, 'confirmed');
|
|
75
|
+
this.keyManager = new key_manager_1.KeyManager(process.env.KEY_STORAGE_TYPE || 'file');
|
|
76
|
+
this.replayProtection = new replay_protection_1.ReplayProtection();
|
|
77
|
+
this.metrics = {
|
|
78
|
+
total: 0,
|
|
79
|
+
successful: 0,
|
|
80
|
+
failed: 0,
|
|
81
|
+
totalBounty: 0,
|
|
82
|
+
averageLatency: 0,
|
|
83
|
+
lastHour: 0,
|
|
84
|
+
lastDay: 0,
|
|
85
|
+
};
|
|
86
|
+
this.setupMiddleware();
|
|
87
|
+
this.setupRoutes();
|
|
88
|
+
this.startCleanupTasks();
|
|
89
|
+
}
|
|
90
|
+
generatePrivateKey() {
|
|
91
|
+
// Use persistent key manager instead of random generation
|
|
92
|
+
return this.keyManager.getPrivateKey();
|
|
93
|
+
}
|
|
94
|
+
setupMiddleware() {
|
|
95
|
+
this.app.use((0, cors_1.default)({
|
|
96
|
+
origin: process.env.ALLOWED_ORIGINS?.split(',') || ['http://localhost:3000'],
|
|
97
|
+
credentials: true,
|
|
98
|
+
}));
|
|
99
|
+
this.app.use(express_1.default.json({
|
|
100
|
+
limit: '1mb',
|
|
101
|
+
verify: (req, res, buf) => {
|
|
102
|
+
try {
|
|
103
|
+
JSON.parse(buf.toString());
|
|
104
|
+
}
|
|
105
|
+
catch (e) {
|
|
106
|
+
res.status(400).json({ error: 'Invalid JSON' });
|
|
107
|
+
return;
|
|
108
|
+
}
|
|
109
|
+
req.rawBody = buf;
|
|
110
|
+
}
|
|
111
|
+
}));
|
|
112
|
+
// Request logging
|
|
113
|
+
this.app.use((req, res, next) => {
|
|
114
|
+
console.log(`${new Date().toISOString()} ${req.method} ${req.path} - ${req.ip}`);
|
|
115
|
+
next();
|
|
116
|
+
});
|
|
117
|
+
}
|
|
118
|
+
setupRoutes() {
|
|
119
|
+
// Health check
|
|
120
|
+
this.app.get('/health', this.healthCheck.bind(this));
|
|
121
|
+
// Register new relayer
|
|
122
|
+
this.app.post('/register', this.registerRelayer.bind(this));
|
|
123
|
+
// Authenticated relay endpoint
|
|
124
|
+
this.app.post('/relay', this.authenticate.bind(this), this.relayTransaction.bind(this));
|
|
125
|
+
// Get relayer status
|
|
126
|
+
this.app.get('/status/:publicKey', this.getRelayerStatus.bind(this));
|
|
127
|
+
// Get network status
|
|
128
|
+
this.app.get('/network', this.getNetworkStatus.bind(this));
|
|
129
|
+
// Admin endpoints
|
|
130
|
+
this.app.get('/admin/metrics', this.authenticate.bind(this), this.getMetrics.bind(this));
|
|
131
|
+
this.app.post('/admin/slash', this.authenticate.bind(this), this.slashRelayer.bind(this));
|
|
132
|
+
// Error handler
|
|
133
|
+
this.app.use(this.errorHandler.bind(this));
|
|
134
|
+
}
|
|
135
|
+
async healthCheck(req, res) {
|
|
136
|
+
const latency = await this.measureLatency();
|
|
137
|
+
res.json({
|
|
138
|
+
status: 'healthy',
|
|
139
|
+
nodeId: NODE_ID,
|
|
140
|
+
timestamp: new Date().toISOString(),
|
|
141
|
+
metrics: this.metrics,
|
|
142
|
+
latency,
|
|
143
|
+
registeredRelayers: this.registeredRelayers.size,
|
|
144
|
+
uptime: process.uptime(),
|
|
145
|
+
});
|
|
146
|
+
}
|
|
147
|
+
// FIXED: Add missing getNetworkStatus method
|
|
148
|
+
async getNetworkStatus(req, res) {
|
|
149
|
+
try {
|
|
150
|
+
const slot = await this.connection.getSlot();
|
|
151
|
+
const blockHeight = await this.connection.getBlockHeight();
|
|
152
|
+
res.json({
|
|
153
|
+
status: 'connected',
|
|
154
|
+
slot,
|
|
155
|
+
blockHeight,
|
|
156
|
+
cluster: this.connection.rpcEndpoint,
|
|
157
|
+
timestamp: new Date().toISOString(),
|
|
158
|
+
});
|
|
159
|
+
}
|
|
160
|
+
catch (error) {
|
|
161
|
+
res.status(500).json({
|
|
162
|
+
status: 'error',
|
|
163
|
+
error: error instanceof Error ? error.message : 'Unknown error',
|
|
164
|
+
timestamp: new Date().toISOString(),
|
|
165
|
+
});
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
async registerRelayer(req, res) {
|
|
169
|
+
try {
|
|
170
|
+
const { publicKey, endpoint, signature } = req.body;
|
|
171
|
+
if (!publicKey || !signature) {
|
|
172
|
+
return res.status(400).json({ error: 'Missing publicKey or signature' });
|
|
173
|
+
}
|
|
174
|
+
// Verify signature (simplified - implement proper verification)
|
|
175
|
+
const message = `register:${publicKey}:${Date.now()}`;
|
|
176
|
+
const isValidSignature = this.verifySignature(message, signature, publicKey);
|
|
177
|
+
if (!isValidSignature) {
|
|
178
|
+
return res.status(401).json({ error: 'Invalid signature' });
|
|
179
|
+
}
|
|
180
|
+
const relayer = {
|
|
181
|
+
publicKey,
|
|
182
|
+
endpoint,
|
|
183
|
+
reputation: 100, // Start with perfect reputation
|
|
184
|
+
lastSeen: Date.now(),
|
|
185
|
+
totalRelays: 0,
|
|
186
|
+
successRate: 1.0,
|
|
187
|
+
slashedAmount: 0,
|
|
188
|
+
registeredAt: Date.now(),
|
|
189
|
+
};
|
|
190
|
+
this.registeredRelayers.set(publicKey, relayer);
|
|
191
|
+
console.log(` Registered relayer: ${publicKey.slice(0, 8)}...`);
|
|
192
|
+
res.json({
|
|
193
|
+
success: true,
|
|
194
|
+
nodeId: NODE_ID,
|
|
195
|
+
registeredAt: relayer.registeredAt,
|
|
196
|
+
});
|
|
197
|
+
}
|
|
198
|
+
catch (error) {
|
|
199
|
+
console.error('Registration error:', error);
|
|
200
|
+
res.status(500).json({ error: 'Registration failed' });
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
authenticate(req, res, next) {
|
|
204
|
+
const { timestamp } = req.headers;
|
|
205
|
+
if (!timestamp) {
|
|
206
|
+
return res.status(401).json({ error: 'Missing timestamp header' });
|
|
207
|
+
}
|
|
208
|
+
// Extract signature from request header
|
|
209
|
+
const signatureHeader = req.headers['x-signature'];
|
|
210
|
+
if (!signatureHeader) {
|
|
211
|
+
return res.status(401).json({ error: 'Missing signature header' });
|
|
212
|
+
}
|
|
213
|
+
// Extract public key from header
|
|
214
|
+
const publicKeyHeader = req.headers['x-public-key'];
|
|
215
|
+
if (!publicKeyHeader) {
|
|
216
|
+
return res.status(401).json({ error: 'Missing public key header' });
|
|
217
|
+
}
|
|
218
|
+
// Check timestamp (prevent replay attacks) - 5 minute window
|
|
219
|
+
const now = Date.now();
|
|
220
|
+
const requestTime = parseInt(timestamp);
|
|
221
|
+
if (Math.abs(now - requestTime) > 300000) { // 5 minute window
|
|
222
|
+
return res.status(401).json({ error: 'Request expired' });
|
|
223
|
+
}
|
|
224
|
+
// Check for replay attack using signature cache
|
|
225
|
+
const signatureHash = crypto.createHash('sha256').update(signatureHeader).digest('hex');
|
|
226
|
+
if (this.usedSignatures.has(signatureHash)) {
|
|
227
|
+
return res.status(401).json({ error: 'Replay attack detected' });
|
|
228
|
+
}
|
|
229
|
+
// Reconstruct message to sign: method + url + timestamp + body_hash
|
|
230
|
+
const bodyHash = req.body ? crypto.createHash('sha256').update(JSON.stringify(req.body)).digest('hex') : '';
|
|
231
|
+
const message = `${req.method}:${req.path}:${timestamp}:${bodyHash}`;
|
|
232
|
+
// Verify Ed25519 signature
|
|
233
|
+
const isValidSignature = this.verifySignature(message, signatureHeader, publicKeyHeader);
|
|
234
|
+
if (!isValidSignature) {
|
|
235
|
+
return res.status(401).json({ error: 'Invalid signature' });
|
|
236
|
+
}
|
|
237
|
+
// Add signature to replay protection cache (10 minutes)
|
|
238
|
+
this.usedSignatures.set(signatureHash, now);
|
|
239
|
+
// Clean up old signatures (remove those older than 10 minutes)
|
|
240
|
+
this.cleanupSignatures();
|
|
241
|
+
// Rate limiting
|
|
242
|
+
if (!this.checkRateLimit(publicKeyHeader)) {
|
|
243
|
+
return res.status(429).json({ error: 'Rate limit exceeded' });
|
|
244
|
+
}
|
|
245
|
+
req.authenticatedPublicKey = publicKeyHeader;
|
|
246
|
+
next();
|
|
247
|
+
}
|
|
248
|
+
async relayTransaction(req, res) {
|
|
249
|
+
const startTime = Date.now();
|
|
250
|
+
try {
|
|
251
|
+
// Enforce request schema
|
|
252
|
+
const enforcedRequest = (0, index_1.enforce)(index_1.RelayRequestSchema, req.body, {
|
|
253
|
+
origin: index_1.DataOrigin.API_PAYLOAD,
|
|
254
|
+
trust: index_1.DataTrust.UNTRUSTED,
|
|
255
|
+
units: index_1.Unit.SOL,
|
|
256
|
+
createdAt: Date.now(),
|
|
257
|
+
owner: NODE_ID,
|
|
258
|
+
});
|
|
259
|
+
// Extract transaction data for replay protection
|
|
260
|
+
const txData = {
|
|
261
|
+
publicKey: req.authenticatedPublicKey || '',
|
|
262
|
+
nonce: req.body.nonce || 0,
|
|
263
|
+
timestamp: req.body.timestamp || Date.now(),
|
|
264
|
+
txHash: req.body.transactionHash || '',
|
|
265
|
+
signature: req.body.signature || '',
|
|
266
|
+
instructions: req.body.instructions || []
|
|
267
|
+
};
|
|
268
|
+
// Multi-layered replay protection
|
|
269
|
+
const replayValidation = this.replayProtection.validateTransaction(txData);
|
|
270
|
+
if (!replayValidation.isValid) {
|
|
271
|
+
return res.status(400).json({
|
|
272
|
+
error: 'Replay protection failed',
|
|
273
|
+
details: replayValidation.error
|
|
274
|
+
});
|
|
275
|
+
}
|
|
276
|
+
// Check if transaction already processed
|
|
277
|
+
const txHash = crypto.createHash('sha256').update(JSON.stringify(enforcedRequest)).digest('hex');
|
|
278
|
+
if (this.processedTransactions.has(txHash)) {
|
|
279
|
+
return res.status(400).json({ error: 'Transaction already processed' });
|
|
280
|
+
}
|
|
281
|
+
// Deserialize and validate transaction
|
|
282
|
+
const transaction = web3_js_1.VersionedTransaction.deserialize(Buffer.from(req.body.transaction, 'base64'));
|
|
283
|
+
// Get recent blockhash for transaction
|
|
284
|
+
const { blockhash, lastValidBlockHeight } = await this.connection.getLatestBlockhash();
|
|
285
|
+
transaction.message.recentBlockhash = blockhash;
|
|
286
|
+
// Simulate transaction
|
|
287
|
+
const simulation = await this.connection.simulateTransaction(transaction);
|
|
288
|
+
if (simulation.value.err) {
|
|
289
|
+
return res.status(400).json({
|
|
290
|
+
error: 'Transaction simulation failed',
|
|
291
|
+
details: simulation.value.err
|
|
292
|
+
});
|
|
293
|
+
}
|
|
294
|
+
// Broadcast transaction
|
|
295
|
+
const signature = await this.connection.sendRawTransaction(transaction.serialize(), {
|
|
296
|
+
skipPreflight: false,
|
|
297
|
+
preflightCommitment: 'confirmed',
|
|
298
|
+
});
|
|
299
|
+
// Mark as processed
|
|
300
|
+
this.processedTransactions.add(txHash);
|
|
301
|
+
// Update metrics
|
|
302
|
+
const endTime = Date.now();
|
|
303
|
+
this.metrics.total++;
|
|
304
|
+
this.metrics.successful++;
|
|
305
|
+
this.metrics.averageLatency = (this.metrics.averageLatency + (endTime - startTime)) / 2;
|
|
306
|
+
// Return success response
|
|
307
|
+
const response = {
|
|
308
|
+
success: true,
|
|
309
|
+
hopCount: 1,
|
|
310
|
+
relayPath: [NODE_ID],
|
|
311
|
+
};
|
|
312
|
+
res.json(response);
|
|
313
|
+
}
|
|
314
|
+
catch (error) {
|
|
315
|
+
const endTime = Date.now();
|
|
316
|
+
this.metrics.total++;
|
|
317
|
+
this.metrics.failed++;
|
|
318
|
+
this.metrics.averageLatency = (this.metrics.averageLatency + (endTime - startTime)) / 2;
|
|
319
|
+
console.error('Relay error:', error);
|
|
320
|
+
res.status(500).json({
|
|
321
|
+
success: false,
|
|
322
|
+
error: error instanceof Error ? error.message : 'Broadcast failed',
|
|
323
|
+
hopCount: 1,
|
|
324
|
+
relayPath: [NODE_ID],
|
|
325
|
+
});
|
|
326
|
+
}
|
|
327
|
+
}
|
|
328
|
+
async validateTransaction(req) {
|
|
329
|
+
try {
|
|
330
|
+
if (!req.transaction) {
|
|
331
|
+
return { valid: false, error: 'Missing transaction' };
|
|
332
|
+
}
|
|
333
|
+
// Size validation
|
|
334
|
+
if (req.transaction.length > MAX_RELAY_SIZE) {
|
|
335
|
+
return { valid: false, error: 'Transaction too large' };
|
|
336
|
+
}
|
|
337
|
+
// Deserialize and validate transaction
|
|
338
|
+
const txBuffer = Buffer.from(req.transaction, 'base64');
|
|
339
|
+
const tx = web3_js_1.VersionedTransaction.deserialize(txBuffer);
|
|
340
|
+
// Basic transaction validation
|
|
341
|
+
if (tx.signatures.length === 0) {
|
|
342
|
+
return { valid: false, error: 'Transaction not signed' };
|
|
343
|
+
}
|
|
344
|
+
// Fee validation (minimum fee check)
|
|
345
|
+
const message = tx.message;
|
|
346
|
+
if (message.recentBlockhash === '11111111111111111111111111111111') {
|
|
347
|
+
return { valid: false, error: 'Invalid blockhash' };
|
|
348
|
+
}
|
|
349
|
+
return { valid: true };
|
|
350
|
+
}
|
|
351
|
+
catch (error) {
|
|
352
|
+
return { valid: false, error: 'Invalid transaction format' };
|
|
353
|
+
}
|
|
354
|
+
}
|
|
355
|
+
async broadcastTransaction(transaction) {
|
|
356
|
+
try {
|
|
357
|
+
const txBuffer = Buffer.from(transaction, 'base64');
|
|
358
|
+
const tx = web3_js_1.VersionedTransaction.deserialize(txBuffer);
|
|
359
|
+
// Add jitter for privacy
|
|
360
|
+
const jitterMs = Math.floor(Math.random() * 200) + 50;
|
|
361
|
+
await new Promise(resolve => setTimeout(resolve, jitterMs));
|
|
362
|
+
const txid = await this.connection.sendRawTransaction(txBuffer, {
|
|
363
|
+
skipPreflight: false, // Enable preflight for validation
|
|
364
|
+
maxRetries: 3,
|
|
365
|
+
preflightCommitment: 'confirmed',
|
|
366
|
+
});
|
|
367
|
+
return {
|
|
368
|
+
success: true,
|
|
369
|
+
txid,
|
|
370
|
+
hopCount: 1,
|
|
371
|
+
relayPath: [NODE_ID],
|
|
372
|
+
};
|
|
373
|
+
}
|
|
374
|
+
catch (error) {
|
|
375
|
+
return {
|
|
376
|
+
success: false,
|
|
377
|
+
error: error instanceof Error ? error.message : 'Broadcast failed',
|
|
378
|
+
hopCount: 1,
|
|
379
|
+
relayPath: [NODE_ID],
|
|
380
|
+
};
|
|
381
|
+
}
|
|
382
|
+
}
|
|
383
|
+
verifySignature(message, signature, publicKey) {
|
|
384
|
+
// Ed25519 signature verification with timing attack resistance
|
|
385
|
+
try {
|
|
386
|
+
// Convert hex/base64 signature to Buffer
|
|
387
|
+
const signatureBuffer = Buffer.from(signature, 'hex');
|
|
388
|
+
// Convert public key string to Buffer
|
|
389
|
+
const publicKeyBuffer = Buffer.from(publicKey, 'hex');
|
|
390
|
+
// Convert message to Buffer
|
|
391
|
+
const messageBuffer = Buffer.from(message, 'utf8');
|
|
392
|
+
// Verify Ed25519 signature
|
|
393
|
+
return tweetnacl.sign.detached.verify(messageBuffer, signatureBuffer, publicKeyBuffer);
|
|
394
|
+
}
|
|
395
|
+
catch (error) {
|
|
396
|
+
console.error('Signature verification failed:', error);
|
|
397
|
+
return false;
|
|
398
|
+
}
|
|
399
|
+
}
|
|
400
|
+
cleanupSignatures() {
|
|
401
|
+
const now = Date.now();
|
|
402
|
+
const cutoffTime = now - (10 * 60 * 1000); // 10 minutes ago
|
|
403
|
+
for (const [hash, timestamp] of this.usedSignatures.entries()) {
|
|
404
|
+
if (timestamp < cutoffTime) {
|
|
405
|
+
this.usedSignatures.delete(hash);
|
|
406
|
+
}
|
|
407
|
+
}
|
|
408
|
+
}
|
|
409
|
+
checkRateLimit(publicKey) {
|
|
410
|
+
const now = Date.now();
|
|
411
|
+
const entry = this.rateLimits.get(publicKey);
|
|
412
|
+
if (!entry || now > entry.resetTime) {
|
|
413
|
+
this.rateLimits.set(publicKey, {
|
|
414
|
+
count: 1,
|
|
415
|
+
resetTime: now + RATE_LIMIT_WINDOW,
|
|
416
|
+
});
|
|
417
|
+
return true;
|
|
418
|
+
}
|
|
419
|
+
if (entry.count >= RATE_LIMIT_MAX) {
|
|
420
|
+
return false;
|
|
421
|
+
}
|
|
422
|
+
entry.count++;
|
|
423
|
+
return true;
|
|
424
|
+
}
|
|
425
|
+
async measureLatency() {
|
|
426
|
+
const start = Date.now();
|
|
427
|
+
try {
|
|
428
|
+
await this.connection.getLatestBlockhash();
|
|
429
|
+
return Date.now() - start;
|
|
430
|
+
}
|
|
431
|
+
catch {
|
|
432
|
+
return -1;
|
|
433
|
+
}
|
|
434
|
+
}
|
|
435
|
+
updateMetrics(success, latency) {
|
|
436
|
+
this.metrics.total++;
|
|
437
|
+
if (success) {
|
|
438
|
+
this.metrics.successful++;
|
|
439
|
+
this.metrics.totalBounty += BOUNTY_RATE_SOL;
|
|
440
|
+
}
|
|
441
|
+
else {
|
|
442
|
+
this.metrics.failed++;
|
|
443
|
+
}
|
|
444
|
+
// Update average latency
|
|
445
|
+
this.metrics.averageLatency = (this.metrics.averageLatency * 0.9) + (latency * 0.1);
|
|
446
|
+
// Update time-based metrics
|
|
447
|
+
const now = Date.now();
|
|
448
|
+
this.metrics.lastHour++;
|
|
449
|
+
this.metrics.lastDay++;
|
|
450
|
+
}
|
|
451
|
+
async getRelayerStatus(req, res) {
|
|
452
|
+
const { publicKey } = req.params;
|
|
453
|
+
const relayerKey = Array.isArray(publicKey) ? publicKey[0] : publicKey;
|
|
454
|
+
const relayer = this.registeredRelayers.get(relayerKey);
|
|
455
|
+
if (!relayer) {
|
|
456
|
+
return res.status(404).json({ error: 'Relayer not found' });
|
|
457
|
+
}
|
|
458
|
+
res.json({
|
|
459
|
+
publicKey: relayer.publicKey,
|
|
460
|
+
reputation: relayer.reputation,
|
|
461
|
+
totalRelays: relayer.totalRelays,
|
|
462
|
+
successRate: relayer.successRate,
|
|
463
|
+
slashedAmount: relayer.slashedAmount,
|
|
464
|
+
lastSeen: relayer.lastSeen,
|
|
465
|
+
registeredAt: relayer.registeredAt,
|
|
466
|
+
});
|
|
467
|
+
}
|
|
468
|
+
async getMetrics(req, res) {
|
|
469
|
+
res.json({
|
|
470
|
+
...this.metrics,
|
|
471
|
+
registeredRelayers: this.registeredRelayers.size,
|
|
472
|
+
activeConnections: this.rateLimits.size,
|
|
473
|
+
processedTransactions: this.processedTransactions.size,
|
|
474
|
+
});
|
|
475
|
+
}
|
|
476
|
+
async slashRelayer(req, res) {
|
|
477
|
+
const { publicKey, amount, reason } = req.body;
|
|
478
|
+
if (!publicKey || !amount || !reason) {
|
|
479
|
+
return res.status(400).json({ error: 'Missing required fields' });
|
|
480
|
+
}
|
|
481
|
+
const relayer = this.registeredRelayers.get(publicKey);
|
|
482
|
+
if (!relayer) {
|
|
483
|
+
return res.status(404).json({ error: 'Relayer not found' });
|
|
484
|
+
}
|
|
485
|
+
relayer.reputation = Math.max(0, relayer.reputation - amount);
|
|
486
|
+
relayer.slashedAmount += amount;
|
|
487
|
+
console.log(` Slashed relayer ${publicKey.slice(0, 8)}...: ${amount} - ${reason}`);
|
|
488
|
+
res.json({
|
|
489
|
+
success: true,
|
|
490
|
+
newReputation: relayer.reputation,
|
|
491
|
+
totalSlashed: relayer.slashedAmount,
|
|
492
|
+
});
|
|
493
|
+
}
|
|
494
|
+
errorHandler(err, req, res, next) {
|
|
495
|
+
console.error('Unhandled error:', err);
|
|
496
|
+
res.status(500).json({ error: 'Internal server error' });
|
|
497
|
+
}
|
|
498
|
+
startCleanupTasks() {
|
|
499
|
+
// Clean up old rate limit entries
|
|
500
|
+
setInterval(() => {
|
|
501
|
+
const now = Date.now();
|
|
502
|
+
for (const [key, entry] of this.rateLimits.entries()) {
|
|
503
|
+
if (now > entry.resetTime) {
|
|
504
|
+
this.rateLimits.delete(key);
|
|
505
|
+
}
|
|
506
|
+
}
|
|
507
|
+
}, 60000); // Every minute
|
|
508
|
+
// Clean up old processed transactions
|
|
509
|
+
setInterval(() => {
|
|
510
|
+
if (this.processedTransactions.size > 10000) {
|
|
511
|
+
// Keep only recent transactions
|
|
512
|
+
const entries = Array.from(this.processedTransactions);
|
|
513
|
+
this.processedTransactions.clear();
|
|
514
|
+
entries.slice(-5000).forEach(tx => this.processedTransactions.add(tx));
|
|
515
|
+
}
|
|
516
|
+
}, 300000); // Every 5 minutes
|
|
517
|
+
// Reset time-based metrics
|
|
518
|
+
setInterval(() => {
|
|
519
|
+
this.metrics.lastHour = 0;
|
|
520
|
+
}, 3600000); // Every hour
|
|
521
|
+
setInterval(() => {
|
|
522
|
+
this.metrics.lastDay = 0;
|
|
523
|
+
}, 86400000); // Every day
|
|
524
|
+
}
|
|
525
|
+
start() {
|
|
526
|
+
this.app.listen(PORT, () => {
|
|
527
|
+
console.log(` SolVoid Secure Relayer Ready on ${PORT}`);
|
|
528
|
+
console.log(` Node ID: ${NODE_ID}`);
|
|
529
|
+
console.log(` Bounty Rate: ${BOUNTY_RATE_SOL} SOL per relay`);
|
|
530
|
+
console.log(` Rate Limit: ${RATE_LIMIT_MAX} requests per minute`);
|
|
531
|
+
});
|
|
532
|
+
}
|
|
533
|
+
}
|
|
534
|
+
exports.SecureRelayerService = SecureRelayerService;
|
|
535
|
+
// Start the secure relayer service
|
|
536
|
+
const relayer = new SecureRelayerService();
|
|
537
|
+
relayer.start();
|
|
538
|
+
//# sourceMappingURL=secure-service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"secure-service.js","sourceRoot":"","sources":["../../relayer/secure-service.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
#!/usr/bin/node
|
|
2
|
+
/**
|
|
3
|
+
* SolVoid Shadow Relayer Service: Multi-hop transaction orchestration node.
|
|
4
|
+
* Implements onion-routing for transaction obfuscation and gasless submission.
|
|
5
|
+
*/
|
|
6
|
+
interface RelayerNode {
|
|
7
|
+
readonly id: string;
|
|
8
|
+
readonly endpoint: string;
|
|
9
|
+
readonly publicKey: string;
|
|
10
|
+
lastSeen: number;
|
|
11
|
+
successRate: number;
|
|
12
|
+
readonly region: string;
|
|
13
|
+
}
|
|
14
|
+
/** Registry for decentralized peer topology. */
|
|
15
|
+
declare const peerRegistry: Map<string, RelayerNode>;
|
|
16
|
+
/** Service telemetry and performance metrics. */
|
|
17
|
+
declare const metrics: {
|
|
18
|
+
relayed: number;
|
|
19
|
+
failed: number;
|
|
20
|
+
totalBountySOL: number;
|
|
21
|
+
uptime: number;
|
|
22
|
+
};
|
|
23
|
+
declare const app: import("express-serve-static-core").Express;
|
|
24
|
+
export { app, peerRegistry, metrics };
|
|
25
|
+
//# sourceMappingURL=service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"service.d.ts","sourceRoot":"","sources":["../../relayer/service.ts"],"names":[],"mappings":";AAEA;;;GAGG;AAsCH,UAAU,WAAW;IACjB,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;CAC3B;AAED,gDAAgD;AAChD,QAAA,MAAM,YAAY,EAAE,GAAG,CAAC,MAAM,EAAE,WAAW,CAAa,CAAC;AAEzD,iDAAiD;AACjD,QAAA,MAAM,OAAO;;;;;CAKZ,CAAC;AAEF,QAAA,MAAM,GAAG,6CAAY,CAAC;AAwYtB,OAAO,EAAE,GAAG,EAAE,YAAY,EAAE,OAAO,EAAE,CAAC"}
|