<?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: LittleNezhaMin</title>
    <description>The latest articles on DEV Community by LittleNezhaMin (@truongcongminh96).</description>
    <link>https://dev.to/truongcongminh96</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%2F3909135%2F41c3172f-c157-413b-bf85-e1f409c49900.jpg</url>
      <title>DEV Community: LittleNezhaMin</title>
      <link>https://dev.to/truongcongminh96</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/truongcongminh96"/>
    <language>en</language>
    <item>
      <title>Three Token-2022 mints in one week: fees, yield, and soul-bound tokens</title>
      <dc:creator>LittleNezhaMin</dc:creator>
      <pubDate>Thu, 18 Jun 2026 04:31:13 +0000</pubDate>
      <link>https://dev.to/truongcongminh96/three-token-2022-mints-in-one-week-fees-yield-and-soul-bound-tokens-7pe</link>
      <guid>https://dev.to/truongcongminh96/three-token-2022-mints-in-one-week-fees-yield-and-soul-bound-tokens-7pe</guid>
      <description>&lt;p&gt;Last week I stopped thinking about tokens as "just balances" and started thinking about them as assets with middleware baked directly into the mint.&lt;/p&gt;

&lt;p&gt;If you're coming from Web2, here's the mental model that helped me: Token-2022 is the upgraded SPL token program, and extensions are like middleware for a currency. In a typical backend, you might bolt on a fee layer, a yield layer, or a transfer policy in separate services. On Solana, those rules can live inside the mint itself. That means wallets, dApps, CLIs, and programs all read the same behavior from the same on-chain account instead of relying on your custom wrapper.&lt;/p&gt;

&lt;p&gt;Over a few days on devnet, I shipped three different Token-2022 mints:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;a fee-bearing mint that skims 1% on every transfer&lt;/li&gt;
&lt;li&gt;a stacked mint that combines transfer fees with interest-bearing UI balances&lt;/li&gt;
&lt;li&gt;a non-transferable mint that refuses to move at all&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I also audited all of them afterward to confirm the extensions on chain matched the behavior I thought I had configured.&lt;/p&gt;

&lt;p&gt;One honest note before we jump in: my local shell did not have &lt;code&gt;solana&lt;/code&gt; and &lt;code&gt;spl-token&lt;/code&gt; in &lt;code&gt;PATH&lt;/code&gt;, so I executed the experiments through &lt;code&gt;@solana/web3.js&lt;/code&gt; and &lt;code&gt;@solana/spl-token&lt;/code&gt;. The commands below are the canonical &lt;code&gt;spl-token&lt;/code&gt; equivalents for the exact flows I mirrored on devnet.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Fee-Bearing Mint
&lt;/h2&gt;

&lt;p&gt;Mint address:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;CFTBSCy68VqUzGeMwjmgzufeBgGi64i281f4iUxzavj7&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Explorer:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://explorer.solana.com/address/CFTBSCy68VqUzGeMwjmgzufeBgGi64i281f4iUxzavj7?cluster=devnet" rel="noopener noreferrer"&gt;https://explorer.solana.com/address/CFTBSCy68VqUzGeMwjmgzufeBgGi64i281f4iUxzavj7?cluster=devnet&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Extensions used:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;TransferFeeConfig&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Create 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 &lt;span class="nt"&gt;--program-id&lt;/span&gt; TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb &lt;span class="se"&gt;\&lt;/span&gt;
  create-token &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--transfer-fee-basis-points&lt;/span&gt; 100 &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--transfer-fee-maximum-fee&lt;/span&gt; 1000000 &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;What it does:&lt;/p&gt;

&lt;p&gt;This mint charges a 1% fee on every transfer. The fee rule is not enforced by my app code or some custom contract next to the token. It's enforced by the Token-2022 program itself because the fee config is part of the mint account.&lt;/p&gt;

&lt;p&gt;When I tested this mint, a transfer of &lt;code&gt;1000&lt;/code&gt; tokens withheld &lt;code&gt;10&lt;/code&gt; tokens exactly as expected.&lt;/p&gt;

&lt;p&gt;Why a builder would want this:&lt;/p&gt;

&lt;p&gt;This is a clean fit for something like a creator economy token or a community currency where each transfer sends a small treasury skim back to the project. Instead of trusting every integration to remember your fee logic, the asset carries the rule with it.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Interest-Bearing + Fee Mint
&lt;/h2&gt;

&lt;p&gt;Mint address:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;51r9jZ2C3pj5D1GrrwgDFxPDN3xVwaUMUeZ875oYYwPd&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Explorer:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://explorer.solana.com/address/51r9jZ2C3pj5D1GrrwgDFxPDN3xVwaUMUeZ875oYYwPd?cluster=devnet" rel="noopener noreferrer"&gt;https://explorer.solana.com/address/51r9jZ2C3pj5D1GrrwgDFxPDN3xVwaUMUeZ875oYYwPd?cluster=devnet&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Extensions used:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;TransferFeeConfig&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;InterestBearingConfig&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Create 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;--decimals&lt;/span&gt; 6 &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--transfer-fee-basis-points&lt;/span&gt; 100 &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--transfer-fee-maximum-fee&lt;/span&gt; 1000000 &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--interest-rate&lt;/span&gt; 5000
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;What it does:&lt;/p&gt;

&lt;p&gt;This mint combines two behaviors:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;every transfer pays a 1% fee&lt;/li&gt;
&lt;li&gt;every holder sees the UI amount grow over time at the configured interest rate&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The subtle part, and the part I wish more tutorials emphasized, is that the interest-bearing extension does &lt;strong&gt;not&lt;/strong&gt; mint new supply into token accounts. The raw amount stored on chain stays fixed. What changes is the UI amount that clients compute from the mint's rate configuration and the network clock.&lt;/p&gt;

&lt;p&gt;That means this:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;raw amount can stay &lt;code&gt;1000000000000&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;displayed UI amount can drift upward over time&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In my test, the same account moved from &lt;code&gt;1000000.031688&lt;/code&gt; to &lt;code&gt;1000000.522867&lt;/code&gt; in about 31 seconds without any transaction landing in between. On the recipient side, a transfer still withheld &lt;code&gt;10&lt;/code&gt; tokens in fees, and the recipient's UI amount also started drifting upward immediately.&lt;/p&gt;

&lt;p&gt;That's why this mint felt like the clearest "Token-2022 is middleware for assets" demo of the week: two totally different behaviors, one mint, no custom program written by me.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Non-Transferable Mint
&lt;/h2&gt;

&lt;p&gt;Mint address:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;GnHWVxdfWgDqbpDVgZbEdWbZ8wrX4Ct5fP5uyMEY4MPW&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Explorer:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://explorer.solana.com/address/GnHWVxdfWgDqbpDVgZbEdWbZ8wrX4Ct5fP5uyMEY4MPW?cluster=devnet" rel="noopener noreferrer"&gt;https://explorer.solana.com/address/GnHWVxdfWgDqbpDVgZbEdWbZ8wrX4Ct5fP5uyMEY4MPW?cluster=devnet&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Extensions used:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;NonTransferable&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Create 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="nt"&gt;--program-2022&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;What it does:&lt;/p&gt;

&lt;p&gt;This is the opposite of money. Once the token lands in an account, it cannot be transferred out. That makes it a good fit for badges, credentials, proof-of-completion tokens, or any soul-bound style identity artifact.&lt;/p&gt;

&lt;p&gt;I intentionally created a recipient token account first and then tried to transfer &lt;code&gt;1&lt;/code&gt; token into it just to make sure the failure came from the program rule itself, not from some unrelated missing-account error.&lt;/p&gt;

&lt;p&gt;This was the exact runtime rejection I got:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Program log: Instruction: TransferChecked
Program log: Transfer is disabled for this mint
Program TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb failed: custom program error: 0x25
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That error is the feature. The mint is carrying a transfer policy that the protocol itself enforces.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Day 53 Taught Me
&lt;/h2&gt;

&lt;p&gt;After building these mints, I audited them the same way I would inspect a database schema after a migration.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The Day 50 / 51 mint read back with &lt;code&gt;TransferFeeConfig&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;The Day 52 mint read back with both &lt;code&gt;TransferFeeConfig&lt;/code&gt; and &lt;code&gt;InterestBearingConfig&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;The Day 54 mint read back with &lt;code&gt;NonTransferable&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That audit step mattered more than I expected. It's one thing to remember which flag I typed into a command. It's another thing entirely to read the mint account back from chain and see the protocol decode the exact behavior I thought I had shipped.&lt;/p&gt;

&lt;h2&gt;
  
  
  Closing Reflection
&lt;/h2&gt;

