mirror of
https://github.com/Xahau/xahau.js.git
synced 2025-11-04 21:15:47 +00:00
Add nodePublicAccountID
This commit is contained in:
@@ -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
|
||||
|
||||
@@ -63,4 +63,6 @@ Ed25519Pair.prototype.verify = function(message, signature) {
|
||||
return this.key().verify(message, signature);
|
||||
};
|
||||
|
||||
module.exports = Ed25519Pair;
|
||||
module.exports = {
|
||||
Ed25519Pair
|
||||
};
|
||||
|
||||
@@ -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
|
||||
};
|
||||
|
||||
@@ -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
|
||||
};
|
||||
|
||||
@@ -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() {
|
||||
|
||||
Reference in New Issue
Block a user