Removes Address.fromPubKey and improves test vectors
This commit is contained in:
parent
eae613d244
commit
1d1306b054
5 changed files with 53 additions and 232 deletions
|
@ -1,7 +1,5 @@
|
||||||
var assert = require('assert')
|
var assert = require('assert')
|
||||||
var base58check = require('./base58check')
|
var base58check = require('./base58check')
|
||||||
var crypto = require('./crypto')
|
|
||||||
var network = require('./network')
|
|
||||||
|
|
||||||
function Address(hash, version) {
|
function Address(hash, version) {
|
||||||
assert(Buffer.isBuffer(hash), 'First argument must be a Buffer')
|
assert(Buffer.isBuffer(hash), 'First argument must be a Buffer')
|
||||||
|
@ -12,19 +10,13 @@ function Address(hash, version) {
|
||||||
this.version = version
|
this.version = version
|
||||||
}
|
}
|
||||||
|
|
||||||
// Static constructors
|
// Import functions
|
||||||
Address.fromBase58Check = function(string) {
|
Address.fromBase58Check = function(string) {
|
||||||
var decode = base58check.decode(string)
|
var decode = base58check.decode(string)
|
||||||
|
|
||||||
return new Address(decode.payload, decode.version)
|
return new Address(decode.payload, decode.version)
|
||||||
}
|
}
|
||||||
|
Address.prototype.fromString = Address.prototype.fromBase58Check
|
||||||
Address.fromPubKey = function(pubKey, version) {
|
|
||||||
version = version || network.bitcoin.pubKeyHash
|
|
||||||
|
|
||||||
var hash = crypto.hash160(pubKey.toBuffer())
|
|
||||||
return new Address(hash, version)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Export functions
|
// Export functions
|
||||||
Address.prototype.toBase58Check = function () {
|
Address.prototype.toBase58Check = function () {
|
||||||
|
|
|
@ -121,7 +121,9 @@ ECPubKey.prototype.verify = function(hash, sig) {
|
||||||
}
|
}
|
||||||
|
|
||||||
ECPubKey.prototype.getAddress = function(version) {
|
ECPubKey.prototype.getAddress = function(version) {
|
||||||
return Address.fromPubKey(this, version)
|
version = version || network.bitcoin.pubKeyHash
|
||||||
|
|
||||||
|
return new Address(crypto.hash160(this.toBuffer()), version)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Export functions
|
// Export functions
|
||||||
|
|
|
@ -308,8 +308,7 @@ Transaction.prototype.sign = function(index, key, type, network) {
|
||||||
type = type || SIGHASH_ALL
|
type = type || SIGHASH_ALL
|
||||||
network = network || Network.bitcoin
|
network = network || Network.bitcoin
|
||||||
|
|
||||||
var address = Address.fromPubKey(key.pub, network.pubKeyHash)
|
var address = key.pub.getAddress(network.pubKeyHash)
|
||||||
|
|
||||||
var script = Script.createOutputScript(address, network)
|
var script = Script.createOutputScript(address, network)
|
||||||
var hash = this.hashTransactionForSignature(script, index, type)
|
var hash = this.hashTransactionForSignature(script, index, type)
|
||||||
var sig = key.sign(hash).concat([type])
|
var sig = key.sign(hash).concat([type])
|
||||||
|
|
|
@ -1,16 +1,12 @@
|
||||||
var assert = require('assert')
|
var assert = require('assert')
|
||||||
|
|
||||||
var Address = require('..').Address
|
var Address = require('..').Address
|
||||||
var ECPubKey = require('..').ECPubKey
|
|
||||||
var base58check = require('..').base58check
|
|
||||||
|
|
||||||
var fixtures = require('./fixtures/address')
|
var fixtures = require('./fixtures/address')
|
||||||
|
|
||||||
describe('Address', function() {
|
describe('Address', function() {
|
||||||
var bothVectors = fixtures.pubKeyHash.concat(fixtures.scriptHash)
|
var bothVectors = fixtures.pubKeyHash.concat(fixtures.scriptHash)
|
||||||
|
|
||||||
describe('Constructor', function() {
|
describe('Constructor', function() {
|
||||||
it('matches the test vectors', function() {
|
it('does not mutate the input', function() {
|
||||||
bothVectors.forEach(function(f) {
|
bothVectors.forEach(function(f) {
|
||||||
var hash = new Buffer(f.hex, 'hex')
|
var hash = new Buffer(f.hex, 'hex')
|
||||||
var addr = new Address(hash, f.version)
|
var addr = new Address(hash, f.version)
|
||||||
|
@ -30,8 +26,8 @@ describe('Address', function() {
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
|
|
||||||
it('output matches the test vectors', function() {
|
|
||||||
bothVectors.forEach(function(f) {
|
bothVectors.forEach(function(f) {
|
||||||
|
it('imports ' + f.description + ' correctly', function() {
|
||||||
var addr = Address.fromBase58Check(f.base58check)
|
var addr = Address.fromBase58Check(f.base58check)
|
||||||
|
|
||||||
assert.equal(addr.version, f.version)
|
assert.equal(addr.version, f.version)
|
||||||
|
@ -40,25 +36,13 @@ describe('Address', function() {
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
|
|
||||||
describe('fromPubKey', function() {
|
|
||||||
it('output matches the test vectors', function() {
|
|
||||||
fixtures.pubKeyHash.forEach(function(f) {
|
|
||||||
var pub = ECPubKey.fromBuffer(new Buffer(f.pubKey, 'hex'))
|
|
||||||
var addr = Address.fromPubKey(pub, f.version)
|
|
||||||
|
|
||||||
assert.equal(addr.version, f.version)
|
|
||||||
assert.equal(addr.hash.toString('hex'), f.hex)
|
|
||||||
})
|
|
||||||
})
|
|
||||||
})
|
|
||||||
|
|
||||||
describe('toBase58Check', function() {
|
describe('toBase58Check', function() {
|
||||||
it('output matches the test vectors', function() {
|
|
||||||
bothVectors.forEach(function(f) {
|
bothVectors.forEach(function(f) {
|
||||||
|
it('exports ' + f.description + ' correctly', function() {
|
||||||
var addr = Address.fromBase58Check(f.base58check)
|
var addr = Address.fromBase58Check(f.base58check)
|
||||||
var base58check = addr.toBase58Check()
|
var result = addr.toBase58Check()
|
||||||
|
|
||||||
assert.equal(base58check, f.base58check)
|
assert.equal(result, f.base58check)
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
|
|
192
test/fixtures/address.js
vendored
192
test/fixtures/address.js
vendored
|
@ -1,198 +1,42 @@
|
||||||
module.exports = {
|
module.exports = {
|
||||||
pubKeyHash: [
|
pubKeyHash: [
|
||||||
{
|
{
|
||||||
|
description: 'pubKeyHash (bitcoin)',
|
||||||
version: 0,
|
version: 0,
|
||||||
pubKey: '0479be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8',
|
|
||||||
hex: '91b24bf9f5288532960ac687abb035127b1d28a5',
|
|
||||||
base58check: '1EHNa6Q4Jz2uvNExL497mE43ikXhwF6kZm'
|
|
||||||
},
|
|
||||||
{
|
|
||||||
version: 0,
|
|
||||||
pubKey: '0279be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798',
|
|
||||||
hex: '751e76e8199196d454941c45d1b3a323f1433bd6',
|
hex: '751e76e8199196d454941c45d1b3a323f1433bd6',
|
||||||
base58check: '1BgGZ9tcN4rm9KBzDn7KprQz87SZ26SAMH'
|
base58check: '1BgGZ9tcN4rm9KBzDn7KprQz87SZ26SAMH'
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
version: 0,
|
description: 'pubKeyHash (testnet)',
|
||||||
pubKey: '04750578aed9dd59b43d0f3fbbcf26ed132bed71d202183674e6f0f01b71ad25eea9c42714b1f602b87164f76ef169477a7db9591e10755783006ebfa9c11946c3',
|
|
||||||
hex: 'c4fa066a855f0e2739f21393595ca3d7ff422fb6',
|
|
||||||
base58check: '1JxWxePiX2GHN444g5V5JpBLEi3LV8cHGS'
|
|
||||||
},
|
|
||||||
{
|
|
||||||
version: 0,
|
|
||||||
pubKey: '03750578aed9dd59b43d0f3fbbcf26ed132bed71d202183674e6f0f01b71ad25ee',
|
|
||||||
hex: '6b420cc35afb4d96ea118dbf1fc8ef4b0990798c',
|
|
||||||
base58check: '1An8RkWzqVF9GvpQFVX5AM4jpFe43eoPfe'
|
|
||||||
},
|
|
||||||
{
|
|
||||||
version: 0,
|
|
||||||
pubKey: '0479be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798b7c52588d95c3b9aa25b0403f1eef75702e84bb7597aabe663b82f6f04ef2777',
|
|
||||||
hex: 'bec08011c9e76dcc42e739a2d7752c2e3ac86e6e',
|
|
||||||
base58check: '1JPbzbsAx1HyaDQoLMapWGoqf9pD5uha5m'
|
|
||||||
},
|
|
||||||
{
|
|
||||||
version: 0,
|
|
||||||
pubKey: '0379be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798',
|
|
||||||
hex: 'adde4c73c7b9cee17da6c7b3e2b2eea1a0dcbe67',
|
|
||||||
base58check: '1GrLCmVQXoyJXaPJQdqssNqwxvha1eUo2E'
|
|
||||||
},
|
|
||||||
{
|
|
||||||
version: 0,
|
|
||||||
pubKey: '04cfd1c01397fc8d81fc6330d1a938e93551118a6f6db2e470ee353ffc1a51798073ab8fdf1fa8ffabce209ffe00538aa67d6ea819ddaa9410264faa34397306d7',
|
|
||||||
hex: 'e95895d8f1c5755b94d87bc42528ed37956971c0',
|
|
||||||
base58check: '1NGpZiQe9BDt6QEErh7cQxoaxns5fV1u9m'
|
|
||||||
},
|
|
||||||
{
|
|
||||||
version: 0,
|
|
||||||
pubKey: '03cfd1c01397fc8d81fc6330d1a938e93551118a6f6db2e470ee353ffc1a517980',
|
|
||||||
hex: '53991cac832df8180da4c97e77734a8fbce31fdf',
|
|
||||||
base58check: '18d2WLBU9YnrdpjYVS5xBpmk5KcUPwEbYU'
|
|
||||||
},
|
|
||||||
{
|
|
||||||
version: 0,
|
|
||||||
pubKey: '0422c39cb05bb33be292ee678c590a11ebcc75850944c8937a93bebddac4fb66cb9a473714030a262a19db874c781aa37a0ab8b7f519c2a71e94767e50f5f8900b',
|
|
||||||
hex: 'e6942137944f168785f8551956ae9a3fbbd12dc1',
|
|
||||||
base58check: '1N2BsMh9XktPCo2WxadsTV8Eni5AJhF7WG'
|
|
||||||
},
|
|
||||||
{
|
|
||||||
version: 0,
|
|
||||||
pubKey: '0322c39cb05bb33be292ee678c590a11ebcc75850944c8937a93bebddac4fb66cb',
|
|
||||||
hex: '02e70da0f47e5178ce258e6c9f220d17a538f7a6',
|
|
||||||
base58check: '1GM9F9uX4U9AgQzitsLQXghD7fb6cWNCX'
|
|
||||||
},
|
|
||||||
{
|
|
||||||
version: 0,
|
|
||||||
pubKey: '04c0520eb902f43b6fe91fea74eb6cab3fd5c54a6646a7e012fd244eac7864e08e276506e819cced089947254d7ed7b9a502cc77421b8d48c3dd00820f82971c85',
|
|
||||||
hex: '2ac31bc5ced6f167ff5aa4b93043590c8d6fc59c',
|
|
||||||
base58check: '14u77S4ysnoiaQXaVWBokFYwhVuPTPf2Tk'
|
|
||||||
},
|
|
||||||
{
|
|
||||||
version: 0,
|
|
||||||
pubKey: '03c0520eb902f43b6fe91fea74eb6cab3fd5c54a6646a7e012fd244eac7864e08e',
|
|
||||||
hex: 'e522cb50376421b2034ff2770421881f8b82ceaa',
|
|
||||||
base58check: '1MtZRUP1nB1wJ7ftUeLibBM6WXEksTUtiS'
|
|
||||||
},
|
|
||||||
{
|
|
||||||
version: 111,
|
version: 111,
|
||||||
pubKey: '0479be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8',
|
|
||||||
hex: '91b24bf9f5288532960ac687abb035127b1d28a5',
|
|
||||||
base58check: 'mtoKs9V381UAhUia3d7Vb9GNak8Qvmcsme'
|
|
||||||
},
|
|
||||||
{
|
|
||||||
version: 111,
|
|
||||||
pubKey: '0279be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798',
|
|
||||||
hex: '751e76e8199196d454941c45d1b3a323f1433bd6',
|
hex: '751e76e8199196d454941c45d1b3a323f1433bd6',
|
||||||
base58check: 'mrCDrCybB6J1vRfbwM5hemdJz73FwDBC8r'
|
base58check: 'mrCDrCybB6J1vRfbwM5hemdJz73FwDBC8r'
|
||||||
},
|
|
||||||
{
|
|
||||||
version: 111,
|
|
||||||
pubKey: '04750578aed9dd59b43d0f3fbbcf26ed132bed71d202183674e6f0f01b71ad25eea9c42714b1f602b87164f76ef169477a7db9591e10755783006ebfa9c11946c3',
|
|
||||||
hex: 'c4fa066a855f0e2739f21393595ca3d7ff422fb6',
|
|
||||||
base58check: 'myUUFhUhL3hY9AXgPeTT8jPf6he3Ti4vtG'
|
|
||||||
},
|
|
||||||
{
|
|
||||||
version: 111,
|
|
||||||
pubKey: '03750578aed9dd59b43d0f3fbbcf26ed132bed71d202183674e6f0f01b71ad25ee',
|
|
||||||
hex: '6b420cc35afb4d96ea118dbf1fc8ef4b0990798c',
|
|
||||||
base58check: 'mqJ5iobyeWgQ43J1y4VSzGH4gFEkxw2dFV'
|
|
||||||
},
|
|
||||||
{
|
|
||||||
version: 111,
|
|
||||||
pubKey: '0479be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798b7c52588d95c3b9aa25b0403f1eef75702e84bb7597aabe663b82f6f04ef2777',
|
|
||||||
hex: 'bec08011c9e76dcc42e739a2d7752c2e3ac86e6e',
|
|
||||||
base58check: 'mxuZHex9m2jEMKtR3vZCLC2AX9QuyLzj7L'
|
|
||||||
},
|
|
||||||
{
|
|
||||||
version: 111,
|
|
||||||
pubKey: '0379be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798',
|
|
||||||
hex: 'adde4c73c7b9cee17da6c7b3e2b2eea1a0dcbe67',
|
|
||||||
base58check: 'mwNHVpaPLqQZJgrv8CpFhJ4GpvJGumskXi'
|
|
||||||
},
|
|
||||||
{
|
|
||||||
version: 111,
|
|
||||||
pubKey: '04cfd1c01397fc8d81fc6330d1a938e93551118a6f6db2e470ee353ffc1a51798073ab8fdf1fa8ffabce209ffe00538aa67d6ea819ddaa9410264faa34397306d7',
|
|
||||||
hex: 'e95895d8f1c5755b94d87bc42528ed37956971c0',
|
|
||||||
base58check: 'n2nmrmVcxCf8sWhraG5zEt1upnTncBNXUE'
|
|
||||||
},
|
|
||||||
{
|
|
||||||
version: 111,
|
|
||||||
pubKey: '03cfd1c01397fc8d81fc6330d1a938e93551118a6f6db2e470ee353ffc1a517980',
|
|
||||||
hex: '53991cac832df8180da4c97e77734a8fbce31fdf',
|
|
||||||
base58check: 'mo8yoPGSxaE7QwDAD14L1jz4wKDBG3e5bV'
|
|
||||||
},
|
|
||||||
{
|
|
||||||
version: 111,
|
|
||||||
pubKey: '0422c39cb05bb33be292ee678c590a11ebcc75850944c8937a93bebddac4fb66cb9a473714030a262a19db874c781aa37a0ab8b7f519c2a71e94767e50f5f8900b',
|
|
||||||
hex: 'e6942137944f168785f8551956ae9a3fbbd12dc1',
|
|
||||||
base58check: 'n2Y9AQn8LnKdyuW8g9cFHQLZehfsDf33fp'
|
|
||||||
},
|
|
||||||
{
|
|
||||||
version: 111,
|
|
||||||
pubKey: '0322c39cb05bb33be292ee678c590a11ebcc75850944c8937a93bebddac4fb66cb',
|
|
||||||
hex: '02e70da0f47e5178ce258e6c9f220d17a538f7a6',
|
|
||||||
base58check: 'mfnJSJEtL5uPwntcSTqiESu257GHwWoA52'
|
|
||||||
},
|
|
||||||
{
|
|
||||||
version: 111,
|
|
||||||
pubKey: '04c0520eb902f43b6fe91fea74eb6cab3fd5c54a6646a7e012fd244eac7864e08e276506e819cced089947254d7ed7b9a502cc77421b8d48c3dd00820f82971c85',
|
|
||||||
hex: '2ac31bc5ced6f167ff5aa4b93043590c8d6fc59c',
|
|
||||||
base58check: 'mjR4QV9xgpEyMX1CD5ABaAmGZVW6MBcEML'
|
|
||||||
},
|
|
||||||
{
|
|
||||||
version: 111,
|
|
||||||
pubKey: '03c0520eb902f43b6fe91fea74eb6cab3fd5c54a6646a7e012fd244eac7864e08e',
|
|
||||||
hex: 'e522cb50376421b2034ff2770421881f8b82ceaa',
|
|
||||||
base58check: 'n2QWiXTzbCTC5E9WCDK6R6ZRNWqTq1o9RY'
|
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
scriptHash: [
|
scriptHash: [
|
||||||
{
|
{
|
||||||
|
description: 'scriptHash (bitcoin)',
|
||||||
version: 5,
|
version: 5,
|
||||||
hex: '30e22c5ffe8d09ab93c9cfd719cb4a0b524bb298',
|
hex: 'cd7b44d0b03f2d026d1e586d7ae18903b0d385f6',
|
||||||
base58check: '369VJYu1PiVLvnQT72MakjzGUKwzgtuLrN'
|
base58check: '3LRW7jeCvQCRdPF8S3yUCfRAx4eqXFmdcr'
|
||||||
},
|
|
||||||
{
|
|
||||||
version: 5,
|
|
||||||
hex: '16b9b33baa6e597a60f62e57775e8c9e76e215c2',
|
|
||||||
base58check: '33mBFSCFsQ29FUNW1dZGfDm1DSfcdHwJjD'
|
|
||||||
},
|
|
||||||
{
|
|
||||||
version: 5,
|
|
||||||
hex: '57fa71c2ada72b1656fb8e44c8c2635d4f76296f',
|
|
||||||
base58check: '39iCjQvovdxeDFbfFGTF7Fc7uxECKcuasG'
|
|
||||||
},
|
|
||||||
{
|
|
||||||
version: 5,
|
|
||||||
hex: 'f6a9a87cd6b20cf56c5a9947e04c7fbeb9d4004a',
|
|
||||||
base58check: '3QBFPnjSz6NT9fcp6Rw7jffWBM3e6uD3Rp'
|
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
description: 'scriptHash (testnet)',
|
||||||
version: 196,
|
version: 196,
|
||||||
hex: 'fc50013ecd7e130bb33dbe0bda5c0c4bda2278e6',
|
hex: 'cd7b44d0b03f2d026d1e586d7ae18903b0d385f6',
|
||||||
base58check: '2NGFL7Tfur3FshijLTq9xrp5EWMPrHHy4N1'
|
base58check: '2NByiBUaEXrhmqAsg7BbLpcQSAQs1EDwt5w'
|
||||||
},
|
|
||||||
{
|
|
||||||
version: 196,
|
|
||||||
hex: '81fad5e4b0f4a74d50f645e02a1929de3a434dee',
|
|
||||||
base58check: '2N56VePS9LHTxxKkDSYpHVT3tTBUzXzydDR'
|
|
||||||
},
|
|
||||||
{
|
|
||||||
version: 196,
|
|
||||||
hex: 'f7bd4199de4b0a1e85fc7d79c6a90c108a4d789f',
|
|
||||||
base58check: '2NFq9cRNwPxerxpgk5ySL87JvJi8yvZPpP9'
|
|
||||||
},
|
|
||||||
{
|
|
||||||
version: 196,
|
|
||||||
hex: 'b43c431f0b5d3ccb638d5e4358b08129faf5355d',
|
|
||||||
base58check: '2N9gDouPBrsvZoX5bKGFBNDoApKfsLpMVJf'
|
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
malformed: [
|
malformed: [
|
||||||
'nQyyFDwTJW5K',
|
'45k2PvUfZw',
|
||||||
'NEqYWpmWNgjM',
|
'8cVHMKGRJGMEVz',
|
||||||
'Bv6FiH8KsiJj9aZkvCcCEv',
|
'AMPCMAGBmj9EE9oGED',
|
||||||
'39yrcy7Q82EnCdetJzZfLhQj6spq',
|
'oJPsqvHTSFFWMcmNS3aDidZexw',
|
||||||
'wVtEiHQZekSnDHC512mwT3g7Ahr',
|
'bpiuHmqwCdiHx4ASNLGvZeBw9taY',
|
||||||
'3GfCH4v3ZjfVMy7raFPPaE9fkBbh'
|
'2ansc1MsREU2HetNdPGs2eHXTY16ircdyaH',
|
||||||
|
'iTKsHH39ooQPFxzX6RFtjPESpQ1',
|
||||||
|
'4TU74v3jnoTZGV5UuJGcr7XRg7hU',
|
||||||
|
'2a3wk37F1YmfqVtBam4gEn63oNuj',
|
||||||
|
'3rtH2aquyk4q1KGaXuiMGxaGfVPH'
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue