<?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: Elizabeth Afolabi</title>
    <description>The latest articles on DEV Community by Elizabeth Afolabi (@devduchess).</description>
    <link>https://dev.to/devduchess</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%2F1464865%2Fe9f2f036-f4c0-4e09-8d7c-a3b74ae5dc30.jpeg</url>
      <title>DEV Community: Elizabeth Afolabi</title>
      <link>https://dev.to/devduchess</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/devduchess"/>
    <language>en</language>
    <item>
      <title>Why One Solana Token Needs Three Different Addresses</title>
      <dc:creator>Elizabeth Afolabi</dc:creator>
      <pubDate>Sun, 24 May 2026 12:06:08 +0000</pubDate>
      <link>https://dev.to/devduchess/why-one-solana-token-needs-three-different-addresses-2ocf</link>
      <guid>https://dev.to/devduchess/why-one-solana-token-needs-three-different-addresses-2ocf</guid>
      <description>&lt;p&gt;If you’re new to Solana, one of the most confusing things about SPL tokens is why a single token interaction can involve multiple addresses.&lt;br&gt;
This post breaks down the difference between mint addresses, wallet addresses, and token accounts, and why understanding that distinction makes the Solana CLI suddenly start making sense.&lt;/p&gt;

&lt;p&gt;When I first started working with SPL tokens, I kept running into the same problem. Every action seemed to require a different address. I wasn’t just dealing with “a token.”&lt;br&gt;
I was dealing with a mint address, a wallet address and a token account address.&lt;br&gt;
But the more I used the CLI, the more I realized something:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;I wasn’t interacting with one system. I was interacting with three different responsibilities.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Where the Address Model Starts Becoming Important
&lt;/h2&gt;

&lt;p&gt;What made things confusing was that different commands kept expecting different kinds of addresses.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;spl-token create-token&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;This gives you a mint address.&lt;/p&gt;

&lt;p&gt;Then I would move to:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;spl-token create-account &amp;lt;MINT_ADDRESS&amp;gt;&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Now I have a token account.&lt;/p&gt;

&lt;p&gt;And finally:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;spl-token transfer &amp;lt;MINT_ADDRESS&amp;gt; 100 &amp;lt;RECIPIENT_WALLET_ADDRESS&amp;gt;&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;This is where things started to feel inconsistent.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Why is the mint address used here?&lt;/li&gt;
&lt;li&gt;Why is the wallet used here?&lt;/li&gt;
&lt;li&gt;And where exactly is the token actually stored?&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  The key idea I was missing
&lt;/h3&gt;

&lt;p&gt;What helped everything click was this:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;A wallet does not hold tokens on Solana.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That sounds simple, but it changes everything.&lt;br&gt;
Because if wallets don’t hold tokens… then something else must. That “something else” is the token account.&lt;/p&gt;

&lt;h2&gt;
  
  
  The three-address model
&lt;/h2&gt;

&lt;p&gt;Once I mapped everything properly, the system became much clearer.&lt;/p&gt;

&lt;p&gt;1.Mint Address — the token identity&lt;/p&gt;

&lt;p&gt;This is created when you run:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;spl-token create-token&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;The mint defines what the token is, its rules and its supply. It doesn’t hold tokens, it defines the token itself.&lt;/p&gt;

&lt;p&gt;2.Wallet Address — the owner identity&lt;/p&gt;

&lt;p&gt;This is your actual account (keypair). It:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;signs transactions&lt;/li&gt;
&lt;li&gt;authorizes actions&lt;/li&gt;
&lt;li&gt;represents the user&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;But it does not store token balances, it only provides authority.&lt;/p&gt;

&lt;p&gt;3.Token Account — the balance container&lt;/p&gt;

&lt;p&gt;This is where things actually live.&lt;/p&gt;

&lt;p&gt;Created using:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;spl-token create-account &amp;lt;MINT_ADDRESS&amp;gt;&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;A token account stores:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;balance&lt;/li&gt;
&lt;li&gt;association to one mint&lt;/li&gt;
&lt;li&gt;ownership by a wallet&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;So the real structure is:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;one wallet → many token accounts → one per mint relationship&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  Why balance requires BOTH wallet and mint
&lt;/h3&gt;

&lt;p&gt;This was one of the most confusing parts for me:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;spl-token balance --owner &amp;lt;WALLET_ADDRESS&amp;gt; &amp;lt;MINT_ADDRESS&amp;gt;&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Why both?&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;wallet = who owns the tokens&lt;/li&gt;
&lt;li&gt;mint = which token we are talking about&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A wallet can hold:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;USDC&lt;/li&gt;
&lt;li&gt;custom tokens&lt;/li&gt;
&lt;li&gt;NFTs&lt;/li&gt;
&lt;li&gt;multiple SPL tokens&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;So the CLI needs both inputs to find the correct token account. Under the hood, it:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;derives the associated token account (ATA) for that wallet + mint pair&lt;/li&gt;
&lt;li&gt;then reads the balance from it&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That’s why both are required.&lt;br&gt;
&lt;a href="https://solana.com/docs/tokens/basics/create-token-account?utm_source=chatgpt.com" rel="noopener noreferrer"&gt;Associated Token Accounts&lt;/a&gt; are derived automatically from a wallet + mint pair using Solana’s ATA standard.&lt;/p&gt;

&lt;h3&gt;
  
  
  Why transfers feel “indirect”
&lt;/h3&gt;

&lt;p&gt;This command made more sense after understanding the model:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;spl-token transfer &amp;lt;MINT_ADDRESS&amp;gt; 100 &amp;lt;RECIPIENT_WALLET_ADDRESS&amp;gt; --fund-recipient&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;The key detail is:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;tokens are not sent to wallets directly&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;They are sent to token accounts. So what actually happens is:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;system checks if recipient has a token account for this mint&lt;/li&gt;
&lt;li&gt;if not, &lt;code&gt;--fund-recipient&lt;/code&gt; creates it&lt;/li&gt;
&lt;li&gt;tokens are then transferred into that account&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;That’s why the wallet address is enough, but only because the system can derive the token account from it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Token-2022 and programmable assets
&lt;/h2&gt;

&lt;p&gt;One of the most interesting parts of this journey was Token-2022.&lt;/p&gt;

&lt;p&gt;Unlike standard SPL tokens, Token-2022 introduces extensions that add behavior directly at the protocol level.&lt;br&gt;
Solana’s &lt;a href="https://solana.com/docs/tokens/extensions?utm_source=chatgpt.com" rel="noopener noreferrer"&gt;Token Extensions documentation&lt;/a&gt; explains how these extensions allow tokens to enforce behavior directly at the protocol level.&lt;/p&gt;

&lt;p&gt;Examples include transfer fees, non-transferable tokens, metadata extensions, custom rules enforced by the token program itself&lt;/p&gt;

&lt;p&gt;What stood out to me is this:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;These rules must be defined when the mint is created. They cannot be added later.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That changes how I think about tokens entirely. They are no longer just balances. They are programmable assets.&lt;/p&gt;

&lt;h2&gt;
  
  
  What actually changed for me
&lt;/h2&gt;

&lt;p&gt;At first, the CLI felt inconsistent because I was thinking in terms of:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;“a token”&lt;/li&gt;
&lt;li&gt;“a wallet”&lt;/li&gt;
&lt;li&gt;“a transfer”&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;But Solana doesn’t structure it that way. Instead, it separates responsibilities:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;mint =&amp;gt; defines what exists&lt;/li&gt;
&lt;li&gt;wallet =&amp;gt; defines who controls actions&lt;/li&gt;
&lt;li&gt;token account =&amp;gt; defines what is owned&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Once I saw that pattern, the system stopped feeling fragmented. It started feeling intentional, even elegant.&lt;/p&gt;

&lt;p&gt;The biggest shift for me was realizing this:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Solana doesn’t store tokens in wallets. It stores relationships between identities, assets, and balances.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Now that the address model finally makes sense to me, I’m starting to see Token-2022 less as “tokens with extra features” and more as programmable assets with rules built directly into the protocol.&lt;/p&gt;

&lt;p&gt;I’m curious to see how far that model can go as the challenge continues.&lt;/p&gt;

</description>
      <category>100daysofsolana</category>
      <category>blockchain</category>
      <category>webdev</category>
      <category>beginners</category>
    </item>
    <item>
      <title>Understanding Solana’s Account Model From a Web2 Perspective</title>
      <dc:creator>Elizabeth Afolabi</dc:creator>
      <pubDate>Tue, 19 May 2026 22:27:50 +0000</pubDate>
      <link>https://dev.to/devduchess/understanding-solanas-account-model-from-a-web2-perspective-1k35</link>
      <guid>https://dev.to/devduchess/understanding-solanas-account-model-from-a-web2-perspective-1k35</guid>
      <description>&lt;p&gt;In a previous article I posted on my #100daysofsolana journey, I wrote about how everything on Solana is an account. I spoke briefly about the difference between wallet accounts and program accounts. You can read the article &lt;a href="https://dev.to/bettyafolabi/when-wallet-stopped-meaning-wallet-my-solana-journey-3ap9"&gt;here&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In this article, we will go more in depth because I now have more knowledge after inspecting various accounts over the past few days.&lt;/p&gt;

&lt;h3&gt;
  
  
  Everything is an account. But not all accounts are the same
&lt;/h3&gt;

&lt;p&gt;Unlike Ethereum, which separates wallet accounts from smart contracts, Solana uses the same model for all accounts. They all have the same five fields, but what differs is the meaning and value of those fields.&lt;/p&gt;

&lt;h3&gt;
  
  
  The Account's Five Fields
&lt;/h3&gt;

&lt;p&gt;Every account on the Solana network has these five fields. Here's what they actually mean:&lt;/p&gt;

&lt;p&gt;1.Lamports&lt;br&gt;
This is the field that carries information on how much the account holds. Solana stores balances in lamports.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;1 SOL = 1 billion lamports.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Sometimes, depending on how you are viewing the account structure, this field shows up as Balance with the value in SOL. Just know it's showing the same thing in a more human readable format.&lt;/p&gt;

&lt;p&gt;2.Data&lt;br&gt;
The data field refers to the storage space the account occupies. In Web2, this is similar to a database entry. It is stored as a raw byte array.&lt;br&gt;
For example, the Token Program's data field looks like this in the raw output:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;0000: 02 00 00 00 27 f1 90 b1 e8 ca df f9 f8 fc 45 cb
0010: d3 af 98 b8 8e 5f ac 42 0d 97 dd 37 ce 71 4c 44
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In a more readable format, it shows up as `Length: 36 (0x24) bytes.&lt;/p&gt;

&lt;p&gt;Wallet accounts have an empty or zero data field because they are simple SOL holders. They don't store anything beyond a balance. But program accounts, token accounts, and NFTs all have data because they store state.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F74tctx87ntd43z3qrv0t.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F74tctx87ntd43z3qrv0t.png" alt="screenshot of cli output of a wallet account on solana devnet" width="800" height="108"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fruqt3dm18j5ccaaoq7ra.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fruqt3dm18j5ccaaoq7ra.png" alt="Screenshot of cli output of vote program account and sysvars account" width="799" height="294"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This is also where something important happens: &lt;br&gt;
Programs on Solana don't store their own state inside themselves. A program's executable code lives in one account, and the data it reads or writes lives in completely separate accounts. So when you see a program account with only 36 bytes, that's not where the user balances are, those live in their own individual accounts that the program manages externally.&lt;/p&gt;

&lt;p&gt;3.Owner&lt;br&gt;
This field tells us which program controls and is able to modify the account. Wallet accounts are owned by the System Program. Program accounts are typically owned by the BPF Loader. Built-in system programs, like the System Program itself, are owned by the Native Loader.&lt;br&gt;
Solana has a security model in place such that a program can only write to the accounts it owns.&lt;/p&gt;

&lt;p&gt;4.Executable&lt;br&gt;
This is a boolean field that returns true or false. It tells us whether the account has a set of instructions written in code that it can run. &lt;br&gt;
Program accounts have &lt;code&gt;executable: true&lt;/code&gt; because they run programmed instructions. Other accounts like wallets and token accounts have &lt;code&gt;executable: false&lt;/code&gt; because they don't run code, they just hold state.&lt;/p&gt;

&lt;p&gt;5.Rent Epoch&lt;br&gt;
Solana has a rent system; a cost for storing data on-chain. The rent epoch field was originally designed to show when the next rent would be deducted from the balance. Currently, accounts have been made rent-exempt by being funded with enough SOL upfront, which made this field less important.&lt;/p&gt;

&lt;h3&gt;
  
  
  How to think about it as a Web2 developer
&lt;/h3&gt;

&lt;p&gt;We can compare Solana's account model to how a React app makes calls to a backend REST API in Web2. Stay with me.&lt;/p&gt;

&lt;p&gt;The Solana program is like a backend API, and accounts are the databases the API reads or writes to. The frontend sends a request, and the backend(the program), executes what changes need to happen. On Solana, that request is called a transaction. Just like a REST API hits a POST or PUT endpoint, a Solana transaction invokes a specific program instruction.&lt;/p&gt;

&lt;p&gt;The main thing to remember is that neither system stores information inside the request handler. Instead, data is stored separately, in a database in Web2, or in accounts on Solana. These accounts are like rows in a database. Each one holds some information about the application, identified by a special key.&lt;/p&gt;

&lt;p&gt;So when you look at a Solana account, you can think of it like a record in a database:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The public key is like the identifier for the record&lt;/li&gt;
&lt;li&gt;The data field is the actual information in the record&lt;/li&gt;
&lt;li&gt;The lamports field is like a balance or credit attached to the record&lt;/li&gt;
&lt;li&gt;The owner field is the service that is allowed to make changes to the record&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Solana's ownership rules
&lt;/h3&gt;

&lt;p&gt;Like I mentioned earlier, in Solana only the owner of an account can modify it. This sounds straightforward, but let's drive it home from both a Web2 and Solana perspective.&lt;/p&gt;

&lt;p&gt;Only the owner can modify an account, but anyone can credit it. Meaning anyone can send SOL to any account. This is the security model Solana enforces at the protocol level.&lt;/p&gt;

&lt;p&gt;Just like in a REST API system, only the backend service that owns a database table is allowed to modify the rows. Other services can request to read the data, but they can't write to it unless they're authorized. Solana enforces the same idea, only the owner program is allowed to mutate the account's data.&lt;/p&gt;

&lt;p&gt;So if a token account is owned by the Token Program, no other program can directly edit its balance. They must go through the Token Program's instructions, just like a frontend must go through the correct API endpoint instead of writing directly to the database.&lt;/p&gt;

&lt;h3&gt;
  
  
  What are rent exemptions?
&lt;/h3&gt;

&lt;p&gt;I mentioned that recently, accounts have been made rent-exempt. What does that actually mean?&lt;/p&gt;

&lt;p&gt;In Solana, every account is like data stored on-chain, and you have to pay some amount to keep it there. That's rent. For a basic account with no extra data, it's roughly 0.00089 SOL. &lt;br&gt;
But it's not a fixed amount, it's calculated based on the size of the data an account holds using the rent calculation formula.&lt;/p&gt;

&lt;p&gt;In older versions of the model, this rent was collected periodically. When an account didn't have enough lamports, the network would reclaim it.But now, instead of paying periodically, you just fund the account with enough SOL to meet the minimum balance threshold. That makes it permanently rent-exempt. The SOL isn't spent, it's held as a deposit. Close the account, and you get it back.&lt;/p&gt;

&lt;p&gt;You can check the rent exemption amount two ways:&lt;/p&gt;

&lt;p&gt;Using the RPC method: &lt;code&gt;getMinimumBalanceForRentExemption&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Or through the CLI:&lt;/p&gt;

&lt;p&gt;&lt;code&gt; solana rent &amp;lt;DATA_SIZE&amp;gt;&lt;/code&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Conclusion
&lt;/h3&gt;

&lt;p&gt;When I started this journey, fields like &lt;code&gt;owner, executable, and rent epoch&lt;/code&gt; were a bit abstract to me. I was staring at output I couldn't read.&lt;/p&gt;

&lt;p&gt;Now I can look at any account on Solana and tell you exactly what it is and what it does just from those five fields. That's the account model, and if you've followed along to this point, you can too.&lt;/p&gt;

&lt;p&gt;Everything on Solana is an account. What differs is just the configuration. That's it. That's the whole foundation.&lt;br&gt;
Once that lands, a lot of other Solana concepts start making sense on their own.&lt;/p&gt;

&lt;p&gt;If you want to make it stick, don't just take my word for it. Run this yourself:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;solana account $(solana adress)&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Then try it on the Token Program, then the System Program. See the same five fields show up every time. That's the moment it clicks.&lt;/p&gt;

</description>
      <category>beginners</category>
      <category>solana</category>
      <category>web3</category>
      <category>blockchain</category>
    </item>
    <item>
      <title>What Failed Transactions Taught Me About Solana</title>
      <dc:creator>Elizabeth Afolabi</dc:creator>
      <pubDate>Mon, 11 May 2026 17:44:10 +0000</pubDate>
      <link>https://dev.to/devduchess/what-failed-transactions-taught-me-about-solana-49m0</link>
      <guid>https://dev.to/devduchess/what-failed-transactions-taught-me-about-solana-49m0</guid>
      <description>&lt;p&gt;A few days ago, Solana transactions still felt abstract to me.&lt;/p&gt;

&lt;p&gt;I understood the general idea:&lt;br&gt;
sign a transaction -&amp;gt; send it to the network -&amp;gt; it gets processed.&lt;/p&gt;

&lt;p&gt;But during this phase of the challenge, things started becoming more concrete.&lt;/p&gt;

&lt;p&gt;Especially when I began inspecting transaction confirmations, experimenting with transfer tooling, and intentionally triggering failed transactions.&lt;/p&gt;

&lt;p&gt;That’s when Solana stopped feeling like “crypto magic” and started feeling more like engineering.&lt;/p&gt;

&lt;h3&gt;
  
  
  My Initial Mental Model
&lt;/h3&gt;

&lt;p&gt;At first, I thought of transactions almost like simple requests:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;send SOL from A -&amp;gt; B&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;And that was basically it.&lt;/p&gt;

&lt;p&gt;But after exploring transaction anatomy more deeply, I realized a Solana transaction is much more structured than that.&lt;/p&gt;

&lt;p&gt;It’s:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;a signed request&lt;/li&gt;
&lt;li&gt;containing instructions&lt;/li&gt;
&lt;li&gt;executed by programs&lt;/li&gt;
&lt;li&gt;against accounts&lt;/li&gt;
&lt;li&gt;processed by a distributed validator network&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The official Solana transaction docs also helped clarify how signatures, instructions, and accounts are structured internally:&lt;br&gt;
&lt;a href="https://solana.com/docs/core/transactions" rel="noopener noreferrer"&gt;https://solana.com/docs/core/transactions&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;That mental shift changed how I started looking at the system.&lt;/p&gt;

&lt;p&gt;One thing that made transactions easier to understand was comparing them to requests in traditional applications.&lt;/p&gt;

&lt;p&gt;Not exactly the same, but close enough to create a mental bridge.&lt;/p&gt;

&lt;p&gt;You construct a request, send it to a distributed network, wait for processing, and eventually receive confirmation back.&lt;/p&gt;

&lt;p&gt;But unlike a normal API request:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;transactions require signatures&lt;/li&gt;
&lt;li&gt;they expire after some time&lt;/li&gt;
&lt;li&gt;validators participate in confirming them&lt;/li&gt;
&lt;li&gt;and failure can still cost money&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Failed Transactions Changed My Perspective
&lt;/h3&gt;

&lt;p&gt;I intentionally triggered an insufficient funds error expecting the transaction to simply reject without consequences.&lt;/p&gt;

&lt;p&gt;Instead, I learned something important:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;failed transactions can still consume fees.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That caught me off guard.&lt;/p&gt;

&lt;p&gt;Even though the transfer failed, validators still processed the transaction and performed work, so fees were still deducted.&lt;/p&gt;

&lt;p&gt;That completely changed how I thought about blockchain transactions.&lt;/p&gt;

&lt;p&gt;In most frontend workflows, a failed action usually just returns an error.&lt;/p&gt;

&lt;p&gt;Here, failure still has a cost.&lt;/p&gt;

&lt;p&gt;And suddenly concepts like validation, simulation, balance checks and transaction design started feeling much more important.&lt;/p&gt;

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

&lt;h3&gt;
  
  
  Confirmation States Made More Sense Than I Expected
&lt;/h3&gt;

&lt;p&gt;Another concept that stood out to me was transaction confirmation.&lt;/p&gt;

&lt;p&gt;I learned that transactions move through stages like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Processed&lt;/li&gt;
&lt;li&gt;Confirmed&lt;/li&gt;
&lt;li&gt;Finalized&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;At first, these looked like simple status labels.&lt;/p&gt;

&lt;p&gt;But they actually represent increasing confidence from the network.&lt;/p&gt;

&lt;p&gt;A validator first processes the transaction, then the network reaches supermajority agreement.&lt;/p&gt;

&lt;p&gt;Then enough blocks are added afterward that reversal becomes practically impossible.&lt;/p&gt;

&lt;p&gt;I still don’t fully understand concepts like polling and finality yet, but this was the first time transaction processing started feeling like a real distributed system instead of just a black box.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fi8nj4pnfmbqs8qpw9cwi.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fi8nj4pnfmbqs8qpw9cwi.png" alt="Screenshot of the progress of a transaction being finalized on the terminal using solana CLI" width="800" height="340"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  One Detail That Really Stuck With Me
&lt;/h4&gt;

&lt;p&gt;Another thing that genuinely surprised me was learning this:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Creating a wallet does not automatically create an on-chain account.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The address exists immediately because it’s derived from a keypair.&lt;/p&gt;

&lt;p&gt;But the actual account only exists on-chain once it’s funded.&lt;/p&gt;

&lt;p&gt;That distinction felt subtle at first, but it changed how I think about accounts on Solana.&lt;/p&gt;

&lt;p&gt;Storage and state feel much more explicit here than I initially expected.&lt;/p&gt;

&lt;h3&gt;
  
  
  What Changed for Me
&lt;/h3&gt;

&lt;p&gt;The more I explored transactions, the less Solana felt like “just sending crypto.”&lt;/p&gt;

&lt;p&gt;It started feeling more like interacting with a distributed system with strict rules around state, validation, execution and confirmation.&lt;/p&gt;

&lt;p&gt;I also became much more aware of the complexity underneath even simple transfers.&lt;/p&gt;

&lt;p&gt;Before this, a transaction felt like:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;click send and wait&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Now I see:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;validators processing requests&lt;/li&gt;
&lt;li&gt;confirmation stages&lt;/li&gt;
&lt;li&gt;execution rules&lt;/li&gt;
&lt;li&gt;signatures&lt;/li&gt;
&lt;li&gt;fees&lt;/li&gt;
&lt;li&gt;and failure handling&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;all happening underneath something that initially looked simple.&lt;/p&gt;

&lt;p&gt;I still don’t fully understand every part of the system yet, but transactions no longer feel abstract to me anymore.&lt;/p&gt;

&lt;p&gt;And honestly, that’s probably the biggest shift from this week.&lt;/p&gt;

</description>
      <category>100daysofsolana</category>
      <category>web3</category>
      <category>blockchain</category>
      <category>solana</category>
    </item>
    <item>
      <title>Day 16 of my 100 Days of Solana</title>
      <dc:creator>Elizabeth Afolabi</dc:creator>
      <pubDate>Thu, 07 May 2026 02:11:51 +0000</pubDate>
      <link>https://dev.to/devduchess/day-16-of-my-100-days-of-solana-2bga</link>
      <guid>https://dev.to/devduchess/day-16-of-my-100-days-of-solana-2bga</guid>
      <description>&lt;p&gt;Today I sent a SOL transfer on devnet and inspected the transaction on Solana Explorer.&lt;/p&gt;

&lt;p&gt;One thing that really stood out to me was the &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;--allow-unfunded-recipient flag.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;It helped me understand that on Solana, creating a wallet address does not automatically mean an on-chain account exists.&lt;/p&gt;

&lt;p&gt;The address exists immediately after generating a keypair, but the actual account only exists once it’s funded.&lt;/p&gt;

&lt;p&gt;So in this transaction, I wasn’t just sending SOL;  the network was also creating the recipient account on-chain.&lt;/p&gt;

&lt;p&gt;Very different from Ethereum’s “just send” model.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F08bltlgb2vqpirp4cdum.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F08bltlgb2vqpirp4cdum.png" alt="Screenshot of the inspected transaction on solana explorer" width="800" height="681"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>100daysofsolana</category>
      <category>web3</category>
      <category>solana</category>
    </item>
    <item>
      <title>When “Wallet” Stopped Meaning Wallet - My Solana Journey.</title>
      <dc:creator>Elizabeth Afolabi</dc:creator>
      <pubDate>Tue, 05 May 2026 13:07:20 +0000</pubDate>
      <link>https://dev.to/devduchess/when-wallet-stopped-meaning-wallet-my-solana-journey-3ap9</link>
      <guid>https://dev.to/devduchess/when-wallet-stopped-meaning-wallet-my-solana-journey-3ap9</guid>
      <description>&lt;p&gt;I already had some exposure to Ethereum, so I thought I understood what a blockchain account was.&lt;/p&gt;

&lt;p&gt;In my head, it was simple:&lt;br&gt;
A decentralized version of a traditional account; no central authority, no company controlling it. You own it, you control it, end of story.&lt;/p&gt;

&lt;p&gt;That mental model worked… until Day 11 of the 100daysofsolana.&lt;/p&gt;

&lt;h3&gt;
  
  
  What I Thought
&lt;/h3&gt;

&lt;p&gt;I saw accounts like this:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Wallet = my personal account (stores and sends money)&lt;/li&gt;
&lt;li&gt;Programs = shared logic (like smart contracts)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Even though I knew they were both “accounts,” I still treated them very differently.&lt;/p&gt;

&lt;p&gt;Wallet felt like mine. Programs felt like tools.&lt;/p&gt;

&lt;h3&gt;
  
  
  What Changed
&lt;/h3&gt;

&lt;p&gt;I started inspecting accounts directly using the CLI:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;solana account &amp;lt;address&amp;gt;&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fb71a1tb9bs0gp1q65jby.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fb71a1tb9bs0gp1q65jby.png" alt="output of the code" width="800" height="494"&gt;&lt;/a&gt;&lt;br&gt;
That’s when things started to feel different.&lt;/p&gt;

&lt;p&gt;I wasn’t just seeing balances anymore. I was seeing fields like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;owner&lt;/li&gt;
&lt;li&gt;executable&lt;/li&gt;
&lt;li&gt;data length
And I had questions immediately.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  The Confusing Part
&lt;/h3&gt;

&lt;p&gt;Some accounts had:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;executable: true&lt;/li&gt;
&lt;li&gt;others had executable: false&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;So I started wondering:&lt;/p&gt;

&lt;p&gt;Why can some accounts execute and others can’t?&lt;br&gt;
What actually makes a program different from a wallet under the hood?&lt;/p&gt;

&lt;p&gt;Then there was data length.&lt;/p&gt;

&lt;p&gt;At first, I thought it had something to do with transactions… but it didn’t.&lt;br&gt;
Now I understand it relates to how much storage space an account uses on-chain, but I’m still not fully clear on how it’s managed.&lt;/p&gt;

&lt;p&gt;And then there’s rent.&lt;/p&gt;

&lt;p&gt;Right now, my understanding is:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;a cost for storing data on-chain&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;But I still didn’t fully understand:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;how it’s calculated&lt;/li&gt;
&lt;li&gt;when it is actually paid&lt;/li&gt;
&lt;li&gt;what happens if an account can’t cover it&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  What I understand now
&lt;/h3&gt;

&lt;p&gt;The biggest shift for me was this:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;A wallet is not just a wallet. It’s an account with structure.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That structure includes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;who controls it (owner)&lt;/li&gt;
&lt;li&gt;whether it can run code (executable)&lt;/li&gt;
&lt;li&gt;how much data it stores (data length)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;What helped things click further is realizing that “owner” doesn’t mean one thing in Solana.&lt;/p&gt;

&lt;p&gt;There’s a difference between:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;human ownership - who signs and authorizes transactions with a private key&lt;/li&gt;
&lt;li&gt;program ownership - which program is allowed to modify the account’s data&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;So a wallet can be controlled by a user through signing, while still being governed at the protocol level by a program.&lt;/p&gt;

&lt;p&gt;That separation made the system feel a lot more structured than I expected.&lt;/p&gt;

&lt;p&gt;And suddenly, the line between “wallet” and “program” became thinner.&lt;/p&gt;

&lt;p&gt;They’re not completely different things. They’re different types of accounts.&lt;/p&gt;

&lt;h3&gt;
  
  
  Finally
&lt;/h3&gt;

&lt;p&gt;Day 11 didn’t give me full clarity, but it changed the way I look at the system.&lt;/p&gt;

&lt;p&gt;I came in thinking in terms of wallets and smart contracts.&lt;/p&gt;

&lt;p&gt;I left realizing it’s all just accounts with different rules, permissions, and structure layered on top.&lt;/p&gt;

&lt;p&gt;That shift alone made everything I was seeing start to make more sense, even the parts I still don’t fully understand.&lt;/p&gt;

</description>
      <category>100daysofsolana</category>
      <category>web3</category>
      <category>solana</category>
      <category>wallet</category>
    </item>
    <item>
      <title>How Identity Works on Solana (vs Web2)</title>
      <dc:creator>Elizabeth Afolabi</dc:creator>
      <pubDate>Sat, 02 May 2026 17:03:39 +0000</pubDate>
      <link>https://dev.to/devduchess/how-identity-works-on-solana-vs-web2-4k7p</link>
      <guid>https://dev.to/devduchess/how-identity-works-on-solana-vs-web2-4k7p</guid>
      <description>&lt;p&gt;I recently joined the 100 Days of Solana challenge, and in the first few days I did some pretty basic things:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Generated a wallet&lt;/li&gt;
&lt;li&gt;Funded it using devnet&lt;/li&gt;
&lt;li&gt;Connected it to apps&lt;/li&gt;
&lt;li&gt;Sent transactions&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Sounds simple, right?&lt;/p&gt;

&lt;p&gt;But it raised a bigger question for me:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;If there’s no email/password… how does identity even work here?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;If you're coming from Web2, this part can feel confusing at first. Let me break it down based on what I've learnt.&lt;/p&gt;

&lt;h3&gt;
  
  
  Web2 Identity (What We’re Used To)
&lt;/h3&gt;

&lt;p&gt;In Web2, identity is straightforward:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;You sign up with email + password&lt;/li&gt;
&lt;li&gt;Your details are stored in a database&lt;/li&gt;
&lt;li&gt;When you log in, the server verifies you&lt;/li&gt;
&lt;li&gt;A session or token keeps you logged in&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;So basically, the server is responsible for knowing who you are.&lt;/p&gt;

&lt;h3&gt;
  
  
  The Shift: No Central Authority
&lt;/h3&gt;

&lt;p&gt;On Solana, that model changes completely. The best way to think about it is:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Using a Solana wallet is like logging in with OAuth, except there’s no Google or Facebook verifying you. Identity is proven cryptographically by your wallet.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;There’s no central server in charge of identity. Instead, identity is tied to your wallet.&lt;/p&gt;

&lt;h3&gt;
  
  
  Your Wallet = Your Identity
&lt;/h3&gt;

&lt;p&gt;A wallet (like Phantom) is built on something called a keypair:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Public key - your wallet address (like a username)&lt;/li&gt;
&lt;li&gt;Private key - used to approve actions (kept secret)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;So when we say, “This is my identity on Solana”. What we really mean is “I control this wallet address.”&lt;/p&gt;

&lt;h3&gt;
  
  
  Signing = Authentication
&lt;/h3&gt;

&lt;p&gt;This is the most important part. In Web2, you send your password to prove who you are&lt;br&gt;
In Solana, you sign a message or transaction&lt;/p&gt;

&lt;p&gt;Here’s what actually happens:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;You interact with a dApp&lt;/li&gt;
&lt;li&gt;The app asks your wallet to approve an action&lt;/li&gt;
&lt;li&gt;Your wallet prompts you&lt;/li&gt;
&lt;li&gt;You approve&lt;/li&gt;
&lt;li&gt;Your wallet signs using your private key&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That signature is the proof. You don’t log in with a password, you prove who you are by signing.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Also important:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Your private key is never exposed. It stays inside the wallet.&lt;br&gt;
The password you enter in your wallet is not what proves it’s you, it only unlocks your wallet locally.&lt;/p&gt;

&lt;p&gt;When you connect your wallet to an app, The app gets your public address. It never gets your private key.&lt;br&gt;
That’s why wallet connections are considered secure.&lt;/p&gt;

&lt;h3&gt;
  
  
  A Real Flow (From My Experience)
&lt;/h3&gt;

&lt;p&gt;Here’s a typical flow based on what I’ve been building:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;I click “Connect Wallet”&lt;/li&gt;
&lt;li&gt;My wallet (Phantom) asks me to approve&lt;/li&gt;
&lt;li&gt;The app gets my public key&lt;/li&gt;
&lt;li&gt;The app uses RPC to fetch my balance&lt;/li&gt;
&lt;li&gt;I enter an amount to send&lt;/li&gt;
&lt;li&gt;I click send&lt;/li&gt;
&lt;li&gt;My wallet asks me to sign&lt;/li&gt;
&lt;li&gt;I approve, transaction goes through&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Where RPC Comes In
&lt;/h3&gt;

&lt;p&gt;RPC (Remote Procedure Call) is just how apps talk to the blockchain. It fetches balances, sends transactions and reads data. It does not know who you are or manage identity. It just responds to requests.&lt;/p&gt;

&lt;h3&gt;
  
  
  So What Replaces Sessions?
&lt;/h3&gt;

&lt;p&gt;In Web2, you log in once and session persists.&lt;/p&gt;

&lt;p&gt;In Solana, there’s no real “session”. Your identity is simply your connected wallet. Your ability to sign when needed. If you disconnect, that’s it. No session stored somewhere.&lt;/p&gt;

&lt;h3&gt;
  
  
  Conclusion
&lt;/h3&gt;

&lt;p&gt;At first, it feels strange not having a login system.&lt;/p&gt;

&lt;p&gt;But once you understand this:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Identity = wallet&lt;br&gt;
Authentication = signature&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Everything starts to make sense.&lt;/p&gt;

&lt;p&gt;If you're just getting into Solana like I am, this is one of the most important concepts to understand early.&lt;/p&gt;

&lt;p&gt;It makes everything else easier.&lt;/p&gt;

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