<?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: Gopichand</title>
    <description>The latest articles on DEV Community by Gopichand (@gopichand_dev).</description>
    <link>https://dev.to/gopichand_dev</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%2F3882708%2F5d2325f7-46e0-4bd0-a0a5-2d36935df10a.jpg</url>
      <title>DEV Community: Gopichand</title>
      <link>https://dev.to/gopichand_dev</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/gopichand_dev"/>
    <language>en</language>
    <item>
      <title>Transfer Fees, Metadata, and Soulbound Tokens: A Tour of Solana Token Extensions</title>
      <dc:creator>Gopichand</dc:creator>
      <pubDate>Sun, 24 May 2026 17:05:43 +0000</pubDate>
      <link>https://dev.to/gopichand_dev/transfer-fees-metadata-and-soulbound-tokens-a-tour-of-solana-token-extensions-42bj</link>
      <guid>https://dev.to/gopichand_dev/transfer-fees-metadata-and-soulbound-tokens-a-tour-of-solana-token-extensions-42bj</guid>
      <description>&lt;p&gt;I spent the last five days building tokens on Solana — and it completely&lt;br&gt;
changed how I think about what a "token" actually is.&lt;/p&gt;

&lt;p&gt;Coming from Web2 and EVM development, I assumed a token was a number in a&lt;br&gt;
database with some transfer logic wrapped around it. On Solana, it's much&lt;br&gt;
closer to a configurable protocol object. Here's everything I learned across&lt;br&gt;
Days 29–33 of my #100DaysOfSolana challenge.&lt;/p&gt;


&lt;h2&gt;
  
  
  The Starting Point: Two Token Programs
&lt;/h2&gt;

&lt;p&gt;Solana has two token programs:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;SPL Token (original)&lt;/strong&gt; — simple, battle-tested, does the basics&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Token Extensions Program (Token-2022)&lt;/strong&gt; — everything the original does,
plus built-in extensions for fees, metadata, soulbound tokens, and more&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I used Token-2022 for almost everything this week because it lets you attach&lt;br&gt;
behavior directly to the mint — no separate smart contract needed.&lt;/p&gt;


&lt;h2&gt;
  
  
  Day 29 — Creating My First SPL Token
&lt;/h2&gt;

&lt;p&gt;The first thing that surprised me: a token on Solana is two separate accounts.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Mint account&lt;/strong&gt; — holds the token's configuration (supply, decimals,
mint authority)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Token account&lt;/strong&gt; — holds a specific wallet's balance of that token
&lt;/li&gt;
&lt;/ul&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="nt"&gt;--decimals&lt;/span&gt; 9
spl-token create-account &amp;lt;MINT_ADDRESS&amp;gt;
spl-token mint &amp;lt;MINT_ADDRESS&amp;gt; 1000
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;In Web2, this would be one database table with a balance column. On Solana,&lt;br&gt;
the separation means the mint config is completely independent of who holds&lt;br&gt;
what — any wallet can hold any token as long as they have a token account for it.&lt;/p&gt;


&lt;h2&gt;
  
  
  Day 30 — Token-2022 with On-Chain Metadata
&lt;/h2&gt;

&lt;p&gt;The original SPL token has no name or symbol stored on-chain. You need an&lt;br&gt;
external metadata program (Metaplex) to give it an identity. Token-2022&lt;br&gt;
changes this with the &lt;strong&gt;metadata extension&lt;/strong&gt; — name, symbol, and URI live&lt;br&gt;
directly inside the mint 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-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; 9

spl-token initialize-metadata &amp;lt;MINT_ADDRESS&amp;gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="s2"&gt;"GopichandToken"&lt;/span&gt; &lt;span class="s2"&gt;"GOPI"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="s2"&gt;"https://your-metadata-uri.json"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Run &lt;code&gt;spl-token display &amp;lt;MINT_ADDRESS&amp;gt;&lt;/code&gt; and you'll see the name and symbol&lt;br&gt;
sitting right there in the mint account output. No external call. No&lt;br&gt;
separate metadata program. The token &lt;em&gt;is&lt;/em&gt; the metadata.&lt;/p&gt;


&lt;h2&gt;
  
  
  Day 31 — Transfer Fees at the Protocol Level
&lt;/h2&gt;

&lt;p&gt;This is where it got interesting. I attached a &lt;strong&gt;1% transfer fee&lt;/strong&gt; to a&lt;br&gt;
token mint — meaning every transfer automatically withholds 1% in the&lt;br&gt;
recipient's token account, uncollectable by the recipient, waiting for the&lt;br&gt;
mint authority to withdraw.&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;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--decimals&lt;/span&gt; 9
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;After transferring 100 tokens, the recipient got 99. The 1 withheld token&lt;br&gt;
sat locked in their account until I ran:&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 withdraw-withheld-tokens &lt;span class="se"&gt;\&lt;/span&gt;
  &amp;lt;MY_TOKEN_ACCOUNT&amp;gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &amp;lt;RECIPIENT_TOKEN_ACCOUNT&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In Web2, building a platform fee on transfers requires intercepting every&lt;br&gt;
transaction in your backend. On Solana, it's a flag on the mint. The&lt;br&gt;
program enforces it — not your server.&lt;/p&gt;


&lt;h2&gt;
  
  
  Day 32 — The Full Lifecycle in One Sitting
&lt;/h2&gt;

&lt;p&gt;Day 32 was a consolidation day. No new concepts — just proving I could&lt;br&gt;
build the complete token lifecycle from scratch without checking notes:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Create Token-2022 mint with metadata + 2% transfer fee&lt;/li&gt;
&lt;li&gt;Initialize metadata (name: ReinforceCoin, symbol: RFC)&lt;/li&gt;
&lt;li&gt;Create token account and mint 1000 RFC&lt;/li&gt;
&lt;li&gt;Transfer 100 to a second wallet → recipient gets 98, 2 withheld&lt;/li&gt;
&lt;li&gt;Withdraw withheld fees → balance becomes 902
Mint: 6YnDTE8cETtvKyesVM9frSeWCfpQUx757qcCQyHaBe9T
Final balance: 902 RFC ✅&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The "aha" moment: I realized the pattern is always the same regardless of&lt;br&gt;
which extensions you use. &lt;strong&gt;Create → configure → mint → transfer →&lt;br&gt;
collect.&lt;/strong&gt; The specifics change. The lifecycle doesn't.&lt;/p&gt;


&lt;h2&gt;
  
  
  Day 33 — Soulbound Tokens
&lt;/h2&gt;

&lt;p&gt;The most conceptually interesting day. I created a &lt;strong&gt;non-transferable&lt;br&gt;
token&lt;/strong&gt; — a token that is permanently locked to the wallet it's minted into.&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;I minted 10 tokens, then tried to transfer 5 to a second wallet. The&lt;br&gt;
program rejected it instantly:&lt;br&gt;
Program log: Transfer is disabled for this mint&lt;br&gt;
custom program error: 0x25&lt;br&gt;&lt;br&gt;
That error code &lt;code&gt;0x25&lt;/code&gt; (decimal 37) is &lt;code&gt;NonTransferable&lt;/code&gt; — a first-class&lt;br&gt;
error in the Token Extensions Program. This isn't application logic that&lt;br&gt;
a clever script could bypass. The program itself rejects the instruction.&lt;/p&gt;

&lt;p&gt;What's interesting is that &lt;strong&gt;burning still works&lt;/strong&gt;. The owner can destroy&lt;br&gt;
tokens they hold. They just can't send them. After burning 3, my balance&lt;br&gt;
dropped from 10 to 7 — exactly as expected.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Real-world uses for non-transferable tokens:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Course completion certificates&lt;/li&gt;
&lt;li&gt;KYC / identity verification&lt;/li&gt;
&lt;li&gt;Hackathon participation badges&lt;/li&gt;
&lt;li&gt;Employee credentials&lt;/li&gt;
&lt;li&gt;On-chain reputation scores&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In Web2, preventing credential trading means writing application rules that&lt;br&gt;
can be worked around. On Solana, the restriction is part of the asset itself.&lt;/p&gt;




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

&lt;p&gt;&lt;strong&gt;The separation of mint and token accounts took longer to internalize than&lt;br&gt;
I expected.&lt;/strong&gt; I kept confusing "the mint address" with "my token account."&lt;br&gt;
They're different accounts with different purposes. The mint is the factory.&lt;br&gt;
The token account is the warehouse.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The error messages are actually readable.&lt;/strong&gt; &lt;code&gt;Transfer is disabled for&lt;br&gt;
this mint&lt;/code&gt; is exactly what it sounds like. Coming from debugging opaque&lt;br&gt;
EVM reverts, this felt refreshingly honest.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Extensions compose.&lt;/strong&gt; You can combine metadata + transfer fees in a&lt;br&gt;
single mint creation command. Day 32 showed me that Token-2022 isn't a&lt;br&gt;
collection of separate features — it's a composable system.&lt;/p&gt;




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

&lt;p&gt;I'm on Day 33 of 100. Next up: deeper into Token-2022 extensions&lt;br&gt;
(interest-bearing tokens, confidential transfers), then moving into&lt;br&gt;
Anchor and on-chain programs.&lt;/p&gt;

