Skip to content

Commit b09a41d

Browse files
committed
feat+ref!: create peer and dsq pools, rework event streams
1 parent 418d5e7 commit b09a41d

File tree

3 files changed

+360
-158
lines changed

3 files changed

+360
-158
lines changed

public/dashjoin.js

Lines changed: 100 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -4,12 +4,25 @@ var DashJoin = ('object' === typeof module && exports) || {};
44

55
let DashP2P = window.DashP2P || require('dashp2p');
66

7+
const DV_LITTLE_ENDIAN = true;
8+
79
const DENOM_LOWEST = 100001;
810
const PREDENOM_MIN = DENOM_LOWEST + 193;
911
const COLLATERAL = 10000; // DENOM_LOWEST / 10
1012
const PAYLOAD_SIZE_MAX = 4 * 1024 * 1024;
1113

12-
const DSQ_SIZE = 1; // 1-byte bool
14+
let STANDARD_DENOMINATIONS_MAP = {
15+
// 0.00100001
16+
0b00010000: 100001,
17+
// 0.01000010
18+
0b00001000: 1000010,
19+
// 0.10000100
20+
0b00000100: 10000100,
21+
// 1.00001000
22+
0b00000010: 100001000,
23+
// 10.00010000
24+
0b00000001: 1000010000,
25+
};
1326

1427
// https://github.com/dashpay/dash/blob/v19.x/src/coinjoin/coinjoin.h#L39
1528
// const COINJOIN_ENTRY_MAX_SIZE = 9; // real
@@ -31,6 +44,7 @@ var DashJoin = ('object' === typeof module && exports) || {};
3144

3245
let Packers = {};
3346
let Parsers = {};
47+
let Sizes = {};
3448
let Utils = {};
3549

3650
// Ask Niles if there's an layman-ish obvious way to do this
@@ -52,29 +66,98 @@ var DashJoin = ('object' === typeof module && exports) || {};
5266
* @param {Uint8Array?} [opts.message]
5367
* @param {Boolean?} [opts.send]
5468
*/
55-
Packers.senddsq = function ({ network, message = null, send = true }) {
56-
// const command = 'senddsq';
57-
// if (!message) {
58-
// let dsqSize = DashP2P.sizes.HEADER_SIZE + DSQ_SIZE;
59-
// message = new Uint8Array(dsqSize);
60-
// }
61-
62-
let payload = new Uint8Array(1);
69+
Packers.senddsq = function ({
70+
network = 'mainnet',
71+
message = null,
72+
send = true,
73+
}) {
74+
const command = 'senddsq';
75+
const SENDDSQ_SIZE = 1; // 1-byte bool
76+
77+
if (!message) {
78+
let dsqSize = DashP2P.sizes.HEADER_SIZE + SENDDSQ_SIZE;
79+
message = new Uint8Array(dsqSize);
80+
}
81+
82+
let payload = message.subarray(DashP2P.sizes.HEADER_SIZE);
6383
if (send) {
6484
payload.set([0x01], 0);
6585
} else {
6686
payload.set([0x00], 0);
6787
}
6888

69-
// let payload = message.subarray(DashP2P.sizes.HEADER_SIZE);
70-
// payload.set(sendByte, 0);
71-
// void DashP2P.packers.message({ network, command, bytes: message });
72-
// return {
73-
// message,
74-
// payload,
75-
// };
89+
void DashP2P.packers.message({ network, command, bytes: message });
90+
return message;
91+
// return { message, payload };
92+
};
93+
94+
Sizes.DSQ_SIZE = 142;
95+
// DSQ stuff??
96+
Sizes.DENOM = 4;
97+
Sizes.PROTX = 32;
98+
Sizes.TIME = 8;
99+
Sizes.READY = 1;
100+
Sizes.SIG = 97;
101+
//
102+
103+
// Sizes.DSSU_SIZE = 16;
104+
// Sizes.SESSION_ID_SIZE = 4;
76105

77-
return payload;
106+
/**
107+
* @param {Uint8Array} bytes
108+
*/
109+
Parsers.dsq = function (bytes) {
110+
if (bytes.length !== Sizes.DSQ_SIZE) {
111+
let msg = `developer error: 'dsq' must be ${Sizes.DSQ_SIZE} bytes, but received ${bytes.length}`;
112+
throw new Error(msg);
113+
}
114+
let dv = new DataView(bytes.buffer);
115+
116+
let offset = 0;
117+
118+
let denomination_id = dv.getUint32(offset, DV_LITTLE_ENDIAN);
119+
offset += Sizes.DENOM;
120+
121+
//@ts-ignore - correctness of denomination must be checked higher up
122+
let denomination = STANDARD_DENOMINATIONS_MAP[denomination_id];
123+
124+
/**
125+
* Grab the protxhash
126+
*/
127+
let protxhash_bytes = bytes.subarray(offset, offset + Sizes.PROTX);
128+
offset += Sizes.PROTX;
129+
130+
/**
131+
* Grab the time
132+
*/
133+
let timestamp64n = dv.getBigInt64(offset, DV_LITTLE_ENDIAN);
134+
offset += Sizes.TIME;
135+
let timestamp_unix = Number(timestamp64n);
136+
let timestampMs = timestamp_unix * 1000;
137+
let timestampDate = new Date(timestampMs);
138+
let timestamp = timestampDate.toISOString();
139+
140+
/**
141+
* Grab the fReady
142+
*/
143+
let ready = bytes[offset] > 0x00;
144+
offset += Sizes.READY;
145+
146+
let signature_bytes = bytes.subarray(offset, offset + Sizes.SIG);
147+
148+
let dsqMessage = {
149+
denomination_id,
150+
denomination,
151+
protxhash_bytes,
152+
// protxhash: '',
153+
timestamp_unix,
154+
timestamp,
155+
ready,
156+
signature_bytes,
157+
// signature: '',
158+
};
159+
160+
return dsqMessage;
78161
};
79162

80163
Utils.hexToBytes = function (hex) {

0 commit comments

Comments
 (0)