<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Vinay</title>
    <description>The latest articles on DEV Community by Vinay (@blackat).</description>
    <link>https://dev.to/blackat</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3881968%2Fd6b017fd-5606-40fa-a8ac-fdac3d3bea66.png</url>
      <title>DEV Community: Vinay</title>
      <link>https://dev.to/blackat</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/blackat"/>
    <language>en</language>
    <item>
      <title>Transfer Fees, Metadata, and Soulbound Tokens: A Tour of Solana Token Extensions</title>
      <dc:creator>Vinay</dc:creator>
      <pubDate>Sun, 24 May 2026 13:48:00 +0000</pubDate>
      <link>https://dev.to/blackat/transfer-fees-metadata-and-soulbound-tokens-a-tour-of-solana-token-extensions-41mp</link>
      <guid>https://dev.to/blackat/transfer-fees-metadata-and-soulbound-tokens-a-tour-of-solana-token-extensions-41mp</guid>
      <description>&lt;p&gt;If you are a Web2 developer and the phrase "on-chain token" sounds like something you need a PhD to build, this post is for you. I went from zero to creating tokens with metadata, transfer fees, and non-transferable locks using nothing more than CLI commands. Here is exactly how I did it and what surprised me along the way.&lt;/p&gt;

&lt;p&gt;Before starting this challenge, I had never created a token on any blockchain. I understood the basics of Solana — sending SOL, reading balances, using the CLI — but the idea of creating my own digital asset felt like advanced territory. The goal was simple: learn what Solana tokens can do by building them, one step at a time.&lt;/p&gt;




&lt;h2&gt;
  
  
  Step 1: Create a Basic Mint
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;spl-token create-token
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This creates a Mint account — the on-chain definition of your token. It stores supply, decimals, and authority. The mint holds no tokens by itself. To hold a balance you need a token account:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;spl-token create-account YOUR_MINT_ADDRESS
spl-token mint YOUR_MINT_ADDRESS 100
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The mint is the global token definition. Each token account is a wallet's balance for that specific token. In Web2 terms, the mint is your currency definition and each token account is a user's balance row. The SPL Token Program handles all the hard parts for you.&lt;/p&gt;




&lt;h2&gt;
  
  
  Step 2: Add On-Chain Metadata
&lt;/h2&gt;

&lt;p&gt;A mint address with no name is just a string. The original SPL Token Program does not support on-chain metadata. The Token Extensions Program (&lt;code&gt;TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb&lt;/code&gt;) stores metadata — name, symbol, URI — directly on the mint account, so everything is in one place instead of requiring a separate lookup:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;spl-token create-token &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--program-id&lt;/span&gt; TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--enable-metadata&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--decimals&lt;/span&gt; 6

spl-token initialize-metadata YOUR_MINT_ADDRESS &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="s2"&gt;"100DaysCoin"&lt;/span&gt; &lt;span class="s2"&gt;"HUNDO"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="s2"&gt;"https://raw.githubusercontent.com/solana-developers/opos-asset/main/assets/DeveloperPortal/metadata.json"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The &lt;code&gt;--enable-metadata&lt;/code&gt; flag activates the metadata extension at mint creation. The &lt;code&gt;initialize-metadata&lt;/code&gt; command writes the name, symbol, and URI. The URI points to a JSON file with additional details like description and image.&lt;/p&gt;




&lt;h2&gt;
  
  
  Step 3: Attach a Transfer Fee
&lt;/h2&gt;

&lt;p&gt;Instead of building middleware to collect fees on every transfer, the transfer fee extension enforces collection at the program level:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;spl-token create-token &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--program-id&lt;/span&gt; TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--transfer-fee-basis-points&lt;/span&gt; 100 &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--transfer-fee-maximum-fee&lt;/span&gt; 5000
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;100 basis points = 1%. Every transfer of this token automatically withholds 1% in the recipient's token account. The recipient cannot spend withheld tokens. Only the withdraw withheld authority (the wallet that created the mint) can collect them:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;spl-token transfer YOUR_MINT_ADDRESS 100 RECIPIENT &lt;span class="nt"&gt;--expected-fee&lt;/span&gt; 1
spl-token withdraw-withheld-tokens YOUR_ACCOUNT RECIPIENT_ACCOUNT
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The &lt;code&gt;--expected-fee&lt;/code&gt; flag is a safety check — the transfer only succeeds if the calculated fee matches what you specified. The withheld tokens accumulate in the recipient's account until the authority sweeps them out.&lt;/p&gt;




&lt;h2&gt;
  
  
  Step 4: Full Lifecycle in One Session
&lt;/h2&gt;

&lt;p&gt;Combining multiple extensions on a single mint works in one flow:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;spl-token create-token &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--program-id&lt;/span&gt; TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--transfer-fee-basis-points&lt;/span&gt; 200 &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--transfer-fee-maximum-fee&lt;/span&gt; 5000 &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--enable-metadata&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--decimals&lt;/span&gt; 9

spl-token initialize-metadata YOUR_MINT_ADDRESS &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="s2"&gt;"ReinforceCoin"&lt;/span&gt; &lt;span class="s2"&gt;"RFC"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="s2"&gt;"https://raw.githubusercontent.com/solana-developers/opos-asset/main/assets/CompressedCoil/metadata.json"&lt;/span&gt;

spl-token create-account YOUR_MINT_ADDRESS
spl-token mint YOUR_MINT_ADDRESS 1000
spl-token transfer &lt;span class="nt"&gt;--fund-recipient&lt;/span&gt; YOUR_MINT_ADDRESS 100 RECIPIENT &lt;span class="nt"&gt;--expected-fee&lt;/span&gt; 2 &lt;span class="nt"&gt;--allow-unfunded-recipient&lt;/span&gt;
spl-token withdraw-withheld-tokens YOUR_ACCOUNT RECIPIENT_ACCOUNT
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Two extensions (metadata + transfer fee) configured on the same mint. No smart contract needed.&lt;/p&gt;




&lt;h2&gt;
  
  
  Step 5: Create a Non-Transferable (Soulbound) Token
&lt;/h2&gt;

&lt;p&gt;Some tokens should never be transferred — verified badges, course certificates, KYC credentials. The non-transferable extension blocks all transfers at the protocol level:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;spl-token create-token &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--program-id&lt;/span&gt; TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--enable-non-transferable&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;After minting, attempting a transfer returns an error:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;spl-token transfer YOUR_MINT_ADDRESS 5 RECIPIENT &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--program-id&lt;/span&gt; TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--allow-unfunded-recipient&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Program log: Transfer is disabled for this mint
Program TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb failed: custom program error: 0x25
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The token program itself rejects the instruction. No client or program can override it. Burning still works — the holder can destroy tokens they own:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;spl-token burn YOUR_TOKEN_ACCOUNT 3 &lt;span class="nt"&gt;--program-id&lt;/span&gt; TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Non-transferable does not mean non-destructible. The holder controls their own account but cannot move tokens to another wallet.&lt;/p&gt;




&lt;h2&gt;
  
  
  What Surprised Me
&lt;/h2&gt;

&lt;p&gt;Two things did not work the way I expected.&lt;/p&gt;

&lt;p&gt;First, extensions must be configured when the mint is first created. You cannot add a transfer fee or metadata extension later. You have to decide how your token behaves before it exists, which is the opposite of how I would approach it in Web2.&lt;/p&gt;

&lt;p&gt;Second, the non-transferable failure was more satisfying than I expected. I ran the transfer command fully expecting tokens to move. Instead, the blockchain returned &lt;code&gt;Transfer is disabled for this mint&lt;/code&gt;. The error was clear and no flag or workaround could bypass it. That is when it clicked: this is a protocol-level lock, not a convention.&lt;/p&gt;




&lt;h2&gt;
  
  
  What's Next
&lt;/h2&gt;

&lt;p&gt;I plan to build a token with real utility — combining metadata and transfer fees into something that could serve as a community reward token. If you are following the #100DaysOfSolana challenge or exploring Solana tokens on your own, start with the basic mint, then add one extension at a time. The CLI makes it easy to experiment without writing any smart contract code.&lt;/p&gt;




&lt;h3&gt;
  
  
  Resources
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://solana.com/docs/core/tokens" rel="noopener noreferrer"&gt;Tokens on Solana&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://spl.solana.com/token-2022/extensions" rel="noopener noreferrer"&gt;Token &amp;amp; Transfer Fee Extensions Documentation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://solana.com/developers/guides/token-extensions/non-transferable" rel="noopener noreferrer"&gt;Non-Transferable Tokens Guide&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://solana.com/developers/guides/token-extensions/getting-started" rel="noopener noreferrer"&gt;SPL Token Basics&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>blockchain</category>
      <category>web3</category>
      <category>solana</category>
      <category>100daysofsolana</category>
    </item>
    <item>
      <title>🗄️Solana Accounts Are Just Files — and Programs Are Just People Who Can Read Them</title>
      <dc:creator>Vinay</dc:creator>
      <pubDate>Tue, 19 May 2026 11:43:48 +0000</pubDate>
      <link>https://dev.to/blackat/solana-accounts-are-just-files-and-programs-are-just-people-who-can-read-them-phc</link>
      <guid>https://dev.to/blackat/solana-accounts-are-just-files-and-programs-are-just-people-who-can-read-them-phc</guid>
      <description>&lt;h3&gt;
  
  
  The analogy that rewired my brain - The Filing Cabinet
&lt;/h3&gt;

&lt;p&gt;Imagine a room filled with filing cabinets. Each drawer has a random label. Inside each drawer is a folder.&lt;/p&gt;

&lt;p&gt;On the front of the folder is written:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Owner&lt;/strong&gt; — who can open and change the contents&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Executable&lt;/strong&gt; — is this a set of instructions or just data?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Data&lt;/strong&gt; — the actual contents (a number, JSON, raw bytes)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Anyone can walk up to any drawer and read the label. Only the &lt;strong&gt;Owner&lt;/strong&gt; can modify what's inside.&lt;/p&gt;

&lt;p&gt;This room is Solana. The drawers are &lt;strong&gt;accounts&lt;/strong&gt;. The folders are &lt;strong&gt;account data&lt;/strong&gt;. The owners are &lt;strong&gt;programs&lt;/strong&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  💡 What This Explains
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;There is no "users table."&lt;/strong&gt; Your wallet is a file owned by the System Program. The data inside is one number — your SOL balance. "Sending SOL" means authorizing the System Program to decrease the number in your file and increase it in someone else's.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;You can't modify every account.&lt;/strong&gt; Only the owning program can. This isn't a restriction — it's the entire security model. If anyone could modify any account, the network would be chaos. The runtime enforces ownership at the validator level, not in application code.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Programs are stateless.&lt;/strong&gt; A program is like a person who knows how to read specific file formats. The System Program reads simple balance files. The Token Program reads mint metadata and token balances. Your custom program reads whatever format you define. The program itself stores nothing — state lives in separate accounts it owns. Think of it like a web server (the program) that reads and writes to a database (data accounts) rather than keeping everything in memory.&lt;/p&gt;




&lt;h2&gt;
  
  
  📋 The Four Fields
&lt;/h2&gt;

&lt;p&gt;Every account on Solana has the same structure:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Field&lt;/th&gt;
&lt;th&gt;What it is&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Lamports&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;The SOL balance (always in lamports — 1 SOL = 1,000,000,000)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Data&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Raw bytes — file contents, whatever the owner program decides&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Owner&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;The program address that controls this account&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Executable&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Is this file a program (code) or just data?&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Here's what they look like in practice:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;solana account TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA

Public Key: TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA
Balance: 0.00028296 SOL
Owner: BPFLoaderUpgradeab1e11111111111111111111111
Executable: &lt;span class="nb"&gt;true
&lt;/span&gt;Data: &lt;span class="o"&gt;(&lt;/span&gt;compiled program bytecode&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A wallet, a token program, a sysvar — all use the same four fields. Different values. That's the entire state model.&lt;/p&gt;




&lt;h2&gt;
  
  
  💰 Rent Exemption
&lt;/h2&gt;

&lt;p&gt;Keeping a file on-chain costs storage space. Solana charges rent — a small deposit proportional to your account's data size. Deposit enough (~2 years worth) and your account is "rent-exempt" — it stays forever.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;solana rent 0     &lt;span class="c"&gt;# 0.00089088 SOL (basic account)&lt;/span&gt;
solana rent 100   &lt;span class="c"&gt;# cost for 100 bytes of data&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For a basic wallet with no extra data, it's roughly 0.00089 SOL. This deposit is refundable when you close the account. Not a bug — it's the price of storing data in a globally replicated system.&lt;/p&gt;




&lt;h2&gt;
  
  
  🔑 Three Things That Suddenly Make Sense
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;1. Ownership rules.&lt;/strong&gt; Only the owner program can modify an account's data or deduct lamports. Anyone can credit lamports to any writable account. Simple, powerful, enforced by every validator.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. PDAs.&lt;/strong&gt; Sometimes a program needs a file it controls but no private key can sign for it. Program-Derived Addresses are deterministic drawer labels — computed from program ID + seeds — that only the program can authorize. Like a combination lock where only the program knows the combination.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Composability.&lt;/strong&gt; Every file declares its owner. Anyone can read. Only the owner can write. Programs chain together: Program A reads a Token account to check your balance, then asks the System Program to move SOL. All in one atomic transaction. That's composability.&lt;/p&gt;




&lt;h2&gt;
  
  
  🎯 Why This Matters
&lt;/h2&gt;

&lt;p&gt;Before this analogy clicked, every Solana concept felt like learning a new language from scratch. After it clicked, the documentation became readable. Error messages became decipherable. I stopped asking "what is an account?" and started asking "what kind of file is this, and who owns it?"&lt;/p&gt;

&lt;p&gt;If you're coming from Web2 and struggling with Solana's account model, try the filing cabinet. You'll know it clicked when you stop thinking about tables and start thinking about drawers.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;This is the final post in a 4-part series on unlearning Web2 mental models for Solana:&lt;/em&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;em&gt;&lt;a href="https://dev.to/blackat/solana-is-a-public-spreadsheet-not-your-private-database-424h"&gt;📊 Solana Is a Public Spreadsheet — Not Your Private Database&lt;/a&gt;&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;em&gt;&lt;a href="https://dev.to/blackat/the-connect-wallet-button-replaced-my-entire-auth-system-330k"&gt;🔌 The "Connect Wallet" Button Replaced My Entire Auth System&lt;/a&gt;&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;em&gt;&lt;a href="https://dev.to/blackat/a-solana-transaction-is-a-signed-check-not-an-api-request-1p8b"&gt;✍️ A Solana Transaction Is a Signed Check — Not an API Request&lt;/a&gt;&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;em&gt;You're reading it.&lt;/em&gt;&lt;/li&gt;
&lt;/ol&gt;




&lt;p&gt;&lt;em&gt;This is a submission for the &lt;a href="https://dev.to/challenges/100-days-of-solana"&gt;100 Days of Solana Writing Challenge&lt;/a&gt;, running from &lt;strong&gt;15 May to 22 May&lt;/strong&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>100daysofsolana</category>
      <category>solana</category>
      <category>blockchain</category>
      <category>web3</category>
    </item>
    <item>
      <title>✍️ A Solana Transaction Is a Signed Check — Not an API Request</title>
      <dc:creator>Vinay</dc:creator>
      <pubDate>Tue, 19 May 2026 11:24:11 +0000</pubDate>
      <link>https://dev.to/blackat/a-solana-transaction-is-a-signed-check-not-an-api-request-1p8b</link>
      <guid>https://dev.to/blackat/a-solana-transaction-is-a-signed-check-not-an-api-request-1p8b</guid>
      <description>&lt;p&gt;&lt;em&gt;When I started writing code that sends SOL, I treated transactions like API calls. Construct a payload, POST it to the network, wait for a 200 OK. That mental model worked — until it didn't.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Then I realized: &lt;strong&gt;a Solana transaction isn't a request. It's a signed check.&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  🧠 The Analogy
&lt;/h2&gt;

&lt;p&gt;Think of writing a physical check. You fill in who gets paid and how much. You sign it. Someone deposits it. The bank processes it — either the money moves or the check bounces.&lt;/p&gt;

&lt;p&gt;A Solana transaction works the same way:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;You write the instruction&lt;/strong&gt; — "Pay 0.1 SOL from my account to this address"&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;You sign it&lt;/strong&gt; — with your private key (like signing the check)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;You submit it&lt;/strong&gt; — to the network (like depositing the check)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The network processes it&lt;/strong&gt; — atomically, all or nothing&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The check analogy breaks down in one important way though: &lt;strong&gt;in Solana, you pay the processing fee even if the check bounces.&lt;/strong&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  ⚡ The Part That Surprised Me
&lt;/h2&gt;

&lt;p&gt;I crafted a transaction sending 500 SOL from a wallet that only had 2. I disabled preflight simulation so it would reach the network. It failed, obviously. But the 5,000 lamport fee was still deducted.&lt;/p&gt;

&lt;p&gt;This is fundamentally different from Web2. A failed HTTP request costs you nothing — the server returns an error and you move on. On Solana, validators executed your instruction, ran your program, determined the outcome, and included the result in a block. That work consumed compute resources, and validators get paid regardless of the outcome.&lt;/p&gt;

&lt;p&gt;I covered the technical details — building a transfer tool with commitment tracking, polling for confirmation, forcing failures — in -&lt;/p&gt;


&lt;div class="ltag__link--embedded"&gt;
  &lt;div class="crayons-story "&gt;
  &lt;a href="https://dev.to/blackat/my-deep-dive-into-solana-transactions-shifting-the-web2-perspective-2123" class="crayons-story__hidden-navigation-link"&gt;⚓My Deep Dive into Solana Transactions: Shifting the Web2 Perspective&lt;/a&gt;


  &lt;div class="crayons-story__body crayons-story__body-full_post"&gt;
    &lt;div class="crayons-story__top"&gt;
      &lt;div class="crayons-story__meta"&gt;
        &lt;div class="crayons-story__author-pic"&gt;

          &lt;a href="/blackat" class="crayons-avatar  crayons-avatar--l  "&gt;
            &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3881968%2Fd6b017fd-5606-40fa-a8ac-fdac3d3bea66.png" alt="blackat profile" class="crayons-avatar__image"&gt;
          &lt;/a&gt;
        &lt;/div&gt;
        &lt;div&gt;
          &lt;div&gt;
            &lt;a href="/blackat" class="crayons-story__secondary fw-medium m:hidden"&gt;
              Vinay
            &lt;/a&gt;
            &lt;div class="profile-preview-card relative mb-4 s:mb-0 fw-medium hidden m:inline-block"&gt;
              
                Vinay
                
              
              &lt;div id="story-author-preview-content-3645081" class="profile-preview-card__content crayons-dropdown branded-7 p-4 pt-0"&gt;
                &lt;div class="gap-4 grid"&gt;
                  &lt;div class="-mt-4"&gt;
                    &lt;a href="/blackat" class="flex"&gt;
                      &lt;span class="crayons-avatar crayons-avatar--xl mr-2 shrink-0"&gt;
                        &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3881968%2Fd6b017fd-5606-40fa-a8ac-fdac3d3bea66.png" class="crayons-avatar__image" alt=""&gt;
                      &lt;/span&gt;
                      &lt;span class="crayons-link crayons-subtitle-2 mt-5"&gt;Vinay&lt;/span&gt;
                    &lt;/a&gt;
                  &lt;/div&gt;
                  &lt;div class="print-hidden"&gt;
                    
                      Follow
                    
                  &lt;/div&gt;
                  &lt;div class="author-preview-metadata-container"&gt;&lt;/div&gt;
                &lt;/div&gt;
              &lt;/div&gt;
            &lt;/div&gt;

          &lt;/div&gt;
          &lt;a href="https://dev.to/blackat/my-deep-dive-into-solana-transactions-shifting-the-web2-perspective-2123" class="crayons-story__tertiary fs-xs"&gt;&lt;time&gt;May 10&lt;/time&gt;&lt;span class="time-ago-indicator-initial-placeholder"&gt;&lt;/span&gt;&lt;/a&gt;
        &lt;/div&gt;
      &lt;/div&gt;

    &lt;/div&gt;

    &lt;div class="crayons-story__indention"&gt;
      &lt;h2 class="crayons-story__title crayons-story__title-full_post"&gt;
        &lt;a href="https://dev.to/blackat/my-deep-dive-into-solana-transactions-shifting-the-web2-perspective-2123" id="article-link-3645081"&gt;
          ⚓My Deep Dive into Solana Transactions: Shifting the Web2 Perspective
        &lt;/a&gt;
      &lt;/h2&gt;
        &lt;div class="crayons-story__tags"&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/100daysofsolana"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;100daysofsolana&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/web3"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;web3&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/blockchain"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;blockchain&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/solana"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;solana&lt;/a&gt;
        &lt;/div&gt;
      &lt;div class="crayons-story__bottom"&gt;
        &lt;div class="crayons-story__details"&gt;
          &lt;a href="https://dev.to/blackat/my-deep-dive-into-solana-transactions-shifting-the-web2-perspective-2123" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left"&gt;
            &lt;div class="multiple_reactions_aggregate"&gt;
              &lt;span class="multiple_reactions_icons_container"&gt;
                  &lt;span class="crayons_icon_container"&gt;
                    &lt;img src="https://assets.dev.to/assets/multi-unicorn-b44d6f8c23cdd00964192bedc38af3e82463978aa611b4365bd33a0f1f4f3e97.svg" width="18" height="18"&gt;
                  &lt;/span&gt;
                  &lt;span class="crayons_icon_container"&gt;
                    &lt;img src="https://assets.dev.to/assets/sparkle-heart-5f9bee3767e18deb1bb725290cb151c25234768a0e9a2bd39370c382d02920cf.svg" width="18" height="18"&gt;
                  &lt;/span&gt;
                  &lt;span class="crayons_icon_container"&gt;
                    &lt;img src="https://assets.dev.to/assets/raised-hands-74b2099fd66a39f2d7eed9305ee0f4553df0eb7b4f11b01b6b1b499973048fe5.svg" width="18" height="18"&gt;
                  &lt;/span&gt;
              &lt;/span&gt;
              &lt;span class="aggregate_reactions_counter"&gt;6&lt;span class="hidden s:inline"&gt; reactions&lt;/span&gt;&lt;/span&gt;
            &lt;/div&gt;
          &lt;/a&gt;
            &lt;a href="https://dev.to/blackat/my-deep-dive-into-solana-transactions-shifting-the-web2-perspective-2123#comments" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left flex items-center"&gt;
              Comments


              1&lt;span class="hidden s:inline"&gt; comment&lt;/span&gt;
            &lt;/a&gt;
        &lt;/div&gt;
        &lt;div class="crayons-story__save"&gt;
          &lt;small class="crayons-story__tertiary fs-xs mr-2"&gt;
            2 min read
          &lt;/small&gt;
            
              &lt;span class="bm-initial"&gt;
                

              &lt;/span&gt;
              &lt;span class="bm-success"&gt;
                

              &lt;/span&gt;
            
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;


&lt;p&gt;But the economic lesson is what stuck with me:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Every transaction is an economic event.&lt;/strong&gt; It consumes network resources. It has a cost. You pay for execution, not just success.&lt;/p&gt;




&lt;h2&gt;
  
  
  ⚙️ What This Changes
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Simulate before you send.&lt;/strong&gt; The &lt;code&gt;skipPreflight&lt;/code&gt; flag exists for edge cases, not everyday development. Most failures can be caught locally — insufficient balance, wrong account ownership, expired blockhash. Check everything before you submit.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Failed transactions are learning tools.&lt;/strong&gt; The program logs in a failed tx show you exactly where execution stopped, how much compute was consumed, and what error the program returned. I've learned more from forced failures than from successful transfers.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Atomicity is built in, not bolted on.&lt;/strong&gt; If a transaction has three instructions and instruction 2 fails, instructions 1 and 3 are rolled back too. The fee is still charged. In Web2, you'd write try/catch blocks and compensation logic. On Solana, the runtime guarantees atomicity — but you pay either way.&lt;/p&gt;




&lt;p&gt;I wrote about the transaction anatomy -&lt;br&gt;
&lt;/p&gt;
&lt;div class="ltag__link--embedded"&gt;
  &lt;div class="crayons-story "&gt;
  &lt;a href="https://dev.to/blackat/understanding-solanas-transaction-anatomy-52j0" class="crayons-story__hidden-navigation-link"&gt;Understanding Solana's transaction anatomy&lt;/a&gt;


  &lt;div class="crayons-story__body crayons-story__body-full_post"&gt;
    &lt;div class="crayons-story__top"&gt;
      &lt;div class="crayons-story__meta"&gt;
        &lt;div class="crayons-story__author-pic"&gt;

          &lt;a href="/blackat" class="crayons-avatar  crayons-avatar--l  "&gt;
            &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3881968%2Fd6b017fd-5606-40fa-a8ac-fdac3d3bea66.png" alt="blackat profile" class="crayons-avatar__image"&gt;
          &lt;/a&gt;
        &lt;/div&gt;
        &lt;div&gt;
          &lt;div&gt;
            &lt;a href="/blackat" class="crayons-story__secondary fw-medium m:hidden"&gt;
              Vinay
            &lt;/a&gt;
            &lt;div class="profile-preview-card relative mb-4 s:mb-0 fw-medium hidden m:inline-block"&gt;
              
                Vinay
                
              
              &lt;div id="story-author-preview-content-3620611" class="profile-preview-card__content crayons-dropdown branded-7 p-4 pt-0"&gt;
                &lt;div class="gap-4 grid"&gt;
                  &lt;div class="-mt-4"&gt;
                    &lt;a href="/blackat" class="flex"&gt;
                      &lt;span class="crayons-avatar crayons-avatar--xl mr-2 shrink-0"&gt;
                        &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3881968%2Fd6b017fd-5606-40fa-a8ac-fdac3d3bea66.png" class="crayons-avatar__image" alt=""&gt;
                      &lt;/span&gt;
                      &lt;span class="crayons-link crayons-subtitle-2 mt-5"&gt;Vinay&lt;/span&gt;
                    &lt;/a&gt;
                  &lt;/div&gt;
                  &lt;div class="print-hidden"&gt;
                    
                      Follow
                    
                  &lt;/div&gt;
                  &lt;div class="author-preview-metadata-container"&gt;&lt;/div&gt;
                &lt;/div&gt;
              &lt;/div&gt;
            &lt;/div&gt;

          &lt;/div&gt;
          &lt;a href="https://dev.to/blackat/understanding-solanas-transaction-anatomy-52j0" class="crayons-story__tertiary fs-xs"&gt;&lt;time&gt;May 6&lt;/time&gt;&lt;span class="time-ago-indicator-initial-placeholder"&gt;&lt;/span&gt;&lt;/a&gt;
        &lt;/div&gt;
      &lt;/div&gt;

    &lt;/div&gt;

    &lt;div class="crayons-story__indention"&gt;
      &lt;h2 class="crayons-story__title crayons-story__title-full_post"&gt;
        &lt;a href="https://dev.to/blackat/understanding-solanas-transaction-anatomy-52j0" id="article-link-3620611"&gt;
          Understanding Solana's transaction anatomy
        &lt;/a&gt;
      &lt;/h2&gt;
        &lt;div class="crayons-story__tags"&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/100daysofsolana"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;100daysofsolana&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/web3"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;web3&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/blockchain"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;blockchain&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/solana"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;solana&lt;/a&gt;
        &lt;/div&gt;
      &lt;div class="crayons-story__bottom"&gt;
        &lt;div class="crayons-story__details"&gt;
          &lt;a href="https://dev.to/blackat/understanding-solanas-transaction-anatomy-52j0" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left"&gt;
            &lt;div class="multiple_reactions_aggregate"&gt;
              &lt;span class="multiple_reactions_icons_container"&gt;
                  &lt;span class="crayons_icon_container"&gt;
                    &lt;img src="https://assets.dev.to/assets/multi-unicorn-b44d6f8c23cdd00964192bedc38af3e82463978aa611b4365bd33a0f1f4f3e97.svg" width="18" height="18"&gt;
                  &lt;/span&gt;
                  &lt;span class="crayons_icon_container"&gt;
                    &lt;img src="https://assets.dev.to/assets/sparkle-heart-5f9bee3767e18deb1bb725290cb151c25234768a0e9a2bd39370c382d02920cf.svg" width="18" height="18"&gt;
                  &lt;/span&gt;
                  &lt;span class="crayons_icon_container"&gt;
                    &lt;img src="https://assets.dev.to/assets/exploding-head-daceb38d627e6ae9b730f36a1e390fca556a4289d5a41abb2c35068ad3e2c4b5.svg" width="18" height="18"&gt;
                  &lt;/span&gt;
              &lt;/span&gt;
              &lt;span class="aggregate_reactions_counter"&gt;6&lt;span class="hidden s:inline"&gt; reactions&lt;/span&gt;&lt;/span&gt;
            &lt;/div&gt;
          &lt;/a&gt;
            &lt;a href="https://dev.to/blackat/understanding-solanas-transaction-anatomy-52j0#comments" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left flex items-center"&gt;
              Comments


              &lt;span class="hidden s:inline"&gt;Add Comment&lt;/span&gt;
            &lt;/a&gt;
        &lt;/div&gt;
        &lt;div class="crayons-story__save"&gt;
          &lt;small class="crayons-story__tertiary fs-xs mr-2"&gt;
            2 min read
          &lt;/small&gt;
            
              &lt;span class="bm-initial"&gt;
                

              &lt;/span&gt;
              &lt;span class="bm-success"&gt;
                

              &lt;/span&gt;
            
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;
&lt;br&gt;
 — signatures, blockhashes, account keys, compiled instructions — and walked through a CLI transfer - &lt;br&gt;
&lt;div class="ltag__link--embedded"&gt;
  &lt;div class="crayons-story "&gt;
  &lt;a href="https://dev.to/blackat/sending-your-first-sol-transfer-devnet-via-cli-1gdi" class="crayons-story__hidden-navigation-link"&gt;Sending Your First SOL Transfer (Devnet, via CLI)&lt;/a&gt;


  &lt;div class="crayons-story__body crayons-story__body-full_post"&gt;
    &lt;div class="crayons-story__top"&gt;
      &lt;div class="crayons-story__meta"&gt;
        &lt;div class="crayons-story__author-pic"&gt;

          &lt;a href="/blackat" class="crayons-avatar  crayons-avatar--l  "&gt;
            &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3881968%2Fd6b017fd-5606-40fa-a8ac-fdac3d3bea66.png" alt="blackat profile" class="crayons-avatar__image"&gt;
          &lt;/a&gt;
        &lt;/div&gt;
        &lt;div&gt;
          &lt;div&gt;
            &lt;a href="/blackat" class="crayons-story__secondary fw-medium m:hidden"&gt;
              Vinay
            &lt;/a&gt;
            &lt;div class="profile-preview-card relative mb-4 s:mb-0 fw-medium hidden m:inline-block"&gt;
              
                Vinay
                
              
              &lt;div id="story-author-preview-content-3620076" class="profile-preview-card__content crayons-dropdown branded-7 p-4 pt-0"&gt;
                &lt;div class="gap-4 grid"&gt;
                  &lt;div class="-mt-4"&gt;
                    &lt;a href="/blackat" class="flex"&gt;
                      &lt;span class="crayons-avatar crayons-avatar--xl mr-2 shrink-0"&gt;
                        &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3881968%2Fd6b017fd-5606-40fa-a8ac-fdac3d3bea66.png" class="crayons-avatar__image" alt=""&gt;
                      &lt;/span&gt;
                      &lt;span class="crayons-link crayons-subtitle-2 mt-5"&gt;Vinay&lt;/span&gt;
                    &lt;/a&gt;
                  &lt;/div&gt;
                  &lt;div class="print-hidden"&gt;
                    
                      Follow
                    
                  &lt;/div&gt;
                  &lt;div class="author-preview-metadata-container"&gt;&lt;/div&gt;
                &lt;/div&gt;
              &lt;/div&gt;
            &lt;/div&gt;

          &lt;/div&gt;
          &lt;a href="https://dev.to/blackat/sending-your-first-sol-transfer-devnet-via-cli-1gdi" class="crayons-story__tertiary fs-xs"&gt;&lt;time&gt;May 6&lt;/time&gt;&lt;span class="time-ago-indicator-initial-placeholder"&gt;&lt;/span&gt;&lt;/a&gt;
        &lt;/div&gt;
      &lt;/div&gt;

    &lt;/div&gt;

    &lt;div class="crayons-story__indention"&gt;
      &lt;h2 class="crayons-story__title crayons-story__title-full_post"&gt;
        &lt;a href="https://dev.to/blackat/sending-your-first-sol-transfer-devnet-via-cli-1gdi" id="article-link-3620076"&gt;
          Sending Your First SOL Transfer (Devnet, via CLI)
        &lt;/a&gt;
      &lt;/h2&gt;
        &lt;div class="crayons-story__tags"&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/100daysofsolana"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;100daysofsolana&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/web3"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;web3&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/blockchain"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;blockchain&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/solana"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;solana&lt;/a&gt;
        &lt;/div&gt;
      &lt;div class="crayons-story__bottom"&gt;
        &lt;div class="crayons-story__details"&gt;
          &lt;a href="https://dev.to/blackat/sending-your-first-sol-transfer-devnet-via-cli-1gdi" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left"&gt;
            &lt;div class="multiple_reactions_aggregate"&gt;
              &lt;span class="multiple_reactions_icons_container"&gt;
                  &lt;span class="crayons_icon_container"&gt;
                    &lt;img src="https://assets.dev.to/assets/multi-unicorn-b44d6f8c23cdd00964192bedc38af3e82463978aa611b4365bd33a0f1f4f3e97.svg" width="18" height="18"&gt;
                  &lt;/span&gt;
                  &lt;span class="crayons_icon_container"&gt;
                    &lt;img src="https://assets.dev.to/assets/fire-f60e7a582391810302117f987b22a8ef04a2fe0df7e3258a5f49332df1cec71e.svg" width="18" height="18"&gt;
                  &lt;/span&gt;
                  &lt;span class="crayons_icon_container"&gt;
                    &lt;img src="https://assets.dev.to/assets/sparkle-heart-5f9bee3767e18deb1bb725290cb151c25234768a0e9a2bd39370c382d02920cf.svg" width="18" height="18"&gt;
                  &lt;/span&gt;
              &lt;/span&gt;
              &lt;span class="aggregate_reactions_counter"&gt;7&lt;span class="hidden s:inline"&gt; reactions&lt;/span&gt;&lt;/span&gt;
            &lt;/div&gt;
          &lt;/a&gt;
            &lt;a href="https://dev.to/blackat/sending-your-first-sol-transfer-devnet-via-cli-1gdi#comments" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left flex items-center"&gt;
              Comments


              &lt;span class="hidden s:inline"&gt;Add Comment&lt;/span&gt;
            &lt;/a&gt;
        &lt;/div&gt;
        &lt;div class="crayons-story__save"&gt;
          &lt;small class="crayons-story__tertiary fs-xs mr-2"&gt;
            3 min read
          &lt;/small&gt;
            
              &lt;span class="bm-initial"&gt;
                

              &lt;/span&gt;
              &lt;span class="bm-success"&gt;
                

              &lt;/span&gt;
            
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;


&lt;p&gt;step by step in earlier posts. But the mental model upgrade is simpler than any of those details:&lt;/p&gt;

&lt;p&gt;Don't think of a transaction as a request you send. Think of it as a check you sign.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Next: &lt;a href="https://dev.to/blackat/solana-accounts-are-just-files-and-programs-are-just-people-who-can-read-them-phc"&gt;The Filing Cabinet — why Solana accounts are just files and programs are just people who can read them.&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;




&lt;p&gt;&lt;em&gt;This is a submission for the &lt;a href="https://dev.to/challenges/100-days-of-solana"&gt;100 Days of Solana Writing Challenge&lt;/a&gt;, running from &lt;strong&gt;15 May to 22 May&lt;/strong&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>100daysofsolana</category>
      <category>solana</category>
      <category>blockchain</category>
      <category>web3</category>
    </item>
    <item>
      <title>🔌 The "Connect Wallet" Button Replaced My Entire Auth System</title>
      <dc:creator>Vinay</dc:creator>
      <pubDate>Tue, 19 May 2026 11:13:42 +0000</pubDate>
      <link>https://dev.to/blackat/the-connect-wallet-button-replaced-my-entire-auth-system-330k</link>
      <guid>https://dev.to/blackat/the-connect-wallet-button-replaced-my-entire-auth-system-330k</guid>
      <description>&lt;p&gt;&lt;em&gt;Here's something I didn't expect when I started building on Solana: &lt;strong&gt;I never wrote a signup form.&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;No username field. No password validation. No "confirm your email" flow. No "forgot password" page. Every piece of auth infrastructure I'd built dozens of times in Web2 — gone.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;In its place: one button. "Connect Wallet."&lt;/p&gt;




&lt;h2&gt;
  
  
  🧠 What a Wallet Actually Does
&lt;/h2&gt;

&lt;p&gt;If you're new to Solana, I wrote about the conceptual shift — from usernames to keypairs — in a previous post -&lt;br&gt;
&lt;/p&gt;
&lt;div class="ltag__link--embedded"&gt;
  &lt;div class="crayons-story "&gt;
  &lt;a href="https://dev.to/blackat/from-usernames-to-keypairs-understanding-identity-on-solana-472p" class="crayons-story__hidden-navigation-link"&gt;🔑 From Usernames to Keypairs: Understanding Identity on Solana&lt;/a&gt;


  &lt;div class="crayons-story__body crayons-story__body-full_post"&gt;
    &lt;div class="crayons-story__top"&gt;
      &lt;div class="crayons-story__meta"&gt;
        &lt;div class="crayons-story__author-pic"&gt;

          &lt;a href="/blackat" class="crayons-avatar  crayons-avatar--l  "&gt;
            &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3881968%2Fd6b017fd-5606-40fa-a8ac-fdac3d3bea66.png" alt="blackat profile" class="crayons-avatar__image"&gt;
          &lt;/a&gt;
        &lt;/div&gt;
        &lt;div&gt;
          &lt;div&gt;
            &lt;a href="/blackat" class="crayons-story__secondary fw-medium m:hidden"&gt;
              Vinay
            &lt;/a&gt;
            &lt;div class="profile-preview-card relative mb-4 s:mb-0 fw-medium hidden m:inline-block"&gt;
              
                Vinay
                
              
              &lt;div id="story-author-preview-content-3549409" class="profile-preview-card__content crayons-dropdown branded-7 p-4 pt-0"&gt;
                &lt;div class="gap-4 grid"&gt;
                  &lt;div class="-mt-4"&gt;
                    &lt;a href="/blackat" class="flex"&gt;
                      &lt;span class="crayons-avatar crayons-avatar--xl mr-2 shrink-0"&gt;
                        &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3881968%2Fd6b017fd-5606-40fa-a8ac-fdac3d3bea66.png" class="crayons-avatar__image" alt=""&gt;
                      &lt;/span&gt;
                      &lt;span class="crayons-link crayons-subtitle-2 mt-5"&gt;Vinay&lt;/span&gt;
                    &lt;/a&gt;
                  &lt;/div&gt;
                  &lt;div class="print-hidden"&gt;
                    
                      Follow
                    
                  &lt;/div&gt;
                  &lt;div class="author-preview-metadata-container"&gt;&lt;/div&gt;
                &lt;/div&gt;
              &lt;/div&gt;
            &lt;/div&gt;

          &lt;/div&gt;
          &lt;a href="https://dev.to/blackat/from-usernames-to-keypairs-understanding-identity-on-solana-472p" class="crayons-story__tertiary fs-xs"&gt;&lt;time&gt;Apr 25&lt;/time&gt;&lt;span class="time-ago-indicator-initial-placeholder"&gt;&lt;/span&gt;&lt;/a&gt;
        &lt;/div&gt;
      &lt;/div&gt;

    &lt;/div&gt;

    &lt;div class="crayons-story__indention"&gt;
      &lt;h2 class="crayons-story__title crayons-story__title-full_post"&gt;
        &lt;a href="https://dev.to/blackat/from-usernames-to-keypairs-understanding-identity-on-solana-472p" id="article-link-3549409"&gt;
          🔑 From Usernames to Keypairs: Understanding Identity on Solana
        &lt;/a&gt;
      &lt;/h2&gt;
        &lt;div class="crayons-story__tags"&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/100daysofsolana"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;100daysofsolana&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/solana"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;solana&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/web3"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;web3&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/blockchain"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;blockchain&lt;/a&gt;
        &lt;/div&gt;
      &lt;div class="crayons-story__bottom"&gt;
        &lt;div class="crayons-story__details"&gt;
          &lt;a href="https://dev.to/blackat/from-usernames-to-keypairs-understanding-identity-on-solana-472p" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left"&gt;
            &lt;div class="multiple_reactions_aggregate"&gt;
              &lt;span class="multiple_reactions_icons_container"&gt;
                  &lt;span class="crayons_icon_container"&gt;
                    &lt;img src="https://assets.dev.to/assets/exploding-head-daceb38d627e6ae9b730f36a1e390fca556a4289d5a41abb2c35068ad3e2c4b5.svg" width="18" height="18"&gt;
                  &lt;/span&gt;
                  &lt;span class="crayons_icon_container"&gt;
                    &lt;img src="https://assets.dev.to/assets/multi-unicorn-b44d6f8c23cdd00964192bedc38af3e82463978aa611b4365bd33a0f1f4f3e97.svg" width="18" height="18"&gt;
                  &lt;/span&gt;
                  &lt;span class="crayons_icon_container"&gt;
                    &lt;img src="https://assets.dev.to/assets/sparkle-heart-5f9bee3767e18deb1bb725290cb151c25234768a0e9a2bd39370c382d02920cf.svg" width="18" height="18"&gt;
                  &lt;/span&gt;
              &lt;/span&gt;
              &lt;span class="aggregate_reactions_counter"&gt;6&lt;span class="hidden s:inline"&gt; reactions&lt;/span&gt;&lt;/span&gt;
            &lt;/div&gt;
          &lt;/a&gt;
            &lt;a href="https://dev.to/blackat/from-usernames-to-keypairs-understanding-identity-on-solana-472p#comments" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left flex items-center"&gt;
              Comments


              &lt;span class="hidden s:inline"&gt;Add Comment&lt;/span&gt;
            &lt;/a&gt;
        &lt;/div&gt;
        &lt;div class="crayons-story__save"&gt;
          &lt;small class="crayons-story__tertiary fs-xs mr-2"&gt;
            2 min read
          &lt;/small&gt;
            
              &lt;span class="bm-initial"&gt;
                

              &lt;/span&gt;
              &lt;span class="bm-success"&gt;
                

              &lt;/span&gt;
            
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;
&lt;br&gt;
The short version: your identity is a cryptographic keypair, not a database row.

&lt;p&gt;But for a developer, the practical implication matters more than the theory. Here's what changes:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;You don't manage authentication.&lt;/strong&gt; The wallet does. When a user clicks "Connect Wallet," their browser extension (Phantom, Solflare, etc.) pops up a confirmation. They approve. Your app gets their public key. You never see the private key. You never store a password hash. You never issue a session token.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;You don't build onboarding flows.&lt;/strong&gt; In Web2, every step of signup is a drop-off point. Email entry, email verification, profile setup, terms acceptance. On Solana, the user already has an identity before they visit your app. Your job is just to detect it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;"Logging in" is just signing a message.&lt;/strong&gt; Your app sends a message, the wallet signs it, you verify the signature on your backend. No session cookie. No JWT. The signature is the proof.&lt;/p&gt;


&lt;h2&gt;
  
  
  ⚠️ What You Lose
&lt;/h2&gt;

&lt;p&gt;This isn't strictly better. There are tradeoffs:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;No password reset.&lt;/strong&gt; If a user loses their private key, they lose access. There's no admin tool to restore their account.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;No account recovery.&lt;/strong&gt; In Web2, you can email a reset link. On Solana, the keypair is the only identity. Lose it, and everything associated with that address — tokens, NFTs, program state — is inaccessible.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;No gradual onboarding.&lt;/strong&gt; In Web2, you can let users browse before requiring login. On Solana, the user's address is their identity from the first interaction. There's no "anonymous session" that converts to a registered account later.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I covered the technical details of keypair generation and storage — why &lt;code&gt;extractable: true&lt;/code&gt; matters, how PKCS8 works — in another post -&lt;/p&gt;


&lt;div class="ltag__link--embedded"&gt;
  &lt;div class="crayons-story "&gt;
  &lt;a href="https://dev.to/blackat/why-my-solana-wallet-broke-without-extractable-true-and-what-pkcs8-taught-me-about-private-keys-20kp" class="crayons-story__hidden-navigation-link"&gt;Why My Solana Wallet Broke Without "extractable: true" — And What PKCS8 Taught Me About Private Keys&lt;/a&gt;


  &lt;div class="crayons-story__body crayons-story__body-full_post"&gt;
    &lt;div class="crayons-story__top"&gt;
      &lt;div class="crayons-story__meta"&gt;
        &lt;div class="crayons-story__author-pic"&gt;

          &lt;a href="/blackat" class="crayons-avatar  crayons-avatar--l  "&gt;
            &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3881968%2Fd6b017fd-5606-40fa-a8ac-fdac3d3bea66.png" alt="blackat profile" class="crayons-avatar__image"&gt;
          &lt;/a&gt;
        &lt;/div&gt;
        &lt;div&gt;
          &lt;div&gt;
            &lt;a href="/blackat" class="crayons-story__secondary fw-medium m:hidden"&gt;
              Vinay
            &lt;/a&gt;
            &lt;div class="profile-preview-card relative mb-4 s:mb-0 fw-medium hidden m:inline-block"&gt;
              
                Vinay
                
              
              &lt;div id="story-author-preview-content-3556539" class="profile-preview-card__content crayons-dropdown branded-7 p-4 pt-0"&gt;
                &lt;div class="gap-4 grid"&gt;
                  &lt;div class="-mt-4"&gt;
                    &lt;a href="/blackat" class="flex"&gt;
                      &lt;span class="crayons-avatar crayons-avatar--xl mr-2 shrink-0"&gt;
                        &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3881968%2Fd6b017fd-5606-40fa-a8ac-fdac3d3bea66.png" class="crayons-avatar__image" alt=""&gt;
                      &lt;/span&gt;
                      &lt;span class="crayons-link crayons-subtitle-2 mt-5"&gt;Vinay&lt;/span&gt;
                    &lt;/a&gt;
                  &lt;/div&gt;
                  &lt;div class="print-hidden"&gt;
                    
                      Follow
                    
                  &lt;/div&gt;
                  &lt;div class="author-preview-metadata-container"&gt;&lt;/div&gt;
                &lt;/div&gt;
              &lt;/div&gt;
            &lt;/div&gt;

          &lt;/div&gt;
          &lt;a href="https://dev.to/blackat/why-my-solana-wallet-broke-without-extractable-true-and-what-pkcs8-taught-me-about-private-keys-20kp" class="crayons-story__tertiary fs-xs"&gt;&lt;time&gt;Apr 27&lt;/time&gt;&lt;span class="time-ago-indicator-initial-placeholder"&gt;&lt;/span&gt;&lt;/a&gt;
        &lt;/div&gt;
      &lt;/div&gt;

    &lt;/div&gt;

    &lt;div class="crayons-story__indention"&gt;
      &lt;h2 class="crayons-story__title crayons-story__title-full_post"&gt;
        &lt;a href="https://dev.to/blackat/why-my-solana-wallet-broke-without-extractable-true-and-what-pkcs8-taught-me-about-private-keys-20kp" id="article-link-3556539"&gt;
          Why My Solana Wallet Broke Without "extractable: true" — And What PKCS8 Taught Me About Private Keys
        &lt;/a&gt;
      &lt;/h2&gt;
        &lt;div class="crayons-story__tags"&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/100daysofsolana"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;100daysofsolana&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/web3"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;web3&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/blockchain"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;blockchain&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/solana"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;solana&lt;/a&gt;
        &lt;/div&gt;
      &lt;div class="crayons-story__bottom"&gt;
        &lt;div class="crayons-story__details"&gt;
          &lt;a href="https://dev.to/blackat/why-my-solana-wallet-broke-without-extractable-true-and-what-pkcs8-taught-me-about-private-keys-20kp" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left"&gt;
            &lt;div class="multiple_reactions_aggregate"&gt;
              &lt;span class="multiple_reactions_icons_container"&gt;
                  &lt;span class="crayons_icon_container"&gt;
                    &lt;img src="https://assets.dev.to/assets/exploding-head-daceb38d627e6ae9b730f36a1e390fca556a4289d5a41abb2c35068ad3e2c4b5.svg" width="18" height="18"&gt;
                  &lt;/span&gt;
                  &lt;span class="crayons_icon_container"&gt;
                    &lt;img src="https://assets.dev.to/assets/multi-unicorn-b44d6f8c23cdd00964192bedc38af3e82463978aa611b4365bd33a0f1f4f3e97.svg" width="18" height="18"&gt;
                  &lt;/span&gt;
                  &lt;span class="crayons_icon_container"&gt;
                    &lt;img src="https://assets.dev.to/assets/sparkle-heart-5f9bee3767e18deb1bb725290cb151c25234768a0e9a2bd39370c382d02920cf.svg" width="18" height="18"&gt;
                  &lt;/span&gt;
              &lt;/span&gt;
              &lt;span class="aggregate_reactions_counter"&gt;6&lt;span class="hidden s:inline"&gt; reactions&lt;/span&gt;&lt;/span&gt;
            &lt;/div&gt;
          &lt;/a&gt;
            &lt;a href="https://dev.to/blackat/why-my-solana-wallet-broke-without-extractable-true-and-what-pkcs8-taught-me-about-private-keys-20kp#comments" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left flex items-center"&gt;
              Comments


              &lt;span class="hidden s:inline"&gt;Add Comment&lt;/span&gt;
            &lt;/a&gt;
        &lt;/div&gt;
        &lt;div class="crayons-story__save"&gt;
          &lt;small class="crayons-story__tertiary fs-xs mr-2"&gt;
            2 min read
          &lt;/small&gt;
            
              &lt;span class="bm-initial"&gt;
                

              &lt;/span&gt;
              &lt;span class="bm-success"&gt;
                

              &lt;/span&gt;
            
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;


&lt;p&gt;But the developer workflow shift is what I had to actually rebuild in my head.&lt;/p&gt;




&lt;h2&gt;
  
  
  💻 The Code Difference
&lt;/h2&gt;

&lt;p&gt;In Web2, auth looks like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Signup&lt;/span&gt;
&lt;span class="nx"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;post&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;/signup&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;async &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;hash&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;bcrypt&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;hash&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;body&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;password&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;db&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;users&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;create&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;email&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;body&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;email&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;passwordHash&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;hash&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;
  &lt;span class="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;session&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;userId&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;user&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="c1"&gt;// Login&lt;/span&gt;
&lt;span class="nx"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;post&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;/login&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;async &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;user&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;db&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;users&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;findByEmail&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;body&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;email&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;user&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;bcrypt&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;compare&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;body&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;password&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;user&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;passwordHash&lt;/span&gt;&lt;span class="p"&gt;)))&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;status&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;401&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;send&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Invalid credentials&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;session&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;userId&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;user&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;On Solana, auth looks like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Connect wallet (browser side)&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;accounts&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;wallet&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;features&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;standard:connect&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nf"&gt;connect&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;userAddress&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;accounts&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nx"&gt;address&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="c1"&gt;// That's it. The user is now "authenticated."&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;No password hashing. No session management. No database lookups. The wallet handles the cryptographic proof. Your app just reads the public key.&lt;/p&gt;




