Source: workers/packets.js

  1. /*!
  2. * packets.js - worker packets for bcoin
  3. * Copyright (c) 2014-2017, Christopher Jeffrey (MIT License).
  4. * https://github.com/bcoin-org/bcoin
  5. */
  6. 'use strict';
  7. /**
  8. * @module workers/packets
  9. */
  10. const assert = require('bsert');
  11. const bio = require('bufio');
  12. const Script = require('../script/script');
  13. const Witness = require('../script/witness');
  14. const Output = require('../primitives/output');
  15. const MTX = require('../primitives/mtx');
  16. const TX = require('../primitives/tx');
  17. const KeyRing = require('../primitives/keyring');
  18. const CoinView = require('../coins/coinview');
  19. const ScriptError = require('../script/scripterror');
  20. const {encoding} = bio;
  21. /*
  22. * Constants
  23. */
  24. const packetTypes = {
  25. ENV: 0,
  26. EVENT: 1,
  27. LOG: 2,
  28. ERROR: 3,
  29. ERRORRESULT: 4,
  30. CHECK: 5,
  31. CHECKRESULT: 6,
  32. SIGN: 7,
  33. SIGNRESULT: 8,
  34. CHECKINPUT: 9,
  35. CHECKINPUTRESULT: 10,
  36. SIGNINPUT: 11,
  37. SIGNINPUTRESULT: 12,
  38. ECVERIFY: 13,
  39. ECVERIFYRESULT: 14,
  40. ECSIGN: 15,
  41. ECSIGNRESULT: 16,
  42. MINE: 17,
  43. MINERESULT: 18,
  44. SCRYPT: 19,
  45. SCRYPTRESULT: 20
  46. };
  47. /**
  48. * Packet
  49. */
  50. class Packet {
  51. constructor() {
  52. this.id = ++Packet.id >>> 0;
  53. this.cmd = -1;
  54. }
  55. getSize() {
  56. throw new Error('Abstract method.');
  57. }
  58. toWriter() {
  59. throw new Error('Abstract method.');
  60. }
  61. fromRaw() {
  62. throw new Error('Abstract method.');
  63. }
  64. static fromRaw() {
  65. throw new Error('Abstract method.');
  66. }
  67. }
  68. Packet.id = 0;
  69. /**
  70. * EnvPacket
  71. */
  72. class EnvPacket extends Packet {
  73. constructor(env) {
  74. super();
  75. this.cmd = packetTypes.ENV;
  76. this.env = env || {};
  77. this.json = JSON.stringify(this.env);
  78. }
  79. getSize() {
  80. return encoding.sizeVarString(this.json, 'utf8');
  81. }
  82. toWriter(bw) {
  83. bw.writeVarString(this.json, 'utf8');
  84. return bw;
  85. }
  86. fromRaw(data) {
  87. const br = bio.read(data, true);
  88. this.json = br.readVarString('utf8');
  89. this.env = JSON.parse(this.json);
  90. return this;
  91. }
  92. static fromRaw(data) {
  93. return new EnvPacket().fromRaw(data);
  94. }
  95. }
  96. /**
  97. * EventPacket
  98. */
  99. class EventPacket extends Packet {
  100. constructor(items) {
  101. super();
  102. this.cmd = packetTypes.EVENT;
  103. this.items = items || [];
  104. this.json = JSON.stringify(this.items);
  105. }
  106. getSize() {
  107. return encoding.sizeVarString(this.json, 'utf8');
  108. }
  109. toWriter(bw) {
  110. bw.writeVarString(this.json, 'utf8');
  111. return bw;
  112. }
  113. fromRaw(data) {
  114. const br = bio.read(data, true);
  115. this.json = br.readVarString('utf8');
  116. this.items = JSON.parse(this.json);
  117. return this;
  118. }
  119. static fromRaw(data) {
  120. return new EventPacket().fromRaw(data);
  121. }
  122. }
  123. /**
  124. * LogPacket
  125. */
  126. class LogPacket extends Packet {
  127. constructor(text) {
  128. super();
  129. this.cmd = packetTypes.LOG;
  130. this.text = text || '';
  131. }
  132. getSize() {
  133. return encoding.sizeVarString(this.text, 'utf8');
  134. }
  135. toWriter(bw) {
  136. bw.writeVarString(this.text, 'utf8');
  137. return bw;
  138. }
  139. fromRaw(data) {
  140. const br = bio.read(data, true);
  141. this.text = br.readVarString('utf8');
  142. return this;
  143. }
  144. static fromRaw(data) {
  145. return new LogPacket().fromRaw(data);
  146. }
  147. }
  148. /**
  149. * ErrorPacket
  150. */
  151. class ErrorPacket extends Packet {
  152. constructor(error) {
  153. super();
  154. this.cmd = packetTypes.ERROR;
  155. this.error = error || new Error();
  156. }
  157. getSize() {
  158. const err = this.error;
  159. let size = 0;
  160. size += encoding.sizeVarString(stringify(err.message), 'utf8');
  161. size += encoding.sizeVarString(stringify(err.stack), 'utf8');
  162. size += encoding.sizeVarString(stringify(err.type), 'utf8');
  163. switch (typeof err.code) {
  164. case 'number':
  165. size += 1;
  166. size += 4;
  167. break;
  168. case 'string':
  169. size += 1;
  170. size += encoding.sizeVarString(err.code, 'utf8');
  171. break;
  172. default:
  173. size += 1;
  174. break;
  175. }
  176. return size;
  177. }
  178. toWriter(bw) {
  179. const err = this.error;
  180. bw.writeVarString(stringify(err.message), 'utf8');
  181. bw.writeVarString(stringify(err.stack), 'utf8');
  182. bw.writeVarString(stringify(err.type), 'utf8');
  183. switch (typeof err.code) {
  184. case 'number':
  185. bw.writeU8(2);
  186. bw.writeI32(err.code);
  187. break;
  188. case 'string':
  189. bw.writeU8(1);
  190. bw.writeVarString(err.code, 'utf8');
  191. break;
  192. default:
  193. bw.writeU8(0);
  194. break;
  195. }
  196. return bw;
  197. }
  198. fromRaw(data) {
  199. const br = bio.read(data, true);
  200. const err = this.error;
  201. err.message = br.readVarString('utf8');
  202. err.stack = br.readVarString('utf8');
  203. err.type = br.readVarString('utf8');
  204. switch (br.readU8()) {
  205. case 2:
  206. err.code = br.readI32();
  207. break;
  208. case 1:
  209. err.code = br.readVarString('utf8');
  210. break;
  211. default:
  212. err.code = null;
  213. break;
  214. }
  215. return this;
  216. }
  217. static fromRaw(data) {
  218. return new ErrorPacket().fromRaw(data);
  219. }
  220. }
  221. /**
  222. * ErrorResultPacket
  223. */
  224. class ErrorResultPacket extends ErrorPacket {
  225. constructor(error) {
  226. super(error);
  227. this.cmd = packetTypes.ERRORRESULT;
  228. }
  229. static fromRaw(data) {
  230. return new ErrorResultPacket().fromRaw(data);
  231. }
  232. }
  233. /**
  234. * CheckPacket
  235. */
  236. class CheckPacket extends Packet {
  237. constructor(tx, view, flags) {
  238. super();
  239. this.cmd = packetTypes.CHECK;
  240. this.tx = tx || null;
  241. this.view = view || null;
  242. this.flags = flags != null ? flags : null;
  243. }
  244. getSize() {
  245. return this.tx.getSize() + this.view.getSize(this.tx) + 4;
  246. }
  247. toWriter(bw) {
  248. this.tx.toWriter(bw);
  249. this.view.toWriter(bw, this.tx);
  250. bw.writeI32(this.flags != null ? this.flags : -1);
  251. return bw;
  252. }
  253. fromRaw(data) {
  254. const br = bio.read(data, true);
  255. this.tx = TX.fromReader(br);
  256. this.view = CoinView.fromReader(br, this.tx);
  257. this.flags = br.readI32();
  258. if (this.flags === -1)
  259. this.flags = null;
  260. return this;
  261. }
  262. static fromRaw(data) {
  263. return new CheckPacket().fromRaw(data);
  264. }
  265. }
  266. /**
  267. * CheckResultPacket
  268. */
  269. class CheckResultPacket extends Packet {
  270. constructor(error) {
  271. super();
  272. this.cmd = packetTypes.CHECKRESULT;
  273. this.error = error || null;
  274. }
  275. getSize() {
  276. const err = this.error;
  277. let size = 0;
  278. if (!err) {
  279. size += 1;
  280. return size;
  281. }
  282. size += 1;
  283. size += encoding.sizeVarString(stringify(err.message), 'utf8');
  284. size += encoding.sizeVarString(stringify(err.stack), 'utf8');
  285. size += encoding.sizeVarString(stringify(err.code), 'utf8');
  286. size += 1;
  287. size += 4;
  288. return size;
  289. }
  290. toWriter(bw) {
  291. const err = this.error;
  292. if (!err) {
  293. bw.writeU8(0);
  294. return bw;
  295. }
  296. bw.writeU8(1);
  297. bw.writeVarString(stringify(err.message), 'utf8');
  298. bw.writeVarString(stringify(err.stack), 'utf8');
  299. bw.writeVarString(stringify(err.code), 'utf8');
  300. bw.writeU8(err.op === -1 ? 0xff : err.op);
  301. bw.writeU32(err.ip === -1 ? 0xffffffff : err.ip);
  302. return bw;
  303. }
  304. fromRaw(data) {
  305. const br = bio.read(data, true);
  306. if (br.readU8() === 0)
  307. return this;
  308. const err = new ScriptError('');
  309. err.message = br.readVarString('utf8');
  310. err.stack = br.readVarString('utf8');
  311. err.code = br.readVarString('utf8');
  312. err.op = br.readU8();
  313. err.ip = br.readU32();
  314. if (err.op === 0xff)
  315. err.op = -1;
  316. if (err.ip === 0xffffffff)
  317. err.ip = -1;
  318. this.error = err;
  319. return this;
  320. }
  321. static fromRaw(data) {
  322. return new CheckResultPacket().fromRaw(data);
  323. }
  324. }
  325. /**
  326. * SignPacket
  327. */
  328. class SignPacket extends Packet {
  329. constructor(tx, rings, type) {
  330. super();
  331. this.cmd = packetTypes.SIGN;
  332. this.tx = tx || null;
  333. this.rings = rings || [];
  334. this.type = type != null ? type : 1;
  335. }
  336. getSize() {
  337. let size = 0;
  338. size += this.tx.getSize();
  339. size += this.tx.view.getSize(this.tx);
  340. size += encoding.sizeVarint(this.rings.length);
  341. for (const ring of this.rings)
  342. size += ring.getSize();
  343. size += 1;
  344. return size;
  345. }
  346. toWriter(bw) {
  347. this.tx.toWriter(bw);
  348. this.tx.view.toWriter(bw, this.tx);
  349. bw.writeVarint(this.rings.length);
  350. for (const ring of this.rings)
  351. ring.toWriter(bw);
  352. bw.writeU8(this.type);
  353. return bw;
  354. }
  355. fromRaw(data) {
  356. const br = bio.read(data, true);
  357. this.tx = MTX.fromReader(br);
  358. this.tx.view.fromReader(br, this.tx);
  359. const count = br.readVarint();
  360. for (let i = 0; i < count; i++) {
  361. const ring = KeyRing.fromReader(br);
  362. this.rings.push(ring);
  363. }
  364. this.type = br.readU8();
  365. return this;
  366. }
  367. static fromRaw(data) {
  368. return new SignPacket().fromRaw(data);
  369. }
  370. }
  371. /**
  372. * SignResultPacket
  373. */
  374. class SignResultPacket extends Packet {
  375. constructor(total, witness, script) {
  376. super();
  377. this.cmd = packetTypes.SIGNRESULT;
  378. this.total = total || 0;
  379. this.script = script || [];
  380. this.witness = witness || [];
  381. }
  382. fromTX(tx, total) {
  383. this.total = total;
  384. for (const input of tx.inputs) {
  385. this.script.push(input.script);
  386. this.witness.push(input.witness);
  387. }
  388. return this;
  389. }
  390. static fromTX(tx, total) {
  391. return new SignResultPacket().fromTX(tx, total);
  392. }
  393. getSize() {
  394. let size = 0;
  395. size += encoding.sizeVarint(this.total);
  396. size += encoding.sizeVarint(this.script.length);
  397. for (let i = 0; i < this.script.length; i++) {
  398. const script = this.script[i];
  399. const witness = this.witness[i];
  400. size += script.getVarSize();
  401. size += witness.getVarSize();
  402. }
  403. return size;
  404. }
  405. toWriter(bw) {
  406. assert(this.script.length === this.witness.length);
  407. bw.writeVarint(this.total);
  408. bw.writeVarint(this.script.length);
  409. for (let i = 0; i < this.script.length; i++) {
  410. this.script[i].toWriter(bw);
  411. this.witness[i].toWriter(bw);
  412. }
  413. return bw;
  414. }
  415. inject(tx) {
  416. assert(this.script.length === tx.inputs.length);
  417. assert(this.witness.length === tx.inputs.length);
  418. for (let i = 0; i < tx.inputs.length; i++) {
  419. const input = tx.inputs[i];
  420. input.script = this.script[i];
  421. input.witness = this.witness[i];
  422. }
  423. }
  424. fromRaw(data) {
  425. const br = bio.read(data, true);
  426. this.total = br.readVarint();
  427. const count = br.readVarint();
  428. for (let i = 0; i < count; i++) {
  429. this.script.push(Script.fromReader(br));
  430. this.witness.push(Witness.fromReader(br));
  431. }
  432. return this;
  433. }
  434. static fromRaw(data) {
  435. return new SignResultPacket().fromRaw(data);
  436. }
  437. }
  438. /**
  439. * CheckInputPacket
  440. */
  441. class CheckInputPacket extends Packet {
  442. constructor(tx, index, coin, flags) {
  443. super();
  444. this.cmd = packetTypes.CHECKINPUT;
  445. this.tx = tx || null;
  446. this.index = index;
  447. this.coin = coin || null;
  448. this.flags = flags != null ? flags : null;
  449. }
  450. getSize() {
  451. let size = 0;
  452. size += this.tx.getSize();
  453. size += encoding.sizeVarint(this.index);
  454. size += encoding.sizeVarint(this.coin.value);
  455. size += this.coin.script.getVarSize();
  456. size += 4;
  457. return size;
  458. }
  459. toWriter(bw) {
  460. this.tx.toWriter(bw);
  461. bw.writeVarint(this.index);
  462. bw.writeVarint(this.coin.value);
  463. this.coin.script.toWriter(bw);
  464. bw.writeI32(this.flags != null ? this.flags : -1);
  465. return bw;
  466. }
  467. fromRaw(data) {
  468. const br = bio.read(data, true);
  469. this.tx = TX.fromReader(br);
  470. this.index = br.readVarint();
  471. this.coin = new Output();
  472. this.coin.value = br.readVarint();
  473. this.coin.script.fromReader(br);
  474. this.flags = br.readI32();
  475. if (this.flags === -1)
  476. this.flags = null;
  477. return this;
  478. }
  479. static fromRaw(data) {
  480. return new CheckInputPacket().fromRaw(data);
  481. }
  482. }
  483. /**
  484. * CheckInputResultPacket
  485. */
  486. class CheckInputResultPacket extends CheckResultPacket {
  487. constructor(error) {
  488. super(error);
  489. this.cmd = packetTypes.CHECKINPUTRESULT;
  490. }
  491. static fromRaw(data) {
  492. return new CheckInputResultPacket().fromRaw(data);
  493. }
  494. }
  495. /**
  496. * SignInputPacket
  497. */
  498. class SignInputPacket extends Packet {
  499. constructor(tx, index, coin, ring, type) {
  500. super();
  501. this.cmd = packetTypes.SIGNINPUT;
  502. this.tx = tx || null;
  503. this.index = index;
  504. this.coin = coin || null;
  505. this.ring = ring || null;
  506. this.type = type != null ? type : 1;
  507. }
  508. getSize() {
  509. let size = 0;
  510. size += this.tx.getSize();
  511. size += encoding.sizeVarint(this.index);
  512. size += encoding.sizeVarint(this.coin.value);
  513. size += this.coin.script.getVarSize();
  514. size += this.ring.getSize();
  515. size += 1;
  516. return size;
  517. }
  518. toWriter(bw) {
  519. this.tx.toWriter(bw);
  520. bw.writeVarint(this.index);
  521. bw.writeVarint(this.coin.value);
  522. this.coin.script.toWriter(bw);
  523. this.ring.toWriter(bw);
  524. bw.writeU8(this.type);
  525. return bw;
  526. }
  527. fromRaw(data) {
  528. const br = bio.read(data, true);
  529. this.tx = MTX.fromReader(br);
  530. this.index = br.readVarint();
  531. this.coin = new Output();
  532. this.coin.value = br.readVarint();
  533. this.coin.script.fromReader(br);
  534. this.ring = KeyRing.fromReader(br);
  535. this.type = br.readU8();
  536. return this;
  537. }
  538. static fromRaw(data) {
  539. return new SignInputPacket().fromRaw(data);
  540. }
  541. }
  542. /**
  543. * SignInputResultPacket
  544. */
  545. class SignInputResultPacket extends Packet {
  546. constructor(value, witness, script) {
  547. super();
  548. this.cmd = packetTypes.SIGNINPUTRESULT;
  549. this.value = value || false;
  550. this.script = script || null;
  551. this.witness = witness || null;
  552. }
  553. fromTX(tx, i, value) {
  554. const input = tx.inputs[i];
  555. assert(input);
  556. this.value = value;
  557. this.script = input.script;
  558. this.witness = input.witness;
  559. return this;
  560. }
  561. static fromTX(tx, i, value) {
  562. return new SignInputResultPacket().fromTX(tx, i, value);
  563. }
  564. getSize() {
  565. return 1 + this.script.getVarSize() + this.witness.getVarSize();
  566. }
  567. toWriter(bw) {
  568. bw.writeU8(this.value ? 1 : 0);
  569. this.script.toWriter(bw);
  570. this.witness.toWriter(bw);
  571. return bw;
  572. }
  573. inject(tx, i) {
  574. const input = tx.inputs[i];
  575. assert(input);
  576. input.script = this.script;
  577. input.witness = this.witness;
  578. }
  579. fromRaw(data) {
  580. const br = bio.read(data, true);
  581. this.value = br.readU8() === 1;
  582. this.script = Script.fromReader(br);
  583. this.witness = Witness.fromReader(br);
  584. return this;
  585. }
  586. static fromRaw(data) {
  587. return new SignInputResultPacket().fromRaw(data);
  588. }
  589. }
  590. /**
  591. * ECVerifyPacket
  592. */
  593. class ECVerifyPacket extends Packet {
  594. constructor(msg, sig, key) {
  595. super();
  596. this.cmd = packetTypes.ECVERIFY;
  597. this.msg = msg || null;
  598. this.sig = sig || null;
  599. this.key = key || null;
  600. }
  601. getSize() {
  602. let size = 0;
  603. size += encoding.sizeVarBytes(this.msg);
  604. size += encoding.sizeVarBytes(this.sig);
  605. size += encoding.sizeVarBytes(this.key);
  606. return size;
  607. }
  608. toWriter(bw) {
  609. bw.writeVarBytes(this.msg);
  610. bw.writeVarBytes(this.sig);
  611. bw.writeVarBytes(this.key);
  612. return bw;
  613. }
  614. fromRaw(data) {
  615. const br = bio.read(data, true);
  616. this.msg = br.readVarBytes();
  617. this.sig = br.readVarBytes();
  618. this.key = br.readVarBytes();
  619. return this;
  620. }
  621. static fromRaw(data) {
  622. return new ECVerifyPacket().fromRaw(data);
  623. }
  624. }
  625. /**
  626. * ECVerifyResultPacket
  627. */
  628. class ECVerifyResultPacket extends Packet {
  629. constructor(value) {
  630. super();
  631. this.cmd = packetTypes.ECVERIFYRESULT;
  632. this.value = value;
  633. }
  634. getSize() {
  635. return 1;
  636. }
  637. toWriter(bw) {
  638. bw.writeU8(this.value ? 1 : 0);
  639. return bw;
  640. }
  641. fromRaw(data) {
  642. const br = bio.read(data, true);
  643. this.value = br.readU8() === 1;
  644. return this;
  645. }
  646. static fromRaw(data) {
  647. return new ECVerifyResultPacket().fromRaw(data);
  648. }
  649. }
  650. /**
  651. * ECSignPacket
  652. */
  653. class ECSignPacket extends Packet {
  654. constructor(msg, key) {
  655. super();
  656. this.cmd = packetTypes.ECSIGN;
  657. this.msg = msg || null;
  658. this.key = key || null;
  659. }
  660. getSize() {
  661. let size = 0;
  662. size += encoding.sizeVarBytes(this.msg);
  663. size += encoding.sizeVarBytes(this.key);
  664. return size;
  665. }
  666. toWriter(bw) {
  667. bw.writeVarBytes(this.msg);
  668. bw.writeVarBytes(this.key);
  669. return bw;
  670. }
  671. fromRaw(data) {
  672. const br = bio.read(data, true);
  673. this.msg = br.readVarBytes();
  674. this.key = br.readVarBytes();
  675. return this;
  676. }
  677. static fromRaw(data) {
  678. return new ECSignPacket().fromRaw(data);
  679. }
  680. }
  681. /**
  682. * ECSignResultPacket
  683. */
  684. class ECSignResultPacket extends Packet {
  685. constructor(sig) {
  686. super();
  687. this.cmd = packetTypes.ECSIGNRESULT;
  688. this.sig = sig;
  689. }
  690. getSize() {
  691. return encoding.sizeVarBytes(this.sig);
  692. }
  693. toWriter(bw) {
  694. bw.writeVarBytes(this.sig);
  695. return bw;
  696. }
  697. fromRaw(data) {
  698. const br = bio.read(data, true);
  699. this.sig = br.readVarBytes();
  700. return this;
  701. }
  702. static fromRaw(data) {
  703. return new ECSignResultPacket().fromRaw(data);
  704. }
  705. }
  706. /**
  707. * MinePacket
  708. */
  709. class MinePacket extends Packet {
  710. constructor(data, target, min, max) {
  711. super();
  712. this.cmd = packetTypes.MINE;
  713. this.data = data || null;
  714. this.target = target || null;
  715. this.min = min != null ? min : -1;
  716. this.max = max != null ? max : -1;
  717. }
  718. getSize() {
  719. return 120;
  720. }
  721. toWriter(bw) {
  722. bw.writeBytes(this.data);
  723. bw.writeBytes(this.target);
  724. bw.writeU32(this.min);
  725. bw.writeU32(this.max);
  726. return bw;
  727. }
  728. fromRaw(data) {
  729. const br = bio.read(data, true);
  730. this.data = br.readBytes(80);
  731. this.target = br.readBytes(32);
  732. this.min = br.readU32();
  733. this.max = br.readU32();
  734. return this;
  735. }
  736. static fromRaw(data) {
  737. return new MinePacket().fromRaw(data);
  738. }
  739. }
  740. /**
  741. * MineResultPacket
  742. */
  743. class MineResultPacket extends Packet {
  744. constructor(nonce) {
  745. super();
  746. this.cmd = packetTypes.MINERESULT;
  747. this.nonce = nonce != null ? nonce : -1;
  748. }
  749. getSize() {
  750. return 5;
  751. }
  752. toWriter(bw) {
  753. bw.writeU8(this.nonce !== -1 ? 1 : 0);
  754. bw.writeU32(this.nonce);
  755. return bw;
  756. }
  757. fromRaw(data) {
  758. const br = bio.read(data, true);
  759. this.nonce = -1;
  760. if (br.readU8() === 1)
  761. this.nonce = br.readU32();
  762. return this;
  763. }
  764. static fromRaw(data) {
  765. return new MineResultPacket().fromRaw(data);
  766. }
  767. }
  768. /**
  769. * ScryptPacket
  770. */
  771. class ScryptPacket extends Packet {
  772. constructor(passwd, salt, N, r, p, len) {
  773. super();
  774. this.cmd = packetTypes.SCRYPT;
  775. this.passwd = passwd || null;
  776. this.salt = salt || null;
  777. this.N = N != null ? N : -1;
  778. this.r = r != null ? r : -1;
  779. this.p = p != null ? p : -1;
  780. this.len = len != null ? len : -1;
  781. }
  782. getSize() {
  783. let size = 0;
  784. size += encoding.sizeVarBytes(this.passwd);
  785. size += encoding.sizeVarBytes(this.salt);
  786. size += 16;
  787. return size;
  788. }
  789. toWriter(bw) {
  790. bw.writeVarBytes(this.passwd);
  791. bw.writeVarBytes(this.salt);
  792. bw.writeU32(this.N);
  793. bw.writeU32(this.r);
  794. bw.writeU32(this.p);
  795. bw.writeU32(this.len);
  796. return bw;
  797. }
  798. fromRaw(data) {
  799. const br = bio.read(data, true);
  800. this.passwd = br.readVarBytes();
  801. this.salt = br.readVarBytes();
  802. this.N = br.readU32();
  803. this.r = br.readU32();
  804. this.p = br.readU32();
  805. this.len = br.readU32();
  806. return this;
  807. }
  808. static fromRaw(data) {
  809. return new ScryptPacket().fromRaw(data);
  810. }
  811. }
  812. /**
  813. * ScryptResultPacket
  814. */
  815. class ScryptResultPacket extends Packet {
  816. constructor(key) {
  817. super();
  818. this.cmd = packetTypes.SCRYPTRESULT;
  819. this.key = key || null;
  820. }
  821. getSize() {
  822. return encoding.sizeVarBytes(this.key);
  823. }
  824. toWriter(bw) {
  825. bw.writeVarBytes(this.key);
  826. return bw;
  827. }
  828. fromRaw(data) {
  829. const br = bio.read(data, true);
  830. this.key = br.readVarBytes();
  831. return this;
  832. }
  833. static fromRaw(data) {
  834. return new ScryptResultPacket().fromRaw(data);
  835. }
  836. }
  837. /*
  838. * Helpers
  839. */
  840. function stringify(value) {
  841. if (typeof value !== 'string')
  842. return '';
  843. return value;
  844. }
  845. /*
  846. * Expose
  847. */
  848. exports.types = packetTypes;
  849. exports.EnvPacket = EnvPacket;
  850. exports.EventPacket = EventPacket;
  851. exports.LogPacket = LogPacket;
  852. exports.ErrorPacket = ErrorPacket;
  853. exports.ErrorResultPacket = ErrorResultPacket;
  854. exports.CheckPacket = CheckPacket;
  855. exports.CheckResultPacket = CheckResultPacket;
  856. exports.SignPacket = SignPacket;
  857. exports.SignResultPacket = SignResultPacket;
  858. exports.CheckInputPacket = CheckInputPacket;
  859. exports.CheckInputResultPacket = CheckInputResultPacket;
  860. exports.SignInputPacket = SignInputPacket;
  861. exports.SignInputResultPacket = SignInputResultPacket;
  862. exports.ECVerifyPacket = ECVerifyPacket;
  863. exports.ECVerifyResultPacket = ECVerifyResultPacket;
  864. exports.ECSignPacket = ECSignPacket;
  865. exports.ECSignResultPacket = ECSignResultPacket;
  866. exports.MinePacket = MinePacket;
  867. exports.MineResultPacket = MineResultPacket;
  868. exports.ScryptPacket = ScryptPacket;
  869. exports.ScryptResultPacket = ScryptResultPacket;