&lt;p&gt;I'm building toward AI agents that can own wallets and execute Solana&lt;br&gt;
transactions autonomously — and understanding the token layer deeply is&lt;br&gt;
a prerequisite for that.&lt;/p&gt;

&lt;p&gt;If you're following along, my full build log is at:&lt;br&gt;
👉 &lt;a href="https://github.com/gopichandchalla16/100-days-of-solana" rel="noopener noreferrer"&gt;github.com/gopichandchalla16/100-days-of-solana&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Day 34 of #100DaysOfSolana — writing in public, building in public.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>100daysofsolana</category>
      <category>blockchain</category>
      <category>web3</category>
      <category>beginners</category>
    </item>
    <item>
      <title>Week 5 on Solana: Everything I Learned About Tokens (Days 29–31)</title>
      <dc:creator>Gopichand</dc:creator>
      <pubDate>Thu, 21 May 2026 05:07:38 +0000</pubDate>
      <link>https://dev.to/gopichand_dev/week-5-on-solana-everything-i-learned-about-tokens-days-29-31-2bko</link>
      <guid>https://dev.to/gopichand_dev/week-5-on-solana-everything-i-learned-about-tokens-days-29-31-2bko</guid>
      <description>&lt;p&gt;Five weeks into my #100DaysOfSolana challenge and I just crossed into &lt;br&gt;
the most exciting territory yet — Solana's token layer. This week I went &lt;br&gt;
from zero token knowledge to creating, branding, minting, distributing, &lt;br&gt;
and even charging fees on tokens — all on-chain. Here's everything I learned.&lt;/p&gt;
&lt;h2&gt;
  
  
  What "Tokens" Actually Means on Solana
&lt;/h2&gt;

&lt;p&gt;Before this week, I thought tokens were complicated. Smart contracts, &lt;br&gt;
deployment scripts, audits — the whole Web3 horror story.&lt;/p&gt;

&lt;p&gt;Turns out, Solana has a completely different model. The &lt;strong&gt;SPL Token Program&lt;/strong&gt; &lt;br&gt;
is a single shared, audited program already deployed on-chain. Every token &lt;br&gt;
on Solana — from USDC to memecoins to your own project token — is created &lt;br&gt;
using the same program. You never write token logic. You just call it.&lt;/p&gt;

&lt;p&gt;This is the Web2 equivalent of using Stripe instead of building your own &lt;br&gt;
payment processor. The infrastructure is already there.&lt;/p&gt;
&lt;h2&gt;
  
  
  Day 29: My First Token — Raw and Nameless
&lt;/h2&gt;

&lt;p&gt;On Day 29, I ran one command:&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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A token appeared on-chain. Supply: 0. Decimals: 9. Mint authority: me.&lt;/p&gt;

&lt;p&gt;Then I minted 100 tokens into 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 MINT_ADDRESS
spl-token mint MINT_ADDRESS 100
spl-token display MINT_ADDRESS
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Output:                                                                   SPL Token Mint&lt;br&gt;
Address: 2M6t3SbJMz95mZ8nzF8MLq364v2ZQQ235BkxhE93g7hq&lt;br&gt;
Supply: 100000000000&lt;br&gt;
Decimals: 9&lt;br&gt;
Mint authority: AWKYsCGBcfGLSz6QpmXzRn7EJ9fRhiJsjYSLDV3c9L9y&lt;br&gt;
Freeze authority: (not set)&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Key insight:&lt;/strong&gt; Supply shows &lt;code&gt;100000000000&lt;/code&gt; for 100 tokens because &lt;br&gt;
decimals = 9, so &lt;code&gt;100 × 10^9&lt;/code&gt;. All on-chain math is integer arithmetic — &lt;br&gt;
no floating point, no rounding errors.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;One problem:&lt;/strong&gt; Explorer showed it as "Unknown Token." No name, no symbol. &lt;br&gt;
That sent me to Day 30.&lt;/p&gt;
&lt;h2&gt;
  
  
  Day 30: Giving My Token an Identity with Token-2022
&lt;/h2&gt;

&lt;p&gt;The fix: switch to &lt;strong&gt;Token Extensions Program (Token-2022)&lt;/strong&gt;. This newer &lt;br&gt;
standard embeds metadata — name, symbol, URI — directly inside the mint &lt;br&gt;
account. No separate Metaplex account needed.&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 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;My token now had an identity: &lt;strong&gt;100DaysCoin (HUNDO)&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Then I minted 1000 HUNDO and transferred 250 to a second wallet:&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 MINT_ADDRESS 250 SECOND_WALLET &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--fund-recipient&lt;/span&gt; &lt;span class="nt"&gt;--allow-unfunded-recipient&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Final: &lt;strong&gt;750 HUNDO (me) / 250 HUNDO (second wallet)&lt;/strong&gt;. The &lt;br&gt;
&lt;code&gt;--fund-recipient&lt;/code&gt; flag automatically created the recipient's Associated &lt;br&gt;
Token Account (ATA) and covered rent. One flag replaces what would be &lt;br&gt;
multiple API calls in Web2.&lt;/p&gt;
&lt;h2&gt;
  
  
  Day 31: Built-in Transfer Fees — No Middleware Required
&lt;/h2&gt;

&lt;p&gt;This was the most mind-bending day. In Web2, charging a per-transaction &lt;br&gt;
fee means building middleware, hooking into payment flows, writing fee &lt;br&gt;
collection jobs. On Solana, it's one flag at mint creation:&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% fee. The program enforces it on every transfer — &lt;br&gt;
no middleware, no bypass possible.&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 MINT_ADDRESS 100 SECOND_WALLET &lt;span class="nt"&gt;--expected-fee&lt;/span&gt; 1
&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 fails if the &lt;br&gt;
calculated fee doesn't match what you specify. After the transfer:&lt;br&gt;
My wallet: 900 tokens&lt;br&gt;
Second wallet: 99 tokens ← received 100, 1 withheld as fee&lt;br&gt;&lt;br&gt;
The withheld fee sits locked in the recipient's token account. Only the &lt;br&gt;
&lt;strong&gt;withdraw withheld authority&lt;/strong&gt; (set to my wallet at creation) can collect it:&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 withdraw-withheld-tokens MY_TOKEN_ACCOUNT SECOND_WALLET_TOKEN_ACCOUNT
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Final result: &lt;strong&gt;901 tokens in my wallet&lt;/strong&gt; (900 + 1 fee swept back) ✅&lt;/p&gt;

&lt;h2&gt;
  
  
  The Mental Model That Changed Everything
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Web2 Concept&lt;/th&gt;
&lt;th&gt;Solana Equivalent&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Rewards program definition&lt;/td&gt;
&lt;td&gt;Mint account&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;User balance row in DB&lt;/td&gt;
&lt;td&gt;Token Account (ATA)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Display name / branding&lt;/td&gt;
&lt;td&gt;On-chain metadata (Token-2022)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Transfer API endpoint&lt;/td&gt;
&lt;td&gt;&lt;code&gt;spl-token transfer&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Payment processor fee&lt;/td&gt;
&lt;td&gt;Transfer fee basis points&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Fee collection middleware&lt;/td&gt;
&lt;td&gt;&lt;code&gt;withdraw-withheld-tokens&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Admin-only mint permission&lt;/td&gt;
&lt;td&gt;Mint authority (cryptographic)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  SPL Token vs Token-2022: Quick Reference
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Feature&lt;/th&gt;
&lt;th&gt;SPL Token&lt;/th&gt;
&lt;th&gt;Token-2022&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Basic minting &amp;amp; transfers&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;On-chain metadata&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Transfer fees&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Interest-bearing tokens&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Confidential transfers&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;For any new token in 2026: &lt;strong&gt;Token-2022 is the default.&lt;/strong&gt;&lt;/p&gt;

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

&lt;p&gt;Week 6 goes deeper — more Token Extensions, and eventually building &lt;br&gt;
tokens with real utility. The foundation is solid.&lt;/p&gt;

&lt;p&gt;31 days in. 69 to go.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Articles in this series:&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
→ &lt;a href="https://dev.to/gopichand_dev/how-i-created-my-first-solana-token-from-scratch-spl-token-basics-explained-2m39"&gt;Day 29: SPL Token Basics&lt;/a&gt;&lt;br&gt;&lt;br&gt;
→ &lt;a href="https://dev.to/gopichand_dev/i-built-a-branded-token-on-solana-in-5-minutes-no-smart-contract-needed-32n"&gt;Day 30: Token-2022 Branded Token&lt;/a&gt;  &lt;/p&gt;

&lt;p&gt;🔗 GitHub: &lt;a href="https://github.com/gopichandchalla16/100-days-of-solana" rel="noopener noreferrer"&gt;100-days-of-solana&lt;/a&gt;  &lt;/p&gt;

&lt;p&gt;Building daily → &lt;a href="https://twitter.com/GopichandAI" rel="noopener noreferrer"&gt;@GopichandAI&lt;/a&gt; | #100DaysOfSolana                                                  &lt;/p&gt;