&lt;p&gt;What surprised me most was how composable these extensions are. I expected Token-2022 to feel like "more options on a token." Instead, it felt more like a design space for asset behavior. The transfer-fee mint felt useful for treasury or royalty-style flows. The interest-bearing mint made me think about internal reward systems and financial UX where displayed value changes over time without mutating raw balances. The non-transferable mint was the most conceptually fun because it flips the token primitive from money into identity. If I were building a real product tomorrow, I'd reach for these extensions long before reaching for a custom token program.&lt;/p&gt;

&lt;p&gt;If you're a Web2 developer learning Solana, Token-2022 is one of the best places to start because it teaches a deep lesson quickly: on-chain assets do not just store value, they can store rules.&lt;/p&gt;

</description>
      <category>100daysofsolana</category>
      <category>web3</category>
    </item>
    <item>
      <title>Understanding Solana’s Account Model as a Web2 Developer</title>
      <dc:creator>LittleNezhaMin</dc:creator>
      <pubDate>Sun, 17 May 2026 14:44:14 +0000</pubDate>
      <link>https://dev.to/truongcongminh96/understanding-solanas-account-model-as-a-web2-developer-4dbg</link>
      <guid>https://dev.to/truongcongminh96/understanding-solanas-account-model-as-a-web2-developer-4dbg</guid>
      <description>&lt;p&gt;When I first started learning Solana, the thing that confused me most wasn’t transactions or wallets.&lt;/p&gt;

&lt;p&gt;It was accounts.&lt;/p&gt;

&lt;p&gt;Every tutorial kept talking about accounts:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Wallet accounts&lt;/li&gt;
&lt;li&gt;Program accounts&lt;/li&gt;
&lt;li&gt;Token accounts&lt;/li&gt;
&lt;li&gt;Data accounts&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;At first, it sounded like blockchain jargon overload.&lt;/p&gt;

&lt;p&gt;But after spending a few days inspecting accounts using the Solana CLI and Explorer, something finally clicked:&lt;/p&gt;

&lt;p&gt;On Solana, everything is an account.&lt;/p&gt;

&lt;p&gt;Once you understand that idea, the rest of Solana starts making a lot more sense.&lt;/p&gt;

&lt;p&gt;In this article, I’ll explain Solana’s account model from the perspective of a Web2 developer.&lt;/p&gt;

&lt;p&gt;⸻&lt;/p&gt;

&lt;p&gt;The Mental Shift: Solana Is a Giant Key-Value Store&lt;/p&gt;

&lt;p&gt;In Web2, we usually think in terms of:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;databases&lt;/li&gt;
&lt;li&gt;tables&lt;/li&gt;
&lt;li&gt;backend servers&lt;/li&gt;
&lt;li&gt;APIs&lt;/li&gt;
&lt;li&gt;application state&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Solana works differently.&lt;/p&gt;

&lt;p&gt;Instead of storing application state inside a backend server, Solana stores everything inside accounts on-chain.&lt;/p&gt;

&lt;p&gt;Every Solana Account Has the Same Structure&lt;/p&gt;

&lt;p&gt;No matter what type of account you inspect, they all contain the same core fields.&lt;/p&gt;

&lt;p&gt;A Solana account contains:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;lamports&lt;/li&gt;
&lt;li&gt;data&lt;/li&gt;
&lt;li&gt;owner&lt;/li&gt;
&lt;li&gt;executable&lt;/li&gt;
&lt;li&gt;rent_epoch&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Here’s an example using the Solana CLI:&lt;br&gt;
&lt;code&gt;solana account &amp;lt;ACCOUNT_ADDRESS&amp;gt;&lt;/code&gt;&lt;br&gt;
Example output:&lt;br&gt;
`{&lt;/p&gt;

&lt;p&gt;"lamports": 1505728269681,&lt;/p&gt;

&lt;p&gt;"owner": "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA",&lt;/p&gt;

&lt;p&gt;"executable": false,&lt;/p&gt;

&lt;p&gt;"rentEpoch": 18446744073709551615,&lt;/p&gt;

&lt;p&gt;"data": [...]&lt;/p&gt;

&lt;p&gt;}`&lt;br&gt;
Let’s break those fields down.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Lamports = SOL Balance&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Lamports are the smallest unit of SOL.&lt;/p&gt;

&lt;p&gt;Think of them like satoshis in Bitcoin.&lt;br&gt;
&lt;code&gt;1 SOL = 1,000,000,000 lamports&lt;/code&gt;&lt;br&gt;
If an account has:&lt;br&gt;
&lt;code&gt;1500000000 lamports&lt;/code&gt;&lt;br&gt;
That means it owns:&lt;br&gt;
&lt;code&gt;1.5 SOL&lt;/code&gt;&lt;br&gt;
Every account can hold SOL, not just wallets.&lt;/p&gt;

