<?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.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>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>
