<?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: Murtala Mudi</title>
    <description>The latest articles on DEV Community by Murtala Mudi (@mudimurtala).</description>
    <link>https://dev.to/mudimurtala</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%2F1278866%2F141c2df9-98a9-4b93-b3c2-29bdc8424024.jpeg</url>
      <title>DEV Community: Murtala Mudi</title>
      <link>https://dev.to/mudimurtala</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/mudimurtala"/>
    <language>en</language>
    <item>
      <title>Pidgin English Can Now Find Your Spare Parts. Here Is How I Built That.</title>
      <dc:creator>Murtala Mudi</dc:creator>
      <pubDate>Sat, 06 Jun 2026 15:04:09 +0000</pubDate>
      <link>https://dev.to/mudimurtala/pidgin-english-can-now-find-your-spare-parts-here-is-how-i-built-that-31md</link>
      <guid>https://dev.to/mudimurtala/pidgin-english-can-now-find-your-spare-parts-here-is-how-i-built-that-31md</guid>
      <description>&lt;h2&gt;
  
  
  I Started Building SpareIQ Months Ago and Never Finished It. Here Is What Happened When I Finally Did.
&lt;/h2&gt;

&lt;p&gt;&lt;em&gt;This is a submission for the &lt;a href="https://dev.to/challenges/github-2026-05-21"&gt;GitHub Finish-Up-A-Thon Challenge&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;




&lt;p&gt;My dad was an auto mechanic and spare parts dealer for most of my childhood.&lt;/p&gt;

&lt;p&gt;I watched customers walk into his shop every single day with the same problem. They needed a part but did not know what it was called. They would describe it by saying things like "the round rubber thing near the wheel that makes that sound" or "the metal piece that holds the side mirror." My dad always knew what they meant. But he was one person, and he could not always be there.&lt;/p&gt;

&lt;p&gt;That image follows me for years.&lt;/p&gt;

&lt;p&gt;When I started learning to code, I thought about building something for that problem. A platform for Nigerian auto parts shops where customers could search in the way they actually speak, not in the way an engineer would write a parts catalogue. I started it. I got a basic structure up. And then I stopped.&lt;/p&gt;

&lt;p&gt;Life moved. I kept learning. The project sat there, half built, doing nothing.&lt;/p&gt;

&lt;p&gt;The Finish-Up-A-Thon gave me a reason to go back.&lt;/p&gt;




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

&lt;p&gt;&lt;strong&gt;SpareIQ&lt;/strong&gt; is an AI-powered spare parts inventory and finder platform built specifically for the Nigerian auto market.&lt;/p&gt;

&lt;p&gt;The feature I am most proud of is the AI Part Finder. You open it and you type however you would naturally describe a part. In English or in Pidgin. Or in whatever words come to you. The AI identifies the technical name, categorises it, and searches the live inventory for matching results.&lt;/p&gt;

&lt;p&gt;I typed "the thing wey dey stop my Toyota when I press the pedal" and it came back with Brake Pads.&lt;/p&gt;

&lt;p&gt;Beyond the AI finder, SpareIQ has a public storefront with search and category filters, part detail pages, a protected shop owner dashboard, full inventory management with image uploads, and Firebase powering everything in real time.&lt;/p&gt;

&lt;p&gt;🌐 &lt;strong&gt;Live site:&lt;/strong&gt; &lt;a href="https://spareiq.netlify.app" rel="noopener noreferrer"&gt;https://spareiq.netlify.app&lt;/a&gt;&lt;br&gt;
💻 &lt;strong&gt;GitHub:&lt;/strong&gt; &lt;a href="https://github.com/mudimurtala/spareiq" rel="noopener noreferrer"&gt;https://github.com/mudimurtala/spareiq&lt;/a&gt;&lt;/p&gt;


&lt;h2&gt;
  
  
  Demo
&lt;/h2&gt;

&lt;p&gt;Here is a full walkthrough of SpareIQ in action:&lt;/p&gt;

&lt;p&gt;  &lt;iframe src="https://www.youtube.com/embed/QFgRmeWX6hc"&gt;
  &lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;If you want to try the AI finder yourself, go to &lt;a href="https://spareiq.netlify.app" rel="noopener noreferrer"&gt;spareiq.netlify.app&lt;/a&gt; and type:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;"the thing wey dey stop my Toyota when I press the pedal"&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Watch what happens.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Comeback Story
&lt;/h2&gt;

&lt;p&gt;When I came back to this project, I spent the first hour just clicking through it trying to understand what past-me had built.&lt;/p&gt;

&lt;p&gt;Some things worked. The routing was there. Firebase was connected. Parts were showing on the page. But a lot of things were quietly broken in ways that would have embarrassed me if I had shown it to anyone.&lt;/p&gt;

&lt;p&gt;The View Details button on every single part card did nothing. I first thought I could see soem errors and I isn't redirecting me to a wrong page, it just does nothing when I clicked on it. When I looked at the code, I found this sitting inside the button:&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="nx"&gt;onClick&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{(&lt;/span&gt;&lt;span class="nx"&gt;e&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;e&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;preventDefault&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="p"&gt;}}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A prompt I made earlier had added that to prevent some imagined double-click issue and in doing so had silently cancelled every navigation attempt. I removed the line and the whole thing started working.&lt;/p&gt;

&lt;p&gt;The dashboard had a sidebar on the overview page. But the moment you clicked into Inventory Management or Add New Part, the sidebar disappeared completely. I were stranded on a page with no way back to the dashboard except the browser back button. I created a reusable DashboardLayout component and wrapped every dashboard page with it.&lt;/p&gt;

&lt;p&gt;The hero search on the homepage would take you to the Parts page but your search term vanished the moment you got there. The Parts page had no idea what you had typed. I added a URL query parameter so the search term travels with you and pre-fills the results.&lt;/p&gt;

&lt;p&gt;Those were the fixes.&lt;/p&gt;