&lt;p&gt;That surprised me at first.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Data = Arbitrary State Storage&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The data field is where programs store information.&lt;/p&gt;

&lt;p&gt;This could contain:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;token balances&lt;/li&gt;
&lt;li&gt;NFT metadata&lt;/li&gt;
&lt;li&gt;game inventory&lt;/li&gt;
&lt;li&gt;DeFi positions&lt;/li&gt;
&lt;li&gt;DAO governance state&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The important thing is:&lt;/p&gt;

&lt;p&gt;Solana stores raw bytes.&lt;/p&gt;

&lt;p&gt;Programs are responsible for interpreting those bytes.&lt;/p&gt;

&lt;p&gt;This feels similar to reading binary files or serialized objects in traditional systems.&lt;/p&gt;

&lt;p&gt;⸻&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Owner = Who Controls the Account&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;This is one of the most important concepts in Solana.&lt;/p&gt;

&lt;p&gt;Every account has an owner.&lt;/p&gt;

&lt;p&gt;But the owner is usually NOT a user.&lt;/p&gt;

&lt;p&gt;It’s typically a program.&lt;/p&gt;

&lt;p&gt;Example:&lt;br&gt;
&lt;code&gt;TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA&lt;/code&gt;&lt;br&gt;
That’s the SPL Token Program.&lt;/p&gt;

&lt;p&gt;If an account is owned by the Token Program, only the Token Program can modify that account’s data.&lt;/p&gt;

&lt;p&gt;This creates a very clean security model.&lt;/p&gt;

&lt;p&gt;Ownership Rules&lt;/p&gt;

&lt;p&gt;On Solana:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Only the owner program can modify account data&lt;/li&gt;
&lt;li&gt;Only the owner program can debit lamports&lt;/li&gt;
&lt;li&gt;Anyone can send lamports into a writable account&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That’s surprisingly elegant.&lt;/p&gt;

&lt;p&gt;⸻&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Executable = Is This a Program?&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;This field is simply:&lt;br&gt;
&lt;code&gt;true or false&lt;/code&gt;&lt;br&gt;
If:&lt;br&gt;
&lt;code&gt;executable = true&lt;/code&gt;&lt;br&gt;
then the account contains executable program code.&lt;/p&gt;

&lt;p&gt;If:&lt;br&gt;
&lt;code&gt;executable = false&lt;/code&gt;&lt;br&gt;
then it’s just a data account.&lt;/p&gt;

&lt;p&gt;This is where Solana differs a lot from Ethereum.&lt;br&gt;
Programs Don’t Store Their Own State&lt;/p&gt;

&lt;p&gt;This was probably the biggest mental shift for me.&lt;/p&gt;

&lt;p&gt;In Ethereum, smart contracts usually contain both:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;code&lt;/li&gt;
&lt;li&gt;state&lt;/li&gt;
&lt;/ul&gt;

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

&lt;p&gt;The executable code lives in one account.&lt;/p&gt;

&lt;p&gt;The data lives in separate accounts.&lt;br&gt;
Programs read and write external accounts instead of storing state internally.&lt;/p&gt;

&lt;p&gt;That design allows Solana to parallelize transactions more efficiently.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Rent Epoch (Deprecated)&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Older Solana docs talk about rent_epoch.&lt;/p&gt;

&lt;p&gt;Today, this field is effectively deprecated and usually set to:&lt;br&gt;
&lt;code&gt;18446744073709551615&lt;/code&gt;&lt;br&gt;
Most developers can ignore it now.&lt;br&gt;
Rent Exemption&lt;/p&gt;

&lt;p&gt;One thing I found interesting is that storing data on Solana costs money.&lt;/p&gt;

&lt;p&gt;Every account must maintain a minimum balance to remain on-chain.&lt;/p&gt;

&lt;p&gt;This is called being:&lt;br&gt;
&lt;code&gt;rent-exempt&lt;/code&gt;&lt;br&gt;
The larger the account data size, the more SOL it needs.&lt;/p&gt;

&lt;p&gt;For example:&lt;br&gt;
&lt;code&gt;solana rent 0&lt;/code&gt;&lt;br&gt;
returns the minimum balance needed for an empty account.&lt;/p&gt;

&lt;p&gt;At the time I tested it, it was around:&lt;br&gt;
&lt;code&gt;0.00089 SOL&lt;/code&gt;&lt;br&gt;
This mechanism prevents the blockchain from being flooded with useless data forever.&lt;br&gt;
My Favorite Analogy: Solana as a Filesystem&lt;/p&gt;

&lt;p&gt;The analogy that finally made everything click for me was this:&lt;/p&gt;

&lt;p&gt;Imagine Solana as a giant operating system filesystem.&lt;/p&gt;

&lt;p&gt;Each account is like a file.&lt;/p&gt;

&lt;p&gt;Accounts contain:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;metadata&lt;/li&gt;
&lt;li&gt;permissions&lt;/li&gt;
&lt;li&gt;contents&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Programs are executable files.&lt;/p&gt;

&lt;p&gt;Data accounts are documents those programs read and write.&lt;/p&gt;

&lt;p&gt;The System Program acts like the operating system kernel managing account creation and ownership.&lt;/p&gt;

&lt;p&gt;Once I started thinking about Solana this way, the architecture suddenly felt much more familiar.&lt;/p&gt;

&lt;p&gt;⸻&lt;/p&gt;

&lt;p&gt;Final Thoughts&lt;/p&gt;

&lt;p&gt;At first, Solana’s account model felt strange coming from Web2.&lt;/p&gt;

&lt;p&gt;But now I actually think it’s one of the cleanest parts of Solana’s design.&lt;/p&gt;

&lt;p&gt;The key ideas that helped me most were:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Everything is an account&lt;/li&gt;
&lt;li&gt;Programs are stateless&lt;/li&gt;
&lt;li&gt;Ownership controls security&lt;/li&gt;
&lt;li&gt;Accounts are just structured storage&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Once those concepts click, reading Solana transactions and programs becomes much easier.&lt;/p&gt;

&lt;p&gt;If you’re a Web2 developer learning Solana right now, my advice is simple:&lt;/p&gt;

&lt;p&gt;Spend time inspecting real accounts.&lt;/p&gt;

&lt;p&gt;Use:&lt;br&gt;
&lt;code&gt;solana account &amp;lt;address&amp;gt;&lt;/code&gt;&lt;br&gt;
Look at Explorer.&lt;/p&gt;

&lt;p&gt;Read the raw JSON.&lt;/p&gt;

&lt;p&gt;Eventually the patterns start revealing themselves naturally.&lt;/p&gt;

&lt;p&gt;And honestly, that’s when blockchain development starts becoming really fun 🚀&lt;/p&gt;

</description>
      <category>100daysofsolana</category>
    </item>
    <item>
      <title>Solana Transactions Explained for Backend Developers</title>
      <dc:creator>LittleNezhaMin</dc:creator>
      <pubDate>Sun, 10 May 2026 07:11:09 +0000</pubDate>
      <link>https://dev.to/truongcongminh96/solana-transactions-explained-for-backend-developers-43ei</link>
      <guid>https://dev.to/truongcongminh96/solana-transactions-explained-for-backend-developers-43ei</guid>
      <description>&lt;p&gt;Over the past few days in #100DaysOfSolana, I went from knowing almost nothing about Solana transactions to building my own CLI transfer tool, tracking transaction confirmations in real time, and debugging failed on-chain transactions.&lt;/p&gt;

&lt;p&gt;Coming from a backend/web2 background, Solana transactions initially felt confusing. Terms like signatures, blockhashes, commitment levels, and atomic state changes sounded very different from the APIs and databases I was used to.&lt;/p&gt;

&lt;p&gt;But after building and breaking transactions myself, something finally clicked.&lt;/p&gt;

&lt;p&gt;In this post, I want to explain Solana transactions from the perspective of a backend developer.&lt;/p&gt;

&lt;p&gt;⸻&lt;/p&gt;

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

&lt;p&gt;At first, I treated a Solana transaction like an HTTP request:&lt;br&gt;
`POST /transfer&lt;/p&gt;

&lt;p&gt;{&lt;/p&gt;

&lt;p&gt;"from": "...",&lt;/p&gt;

&lt;p&gt;"to": "...",&lt;/p&gt;

&lt;p&gt;"amount": 0.01&lt;/p&gt;

&lt;p&gt;}`&lt;/p&gt;

&lt;p&gt;But that mental model is incomplete.&lt;/p&gt;

