Private Keys & Wallets

Learn how to manage secrets with Stacks.js.

WITHOUT direct private key access

Most users interact with apps via their favorite Stacks wallet. Developers can build web apps that prompt the user for an action (e.g. sign a transaction), and then the wallet will handle the rest.

Build Web Apps

You can build Stacks enabled web apps without direct private key access using Stacks Connect.

WITH private key access

Developers can build scripts, backends, and tools intended for full control over private keys.

  • Using the Stacks.js CLI directly to send transactions, or perform common tasks
  • Building custom tools using Stacks.js libraries that manage private keys directly

Generating random private keys

Let's start by generating a random private key. Note that this will return a different value each time you run the code.

import { randomPrivateKey } from '@stacks/transactions';

const privateKey = randomPrivateKey();
// 'f5a31c1268a1e37d4edaa05c7d11183c5fbfdcdc48aae36ea4d8cd5cb709932801'

Private keys are typically represented as hex strings in Stacks.js. For more control you can use the PrivateKey type, which also accepts raw bytes as Uint8Array in JavaScript.

Using a wallet / seed phrase

Typically, we don't want to generate random private keys, but instead use a deterministic wallet based on a seed phrase.

Generate a random seed phrase (24 words):

import { randomSeedPhrase } from '@stacks/wallet-sdk';

const phrase = randomSeedPhrase();
// "warrior volume sport ... figure cake since"

Generate a wallet from a seed phrase:

import { generateWallet } from '@stacks/wallet-sdk';

let wallet = generateWallet({
  secretKey: seed,
  password: "secret",
});

console.log(wallet.accounts[0]); // one account is generated by default
// { 
//   stxPrivateKey: '893fc4936c5350394bbe0053d2c31a4b5a44680f6dceb4be2aacaaa3c12e45ff01',
//   dataPrivateKey: '676dc36d89ba04cf1789552fc35f3a6279b4b5f13f3d49fb469b0afecea9698f',
//   appsKey: 'xprvA19evFHUzrZF3wULUSv1UVcQNRP7xJ2vn2MyAKaUHbT8SvjrrkkhANRG2bewMxHAeDSoUVUBRPiztDc8WwGtz9Ero2GXW5rk3vHHXmutb4V',
//   salt: 'cf8a5c7142d842bb38f30c5ab626f7996dd7494236edf21ba00349bb09b9558d',
//   index: 0
// } 

Generate more accounts:

import { generateNewAccount } from '@stacks/wallet-sdk';

wallet = generateNewAccount(wallet);
console.log(wallet.accounts.length); // 2

What else can we do with private keys?

Sign Transactions

Learn how to sign transactions with Stacks.js.