fcoin/lib/workers/jobs.js
2017-07-17 14:26:38 -07:00

181 lines
4.1 KiB
JavaScript

/*!
* jobs.js - worker jobs for bcoin
* Copyright (c) 2014-2017, Christopher Jeffrey (MIT License).
* https://github.com/bcoin-org/bcoin
*/
'use strict';
const secp256k1 = require('../crypto/secp256k1');
const scrypt = require('../crypto/scrypt');
const mine = require('../mining/mine');
const packets = require('./packets');
/**
* @exports workers/jobs
*/
const jobs = exports;
/**
* Execute a job on the worker.
* @param {String} cmd
* @param {Array} args
* @returns {Object}
* @throws on unknown command
*/
jobs.execute = function execute(p) {
try {
return jobs._execute(p);
} catch (e) {
return new packets.ErrorResultPacket(e);
}
};
/**
* Execute a job on the worker.
* @param {String} cmd
* @param {Array} args
* @returns {Object}
* @throws on unknown command
*/
jobs._execute = function execute(p) {
switch (p.cmd) {
case packets.types.VERIFY:
return jobs.verify(p.tx, p.view, p.flags);
case packets.types.VERIFYINPUT:
return jobs.verifyInput(p.tx, p.index, p.coin, p.flags);
case packets.types.SIGN:
return jobs.sign(p.tx, p.rings, p.type);
case packets.types.SIGNINPUT:
return jobs.signInput(p.tx, p.index, p.coin, p.ring, p.type);
case packets.types.ECVERIFY:
return jobs.ecVerify(p.msg, p.sig, p.key);
case packets.types.ECSIGN:
return jobs.ecSign(p.msg, p.key);
case packets.types.MINE:
return jobs.mine(p.data, p.target, p.min, p.max);
case packets.types.SCRYPT:
return jobs.scrypt(p.passwd, p.salt, p.N, p.r, p.p, p.len);
default:
throw new Error(`Unknown command: "${p.cmd}".`);
}
};
/**
* Execute tx.verify() on worker.
* @see TX#verify
* @param {TX} tx
* @param {CoinView} view
* @param {VerifyFlags} flags
* @returns {Boolean}
*/
jobs.verify = function verify(tx, view, flags) {
let result = tx.verify(view, flags);
return new packets.VerifyResultPacket(result);
};
/**
* Execute tx.verifyInput() on worker.
* @see TX#verifyInput
* @param {TX} tx
* @param {Number} index
* @param {Output} coin
* @param {VerifyFlags} flags
* @returns {Boolean}
*/
jobs.verifyInput = function verifyInput(tx, index, coin, flags) {
let result = tx.verifyInput(index, coin, flags);
return new packets.VerifyInputResultPacket(result);
};
/**
* Execute tx.sign() on worker.
* @see MTX#sign
* @param {MTX} tx
* @param {KeyRing[]} ring
* @param {SighashType} type
*/
jobs.sign = function sign(tx, ring, type) {
let total = tx.sign(ring, type);
return packets.SignResultPacket.fromTX(tx, total);
};
/**
* Execute tx.signInput() on worker.
* @see MTX#signInput
* @param {MTX} tx
* @param {Number} index
* @param {Output} coin
* @param {KeyRing} ring
* @param {SighashType} type
*/
jobs.signInput = function signInput(tx, index, coin, ring, type) {
let result = tx.signInput(tx, index, coin, ring, type);
return packets.SignInputResultPacket.fromTX(tx, index, result);
};
/**
* Execute secp256k1.verify() on worker.
* @see secp256k1.verify
* @param {TX} tx
* @param {VerifyFlags} flags
* @returns {Boolean}
*/
jobs.ecVerify = function ecVerify(msg, sig, key) {
let result = secp256k1.verify(msg, sig, key);
return new packets.ECVerifyResultPacket(result);
};
/**
* Execute secp256k1.sign() on worker.
* @see secp256k1.sign
* @param {TX} tx
* @param {Number} index
* @param {VerifyFlags} flags
* @returns {Boolean}
*/
jobs.ecSign = function ecSign(msg, key) {
let sig = secp256k1.sign(msg, key);
return new packets.ECSignResultPacket(sig);
};
/**
* Mine a block on worker.
* @param {Buffer} data
* @param {Buffer} target
* @param {Number} min
* @param {Number} max
* @returns {Number}
*/
jobs.mine = function _mine(data, target, min, max) {
let nonce = mine(data, target, min, max);
return new packets.MineResultPacket(nonce);
};
/**
* Execute scrypt() on worker.
* @see scrypt
* @param {Buffer} passwd
* @param {Buffer} salt
* @param {Number} N
* @param {Number} r
* @param {Number} p
* @param {Number} len
* @returns {Buffer}
*/
jobs.scrypt = function _scrypt(passwd, salt, N, r, p, len) {
let key = scrypt.derive(passwd, salt, N, r, p, len);
return new packets.ScryptResultPacket(key);
};