commit
9b5dfbd865
11 changed files with 108 additions and 336 deletions
|
@ -28,9 +28,11 @@ function Address(hash, version) {
|
|||
|
||||
// Import functions
|
||||
Address.fromBase58Check = function(string) {
|
||||
var decode = base58check.decode(string)
|
||||
var payload = base58check.decode(string)
|
||||
var version = payload.readUInt8(0)
|
||||
var hash = payload.slice(1)
|
||||
|
||||
return new Address(decode.payload, decode.version)
|
||||
return new Address(hash, version)
|
||||
}
|
||||
|
||||
Address.fromScriptPubKey = function(script, network) {
|
||||
|
@ -51,7 +53,11 @@ Address.fromScriptPubKey = function(script, network) {
|
|||
|
||||
// Export functions
|
||||
Address.prototype.toBase58Check = function () {
|
||||
return base58check.encode(this.hash, this.version)
|
||||
var payload = new Buffer(21)
|
||||
payload.writeUInt8(this.version, 0)
|
||||
this.hash.copy(payload, 1)
|
||||
|
||||
return base58check.encode(payload)
|
||||
}
|
||||
|
||||
Address.prototype.toScriptPubKey = function() {
|
||||
|
|
|
@ -4,13 +4,11 @@ var base58 = require('./base58')
|
|||
var crypto = require('./crypto')
|
||||
|
||||
// Encode a buffer as a base58-check-encoded string
|
||||
function encode(payload, version) {
|
||||
var version = new Buffer([version])
|
||||
var message = Buffer.concat([version, payload])
|
||||
var checksum = crypto.hash256(message).slice(0, 4)
|
||||
function encode(payload) {
|
||||
var checksum = crypto.hash256(payload).slice(0, 4)
|
||||
|
||||
return base58.encode(Buffer.concat([
|
||||
message,
|
||||
payload,
|
||||
checksum
|
||||
]))
|
||||
}
|
||||
|
@ -19,20 +17,13 @@ function encode(payload, version) {
|
|||
function decode(string) {
|
||||
var buffer = base58.decode(string)
|
||||
|
||||
var message = buffer.slice(0, -4)
|
||||
var payload = buffer.slice(0, -4)
|
||||
var checksum = buffer.slice(-4)
|
||||
var newChecksum = crypto.hash256(message).slice(0, 4)
|
||||
var newChecksum = crypto.hash256(payload).slice(0, 4)
|
||||
|
||||
assert.deepEqual(newChecksum, checksum, 'Invalid checksum')
|
||||
|
||||
var version = message.readUInt8(0)
|
||||
var payload = message.slice(1)
|
||||
|
||||
return {
|
||||
version: version,
|
||||
payload: payload,
|
||||
checksum: checksum
|
||||
}
|
||||
return payload
|
||||
}
|
||||
|
||||
module.exports = {
|
||||
|
|
22
src/eckey.js
22
src/eckey.js
|
@ -22,13 +22,16 @@ function ECKey(D, compressed) {
|
|||
|
||||
// Static constructors
|
||||
ECKey.fromWIF = function(string) {
|
||||
var decode = base58check.decode(string)
|
||||
var payload = decode.payload
|
||||
var payload = base58check.decode(string)
|
||||
var compressed = false
|
||||
|
||||
// Ignore the version byte
|
||||
payload = payload.slice(1)
|
||||
|
||||
if (payload.length === 33) {
|
||||
assert.strictEqual(payload[32], 0x01, 'Invalid compression flag')
|
||||
|
||||
// Truncate the compression flag
|
||||
payload = payload.slice(0, -1)
|
||||
compressed = true
|
||||
}
|
||||
|
@ -50,15 +53,20 @@ ECKey.makeRandom = function(compressed, rng) {
|
|||
}
|
||||
|
||||
// Export functions
|
||||
ECKey.prototype.toWIF = function(version) {
|
||||
version = version || networks.bitcoin.wif
|
||||
ECKey.prototype.toWIF = function(network) {
|
||||
network = network || networks.bitcoin
|
||||
|
||||
var bufferLen = this.pub.compressed ? 34 : 33
|
||||
var buffer = new Buffer(bufferLen)
|
||||
|
||||
buffer.writeUInt8(network.wif, 0)
|
||||
this.D.toBuffer(32).copy(buffer, 1)
|
||||
|
||||
var buffer = this.D.toBuffer(32)
|
||||
if (this.pub.compressed) {
|
||||
buffer = Buffer.concat([buffer, new Buffer([0x01])])
|
||||
buffer.writeUInt8(0x01, 33)
|
||||
}
|
||||
|
||||
return base58check.encode(buffer, version)
|
||||
return base58check.encode(buffer)
|
||||
}
|
||||
|
||||
// Operations
|
||||
|
|
|
@ -30,10 +30,10 @@ ECPubKey.fromHex = function(hex) {
|
|||
}
|
||||
|
||||
// Operations
|
||||
ECPubKey.prototype.getAddress = function(version) {
|
||||
version = version || networks.bitcoin.pubKeyHash
|
||||
ECPubKey.prototype.getAddress = function(network) {
|
||||
network = network || networks.bitcoin
|
||||
|
||||
return new Address(crypto.hash160(this.toBuffer()), version)
|
||||
return new Address(crypto.hash160(this.toBuffer()), network.pubKeyHash)
|
||||
}
|
||||
|
||||
ECPubKey.prototype.verify = function(hash, signature) {
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
var assert = require('assert')
|
||||
var base58 = require('./base58')
|
||||
var base58check = require('./base58check')
|
||||
|
||||
var BigInteger = require('bigi')
|
||||
var crypto = require('./crypto')
|
||||
|
@ -68,15 +68,7 @@ HDNode.fromSeedHex = function(hex, network) {
|
|||
}
|
||||
|
||||
HDNode.fromBase58 = function(string) {
|
||||
var buffer = base58.decode(string)
|
||||
|
||||
var payload = buffer.slice(0, -4)
|
||||
var checksum = buffer.slice(-4)
|
||||
|
||||
var newChecksum = crypto.hash256(payload).slice(0, 4)
|
||||
assert.deepEqual(newChecksum, checksum, 'Invalid checksum')
|
||||
|
||||
return HDNode.fromBuffer(payload)
|
||||
return HDNode.fromBuffer(base58check.decode(string))
|
||||
}
|
||||
|
||||
HDNode.fromBuffer = function(buffer) {
|
||||
|
@ -144,17 +136,11 @@ HDNode.prototype.getFingerprint = function() {
|
|||
}
|
||||
|
||||
HDNode.prototype.getAddress = function() {
|
||||
return this.pubKey.getAddress(this.network.pubKeyHash)
|
||||
return this.pubKey.getAddress(this.network)
|
||||
}
|
||||
|
||||
HDNode.prototype.toBase58 = function(isPrivate) {
|
||||
var buffer = this.toBuffer(isPrivate)
|
||||
var checksum = crypto.hash256(buffer).slice(0, 4)
|
||||
|
||||
return base58.encode(Buffer.concat([
|
||||
buffer,
|
||||
checksum
|
||||
]))
|
||||
return base58check.encode(this.toBuffer(isPrivate))
|
||||
}
|
||||
|
||||
HDNode.prototype.toBuffer = function(isPrivate) {
|
||||
|
|
|
@ -37,10 +37,9 @@ function sign(key, message, network) {
|
|||
|
||||
// TODO: network could be implied from address
|
||||
function verify(address, compactSig, message, network) {
|
||||
if (typeof address === 'string') {
|
||||
address = Address.fromBase58Check(address)
|
||||
if (address instanceof Address) {
|
||||
address = address.toString()
|
||||
}
|
||||
|
||||
network = network || networks.bitcoin
|
||||
|
||||
var hash = magicHash(message, network)
|
||||
|
@ -49,7 +48,7 @@ function verify(address, compactSig, message, network) {
|
|||
var Q = ecdsa.recoverPubKey(ecparams, e, parsed.signature, parsed.i)
|
||||
|
||||
var pubKey = new ECPubKey(Q, parsed.compressed)
|
||||
return pubKey.getAddress(address.version).toString() === address.toString()
|
||||
return pubKey.getAddress(network).toString() === address
|
||||
}
|
||||
|
||||
module.exports = {
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue