refactor address.

This commit is contained in:
Christopher Jeffrey 2016-06-18 21:40:07 -07:00
parent 7422b46e75
commit a1e31f02ae
No known key found for this signature in database
GPG Key ID: 8962AB9DE6666BBD
3 changed files with 57 additions and 59 deletions

View File

@ -38,7 +38,7 @@ function Address(options) {
this.hash = null;
this.type = null;
this.version = null;
this.network = bcoin.network.get().type;
this.network = null;
if (options)
this.fromOptions(options);
@ -78,10 +78,26 @@ Address.prototype.getHash = function getHash(enc) {
*/
Address.prototype.toBase58 = function toBase58(network) {
var p = new BufferWriter();
var prefix;
if (!network)
network = this.network;
return Address.toBase58(this.hash, this.type, this.version, network);
network = bcoin.network.get(network);
prefix = network.address.prefixes[this.type];
assert(prefix != null, 'Not a valid address prefix.');
p.writeU8(prefix);
if (this.version !== -1) {
p.writeU8(this.version);
p.writeU8(0);
}
p.writeBytes(this.hash);
p.writeChecksum();
return utils.toBase58(p.render());
};
/**
@ -115,53 +131,6 @@ Address.prototype.inspect = function inspect() {
+ '>';
};
/**
* Compile a hash to an address.
* @param {Hash|Buffer} hash
* @param {AddressType?} type
* @param {Number?} version - Witness version.
* @returns {Base58Address}
* @throws Error on bad hash/prefix.
*/
Address.toBase58 = function toBase58(hash, type, version, network) {
var p, prefix;
if (typeof hash === 'string')
hash = new Buffer(hash, 'hex');
if (!type)
type = 'pubkeyhash';
network = bcoin.network.get(network);
prefix = network.address.prefixes[type];
if (!(version >= 0))
version = network.address.versions[type];
assert(prefix != null, 'Not a valid address prefix.');
if (!(version >= 0))
assert(hash.length === 20, 'Hash is the wrong size.');
else if (version === 0 && type === 'witnesspubkeyhash')
assert(hash.length === 20, 'Hash is the wrong size.');
else if (version === 0 && type === 'witnessscripthash')
assert(hash.length === 32, 'Hash is the wrong size.');
p = new BufferWriter();
p.writeU8(prefix);
if (version != null) {
p.writeU8(version);
p.writeU8(0);
}
p.writeBytes(hash);
p.writeChecksum();
return utils.toBase58(p.render());
};
/**
* Parse a base58 address.
* @param {Base58Address} address
@ -170,7 +139,7 @@ Address.toBase58 = function toBase58(hash, type, version, network) {
*/
Address.prototype.fromBase58 = function fromBase58(address) {
var i, prefix, type, version, hash, network, p;
var i, prefix, type, version, nversion, hash, network, p;
if (typeof address === 'string')
address = utils.fromBase58(address);
@ -187,12 +156,17 @@ Address.prototype.fromBase58 = function fromBase58(address) {
assert(type != null, 'Unknown address prefix.');
version = network.address.versions[type];
nversion = network.address.versions[type];
if (version != null) {
if (nversion == null)
nversion = -1;
if (nversion !== -1) {
version = p.readU8();
assert(version >= 0 && version <= 16, 'Bad program version.');
assert(p.readU8() === 0, 'Address version padding is non-zero.');
} else {
version = -1;
}
if (type === 'witnessscripthash')
@ -205,7 +179,7 @@ Address.prototype.fromBase58 = function fromBase58(address) {
this.network = network.type;
this.type = type;
this.hash = hash;
this.version = version == null ? -1 : version;
this.version = version;
return this;
};
@ -372,13 +346,37 @@ Address.fromScript = function fromScript(script) {
*/
Address.prototype.fromHash = function fromHash(hash, type, version, network) {
var p, prefix, nversion;
if (typeof hash === 'string')
hash = new Buffer(hash, 'hex');
if (!type)
type = 'pubkeyhash';
if (version == null)
version = -1;
network = bcoin.network.get(network);
prefix = network.address.prefixes[type];
nversion = network.address.versions[type];
if (version === -1 && nversion != null)
version = nversion;
assert(prefix != null, 'Not a valid address prefix.');
if (version === -1)
assert(hash.length === 20, 'Hash is the wrong size.');
else if (version === 0 && type === 'witnesspubkeyhash')
assert(hash.length === 20, 'Hash is the wrong size.');
else if (version === 0 && type === 'witnessscripthash')
assert(hash.length === 32, 'Hash is the wrong size.');
this.hash = hash;
this.type = type || 'pubkeyhash';
this.version = version == null ? -1 : version;
this.network = bcoin.network.get(network).type;
this.type = type;
this.version = version;
this.network = network.type;
return this;
};

View File

@ -61,11 +61,11 @@ Coin.prototype.fromOptions = function fromOptions(options) {
assert(utils.isNumber(this.version));
assert(utils.isNumber(this.height));
assert(typeof this.value === 'number');
assert(utils.isNumber(this.value));
assert(this.script instanceof bcoin.script);
assert(typeof this.coinbase === 'boolean');
assert(!this.hash || typeof this.hash === 'string');
assert(!this.index || typeof this.index === 'number');
assert(!this.index || utils.isNumber(this.index));
return this;
};

View File

@ -317,7 +317,7 @@ KeyRing.prototype.getKeyAddress = function getKeyAddress() {
*/
KeyRing.prototype.compile = function compile(hash, type, version) {
return bcoin.address.toBase58(hash, type, version, this.network);
return bcoin.address.fromHash(hash, type, version, this.network).toBase58();
};
/**