<?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: Mubarak Yakubu</title>
    <description>The latest articles on DEV Community by Mubarak Yakubu (@mubaraqabba).</description>
    <link>https://dev.to/mubaraqabba</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.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3922593%2F1c246f7c-3ea4-4a1a-bc90-f3d4c5d24ea7.png</url>
      <title>DEV Community: Mubarak Yakubu</title>
      <link>https://dev.to/mubaraqabba</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/mubaraqabba"/>
    <language>en</language>
    <item>
      <title>Transfer Fees, Metadata, and Soulbound Tokens: A Tour of Solana Token Extensions</title>
      <dc:creator>Mubarak Yakubu</dc:creator>
      <pubDate>Wed, 17 Jun 2026 17:05:47 +0000</pubDate>
      <link>https://dev.to/mubaraqabba/transfer-fees-metadata-and-soulbound-tokens-a-tour-of-solana-token-extensions-29b6</link>
      <guid>https://dev.to/mubaraqabba/transfer-fees-metadata-and-soulbound-tokens-a-tour-of-solana-token-extensions-29b6</guid>
      <description>&lt;p&gt;In Web2, adding a transfer fee means building middleware. On Solana, it's a flag. I built four tokens in six days. Here's what I learned.&lt;/p&gt;

&lt;p&gt;A few weeks ago, I knew nothing about Solana tokens. I'd used Solana for transfers and read account data, but tokens felt like a black box. I wanted to understand how they actually work, not just copy-paste commands but know what each flag does and why it matters.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;The Basic Mint&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;My first token was barebones. No name. No symbol. Just an address.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;spl-token create-token&lt;br&gt;
&lt;/code&gt;&lt;br&gt;
That's it. One command. A mint account appeared on devnet with a 9-decimal default.&lt;/p&gt;

&lt;p&gt;I created a token account to hold it, then minted 100 tokens to myself.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;spl-token create-account &amp;lt;MINT&amp;gt;&lt;br&gt;
spl-token mint &amp;lt;MINT&amp;gt; 100&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;What surprised me: You can't receive tokens directly into your wallet. You need a token account for each token type. One per token, per wallet.&lt;/p&gt;

&lt;p&gt;The mint is the factory. The token account is your bucket.&lt;/p&gt;
&lt;h2&gt;
  
  
  &lt;strong&gt;Giving It an Identity&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;A token without metadata is just an address. Phantom would show a random string. No one would know what it is.&lt;/p&gt;

&lt;p&gt;I needed a name, symbol and URI.&lt;/p&gt;

&lt;p&gt;But the original Token Program (Tokenkeg...) doesn't support metadata on the mint itself. You'd need a separate account.&lt;/p&gt;

&lt;p&gt;So I used Token Extensions Program (Token-2022) at TokenzQdBN.... It stores metadata directly on the mint.&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 &amp;lt;MINT&amp;gt; &lt;span class="s2"&gt;"100daysofsol"&lt;/span&gt; &lt;span class="s2"&gt;"100DSOL"&lt;/span&gt; &amp;lt;URI&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;One mint. Multiple extensions possible. No separate accounts.&lt;/p&gt;

&lt;p&gt;The URI points to a JSON file with description and image. Wallet UIs read it automatically.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Adding Transfer Fees&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;In Web2, charging a fee on every transaction means building middleware. Handling edge cases. Making sure no one bypasses it.&lt;/p&gt;

&lt;p&gt;On Solana, it's a flag.&lt;/p&gt;

&lt;p&gt;I used Token-2022 again, this time with --transfer-fee-basis-points.&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
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;100 basis points = 1%. I set 200 (2%) with a cap of 5000 displayed tokens.&lt;/p&gt;

&lt;p&gt;Then I minted 1000, transferred 100 to a second wallet, and watched the fee get withheld.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;spl-token transfer &amp;lt;MINT&amp;gt; 100 &amp;lt;RECIPIENT&amp;gt; --expected-fee 2&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Recipient got 98. 2 tokens withheld in their token account. They couldn't touch it.&lt;/p&gt;

&lt;p&gt;Only the withdrawal authority (me) could collect it.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;spl-token withdraw-withheld-tokens &amp;lt;MY_ACCOUNT&amp;gt; &amp;lt;RECIPIENT_ACCOUNT&amp;gt;&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;I swept the fee back. Balance went from 900 to 902.&lt;/p&gt;

&lt;p&gt;The fee logic lives in the mint. Every transfer respects it. No application code required.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Soulbound Tokens&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Not all tokens should be transferable.&lt;/p&gt;

&lt;p&gt;A course completion certificate. A KYC verification. An employee badge. They're credentials, not currency.&lt;/p&gt;

&lt;p&gt;Token-2022 has an extension for this: --enable-non-transferable.&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 to myself. Then tried to transfer 5 to a second wallet.&lt;/p&gt;

&lt;p&gt;It failed.&lt;br&gt;
&lt;em&gt;Program log: Transfer is disabled for this mint&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;The blockchain itself rejected the transaction. No client-side check. No middleware. Protocol-level enforcement.&lt;/p&gt;

&lt;p&gt;But I could still burn them.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;spl-token burn &amp;lt;ACCOUNT&amp;gt; 3&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Balance went from 10 to 7. The holder can destroy tokens but cannot send them away.&lt;/p&gt;

&lt;p&gt;This is how credentials should work on-chain. They prove something about the wallet that holds them. Trading them defeats the purpose.&lt;/p&gt;

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

&lt;p&gt;What surprised me most: the protocol doesn't care about intent. It just enforces rules. When I tried to transfer a non-transferable token, the program rejected it without explanation beyond "Transfer is disabled." No appeal. No admin override. The rules are the rules.&lt;/p&gt;

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

&lt;p&gt;I've built tokens. Now I'm moving to programs.&lt;/p&gt;

&lt;p&gt;I want to build something that does more than transfer value—something that enforces custom logic on-chain. A game. A marketplace. A DAO.&lt;/p&gt;

&lt;p&gt;Follow along. I'm documenting everything.&lt;/p&gt;

</description>
      <category>100daysofsolana</category>
      <category>web3</category>
      <category>blockchain</category>
      <category>ai</category>
    </item>
    <item>
      <title>Solana Accounts for Web2 Developers (You Already Understand Files)</title>
      <dc:creator>Mubarak Yakubu</dc:creator>
      <pubDate>Mon, 08 Jun 2026 17:41:13 +0000</pubDate>
      <link>https://dev.to/mubaraqabba/solana-accounts-for-web2-developers-you-already-understand-files-k90</link>
      <guid>https://dev.to/mubaraqabba/solana-accounts-for-web2-developers-you-already-understand-files-k90</guid>
      <description>&lt;p&gt;I spent the past month building on Solana. Sent transfers. Decoded raw bytes. Inspected accounts until my terminal turned into a wall of hex.&lt;/p&gt;

&lt;p&gt;Along the way, I had to unlearn some Web2 habits.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;One model. No exceptions.&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Your wallet is an account. The program that moves your SOL is an account. The token you just bought? Also an account.&lt;/p&gt;

&lt;p&gt;Solana doesn't have special types. Every account has the same five fields:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Lamports (SOL balance, 1 SOL = 1 billion lamports)&lt;/li&gt;
&lt;li&gt;Data (raw bytes. empty for wallets)&lt;/li&gt;
&lt;li&gt;Owner (the program that can modify this account)&lt;/li&gt;
&lt;li&gt;Executable (true if this account holds code)&lt;/li&gt;
&lt;li&gt;Rent epoch (ignore this. it's deprecated)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Run solana account on any address. Same structure every time.&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 8CtdyqtzBd597eDz9PTZHuuT62vvLc6YXdXjVkHnboqj

Public Key: 8CtdyqtzBd597eDz9PTZHuuT62vvLc6YXdXjVkHnboqj
Balance: 3.93896 SOL
Owner: 11111111111111111111111111111111
Executable: &lt;span class="nb"&gt;false
&lt;/span&gt;Rent Epoch: 18446744073709551615

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  &lt;strong&gt;Who owns what matters&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;The owner field determines control.&lt;/p&gt;

&lt;p&gt;My wallet is owned by the System Program &lt;em&gt;(111...111)&lt;/em&gt;. Only the System Program can deduct SOL from it. I sign. The program executes.&lt;/p&gt;

&lt;p&gt;A token account is owned by the Token Program. Only that program can move tokens.&lt;/p&gt;

&lt;p&gt;In Web2, your app authorizes changes. On Solana, the program that owns the account authorizes changes. Your signature proves you approved it.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Programs have no memory&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;This was the hardest shift.&lt;/p&gt;

&lt;p&gt;In Node.js, my app holds variables in memory. App and state live together.&lt;/p&gt;

&lt;p&gt;On Solana, a program account holds code. Nothing else. No variables. No state.&lt;/p&gt;

&lt;p&gt;State lives in separate data accounts.&lt;/p&gt;

&lt;p&gt;A program reads from its data accounts, does math, writes back. It never stores anything itself.&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;// In Web2, you store state in variables&lt;/span&gt;
&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;counter&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="nx"&gt;counter&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;counter&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="c1"&gt;// On Solana, you read from a data account, modify, write back&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;dataAccount&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;fetchAccount&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;counterAddress&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;counter&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;dataAccount&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="nx"&gt;counter&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;counter&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;writeAccount&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;counterAddress&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;counter&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Why? Update the program without losing data. One program, many data accounts. Programs stay pure.&lt;/p&gt;

&lt;p&gt;The Token Program is 36 bytes of code. The mint accounts it controls? Separate accounts. Owned by the Token Program. Code in one place. State in another.&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
Owner: BPFLoaderUpgradeab1e11111111111111111111111
Executable: &lt;span class="nb"&gt;true
&lt;/span&gt;Length: 36 bytes

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  &lt;strong&gt;Rent isn't rent&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Every account needs a minimum SOL balance based on data size. For a basic wallet with zero data: &lt;em&gt;~0.00089 SOL&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Pay once. Store forever. Close the account, get your SOL back.&lt;/p&gt;

&lt;p&gt;It's a deposit. Not monthly rent.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;You already know this&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;A file has a name, contents, and permissions.&lt;/p&gt;

&lt;p&gt;A Solana account has an address, data, and an owner.&lt;/p&gt;

&lt;p&gt;Same pattern. Different environment.&lt;/p&gt;

&lt;p&gt;Took me a few weeks to stop overcomplicating it.&lt;/p&gt;

</description>
      <category>100daysofsolana</category>
      <category>blockchain</category>
      <category>web3</category>
      <category>beginners</category>
    </item>
    <item>
      <title>I Hit the 1,232-Byte Wall So You Don't Have To</title>
      <dc:creator>Mubarak Yakubu</dc:creator>
      <pubDate>Mon, 25 May 2026 04:56:21 +0000</pubDate>
      <link>https://dev.to/mubaraqabba/i-hit-the-1232-byte-wall-so-you-dont-have-to-10</link>
      <guid>https://dev.to/mubaraqabba/i-hit-the-1232-byte-wall-so-you-dont-have-to-10</guid>
      <description>&lt;p&gt;I was building a batch transfer tool. Send SOL to 20 recipients in one transaction. Simple, right?&lt;/p&gt;

&lt;p&gt;Wrong.&lt;/p&gt;

&lt;p&gt;The RPC rejected my transaction with: Transaction too large: 1400 &amp;gt; 1232&lt;/p&gt;

&lt;p&gt;I had no idea what 1232 meant. Now I do.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;The Limit&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Every Solana transaction — transfer, swap, mint, everything — has a hard cap: 1,232 bytes.&lt;/p&gt;

&lt;p&gt;Not 1,232 lines of code. 1,232 bytes&lt;/p&gt;

&lt;p&gt;Where does 1,232 come from? IPv6 packet size. The internet requires every packet to be at least 1,280 bytes. Subtract 48 bytes for network headers. Leftover: 1,232 bytes.&lt;/p&gt;

&lt;p&gt;Solana didn't choose this number. The internet did.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Why I Hit the Wall&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;My batch transfer had 22 accounts (sender + 20 recipients + system program). Each account key takes 32 bytes. 22 × 32 = 704 bytes just for the addresses.&lt;/p&gt;

&lt;p&gt;Add signature (64 bytes), header (3 bytes), blockhash (32 bytes), instructions (variable). Total: ~1,148 bytes.&lt;/p&gt;

&lt;p&gt;Dangerously close to 1,232. Add one more recipient? Fail. Add a memo? Fail. Add any complexity? Fail.&lt;/p&gt;

&lt;p&gt;I was 84 bytes from the edge. That's one short sentence.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;The Escape&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;I learned about Address Lookup Tables (ALTs).&lt;/p&gt;

&lt;p&gt;An ALT is an on-chain account that stores addresses. Once stored, a transaction references them by a 1-byte index instead of the full 32-byte address.&lt;/p&gt;

&lt;p&gt;Think of it like a URL shortener. You store the long URL once. Everyone else uses the short code.&lt;/p&gt;

&lt;p&gt;Same concept.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;What Changed&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;My batch transfer went from 22 full addresses to 1 ALT address + 21 one-byte indexes.&lt;/p&gt;

&lt;p&gt;Before: 704 bytes for addresses&lt;br&gt;
After: 32 bytes (ALT) + 21 bytes (indexes) = 53 bytes&lt;/p&gt;

&lt;p&gt;My transaction size dropped from ~1,148 bytes to ~562 bytes.&lt;/p&gt;

&lt;p&gt;Suddenly I had room. Add more recipients. Add a memo. Add error handling. All fit.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;What I Learned&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;The 1,232-byte limit isn't arbitrary. It's Solana prioritizing network speed over developer convenience.&lt;/p&gt;

&lt;p&gt;Fragmented packets are slower. Solana said no fragmentation. One packet. One transaction. Done.&lt;/p&gt;

&lt;p&gt;This forces constraints:&lt;/p&gt;

&lt;p&gt;List every account upfront&lt;/p&gt;

&lt;p&gt;Batch operations need ALTs&lt;/p&gt;

&lt;p&gt;Complex DeFi requires careful design&lt;/p&gt;

&lt;p&gt;But the network stays fast. 4,000+ transactions per second fast.&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%2Fzxladeqg3c40dvh10p2w.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%2Fzxladeqg3c40dvh10p2w.png" alt=" " width="800" height="373"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>100daysofsolana</category>
      <category>webdev</category>
      <category>solanadev</category>
      <category>mlh</category>
    </item>
    <item>
      <title>Two Weeks of Solana: Familiar but Different</title>
      <dc:creator>Mubarak Yakubu</dc:creator>
      <pubDate>Sun, 17 May 2026 06:35:08 +0000</pubDate>
      <link>https://dev.to/mubaraqabba/two-weeks-of-solana-familiar-but-different-163m</link>
      <guid>https://dev.to/mubaraqabba/two-weeks-of-solana-familiar-but-different-163m</guid>
      <description>&lt;p&gt;I came into this with small Web3 experience. Most of the early lessons felt normal, familiar. But the "everything is an account" model on Solana took extra attention. It's not like a traditional database at all.&lt;/p&gt;

&lt;p&gt;What surprised me: the publicity and decentralized aspects. No API keys. No permission to read. Just an RPC endpoint and an address. Compared to traditional APIs, it's easier and faster. No restrictions. No rate limits. Just query and get data.&lt;/p&gt;

&lt;p&gt;What's next? Nothing specific I'm unsure about yet. I want to start building a real project on Solana using my Web2 expertise. Two weeks in. Ready for the next phase.&lt;/p&gt;

</description>
      <category>100daysofsolana</category>
      <category>web3</category>
      <category>beginners</category>
      <category>blacklivesmatter</category>
    </item>
    <item>
      <title>Solana Identity for Web2 Developers: You Already Understand Keypairs.</title>
      <dc:creator>Mubarak Yakubu</dc:creator>
      <pubDate>Sun, 10 May 2026 00:10:42 +0000</pubDate>
      <link>https://dev.to/mubaraqabba/solana-identity-for-web2-developers-you-already-understand-keypairs-20i</link>
      <guid>https://dev.to/mubaraqabba/solana-identity-for-web2-developers-you-already-understand-keypairs-20i</guid>
      <description>&lt;p&gt;If you've ever generated an SSH key pair, you already understand Solana identity.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;ssh-keygen -t ed25519&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;That command gives you two things:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;id_ed25519.pub (public key) → put this on servers&lt;/li&gt;
&lt;li&gt;id_ed25519 (private key) → stays on your machine&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;When you SSH into a server, you prove your identity by signing a challenge with your private key. The server verifies the signature using your public key. Your private key never leaves your machine.&lt;/p&gt;

&lt;p&gt;Solana works exactly the same way. But instead of one server, the entire network verifies your signature. Instead of just SSH access, your keypair gives you ownership over tokens, programs, and data across every app on Solana.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What a Solana address actually is&lt;/strong&gt;&lt;br&gt;
A Solana address is a 32-byte Ed25519 public key, encoded in Base58. Example:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;14grJpemFaf88c8tiVb77W7TYg2W3ir6pfkKz3YjhhZ5&lt;br&gt;
&lt;/code&gt;&lt;br&gt;
Compare that to a Web2 username stored in a database. A company granted you that username. They can revoke it, change it, or lock you out. Your Solana address needs no permission from anyone. It exists because the math says it exists.&lt;/p&gt;

&lt;p&gt;On Solana, the only person who can sign transactions for an address is the holder of the private key. No company. No admin panel. No "forgot password" flow.&lt;/p&gt;

&lt;p&gt;This is liberating and terrifying. Liberating because no one can take your assets. Terrifying because if you lose your private key, no one can give it back.&lt;/p&gt;

&lt;p&gt;That's why wallets exist: to manage private keys securely.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What on-chain identity enables&lt;/strong&gt;&lt;br&gt;
A keypair isn't just for logging in. Everything you do on Solana ties back to your address:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Token ownership → your address holds NFTs or fungible tokens&lt;/li&gt;
&lt;li&gt;Program interactions → you call smart contracts&lt;/li&gt;
&lt;li&gt;Governance → your tokens vote on DAO proposals&lt;/li&gt;
&lt;li&gt;Reputation → other addresses see your on-chain history&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;And because it's cryptographic and self-custodied, it works across every application on the network without asking permission.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The mental shift&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Web2 identity is borrowed. Solana identity is owned.&lt;/p&gt;

&lt;p&gt;When you "Sign in with Google," you're asking Google to vouch for you. When you sign a transaction with your Solana wallet, you prove your identity directly to the network.&lt;/p&gt;

&lt;p&gt;This is the shift that unlocks everything else in Web3. No intermediaries. Just math.&lt;/p&gt;

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