diff --git a/README.md b/README.md index 29052dc..7e06f05 100644 --- a/README.md +++ b/README.md @@ -68,11 +68,18 @@ API documentation is available [here](https://bitchan.github.io/bitmessage/docs/ ## Usage +### Address + ```js -// Generate a new random Bitmessage identity. var Address = require("bitmessage").Address; -var addr = Address.fromRandom(); -console.log("New random Bitmessage address:", addr.encode()); + +// Generate a new random Bitmessage identity. +var addr1 = Address.fromRandom(); +console.log("New random Bitmessage address:", addr1.encode()); + +// Or create it from passphrase. +var addr2 = Address.fromPassphrase("test"); +console.log("Deterministic Bitmessage address:", addr2.encode()); ``` ## License diff --git a/lib/address.js b/lib/address.js index d280988..eed31ef 100644 --- a/lib/address.js +++ b/lib/address.js @@ -29,11 +29,12 @@ function Address(opts) { this.version = popkey(opts, "version") || 4; assert(this.version <= 4, "Version too high"); assert(this.version >= 1, "Version too low"); + // Set defaults. + opts.stream = opts.stream || 1; + opts.behavior = opts.behavior || + PubkeyBitfield().set(PubkeyBitfield.DOES_ACK); // Merge remained values. objectAssign(this, opts); - this.stream = this.stream || 1; - this.pubkeyFeatures = this.pubkeyFeatures || - PubkeyBitfield().set(PubkeyBitfield.DOES_ACK); } /** @@ -210,7 +211,11 @@ Address.fromRandom = function(opts) { * @return {Address} Generated address object. */ Address.fromPassphrase = function(opts) { - opts = objectAssign({}, opts); + if (typeof opts === "string") { + opts = {passphrase: opts}; + } else { + opts = objectAssign({}, opts); + } var version = opts.version = opts.version || 4; var ripelen = popkey(opts, "ripelen") || 19; assertripelen(ripelen, version); diff --git a/lib/structs.js b/lib/structs.js index 7f281fc..6da3fc7 100644 --- a/lib/structs.js +++ b/lib/structs.js @@ -501,7 +501,7 @@ exports.encrypted = { var Bitfield = function(size) { var bytesize = size / 8; - // is the source of inspiration. + // Inspired by . function BitfieldInner(buf, opts) { if (!(this instanceof BitfieldInner)) { return new BitfieldInner(buf); @@ -574,15 +574,15 @@ var ServicesBitfield = exports.ServicesBitfield = objectAssign(Bitfield(64), { // invert the numberes. See // for details. exports.PubkeyBitfield = objectAssign(Bitfield(32), { + /** + * If true, the receiving node does send acknowledgements (rather than + * dropping them). + */ + DOES_ACK: 0, /** * Receiving node expects that the RIPE hash encoded in their address * preceedes the encrypted message data of msg messages bound for * them. */ INCLUDE_DESTINATION: 1, - /** - * If true, the receiving node does send acknowledgements (rather than - * dropping them). - */ - DOES_ACK: 0, }); diff --git a/test.js b/test.js index edbbaff..068b257 100644 --- a/test.js +++ b/test.js @@ -570,6 +570,17 @@ describe("High-level classes", function() { expect(addr.encode()).to.equal("BM-2cWFkyuXXFw6d393RGnin2RpSXj8wxtt6F"); }); + it("should accept string in Address.fromPassphrase", function() { + this.timeout(60000); + var addr = Address.fromPassphrase("test"); + expect(addr.version).to.equal(4); + expect(addr.stream).to.equal(1); + expect(bufferEqual(addr.signPrivateKey, WIF.decode("5JY1CFeeyN4eyfL35guWAuUqu5VLmd7LojtkNP6wmt5msZxxZ57"))).to.be.true; + expect(bufferEqual(addr.encPrivateKey, WIF.decode("5J1oDgZDicNhUgbfzBDQqi2m5jUPnDrfZinnTqEEEaLv63jVFTM"))).to.be.true; + expect(addr.getRipe().toString("hex")).to.equal("00ac14944b00decea5628eb40d0ff4b0f9ee9eca"); + expect(addr.encode()).to.equal("BM-2cWFkyuXXFw6d393RGnin2RpSXj8wxtt6F"); + }); + it("should calculate tag", function() { var addr = Address.decode("2cTux3PGRqHTEH6wyUP2sWeT4LrsGgy63z"); expect(addr.getTag().toString("hex")).to.equal("facf1e3e6c74916203b7f714ca100d4d60604f0917696d0f09330f82f52bed1a");