&lt;p&gt;A Solana transaction is closer to a signed, atomic database transaction that gets executed by a decentralized network.&lt;/p&gt;

&lt;p&gt;Unlike a normal API request:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;there is no centralized server&lt;/li&gt;
&lt;li&gt;every transaction must be cryptographically signed&lt;/li&gt;
&lt;li&gt;transactions expire quickly&lt;/li&gt;
&lt;li&gt;failures still cost fees&lt;/li&gt;
&lt;li&gt;consensus happens in stages&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That last point surprised me the most.&lt;/p&gt;

&lt;p&gt;⸻&lt;/p&gt;

&lt;p&gt;Transaction Confirmation Is Not Binary&lt;/p&gt;

&lt;p&gt;In web2 systems, requests are usually either:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;pending&lt;/li&gt;
&lt;li&gt;successful&lt;/li&gt;
&lt;li&gt;failed&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;But on Solana, transactions move through multiple commitment levels:&lt;/p&gt;

&lt;p&gt;Processed&lt;/p&gt;

&lt;p&gt;A validator received and processed the transaction.&lt;/p&gt;

&lt;p&gt;This is similar to:&lt;/p&gt;

&lt;p&gt;“The server accepted your request.”&lt;/p&gt;

&lt;p&gt;But it is not finalized yet.&lt;/p&gt;

&lt;p&gt;⸻&lt;/p&gt;

&lt;p&gt;Confirmed&lt;/p&gt;

&lt;p&gt;A supermajority of validators voted on the block containing your transaction.&lt;/p&gt;

&lt;p&gt;This is effectively:&lt;/p&gt;

&lt;p&gt;“The network agrees your transaction succeeded.”&lt;/p&gt;

&lt;p&gt;Interestingly:&lt;/p&gt;

&lt;p&gt;no confirmed transaction in Solana history has ever been reversed.&lt;/p&gt;

&lt;p&gt;⸻&lt;/p&gt;

&lt;p&gt;Finalized&lt;/p&gt;

&lt;p&gt;31+ additional blocks were built on top of your transaction.&lt;/p&gt;

&lt;p&gt;At this point, the transaction is considered irreversible.&lt;/p&gt;

&lt;p&gt;This feels similar to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;replicated database commits&lt;/li&gt;
&lt;li&gt;durable writes&lt;/li&gt;
&lt;li&gt;globally finalized state&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;⸻&lt;/p&gt;

&lt;p&gt;Building My Own Transfer Tool&lt;/p&gt;

&lt;p&gt;One of the most useful exercises was building a reusable CLI transfer tool using:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Node.js&lt;/li&gt;
&lt;li&gt;@solana/kit&lt;/li&gt;
&lt;li&gt;Solana CLI keypairs&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Instead of manually typing transfer commands every time, the tool:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;accepts recipient + amount arguments&lt;/li&gt;
&lt;li&gt;checks balances&lt;/li&gt;
&lt;li&gt;signs transactions locally&lt;/li&gt;
&lt;li&gt;submits transactions to devnet&lt;/li&gt;
&lt;li&gt;tracks confirmation progress&lt;/li&gt;
&lt;li&gt;prints Explorer links
&lt;code&gt;node transfer.mjs &amp;lt;RECIPIENT&amp;gt; 0.01&lt;/code&gt;
Terminal output:
`Solana Transfer Tool
====================
Connected to Solana devnet.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Status: processed ✅&lt;br&gt;
Status: confirmed ✅&lt;br&gt;
Status: finalized ✅&lt;/p&gt;

&lt;p&gt;Transaction successful!`&lt;br&gt;
his felt very similar to building internal tooling around payment APIs in web2.&lt;/p&gt;

&lt;p&gt;Except this time:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;there was no Stripe&lt;/li&gt;
&lt;li&gt;no backend server&lt;/li&gt;
&lt;li&gt;no payment gateway&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The transaction went directly to the blockchain network.&lt;/p&gt;

&lt;p&gt;⸻&lt;/p&gt;

&lt;p&gt;Failed Transactions Taught Me More Than Successful Ones&lt;/p&gt;

&lt;p&gt;One thing I underestimated:&lt;/p&gt;

&lt;p&gt;failed transactions are incredibly educational.&lt;/p&gt;

&lt;p&gt;For example, I intentionally tried sending more SOL than my balance:&lt;br&gt;
&lt;code&gt;node transfer.mjs RECIPIENT 999&lt;/code&gt;&lt;br&gt;
Result:&lt;br&gt;
&lt;code&gt;Transaction failed:&lt;br&gt;
Insufficient balance...&lt;/code&gt;&lt;br&gt;
I also learned:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;failed transactions still consume fees&lt;/li&gt;
&lt;li&gt;blockhashes expire&lt;/li&gt;
&lt;li&gt;commitment levels matter&lt;/li&gt;
&lt;li&gt;RPC polling is essential for good UX&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This changed how I think about blockchain applications.&lt;/p&gt;

&lt;p&gt;⸻&lt;/p&gt;

&lt;p&gt;The Biggest Difference From Web2&lt;/p&gt;

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

&lt;p&gt;In web2:&lt;/p&gt;

&lt;p&gt;servers own state&lt;/p&gt;

&lt;p&gt;In Solana:&lt;/p&gt;

&lt;p&gt;the network owns state&lt;/p&gt;

&lt;p&gt;Your application becomes more like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;a transaction builder&lt;/li&gt;
&lt;li&gt;a signing interface&lt;/li&gt;
&lt;li&gt;a state interpreter&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;instead of a traditional CRUD backend.&lt;/p&gt;

&lt;p&gt;That changes everything.&lt;/p&gt;

&lt;p&gt;⸻&lt;/p&gt;

&lt;p&gt;Final Thoughts&lt;/p&gt;

&lt;p&gt;A week ago, Solana transactions looked intimidating.&lt;/p&gt;

&lt;p&gt;Now they feel surprisingly elegant.&lt;/p&gt;

&lt;p&gt;Once I stopped trying to force blockchain into traditional web2 mental models, the architecture started making sense:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;atomic state changes&lt;/li&gt;
&lt;li&gt;cryptographic authorization&lt;/li&gt;
&lt;li&gt;distributed consensus&lt;/li&gt;
&lt;li&gt;deterministic execution&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I still have a lot to learn, but building and debugging real transactions helped far more than just reading documentation.&lt;/p&gt;

&lt;p&gt;If you’re a backend developer exploring Solana for the first time:&lt;br&gt;
my biggest recommendation is simple:&lt;/p&gt;

&lt;p&gt;build small tools yourself.&lt;/p&gt;

&lt;p&gt;That is when the concepts really start to click.&lt;/p&gt;

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

</description>
      <category>backend</category>
      <category>blockchain</category>
      <category>tutorial</category>
      <category>web3</category>
    </item>
    <item>
      <title>Week 2 of #100DaysOfSolana: When “Public Database” Finally Clicked</title>
      <dc:creator>LittleNezhaMin</dc:creator>
      <pubDate>Sat, 02 May 2026 14:09:07 +0000</pubDate>
      <link>https://dev.to/truongcongminh96/week-2-of-100daysofsolana-when-public-database-finally-clicked-44gp</link>
      <guid>https://dev.to/truongcongminh96/week-2-of-100daysofsolana-when-public-database-finally-clicked-44gp</guid>
      <description>&lt;p&gt;After two weeks building on Solana, I feel like my mental model of “blockchain” has completely changed.&lt;/p&gt;

&lt;p&gt;Before this, I used to think blockchain data was something abstract, complex, and hard to access. Something like a black box where transactions go in, and magic comes out.&lt;/p&gt;

&lt;p&gt;Reality?&lt;br&gt;
It’s surprisingly simple… and surprisingly different.&lt;br&gt;
🧱 What I Expected vs Reality&lt;br&gt;
Coming from a fullstack background (PHP, Go, APIs, databases), I expected:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Tables&lt;/li&gt;
&lt;li&gt;Queries (SELECT, JOIN, WHERE)&lt;/li&gt;
&lt;li&gt;Structured schemas&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;But on Solana, there are no tables.&lt;/p&gt;

&lt;p&gt;Instead:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Accounts = your data&lt;/li&gt;
&lt;li&gt;Programs = your logic&lt;/li&gt;
&lt;li&gt;RPC = your API&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;At first, this felt strange.&lt;/p&gt;

&lt;p&gt;But once I reframed it like this:&lt;/p&gt;

&lt;p&gt;Solana = a giant public database you can read from&lt;/p&gt;

&lt;p&gt;Things started to make sense.&lt;/p&gt;

&lt;p&gt;⸻&lt;/p&gt;

&lt;p&gt;⚡ The Moment It Clicked&lt;/p&gt;