&lt;p&gt;Then came the things I added.&lt;/p&gt;

&lt;p&gt;The homepage was too tall. You had to scroll before you even saw a single part. I reduced the hero padding and the featured parts grid jumped into view immediately.&lt;/p&gt;

&lt;p&gt;I added a Browse by Category section between the hero and the featured parts. Clickable cards, one for each category: Engine, Brakes, Electrical, Suspension, Body Parts, Cooling System. Each one filters the parts page when clicked.&lt;/p&gt;

&lt;p&gt;I added a Why SpareIQ section with three columns explaining what makes the platform different. And I built a proper footer with contact details, quick links, and the copyright line that makes any website feel finished.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Before this challenge:&lt;/strong&gt; I had broken buttons, disappearing navigation, a homepage that hid its own content.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;After the challenge:&lt;/strong&gt; I have a deployed product I would actually show someone.&lt;/p&gt;




&lt;h2&gt;
  
  
  My Experience with GitHub Copilot
&lt;/h2&gt;

&lt;p&gt;I want to be honest about how I used GitHub Copilot because I think the honest version is more useful than the polished version.&lt;/p&gt;

&lt;p&gt;GitHub Copilot did not build SpareIQ. I did. But it was the difference between building something in five days and building something in five weeks.&lt;/p&gt;

&lt;p&gt;The way it actually worked was this: I would come to the project knowing what I wanted to build. I had the architecture in my head, the feature requirement was clear, the user experience I wanted was decided. Then I would write a detailed prompt, sometimes paragraph length, explaining the exact file, the exact behaviour, the stack constraints, the edge cases. Copilot would generate the code. I would read it, test it, and decide if it was right.&lt;/p&gt;

&lt;p&gt;That last step is the important one. There were times Copilot generated code that compiled perfectly and looked completely reasonable but was subtly wrong. The &lt;code&gt;e.preventDefault()&lt;/code&gt; bug I mentioned was not something Copilot introduced during the Finish-Up-A-Thon. It was something added months earlier during the original build and I had not caught it because I did not read carefully enough.&lt;/p&gt;

&lt;p&gt;The lesson I keep learning is that AI tools make me faster but they do not replace my understanding. If you cannot read the code and know whether it is right, you will miss the quiet bugs.&lt;/p&gt;

&lt;p&gt;One moment that impressed me was when I gave Copilot a large prompt to implement the DashboardLayout component and wrap all the dashboard pages. It generated the code, ran the build, caught a TypeScript error it had introduced, fixed it, ran the build again, and only stopped when it passed. I watched that loop happen without me doing anything. That kind of self-correction used to take me hours of debugging.&lt;/p&gt;

&lt;p&gt;The AI Finder itself was the most interesting part to build. The first model I tried returned quota errors. Copilot helped me swap the entire request structure to a different provider model cleanly and quickly. When the inventory matching was returning wrong results because it was matching on category alone, I described the scoring system I wanted in plain words and Copilot implemented keyword extraction with weighted scoring that made the matching accurate.&lt;/p&gt;

&lt;p&gt;Working with GitHub Copilot on this project felt like having a very fast contractor who needs precise instructions and cannot always be trusted without supervision. When I gave it clear direction, the output was excellent. When I was vague, the output was generic. The quality of what it built was almost entirely determined by the quality of what I asked for.&lt;/p&gt;




&lt;h2&gt;
  
  
  What SpareIQ Is Built With
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;React 18&lt;/li&gt;
&lt;li&gt;TypeScript&lt;/li&gt;
&lt;li&gt;Tailwind CSS&lt;/li&gt;
&lt;li&gt;Vite&lt;/li&gt;
&lt;li&gt;React Router v6&lt;/li&gt;
&lt;li&gt;TanStack Query&lt;/li&gt;
&lt;li&gt;Firebase Auth and Firestore&lt;/li&gt;
&lt;li&gt;Cloudinary for image hosting&lt;/li&gt;
&lt;li&gt;OpenRouter API for AI model access&lt;/li&gt;
&lt;li&gt;Netlify for deployment&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  One Last Thing
&lt;/h2&gt;

&lt;p&gt;I am a self-taught developer from Nigeria. I studied Microbiology at university and started coding because I wanted to solve problems I actually understood.&lt;/p&gt;

&lt;p&gt;SpareIQ came from watching my dad talk to customers who could not name the part they needed and thinking there should be a better way. &lt;/p&gt;

&lt;p&gt;Finishing it felt like closing a loop that had been open for a long time.&lt;/p&gt;

&lt;p&gt;If you have your own half-built thing sitting somewhere, I hope this is the nudge to go back to it.&lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>githubchallenge</category>
      <category>ai</category>
      <category>firebase</category>
    </item>
    <item>
      <title>I Spent My Time Building Tokens on Solana. What Got Me Surprised? Read This.</title>
      <dc:creator>Murtala Mudi</dc:creator>
      <pubDate>Thu, 28 May 2026 04:06:07 +0000</pubDate>
      <link>https://dev.to/mudimurtala/i-spent-my-time-building-tokens-on-solana-what-got-me-surprised-read-this-4alh</link>
      <guid>https://dev.to/mudimurtala/i-spent-my-time-building-tokens-on-solana-what-got-me-surprised-read-this-4alh</guid>
      <description>&lt;p&gt;I want to tell you something nobody told me before I started this.&lt;/p&gt;

&lt;p&gt;Building tokens on Solana is not complicated. The CLI does most of the heavy lifting. You run a few commands, something appears on-chain, and you can verify it in a block explorer within seconds. That part is genuinely smooth.&lt;/p&gt;

&lt;p&gt;What is not smooth is the moment you realize how differently Solana thinks about money, ownership, and rules compared to everything you have built in Web2. That mental shift is where the real learning lives.&lt;/p&gt;

