itns-sidechain/lib/workers/packets.js

1089 lines
21 KiB
JavaScript
Raw Normal View History

2016-12-02 11:06:01 -08:00
/*!
* packets.js - worker packets for bcoin
2017-02-03 22:47:26 -08:00
* Copyright (c) 2014-2017, Christopher Jeffrey (MIT License).
2016-12-02 11:06:01 -08:00
* https://github.com/bcoin-org/bcoin
*/
'use strict';
2017-02-03 22:47:26 -08:00
/**
* @module workers/packets
*/
2017-06-29 20:54:07 -07:00
const assert = require('assert');
2017-11-16 11:43:24 -08:00
const bio = require('bufio');
2017-06-29 20:54:07 -07:00
const Script = require('../script/script');
const Witness = require('../script/witness');
const Output = require('../primitives/output');
2017-07-05 12:05:58 -07:00
const MTX = require('../primitives/mtx');
const TX = require('../primitives/tx');
const KeyRing = require('../primitives/keyring');
const CoinView = require('../coins/coinview');
const ScriptError = require('../script/scripterror');
2018-01-02 20:24:56 -08:00
const consensus = require('../protocol/consensus');
const {Solution} = require('thc/cuckoo');
2017-11-16 11:43:24 -08:00
const {encoding} = bio;
2016-12-02 11:06:01 -08:00
/*
* Constants
*/
2017-06-29 20:54:07 -07:00
const packetTypes = {
2017-07-07 09:04:52 -07:00
ENV: 0,
EVENT: 1,
LOG: 2,
ERROR: 3,
ERRORRESULT: 4,
CHECK: 5,
CHECKRESULT: 6,
2017-07-07 09:04:52 -07:00
SIGN: 7,
SIGNRESULT: 8,
CHECKINPUT: 9,
CHECKINPUTRESULT: 10,
2017-07-07 09:04:52 -07:00
SIGNINPUT: 11,
SIGNINPUTRESULT: 12,
ECVERIFY: 13,
ECVERIFYRESULT: 14,
ECSIGN: 15,
ECSIGNRESULT: 16,
MINE: 17,
MINERESULT: 18,
SCRYPT: 19,
SCRYPTRESULT: 20
2016-12-02 11:06:01 -08:00
};
/**
* Packet
*/
2017-11-16 20:26:28 -08:00
class Packet {
constructor() {
this.id = ++Packet.id >>> 0;
this.cmd = -1;
}
2016-12-02 11:06:01 -08:00
2017-11-16 20:26:28 -08:00
getSize() {
throw new Error('Abstract method.');
}
2016-12-02 11:06:01 -08:00
2017-11-16 20:26:28 -08:00
toWriter() {
throw new Error('Abstract method.');
}
2017-09-03 22:16:06 -07:00
2017-11-16 20:26:28 -08:00
fromRaw() {
throw new Error('Abstract method.');
}
2016-12-02 11:06:01 -08:00
2017-11-16 20:26:28 -08:00
static fromRaw() {
throw new Error('Abstract method.');
}
}
2017-09-03 22:16:06 -07:00
2017-11-16 20:26:28 -08:00
Packet.id = 0;
2017-09-03 22:16:06 -07:00
2017-07-07 09:04:52 -07:00
/**
* EnvPacket
*/
2017-11-16 20:26:28 -08:00
class EnvPacket extends Packet {
constructor(env) {
super();
this.cmd = packetTypes.ENV;
this.env = env || {};
this.json = JSON.stringify(this.env);
}
2017-07-07 09:04:52 -07:00
2017-11-16 20:26:28 -08:00
getSize() {
return encoding.sizeVarString(this.json, 'utf8');
}
2017-07-07 09:04:52 -07:00
2017-11-16 20:26:28 -08:00
toWriter(bw) {
bw.writeVarString(this.json, 'utf8');
return bw;
}
2017-07-07 09:04:52 -07:00
2017-11-16 20:26:28 -08:00
fromRaw(data) {
const br = bio.read(data, true);
this.json = br.readVarString('utf8');
this.env = JSON.parse(this.json);
return this;
}
2017-11-16 20:26:28 -08:00
static fromRaw(data) {
return new EnvPacket().fromRaw(data);
}
}
2017-07-07 09:04:52 -07:00
2016-12-02 11:06:01 -08:00
/**
* EventPacket
*/
2017-11-16 20:26:28 -08:00
class EventPacket extends Packet {
constructor(items) {
super();
this.cmd = packetTypes.EVENT;
this.items = items || [];
this.json = JSON.stringify(this.items);
}
2016-12-02 11:06:01 -08:00
2017-11-16 20:26:28 -08:00
getSize() {
return encoding.sizeVarString(this.json, 'utf8');
}
2016-12-11 18:57:15 -08:00
2017-11-16 20:26:28 -08:00
toWriter(bw) {
bw.writeVarString(this.json, 'utf8');
return bw;
}
2016-12-02 11:06:01 -08:00
2017-11-16 20:26:28 -08:00
fromRaw(data) {
const br = bio.read(data, true);
this.json = br.readVarString('utf8');
this.items = JSON.parse(this.json);
return this;
}
2017-11-16 20:26:28 -08:00
static fromRaw(data) {
return new EventPacket().fromRaw(data);
}
}
2016-12-02 11:06:01 -08:00
/**
* LogPacket
*/
2017-11-16 20:26:28 -08:00
class LogPacket extends Packet {
constructor(text) {
super();
this.cmd = packetTypes.LOG;
this.text = text || '';
}
2016-12-02 11:06:01 -08:00
2017-11-16 20:26:28 -08:00
getSize() {
return encoding.sizeVarString(this.text, 'utf8');
}
2016-12-11 18:57:15 -08:00
2017-11-16 20:26:28 -08:00
toWriter(bw) {
bw.writeVarString(this.text, 'utf8');
return bw;
}
2016-12-02 11:06:01 -08:00
2017-11-16 20:26:28 -08:00
fromRaw(data) {
const br = bio.read(data, true);
this.text = br.readVarString('utf8');
return this;
}
2017-11-16 20:26:28 -08:00
static fromRaw(data) {
return new LogPacket().fromRaw(data);
}
}
2016-12-02 11:06:01 -08:00
/**
* ErrorPacket
*/
2017-11-16 20:26:28 -08:00
class ErrorPacket extends Packet {
constructor(error) {
super();
this.cmd = packetTypes.ERROR;
this.error = error || new Error();
2017-07-07 09:04:52 -07:00
}
2017-11-16 20:26:28 -08:00
getSize() {
const err = this.error;
let size = 0;
size += encoding.sizeVarString(stringify(err.message), 'utf8');
size += encoding.sizeVarString(stringify(err.stack), 'utf8');
size += encoding.sizeVarString(stringify(err.type), 'utf8');
switch (typeof err.code) {
case 'number':
size += 1;
size += 4;
break;
case 'string':
size += 1;
size += encoding.sizeVarString(err.code, 'utf8');
break;
default:
size += 1;
break;
}
2016-12-11 18:57:15 -08:00
2017-11-16 20:26:28 -08:00
return size;
2017-07-07 09:04:52 -07:00
}
2017-11-16 20:26:28 -08:00
toWriter(bw) {
const err = this.error;
bw.writeVarString(stringify(err.message), 'utf8');
bw.writeVarString(stringify(err.stack), 'utf8');
bw.writeVarString(stringify(err.type), 'utf8');
switch (typeof err.code) {
case 'number':
bw.writeU8(2);
bw.writeI32(err.code);
break;
case 'string':
bw.writeU8(1);
bw.writeVarString(err.code, 'utf8');
break;
default:
bw.writeU8(0);
break;
}
2016-12-02 11:06:01 -08:00
2017-11-16 20:26:28 -08:00
return bw;
}
2017-07-07 09:04:52 -07:00
2017-11-16 20:26:28 -08:00
fromRaw(data) {
const br = bio.read(data, true);
const err = this.error;
err.message = br.readVarString('utf8');
err.stack = br.readVarString('utf8');
err.type = br.readVarString('utf8');
switch (br.readU8()) {
case 2:
err.code = br.readI32();
break;
case 1:
err.code = br.readVarString('utf8');
break;
default:
err.code = null;
break;
}
2017-07-07 09:04:52 -07:00
2017-11-16 20:26:28 -08:00
return this;
2017-07-07 09:04:52 -07:00
}
2017-11-16 20:26:28 -08:00
static fromRaw(data) {
return new ErrorPacket().fromRaw(data);
}
}
2016-12-02 11:06:01 -08:00
/**
* ErrorResultPacket
*/
2017-11-16 20:26:28 -08:00
class ErrorResultPacket extends ErrorPacket {
constructor(error) {
super(error);
this.cmd = packetTypes.ERRORRESULT;
}
2016-12-02 11:06:01 -08:00
2017-11-16 20:26:28 -08:00
static fromRaw(data) {
return new ErrorResultPacket().fromRaw(data);
}
}
2017-08-17 09:56:22 -07:00
2016-12-02 11:06:01 -08:00
/**
* CheckPacket
2016-12-02 11:06:01 -08:00
*/
2017-11-16 20:26:28 -08:00
class CheckPacket extends Packet {
constructor(tx, view, flags) {
super();
this.cmd = packetTypes.CHECK;
this.tx = tx || null;
this.view = view || null;
this.flags = flags != null ? flags : null;
}
2016-12-02 11:06:01 -08:00
2017-11-16 20:26:28 -08:00
getSize() {
return this.tx.getSize() + this.view.getSize(this.tx) + 4;
}
2016-12-11 18:57:15 -08:00
2017-11-16 20:26:28 -08:00
toWriter(bw) {
this.tx.toWriter(bw);
this.view.toWriter(bw, this.tx);
bw.writeI32(this.flags != null ? this.flags : -1);
return bw;
}
2016-12-02 11:06:01 -08:00
2017-11-16 20:26:28 -08:00
fromRaw(data) {
const br = bio.read(data, true);
2016-12-03 18:02:10 -08:00
2017-11-16 20:26:28 -08:00
this.tx = TX.fromReader(br);
this.view = CoinView.fromReader(br, this.tx);
this.flags = br.readI32();
2016-12-03 18:02:10 -08:00
2017-11-16 20:26:28 -08:00
if (this.flags === -1)
this.flags = null;
2016-12-03 18:02:10 -08:00
2017-11-16 20:26:28 -08:00
return this;
}
2017-11-16 20:26:28 -08:00
static fromRaw(data) {
return new CheckPacket().fromRaw(data);
}
}
2016-12-02 11:06:01 -08:00
/**
* CheckResultPacket
2016-12-02 11:06:01 -08:00
*/
2017-11-16 20:26:28 -08:00
class CheckResultPacket extends Packet {
constructor(error) {
super();
this.cmd = packetTypes.CHECKRESULT;
this.error = error || null;
}
2016-12-02 11:06:01 -08:00
2017-11-16 20:26:28 -08:00
getSize() {
const err = this.error;
2016-12-02 11:06:01 -08:00
2017-11-16 20:26:28 -08:00
let size = 0;
2017-11-16 20:26:28 -08:00
if (!err) {
size += 1;
return size;
}
size += 1;
2017-11-16 20:26:28 -08:00
size += encoding.sizeVarString(stringify(err.message), 'utf8');
size += encoding.sizeVarString(stringify(err.stack), 'utf8');
size += encoding.sizeVarString(stringify(err.code), 'utf8');
size += 1;
size += 4;
return size;
}
2017-11-16 20:26:28 -08:00
toWriter(bw) {
const err = this.error;
2017-11-16 20:26:28 -08:00
if (!err) {
bw.writeU8(0);
return bw;
}
2016-12-11 18:57:15 -08:00
2017-11-16 20:26:28 -08:00
bw.writeU8(1);
bw.writeVarString(stringify(err.message), 'utf8');
bw.writeVarString(stringify(err.stack), 'utf8');
bw.writeVarString(stringify(err.code), 'utf8');
bw.writeU8(err.op === -1 ? 0xff : err.op);
bw.writeU32(err.ip === -1 ? 0xffffffff : err.ip);
2017-09-04 16:46:47 -07:00
return bw;
}
2017-11-16 20:26:28 -08:00
fromRaw(data) {
const br = bio.read(data, true);
2017-11-16 20:26:28 -08:00
if (br.readU8() === 0)
return this;
2017-11-16 20:26:28 -08:00
const err = new ScriptError('');
2017-11-16 20:26:28 -08:00
err.message = br.readVarString('utf8');
err.stack = br.readVarString('utf8');
err.code = br.readVarString('utf8');
err.op = br.readU8();
err.ip = br.readU32();
2017-11-16 20:26:28 -08:00
if (err.op === 0xff)
err.op = -1;
2017-11-16 20:26:28 -08:00
if (err.ip === 0xffffffff)
err.ip = -1;
2017-11-16 20:26:28 -08:00
this.error = err;
2017-11-16 20:26:28 -08:00
return this;
}
2017-11-16 20:26:28 -08:00
static fromRaw(data) {
return new CheckResultPacket().fromRaw(data);
}
}
2016-12-02 11:06:01 -08:00
/**
* SignPacket
*/
2017-11-16 20:26:28 -08:00
class SignPacket extends Packet {
constructor(tx, rings, type) {
super();
this.cmd = packetTypes.SIGN;
this.tx = tx || null;
this.rings = rings || [];
this.type = type != null ? type : 1;
}
2016-12-02 11:06:01 -08:00
2017-11-16 20:26:28 -08:00
getSize() {
let size = 0;
2016-12-02 11:06:01 -08:00
2017-11-16 20:26:28 -08:00
size += this.tx.getSize();
size += this.tx.view.getSize(this.tx);
size += encoding.sizeVarint(this.rings.length);
2016-12-02 11:06:01 -08:00
2017-11-16 20:26:28 -08:00
for (const ring of this.rings)
size += ring.getSize();
2016-12-11 18:57:15 -08:00
2017-11-16 20:26:28 -08:00
size += 1;
2016-12-11 18:57:15 -08:00
2017-11-16 20:26:28 -08:00
return size;
}
2016-12-11 18:57:15 -08:00
2017-11-16 20:26:28 -08:00
toWriter(bw) {
this.tx.toWriter(bw);
this.tx.view.toWriter(bw, this.tx);
2016-12-11 18:57:15 -08:00
2017-11-16 20:26:28 -08:00
bw.writeVarint(this.rings.length);
2016-12-11 18:57:15 -08:00
2017-11-16 20:26:28 -08:00
for (const ring of this.rings)
ring.toWriter(bw);
2016-12-02 11:06:01 -08:00
2017-11-16 20:26:28 -08:00
bw.writeU8(this.type);
2016-12-02 11:06:01 -08:00
2017-11-16 20:26:28 -08:00
return bw;
}
2016-12-02 11:06:01 -08:00
2017-11-16 20:26:28 -08:00
fromRaw(data) {
const br = bio.read(data, true);
2017-11-16 20:26:28 -08:00
this.tx = MTX.fromReader(br);
this.tx.view.fromReader(br, this.tx);
2016-12-02 11:06:01 -08:00
2017-11-16 20:26:28 -08:00
const count = br.readVarint();
2016-12-02 11:06:01 -08:00
2017-11-16 20:26:28 -08:00
for (let i = 0; i < count; i++) {
const ring = KeyRing.fromReader(br);
this.rings.push(ring);
}
2016-12-02 11:06:01 -08:00
2017-11-16 20:26:28 -08:00
this.type = br.readU8();
2016-12-02 11:06:01 -08:00
2017-11-16 20:26:28 -08:00
return this;
2016-12-02 11:06:01 -08:00
}
2017-11-16 20:26:28 -08:00
static fromRaw(data) {
return new SignPacket().fromRaw(data);
}
}
2016-12-02 11:06:01 -08:00
/**
* SignResultPacket
*/
2017-11-16 20:26:28 -08:00
class SignResultPacket extends Packet {
constructor(total, witness, script) {
super();
this.cmd = packetTypes.SIGNRESULT;
this.total = total || 0;
this.script = script || [];
this.witness = witness || [];
}
2016-12-02 11:06:01 -08:00
2017-11-16 20:26:28 -08:00
fromTX(tx, total) {
this.total = total;
2016-12-02 11:06:01 -08:00
2017-11-16 20:26:28 -08:00
for (const input of tx.inputs) {
this.script.push(input.script);
this.witness.push(input.witness);
}
2016-12-02 11:06:01 -08:00
2017-11-16 20:26:28 -08:00
return this;
2016-12-02 11:06:01 -08:00
}
2017-11-16 20:26:28 -08:00
static fromTX(tx, total) {
return new SignResultPacket().fromTX(tx, total);
}
2017-11-16 20:26:28 -08:00
getSize() {
let size = 0;
2016-12-02 11:06:01 -08:00
2017-11-16 20:26:28 -08:00
size += encoding.sizeVarint(this.total);
size += encoding.sizeVarint(this.script.length);
2016-12-11 18:57:15 -08:00
2017-11-16 20:26:28 -08:00
for (let i = 0; i < this.script.length; i++) {
const script = this.script[i];
const witness = this.witness[i];
size += script.getVarSize();
size += witness.getVarSize();
}
2016-12-11 18:57:15 -08:00
2017-11-16 20:26:28 -08:00
return size;
2016-12-11 18:57:15 -08:00
}
2017-11-16 20:26:28 -08:00
toWriter(bw) {
assert(this.script.length === this.witness.length);
2016-12-11 18:57:15 -08:00
2017-11-16 20:26:28 -08:00
bw.writeVarint(this.total);
bw.writeVarint(this.script.length);
2016-12-02 11:06:01 -08:00
2017-11-16 20:26:28 -08:00
for (let i = 0; i < this.script.length; i++) {
this.script[i].toWriter(bw);
this.witness[i].toWriter(bw);
}
2016-12-02 11:06:01 -08:00
2017-11-16 20:26:28 -08:00
return bw;
2016-12-02 11:06:01 -08:00
}
2017-11-16 20:26:28 -08:00
inject(tx) {
assert(this.script.length === tx.inputs.length);
assert(this.witness.length === tx.inputs.length);
2016-12-02 11:06:01 -08:00
2017-11-16 20:26:28 -08:00
for (let i = 0; i < tx.inputs.length; i++) {
const input = tx.inputs[i];
input.script = this.script[i];
input.witness = this.witness[i];
}
2016-12-02 11:06:01 -08:00
}
2017-11-16 20:26:28 -08:00
fromRaw(data) {
const br = bio.read(data, true);
2016-12-02 11:06:01 -08:00
2017-11-16 20:26:28 -08:00
this.total = br.readVarint();
2016-12-02 11:06:01 -08:00
2017-11-16 20:26:28 -08:00
const count = br.readVarint();
2016-12-02 11:06:01 -08:00
2017-11-16 20:26:28 -08:00
for (let i = 0; i < count; i++) {
this.script.push(Script.fromReader(br));
this.witness.push(Witness.fromReader(br));
}
2016-12-02 11:06:01 -08:00
2017-11-16 20:26:28 -08:00
return this;
}
2017-11-16 20:26:28 -08:00
static fromRaw(data) {
return new SignResultPacket().fromRaw(data);
}
}
2016-12-02 11:06:01 -08:00
/**
* CheckInputPacket
2016-12-02 11:06:01 -08:00
*/
2017-11-16 20:26:28 -08:00
class CheckInputPacket extends Packet {
constructor(tx, index, coin, flags) {
super();
this.cmd = packetTypes.CHECKINPUT;
this.tx = tx || null;
this.index = index;
this.coin = coin || null;
this.flags = flags != null ? flags : null;
}
2016-12-02 11:06:01 -08:00
2017-11-16 20:26:28 -08:00
getSize() {
let size = 0;
size += this.tx.getSize();
size += encoding.sizeVarint(this.index);
size += encoding.sizeVarint(this.coin.value);
size += this.coin.script.getVarSize();
size += 4;
return size;
}
2016-12-11 18:57:15 -08:00
2017-11-16 20:26:28 -08:00
toWriter(bw) {
this.tx.toWriter(bw);
bw.writeVarint(this.index);
bw.writeVarint(this.coin.value);
this.coin.script.toWriter(bw);
bw.writeI32(this.flags != null ? this.flags : -1);
return bw;
}
2016-12-02 11:06:01 -08:00
2017-11-16 20:26:28 -08:00
fromRaw(data) {
const br = bio.read(data, true);
2016-12-02 11:06:01 -08:00
2017-11-16 20:26:28 -08:00
this.tx = TX.fromReader(br);
this.index = br.readVarint();
2016-12-06 17:37:35 -08:00
2017-11-16 20:26:28 -08:00
this.coin = new Output();
this.coin.value = br.readVarint();
this.coin.script.fromReader(br);
2016-12-06 17:37:35 -08:00
2017-11-16 20:26:28 -08:00
this.flags = br.readI32();
2016-12-02 11:06:01 -08:00
2017-11-16 20:26:28 -08:00
if (this.flags === -1)
this.flags = null;
2016-12-02 11:06:01 -08:00
2017-11-16 20:26:28 -08:00
return this;
}
2017-11-16 20:26:28 -08:00
static fromRaw(data) {
return new CheckInputPacket().fromRaw(data);
}
}
2016-12-02 11:06:01 -08:00
/**
* CheckInputResultPacket
2016-12-02 11:06:01 -08:00
*/
2017-11-16 20:26:28 -08:00
class CheckInputResultPacket extends CheckResultPacket {
constructor(error) {
super(error);
this.cmd = packetTypes.CHECKINPUTRESULT;
}
2016-12-02 11:06:01 -08:00
2017-11-16 20:26:28 -08:00
static fromRaw(data) {
return new CheckInputResultPacket().fromRaw(data);
}
}
2016-12-02 11:06:01 -08:00
/**
* SignInputPacket
*/
2017-11-16 20:26:28 -08:00
class SignInputPacket extends Packet {
constructor(tx, index, coin, ring, type) {
super();
this.cmd = packetTypes.SIGNINPUT;
this.tx = tx || null;
this.index = index;
this.coin = coin || null;
this.ring = ring || null;
this.type = type != null ? type : 1;
}
2016-12-02 11:06:01 -08:00
2017-11-16 20:26:28 -08:00
getSize() {
let size = 0;
size += this.tx.getSize();
size += encoding.sizeVarint(this.index);
size += encoding.sizeVarint(this.coin.value);
size += this.coin.script.getVarSize();
size += this.ring.getSize();
size += 1;
return size;
}
2016-12-11 18:57:15 -08:00
2017-11-16 20:26:28 -08:00
toWriter(bw) {
this.tx.toWriter(bw);
bw.writeVarint(this.index);
bw.writeVarint(this.coin.value);
this.coin.script.toWriter(bw);
this.ring.toWriter(bw);
bw.writeU8(this.type);
return bw;
}
2016-12-02 11:06:01 -08:00
2017-11-16 20:26:28 -08:00
fromRaw(data) {
const br = bio.read(data, true);
2016-12-02 11:06:01 -08:00
2017-11-16 20:26:28 -08:00
this.tx = MTX.fromReader(br);
this.index = br.readVarint();
2016-12-02 11:06:01 -08:00
2017-11-16 20:26:28 -08:00
this.coin = new Output();
this.coin.value = br.readVarint();
this.coin.script.fromReader(br);
2016-12-02 11:06:01 -08:00
2017-11-16 20:26:28 -08:00
this.ring = KeyRing.fromReader(br);
this.type = br.readU8();
2016-12-03 18:02:10 -08:00
2017-11-16 20:26:28 -08:00
return this;
}
2017-11-16 20:26:28 -08:00
static fromRaw(data) {
return new SignInputPacket().fromRaw(data);
}
}
2016-12-02 11:06:01 -08:00
/**
* SignInputResultPacket
*/
2017-11-16 20:26:28 -08:00
class SignInputResultPacket extends Packet {
constructor(value, witness, script) {
super();
this.cmd = packetTypes.SIGNINPUTRESULT;
this.value = value || false;
this.script = script || null;
this.witness = witness || null;
}
2016-12-02 11:06:01 -08:00
2017-11-16 20:26:28 -08:00
fromTX(tx, i, value) {
const input = tx.inputs[i];
2016-12-02 11:06:01 -08:00
2017-11-16 20:26:28 -08:00
assert(input);
2016-12-02 11:06:01 -08:00
2017-11-16 20:26:28 -08:00
this.value = value;
this.script = input.script;
this.witness = input.witness;
2017-11-16 20:26:28 -08:00
return this;
}
2016-12-02 11:06:01 -08:00
2017-11-16 20:26:28 -08:00
static fromTX(tx, i, value) {
return new SignInputResultPacket().fromTX(tx, i, value);
}
2016-12-02 11:06:01 -08:00
2017-11-16 20:26:28 -08:00
getSize() {
return 1 + this.script.getVarSize() + this.witness.getVarSize();
}
2016-12-11 18:57:15 -08:00
2017-11-16 20:26:28 -08:00
toWriter(bw) {
bw.writeU8(this.value ? 1 : 0);
this.script.toWriter(bw);
this.witness.toWriter(bw);
return bw;
}
2016-12-02 11:06:01 -08:00
2017-11-16 20:26:28 -08:00
inject(tx, i) {
const input = tx.inputs[i];
assert(input);
input.script = this.script;
input.witness = this.witness;
}
2016-12-02 11:06:01 -08:00
2017-11-16 20:26:28 -08:00
fromRaw(data) {
const br = bio.read(data, true);
this.value = br.readU8() === 1;
this.script = Script.fromReader(br);
this.witness = Witness.fromReader(br);
return this;
}
2017-11-16 20:26:28 -08:00
static fromRaw(data) {
return new SignInputResultPacket().fromRaw(data);
}
}
2016-12-02 11:06:01 -08:00
/**
* ECVerifyPacket
*/
2017-11-16 20:26:28 -08:00
class ECVerifyPacket extends Packet {
constructor(msg, sig, key) {
super();
this.cmd = packetTypes.ECVERIFY;
this.msg = msg || null;
this.sig = sig || null;
this.key = key || null;
}
2016-12-02 11:06:01 -08:00
2017-11-16 20:26:28 -08:00
getSize() {
let size = 0;
size += encoding.sizeVarBytes(this.msg);
size += encoding.sizeVarBytes(this.sig);
size += encoding.sizeVarBytes(this.key);
return size;
}
2016-12-11 18:57:15 -08:00
2017-11-16 20:26:28 -08:00
toWriter(bw) {
bw.writeVarBytes(this.msg);
bw.writeVarBytes(this.sig);
bw.writeVarBytes(this.key);
return bw;
}
2016-12-02 11:06:01 -08:00
2017-11-16 20:26:28 -08:00
fromRaw(data) {
const br = bio.read(data, true);
this.msg = br.readVarBytes();
this.sig = br.readVarBytes();
this.key = br.readVarBytes();
return this;
}
2017-11-16 20:26:28 -08:00
static fromRaw(data) {
return new ECVerifyPacket().fromRaw(data);
}
}
2016-12-02 11:06:01 -08:00
/**
* ECVerifyResultPacket
*/
2017-11-16 20:26:28 -08:00
class ECVerifyResultPacket extends Packet {
constructor(value) {
super();
this.cmd = packetTypes.ECVERIFYRESULT;
this.value = value;
}
2016-12-02 11:06:01 -08:00
2017-11-16 20:26:28 -08:00
getSize() {
return 1;
}
2016-12-11 18:57:15 -08:00
2017-11-16 20:26:28 -08:00
toWriter(bw) {
bw.writeU8(this.value ? 1 : 0);
return bw;
}
2016-12-02 11:06:01 -08:00
2017-11-16 20:26:28 -08:00
fromRaw(data) {
const br = bio.read(data, true);
this.value = br.readU8() === 1;
return this;
}
2017-11-16 20:26:28 -08:00
static fromRaw(data) {
return new ECVerifyResultPacket().fromRaw(data);
}
}
2016-12-02 11:06:01 -08:00
/**
* ECSignPacket
*/
2017-11-16 20:26:28 -08:00
class ECSignPacket extends Packet {
constructor(msg, key) {
super();
this.cmd = packetTypes.ECSIGN;
this.msg = msg || null;
this.key = key || null;
}
2016-12-02 11:06:01 -08:00
2017-11-16 20:26:28 -08:00
getSize() {
let size = 0;
size += encoding.sizeVarBytes(this.msg);
size += encoding.sizeVarBytes(this.key);
return size;
}
2016-12-11 18:57:15 -08:00
2017-11-16 20:26:28 -08:00
toWriter(bw) {
bw.writeVarBytes(this.msg);
bw.writeVarBytes(this.key);
return bw;
}
2016-12-02 11:06:01 -08:00
2017-11-16 20:26:28 -08:00
fromRaw(data) {
const br = bio.read(data, true);
this.msg = br.readVarBytes();
this.key = br.readVarBytes();
return this;
}
2017-11-16 20:26:28 -08:00
static fromRaw(data) {
return new ECSignPacket().fromRaw(data);
}
}
2016-12-02 11:06:01 -08:00
/**
* ECSignResultPacket
*/
2017-11-16 20:26:28 -08:00
class ECSignResultPacket extends Packet {
constructor(sig) {
super();
this.cmd = packetTypes.ECSIGNRESULT;
this.sig = sig;
}
2016-12-02 11:06:01 -08:00
2017-11-16 20:26:28 -08:00
getSize() {
return encoding.sizeVarBytes(this.sig);
}
2016-12-11 18:57:15 -08:00
2017-11-16 20:26:28 -08:00
toWriter(bw) {
bw.writeVarBytes(this.sig);
return bw;
}
2016-12-02 11:06:01 -08:00
2017-11-16 20:26:28 -08:00
fromRaw(data) {
const br = bio.read(data, true);
this.sig = br.readVarBytes();
return this;
}
2017-11-16 20:26:28 -08:00
static fromRaw(data) {
return new ECSignResultPacket().fromRaw(data);
}
}
2016-12-02 11:06:01 -08:00
/**
* MinePacket
*/
2017-11-16 20:26:28 -08:00
class MinePacket extends Packet {
2018-01-02 20:24:56 -08:00
constructor(hdr, target, rounds, params) {
2017-11-16 20:26:28 -08:00
super();
this.cmd = packetTypes.MINE;
2018-01-02 20:24:56 -08:00
this.hdr = hdr || null;
2017-11-16 20:26:28 -08:00
this.target = target || null;
2018-01-02 20:24:56 -08:00
this.rounds = rounds != null ? rounds : -1;
this.params = params || {};
2017-11-16 20:26:28 -08:00
}
2016-12-02 11:06:01 -08:00
2017-11-16 20:26:28 -08:00
getSize() {
2018-01-02 20:24:56 -08:00
return consensus.HEADER_SIZE + 32 + 4 + 3;
2017-11-16 20:26:28 -08:00
}
2016-12-11 18:57:15 -08:00
2017-11-16 20:26:28 -08:00
toWriter(bw) {
2018-01-02 20:24:56 -08:00
bw.writeBytes(this.hdr);
2017-11-16 20:26:28 -08:00
bw.writeBytes(this.target);
2018-01-02 20:24:56 -08:00
bw.writeU32(this.rounds);
bw.writeU8(this.params.bits);
bw.writeU8(this.params.size);
bw.writeU8(this.params.ease);
2017-11-16 20:26:28 -08:00
return bw;
}
2016-12-02 11:06:01 -08:00
2017-11-16 20:26:28 -08:00
fromRaw(data) {
const br = bio.read(data, true);
2018-01-02 20:24:56 -08:00
this.hdr = br.readBytes(consensus.HEADER_SIZE);
2017-11-16 20:26:28 -08:00
this.target = br.readBytes(32);
2018-01-02 20:24:56 -08:00
this.rounds = br.readU32();
this.params.bits = br.readU8();
this.params.size = br.readU8();
this.params.ease = br.readU8();
2017-11-16 20:26:28 -08:00
return this;
}
2017-11-16 20:26:28 -08:00
static fromRaw(data) {
return new MinePacket().fromRaw(data);
}
}
2016-12-02 11:06:01 -08:00
/**
* MineResultPacket
*/
2017-11-16 20:26:28 -08:00
class MineResultPacket extends Packet {
2018-01-02 20:24:56 -08:00
constructor(nonce, sol) {
2017-11-16 20:26:28 -08:00
super();
this.cmd = packetTypes.MINERESULT;
2018-01-02 20:24:56 -08:00
this.nonce = nonce || null;
this.sol = sol || null;
2017-11-16 20:26:28 -08:00
}
2016-12-02 11:06:01 -08:00
2017-11-16 20:26:28 -08:00
getSize() {
2018-01-02 20:24:56 -08:00
return 16 + 1 + (this.sol ? this.sol.getSize() : 0);
2017-11-16 20:26:28 -08:00
}
2016-12-11 18:57:15 -08:00
2017-11-16 20:26:28 -08:00
toWriter(bw) {
2018-01-02 20:24:56 -08:00
bw.writeBytes(this.nonce);
if (this.sol) {
bw.writeU8(1);
this.sol.toWriter(bw);
} else {
bw.writeU8(0);
}
2017-11-16 20:26:28 -08:00
return bw;
}
2016-12-02 11:06:01 -08:00
2017-11-16 20:26:28 -08:00
fromRaw(data) {
const br = bio.read(data, true);
2018-01-02 20:24:56 -08:00
this.nonce = br.readBytes(16);
2017-11-16 20:26:28 -08:00
if (br.readU8() === 1)
2018-01-02 20:24:56 -08:00
this.sol = Solution.fromReader(br);
2017-11-16 20:26:28 -08:00
return this;
}
2017-11-16 20:26:28 -08:00
static fromRaw(data) {
return new MineResultPacket().fromRaw(data);
}
}
2016-12-02 11:06:01 -08:00
/**
* ScryptPacket
*/
2017-11-16 20:26:28 -08:00
class ScryptPacket extends Packet {
constructor(passwd, salt, N, r, p, len) {
super();
this.cmd = packetTypes.SCRYPT;
this.passwd = passwd || null;
this.salt = salt || null;
this.N = N != null ? N : -1;
this.r = r != null ? r : -1;
this.p = p != null ? p : -1;
this.len = len != null ? len : -1;
}
2016-12-02 11:06:01 -08:00
2017-11-16 20:26:28 -08:00
getSize() {
let size = 0;
size += encoding.sizeVarBytes(this.passwd);
size += encoding.sizeVarBytes(this.salt);
size += 16;
return size;
}
2016-12-11 18:57:15 -08:00
2017-11-16 20:26:28 -08:00
toWriter(bw) {
bw.writeVarBytes(this.passwd);
bw.writeVarBytes(this.salt);
bw.writeU32(this.N);
bw.writeU32(this.r);
bw.writeU32(this.p);
bw.writeU32(this.len);
return bw;
}
2016-12-02 11:06:01 -08:00
2017-11-16 20:26:28 -08:00
fromRaw(data) {
const br = bio.read(data, true);
this.passwd = br.readVarBytes();
this.salt = br.readVarBytes();
this.N = br.readU32();
this.r = br.readU32();
this.p = br.readU32();
this.len = br.readU32();
return this;
}
2017-11-16 20:26:28 -08:00
static fromRaw(data) {
return new ScryptPacket().fromRaw(data);
}
}
2016-12-02 11:06:01 -08:00
/**
* ScryptResultPacket
*/
2017-11-16 20:26:28 -08:00
class ScryptResultPacket extends Packet {
constructor(key) {
super();
this.cmd = packetTypes.SCRYPTRESULT;
this.key = key || null;
}
2016-12-02 11:06:01 -08:00
2017-11-16 20:26:28 -08:00
getSize() {
return encoding.sizeVarBytes(this.key);
}
2016-12-11 18:57:15 -08:00
2017-11-16 20:26:28 -08:00
toWriter(bw) {
bw.writeVarBytes(this.key);
return bw;
}
2016-12-02 11:06:01 -08:00
2017-11-16 20:26:28 -08:00
fromRaw(data) {
const br = bio.read(data, true);
this.key = br.readVarBytes();
return this;
}
2016-12-02 11:06:01 -08:00
2017-11-16 20:26:28 -08:00
static fromRaw(data) {
return new ScryptResultPacket().fromRaw(data);
}
}
/*
* Helpers
*/
function stringify(value) {
if (typeof value !== 'string')
return '';
return value;
}
2016-12-02 11:06:01 -08:00
/*
* Expose
*/
exports.types = packetTypes;
2017-07-07 09:04:52 -07:00
exports.EnvPacket = EnvPacket;
2016-12-02 11:06:01 -08:00
exports.EventPacket = EventPacket;
exports.LogPacket = LogPacket;
exports.ErrorPacket = ErrorPacket;
exports.ErrorResultPacket = ErrorResultPacket;
exports.CheckPacket = CheckPacket;
exports.CheckResultPacket = CheckResultPacket;
2016-12-02 11:06:01 -08:00
exports.SignPacket = SignPacket;
exports.SignResultPacket = SignResultPacket;
exports.CheckInputPacket = CheckInputPacket;
exports.CheckInputResultPacket = CheckInputResultPacket;
2016-12-02 11:06:01 -08:00
exports.SignInputPacket = SignInputPacket;
exports.SignInputResultPacket = SignInputResultPacket;
exports.ECVerifyPacket = ECVerifyPacket;
exports.ECVerifyResultPacket = ECVerifyResultPacket;
exports.ECSignPacket = ECSignPacket;
exports.ECSignResultPacket = ECSignResultPacket;
exports.MinePacket = MinePacket;
exports.MineResultPacket = MineResultPacket;
exports.ScryptPacket = ScryptPacket;
exports.ScryptResultPacket = ScryptResultPacket;