Support instantation with public keys
This commit is contained in:
parent
155513d8e9
commit
ecbf109a71
|
@ -22,7 +22,8 @@ Features not supported:
|
||||||
Constructors:
|
Constructors:
|
||||||
|
|
||||||
* `generate([icap])` - create an instance based on a new random key (setting `icap` to true will generate an address suitable for the `ICAP Direct mode`)
|
* `generate([icap])` - create an instance based on a new random key (setting `icap` to true will generate an address suitable for the `ICAP Direct mode`)
|
||||||
* `fromPrivateKey(input)` - create an instance based on a raw key
|
* `fromPrivateKey(input)` - create an instance based on a raw private key
|
||||||
|
* `fromPublicKey(input)` - create an instance based on a public key (certain methods will not be available)
|
||||||
* `fromV1(input, password)` - import a wallet (Version 1 of the Ethereum wallet format)
|
* `fromV1(input, password)` - import a wallet (Version 1 of the Ethereum wallet format)
|
||||||
* `fromV3(input, password, [nonStrict])` - import a wallet (Version 3 of the Ethereum wallet format). Set `nonStrict` true to accept files with mixed-caps.
|
* `fromV3(input, password, [nonStrict])` - import a wallet (Version 3 of the Ethereum wallet format). Set `nonStrict` true to accept files with mixed-caps.
|
||||||
* `fromEthSale(input, password)` - import an Ethereum Pre Sale wallet
|
* `fromEthSale(input, password)` - import an Ethereum Pre Sale wallet
|
||||||
|
|
33
index.js
33
index.js
|
@ -13,13 +13,30 @@ function decipherBuffer (decipher, data) {
|
||||||
return Buffer.concat([ decipher.update(data), decipher.final() ])
|
return Buffer.concat([ decipher.update(data), decipher.final() ])
|
||||||
}
|
}
|
||||||
|
|
||||||
var Wallet = function (priv) {
|
var Wallet = function (priv, pub) {
|
||||||
if (!ethUtil.isValidPrivate(priv)) {
|
if (priv && !ethUtil.isValidPrivate(priv)) {
|
||||||
throw new Error('Private key does not satisfy the curve requirements (ie. it is invalid)')
|
throw new Error('Private key does not satisfy the curve requirements (ie. it is invalid)')
|
||||||
}
|
}
|
||||||
this.privKey = priv
|
this._privKey = priv
|
||||||
|
this._pubKey = pub
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Object.defineProperty(Wallet.prototype, 'privKey', {
|
||||||
|
get: function () {
|
||||||
|
assert(this._privKey, 'This is a public key only wallet')
|
||||||
|
return this._privKey
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
Object.defineProperty(Wallet.prototype, 'pubKey', {
|
||||||
|
get: function () {
|
||||||
|
if (!this._pubKey) {
|
||||||
|
this._pubKey = ethUtil.privateToPublic(this.privKey)
|
||||||
|
}
|
||||||
|
return this._pubKey
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
Wallet.generate = function (icapDirect) {
|
Wallet.generate = function (icapDirect) {
|
||||||
if (icapDirect) {
|
if (icapDirect) {
|
||||||
while (true) {
|
while (true) {
|
||||||
|
@ -42,7 +59,7 @@ Wallet.prototype.getPrivateKeyString = function () {
|
||||||
}
|
}
|
||||||
|
|
||||||
Wallet.prototype.getPublicKey = function () {
|
Wallet.prototype.getPublicKey = function () {
|
||||||
return ethUtil.privateToPublic(this.privKey)
|
return this.pubKey
|
||||||
}
|
}
|
||||||
|
|
||||||
Wallet.prototype.getPublicKeyString = function () {
|
Wallet.prototype.getPublicKeyString = function () {
|
||||||
|
@ -50,7 +67,7 @@ Wallet.prototype.getPublicKeyString = function () {
|
||||||
}
|
}
|
||||||
|
|
||||||
Wallet.prototype.getAddress = function () {
|
Wallet.prototype.getAddress = function () {
|
||||||
return ethUtil.privateToAddress(this.privKey)
|
return ethUtil.publicToAddress(this.pubKey)
|
||||||
}
|
}
|
||||||
|
|
||||||
Wallet.prototype.getAddressString = function () {
|
Wallet.prototype.getAddressString = function () {
|
||||||
|
@ -63,6 +80,8 @@ Wallet.prototype.getChecksumAddressString = function () {
|
||||||
|
|
||||||
// https://github.com/ethereum/wiki/wiki/Web3-Secret-Storage-Definition
|
// https://github.com/ethereum/wiki/wiki/Web3-Secret-Storage-Definition
|
||||||
Wallet.prototype.toV3 = function (password, opts) {
|
Wallet.prototype.toV3 = function (password, opts) {
|
||||||
|
assert(this._privKey, 'This is a public key only wallet')
|
||||||
|
|
||||||
opts = opts || {}
|
opts = opts || {}
|
||||||
var salt = opts.salt || crypto.randomBytes(32)
|
var salt = opts.salt || crypto.randomBytes(32)
|
||||||
var iv = opts.iv || crypto.randomBytes(16)
|
var iv = opts.iv || crypto.randomBytes(16)
|
||||||
|
@ -140,6 +159,10 @@ Wallet.prototype.toV3String = function (password, opts) {
|
||||||
return JSON.stringify(this.toV3(password, opts))
|
return JSON.stringify(this.toV3(password, opts))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Wallet.fromPublicKey = function (pub) {
|
||||||
|
return new Wallet(null, pub)
|
||||||
|
}
|
||||||
|
|
||||||
Wallet.fromPrivateKey = function (priv) {
|
Wallet.fromPrivateKey = function (priv) {
|
||||||
return new Wallet(priv)
|
return new Wallet(priv)
|
||||||
}
|
}
|
||||||
|
|
|
@ -52,6 +52,27 @@ describe('.getChecksumAddressString()', function () {
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
|
|
||||||
|
describe('public key only wallet', function () {
|
||||||
|
var pubKey = new Buffer('5d4392f450262b276652c1fc037606abac500f3160830ce9df53aa70d95ce7cfb8b06010b2f3691c78c65c21eb4cf3dfdbfc0745d89b664ee10435bb3a0f906c', 'hex')
|
||||||
|
it('.fromPublicKey() should work', function () {
|
||||||
|
assert.equal(Wallet.fromPublicKey(pubKey).getPublicKey().toString('hex'),
|
||||||
|
'5d4392f450262b276652c1fc037606abac500f3160830ce9df53aa70d95ce7cfb8b06010b2f3691c78c65c21eb4cf3dfdbfc0745d89b664ee10435bb3a0f906c')
|
||||||
|
})
|
||||||
|
it('.getAddress() should work', function () {
|
||||||
|
assert.equal(Wallet.fromPublicKey(pubKey).getAddress().toString('hex'), 'b14ab53e38da1c172f877dbc6d65e4a1b0474c3c')
|
||||||
|
})
|
||||||
|
it('.getPrivateKey() should fail', function () {
|
||||||
|
assert.throws(function () {
|
||||||
|
Wallet.fromPublicKey(pubKey).getPrivateKey()
|
||||||
|
})
|
||||||
|
})
|
||||||
|
it('.toV3() should fail', function () {
|
||||||
|
assert.throws(function () {
|
||||||
|
Wallet.fromPublicKey(pubKey).toV3()
|
||||||
|
})
|
||||||
|
})
|
||||||
|
})
|
||||||
|
|
||||||
describe('.generate()', function () {
|
describe('.generate()', function () {
|
||||||
it('should generate an account', function () {
|
it('should generate an account', function () {
|
||||||
assert.equal(Wallet.generate().getPrivateKey().length, 32)
|
assert.equal(Wallet.generate().getPrivateKey().length, 32)
|
||||||
|
|
Loading…
Reference in New Issue