Add nodePublicAccountID

This commit is contained in:
Nicholas Dudfield
2015-07-31 17:39:50 +07:00
parent a68a2e50e6
commit 09be6e372e
5 changed files with 41 additions and 6 deletions

View File

@@ -40,6 +40,13 @@ eddsa deterministic signatures.
publicKey: 'n9MU2RsULUayZnWeLssjbMzVRPeVUUMgiPYTwe8eMgpdGDWp5t8C' }
```
## Derive accountID matching a validator public key (aka public generator)
```js
> var nodePublicAccountID = require('ripple-keypairs').nodePublicAccountID;
> nodePublicAccountID('n9MXXueo837zYH36DvMc13BwHcqtfAWNJY5czWVbp7uYTj7x17TH')
'rhcfR9Cg98qCxHpCcPBmMonbDBXo84wyTn'
```
## Sign a transaction
see [examples/sign-transaction.js](examples/sign-transaction.js)
```js

View File

@@ -63,4 +63,6 @@ Ed25519Pair.prototype.verify = function(message, signature) {
return this.key().verify(message, signature);
};
module.exports = Ed25519Pair;
module.exports = {
Ed25519Pair
};

View File

@@ -6,8 +6,8 @@ const rand = require('brorand');
const {seedFromPhrase, createAccountID} = require('./utils');
const {KeyPair, KeyType} = require('./keypair');
const Ed25519Pair = require('./ed25519');
const K256Pair = require('./secp256k1');
const {Ed25519Pair} = require('./ed25519');
const {K256Pair, accountPublicFromGenerator} = require('./secp256k1');
KeyPair.fromSeed = function(seedBytes, type, options) {
assert(type === 'secp256k1' || type === 'ed25519');
@@ -54,6 +54,12 @@ function generateValidatorKeys(opts={}) {
return deriveValidator(randGen(16));
}
function nodePublicAccountID(publicKey) {
const genBytes = codec.decodeNodePublic(publicKey);
const accountPublicBytes = accountPublicFromGenerator(genBytes);
return codec.encodeAccountID(createAccountID(accountPublicBytes));
}
function validatorKeysFromSeed(seed) {
const {type, bytes} = codec.decodeSeed(seed);
assert(type === KeyType.secp256k1);
@@ -71,5 +77,6 @@ module.exports = {
generateWallet,
generateValidatorKeys,
walletFromSeed,
validatorKeysFromSeed
validatorKeysFromSeed,
nodePublicAccountID
};

View File

@@ -57,6 +57,14 @@ function deriveSecret(seed, opts={}) {
.add(privateGen).mod(order);
}
function accountPublicFromGenerator(publicGenBytes) {
const rootPubPoint = secp256k1.curve.decodePoint(publicGenBytes);
const scalar = deriveScalar(publicGenBytes, 0);
const point = secp256k1.g.mul(scalar);
const offset = rootPubPoint.add(point);
return offset.encodeCompressed();
}
/*
* @class
*/
@@ -116,4 +124,7 @@ K256Pair.prototype.verify = function(message, signature) {
}
};
module.exports = K256Pair;
module.exports = {
K256Pair,
accountPublicFromGenerator
};

View File

@@ -14,7 +14,8 @@ const {
generateWallet,
walletFromSeed,
generateValidatorKeys,
validatorKeysFromSeed
validatorKeysFromSeed,
nodePublicAccountID
} = keypairs;
const {SerializedObject} = require('ripple-lib');
@@ -155,6 +156,13 @@ describe('generateValidatorKeys', function() {
assert.deepEqual(actual, expected);
assert.deepEqual(validatorKeysFromSeed(actual.seed), expected);
});
it('can generate the correct accountID from validator public key', () => {
const accountID = 'rhcfR9Cg98qCxHpCcPBmMonbDBXo84wyTn';
const validatorPublic =
'n9MXXueo837zYH36DvMc13BwHcqtfAWNJY5czWVbp7uYTj7x17TH';
assert.equal(nodePublicAccountID(validatorPublic), accountID);
});
});
describe('K256Pair', function() {