&lt;h2&gt;
  
  
  🎯 Why This Matters
&lt;/h2&gt;

&lt;p&gt;The "Connect Wallet" pattern isn't just a UI trend. It represents a fundamental shift in how identity works. In Web2, you build auth into your app. In Solana, auth is infrastructure — it lives in the wallet, not in your codebase.&lt;/p&gt;

&lt;p&gt;That means as a developer, you don't need to worry about password storage, session hijacking, or email verification. But you also can't rely on support tickets or account recovery when something goes wrong.&lt;/p&gt;

&lt;p&gt;Once I understood this tradeoff — less code, more responsibility — the "Connect Wallet" button stopped looking like a simplification and started looking like a completely different approach to identity.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Next: &lt;a href="https://dev.to/blackat/a-solana-transaction-is-a-signed-check-not-an-api-request-1p8b"&gt;Transactions aren't HTTP requests. They're signed checks — and failed ones still cost you.&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;




&lt;p&gt;&lt;em&gt;This is a submission for the &lt;a href="https://dev.to/challenges/100-days-of-solana"&gt;100 Days of Solana Writing Challenge&lt;/a&gt;, running from &lt;strong&gt;15 May to 22 May&lt;/strong&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>100daysofsolana</category>
      <category>solana</category>
      <category>blockchain</category>
      <category>web3</category>
    </item>
    <item>
      <title>📊Solana Is a Public Spreadsheet — Not Your Private Database</title>
      <dc:creator>Vinay</dc:creator>
      <pubDate>Tue, 19 May 2026 10:56:17 +0000</pubDate>
      <link>https://dev.to/blackat/solana-is-a-public-spreadsheet-not-your-private-database-424h</link>
      <guid>https://dev.to/blackat/solana-is-a-public-spreadsheet-not-your-private-database-424h</guid>
      <description>&lt;p&gt;&lt;em&gt;If you're coming from Web2, here's the first mental model you need to rewrite: &lt;strong&gt;Solana is not a database you control. It's a public spreadsheet that everyone can see and no one fully owns.&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  🧠 The Analogy
&lt;/h2&gt;

&lt;p&gt;Think of a &lt;strong&gt;Google Sheet&lt;/strong&gt; shared with the entire internet. Anyone can open it and read any cell. But only specific people (programs) have permission to edit specific rows.&lt;/p&gt;

&lt;p&gt;Your wallet is a row in that sheet. The columns are:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Lamports&lt;/strong&gt; — your SOL balance&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Data&lt;/strong&gt; — any extra info attached to your row&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Owner&lt;/strong&gt; — which program is allowed to edit this row&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Anyone can look up your row. Only the owner program can change it. And the owner program can only make changes when you prove you're you — by signing with your private key.&lt;/p&gt;

&lt;p&gt;In Web2, your database has a wall around it. Users authenticate with passwords, and your server decides who sees what. On Solana, there's no wall. The security comes from &lt;strong&gt;cryptographic signatures&lt;/strong&gt;, not login gates.&lt;/p&gt;




&lt;h2&gt;
  
  
  ⚙️ What This Changes
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;You can't hide data.&lt;/strong&gt; Every balance, every transaction, every interaction with any program is publicly visible forever. If you're building on Solana, don't store private info in account data. It's not private.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;There's no "backend" to build.&lt;/strong&gt; You don't need to design a database schema, set up authentication middleware, or deploy an API server. Solana is the backend. Your program (smart contract) defines the rules, and users interact with it directly through transactions.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Ownership is enforced by the network, not your code.&lt;/strong&gt; In Web2, you write &lt;code&gt;if (user.isAdmin)&lt;/code&gt; checks to control access. On Solana, the runtime itself prevents unauthorized writes. If your program doesn't own an account, it simply cannot modify it — no matter what your code tries to do.&lt;/p&gt;




&lt;h2&gt;
  
  
  🔥 The Hardest Adjustment
&lt;/h2&gt;

&lt;p&gt;The first time I queried someone else's wallet balance, I felt like I was doing something wrong. Coming from web development, I never once displayed another user's financial data without permission. But on Solana, that's not just allowed — it's the entire point.&lt;/p&gt;

&lt;p&gt;Transparency isn't a design flaw. It's the feature that makes everything else possible. Composability, auditability, trustlessness — all of it starts with the fact that every piece of state is public.&lt;/p&gt;

&lt;p&gt;Once I stopped thinking of Solana as "someone else's database I'm borrowing" and started seeing it as "a shared public spreadsheet," the rest of the model started clicking.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Next: &lt;a href="https://dev.to/blackat/the-connect-wallet-button-replaced-my-entire-auth-system-330k"&gt;The "Connect Wallet" button replaced my entire auth system.&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;




&lt;p&gt;&lt;em&gt;This is a submission for the &lt;a href="https://dev.to/challenges/100-days-of-solana"&gt;100 Days of Solana Writing Challenge&lt;/a&gt;, running from &lt;strong&gt;15 May to 22 May&lt;/strong&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>100daysofsolana</category>
      <category>web3</category>
      <category>blockchain</category>
      <category>solana</category>
    </item>
    <item>
      <title>⚓My Deep Dive into Solana Transactions: Shifting the Web2 Perspective</title>
      <dc:creator>Vinay</dc:creator>
      <pubDate>Sun, 10 May 2026 15:14:24 +0000</pubDate>
      <link>https://dev.to/blackat/my-deep-dive-into-solana-transactions-shifting-the-web2-perspective-2123</link>
      <guid>https://dev.to/blackat/my-deep-dive-into-solana-transactions-shifting-the-web2-perspective-2123</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Over the last few days, I’ve been learning how Solana transactions actually work. At first, I approached them like I would approach API requests in Web2: you send something to the network, wait for a response, and either it succeeds or fails.&lt;/em&gt;&lt;br&gt;
&lt;em&gt;But after building transfer tools, tracking confirmations, and intentionally forcing failed transactions, I realized Solana transactions are much closer to atomic state transitions in a distributed system than traditional request/response workflows.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;




&lt;p&gt;&lt;strong&gt;🏗️ The Foundation&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Before this post, I documented two earlier parts of the journey:&lt;/p&gt;


&lt;div class="ltag__link--embedded"&gt;
  &lt;div class="crayons-story "&gt;
  &lt;a href="https://dev.to/blackat/sending-your-first-sol-transfer-devnet-via-cli-1gdi" class="crayons-story__hidden-navigation-link"&gt;Sending Your First SOL Transfer (Devnet, via CLI)&lt;/a&gt;


  &lt;div class="crayons-story__body crayons-story__body-full_post"&gt;
    &lt;div class="crayons-story__top"&gt;
      &lt;div class="crayons-story__meta"&gt;
        &lt;div class="crayons-story__author-pic"&gt;

          &lt;a href="/blackat" class="crayons-avatar  crayons-avatar--l  "&gt;
            &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3881968%2Fd6b017fd-5606-40fa-a8ac-fdac3d3bea66.png" alt="blackat profile" class="crayons-avatar__image"&gt;
          &lt;/a&gt;
        &lt;/div&gt;
        &lt;div&gt;
          &lt;div&gt;
            &lt;a href="/blackat" class="crayons-story__secondary fw-medium m:hidden"&gt;
              Vinay
            &lt;/a&gt;
            &lt;div class="profile-preview-card relative mb-4 s:mb-0 fw-medium hidden m:inline-block"&gt;
              
                Vinay
                
              
              &lt;div id="story-author-preview-content-3620076" class="profile-preview-card__content crayons-dropdown branded-7 p-4 pt-0"&gt;
                &lt;div class="gap-4 grid"&gt;
                  &lt;div class="-mt-4"&gt;
                    &lt;a href="/blackat" class="flex"&gt;
                      &lt;span class="crayons-avatar crayons-avatar--xl mr-2 shrink-0"&gt;
                        &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3881968%2Fd6b017fd-5606-40fa-a8ac-fdac3d3bea66.png" class="crayons-avatar__image" alt=""&gt;
                      &lt;/span&gt;
                      &lt;span class="crayons-link crayons-subtitle-2 mt-5"&gt;Vinay&lt;/span&gt;
                    &lt;/a&gt;
                  &lt;/div&gt;
                  &lt;div class="print-hidden"&gt;
                    
                      Follow
                    
                  &lt;/div&gt;
                  &lt;div class="author-preview-metadata-container"&gt;&lt;/div&gt;
                &lt;/div&gt;
              &lt;/div&gt;
            &lt;/div&gt;

          &lt;/div&gt;
          &lt;a href="https://dev.to/blackat/sending-your-first-sol-transfer-devnet-via-cli-1gdi" class="crayons-story__tertiary fs-xs"&gt;&lt;time&gt;May 6&lt;/time&gt;&lt;span class="time-ago-indicator-initial-placeholder"&gt;&lt;/span&gt;&lt;/a&gt;
        &lt;/div&gt;
      &lt;/div&gt;

    &lt;/div&gt;

    &lt;div class="crayons-story__indention"&gt;
      &lt;h2 class="crayons-story__title crayons-story__title-full_post"&gt;
        &lt;a href="https://dev.to/blackat/sending-your-first-sol-transfer-devnet-via-cli-1gdi" id="article-link-3620076"&gt;
          Sending Your First SOL Transfer (Devnet, via CLI)
        &lt;/a&gt;
      &lt;/h2&gt;
        &lt;div class="crayons-story__tags"&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/100daysofsolana"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;100daysofsolana&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/web3"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;web3&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/blockchain"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;blockchain&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/solana"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;solana&lt;/a&gt;
        &lt;/div&gt;
      &lt;div class="crayons-story__bottom"&gt;
        &lt;div class="crayons-story__details"&gt;
          &lt;a href="https://dev.to/blackat/sending-your-first-sol-transfer-devnet-via-cli-1gdi" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left"&gt;
            &lt;div class="multiple_reactions_aggregate"&gt;
              &lt;span class="multiple_reactions_icons_container"&gt;
                  &lt;span class="crayons_icon_container"&gt;
                    &lt;img src="https://assets.dev.to/assets/multi-unicorn-b44d6f8c23cdd00964192bedc38af3e82463978aa611b4365bd33a0f1f4f3e97.svg" width="18" height="18"&gt;
                  &lt;/span&gt;
                  &lt;span class="crayons_icon_container"&gt;
                    &lt;img src="https://assets.dev.to/assets/fire-f60e7a582391810302117f987b22a8ef04a2fe0df7e3258a5f49332df1cec71e.svg" width="18" height="18"&gt;
                  &lt;/span&gt;
                  &lt;span class="crayons_icon_container"&gt;
                    &lt;img src="https://assets.dev.to/assets/sparkle-heart-5f9bee3767e18deb1bb725290cb151c25234768a0e9a2bd39370c382d02920cf.svg" width="18" height="18"&gt;
                  &lt;/span&gt;
              &lt;/span&gt;
              &lt;span class="aggregate_reactions_counter"&gt;7&lt;span class="hidden s:inline"&gt; reactions&lt;/span&gt;&lt;/span&gt;
            &lt;/div&gt;
          &lt;/a&gt;
            &lt;a href="https://dev.to/blackat/sending-your-first-sol-transfer-devnet-via-cli-1gdi#comments" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left flex items-center"&gt;
              Comments


              &lt;span class="hidden s:inline"&gt;Add Comment&lt;/span&gt;
            &lt;/a&gt;
        &lt;/div&gt;
        &lt;div class="crayons-story__save"&gt;
          &lt;small class="crayons-story__tertiary fs-xs mr-2"&gt;
            3 min read
          &lt;/small&gt;
            
              &lt;span class="bm-initial"&gt;
                

              &lt;/span&gt;
              &lt;span class="bm-success"&gt;
                

              &lt;/span&gt;
            
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;



&lt;div class="ltag__link--embedded"&gt;
  &lt;div class="crayons-story "&gt;
  &lt;a href="https://dev.to/blackat/understanding-solanas-transaction-anatomy-52j0" class="crayons-story__hidden-navigation-link"&gt;Understanding Solana's transaction anatomy&lt;/a&gt;


  &lt;div class="crayons-story__body crayons-story__body-full_post"&gt;
    &lt;div class="crayons-story__top"&gt;
      &lt;div class="crayons-story__meta"&gt;
        &lt;div class="crayons-story__author-pic"&gt;

          &lt;a href="/blackat" class="crayons-avatar  crayons-avatar--l  "&gt;
            &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3881968%2Fd6b017fd-5606-40fa-a8ac-fdac3d3bea66.png" alt="blackat profile" class="crayons-avatar__image"&gt;
          &lt;/a&gt;
        &lt;/div&gt;
        &lt;div&gt;
          &lt;div&gt;
            &lt;a href="/blackat" class="crayons-story__secondary fw-medium m:hidden"&gt;
              Vinay
            &lt;/a&gt;
            &lt;div class="profile-preview-card relative mb-4 s:mb-0 fw-medium hidden m:inline-block"&gt;
              
                Vinay
                
              
              &lt;div id="story-author-preview-content-3620611" class="profile-preview-card__content crayons-dropdown branded-7 p-4 pt-0"&gt;
                &lt;div class="gap-4 grid"&gt;
                  &lt;div class="-mt-4"&gt;
                    &lt;a href="/blackat" class="flex"&gt;
                      &lt;span class="crayons-avatar crayons-avatar--xl mr-2 shrink-0"&gt;
                        &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3881968%2Fd6b017fd-5606-40fa-a8ac-fdac3d3bea66.png" class="crayons-avatar__image" alt=""&gt;
                      &lt;/span&gt;
                      &lt;span class="crayons-link crayons-subtitle-2 mt-5"&gt;Vinay&lt;/span&gt;
                    &lt;/a&gt;
                  &lt;/div&gt;
                  &lt;div class="print-hidden"&gt;
                    
                      Follow
                    
                  &lt;/div&gt;
                  &lt;div class="author-preview-metadata-container"&gt;&lt;/div&gt;
                &lt;/div&gt;
              &lt;/div&gt;
            &lt;/div&gt;

          &lt;/div&gt;
          &lt;a href="https://dev.to/blackat/understanding-solanas-transaction-anatomy-52j0" class="crayons-story__tertiary fs-xs"&gt;&lt;time&gt;May 6&lt;/time&gt;&lt;span class="time-ago-indicator-initial-placeholder"&gt;&lt;/span&gt;&lt;/a&gt;
        &lt;/div&gt;
      &lt;/div&gt;

    &lt;/div&gt;

    &lt;div class="crayons-story__indention"&gt;
      &lt;h2 class="crayons-story__title crayons-story__title-full_post"&gt;
        &lt;a href="https://dev.to/blackat/understanding-solanas-transaction-anatomy-52j0" id="article-link-3620611"&gt;
          Understanding Solana's transaction anatomy
        &lt;/a&gt;
      &lt;/h2&gt;
        &lt;div class="crayons-story__tags"&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/100daysofsolana"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;100daysofsolana&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/web3"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;web3&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/blockchain"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;blockchain&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/solana"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;solana&lt;/a&gt;
        &lt;/div&gt;
      &lt;div class="crayons-story__bottom"&gt;
        &lt;div class="crayons-story__details"&gt;
          &lt;a href="https://dev.to/blackat/understanding-solanas-transaction-anatomy-52j0" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left"&gt;
            &lt;div class="multiple_reactions_aggregate"&gt;
              &lt;span class="multiple_reactions_icons_container"&gt;
                  &lt;span class="crayons_icon_container"&gt;
                    &lt;img src="https://assets.dev.to/assets/multi-unicorn-b44d6f8c23cdd00964192bedc38af3e82463978aa611b4365bd33a0f1f4f3e97.svg" width="18" height="18"&gt;
                  &lt;/span&gt;
                  &lt;span class="crayons_icon_container"&gt;
                    &lt;img src="https://assets.dev.to/assets/sparkle-heart-5f9bee3767e18deb1bb725290cb151c25234768a0e9a2bd39370c382d02920cf.svg" width="18" height="18"&gt;
                  &lt;/span&gt;
                  &lt;span class="crayons_icon_container"&gt;
                    &lt;img src="https://assets.dev.to/assets/exploding-head-daceb38d627e6ae9b730f36a1e390fca556a4289d5a41abb2c35068ad3e2c4b5.svg" width="18" height="18"&gt;
                  &lt;/span&gt;
              &lt;/span&gt;
              &lt;span class="aggregate_reactions_counter"&gt;6&lt;span class="hidden s:inline"&gt; reactions&lt;/span&gt;&lt;/span&gt;
            &lt;/div&gt;
          &lt;/a&gt;
            &lt;a href="https://dev.to/blackat/understanding-solanas-transaction-anatomy-52j0#comments" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left flex items-center"&gt;
              Comments


              &lt;span class="hidden s:inline"&gt;Add Comment&lt;/span&gt;
            &lt;/a&gt;
        &lt;/div&gt;
        &lt;div class="crayons-story__save"&gt;
          &lt;small class="crayons-story__tertiary fs-xs mr-2"&gt;
            2 min read
          &lt;/small&gt;
            
              &lt;span class="bm-initial"&gt;
                

              &lt;/span&gt;
              &lt;span class="bm-success"&gt;
                

              &lt;/span&gt;
            
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;


&lt;p&gt;Those experiments helped me understand the structure underneath every transaction before I started building tooling around them.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;🔍 Deconstructing the Transaction Anatomy&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;The first thing that stood out to me was how much information exists inside a transaction. Once I started inspecting transactions in Solana Explorer and using solana confirm -v, I stopped seeing transfers as simple wallet operations.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;A single transaction includes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Signatures&lt;/li&gt;
&lt;li&gt;Instructions&lt;/li&gt;
&lt;li&gt;Account keys&lt;/li&gt;
&lt;li&gt;Recent blockhashes&lt;/li&gt;
&lt;li&gt;Fee payer information&lt;/li&gt;
&lt;li&gt;Execution logs&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;🧠The Mental Model Shift:&lt;/strong&gt;&lt;br&gt;
A Solana transaction is not just a request. It’s a signed set of instructions that tells the network how on-chain state should change.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;p&gt;&lt;strong&gt;🛠️ Building the Tooling&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;After getting comfortable with CLI transfers, I built a reusable transfer tool instead of manually typing commands every time.&lt;/p&gt;

&lt;p&gt;The tool eventually handled:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Recipient and amount validation&lt;/li&gt;
&lt;li&gt;Balance checks before sending&lt;/li&gt;
&lt;li&gt;Explorer link generation&lt;/li&gt;
&lt;li&gt;Confirmation tracking&lt;/li&gt;
&lt;li&gt;Transaction failure handling&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The balance checks were especially interesting because failed transactions on Solana still cost fees. That’s very different from most backend systems I’m used to. In Web2, failed requests are usually just errors. On Solana, even failed execution still consumes validator compute resources.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;⛓️ Understanding the Lifecycle of Confirmation&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;One of the most useful things I learned was how confirmation actually works. At first, I thought transactions were either pending or complete.&lt;/p&gt;

&lt;p&gt;But Solana has multiple commitment levels:&lt;/p&gt;

&lt;blockquote&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Processed:&lt;/strong&gt; Received by a validator.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Confirmed:&lt;/strong&gt; Voted on by the network supermajority.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Finalized:&lt;/strong&gt; Effectively irreversible after additional confirmed blocks.&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;

&lt;p&gt;Watching transactions move through those stages made the network feel much more real. Instead of treating blockchain confirmation like a black box, I could actually observe the lifecycle happening in real time.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;⚠️ Learning Through Failure&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The most valuable part of the process, though, was intentionally breaking transactions.&lt;/p&gt;

&lt;p&gt;I created empty wallets. I forced failed transfers. I inspected logs and Explorer traces. I compared local CLI validation with actual on-chain failures. That ended up teaching me more than successful transactions did.&lt;/p&gt;

&lt;p&gt;Seeing compute usage, log messages, and failure metadata made the debugging side of Solana feel surprisingly similar to debugging distributed backend systems—except here, every mistake has an economic cost attached to it.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;🧠 Key Takeaways&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The biggest takeaway from this journey is that understanding transactions is really about understanding how Solana itself thinks.&lt;/p&gt;

&lt;p&gt;Once I stopped comparing transactions directly to REST API calls, concepts like signatures, blockhash expiration, commitment levels, and transaction simulation started making much more sense. Intentionally exploring failed transactions was the point where everything finally clicked for me.&lt;/p&gt;

</description>
      <category>100daysofsolana</category>
      <category>web3</category>
      <category>blockchain</category>
      <category>solana</category>
    </item>
    <item>
      <title>Understanding Solana's transaction anatomy</title>
      <dc:creator>Vinay</dc:creator>
      <pubDate>Wed, 06 May 2026 11:23:11 +0000</pubDate>
      <link>https://dev.to/blackat/understanding-solanas-transaction-anatomy-52j0</link>
      <guid>https://dev.to/blackat/understanding-solanas-transaction-anatomy-52j0</guid>
      <description>&lt;h2&gt;
  
  
  📖 Overview
&lt;/h2&gt;

&lt;p&gt;&lt;em&gt;For the past week, I’ve been reading data from the Solana blockchain. This project marks the shift from reading state to writing state. The goal was simple but fundamental: understand what actually happens when a transaction is sent on Solana.&lt;/em&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  🎯 Objective
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;ul&gt;
&lt;li&gt;Send a real transaction on Solana Devnet&lt;/li&gt;
&lt;li&gt;Inspect it using CLI and Explorer&lt;/li&gt;
&lt;li&gt;Understand its internal structure&lt;/li&gt;
&lt;li&gt;Build a mental model for how state changes occur&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  ⚙️ What I Did
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;1. Created a Temporary Wallet&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Generated a fresh keypair to act as the recipient.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;solana-keygen new &lt;span class="nt"&gt;--no-bip39-passphrase&lt;/span&gt; &lt;span class="nt"&gt;-o&lt;/span&gt; /tmp/temp-wallet.json
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This generated a transaction signature, which acts as:&lt;/p&gt;

&lt;blockquote&gt;
&lt;ul&gt;
&lt;li&gt;A receipt&lt;/li&gt;
&lt;li&gt;The transaction ID&lt;/li&gt;
&lt;li&gt;The first cryptographic signature&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;Example:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgvxem9boky25ph5hjatr.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgvxem9boky25ph5hjatr.png" alt="Step 1 - Creating temp wallet" width="731" height="176"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;2. Sent a Transaction&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;solana transfer &lt;span class="nt"&gt;--allow-unfunded-recipient&lt;/span&gt; &lt;span class="si"&gt;$(&lt;/span&gt;solana address &lt;span class="nt"&gt;-k&lt;/span&gt; /tmp/temp-wallet.json&lt;span class="si"&gt;)&lt;/span&gt; 0.001 &lt;span class="nt"&gt;--url&lt;/span&gt; devnet
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Transferred a small amount of SOL on Devnet.&lt;br&gt;
This produced a transaction signature (ID).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Example:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fedvlzvabb22snljrrfgc.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fedvlzvabb22snljrrfgc.png" alt="Step 2 - Sending Transaction" width="800" height="48"&gt;&lt;/a&gt;&lt;/p&gt;



&lt;p&gt;&lt;strong&gt;3. Inspected the Transaction via CLI&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;solana confirm &lt;span class="nt"&gt;-v&lt;/span&gt; &amp;lt;TRANSACTION_SIGNATURE&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This revealed:&lt;/p&gt;

&lt;blockquote&gt;
&lt;ul&gt;
&lt;li&gt;Transaction status and slot&lt;/li&gt;
&lt;li&gt;Accounts involved&lt;/li&gt;
&lt;li&gt;Instruction execution details&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;Example:&lt;/strong&gt;&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fi6amrckr0kfx0i00j6bo.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fi6amrckr0kfx0i00j6bo.png" alt="Step 3 - Inspecting transaction" width="800" height="407"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;4. Analyzed in Explorer&lt;/strong&gt;&lt;br&gt;
Visualized It in Solana Explorer&lt;/p&gt;

&lt;p&gt;Using the transaction signature, I examined:&lt;/p&gt;

&lt;blockquote&gt;
&lt;ul&gt;
&lt;li&gt;Signatures → Authorization proof&lt;/li&gt;
&lt;li&gt;Recent Blockhash → Freshness + anti-replay
&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fcvl8jg4tx53peeb9ypne.png" alt="Transaction details" width="800" height="572"&gt;
&lt;/li&gt;
&lt;li&gt;Account Keys → All accounts involved
&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8brfzhbn4268ax82dzcz.png" alt="Account Keys" width="800" height="237"&gt;
&lt;/li&gt;
&lt;li&gt;Instruction → System Program transfer&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F44ixvlld59wuk0eyxec4.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F44ixvlld59wuk0eyxec4.png" alt="Program Instruction" width="800" height="532"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  🧠Mental Model Upgrade
&lt;/h2&gt;

&lt;p&gt;What you sent is not:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“Send 0.001 SOL to X”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;It is:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“Execute instruction #2 of the System Program, using these accounts, with this encoded data, authorized by this signature.”&lt;/p&gt;
&lt;/blockquote&gt;

