From 576ba8a2b6dc51a23bf3f40aad32443b6f511b98 Mon Sep 17 00:00:00 2001 From: Stein Martin Hustad Date: Thu, 6 Aug 2015 19:12:30 +0200 Subject: [PATCH 1/6] Implement Reject message --- lib/messages/commands/reject.js | 23 +++++++++++++++++++---- test/data/messages.json | 2 +- 2 files changed, 20 insertions(+), 5 deletions(-) diff --git a/lib/messages/commands/reject.js b/lib/messages/commands/reject.js index 5ed9543..f426a6c 100644 --- a/lib/messages/commands/reject.js +++ b/lib/messages/commands/reject.js @@ -3,19 +3,34 @@ var Message = require('../message'); var inherits = require('util').inherits; var bitcore = require('bitcore-lib'); -var BufferUtil = bitcore.util.buffer; +var utils = require('../utils'); +var BufferReader = bitcore.encoding.BufferReader; +var BufferWriter = bitcore.encoding.BufferWriter; -// todo: add payload: https://en.bitcoin.it/wiki/Protocol_documentation#reject function RejectMessage(arg, options) { Message.call(this, options); this.command = 'reject'; } inherits(RejectMessage, Message); -RejectMessage.prototype.setPayload = function() {}; +RejectMessage.prototype.setPayload = function(payload) { + var parser = new BufferReader(payload); + this.message = parser.readVarLengthBuffer(); + this.ccode = parser.readUInt8(); + this.reason = parser.readVarLengthBuffer(); + this.data = parser.readAll(); + utils.checkFinished(parser); +}; RejectMessage.prototype.getPayload = function() { - return BufferUtil.EMPTY_BUFFER; + var bw = new BufferWriter(); + bw.writeVarintNum(this.message.length); + bw.write(this.message); + bw.writeUInt8(this.cccode); + bw.writeVarintNum(this.reason.length); + bw.write(this.reason); + bw.write(this.data); + return bw.toBuffer(); }; module.exports = RejectMessage; diff --git a/test/data/messages.json b/test/data/messages.json index d7260b5..7b4d378 100644 --- a/test/data/messages.json +++ b/test/data/messages.json @@ -34,7 +34,7 @@ "message": "f9beb4d9616c65727400000000000000bc0000004fe68fe973010000003766404f00000000b305434f00000000f2030000f1030000001027000048ee00000064000000004653656520626974636f696e2e6f72672f666562323020696620796f7520686176652074726f75626c6520636f6e6e656374696e67206166746572203230204665627275617279004730450221008389df45f0703f39ec8c1cc42c13810ffcae14995bb648340219e353b63b53eb022009ec65e1c1aaeec1fd334c6b684bde2b3f573060d5b70c3a46723326e4e8a4f1" }, "reject": { - "message": "f9beb4d972656a656374000000000000000000005df6e0e2" + "message": "f9beb4d972656a6563740000000000003a000000f44033160274780015696e73756666696369656e74207072696f72697479165d408c9dd26fbdcb42b07546f6c37752301e3772f3ae441baf569e78839111" }, "notfound": { "message": "f9beb4d96e6f74666f756e6400000000250000001d33d53201010000003a4af715be220eae7b2657582869daddf79ac4afb4a0e1cafa5b57e1afb8dfe2" From 1dfdd66b725a6a922e67b7691e90b543dc858e0b Mon Sep 17 00:00:00 2001 From: Stein Martin Hustad Date: Thu, 6 Aug 2015 20:03:07 +0200 Subject: [PATCH 2/6] Allow attributes in constructor --- lib/messages/commands/reject.js | 39 +++++++++++++++++++++++++++++---- 1 file changed, 35 insertions(+), 4 deletions(-) diff --git a/lib/messages/commands/reject.js b/lib/messages/commands/reject.js index f426a6c..c2f51be 100644 --- a/lib/messages/commands/reject.js +++ b/lib/messages/commands/reject.js @@ -7,17 +7,48 @@ var utils = require('../utils'); var BufferReader = bitcore.encoding.BufferReader; var BufferWriter = bitcore.encoding.BufferWriter; +/** + * The reject message is sent when messages are rejected. + * + * @see https://en.bitcoin.it/wiki/Protocol_documentation#reject + * @param {Object=} arg - properties for the reject message + * @param {String=} arg.message - type of message rejected + * @param {Number=} arg.ccode - code relating to rejected message + * @param {String=} arg.reason - text version of reason for rejection + * @param {Buffer=} arg.data - Optional extra data provided by some errors. + * @param {Object} options + * @extends Message + * @constructor + */ function RejectMessage(arg, options) { + if (!arg) { + arg = {}; + } Message.call(this, options); this.command = 'reject'; + this.message = arg.message; + this.ccode = arg.ccode; + this.reason = arg.reason; + this.data = arg.data; } inherits(RejectMessage, Message); +RejectMessage.CCODE = { + REJECT_MALFORMED: 0x01, + REJECT_INVALID: 0x10, + REJECT_OBSOLETE: 0x11, + REJECT_DUPLICATE: 0x12, + REJECT_NONSTANDARD: 0x40, + REJECT_DUST: 0x41, + REJECT_INSUFFICIENTFEE: 0x42, + REJECT_CHECKPOINT: 0x43 +}; + RejectMessage.prototype.setPayload = function(payload) { var parser = new BufferReader(payload); - this.message = parser.readVarLengthBuffer(); + this.message = parser.readVarLengthBuffer().toString('utf-8'); this.ccode = parser.readUInt8(); - this.reason = parser.readVarLengthBuffer(); + this.reason = parser.readVarLengthBuffer().toString('utf-8'); this.data = parser.readAll(); utils.checkFinished(parser); }; @@ -25,10 +56,10 @@ RejectMessage.prototype.setPayload = function(payload) { RejectMessage.prototype.getPayload = function() { var bw = new BufferWriter(); bw.writeVarintNum(this.message.length); - bw.write(this.message); + bw.write(new Buffer(this.message, 'utf-8')); bw.writeUInt8(this.cccode); bw.writeVarintNum(this.reason.length); - bw.write(this.reason); + bw.write(new Buffer(this.reason, 'utf-8')); bw.write(this.data); return bw.toBuffer(); }; From 6a88aaae9bf964bd322594ffe4ff35ec2407ad85 Mon Sep 17 00:00:00 2001 From: Stein Martin Hustad Date: Thu, 6 Aug 2015 20:33:53 +0200 Subject: [PATCH 3/6] Add test for Reject message --- test/messages/commands/index.js | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/test/messages/commands/index.js b/test/messages/commands/index.js index ae4d39e..9da412d 100644 --- a/test/messages/commands/index.js +++ b/test/messages/commands/index.js @@ -1,6 +1,7 @@ 'use strict'; var should = require('chai').should(); +var expect = require('chai').expect; var P2P = require('../../../'); var Messages = P2P.Messages; var sinon = require('sinon'); @@ -263,6 +264,28 @@ describe('Command Messages', function() { }); }); + describe('Reject', function() { + it('should set properties from arg in constructor', function() { + var message = messages.Reject({ + message: 'tx', + ccode: 0x01, + reason: 'transaction is malformed', + data: new Buffer('12345678901234567890123456789012', 'hex') + }); + message.message.should.equal('tx'); + message.ccode.should.equal(0x01); + message.reason.should.equal('transaction is malformed'); + message.data.toString('hex').should.equal('12345678901234567890123456789012'); + }); + it('should let arg be optional in constructor', function() { + var message = messages.Reject(); + expect(message.message).to.be.undefined; + expect(message.ccode).to.be.undefined; + expect(message.reason).to.be.undefined; + expect(message.data).to.be.undefined; + }); + }); + describe('Version', function() { it('should set the default relay property as true', function() { var message = messages.Version(); From 0ea205d0eb6585a6cd2c80f4da5ad65fc3597d81 Mon Sep 17 00:00:00 2001 From: Stein Martin Hustad Date: Fri, 7 Aug 2015 01:02:57 +0200 Subject: [PATCH 4/6] Fix bug in Request.getPayload() Apparently, node v0.12 buffer.writeUInt8 is more lenient than v0.10 --- lib/messages/commands/reject.js | 2 +- test/messages/commands/index.js | 20 ++++++++++++++++++++ 2 files changed, 21 insertions(+), 1 deletion(-) diff --git a/lib/messages/commands/reject.js b/lib/messages/commands/reject.js index c2f51be..40ab645 100644 --- a/lib/messages/commands/reject.js +++ b/lib/messages/commands/reject.js @@ -57,7 +57,7 @@ RejectMessage.prototype.getPayload = function() { var bw = new BufferWriter(); bw.writeVarintNum(this.message.length); bw.write(new Buffer(this.message, 'utf-8')); - bw.writeUInt8(this.cccode); + bw.writeUInt8(this.ccode); bw.writeVarintNum(this.reason.length); bw.write(new Buffer(this.reason, 'utf-8')); bw.write(this.data); diff --git a/test/messages/commands/index.js b/test/messages/commands/index.js index 9da412d..bcecb8c 100644 --- a/test/messages/commands/index.js +++ b/test/messages/commands/index.js @@ -284,6 +284,26 @@ describe('Command Messages', function() { expect(message.reason).to.be.undefined; expect(message.data).to.be.undefined; }); + it('should write payload correctly', function() { + var message = messages.Reject({ + message: 'tx', + ccode: 0x01, + reason: 'transaction is malformed', + data: new Buffer('12345678901234567890123456789012', 'hex') + }); + var payload = message.getPayload(); + message = messages.Reject(); + message.setPayload(payload); + message.message.should.equal('tx'); + message.ccode.should.equal(0x01); + message.reason.should.equal('transaction is malformed'); + message.data.toString('hex').should.equal('12345678901234567890123456789012'); + //var message = messages.Reject(); + //expect(message.message).to.be.undefined; + //expect(message.ccode).to.be.undefined; + //expect(message.reason).to.be.undefined; + //expect(message.data).to.be.undefined; + }); }); describe('Version', function() { From dbda30d4d1ac5cfba08a604d20f4e24e6d3855d7 Mon Sep 17 00:00:00 2001 From: Stein Martin Hustad Date: Tue, 15 Dec 2015 23:33:58 +0100 Subject: [PATCH 5/6] Fix spacing --- lib/messages/commands/reject.js | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/lib/messages/commands/reject.js b/lib/messages/commands/reject.js index 40ab645..f9c7cf1 100644 --- a/lib/messages/commands/reject.js +++ b/lib/messages/commands/reject.js @@ -34,14 +34,14 @@ function RejectMessage(arg, options) { inherits(RejectMessage, Message); RejectMessage.CCODE = { - REJECT_MALFORMED: 0x01, - REJECT_INVALID: 0x10, - REJECT_OBSOLETE: 0x11, - REJECT_DUPLICATE: 0x12, - REJECT_NONSTANDARD: 0x40, - REJECT_DUST: 0x41, + REJECT_MALFORMED: 0x01, + REJECT_INVALID: 0x10, + REJECT_OBSOLETE: 0x11, + REJECT_DUPLICATE: 0x12, + REJECT_NONSTANDARD: 0x40, + REJECT_DUST: 0x41, REJECT_INSUFFICIENTFEE: 0x42, - REJECT_CHECKPOINT: 0x43 + REJECT_CHECKPOINT: 0x43 }; RejectMessage.prototype.setPayload = function(payload) { From 55242db152d623a4d40db5355793974ea06fbed3 Mon Sep 17 00:00:00 2001 From: Stein Martin Hustad Date: Tue, 15 Dec 2015 23:34:28 +0100 Subject: [PATCH 6/6] Removed old commented code --- test/messages/commands/index.js | 5 ----- 1 file changed, 5 deletions(-) diff --git a/test/messages/commands/index.js b/test/messages/commands/index.js index bcecb8c..e298d45 100644 --- a/test/messages/commands/index.js +++ b/test/messages/commands/index.js @@ -298,11 +298,6 @@ describe('Command Messages', function() { message.ccode.should.equal(0x01); message.reason.should.equal('transaction is malformed'); message.data.toString('hex').should.equal('12345678901234567890123456789012'); - //var message = messages.Reject(); - //expect(message.message).to.be.undefined; - //expect(message.ccode).to.be.undefined; - //expect(message.reason).to.be.undefined; - //expect(message.data).to.be.undefined; }); });