Search…
⌃K

Key Distributer SDK

The SSV Key Distributor SDK is a JS/TS library that enables developers to integrate the distribution of validator keys to KeyShares to their application.

Installation

// Yarn
yarn add https://github.com/bloxapp/ssv-keys.git
// NPM
npm install https://github.com/bloxapp/ssv-keys.git

Methods

Keystore Method (optional)

Returns a validator key from an existing Keystore file.
// Imports
import { EthereumKeyStore } from 'ssv-keys'
// Get the private key from the keystore using the keystore password
// Get required data from the keystore file
const keyStore = new EthereumKeyStore(JSON.stringify(keystore));
// Get public key using the keystore password
const publicKey = await keyStore.getPublicKey(keystorePassword);
// Get private key using the keystore password
const privateKey = await keyStore.getPrivateKey(keystorePassword);
// Log the public key
console.debug('Public Key: ' + publicKey);
// Log the private key
console.debug('Private Key: ' + privateKey);

KeyShares Method

Returns KeyShares (SharesPublicKey & SharesEncrypted) from a validator key and set of operator keys.
// Build the shares
// Imports
import { Encryption, Threshold } from 'ssv-keys'
import { encode } from 'js-base64'
const operators = require('./operators.json');
// Initialize the Threshold class
const thresholdInstance = new Threshold();
// Create the threshold instance using the private key
const threshold = await thresholdInstance.create(privateKey);
// Build the shares using an array of operator public keys
let shares = new Encryption(operators, threshold.shares).encrypt();
// Loop through the operators RSA keys and format them as base64
shares = shares.map((share) => {
share.operatorPublicKey = encode(share.operatorPublicKey);
// Return the operator key and KeyShares (sharePublicKey & shareEncrypted)
return share;
});

Register Validator Payload Method

Returns the registerValidator() transaction payload from a validator key and set of operator keys
// Build transaction payload
// Imports
import { encode } from 'js-base64'
import { Web3 } from 'web3'
const operatorIds = require('./operatorIds.json');
// Initialize the web3 class
const web3 = new Web3();
// Loop through the operators and encode them as ABI parameters
const operatorsPublicKeys = operators.map((operator) => web3.eth.abi.encodeParameter('string', encode(operator)));
// Get all the public keys from the shares
const sharePublicKeys = shares.map((share) => share.publicKey);
// Get all the private keys from the shares and encode them as ABI parameters
const shareEncrypted = shares.map((share) => web3.eth.abi.encodeParameter('string', share.privateKey));
// Token amount (liquidation collateral and operational runway balance to be funded)
const tokenAmount = web3.utils.toBN(123456789).toString(); /
// Return all the needed params to build a transaction payload
return [
threshold.validatorPublicKey,
`[${operatorIds.join(',')}]`,
operatorsPublicKeys,
sharesPublicKeys,
sharesEncrypted,
tokenAmount
]