When I started the #100DaysOfSolana challenge, I expected to learn tools and APIs. What I didn’t expect was how quickly my understanding of identity would change.
In Web2, identity = usernames + passwords stored by companies.
On Solana, identity = a cryptographic keypair that you own.
This post breaks that down with real code and what I built in my first 4 days.
🧠 Identity = Keypair (The Core Idea)
Every Solana identity is:
- Public Key → your address (shareable)
- Private Key → your authority (must be protected)
If you’ve used SSH, it’s the same model:
ssh-keygen
You generate:
-
id_rsa.pub→ public -
id_rsa→ private
👉 Solana works the same way—but the entire blockchain verifies you, not just one server.
🚀 Day 1: Creating My Identity (CLI Wallet)
solana-keygen new
solana address
solana balance
This creates a keypair stored at:
~/.config/solana/id.json
👉 Insight:
My entire identity is just a file on disk
💸 Day 2: First Transaction (Ownership in Action)
solana airdrop 1
solana transfer <RECIPIENT_ADDRESS> 0.5
👉 What’s happening under the hood:
- Transaction is signed with my private key
- Network verifies using my public key
⚙️ Day 3: Parsing a Transaction (Programmatic Identity)
I built a script using @solana/kit:
import { createSolanaRpc, devnet } from "@solana/kit";
const LAMPORTS_PER_SOL = 1_000_000_000;
const rpc = createSolanaRpc(devnet("https://api.devnet.solana.com"));
const wallet = "YOUR_PUBLIC_KEY";
const signatures = await rpc
.getSignaturesForAddress(wallet, { limit: 1 })
.send();
const signature = signatures[0].signature;
const tx = await rpc
.getTransaction(signature, {
encoding: "jsonParsed",
maxSupportedTransactionVersion: 0,
})
.send();
for (const ix of tx.transaction.message.instructions) {
if (ix.program === "system" && ix.parsed?.type === "transfer") {
const sender = ix.parsed.info.source;
const receiver = ix.parsed.info.destination;
const amount =
Number(ix.parsed.info.lamports) / LAMPORTS_PER_SOL;
console.log({ sender, receiver, amount });
}
}
👉 Insight:
Everything boils down to:
- Accounts (public keys)
- Signatures (proof of ownership)
🔐 Day 4: Wallets = UX Layer Over Identity
I explored:
- CLI wallet
- Browser wallet
- Mobile wallet
All use the same keypair—but differ in how they protect it.
🦊 Phantom Wallet Use Case (Real dApp Flow)
Here’s where it clicks.
Using a browser wallet like Phantom, you don’t create accounts—you connect your identity.
// Connect Phantom Wallet
const provider = window.solana;
if (provider?.isPhantom) {
const response = await provider.connect();
console.log("Public Key:", response.publicKey.toString());
}
👉 This gives you the same public key as your identity.
✍️ Signing a Transaction (User Approval)
const transaction = new Transaction().add(
SystemProgram.transfer({
fromPubkey: provider.publicKey,
toPubkey: RECEIVER,
lamports: 1000000,
})
);
const signedTx = await provider.signTransaction(transaction);
👉 Key difference from CLI:
- Phantom shows a popup
- User must approve before signing
💡 Why This Matters
In Web2:
- App controls your identity
- You log in
In Web3:
- You control your identity
- Apps request permission
🌐 Public Keys vs Usernames
Example Solana address:
14grJpemFaf88c8tiVb77W7TYg2W3ir6pfkKz3YjhhZ5
Unlike usernames:
- Not owned by a company
- Works across all apps
- Cannot be taken away
⚖️ Tradeoffs
| Web2 | Solana |
|---|---|
| Password reset | No recovery |
| Platform-controlled | Self-owned |
| Easy UX | Responsibility |
Lose your private key → lose everything.
💻 My Repo
I’ve been documenting everything here:
👉 https://github.com/bitanb1999/100-days-of-solana
🔥 Final Take
Identity in Web3 isn’t something you sign up for.
It’s something you generate and carry everywhere.
- Public key → who you are
- Private key → what you control
Everything else builds on that.
Top comments (1)
Imma cheat learn from your blogs 🧚