</description>
      <category>100daysofsolana</category>
      <category>web3</category>
      <category>blockchain</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>How I Created My First Solana Token from Scratch (SPL Token Basics Explained)</title>
      <dc:creator>Gopichand</dc:creator>
      <pubDate>Thu, 21 May 2026 04:48:07 +0000</pubDate>
      <link>https://dev.to/gopichand_dev/how-i-created-my-first-solana-token-from-scratch-spl-token-basics-explained-2m39</link>
      <guid>https://dev.to/gopichand_dev/how-i-created-my-first-solana-token-from-scratch-spl-token-basics-explained-2m39</guid>
      <description>&lt;p&gt;On Day 29 of my #100DaysOfSolana challenge, I created my first-ever token &lt;br&gt;
on Solana's devnet. Not by deploying a smart contract. Not by writing a &lt;br&gt;
single line of code. Just a CLI and 5 commands.&lt;/p&gt;

&lt;p&gt;Here's what I learned — and why Solana's token model is fundamentally &lt;br&gt;
different from anything in Web2.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Web2 Mental Model (and Why It Breaks Here)
&lt;/h2&gt;

&lt;p&gt;In Web2, when you build a rewards or credits system, you:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Create a &lt;code&gt;tokens&lt;/code&gt; table in your database&lt;/li&gt;
&lt;li&gt;Write API endpoints to create, read, update balances&lt;/li&gt;
&lt;li&gt;Handle edge cases like double-spending yourself&lt;/li&gt;
&lt;li&gt;Maintain a server to keep it all running&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;On Solana, &lt;strong&gt;none of that exists&lt;/strong&gt;. The SPL Token Program is a shared, &lt;br&gt;
audited, on-chain program that any developer can use — no custom backend, &lt;br&gt;
no smart contract needed. You just call it.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Two Key Accounts You Need to Understand
&lt;/h2&gt;

&lt;p&gt;Before touching the CLI, understand this mental model:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Mint Account&lt;/strong&gt; = the global definition of your token  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Stores total supply
&lt;/li&gt;
&lt;li&gt;Stores decimal precision
&lt;/li&gt;
&lt;li&gt;Stores who has authority to mint more
&lt;/li&gt;
&lt;li&gt;One per token type
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Token Account&lt;/strong&gt; = a wallet's individual balance for ONE specific token  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Think of your wallet as a filing cabinet
&lt;/li&gt;
&lt;li&gt;Each token account is a separate folder inside it
&lt;/li&gt;
&lt;li&gt;One folder per token type you hold
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This separation is unusual coming from Web2 — but it's how Solana keeps &lt;br&gt;
its data organized and its runtime blazing fast.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step-by-Step: Creating My First SPL Token
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Prerequisites
&lt;/h3&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;--url&lt;/span&gt; devnet
solana address    &lt;span class="c"&gt;# confirm your wallet&lt;/span&gt;
solana balance    &lt;span class="c"&gt;# confirm you have SOL for fees&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;I had &lt;strong&gt;6.13 SOL&lt;/strong&gt; on devnet — more than enough. No airdrop needed.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 1: Create the token mint
&lt;/h3&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;Output:                                                                  Creating token 2M6t3SbJMz95mZ8nzF8MLq364v2ZQQ235BkxhE93g7hq&lt;br&gt;
under program TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA&lt;/p&gt;

&lt;p&gt;Address: 2M6t3SbJMz95mZ8nzF8MLq364v2ZQQ235BkxhE93g7hq&lt;br&gt;
Decimals: 9&lt;br&gt;&lt;br&gt;
This created a &lt;strong&gt;Mint account&lt;/strong&gt; on-chain. Supply is zero. Decimals default &lt;br&gt;
to 9. My wallet is the mint authority — the only one who can create more.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 2: Create a token account
&lt;/h3&gt;



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

&lt;/div&gt;



&lt;p&gt;Output:                                                                                 Creating account B4SSsjUA1fcJmjMhmYis3EpLTSBD9GGo1DBEZAwjae7c&lt;br&gt;&lt;br&gt;
You &lt;strong&gt;cannot&lt;/strong&gt; receive tokens directly into your wallet. You need a &lt;br&gt;
dedicated token account for each token type. This is the "folder in the &lt;br&gt;
filing cabinet."&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 3: Mint some supply
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;spl-token mint 2M6t3SbJMz95mZ8nzF8MLq364v2ZQQ235BkxhE93g7hq 100
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Output:                                                                               Minting 100 tokens&lt;br&gt;
Token: 2M6t3SbJMz95mZ8nzF8MLq364v2ZQQ235BkxhE93g7hq&lt;br&gt;
Recipient: B4SSsjUA1fcJmjMhmYis3EpLTSBD9GGo1DBEZAwjae7c                  &lt;/p&gt;

&lt;h3&gt;
  
  
  Step 4: Inspect everything
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;spl-token supply 2M6t3SbJMz95mZ8nzF8MLq364v2ZQQ235BkxhE93g7hq
&lt;span class="c"&gt;# → 100&lt;/span&gt;

spl-token accounts
&lt;span class="c"&gt;# Token                                         Balance&lt;/span&gt;
&lt;span class="c"&gt;# 2M6t3SbJMz95mZ8nzF8MLq364v2ZQQ235BkxhE93g7hq  100&lt;/span&gt;

spl-token display 2M6t3SbJMz95mZ8nzF8MLq364v2ZQQ235BkxhE93g7hq
&lt;span class="c"&gt;# SPL Token Mint&lt;/span&gt;
&lt;span class="c"&gt;#   Address:          2M6t3SbJMz95mZ8nzF8MLq364v2ZQQ235BkxhE93g7hq&lt;/span&gt;
&lt;span class="c"&gt;#   Program:          TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA&lt;/span&gt;
&lt;span class="c"&gt;#   Supply:           100000000000&lt;/span&gt;
&lt;span class="c"&gt;#   Decimals:         9&lt;/span&gt;
&lt;span class="c"&gt;#   Mint authority:   AWKYsCGBcfGLSz6QpmXzRn7EJ9fRhiJsjYSLDV3c9L9y&lt;/span&gt;
&lt;span class="c"&gt;#   Freeze authority: (not set)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  The Decimals Trick
&lt;/h2&gt;

&lt;p&gt;Notice the supply shows &lt;code&gt;100000000000&lt;/code&gt; even though I minted &lt;code&gt;100&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;That's because decimals = 9, so:&lt;br&gt;
100 tokens × 10^9 = 100,000,000,000 raw units&lt;br&gt;&lt;br&gt;
This is identical to how SOL works with lamports:                                       1 SOL = 1,000,000,000 lamports&lt;br&gt;&lt;br&gt;
All on-chain arithmetic is integer math — no floating point, no rounding &lt;br&gt;
errors. The CLI handles the conversion for you.&lt;/p&gt;

&lt;h2&gt;
  
  
  What "Mint Authority" Actually Means
&lt;/h2&gt;

&lt;p&gt;The &lt;code&gt;mint authority&lt;/code&gt; field is your wallet address — meaning &lt;strong&gt;only you&lt;/strong&gt; &lt;br&gt;
can call &lt;code&gt;spl-token mint&lt;/code&gt; to create more supply. &lt;/p&gt;

&lt;p&gt;This is the on-chain equivalent of "only the admin can issue new credits" &lt;br&gt;
in a Web2 system. Except here, it's enforced by cryptography, not by &lt;br&gt;
an &lt;code&gt;if (user.role === 'admin')&lt;/code&gt; check in your backend.&lt;/p&gt;

&lt;p&gt;You can also permanently disable minting (set supply to fixed) by &lt;br&gt;
running &lt;code&gt;spl-token authorize YOUR_MINT mint --disable&lt;/code&gt;. Once done, &lt;br&gt;
it's irreversible.&lt;/p&gt;

&lt;h2&gt;
  
  
  Freeze Authority: What It Is and Why I Left It Unset
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;Freeze authority: (not set)&lt;/code&gt; means no one can freeze token accounts &lt;br&gt;
holding this token. If freeze authority were set, the authority could &lt;br&gt;
prevent specific wallets from sending or receiving the token — useful &lt;br&gt;
for compliance in real-world asset tokens, but not needed here.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Big Picture
&lt;/h2&gt;

&lt;p&gt;You just created a digital asset. Not a database row, not an API response &lt;br&gt;
— a real token living on a public blockchain that anyone in the world &lt;br&gt;
can verify right now:&lt;/p&gt;

&lt;p&gt;🔗 &lt;a href="https://explorer.solana.com/address/2M6t3SbJMz95mZ8nzF8MLq364v2ZQQ235BkxhE93g7hq?cluster=devnet" rel="noopener noreferrer"&gt;View on Solana Explorer&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Tomorrow (Day 30), I upgraded this with &lt;strong&gt;Token-2022&lt;/strong&gt; — giving the token &lt;br&gt;
a real name, symbol, and on-chain metadata. The difference is dramatic.&lt;/p&gt;




&lt;p&gt;🔗 Full code: &lt;a href="https://github.com/gopichandchalla16/100-days-of-solana/tree/main/day-29-spl-token" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt;  &lt;/p&gt;

