rpc: getwork - verify header before mutating current block.

This commit is contained in:
Christopher Jeffrey 2016-09-17 19:40:22 -07:00
parent 5dadb224ca
commit a508d5a51d
No known key found for this signature in database
GPG Key ID: 8962AB9DE6666BBD

View File

@ -1422,7 +1422,7 @@ RPC.prototype.verifychain = function verifychain(args, callback) {
RPC.prototype._submitwork = function getwork(data, callback) {
var attempt = this.attempt;
var block, header, cb;
var block, header, cb, cur;
if (data.length !== 128)
return callback(new RPCError('Invalid parameter.'));
@ -1435,18 +1435,29 @@ RPC.prototype._submitwork = function getwork(data, callback) {
reverseEndian(data);
header = bcoin.headers.fromAbbr(data);
block = attempt.block;
if (header.prevBlock !== block.prevBlock
|| header.bits !== block.bits) {
return callback(null, false);
}
if (!header.verify())
return callback(null, false);
cb = this.coinbase[header.merkleRoot];
if (!cb)
return callback(null, false);
block = attempt.block;
cur = block.txs[0];
block.txs[0] = cb;
attempt.updateMerkle();
if (header.prevBlock !== block.prevBlock
|| header.merkleRoot !== block.merkleRoot
|| header.bits !== block.bits) {
if (header.merkleRoot !== block.merkleRoot) {
block.txs[0] = cur;
attempt.updateMerkle();
this.logger.warning('Bad calculated merkle root for submitted work.');
return callback(null, false);
}