Verify Keypair
Learn how to verify that a private key corresponds to a specific public key address in Solana.
Code Example
#!/usr/bin/env python3
"""
Solana Cookbook - How to Verify a Keypair
"""
from solders.keypair import Keypair
from solders.pubkey import Pubkey
def main():
public_key = Pubkey.from_string("24PNhTaNtomHhoy3fTRaMhAFCRj4uHqhZEEoWrKDbR5p")
keypair_bytes = bytes(
[
174,
47,
154,
16,
202,
193,
206,
113,
199,
190,
53,
133,
169,
175,
31,
56,
222,
53,
138,
189,
224,
216,
117,
173,
10,
149,
53,
45,
73,
251,
237,
246,
15,
185,
186,
82,
177,
240,
148,
69,
241,
227,
167,
80,
141,
89,
240,
121,
121,
35,
172,
247,
68,
251,
226,
218,
48,
63,
176,
109,
168,
89,
238,
135,
]
)
signer = Keypair.from_bytes(keypair_bytes)
print(signer.pubkey() == public_key)
if __name__ == "__main__":
main()
Explanation
This example demonstrates how to verify that a private key matches a specific public key:
- Define Expected Public Key: Create a
Pubkeyobject from the expected address string - Restore Keypair: Reconstruct the keypair from the private key bytes
- Compare Public Keys: Compare the derived public key with the expected one
- Return Result: The comparison returns
Trueif they match,Falseotherwise
Key Concepts
- Keypair Verification: Confirming that a private key generates a specific public key
- Public Key Derivation: Every private key deterministically produces one public key
- Address Validation: Ensuring private keys match expected wallet addresses
- Security Verification: Confirming key integrity before use
Usage
To run this example:
-
Install required dependencies:
pip install solders -
Run the script:
python verify_keypair.py
The output will be True if the private key matches the public key, False otherwise.
Practical Applications
Wallet Verification
def verify_wallet_keypair(expected_address: str, private_key_bytes: bytes) -> bool:
"""Verify that a private key corresponds to an expected wallet address"""
try:
expected_pubkey = Pubkey.from_string(expected_address)
keypair = Keypair.from_bytes(private_key_bytes)
return keypair.pubkey() == expected_pubkey
except Exception as e:
print(f"Verification failed: {e}")
return False
Backup Verification
def verify_backup_integrity(original_pubkey: Pubkey, backup_private_key: bytes) -> bool:
"""Verify that a backup private key can restore the original keypair"""
try:
restored_keypair = Keypair.from_bytes(backup_private_key)
return restored_keypair.pubkey() == original_pubkey
except Exception:
return False
Multi-Key Verification
def verify_multiple_keypairs(key_pairs: list) -> dict:
"""Verify multiple keypair combinations"""
results = {}
for i, (address, private_key) in enumerate(key_pairs):
try:
expected_pubkey = Pubkey.from_string(address)
keypair = Keypair.from_bytes(private_key)
results[f"keypair_{i}"] = keypair.pubkey() == expected_pubkey
except Exception as e:
results[f"keypair_{i}"] = f"Error: {e}"
return results
Security Use Cases
- Wallet Import: Verify imported private keys match expected addresses
- Backup Validation: Confirm backup files contain correct private keys
- Key Migration: Ensure keys are correctly transferred between systems
- Multi-signature Setup: Verify all participant keys are correct
Error Handling
def safe_verify_keypair(public_key_str: str, private_key_bytes: bytes) -> bool:
"""Safely verify keypair with proper error handling"""
try:
public_key = Pubkey.from_string(public_key_str)
keypair = Keypair.from_bytes(private_key_bytes)
return keypair.pubkey() == public_key
except ValueError as e:
print(f"Invalid public key format: {e}")
return False
except Exception as e:
print(f"Keypair verification failed: {e}")
return False
Best Practices
- Always Verify: Verify keypairs before using them in transactions
- Handle Errors: Use try-catch blocks for robust error handling
- Validate Input: Ensure public key strings and private key bytes are valid
- Log Results: Log verification results for debugging and auditing
Note: This example uses sample keys for demonstration. In production, use your actual private keys and expected addresses.