&lt;p&gt;Building daily → &lt;a href="https://twitter.com/GopichandAI" rel="noopener noreferrer"&gt;@GopichandAI&lt;/a&gt; | #100DaysOfSolana Day 29/100                                                                                                             &lt;/p&gt;

</description>
      <category>100daysofsolana</category>
      <category>web3</category>
      <category>blockchain</category>
      <category>beginners</category>
    </item>
    <item>
      <title>I Built a Branded Token on Solana in 5 Minutes (No Smart Contract Needed)</title>
      <dc:creator>Gopichand</dc:creator>
      <pubDate>Thu, 21 May 2026 04:40:48 +0000</pubDate>
      <link>https://dev.to/gopichand_dev/i-built-a-branded-token-on-solana-in-5-minutes-no-smart-contract-needed-32n</link>
      <guid>https://dev.to/gopichand_dev/i-built-a-branded-token-on-solana-in-5-minutes-no-smart-contract-needed-32n</guid>
      <description>&lt;p&gt;I spent years thinking "creating a token" meant writing complex smart contract &lt;br&gt;
code, deploying it, hoping nothing breaks. Today on Day 30 of my &lt;/p&gt;

&lt;h1&gt;
  
  
  100DaysOfSolana challenge, I created a fully branded token — with a name,
&lt;/h1&gt;

&lt;p&gt;symbol, and on-chain metadata — in under 5 minutes. No Solidity. No Rust. &lt;br&gt;
Just a CLI.&lt;/p&gt;

&lt;p&gt;Here's exactly what I did and what it means.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Problem with Yesterday's Token
&lt;/h2&gt;

&lt;p&gt;On Day 29, I created my first SPL token on Solana devnet. It worked — but &lt;br&gt;
when I looked it up on Solana Explorer, it showed up as "Unknown Token." Just &lt;br&gt;
a random address with no name, no symbol, no identity.&lt;/p&gt;

&lt;p&gt;That's like launching a rewards program for your app but forgetting to give &lt;br&gt;
it a name. Users would see a random ID and have no idea what it represents.&lt;/p&gt;

&lt;p&gt;Today I fixed that using &lt;strong&gt;Token-2022&lt;/strong&gt; — Solana's next-generation token program.&lt;/p&gt;

&lt;h2&gt;
  
  
  Token-2022 vs the Original SPL Token Program
&lt;/h2&gt;

&lt;p&gt;The original SPL Token Program is solid but basic. To add metadata (name, &lt;br&gt;
symbol, image), you'd traditionally need a separate Metaplex account — an &lt;br&gt;
extra transaction, extra cost, extra complexity.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Token Extensions Program (Token-2022)&lt;/strong&gt; changes this. It lets you embed &lt;br&gt;
metadata &lt;em&gt;directly inside the mint account itself&lt;/em&gt;. One account. Everything &lt;br&gt;
in one place. Fewer transactions, lower cost.&lt;/p&gt;

&lt;p&gt;Think of it like this:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Web2 Concept&lt;/th&gt;
&lt;th&gt;Solana Equivalent&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Reward program definition&lt;/td&gt;
&lt;td&gt;Mint account&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Display name / branding&lt;/td&gt;
&lt;td&gt;On-chain metadata (name, symbol, URI)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;User balance record&lt;/td&gt;
&lt;td&gt;Associated Token Account (ATA)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Transfer API&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;spl-token transfer&lt;/code&gt; instruction&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  What I Built: 100DaysCoin (HUNDO)
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Token name:&lt;/strong&gt; 100DaysCoin
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Symbol:&lt;/strong&gt; HUNDO
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Decimals:&lt;/strong&gt; 6
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Program:&lt;/strong&gt; Token Extensions (Token-2022)
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Mint:&lt;/strong&gt; &lt;code&gt;3zX5oyL9skYKWo2ZoUHgBwLpG9BzLe1ViuXLgH8joqFt&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Step-by-Step: How I Did It
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Step 1: Create the mint with metadata enabled
&lt;/h3&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
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The &lt;code&gt;--program-id&lt;/code&gt; flag tells the CLI to use Token-2022 instead of the &lt;br&gt;
original SPL Token Program. The &lt;code&gt;--enable-metadata&lt;/code&gt; flag activates the &lt;br&gt;
metadata extension on the mint.&lt;/p&gt;

&lt;p&gt;Output:                                                                                  Creating token 3zX5oyL9skYKWo2ZoUHgBwLpG9BzLe1ViuXLgH8joqFt&lt;br&gt;
Address: 3zX5oyL9skYKWo2ZoUHgBwLpG9BzLe1ViuXLgH8joqFt&lt;br&gt;
Decimals: 6                                                              &lt;/p&gt;

&lt;h3&gt;
  
  
  Step 2: Initialize on-chain metadata
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;spl-token initialize-metadata &lt;span class="se"&gt;\&lt;/span&gt;
  3zX5oyL9skYKWo2ZoUHgBwLpG9BzLe1ViuXLgH8joqFt &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;This writes the token's name, symbol, and a URI directly onto the mint &lt;br&gt;
account. The URI points to a JSON file with extended details — description, &lt;br&gt;
image, attributes. This is now verifiable by anyone on-chain.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 3: Create a token account and mint supply
&lt;/h3&gt;



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

&lt;/div&gt;



&lt;p&gt;Balance check:                                                                       1000                                                                                 &lt;/p&gt;

&lt;h3&gt;
  
  
  Step 4: Transfer tokens to a second wallet
&lt;/h3&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; ~/second-wallet.json &lt;span class="nt"&gt;--no-bip39-passphrase&lt;/span&gt;

spl-token transfer 3zX5oyL9skYKWo2ZoUHgBwLpG9BzLe1ViuXLgH8joqFt 250 &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="si"&gt;$(&lt;/span&gt;solana-keygen pubkey ~/second-wallet.json&lt;span class="si"&gt;)&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--fund-recipient&lt;/span&gt; &lt;span class="nt"&gt;--allow-unfunded-recipient&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The &lt;code&gt;--fund-recipient&lt;/code&gt; flag is key — it automatically creates the recipient's &lt;br&gt;
Associated Token Account (ATA) and covers the rent cost from my wallet. In &lt;br&gt;
Web2 terms, it's like your API automatically creating a user's balance row &lt;br&gt;
before their first transaction.&lt;/p&gt;

&lt;h3&gt;
  
  
  Final balances
&lt;/h3&gt;

&lt;p&gt;My wallet: 750 HUNDO ✅&lt;br&gt;
Second wallet: 250 HUNDO ✅                                                            &lt;/p&gt;

&lt;h2&gt;
  
  
  The "Aha" Moment
&lt;/h2&gt;

&lt;p&gt;In Web2, building a token/rewards system means:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Database schema for the currency definition&lt;/li&gt;
&lt;li&gt;CRUD API endpoints for balance management
&lt;/li&gt;
&lt;li&gt;Custom transfer logic with double-spend protection&lt;/li&gt;
&lt;li&gt;A server running 24/7 to keep it all alive&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;On Solana with Token-2022:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;create-token&lt;/code&gt; = currency definition&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;create-account&lt;/code&gt; = user balance row&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;transfer&lt;/code&gt; = transfer API&lt;/li&gt;
&lt;li&gt;Zero server. Zero maintenance. Publicly verifiable.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;And critically — the metadata lives &lt;strong&gt;on-chain&lt;/strong&gt;. Not in your database. Not &lt;br&gt;
on your server. On a public ledger that anyone can read, forever.&lt;/p&gt;

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

&lt;p&gt;Day 31 onward: deeper into token extensions — transfer fees, &lt;br&gt;
interest-bearing tokens, and eventually building tokens with real utility. &lt;br&gt;
The foundation is set.&lt;/p&gt;




&lt;p&gt;🔗 Full code + notes: &lt;a href="https://github.com/gopichandchalla16/100-days-of-solana/tree/main/day-30-token2022-metadata" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt;&lt;br&gt;&lt;br&gt;
🔗 Mint on Explorer: &lt;a href="https://explorer.solana.com/address/3zX5oyL9skYKWo2ZoUHgBwLpG9BzLe1ViuXLgH8joqFt?cluster=devnet" rel="noopener noreferrer"&gt;Solana Explorer&lt;/a&gt;  &lt;/p&gt;

&lt;p&gt;Building daily → &lt;a href="https://twitter.com/GopichandAI" rel="noopener noreferrer"&gt;@GopichandAI&lt;/a&gt; | #100DaysOfSolana Day 30/100                &lt;/p&gt;

</description>
      <category>100daysofsolana</category>
      <category>web3</category>
      <category>blockchain</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>Solana's Account Model Explained for Web2 Developers (No Blockchain Experience Needed)</title>
      <dc:creator>Gopichand</dc:creator>
      <pubDate>Mon, 18 May 2026 06:57:15 +0000</pubDate>
      <link>https://dev.to/gopichand_dev/solanas-account-model-explained-for-web2-developers-no-blockchain-experience-needed-4acg</link>
      <guid>https://dev.to/gopichand_dev/solanas-account-model-explained-for-web2-developers-no-blockchain-experience-needed-4acg</guid>
      <description>&lt;p&gt;If you're a Web2 developer looking at Solana for the first time, the account &lt;br&gt;
model will either click immediately or confuse you completely. I was in the &lt;br&gt;
second camp — until I spent 26 days building on Solana daily as part of the &lt;br&gt;
100 Days of Solana challenge.&lt;/p&gt;

&lt;p&gt;Here's the explanation I wish I'd had on Day 1.&lt;/p&gt;
&lt;h2&gt;
  
  
  The Filesystem Analogy
&lt;/h2&gt;

&lt;p&gt;Think of Solana like a filesystem.&lt;/p&gt;

&lt;p&gt;Each account is a &lt;strong&gt;file&lt;/strong&gt;. Every file has metadata (owner, permissions, size) &lt;br&gt;
and contents (data). Programs are &lt;strong&gt;executable files&lt;/strong&gt;. Data accounts are the &lt;br&gt;
&lt;strong&gt;documents&lt;/strong&gt; those programs read and write. The System Program is the &lt;br&gt;
&lt;strong&gt;operating system kernel&lt;/strong&gt; that manages file creation and ownership transfers.&lt;/p&gt;

&lt;p&gt;That's the whole model. Let's go deeper.&lt;/p&gt;
&lt;h2&gt;
  
  
  Everything Is an Account
&lt;/h2&gt;

&lt;p&gt;In Ethereum, there are two types of things: externally owned accounts (wallets) &lt;br&gt;
and contract accounts (smart contracts). They behave differently.&lt;/p&gt;

&lt;p&gt;Solana has one type: &lt;strong&gt;accounts&lt;/strong&gt;. Everything — your wallet, a smart contract, &lt;br&gt;
a token mint, a clock showing the current time — is an account. They all live &lt;br&gt;
in one flat key-value store where the key is a 32-byte address and the value &lt;br&gt;
is the account itself.&lt;/p&gt;

&lt;p&gt;This uniformity is powerful once it clicks.&lt;/p&gt;
&lt;h2&gt;
  
  
  The Five Fields Every Account Has
&lt;/h2&gt;

&lt;p&gt;Every single Solana account — whether it's your wallet or the System Program &lt;br&gt;
itself — has exactly five fields. Here's what they look like when you inspect &lt;br&gt;
your own wallet with the Solana CLI:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;solana account &lt;span class="si"&gt;$(&lt;/span&gt;solana address&lt;span class="si"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Public Key: AWKYsCGBcfGLSz6QpmXzRn7EJ9fRhiJsjYSLDV3c9L9y&lt;br&gt;
Balance: 6.137925 SOL&lt;br&gt;
Owner: 11111111111111111111111111111111&lt;br&gt;
Executable: false&lt;br&gt;
Rent Epoch: 18446744073709551615&lt;br&gt;&lt;br&gt;
And in JSON:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"lamports"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;6137925000&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"data"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;""&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"base64"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"owner"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"11111111111111111111111111111111"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"executable"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"rentEpoch"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;18446744073709551615&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"space"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Let's break each field down:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. lamports&lt;/strong&gt; — your SOL balance in the smallest unit. 1 SOL = 1,000,000,000 &lt;br&gt;
lamports. My wallet has 6,137,925,000 lamports = 6.137925 SOL. Think of &lt;br&gt;
lamports like wei in Ethereum, or paise in INR — the atomic unit.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. data&lt;/strong&gt; — a raw byte array. For a basic wallet, this is empty (0 bytes). &lt;br&gt;
For a token mint, it's 82 bytes of structured data. For a program, it's the &lt;br&gt;
compiled bytecode. This field holds the entire state of the account.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. owner&lt;/strong&gt; — the program that controls this account. My wallet is owned by &lt;br&gt;
&lt;code&gt;11111111111111111111111111111111&lt;/code&gt; — the System Program. Only the owner program &lt;br&gt;
can modify the account's data or debit its lamports. Anyone can &lt;em&gt;add&lt;/em&gt; lamports, &lt;br&gt;
but only the owner can &lt;em&gt;remove&lt;/em&gt; them. This one rule is most of Solana's &lt;br&gt;
security model.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4. executable&lt;/strong&gt; — a boolean. &lt;code&gt;false&lt;/code&gt; for wallets and data accounts. &lt;code&gt;true&lt;/code&gt; &lt;br&gt;
for programs. When you call a program, Solana checks this flag first.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;5. rent_epoch&lt;/strong&gt; — deprecated. Ignore it. It's always set to the maximum u64 &lt;br&gt;
value (18446744073709551615) for all rent-exempt accounts, which is everything &lt;br&gt;
on mainnet today.&lt;/p&gt;
&lt;h2&gt;
  
  
  Programs Don't Store Their Own State
&lt;/h2&gt;

&lt;p&gt;This is the part that surprises every Web2 developer.&lt;/p&gt;

&lt;p&gt;In Web2, a server typically owns its own database. In Solana, &lt;strong&gt;programs are &lt;br&gt;
stateless&lt;/strong&gt;. A program's executable code lives in one account. Any data it &lt;br&gt;
needs to read or write lives in &lt;em&gt;separate&lt;/em&gt; data accounts that are passed in &lt;br&gt;
with each transaction.&lt;/p&gt;

&lt;p&gt;Here's the direct comparison:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Web2&lt;/th&gt;
&lt;th&gt;Solana&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Web server&lt;/td&gt;
&lt;td&gt;Program account (executable=true)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Database&lt;/td&gt;
&lt;td&gt;Data account (executable=false)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Database row&lt;/td&gt;
&lt;td&gt;Individual account's &lt;code&gt;data&lt;/code&gt; field&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;HTTP request&lt;/td&gt;
&lt;td&gt;Transaction instruction&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Request body&lt;/td&gt;
&lt;td&gt;Instruction data + account list&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Why does this matter? Because it means Solana can process transactions in &lt;br&gt;
parallel. If two transactions touch different accounts, they can run at the &lt;br&gt;
same time. That's a big reason Solana achieves 3,000–4,000 TPS on mainnet.&lt;/p&gt;
&lt;h2&gt;
  
  
  The Ownership Rules Are Simple But Powerful
&lt;/h2&gt;

&lt;p&gt;Three rules govern everything:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Only the owner program can modify an account's data&lt;/li&gt;
&lt;li&gt;Only the owner program can debit lamports from an account
&lt;/li&gt;
&lt;li&gt;Anyone can credit (send) lamports to any account&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;That's it. No complex permission system. No role-based access control. Just: &lt;br&gt;
you own it, you control it.&lt;/p&gt;

&lt;p&gt;When you send SOL to someone, the System Program (owner of both wallets) &lt;br&gt;
executes the transfer. When a token program moves a token, it's the owner of &lt;br&gt;
the token account doing the write. The ownership chain is always clear.&lt;/p&gt;
&lt;h2&gt;
  
  
  Rent Exemption
&lt;/h2&gt;

&lt;p&gt;Every account must hold a minimum lamport balance proportional to its data &lt;br&gt;
size to stay on-chain permanently. This is called being &lt;strong&gt;rent-exempt&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;For a basic wallet (0 bytes of data):&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;# Rent-exempt minimum: 0.00089088 SOL&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For a token mint account (82 bytes):&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 82
&lt;span class="c"&gt;# Rent-exempt minimum: 0.0015 SOL&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Think of it as a deposit you make to reserve space on the network. You get it &lt;br&gt;
back if you ever close the account. The network needs this mechanism to prevent &lt;br&gt;
people from spamming millions of empty accounts.&lt;/p&gt;
&lt;h2&gt;
  
  
  Seeing It All in Practice
&lt;/h2&gt;

&lt;p&gt;After 26 days of building on Solana, the account model stopped being abstract &lt;br&gt;
and became &lt;em&gt;obvious&lt;/em&gt;. When I inspected the System Program itself:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;solana account 11111111111111111111111111111111
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Owner: NativeLoader1111111111111111111111111111111&lt;br&gt;
Executable: true&lt;br&gt;
Data: system_program ← literally the program name in bytes&lt;br&gt;&lt;br&gt;
And the Clock sysvar:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;solana account SysvarC1ock11111111111111111111111111111111
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;&lt;br&gt;
                                                                                        Owner: Sysvar1111111111111111111111111111111111111&lt;br&gt;
Executable: false&lt;br&gt;
Length: 40 bytes ← slot, epoch, unix timestamp packed as binary&lt;br&gt;&lt;br&gt;
The pattern is always the same: &lt;code&gt;executable=true&lt;/code&gt; means it's code, &lt;br&gt;
&lt;code&gt;executable=false&lt;/code&gt; means it's data. The owner tells you who controls it. The &lt;br&gt;
data tells you what it stores.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Mental Model That Clicked For Me
&lt;/h2&gt;

&lt;p&gt;After weeks of building, here's the one-sentence summary:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Solana is a global key-value store. Keys are 32-byte addresses. Values are &lt;br&gt;
accounts with 5 fields. Programs are accounts that transform other accounts &lt;br&gt;
when you call them.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Everything else — tokens, NFTs, DeFi protocols, oracles — is built on top of &lt;br&gt;
this foundation. Once you see it, you can't unsee it.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;I'm building in public with the &lt;a href="https://mlh.link/solana-100" rel="noopener noreferrer"&gt;100 Days of Solana&lt;/a&gt; &lt;br&gt;
challenge by MLH. Follow along on &lt;a href="https://github.com/gopichandchalla16/100-days-of-solana" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt; &lt;br&gt;
and &lt;a href="https://twitter.com/GopichandAI" rel="noopener noreferrer"&gt;X/Twitter&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Day 27 of 100. #100DaysOfSolana&lt;/em&gt;                                                                        &lt;/p&gt;

</description>
      <category>blockchain</category>
      <category>web3</category>
      <category>beginners</category>
      <category>100daysofsolana</category>
    </item>
    <item>
      <title>Solana Transactions Explained for Backend Developers (With Real Failures)</title>
      <dc:creator>Gopichand</dc:creator>
      <pubDate>Sat, 09 May 2026 11:00:56 +0000</pubDate>
      <link>https://dev.to/gopichand_dev/solana-transactions-explained-for-backend-developers-with-real-failures-2ido</link>
      <guid>https://dev.to/gopichand_dev/solana-transactions-explained-for-backend-developers-with-real-failures-2ido</guid>
      <description>&lt;p&gt;I've been building on Solana for the past few weeks as part of the &lt;/p&gt;

&lt;h1&gt;
  
  
  100DaysOfSolana challenge by MLH. Days 15–19 were all about transactions —
&lt;/h1&gt;

&lt;p&gt;sending them, reading them, tracking them through confirmation stages, and &lt;br&gt;
deliberately breaking them. Here's what I learned, explained for backend &lt;br&gt;
developers who think in HTTP requests and database calls.&lt;/p&gt;

&lt;h2&gt;
  
  
  A Solana Transaction Is Not an API Call
&lt;/h2&gt;

&lt;p&gt;When you hit a REST endpoint, you send a request and get a response. &lt;br&gt;
If it fails, you retry. No cost, no permanent record, no cryptographic proof &lt;br&gt;
it ever happened.&lt;/p&gt;

&lt;p&gt;A Solana transaction is different in every one of those ways:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;It requires a &lt;strong&gt;cryptographic signature&lt;/strong&gt; from the fee payer's private key&lt;/li&gt;
&lt;li&gt;It is &lt;strong&gt;permanently recorded on-chain&lt;/strong&gt; whether it succeeds or fails&lt;/li&gt;
&lt;li&gt;It &lt;strong&gt;expires&lt;/strong&gt; after ~60–90 seconds based on a recent blockhash&lt;/li&gt;
&lt;li&gt;It &lt;strong&gt;costs a fee even if it fails&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That last point surprised me the most. Let me show you with real output.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Anatomy of a Transaction
&lt;/h2&gt;

&lt;p&gt;Every Solana transaction has these parts:&lt;br&gt;
Signature 0: 2xQrSQU...&lt;br&gt;
Account 0: srw- AWKYsCGB... (fee payer)&lt;br&gt;
Account 1: -rw- 8nwngJPM...&lt;br&gt;
Account 2: -r-x 11111111... (System Program)&lt;br&gt;
Instruction 0&lt;br&gt;
Program: 11111111... (System Program)&lt;br&gt;
Transfer { lamports: 9999000000000 }&lt;br&gt;
Recent Blockhash: FVSnvFfG...&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Signature&lt;/strong&gt; — cryptographic proof the fee payer authorized this tx&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Accounts&lt;/strong&gt; — every account the tx will read or write must be declared upfront&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Instructions&lt;/strong&gt; — the actual operations (transfer SOL, call a program, etc.)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Recent Blockhash&lt;/strong&gt; — acts like a timestamp + nonce; tx expires if too old&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The account permission flags (&lt;code&gt;srw-&lt;/code&gt;, &lt;code&gt;-rw-&lt;/code&gt;, &lt;code&gt;-r-x&lt;/code&gt;) tell you exactly what &lt;br&gt;
each account can do: &lt;strong&gt;s&lt;/strong&gt;igner, &lt;strong&gt;r&lt;/strong&gt;eadable, &lt;strong&gt;w&lt;/strong&gt;ritable, e*&lt;em&gt;x&lt;/em&gt;*ecutable.&lt;/p&gt;

&lt;h2&gt;
  
  
  Solana's 3 Confirmation Levels
&lt;/h2&gt;

&lt;p&gt;Unlike a database commit that's either done or not, Solana confirmation &lt;br&gt;
happens in stages:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Level&lt;/th&gt;
&lt;th&gt;What it means&lt;/th&gt;
&lt;th&gt;Web2 analogy&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Processed&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Validator included tx in a block&lt;/td&gt;
&lt;td&gt;POST reached the server&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Confirmed&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;66%+ validators voted on the block&lt;/td&gt;
&lt;td&gt;200 OK from load-balanced API&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Finalized&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;31+ blocks built on top&lt;/td&gt;
&lt;td&gt;DB commit flushed + replicated&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;I built a live tracker that shows each stage in real time:&lt;br&gt;
Tracking confirmation stages...&lt;br&gt;
[Processed → Confirmed] ✅ reached in 0.3s&lt;br&gt;
[Confirmed → Finalized] ✅ reached in 0.2s&lt;/p&gt;

&lt;p&gt;Transaction successful! 🎉&lt;br&gt;
Signature: 3hYmkD3m...&lt;br&gt;&lt;br&gt;
On devnet, Processed→Confirmed takes ~400ms. Confirmed→Finalized takes &lt;br&gt;
~6–12 seconds. In production those numbers matter for UX decisions.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Happens When Transactions Fail
&lt;/h2&gt;

&lt;p&gt;This is where things get interesting. I deliberately triggered a failed &lt;br&gt;
transaction by skipping preflight simulation (&lt;code&gt;skipPreflight: true&lt;/code&gt;) and &lt;br&gt;
attempting to send 9,999 SOL when my wallet only had ~6.14 SOL.&lt;/p&gt;

&lt;p&gt;Here's the real on-chain output from &lt;code&gt;solana confirm -v&lt;/code&gt;:&lt;br&gt;
Status: Error processing Instruction 0: custom program error: 0x1&lt;br&gt;
Fee: ◎0.000005&lt;br&gt;
Account 0 balance: ◎6.13593 -&amp;gt; ◎6.135925&lt;br&gt;
Account 1 balance: ◎0&lt;br&gt;
Compute Units Consumed: 150&lt;br&gt;
Log Messages:&lt;br&gt;
Program 11111111111111111111111111111111 invoke&lt;br&gt;
Transfer: insufficient lamports 6135925000, need 9999000000000&lt;br&gt;
Program 11111111111111111111111111111111 failed: custom program error: 0x1&lt;br&gt;&lt;br&gt;
Three things stand out:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. The fee was charged anyway.&lt;/strong&gt;&lt;br&gt;
Account 0 balance dropped by 0.000005 SOL — just the fee, not the transfer. &lt;br&gt;
The network did work (verified signature, attempted execution), so it got paid.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. The error is structured.&lt;/strong&gt;&lt;br&gt;
&lt;code&gt;custom program error: 0x1&lt;/code&gt; from the System Program always means insufficient &lt;br&gt;
lamports. As you write your own programs, these error codes become your &lt;br&gt;
primary debugging tool — like HTTP status codes but for on-chain logic.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. The Log Messages are your stack trace.&lt;/strong&gt;&lt;br&gt;
&lt;code&gt;Transfer: insufficient lamports 6135925000, need 9999000000000&lt;/code&gt; tells you &lt;br&gt;
exactly what was available vs what was needed. This is how you debug failed &lt;br&gt;
instructions in production.&lt;/p&gt;

&lt;h2&gt;
  
  
  Two Types of Failure: Local vs On-Chain
&lt;/h2&gt;

&lt;p&gt;Not all failures reach the chain:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Failure type&lt;/th&gt;
&lt;th&gt;Where it stops&lt;/th&gt;
&lt;th&gt;Fee charged?&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;CLI preflight (insufficient funds check)&lt;/td&gt;
&lt;td&gt;Never leaves your machine&lt;/td&gt;
&lt;td&gt;❌ No&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;On-chain failure (skipPreflight)&lt;/td&gt;
&lt;td&gt;Executed by validators&lt;/td&gt;
&lt;td&gt;✅ Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;This is why production apps use &lt;code&gt;simulateTransaction&lt;/code&gt; before submitting. &lt;br&gt;
Simulation catches errors locally for free. Every on-chain failure is real &lt;br&gt;
money, even if it's tiny amounts.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Mental Model Shift
&lt;/h2&gt;

&lt;p&gt;The biggest shift from Web2 to Solana transactions:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Web2:&lt;/strong&gt; You send a request. The server decides what happens. You get a &lt;br&gt;
response. If something breaks server-side, you don't pay for it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Solana:&lt;/strong&gt; You sign and broadcast a state change. Validators execute it &lt;br&gt;
atomically. The result — success or failure — is permanent and public. &lt;br&gt;
You pay regardless.&lt;/p&gt;

&lt;p&gt;The blockhash expiry (~60–90s) also changes how you think about retries. &lt;br&gt;
You can't just retry the same signed transaction forever — the blockhash &lt;br&gt;
goes stale. You need to rebuild and re-sign with a fresh blockhash.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I Built This Week
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Day 15&lt;/strong&gt; — Inspected transaction anatomy: signatures, accounts, 
instructions, compute units&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Day 16&lt;/strong&gt; — Sent first SOL transfer on devnet (&amp;lt;1s settlement)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Day 17&lt;/strong&gt; — Built a reusable Node.js CLI transfer tool with balance 
checks and Explorer links&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Day 18&lt;/strong&gt; — Added live confirmation tracking (Processed→Confirmed→Finalized)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Day 19&lt;/strong&gt; — Deliberately broke transactions, read on-chain errors with 
&lt;code&gt;solana confirm -v&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;All code is on my GitHub: &lt;br&gt;
&lt;a href="https://github.com/gopichandchalla16/100-days-of-solana" rel="noopener noreferrer"&gt;github.com/gopichandchalla16/100-days-of-solana&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;If you're coming from a Web2 background and starting with Solana, the &lt;br&gt;
transaction model will feel strange at first. The fee-on-failure behavior, &lt;br&gt;
the blockhash expiry, and the upfront account declaration all exist for &lt;br&gt;
good reasons — they're what makes Solana fast, parallel, and predictable. &lt;br&gt;
Once it clicks, it's actually elegant.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Day 20 of #100DaysOfSolana — building in public every day 🚀&lt;/em&gt;&lt;br&gt;
&lt;em&gt;Follow my progress: &lt;a href="https://twitter.com/GopichandAI" rel="noopener noreferrer"&gt;@GopichandAI&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>100daysofsolana</category>
      <category>blockchain</category>
      <category>web3</category>
      <category>learning</category>
    </item>
    <item>
      <title>Week 2 on Solana: When the "Public Database" Finally Clicked</title>
      <dc:creator>Gopichand</dc:creator>
      <pubDate>Mon, 04 May 2026 07:55:21 +0000</pubDate>
      <link>https://dev.to/gopichand_dev/week-2-on-solana-when-the-public-database-finally-clicked-273a</link>
      <guid>https://dev.to/gopichand_dev/week-2-on-solana-when-the-public-database-finally-clicked-273a</guid>
      <description>&lt;p&gt;I'm doing the 100 Days of Solana challenge by MLH, and Week 2 just changed how I think about blockchain data entirely.&lt;/p&gt;

&lt;p&gt;Week 1 was about identity — generating keypairs, understanding wallets, getting devnet SOL. That part felt familiar, like setting up a dev environment.&lt;/p&gt;

&lt;p&gt;Week 2 was different. Week 2 was about &lt;em&gt;reading the chain&lt;/em&gt; — and that's where the mental model shift actually happened.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I expected vs what I got
&lt;/h2&gt;

&lt;p&gt;I expected reading blockchain data to feel like calling a mysterious, slow, complex API. Something with heavy setup, authentication tokens, and confusing docs.&lt;/p&gt;

&lt;p&gt;What I got was 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="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;value&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;lamports&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;rpc&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getBalance&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="nf"&gt;send&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;sol&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Number&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;lamports&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="nx"&gt;_000_000_000&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;No API key. No login. No permissions. Anyone can call this for any address, anytime.&lt;/p&gt;

&lt;p&gt;In Web2, if I want someone's account balance, I need DB credentials, role permissions, and middleware. On Solana, I just ask. Publicly. That's not a flaw — that's the design.&lt;/p&gt;

&lt;h2&gt;
  
  
  The moment it clicked
&lt;/h2&gt;

&lt;p&gt;Day 11 was a conceptual challenge: compare Solana accounts to Web2 databases. I ran:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;solana account &lt;span class="si"&gt;$(&lt;/span&gt;solana address&lt;span class="si"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Output:&lt;br&gt;
Public Key: AWKYsCGBcfGLSz6QpmXzRn7EJ9fRhiJsjYSLDV3c9L9y&lt;br&gt;
Balance: 2.5 SOL&lt;br&gt;
Owner: 11111111111111111111111111111111&lt;br&gt;
Executable: false&lt;br&gt;&lt;br&gt;
Then I ran:&lt;br&gt;
&lt;/p&gt;

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

&lt;/div&gt;



&lt;p&gt;Output:&lt;br&gt;
Owner: BPFLoaderUpgradeab1e11111111111111111111111&lt;br&gt;
Executable: true&lt;br&gt;
Length: 36 bytes&lt;br&gt;&lt;br&gt;
Same command. Same account model. One is a wallet holding SOL. The other is the Token Program — compiled code that manages every SPL token on Solana. Both are just "accounts."&lt;/p&gt;

&lt;p&gt;That's when "everything is an account" stopped being a slogan and started being a mental model.&lt;/p&gt;
&lt;h2&gt;
  
  
  The devnet vs mainnet surprise
&lt;/h2&gt;

&lt;p&gt;Day 12 was the most satisfying. One script. Two RPC connections:&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;devnetRpc&lt;/span&gt;  &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;createSolanaRpc&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;devnet&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;https://api.devnet.solana.com&lt;/span&gt;&lt;span class="dl"&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;mainnetRpc&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;createSolanaRpc&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;mainnet&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;https://api.mainnet-beta.solana.com&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Same address. Same &lt;code&gt;getBalance&lt;/code&gt; call. Completely different output:&lt;br&gt;
DEVNET → 0.001159846 SOL | Slot: 459,981,397&lt;br&gt;
MAINNET → 0.069875097 SOL | Slot: 417,486,413&lt;br&gt;&lt;br&gt;
Different balances. Different slots. Completely different transaction histories. I already knew they were separate — but &lt;em&gt;seeing&lt;/em&gt; it side by side in the terminal made it real in a way docs never did.&lt;/p&gt;

&lt;h2&gt;
  
  
  What's still confusing
&lt;/h2&gt;

&lt;p&gt;PDAs — Program Derived Addresses. I understand they're derived from a program + seed with no private key, so only the program can sign for them. But I haven't &lt;em&gt;used&lt;/em&gt; one yet. I can describe them but I can't feel them. That's my Week 3 target.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I'd tell Week-1-me
&lt;/h2&gt;

&lt;p&gt;Stop thinking in tables and rows. Start thinking in accounts and owners. Every piece of state on Solana is an account. Every account has an owner program. Only that program can modify it. That's not a restriction — that's what makes the system trustless.&lt;/p&gt;

&lt;p&gt;Also: devnet is your playground. Break things there first.&lt;/p&gt;




&lt;p&gt;If you're also doing #100DaysOfSolana, drop your DEV.to link below — I want to read what clicked for you.&lt;/p&gt;

&lt;p&gt;→ My code: &lt;a href="https://github.com/gopichandchalla16/100-days-of-solana" rel="noopener noreferrer"&gt;https://github.com/gopichandchalla16/100-days-of-solana&lt;/a&gt;&lt;/p&gt;

</description>
      <category>100daysofsolana</category>
      <category>solana</category>
      <category>web3</category>
      <category>blockchain</category>
    </item>
    <item>
      <title>Your Public Key IS Your Identity: What Web2 Devs Need to Know About Solana</title>
      <dc:creator>Gopichand</dc:creator>
      <pubDate>Tue, 28 Apr 2026 16:55:00 +0000</pubDate>
      <link>https://dev.to/gopichand_dev/your-public-key-is-your-identity-what-web2-devs-need-to-know-about-solana-4lpm</link>
      <guid>https://dev.to/gopichand_dev/your-public-key-is-your-identity-what-web2-devs-need-to-know-about-solana-4lpm</guid>
      <description>&lt;p&gt;If you've been a Web2 developer for any amount of time, you know what identity &lt;br&gt;
looks like: a username in a database, an email address, a session cookie, &lt;br&gt;
maybe an OAuth token from Google. Your "identity" is really just a record that &lt;br&gt;
some company controls. They can delete it. They can lock you out. They can sell &lt;br&gt;
the data. You don't own it — you just borrow it.&lt;/p&gt;

&lt;p&gt;Solana works completely differently. And once you understand how, you can't &lt;br&gt;
unsee it.&lt;/p&gt;
&lt;h2&gt;
  
  
  It Starts with a Keypair
&lt;/h2&gt;

&lt;p&gt;When I started the 100 Days of Solana challenge, the first thing I did was run:&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; wallet.json
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This generated two things:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A &lt;strong&gt;public key&lt;/strong&gt; — a 32-byte Ed25519 address like &lt;code&gt;AWKYsCGBcfGLSz6QpmXzRn7EJ9fRhiJsjYSLDV3c9L9y&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;A &lt;strong&gt;private key&lt;/strong&gt; — stored in &lt;code&gt;wallet.json&lt;/code&gt;, never shared&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That's it. That keypair IS my identity on Solana. No signup form. No email &lt;br&gt;
verification. No "username already taken."&lt;/p&gt;
&lt;h2&gt;
  
  
  The SSH Key Analogy
&lt;/h2&gt;

&lt;p&gt;If you've ever set up a server on AWS or DigitalOcean, you already understand &lt;br&gt;
this model. You generate an SSH keypair, paste the public key into the server's &lt;br&gt;
&lt;code&gt;authorized_keys&lt;/code&gt; file, and prove your identity by holding the private key.&lt;/p&gt;

&lt;p&gt;Solana works identically — except instead of one server, it's the entire &lt;br&gt;
global network. Every node on Solana knows your public key. You prove ownership &lt;br&gt;
by signing transactions with your private key.&lt;/p&gt;

&lt;p&gt;The difference from Web2 is critical: &lt;strong&gt;no company stores your credentials&lt;/strong&gt;. &lt;br&gt;
There is no database row. There is no admin who can reset your password or &lt;br&gt;
lock your account.&lt;/p&gt;
&lt;h2&gt;
  
  
  What a Solana Address Actually Is
&lt;/h2&gt;

&lt;p&gt;A Solana address is a Base58-encoded 32-byte Ed25519 public key. Base58 was &lt;br&gt;
chosen deliberately — it removes visually confusing characters like &lt;code&gt;0&lt;/code&gt;, &lt;code&gt;O&lt;/code&gt;, &lt;br&gt;
&lt;code&gt;I&lt;/code&gt;, and &lt;code&gt;l&lt;/code&gt; to prevent copy-paste mistakes.&lt;/p&gt;

&lt;p&gt;In Web2, your username lives in someone's Postgres table:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;users&lt;/span&gt; &lt;span class="k"&gt;WHERE&lt;/span&gt; &lt;span class="n"&gt;username&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'gopichand'&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, your identity is derived from math. It exists everywhere and nowhere &lt;br&gt;
simultaneously — it only becomes real when you sign something with the private key.&lt;/p&gt;

&lt;h2&gt;
  
  
  Cryptographic Ownership vs Company-Granted Access
&lt;/h2&gt;

&lt;p&gt;Here's the most important mental shift:&lt;/p&gt;

&lt;p&gt;In Web2, you "own" your account because a company says you do. Twitter can &lt;br&gt;
ban you. Your bank can freeze your account. Google can lock your Gmail. You &lt;br&gt;
have access because they allow it.&lt;/p&gt;

&lt;p&gt;On Solana, ownership is cryptographic. If you hold the private key, you control &lt;br&gt;
the account — period. No appeal process, no customer support ticket, no &lt;br&gt;
waiting for a human to review your case.&lt;/p&gt;

&lt;p&gt;This is both powerful and terrifying. Lose your private key? Your funds are gone &lt;br&gt;
forever. No recovery email. That's why seed phrases and hardware wallets exist.&lt;/p&gt;

&lt;h2&gt;
  
  
  Identity Enables Everything Else
&lt;/h2&gt;

&lt;p&gt;Once I had a keypair, I could:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Receive devnet SOL&lt;/strong&gt; — just by sharing my public key&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Connect a browser wallet&lt;/strong&gt; — Phantom connected on Day 4 without me ever 
sharing my private key&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Sign transactions&lt;/strong&gt; — prove I authorized a transfer without revealing 
my secret&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Own tokens and NFTs&lt;/strong&gt; — because ownership is just a signed record on-chain&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This one keypair is the foundation for token ownership, dApp interactions, &lt;br&gt;
governance votes, and on-chain reputation — across every application on the &lt;br&gt;
network, without asking anyone's permission.&lt;/p&gt;

&lt;h2&gt;
  
  
  Which Wallet Type Should You Use?
&lt;/h2&gt;

&lt;p&gt;During Day 5 of the challenge, I compared three wallet types:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Wallet&lt;/th&gt;
&lt;th&gt;Key Storage&lt;/th&gt;
&lt;th&gt;Best For&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;CLI (&lt;code&gt;id.json&lt;/code&gt;)&lt;/td&gt;
&lt;td&gt;Plaintext file&lt;/td&gt;
&lt;td&gt;Devnet scripting&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Browser (Phantom)&lt;/td&gt;
&lt;td&gt;Encrypted + password&lt;/td&gt;
&lt;td&gt;dApp interactions&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Mobile (Phantom)&lt;/td&gt;
&lt;td&gt;Hardware-backed + biometrics&lt;/td&gt;
&lt;td&gt;Personal daily use&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Hardware (Ledger)&lt;/td&gt;
&lt;td&gt;Never leaves device&lt;/td&gt;
&lt;td&gt;Long-term storage&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The underlying keypair concept is identical across all of them. What differs &lt;br&gt;
is where the private key lives and how it's protected.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Big Takeaway
&lt;/h2&gt;

&lt;p&gt;In Web2, identity is a database record owned by someone else.&lt;br&gt;
In Web3, identity is a mathematical keypair owned by you.&lt;/p&gt;

&lt;p&gt;Your public key is your username, your account number, and your proof of &lt;br&gt;
existence on the network — all at once. The private key is the only password &lt;br&gt;
that matters, and only you should ever hold it.&lt;/p&gt;

&lt;p&gt;I'm documenting every step of this journey publicly as part of the &lt;br&gt;
&lt;a href="https://www.mlh.com/events/100-days-of-solana/challenges" rel="noopener noreferrer"&gt;100 Days of Solana&lt;/a&gt; &lt;br&gt;
challenge by MLH.&lt;/p&gt;

&lt;p&gt;All my code is on GitHub: &lt;a href="https://github.com/gopichandchalla16/100-days-of-solana" rel="noopener noreferrer"&gt;github.com/gopichandchalla16/100-days-of-solana&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Follow along if you're on the same journey! 🚀&lt;/p&gt;

&lt;h1&gt;
  
  
  100daysofsolana #solana #web3 #blockchain #beginners
&lt;/h1&gt;

</description>
      <category>100daysofsolana</category>
      <category>solana</category>
      <category>web3</category>
      <category>blockchain</category>
    </item>
    <item>
      <title>Starting 100 Days of Solana as an AI Web3 Builder.</title>
      <dc:creator>Gopichand</dc:creator>
      <pubDate>Sat, 18 Apr 2026 05:39:28 +0000</pubDate>
      <link>https://dev.to/gopichand_dev/starting-100-days-of-solana-as-an-ai-x-web3-builder-3p8l</link>
      <guid>https://dev.to/gopichand_dev/starting-100-days-of-solana-as-an-ai-x-web3-builder-3p8l</guid>
      <description>&lt;p&gt;Hi DEV community 👋&lt;br&gt;
I’m Gopichand, a CSE graduate from India, and I’m building in public around AI × Web3.&lt;br&gt;
I’ve recently joined the 100 Days of Solana challenge, and I want to use this journey to learn Solana step by step, share what I build, and connect with other developers who are exploring web3.&lt;/p&gt;

&lt;p&gt;My goal is simple: learn by doing, document the process, and turn each small win into a real project.&lt;br&gt;
I’ll be sharing updates, experiments, and lessons as I go.&lt;/p&gt;

&lt;p&gt;Excited to be here — and I’d love to hear from anyone else learning Solana or building on chain.                                              &lt;/p&gt;


&lt;h3&gt;
  
  
  Follow my progress:
&lt;/h3&gt;


&lt;div class="crayons-card c-embed text-styles text-styles--secondary"&gt;
    &lt;div class="c-embed__content"&gt;
        &lt;div class="c-embed__cover"&gt;
          &lt;a href="https://github.com/gopichandchalla16" class="c-link align-middle" rel="noopener noreferrer"&gt;
            &lt;img alt="" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Favatars.githubusercontent.com%2Fu%2F162360009%3Fv%3D4%3Fs%3D400" height="460" class="m-0" width="460"&gt;
          &lt;/a&gt;
        &lt;/div&gt;
      &lt;div class="c-embed__body"&gt;
        &lt;h2 class="fs-xl lh-tight"&gt;
          &lt;a href="https://github.com/gopichandchalla16" rel="noopener noreferrer" class="c-link"&gt;
            gopichandchalla16 (Gopichand) · GitHub
          &lt;/a&gt;
        &lt;/h2&gt;
          &lt;p class="truncate-at-3"&gt;
            AI × Web3 builder | LangChain · Solidity · On-chain agents | Building in public daily → @GopichandAI - gopichandchalla16
          &lt;/p&gt;
        &lt;div class="color-secondary fs-s flex items-center"&gt;
            &lt;img alt="favicon" class="c-embed__favicon m-0 mr-2 radius-0" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.githubassets.com%2Ffavicons%2Ffavicon.svg" width="32" height="32"&gt;
          github.com
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;



&lt;div class="crayons-card c-embed text-styles text-styles--secondary"&gt;
    &lt;div class="c-embed__content"&gt;
      &lt;div class="c-embed__body flex items-center justify-between"&gt;
        &lt;a href="https://x.com/GopichandAI" rel="noopener noreferrer" class="c-link fw-bold flex items-center"&gt;
          &lt;span class="mr-2"&gt;x.com&lt;/span&gt;
          

        &lt;/a&gt;
      &lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;


</description>
      <category>web3</category>
      <category>solana</category>
      <category>ai</category>
      <category>learning</category>
    </item>
  </channel>
</rss>