&lt;p&gt;This is my honest account of building tokens on Solana for the first time, covering everything from a basic mint to soulbound credentials that cannot be transferred. I am a web developer still learning. These are my notes from the trenches.&lt;/p&gt;




&lt;h2&gt;
  
  
  Starting point: creating a basic token
&lt;/h2&gt;

&lt;p&gt;The first thing I learned is that every token on Solana has two separate things: a &lt;strong&gt;mint&lt;/strong&gt; and a &lt;strong&gt;token account&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;The mint is the factory definition. It says: this token exists, it has 6 decimal places, and this wallet has authority to create more of it. The token account is where actual tokens live. Your wallet cannot hold tokens directly. It holds token accounts, one per token type, each one like a separate pocket.&lt;/p&gt;

&lt;p&gt;Creating a token is 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;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;That &lt;code&gt;--program-id&lt;/code&gt; flag points at the Token Extensions Program, also called Token-2022. It is the newer, more powerful version of Solana's original token program. I used it from day one because it supports features the original program cannot do.&lt;/p&gt;

&lt;p&gt;After creating the mint I had to create a token account and then mint supply into 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 create-account &lt;span class="o"&gt;[&lt;/span&gt;MINT_ADDRESS]
spl-token mint &lt;span class="o"&gt;[&lt;/span&gt;MINT_ADDRESS] 1000
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Simple. But without metadata my token was just a random address. Nobody looking at it would know what it was.&lt;/p&gt;




&lt;h2&gt;
  
  
  The metadata moment
&lt;/h2&gt;

&lt;p&gt;In Web2, if you launch an in-app currency you give it a name, a symbol, maybe a logo. You store that information in your database.&lt;/p&gt;

&lt;p&gt;On Solana, with the Token Extensions Program, you can store metadata directly on the mint account itself. On-chain. No separate service, no external database.&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 initialize-metadata &lt;span class="o"&gt;[&lt;/span&gt;MINT] &lt;span class="s2"&gt;"100DaysCoin"&lt;/span&gt; &lt;span class="s2"&gt;"HUNDO"&lt;/span&gt; &lt;span class="s2"&gt;"https://..."&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;One command and my token had a name and symbol visible to any wallet, any explorer, any app that looked it up. That felt significant. The token's identity is part of the token, not hosted somewhere that could go down or change.&lt;/p&gt;




&lt;h2&gt;
  
  
  Transfer fees without a backend
&lt;/h2&gt;

&lt;p&gt;This is the one that genuinely stopped me for a moment.&lt;/p&gt;

&lt;p&gt;In Web2, if you want to take a cut of every transaction on your platform you build middleware. You intercept transfers, calculate the fee, route it to your account, handle edge cases, write tests for the fee logic, and pray nothing breaks when someone sends an unusual amount.&lt;/p&gt;

&lt;p&gt;On Solana you configure it once 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; 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;Two hundred basis points is 2%. From that point on, every transfer of this token automatically withholds 2% in the recipient's token account. Not in my account. Withheld in theirs, but locked so only I can collect it.&lt;/p&gt;

&lt;p&gt;When I transferred 100 tokens to a second wallet the recipient got 98. The other 2 sat withheld. Then I ran one command to collect them:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;spl-token withdraw-withheld-tokens &lt;span class="o"&gt;[&lt;/span&gt;MY_TOKEN_ACCOUNT] &lt;span class="o"&gt;[&lt;/span&gt;RECIPIENT_TOKEN_ACCOUNT]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;No backend. No payment processor. No middleware. The Token Extensions Program enforced the fee at the protocol level on every single transfer. I cannot think of an equivalent in Web2 that does not involve significant infrastructure.&lt;/p&gt;




&lt;h2&gt;
  
  
  The experiment I enjoyed most: making a token that cannot move
&lt;/h2&gt;

&lt;p&gt;The last thing I built this week was a non-transferable token. The blockchain world calls these soulbound tokens.&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 my wallet then deliberately tried to send 5 to another wallet. The transaction failed:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Error: Non-transferable token
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That error was the point. The Token Extensions Program rejected the transfer at the protocol level. Not an application rule that a clever developer could bypass. The program itself will not process the instruction.&lt;/p&gt;

&lt;p&gt;What I found interesting is that burning still works. The holder can destroy their own tokens. They just cannot give them to anyone else. So it is not about trapping someone with something they do not want. It is about making credentials that prove something about a specific wallet.&lt;/p&gt;

&lt;p&gt;Think about course completion certificates. Currently these live in databases that companies control. On Solana a non-transferable token could represent that certificate permanently, tied to the wallet that earned it, verifiable by anyone, controlled by nobody.&lt;/p&gt;




&lt;h2&gt;
  
  
  What actually surprised me
&lt;/h2&gt;

&lt;p&gt;The thing that surprised me most was not a feature. It was a constraint.&lt;/p&gt;

&lt;p&gt;Extensions must be added at mint creation. You cannot add a transfer fee to an existing token. You cannot make a transferable token non-transferable after the fact. The configuration is baked in permanently.&lt;/p&gt;

&lt;p&gt;Coming from Web2 where you can alter a database schema or deploy a new version of an API this feels restrictive. But it is also what makes these tokens trustworthy. When someone receives a token with a 2% transfer fee they know that fee will always be 2%. Nobody can change the rules after the fact. The immutability is the feature.&lt;/p&gt;

&lt;p&gt;That is the mental shift Solana keeps asking you to make. What feels like a limitation is often a design decision that creates trust without requiring anyone to trust a specific person or company.&lt;/p&gt;




&lt;h2&gt;
  
  
  Where I am headed
&lt;/h2&gt;

&lt;p&gt;I have been doing the #100DaysOfSolana challenge with Major League Hacking. I am five weeks in. Next up is moving beyond tokens into actual programs and on-chain logic.&lt;/p&gt;

&lt;p&gt;If you are a Web2 developer curious about Solana my honest advice is this: do not wait until you understand the theory. Build something small, watch it work, watch it fail, and let the confusion lead you to the understanding. The concepts will click faster through a terminal than through documentation.&lt;/p&gt;

&lt;p&gt;See you in the next post.&lt;/p&gt;

&lt;h1&gt;
  
  
  100DaysOfSolana #Solana #buildinpublic
&lt;/h1&gt;

</description>
      <category>solana</category>
      <category>blockchain</category>
      <category>webdev</category>
      <category>beginners</category>
    </item>
    <item>
      <title>Solana's Account Model Explained By Someone Who Got Confused By It First</title>
      <dc:creator>Murtala Mudi</dc:creator>
      <pubDate>Wed, 27 May 2026 02:47:08 +0000</pubDate>
      <link>https://dev.to/mudimurtala/solanas-account-model-explained-by-someone-who-got-confused-by-it-first-5b8</link>
      <guid>https://dev.to/mudimurtala/solanas-account-model-explained-by-someone-who-got-confused-by-it-first-5b8</guid>
      <description>&lt;p&gt;Let me start with a confession.&lt;/p&gt;

&lt;p&gt;When I first heard "everything on Solana is an account," I nodded like I understood. I did not understand. I just did not want to look confused.&lt;/p&gt;

&lt;p&gt;It took me actually running commands in the terminal, seeing things break, reading error messages I did not expect, and sitting with the output until it clicked. That is what this post is about. Not the polished explanation. The actual journey.&lt;/p&gt;




&lt;h2&gt;
  
  
  Forget your database mental model first
&lt;/h2&gt;

&lt;p&gt;Coming from Web2, my brain was wired to think in tables. You have a users table, a transactions table, maybe a products table. Each one has columns. Each row is a record. Data and code live completely separately.&lt;/p&gt;

&lt;p&gt;Solana does not work like that.&lt;/p&gt;

&lt;p&gt;On Solana, everything is an account. Your wallet is an account. A smart contract is an account. The token you hold is an account. The metadata of that token is an account. All of them. Every single thing on the network is described by the same five fields.&lt;/p&gt;

&lt;p&gt;I know that sounds weird. Keep reading.&lt;/p&gt;




&lt;h2&gt;
  
  
  The five fields that describe everything
&lt;/h2&gt;

&lt;p&gt;When I ran &lt;code&gt;solana account&lt;/code&gt; against my own devnet wallet, here is what came back:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Public Key: CN9aDJfMzzQiR7mFGZCVbJHXKjdVAAiZJsEsmVTS3ZQo
Balance: 0.00158688 SOL
Owner: 11111111111111111111111111111111
Executable: false
Rent Epoch: 18446744073709551615
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Let me break down what each of these actually means in plain terms:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Lamports (Balance):&lt;/strong&gt; The SOL balance stored in the account. 1 SOL equals exactly one billion lamports. The network always works in lamports internally.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Data:&lt;/strong&gt; A raw byte array. For a basic wallet this is zero bytes because wallets do not store custom data. For a smart contract account this contains compiled program code.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Owner:&lt;/strong&gt; The program that has authority over this account. See that long string of ones? That is the System Program. It is Solana's root-level kernel. It owns every regular wallet on the network.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Executable:&lt;/strong&gt; A simple true or false. If true, the bytes in the data field are treated as runnable program code. If false, it is just storage.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Rent Epoch:&lt;/strong&gt; A legacy field from when Solana charged ongoing rent for storage. That system is deprecated now. For rent-exempt accounts it just shows a very large number. You can mostly ignore it.&lt;/p&gt;




&lt;h2&gt;
  
  
  The thing that actually broke my Web2 brain
&lt;/h2&gt;

&lt;p&gt;Here is the part that tripped me up the most.&lt;/p&gt;

&lt;p&gt;In Ethereum and in traditional backends, code and data are often coupled. A smart contract manages its own internal storage. You deploy the contract and the storage comes with it.&lt;/p&gt;

&lt;p&gt;On Solana, programs are completely stateless.&lt;/p&gt;

&lt;p&gt;The program account holds code. A separate data account holds state. They are two different accounts. The program owns the data account, meaning only that program can write to it. When you call a program, you explicitly pass in every account it will need to read from or write to during that transaction.&lt;/p&gt;

&lt;p&gt;The analogy that finally made it click for me: think of a Solana program like a web server. The server runs code but it does not store your user photos inside its own binary. It reads from and writes to external storage. The program is the server. The data accounts are the storage.&lt;/p&gt;

&lt;p&gt;This separation is also what makes Solana fast. Because you declare every account a transaction will touch upfront, validators know in advance which pieces of state are being used. Transactions that touch different accounts can run in parallel without stepping on each other.&lt;/p&gt;




&lt;h2&gt;
  
  
  The error that taught me more than any tutorial
&lt;/h2&gt;

&lt;p&gt;I wanted to create an account manually with 100 bytes of storage. I found a command in some tutorial and ran it:&lt;br&gt;
&lt;/p&gt;

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

&lt;/div&gt;



&lt;p&gt;My terminal responded with:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;error: The subcommand &lt;span class="s1"&gt;'create-account'&lt;/span&gt; wasn&lt;span class="s1"&gt;'t recognized
       Did you mean '&lt;/span&gt;create-stake-account&lt;span class="s1"&gt;'?
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Web3 tooling moves fast. Tutorials get stale. That is just the reality.&lt;/p&gt;

&lt;p&gt;But the error pushed me to understand the actual underlying mechanic. An account on Solana does not exist until it holds lamports. Because validators store the entire network state in RAM for speed, you have to pay for the space you occupy. This deposit is called being rent-exempt.&lt;/p&gt;

&lt;p&gt;I ran this to find out exactly how much 100 bytes would cost:&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 100
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The answer was &lt;code&gt;0.00158688 SOL&lt;/code&gt;. Then I funded the address directly:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;solana transfer CN9aDJfMzzQiR7mFGZCVbJHXKjdVAAiZJsEsmVTS3ZQo 0.00158688 &lt;span class="nt"&gt;--allow-unfunded-recipient&lt;/span&gt; &lt;span class="nt"&gt;--url&lt;/span&gt; devnet
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The transaction confirmed, the System Program recognized the incoming lamports, and the account came to life on the ledger. No special creation command needed. Just meeting the minimum balance requirement.&lt;/p&gt;

&lt;p&gt;That one broken command taught me more about how Solana actually works than three hours of reading documentation did.&lt;/p&gt;




&lt;h2&gt;
  
  
  What I am carrying forward from this
&lt;/h2&gt;

&lt;p&gt;Just three things:&lt;/p&gt;

&lt;p&gt;Programs and data are always separate. Get comfortable with that. It is very different from how most Web2 backends are structured but once it clicks it makes sense.&lt;/p&gt;

&lt;p&gt;Space is a financial decision. When you build on Solana you cannot just add columns to a database and call it a day. Every byte of on-chain storage costs real tokens. You think carefully about your data layout before you deploy.&lt;/p&gt;

&lt;p&gt;When CLI commands break, drop to the fundamentals. Do not spend an hour looking for the right command. Understand what you are actually trying to do at the network level, then find the simplest path to accomplish it.&lt;/p&gt;

&lt;p&gt;I am still learning. Some days the terminal cooperates and some days it absolutely does not. But I understand a lot more about what is happening under the hood than I did two weeks ago.&lt;/p&gt;

&lt;p&gt;If you are also on this journey and something I said clicked or confused you, say so in the comments. I read them.&lt;/p&gt;

&lt;h1&gt;
  
  
  100DaysOfSolana #Solana #Web3 #beginners
&lt;/h1&gt;

</description>
      <category>100daysofsolana</category>
      <category>web3</category>
      <category>solana</category>
      <category>beginners</category>
    </item>
    <item>
      <title>100 Days of Solana — Day 20: I Tried to Break Solana and It Charged Me for It</title>
      <dc:creator>Murtala Mudi</dc:creator>
      <pubDate>Tue, 26 May 2026 11:53:01 +0000</pubDate>
      <link>https://dev.to/mudimurtala/100-days-of-solana-day-20-i-tried-to-break-solana-and-it-charged-me-for-it-2jpj</link>
      <guid>https://dev.to/mudimurtala/100-days-of-solana-day-20-i-tried-to-break-solana-and-it-charged-me-for-it-2jpj</guid>
      <description>&lt;p&gt;Let me tell you about the moment Solana surprised me.&lt;/p&gt;

&lt;p&gt;I was building a transfer script this week. Nothing fancy, just a tool that moves SOL from one wallet to another programmatically. I wanted to see what happens when a transaction fails on-chain. Not a simulation. Not a dry run. An actual failed transaction sent straight to the network.&lt;/p&gt;

&lt;p&gt;So I deliberately tried to transfer 500 SOL from a wallet holding about 5.5 SOL.&lt;/p&gt;

&lt;p&gt;Obviously it was going to fail. That was the point.&lt;/p&gt;

&lt;p&gt;What I did not expect was the bill.&lt;/p&gt;




&lt;h2&gt;
  
  
  Failure is not free on Solana
&lt;/h2&gt;

&lt;p&gt;In Web2, when a database transaction rolls back, nothing happens to your infrastructure costs in that moment. The operation failed, the state did not change, you try again. No charge for the failed attempt.&lt;/p&gt;

&lt;p&gt;On Solana, validators are real machines run by real people. When you send a transaction, those machines do actual work before they even get to decide if it succeeds. They ingest it, parse the signatures, verify the accounts, check the bounds. That work costs compute resources.&lt;/p&gt;

&lt;p&gt;So they get paid. Even when your transaction fails.&lt;/p&gt;

&lt;p&gt;Here is exactly what I saw in the terminal after my intentionally broken transfer hit the network:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Transaction executed in slot 465034224:
  Recent Blockhash: ENvhACYop3KqzHZVwcGxmKTCKCvpQtnUotTUiU4K3B4c
  Account 0: srw- cRrbhRLCyJcWV6Tmzti4v7aXXXSaRVckTGwaDCspNZM (fee payer)

  Instruction 0
    Program: 11111111111111111111111111111111
    Transfer { lamports: 500000000000 }

  Status: Error processing Instruction 0: custom program error: 0x1
    Fee: ◎0.000005
    Account 0 balance: ◎5.537975 -&amp;gt; ◎5.537970

  Log Messages:
    Program 11111111111111111111111111111111 invoke [1]
    Transfer: insufficient lamports 5537970000, need 500000000000
    Program 11111111111111111111111111111111 failed: custom program error: 0x1
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Look at that balance line. &lt;code&gt;5.537975 -&amp;gt; 5.537970&lt;/code&gt;. The transfer did not go through. But the wallet still lost &lt;code&gt;0.000005 SOL&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Small amount. Big lesson.&lt;/p&gt;




&lt;h2&gt;
  
  
  What that error code actually means
&lt;/h2&gt;

&lt;p&gt;The runtime returned &lt;code&gt;custom program error: 0x1&lt;/code&gt;. That is not a random code. In Solana's System Program source code, &lt;code&gt;0x1&lt;/code&gt; maps directly to &lt;code&gt;InsufficientFundsForTransfer&lt;/code&gt;. Every error has a specific hex identity. When something breaks, you can trace it back to exactly what went wrong at the program level.&lt;/p&gt;

&lt;p&gt;This is actually useful once you get used to it. Error messages in Web2 backends can be vague. Here everything is explicit and traceable.&lt;/p&gt;




&lt;h2&gt;
  
  
  The pipe pattern changed how I think about building transactions
&lt;/h2&gt;

&lt;p&gt;Something else shifted this week on the code side.&lt;/p&gt;

&lt;p&gt;If you read older Solana tutorials, you will see transactions built like this: create an object, mutate it, add instructions one by one. It is the old way and it works, but the modern &lt;code&gt;@solana/kit&lt;/code&gt; does it differently.&lt;/p&gt;

&lt;p&gt;Everything is a pipeline. You start with a base message and pass it through a series of functions, each one adding something to it:&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;transactionMessage&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;pipe&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="nf"&gt;createTransactionMessage&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;version&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt; &lt;span class="p"&gt;}),&lt;/span&gt;
  &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;tx&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;setTransactionMessageFeePayerSigner&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;signer&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;tx&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
  &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;tx&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;setTransactionMessageLifetimeUsingBlockhash&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;latestBlockhash&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;tx&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
  &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;tx&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;appendTransactionMessageInstruction&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="nf"&gt;getTransferSolInstruction&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
      &lt;span class="na"&gt;source&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;signer&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;destination&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;destinationAddress&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;amount&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;lamportAmount&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;}),&lt;/span&gt;
    &lt;span class="nx"&gt;tx&lt;/span&gt;
  &lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Each step is pure. Nothing mutates. You can read it top to bottom and understand exactly what the transaction contains before it ever touches the network. Coming from JavaScript where we mutate state constantly, this took a little getting used to. But once it clicks it feels cleaner than the old approach.&lt;/p&gt;




&lt;h2&gt;
  
  
  The 1,232 byte limit is real and it forces good habits
&lt;/h2&gt;

&lt;p&gt;One more thing worth knowing. Every Solana transaction has to fit inside 1,232 bytes. That is the network packet size limit and it is not flexible.&lt;/p&gt;

&lt;p&gt;In Web2 you can send massive JSON payloads without thinking about it. On Solana you have to be intentional about how many accounts you include, how you pack your instructions, what you actually need versus what you are dragging along unnecessarily.&lt;/p&gt;

&lt;p&gt;It is a constraint that makes you think more carefully about what you are building. I have started to appreciate that.&lt;/p&gt;




&lt;h2&gt;
  
  
  What I am walking away with from this week
&lt;/h2&gt;

&lt;p&gt;Three things:&lt;/p&gt;

&lt;p&gt;Always simulate before you send. The SDK has pre-flight simulation built in. Use it so your users are not paying fees for errors you could have caught locally.&lt;/p&gt;

&lt;p&gt;Errors are traceable. Hex codes, program logs, account balance diffs. Everything is on-chain and readable. The transparency is actually one of the best parts of building here.&lt;/p&gt;

&lt;p&gt;The functional pipe pattern is worth learning. It makes your transaction construction readable and predictable in a way that feels very different from the object mutation style.&lt;/p&gt;

&lt;p&gt;Twenty days in. Still learning. Still occasionally breaking things on devnet.&lt;/p&gt;

&lt;p&gt;But I understand why things break now, and that is progress.&lt;/p&gt;

&lt;h1&gt;
  
  
  100DaysOfSolana #Solana #Web3 #buildinpublic
&lt;/h1&gt;




&lt;p&gt;&lt;em&gt;Part of my ongoing #100DaysOfSolana journey with Major League Hacking.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>100daysofsolana</category>
      <category>web3</category>
      <category>solana</category>
      <category>blockchain</category>
    </item>
    <item>
      <title>100 Days of Solana — Week 2 Reflection: How Solana Broke My Web2 Brain (In a Good Way)</title>
      <dc:creator>Murtala Mudi</dc:creator>
      <pubDate>Tue, 26 May 2026 06:29:45 +0000</pubDate>
      <link>https://dev.to/mudimurtala/100-days-of-solana-week-2-reflection-how-solana-broke-my-web2-brain-in-a-good-way-2o46</link>
      <guid>https://dev.to/mudimurtala/100-days-of-solana-week-2-reflection-how-solana-broke-my-web2-brain-in-a-good-way-2o46</guid>
      <description>&lt;p&gt;I want to be honest with you.&lt;/p&gt;

&lt;p&gt;When I signed up for the 100 Days of Solana challenge, I thought it was going to be like learning a new JavaScript framework. Same concepts, different syntax. I would pick it up in a few days and move on.&lt;/p&gt;

&lt;p&gt;I was wrong.&lt;/p&gt;

&lt;p&gt;Two weeks in, and Solana has genuinely changed how I think about databases, storage, and what it even means to "store data." I am still a student. I am still figuring things out. But some things clicked this week in a way that I want to write down before they fade, and maybe help someone else who is starting from the same place I was.&lt;/p&gt;




&lt;h2&gt;
  
  
  When things started to make sense: Accounts
&lt;/h2&gt;

&lt;p&gt;The biggest mental shift for me was understanding that on Solana, &lt;strong&gt;everything is an account&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Coming from Web2, that sentence sounds normal until you realize what it actually means. I was expecting something like a database with tables: one table for users, one for tokens, one for transactions. That is not how it works at all.&lt;/p&gt;

&lt;p&gt;On Solana, your wallet is an account. A smart contract is an account. A token is an account. They all use the same underlying structure. The thing that tells them apart is a few fields: whether the account is &lt;code&gt;executable&lt;/code&gt; (code or data?) and who the &lt;code&gt;owner&lt;/code&gt; is (which program controls it?).&lt;/p&gt;

&lt;p&gt;To see this for real, I used the Solana CLI to inspect two accounts side by side:&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 cRrbhRLCyJcWV6Tmzti4v7aXXXSaRVckTGwaDCspNZM
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;My wallet came back with:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Owner:&lt;/strong&gt; &lt;code&gt;11111111111111111111111111111111&lt;/code&gt; (the System Program, Solana's root engine)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Executable:&lt;/strong&gt; &lt;code&gt;false&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Length:&lt;/strong&gt; &lt;code&gt;0 bytes&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Just a record tracking a balance. No custom fields. No tables. Then I queried a live smart contract and the properties flipped completely. &lt;code&gt;Executable&lt;/code&gt; became &lt;code&gt;true&lt;/code&gt;, the owner changed to the BPF Loader, and instead of a balance it returned raw binary data representing compiled program code.&lt;/p&gt;

&lt;p&gt;Same account structure. Totally different purpose. That is when the "global public database" idea stopped being a metaphor and became something I actually understood.&lt;/p&gt;




&lt;h2&gt;
  
  
  Switching environments is just one URL change
&lt;/h2&gt;

&lt;p&gt;In Web2, moving from a staging environment to production is serious work. You update environment variables, run migrations, pray nothing breaks. It is a whole process.&lt;/p&gt;

&lt;p&gt;On Solana? You change one URL.&lt;/p&gt;

&lt;p&gt;I wrote a script using &lt;code&gt;@solana/kit&lt;/code&gt; that queried the same program address on both Devnet and Mainnet at the same time:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;createSolanaRpc&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;devnet&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;mainnet&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="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;@solana/kit&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;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;The output showed the same address holding completely different balances and transaction histories on two separate networks. Same code. Same API calls. But Devnet and Mainnet are isolated ledgers that have never shared state.&lt;/p&gt;

&lt;p&gt;This is actually cleaner than most Web2 staging setups I have seen. The logic does not change at all. Only the data source does.&lt;/p&gt;




&lt;h2&gt;
  
  
  The thing that surprised me most: you pay rent for RAM
&lt;/h2&gt;

&lt;p&gt;This one genuinely caught me off guard.&lt;/p&gt;

&lt;p&gt;In cloud computing, you pay for storage on a hard drive. On Solana, validators store all active account data in RAM, because RAM is what makes the network fast. And RAM is expensive. So the network charges a deposit per byte of data you store.&lt;/p&gt;

&lt;p&gt;It is called &lt;strong&gt;rent&lt;/strong&gt;, and it is refundable. If you close an account later, you get 100% of that deposit back into your wallet.&lt;/p&gt;

&lt;p&gt;I ran these two commands to see the difference:&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
solana rent 1000
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Watching the lamport cost scale up linearly per byte made storage costs feel very real and very predictable in a way that cloud bills never do. And the fact that you can reclaim it? That is a design pattern I have not seen anywhere in traditional backend development.&lt;/p&gt;




&lt;h2&gt;
  
  
  What I am taking into Week 3
&lt;/h2&gt;

&lt;p&gt;I will not pretend everything is smooth. There are still moments where I open the terminal and something fails and I have to go read the docs again. That is just part of it.&lt;/p&gt;

&lt;p&gt;But I am genuinely curious now in a way I was not two weeks ago. How does Solana maintain atomicity when multiple accounts are being updated in one transaction? How do you structure a transaction to avoid bottlenecks when you have a lot of data to write?&lt;/p&gt;

&lt;p&gt;These are questions I could not have even asked on Day 1. The fact that I am asking them now means something is working.&lt;/p&gt;

&lt;p&gt;If you are also doing this challenge or thinking about starting, do not wait until you feel ready. The understanding builds as you go. Week 2 Mudi knows things that Week 0 Mudi had no framework to even imagine.&lt;/p&gt;

&lt;p&gt;See you on Day 14.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;This post is part of my #100DaysOfSolana journey with Major League Hacking. I write about what I learn each week, including the confusing parts.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>100daysofsolana</category>
      <category>web3</category>
      <category>solana</category>
      <category>beginners</category>
    </item>
    <item>
      <title>How Amazing I felt After Sending SOL from my phone to my local Ubuntu terminal</title>
      <dc:creator>Murtala Mudi</dc:creator>
      <pubDate>Mon, 25 May 2026 14:38:34 +0000</pubDate>
      <link>https://dev.to/mudimurtala/how-amazing-i-felt-after-sending-sol-from-my-phone-to-my-local-ubuntu-terminal-4je9</link>
      <guid>https://dev.to/mudimurtala/how-amazing-i-felt-after-sending-sol-from-my-phone-to-my-local-ubuntu-terminal-4je9</guid>
      <description>&lt;p&gt;Hi everyone, I moved to Day 7 of the 100 days of Solana challenge today and I can say It has been very interesting to go through all these experiments. &lt;/p&gt;

&lt;p&gt;I did something really cool. I tried sending devnet SOL from the normal Phantom app I downloaded on my mobile phone straight to the CLI wallet on my local computer's terminal. To be honest, I found it so fascinating that I even did it twice! I just wanted to confirm and see exactly how things work in real-time, and it was amazing to watch the command line balance increase the moment I sent it from my phone.&lt;/p&gt;

&lt;p&gt;While doing this, I noticed a big difference in how these wallets handle security and convenience:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;The Mobile Wallet:&lt;/strong&gt; I noticed that the app on my phone is not that convenient for quick back-and-forth work. Even without minimizing it or moving out of the app, after some seconds or minutes, it just asks me to confirm my fingerprint again. The moment I move out of the app to check something on my browser and come back, it must require that I initiate my fingerprint again. Even though this is not that convenient, I think it is the most secure way to safeguard my digital assets so that they can be accessed by only me and not anyone else.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;The CLI Wallet:&lt;/strong&gt; On the other hand, the one on my local computer is just the most convenient. All I need is to type in the command to do something, either to show the remaining balance or transfer something, and it just works instantly without asking for fingerprints every second. &lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;For my personal use, I will definitely choose the one on my phone because I want my digital assets to be completely secured. But for development and practicing code, the CLI is just the best because it is fast. &lt;/p&gt;

&lt;p&gt;It feels great to see how these different wallets connect on the same network. I am excited to finish this first week and see what is required of me in the next steps! &lt;/p&gt;

&lt;p&gt;Let me know how your first week went!&lt;/p&gt;

</description>
      <category>100daysofsolana</category>
      <category>web3</category>
      <category>blockchain</category>
      <category>beginners</category>
    </item>
    <item>
      <title>Dear Web2 Developer... Solana is here calling</title>
      <dc:creator>Murtala Mudi</dc:creator>
      <pubDate>Mon, 25 May 2026 13:15:21 +0000</pubDate>
      <link>https://dev.to/mudimurtala/dear-web2-developer-solana-is-here-calling-3pmj</link>
      <guid>https://dev.to/mudimurtala/dear-web2-developer-solana-is-here-calling-3pmj</guid>
      <description>&lt;p&gt;As web developers, we know exactly how user accounts work. When a user signs up for an application, we create a &lt;code&gt;users&lt;/code&gt; table in a database. We hash their password, assign them a unique &lt;code&gt;user_id&lt;/code&gt;, and manage their session status using tokens or cookies. &lt;/p&gt;

&lt;p&gt;In this traditional Web2 setup, identity is entirely fragmented. A user is one row in a GitHub database, another row in a LinkedIn database, and another row in their banking application. None of these applications inherently speak to each other, and more importantly, the user doesn't actually own their identity, the company hosting the database actually does. If an admin deletes that database row, that identity is gone.&lt;/p&gt;

&lt;p&gt;As I've been jumping into the first week of the &lt;strong&gt;100 Days of Solana&lt;/strong&gt; challenge, the biggest mental shift wasn't learning a new framework; it was redefining what "identity" actually means on a blockchain.&lt;/p&gt;

&lt;p&gt;Check how identity works on Solana below, I explained it through concepts we're already familiar with in our everyday life.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Model: You Already Use Web3 Identity (I'm assume this to be true)
&lt;/h2&gt;

&lt;p&gt;You connecting to a remote server or you securely pushing code to GitHub using terminal commands, knowingly or unknowingly, you've already used the core engine of Web3 identity: &lt;strong&gt;SSH Keypairs&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;When setting up SSH, you run a command locally to generate a keypair. This gives you:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;A &lt;strong&gt;Public Key&lt;/strong&gt; that you safely share with GitHub or a remote Linux server.&lt;/li&gt;
&lt;li&gt;A &lt;strong&gt;Private Key&lt;/strong&gt; that stays hidden inside your machine's local configuration files.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;When you push code, your machine uses your private key to cryptographically "sign" the request. The server uses your public key to verify that the signature is valid. &lt;/p&gt;

&lt;p&gt;Solana works exactly the same way. On-chain identity starts with an &lt;strong&gt;Ed25519 cryptographic keypair&lt;/strong&gt;. There are no centralized registration forms, no email verifications, and no usernames. The entire network acts as a single, global ledger, and your public key is your universal identity across every single application built on top of it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Breakdown of a Solana Address
&lt;/h2&gt;

&lt;p&gt;In Web2, your username might be &lt;code&gt;dev_muritala&lt;/code&gt;. On Solana, your identity looks more like this: &lt;code&gt;4zMMC9srtxt2nvbBt3wjfBBs71A7HK8gZrybFmZuxyJu&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;This string is a 32-byte public key encoded in &lt;strong&gt;Base58&lt;/strong&gt;. Cryptographers deliberately chose Base58 for blockchain addresses because it optimizes for human scannability by completely removing visually ambiguous characters. You won't find the number &lt;code&gt;0&lt;/code&gt;, uppercase &lt;code&gt;O&lt;/code&gt;, uppercase &lt;code&gt;I&lt;/code&gt;, or lowercase &lt;code&gt;l&lt;/code&gt; in a Solana address. This prevents catastrophic copy-paste mistakes when developers or users are routing assets or interacting with software on-chain.&lt;/p&gt;

&lt;h2&gt;
  
  
  Custody: No Password Reset Flows
&lt;/h2&gt;

&lt;p&gt;The shift in architectural control changes everything when transitioning from Web2 to Web3. &lt;/p&gt;

&lt;p&gt;In Web2, if a user loses their credentials, they click a "Forgot Password" link. An automated backend system sends an email link, verifies their response, and updates the database row. The platform retains ultimate authority over the account data.&lt;/p&gt;

&lt;p&gt;On Solana, there is no corporate admin panel, no support desk, and no password reset flow. Identity is completely non-custodial. &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;If your private key lives as a plaintext file on your local development machine (like a standard CLI development environment), it is highly scriptable but vulnerable if the machine compromises.&lt;/li&gt;
&lt;li&gt;If your private key is encrypted inside a browser extension wallet (like Phantom), it introduces a secure confirmation popup layer before any transaction can execute.&lt;/li&gt;
&lt;li&gt;If it is guarded behind mobile OS secure sandboxes protected by biometric fingerprint scanners, it trades off rapid script deployment for superior physical protection.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;But regardless of the storage medium, &lt;strong&gt;whoever holds the private key owns the identity.&lt;/strong&gt; If you lose the key material or your recovery seed phrase, the identity is mathematically unrecoverable. &lt;/p&gt;

&lt;h2&gt;
  
  
  What This Identity Enables
&lt;/h2&gt;

&lt;p&gt;This cryptographic setup does more than just replace the traditional username/password paradigm. Because your identity is recognized globally by the entire Solana runtime, it acts as a universal passport.&lt;/p&gt;

&lt;p&gt;With a single public key, you can simultaneously hold tokens, execute custom code routines, vote on platform governance protocols, and build a verifiable developer reputation across hundreds of independent ecosystem tools. You don't need to request access or integrate third-party OAuth providers. You simply sign a permission request with your private key, and you are instantly authenticated.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;Transitioning into Web3 as a developer requires looking past the surface level of tools and looking directly at the architectural foundation. Identity on Solana isn't a collection of accounts granted to you by corporate servers, it is a sovereign, mathematical certainty that you control completely from your own local workspace.&lt;/p&gt;

&lt;p&gt;If you are a developer looking to build systems where users have true ownership of their data and actions, understanding the mechanics of the cryptographic keypair is your first real step.&lt;/p&gt;

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