&lt;p&gt;The biggest “aha” moment came when I fetched:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Balance of an address&lt;/li&gt;
&lt;li&gt;Recent transactions&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Using just an RPC call.&lt;br&gt;
No authentication.&lt;br&gt;
No backend.&lt;br&gt;
No database setup.&lt;br&gt;
Just:&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;balance&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;rpc&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getBalance&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;address&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;send&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That’s it.&lt;br&gt;
At that moment, it clicked:&lt;br&gt;
This is just a read-only API… but global and trustless.&lt;br&gt;
🧩 What Surprised Me Most&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Same Code, Different Network = Completely Different Data&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;When I compared devnet vs mainnet, I got:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Devnet → 5 SOL + transactions (from testing)&lt;/li&gt;
&lt;li&gt;Mainnet → 0 SOL + no activity&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Same address. Same code.&lt;/p&gt;

&lt;p&gt;Completely different reality.&lt;/p&gt;

&lt;p&gt;This felt exactly like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Devnet = staging DB&lt;/li&gt;
&lt;li&gt;Mainnet = production DB&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;But with real money involved.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Everything is Public&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;In Web2:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;You need auth&lt;/li&gt;
&lt;li&gt;You need permission&lt;/li&gt;
&lt;li&gt;You need APIs&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In Solana:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;You can read anything&lt;/li&gt;
&lt;li&gt;Anytime&lt;/li&gt;
&lt;li&gt;From anywhere&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That’s powerful… and a bit scary 😅&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;RPC Feels Like an API, But It’s Not Quite the Same&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Working with Solana RPC feels familiar:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Request → Response&lt;/li&gt;
&lt;li&gt;JSON data&lt;/li&gt;
&lt;li&gt;Async calls&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;But the mindset is different:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;You’re not querying your backend&lt;/li&gt;
&lt;li&gt;You’re querying a shared global state&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That changes how you think about data completely.&lt;br&gt;
🚧 What I’m Still Confused About&lt;/p&gt;

&lt;p&gt;A few things I’m still figuring out:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;How to write data safely (transactions, signing, fees)&lt;/li&gt;
&lt;li&gt;How programs (smart contracts) actually store structured data&lt;/li&gt;
&lt;li&gt;Best practices for building real apps on top of accounts&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Reading data feels easy.&lt;/p&gt;

&lt;p&gt;Writing data feels like the next big challenge.&lt;br&gt;
🚀 What I Want to Learn Next&lt;/p&gt;

&lt;p&gt;Next, I want to focus on:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Sending transactions&lt;/li&gt;
&lt;li&gt;Interacting with programs&lt;/li&gt;
&lt;li&gt;Building a real dApp with a wallet (Phantom, etc.)&lt;/li&gt;
&lt;li&gt;Moving from “read-only” → “read + write”&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;⸻&lt;/p&gt;

&lt;p&gt;Final Thoughts&lt;/p&gt;

&lt;p&gt;Week 2 made one thing clear:&lt;/p&gt;

&lt;p&gt;Blockchain isn’t magic.&lt;br&gt;
It’s just a different way of structuring and accessing data.&lt;/p&gt;

&lt;p&gt;And once that clicks…&lt;/p&gt;

&lt;p&gt;Everything becomes a lot more approachable.&lt;/p&gt;

&lt;p&gt;⸻&lt;/p&gt;

&lt;p&gt;If you’re also doing #100DaysOfSolana, I’d love to connect and see what you’re building 🚀&lt;br&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%2Fynhjarwrt7qa82e6ebis.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%2Fynhjarwrt7qa82e6ebis.png" alt=" "&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>solana</category>
      <category>web3</category>
      <category>blockchain</category>
      <category>javascript</category>
    </item>
    <item>
      <title>Week 2 of #100DaysOfSolana: When “Public Database” Finally Clicked

After two weeks building on Solana, I feel like my mental model of “blockchain” has completely changed.

Before this, I used to think blockchain data was something abstract, complex, and h</title>
      <dc:creator>LittleNezhaMin</dc:creator>
      <pubDate>Sat, 02 May 2026 13:59:49 +0000</pubDate>
      <link>https://dev.to/truongcongminh96/week-2-of-100daysofsolana-when-public-database-finally-clicked-after-two-weeks-building-on-38h2</link>
      <guid>https://dev.to/truongcongminh96/week-2-of-100daysofsolana-when-public-database-finally-clicked-after-two-weeks-building-on-38h2</guid>
      <description></description>
    </item>
  </channel>
</rss>
