Signer Interface
software.sava.core.accounts.Signer
Provides Ed25519 key pair management and signing capabilities.
Constants
Length of Ed25519 private key in bytes (32)
Key Generation
Generate Private Key
static byte[] generatePrivateKeyBytes()
32-byte randomly generated private key
Generate Key Pair
static byte[] generatePrivateKeyPairBytes()
64-byte array containing private key (bytes 0-31) and public key (bytes 32-63)
Create From Private Key
static byte[] createKeyPairBytesFromPrivateKey(byte[] privateKey)
Factory Methods
From Private Key
static Signer createFromPrivateKey(byte[] privateKey)
32-byte private key (will be copied)
KeyPairSigner instance with generated public key
From Key Pair
static Signer createFromKeyPair(byte[] keyPair)
64-byte array containing private key (0-31) and public key (32-63)
static Signer createFromKeyPair(
byte[] publicKey,
byte[] privateKey
)
static Signer createFromKeyPair(
PublicKey publicKey,
PrivateKey privateKey
)
Java security PrivateKey instance
Key Validation
static void validateKeyPair(
byte[] privateKey,
byte[] expectedPublicKey
)
Expected public key derived from private key
Throws IllegalStateException if keys don’t match or public key is invalid.
static void validateKeyPair(byte[] keyPair)
64-byte key pair to validate
Instance Methods
Access Keys
Public key of this signer
Java security PrivateKey instance
Create Dedicated Signer
Signer createDedicatedSigner()
New signer instance with independent state for multi-threaded signing
Sign Messages
int sign(
byte[] message,
int msgOffset,
int msgLen,
int outPos
)
Position in message array to write signature
New position after signature (outPos + 64)
byte[] sign(byte[] message, int msgOffset, int msgLen)
64-byte Ed25519 signature
byte[] sign(byte[] message)
64-byte signature of entire message
Example Usage
import software.sava.core.accounts.Signer;
import software.sava.core.accounts.PublicKey;
// Generate new keypair
var keyPair = Signer.generatePrivateKeyPairBytes();
var signer = Signer.createFromKeyPair(keyPair);
// Access public key
PublicKey pubKey = signer.publicKey();
System.out.println("Address: " + pubKey.toBase58());
// Sign a message
byte[] message = "Hello Solana".getBytes();
byte[] signature = signer.sign(message);
// Verify signature
boolean valid = pubKey.verifySignature(message, signature);
// Create from existing private key
var existingSigner = Signer.createFromPrivateKey(privateKeyBytes);
// Multi-threaded signing
var dedicatedSigner = signer.createDedicatedSigner();
// Use dedicatedSigner in another thread
KeyPairSigner Implementation
software.sava.core.accounts.KeyPairSigner
Default implementation of the Signer interface.
Features
- Ed25519 signature generation using BouncyCastle
- Thread-safe signing operations
- Secure key storage
- Automatic public key derivation from private key
Signing Process
- Creates Ed25519 signer with private key
- Updates signer with message bytes
- Generates 64-byte signature
- Returns signature or writes to output array
Security Notes
- Private keys are validated on creation
- Key pairs are validated to match
- Secure random number generation for key creation
- Keys are copied to prevent external modification
Example: Transaction Signing
import software.sava.core.accounts.Signer;
import software.sava.core.tx.Transaction;
// Create signer
var signer = Signer.createFromKeyPair(keyPairBytes);
// Create transaction
var tx = Transaction.createTx(
signer.publicKey(),
instructions
);
// Sign transaction
String blockHash = getRecentBlockhash();
tx.sign(blockHash, signer);
// Get base64-encoded signed transaction
String signedTx = tx.base64EncodeToString();
// Or sign and encode in one step
String encoded = tx.signAndBase64Encode(blockHash, signer);
Example: Multiple Signers
import software.sava.core.accounts.Signer;
import java.util.List;
// Create multiple signers
var signer1 = Signer.createFromKeyPair(keyPair1);
var signer2 = Signer.createFromKeyPair(keyPair2);
var signer3 = Signer.createFromKeyPair(keyPair3);
// Sign transaction with multiple signers
var signers = List.of(signer1, signer2, signer3);
tx.sign(blockHash, signers);