</description>
      <category>100daysofsolana</category>
      <category>web3</category>
      <category>blockchain</category>
      <category>solana</category>
    </item>
    <item>
      <title>Sending Your First SOL Transfer (Devnet, via CLI)</title>
      <dc:creator>Vinay</dc:creator>
      <pubDate>Wed, 06 May 2026 09:43:38 +0000</pubDate>
      <link>https://dev.to/blackat/sending-your-first-sol-transfer-devnet-via-cli-1gdi</link>
      <guid>https://dev.to/blackat/sending-your-first-sol-transfer-devnet-via-cli-1gdi</guid>
      <description>&lt;p&gt;&lt;em&gt;This walkthrough focuses on executing a SOL transfer using the Solana CLI - while understanding the underlying mechanics at each step. If you’ve used payment APIs like Stripe or PayPal, the flow is conceptually similar: authenticate, define recipient, specify amount, submit. The difference is architectural, transactions go directly to the network and finalize in sub-seconds, without intermediaries.&lt;/em&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Environment Requirements
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;ul&gt;
&lt;li&gt;Terminal (macOS, Linux, or Windows WSL)&lt;/li&gt;
&lt;li&gt;Solana CLI installed&lt;/li&gt;
&lt;li&gt;A keypair (existing or newly generated)&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  1. Configure CLI to Devnet
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;solana config &lt;span class="nb"&gt;set&lt;/span&gt; &lt;span class="nt"&gt;-ud&lt;/span&gt;
solana config get
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Key point:&lt;/strong&gt;&lt;br&gt;
You are selecting the cluster (network). Devnet is a sandbox environment with no real economic cost. The RPC endpoint (&lt;a href="https://api.devnet.solana.com" rel="noopener noreferrer"&gt;https://api.devnet.solana.com&lt;/a&gt;) acts as your interface to the validator network.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why it matters:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;All subsequent commands - balance queries, transfers, account creation are executed against this network.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Example:&lt;/strong&gt;&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Flfoqdxqlxdkayorizdok.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Flfoqdxqlxdkayorizdok.png" alt="Step 1 - Configure wallet" width="520" height="281"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  2. Check Balance and Fund Wallet
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;solana balance
solana airdrop 2
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Key point:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Transactions require:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Sufficient balance for the transfer amount&lt;/li&gt;
&lt;li&gt;A small fee for network processing&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Airdrop behavior:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Devnet validators mint SOL for testing&lt;/li&gt;
&lt;li&gt;Requests are capped (typically 5 SOL)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;If airdrop fails:&lt;/strong&gt;&lt;br&gt;
You can fund your wallet using the &lt;a href="https://faucet.solana.com/" rel="noopener noreferrer"&gt;Solana Faucet&lt;/a&gt; as an alternative.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why it matters:&lt;/strong&gt;&lt;br&gt;
Without sufficient balance, the transaction cannot be constructed or submitted.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Example:&lt;/strong&gt;&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fa27s0ead5kcpy02rsypu.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fa27s0ead5kcpy02rsypu.png" alt="Step 2 - Check Balance" width="288" height="47"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  3. Generate a Recipient Keypair
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;solana-keygen new &lt;span class="nt"&gt;--outfile&lt;/span&gt; ~/recipient-keypair.json &lt;span class="nt"&gt;--no-bip39-passphrase&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Key point:&lt;/strong&gt;&lt;br&gt;
You are creating a cryptographic identity:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Private key → signs transactions&lt;br&gt;
Public key → acts as the address&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;Important nuance:&lt;/strong&gt;&lt;br&gt;
This account does not yet exist on-chain - it becomes a real account only after being funded.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why it matters:&lt;/strong&gt;&lt;br&gt;
Solana distinguishes between:&lt;/p&gt;

&lt;blockquote&gt;
&lt;ul&gt;
&lt;li&gt;Off-chain keypairs (identity)&lt;/li&gt;
&lt;li&gt;On-chain accounts (state containers)&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;Example:&lt;/strong&gt;&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F135n4ulry0lxckrfm5ln.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F135n4ulry0lxckrfm5ln.png" alt="Step 3 - Generate keypair" width="800" height="175"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  4. Execute the Transfer
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;solana transfer &amp;lt;RECIPIENT_PUBLIC_KEY&amp;gt; 0.5 &lt;span class="nt"&gt;--allow-unfunded-recipient&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Key point:&lt;/strong&gt;&lt;br&gt;
This command:&lt;/p&gt;

&lt;blockquote&gt;
&lt;ul&gt;
&lt;li&gt;Constructs a transaction with a System Program transfer instruction&lt;/li&gt;
&lt;li&gt;Signs it with your private key&lt;/li&gt;
&lt;li&gt;Submits it to a validator via RPC&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;Flag explanation:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;--allow-unfunded-recipient&lt;/code&gt; allows the network to create the recipient account implicitly&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why it matters:&lt;/strong&gt;&lt;br&gt;
On Solana, accounts must be explicitly created and funded. This step combines:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Account creation&lt;/li&gt;
&lt;li&gt;Value transfer into a single atomic transaction.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Example:&lt;/strong&gt;&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fnxp29f1kgcco1cof5wd2.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fnxp29f1kgcco1cof5wd2.png" alt="Step 4 - Execute the transfer" width="800" height="57"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  5. Verify State Changes
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;solana balance
solana balance &amp;lt;RECIPIENT_PUBLIC_KEY&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Key point:&lt;/strong&gt;&lt;br&gt;
You are querying on-chain state post-finalization.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Expected outcome:&lt;/strong&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;ul&gt;
&lt;li&gt;Sender balance decreases (transfer + fee)&lt;/li&gt;
&lt;li&gt;Recipient balance increases&lt;/li&gt;
&lt;li&gt;Recipient account now exists on-chain&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;Why it matters:&lt;/strong&gt;&lt;br&gt;
This confirms the transaction was validated, executed, and finalized by the network.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Example:&lt;/strong&gt;&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffuvp4hztks1pjnt6f1e4.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffuvp4hztks1pjnt6f1e4.png" alt="Step 5 - Verify change in balance" width="704" height="85"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  6. Inspect the Transaction
&lt;/h2&gt;

&lt;p&gt;Open your transaction using the signature in &lt;a href="https://explorer.solana.com/?cluster=devnet" rel="noopener noreferrer"&gt;Solana Explorer&lt;/a&gt;:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Key point:&lt;/strong&gt;&lt;br&gt;
You are viewing the transaction as recorded in the ledger.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Details include:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Accounts involved&lt;/li&gt;
&lt;li&gt;Instruction data&lt;/li&gt;
&lt;li&gt;Fees&lt;/li&gt;
&lt;li&gt;Slot (block inclusion)&lt;/li&gt;
&lt;li&gt;Confirmation status&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Why it matters:&lt;/strong&gt;&lt;br&gt;
The explorer reflects canonical on-chain data - this is the definitive record of execution.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Example:&lt;/strong&gt;&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fpek3e18rdpph7wbhpemz.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fpek3e18rdpph7wbhpemz.png" alt="Step 6.1 - Transaction (Solana explorer)" width="800" height="404"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F422rdavbvyaj1d426qf6.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F422rdavbvyaj1d426qf6.png" alt="Step 6.2 - Account inputs (Solana explorer)" width="800" height="233"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmoqlwbki22hx67n487bj.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmoqlwbki22hx67n487bj.png" alt="Step 6.3 - Program instruction (Solana explorer)" width="800" height="326"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="https://explorer.solana.com/tx/4N6S15YdQ4UgNLQkiqk2MUTRoUEKrYkJPuJxZ2xp28aUsxXB7XzX91KJ6gHQeVid5f5gbAS2EoLcFGtnS933XNss?cluster=devnet" rel="noopener noreferrer"&gt;View above transaction in solana explorer&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Full Command Flow
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;solana config &lt;span class="nb"&gt;set&lt;/span&gt; &lt;span class="nt"&gt;-ud&lt;/span&gt;
solana airdrop 2
solana-keygen new &lt;span class="nt"&gt;--outfile&lt;/span&gt; ~/recipient-keypair.json &lt;span class="nt"&gt;--no-bip39-passphrase&lt;/span&gt;
solana transfer &amp;lt;RECIPIENT_PUBLIC_KEY&amp;gt; 0.5 &lt;span class="nt"&gt;--allow-unfunded-recipient&lt;/span&gt;
solana balance
solana balance &amp;lt;RECIPIENT_PUBLIC_KEY&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  What This Demonstrates
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;ul&gt;
&lt;li&gt;Direct transaction submission to a decentralized validator network&lt;/li&gt;
&lt;li&gt;Atomic state transitions (account creation + transfer)&lt;/li&gt;
&lt;li&gt;Explicit account model requiring funding for existence&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;

&lt;p&gt;At a systems level, you:&lt;/p&gt;

&lt;blockquote&gt;
&lt;ul&gt;
&lt;li&gt;Defined network context (devnet RPC)&lt;/li&gt;
&lt;li&gt;Generated identities&lt;/li&gt;
&lt;li&gt;Authored and signed a transaction&lt;/li&gt;
&lt;li&gt;Submitted it to the network&lt;/li&gt;
&lt;li&gt;Observed deterministic state changes&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;

&lt;p&gt;This is the foundational workflow for interacting with Solana.&lt;/p&gt;

</description>
      <category>100daysofsolana</category>
      <category>web3</category>
      <category>blockchain</category>
      <category>solana</category>
    </item>
    <item>
      <title>A few early takeaways from learning Solana</title>
      <dc:creator>Vinay</dc:creator>
      <pubDate>Sun, 03 May 2026 17:42:17 +0000</pubDate>
      <link>https://dev.to/blackat/a-few-early-takeaways-from-learning-solana-14o7</link>
      <guid>https://dev.to/blackat/a-few-early-takeaways-from-learning-solana-14o7</guid>
      <description>&lt;h2&gt;
  
  
  I’ve been exploring Solana for the past few days and a few things stood out pretty quickly
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;No traditional database everything revolves around accounts&lt;br&gt;
Reads happen through RPC calls not queries&lt;br&gt;
Writes are transactions not simple updates&lt;br&gt;
Access control is handled by signatures not roles or middleware&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The biggest shift so far has been adjusting to the accounts model. Coming from a typical backend mindset it forces you to think differently about how data is stored who owns it and how state changes over time&lt;/p&gt;

&lt;p&gt;I also built a small dashboard in the browser to fetch wallet balance and recent transactions. Moving from scripts to something visual made the flow of data much clearer&lt;/p&gt;

&lt;p&gt;Had a session with Solana DevRel as well where we discussed Anchor validators and PDAs. That helped connect some of the concepts around how programs actually manage data on chain&lt;/p&gt;

&lt;p&gt;Still early but things are starting to click. Planning to go deeper into Anchor and understand how to structure programs better&lt;/p&gt;

</description>
      <category>100daysofsolana</category>
    </item>
    <item>
      <title>Two weeks with Solana - Personal experience</title>
      <dc:creator>Vinay</dc:creator>
      <pubDate>Sun, 03 May 2026 17:18:05 +0000</pubDate>
      <link>https://dev.to/blackat/two-weeks-with-solana-personal-experience-2ea4</link>
      <guid>https://dev.to/blackat/two-weeks-with-solana-personal-experience-2ea4</guid>
      <description>&lt;p&gt;Been spending the last ~10 days getting hands-on with Solana as part of a hackathon. Went in expecting things to feel completely different from what I’m used to.&lt;/p&gt;

&lt;p&gt;It wasn’t as far off as I thought.&lt;/p&gt;

&lt;p&gt;What I’ve Done So Far&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Generated a keypair + airdropped devnet SOL&lt;/li&gt;
&lt;li&gt;Created a wallet and checked balance programmatically&lt;/li&gt;
&lt;li&gt;Understood SOL vs lamports&lt;/li&gt;
&lt;li&gt;Connected a browser wallet&lt;/li&gt;
&lt;li&gt;Read on-chain data (accounts, transactions)&lt;/li&gt;
&lt;li&gt;Fetched recent transactions&lt;/li&gt;
&lt;li&gt;Built a small browser dashboard&lt;/li&gt;
&lt;li&gt;Compared devnet vs mainnet data&lt;/li&gt;
&lt;li&gt;Tried mapping accounts vs traditional databases&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What Took a Bit to Understand
&lt;/h2&gt;

&lt;p&gt;Fetching data wasn’t the hard part - it’s pretty similar to calling APIs.&lt;/p&gt;

&lt;p&gt;The shift was in how things are structured:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Accounts aren’t users, they’re just data containers&lt;br&gt;
There’s no backend I control&lt;br&gt;
Data is public, transactions update state&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The point where it clicked was pulling transaction history for a wallet and realizing there’s no access layer in between. You just query it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Building in the Browser
&lt;/h2&gt;

&lt;p&gt;Moving from scripts to a simple dashboard helped a lot.&lt;/p&gt;

&lt;p&gt;Showing balances, listing transactions, switching networks - it made things feel more real than just running CLI scripts.&lt;/p&gt;

&lt;h2&gt;
  
  
  MLH Session
&lt;/h2&gt;

&lt;p&gt;Also attended an MLH session with Brianna (Solana Developer Relations). where she briefed on:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Anchor Framework&lt;/li&gt;
&lt;li&gt;Validators&lt;/li&gt;
&lt;li&gt;PDAs&lt;/li&gt;
&lt;li&gt;Program structure on Solana&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I haven’t used these hands-on yet, but it gave me a better picture of what’s happening under the hood.&lt;/p&gt;

&lt;h2&gt;
  
  
  Still Figuring Out
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;Program design&lt;br&gt;
Handling storage (accounts + rent)&lt;br&gt;
Better ways to query data beyond basic RPC&lt;/p&gt;
&lt;/blockquote&gt;

</description>
      <category>100daysofsolana</category>
      <category>web3</category>
      <category>blockchain</category>
      <category>solana</category>
    </item>
    <item>
      <title>Why My Solana Wallet Broke Without "extractable: true" — And What PKCS8 Taught Me About Private Keys</title>
      <dc:creator>Vinay</dc:creator>
      <pubDate>Mon, 27 Apr 2026 09:34:20 +0000</pubDate>
      <link>https://dev.to/blackat/why-my-solana-wallet-broke-without-extractable-true-and-what-pkcs8-taught-me-about-private-keys-20kp</link>
      <guid>https://dev.to/blackat/why-my-solana-wallet-broke-without-extractable-true-and-what-pkcs8-taught-me-about-private-keys-20kp</guid>
      <description>&lt;p&gt;Last week, I built a small Solana wallet script where I could create, export, save, and reload a keypair.&lt;/p&gt;

&lt;p&gt;Here's the link of the script for reference: &lt;a href="https://github.com/bl4ck4t/solana_dev/blob/main/src/persistent-wallet.mjs" rel="noopener noreferrer"&gt;Github&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;It all started with this line:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;wallet&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;generateKeyPairSigner&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;extractable&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;When I tried exporting the private key:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;crypto&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;subtle&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;exportKey&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;pkcs8&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;wallet&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;keyPair&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;privateKey&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;I learned two important things:&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Why &lt;code&gt;extractable: true&lt;/code&gt; is required
&lt;/h2&gt;

&lt;p&gt;If the key is not extractable:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;exportKey&lt;/code&gt; simply fails&lt;br&gt;
The private key stays locked inside the crypto subsystem&lt;br&gt;
You cannot save or reuse the wallet&lt;/p&gt;

&lt;p&gt;So without &lt;code&gt;extractable: true&lt;/code&gt;, the wallet is temporary (in-memory only).&lt;/p&gt;


&lt;h2&gt;
  
  
  2. Why "pkcs8" and not "raw"?
&lt;/h2&gt;

&lt;p&gt;This part was subtle but important.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;"pkcs8"&lt;/code&gt; is the standard format for exporting private keys&lt;br&gt;
It wraps the key with metadata (algorithm, structure, etc.)&lt;br&gt;
The Web Crypto API only allows private keys to be exported in PKCS#8 format&lt;/p&gt;

&lt;p&gt;If you try:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;crypto.subtle.exportKey("raw", wallet.keyPair.privateKey);&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;It will fail.&lt;/p&gt;

&lt;p&gt;Because:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;"raw"&lt;/code&gt; format is only valid for public keys&lt;br&gt;
Private keys require a structured, secure encoding → hence PKCS#8&lt;/p&gt;


&lt;h2&gt;
  
  
  🧩 What I Did Next
&lt;/h2&gt;

&lt;p&gt;After exporting in PKCS#8, I extracted the actual 32-byte private key:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;privateKeyBytes&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Uint8Array&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;pkcs8Buffer&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;slice&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;32&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then combined it with the public key:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="s2"&gt;`const keyPairBytes = new Uint8Array(64);
keyPairBytes.set(privateKeyBytes, 0);
keyPairBytes.set(publicKeyBytes, 32);`&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This gave me the standard 64-byte Solana keypair, which I could:&lt;/p&gt;

&lt;p&gt;Save to a file&lt;br&gt;
Reload later&lt;/p&gt;

&lt;h2&gt;
  
  
  ⚖️ Big Takeaway
&lt;/h2&gt;

&lt;p&gt;This small detail clarified a bigger concept for me:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;extractable: true&lt;/code&gt; → enables portability (save, backup, restore)&lt;br&gt;
&lt;code&gt;"pkcs8"&lt;/code&gt; → the only valid way to export private keys&lt;br&gt;
&lt;code&gt;"raw"&lt;/code&gt; → only works for public keys&lt;/p&gt;

</description>
      <category>100daysofsolana</category>
      <category>web3</category>
      <category>blockchain</category>
      <category>solana</category>
    </item>
    <item>
      <title>🔑 From Usernames to Keypairs: Understanding Identity on Solana</title>
      <dc:creator>Vinay</dc:creator>
      <pubDate>Sat, 25 Apr 2026 12:10:32 +0000</pubDate>
      <link>https://dev.to/blackat/from-usernames-to-keypairs-understanding-identity-on-solana-472p</link>
      <guid>https://dev.to/blackat/from-usernames-to-keypairs-understanding-identity-on-solana-472p</guid>
      <description>&lt;p&gt;A few days ago, if you asked me what “identity” means in tech, I’d give you a very Web2 answer:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Email + password = identity&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Every platform I used - GitHub, banking apps, social media - had its own login system. Different usernames, different passwords, all controlled by the companies behind them.&lt;/p&gt;

&lt;p&gt;Then I started learning Solana.&lt;/p&gt;

&lt;p&gt;And my understanding of identity completely changed.&lt;/p&gt;




&lt;h2&gt;
  
  
  🏨 Web2 vs Web3: A Simple Analogy
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Web2 identity is like staying in a hotel.&lt;/strong&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;You get a key card, but the hotel can deactivate it anytime.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;Solana identity is like owning your own house.&lt;/strong&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;You hold the only key. No one can lock you out… but if you lose it, you're stuck outside.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;This shift from platform-controlled access to user-controlled ownership is the core idea behind on-chain identity.&lt;/p&gt;




&lt;h2&gt;
  
  
  🔑 Identity = Keypair
&lt;/h2&gt;

&lt;p&gt;On Solana, your identity starts with a cryptographic keypair:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Public Key&lt;/strong&gt; →  your address (safe to share)&lt;br&gt;
&lt;strong&gt;Private Key&lt;/strong&gt; → your proof of ownership (must stay secret)&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;If you’ve used SSH before, this will feel familiar.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fuykp59za5s7fv5sbl9cu.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fuykp59za5s7fv5sbl9cu.png" alt="This infographic illustrates the generation of a Solana keypair on a laptop, showing how the private key remains secure with the user while the public key is shared across the Solana network." width="800" height="436"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;No signup. No email. Just keys.&lt;/p&gt;

&lt;h2&gt;
  
  
  🤯 One Keypair = My Identity
&lt;/h2&gt;

&lt;p&gt;In Web2, my identity is scattered. Each service (Google, Social Media, Github, etc..) manages its own version of "me".&lt;/p&gt;

&lt;p&gt;But on Solana, everything connects to one thing:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1mt2vrmcw4bgkuat3fby.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1mt2vrmcw4bgkuat3fby.png" alt="A flowchart showing a user utilizing a cryptographic keypair as a single, sovereign gateway to manage tokens, NFTs, applications, and programs on the Solana network." width="800" height="447"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;That’s when it clicked:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;My public key isn’t just an address — it’s my identity across the entire network.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;👀 The Weird Part: No Username?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;In Web2, we all know how a username looks like..&lt;br&gt;
I expected something like that.&lt;br&gt;
Instead, I got this 😵‍💫:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;14grJpemFaf88c8tiVb77W7T...&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Not exactly memorable 😅&lt;/p&gt;

&lt;p&gt;But then I learned, On Solana, your identity is your public key:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;It’s mathematically generated&lt;/li&gt;
&lt;li&gt;It uses Base58 encoding, avoiding confusing characters like 0, O, I, and l&lt;/li&gt;
&lt;li&gt;Not controlled by any company&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  🔐 “Logging In” Doesn’t Exist
&lt;/h2&gt;

&lt;p&gt;This is a subtle but important shift.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;You’re not logging in. You’re proving ownership cryptographically.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fp0i4qrzp3run6le4e3a2.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fp0i4qrzp3run6le4e3a2.png" alt="The image is a dual-panel infographic comparing the centralized, password-based authentication of Web2 with the decentralized, private-key-signed verification of the Solana network." width="800" height="436"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;No passwords. No sessions. Just signatures.&lt;/p&gt;




&lt;h2&gt;
  
  
  🏁 Final Thought
&lt;/h2&gt;

&lt;p&gt;I started this journey thinking I was just learning how wallets and transactions work.&lt;/p&gt;

&lt;p&gt;Instead, I ended up rethinking what “identity” even means.&lt;/p&gt;

&lt;p&gt;And honestly, once that clicks — everything else in Web3 starts to make a lot more sense.&lt;/p&gt;

</description>
      <category>100daysofsolana</category>
      <category>solana</category>
      <category>web3</category>
      <category>blockchain</category>
    </item>
  </channel>
</rss>
