From a2512226f89cc49cf2684342650c1fcce68a41c5 Mon Sep 17 00:00:00 2001 From: "Ryan X. Charles" Date: Wed, 13 Aug 2014 18:00:41 -0400 Subject: [PATCH] address convenience functions --- lib/address.js | 11 +++++++++++ lib/key.js | 5 +++++ test/test.address.js | 21 +++++++++++++++++++++ test/test.key.js | 14 ++++++++++++++ 4 files changed, 51 insertions(+) diff --git a/lib/address.js b/lib/address.js index 798d993..35488bd 100644 --- a/lib/address.js +++ b/lib/address.js @@ -1,5 +1,7 @@ var base58check = require('./base58check'); var constants = require('./constants'); +var Hash = require('./hash'); +var Pubkey = require('./pubkey'); function Address(hash, network, type) { this.hash = hash; @@ -7,6 +9,15 @@ function Address(hash, network, type) { this.type = type; }; +Address.prototype.fromPubkey = function(pubkey, network, compressed) { + if (typeof compressed === 'undefined') + compressed = true; + this.hash = Hash.sha256ripemd160(pubkey.toDER(compressed)); + this.network = network || 'mainnet'; + this.type = 'pubkeyhash'; + return this; +}; + Address.prototype.fromString = function(str) { var buf = base58check.decode(str); if (buf.length !== 1 + 20) diff --git a/lib/key.js b/lib/key.js index 11e11b2..cefc341 100644 --- a/lib/key.js +++ b/lib/key.js @@ -1,3 +1,4 @@ +var Address = require('../lib/address'); var Privkey = require('./privkey'); var Pubkey = require('./pubkey'); var Random = require('./random'); @@ -31,6 +32,10 @@ Key.prototype.fromString = function(str) { } }; +Key.prototype.getAddress = function(network, compressed) { + return (new Address()).fromPubkey(this.pubkey, network, compressed); +}; + Key.prototype.privkey2pubkey = function() { this.pubkey = new Pubkey(point.getG().mul(this.privkey.bn)); }; diff --git a/test/test.address.js b/test/test.address.js index 2bd7002..498d110 100644 --- a/test/test.address.js +++ b/test/test.address.js @@ -1,5 +1,6 @@ var should = require('chai').should(); var constants = require('../lib/constants'); +var Pubkey = require('../lib/pubkey'); var Address = require('../lib/address'); describe('address', function() { @@ -11,6 +12,26 @@ describe('address', function() { should.exist(address); }); + describe('#fromPubkey', function() { + + it('should make this address from a compressed pubkey', function() { + var pubkey = new Pubkey(); + pubkey.fromDER(new Buffer('0285e9737a74c30a873f74df05124f2aa6f53042c2fc0a130d6cbd7d16b944b004', 'hex')); + var address = new Address(); + address.fromPubkey(pubkey); + address.toString().should.equal('19gH5uhqY6DKrtkU66PsZPUZdzTd11Y7ke'); + }); + + it('should make this address from an uncompressed pubkey', function() { + var pubkey = new Pubkey(); + pubkey.fromDER(new Buffer('0285e9737a74c30a873f74df05124f2aa6f53042c2fc0a130d6cbd7d16b944b004', 'hex')); + var address = new Address(); + address.fromPubkey(pubkey, 'mainnet', false); + address.toString().should.equal('16JXnhxjJUhxfyx4y6H4sFcxrgt8kQ8ewX'); + }); + + }); + describe('#fromString', function() { it('should derive from this known address string mainnet', function() { diff --git a/test/test.key.js b/test/test.key.js index 37a4559..7e21fac 100644 --- a/test/test.key.js +++ b/test/test.key.js @@ -1,6 +1,7 @@ var should = require('chai').should(); var bn = require('../lib/bn'); var point = require('../lib/point'); +var Address = require('../lib/address'); var Privkey = require('../lib/privkey'); var Pubkey = require('../lib/pubkey'); var Key = require('../lib/key'); @@ -74,6 +75,19 @@ describe('key', function() { }); + describe('#getAddress', function() { + + it('should return an address', function() { + var privhex = '906977a061af29276e40bf377042ffbde414e496ae2260bbf1fa9d085637bfff'; + var pubhex = '02a1633cafcc01ebfb6d78e39f687a1f0995c62fc95f51ead10a02ee0be551b5dc'; + var key = new Key(); + key.privkey = new Privkey(bn(new Buffer(privhex, 'hex'))); + key.privkey2pubkey(); + key.getAddress().toString().should.equal((new Address()).fromPubkey(key.pubkey).toString()); + }); + + }); + describe("#privkey2pubkey", function() { it('should convert this known Privkey to known Pubkey', function() {