<?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: Akeem Palmer</title>
    <description>The latest articles on DEV Community by Akeem Palmer (@akeempalmer).</description>
    <link>https://dev.to/akeempalmer</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%2F3889865%2F66a62b7b-cf69-49e5-be07-0a782bad2567.jpeg</url>
      <title>DEV Community: Akeem Palmer</title>
      <link>https://dev.to/akeempalmer</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/akeempalmer"/>
    <language>en</language>
    <item>
      <title>What I learned about PDAs in a week of building on Solana</title>
      <dc:creator>Akeem Palmer</dc:creator>
      <pubDate>Tue, 11 Aug 2026 03:14:01 +0000</pubDate>
      <link>https://dev.to/akeempalmer/what-i-learned-about-pdas-in-a-week-of-building-on-solana-53ik</link>
      <guid>https://dev.to/akeempalmer/what-i-learned-about-pdas-in-a-week-of-building-on-solana-53ik</guid>
      <description>&lt;p&gt;If you come from a Web2 background, one of the hardest things to understand about Solana is that &lt;strong&gt;programs are stateless&lt;/strong&gt;. In a typical backend application, you might keep user information in a database row, a session store, Redis, or some other persistent layer. A Solana program cannot simply hold that data in memory between transactions.&lt;/p&gt;

&lt;p&gt;That is the problem &lt;strong&gt;Program Derived Addresses (PDAs)&lt;/strong&gt; solve.&lt;/p&gt;

&lt;p&gt;A PDA is a &lt;strong&gt;deterministic account address&lt;/strong&gt; derived from:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;one or more &lt;strong&gt;seeds&lt;/strong&gt;,&lt;/li&gt;
&lt;li&gt;your &lt;strong&gt;program ID&lt;/strong&gt;, and&lt;/li&gt;
&lt;li&gt;a small extra byte called the &lt;strong&gt;bump&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The PDA itself is not the state. The state lives in an &lt;strong&gt;account stored on-chain at that PDA&lt;/strong&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  The mental model
&lt;/h2&gt;

&lt;p&gt;The closest Web2 analogy I found is this:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;A PDA is like a database primary key that can be computed from the logical identity of the record.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;For example, if you were building a SaaS app, a user profile row might be identified by:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;("profile", user_id)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;On Solana, the equivalent idea is:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;b"profile"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;user&lt;/span&gt;&lt;span class="nf"&gt;.key&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="nf"&gt;.as_ref&lt;/span&gt;&lt;span class="p"&gt;()]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The important difference is that there is &lt;strong&gt;no central database table&lt;/strong&gt; managing these keys. The address is derived &lt;strong&gt;on demand&lt;/strong&gt; from the seeds and the program ID, and an account may or may not exist there yet.&lt;/p&gt;




&lt;h2&gt;
  
  
  Anatomy of a PDA derivation
&lt;/h2&gt;

&lt;p&gt;Here is the pattern from my counter program:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="nd"&gt;#[account(&lt;/span&gt;
    &lt;span class="nd"&gt;init,&lt;/span&gt;
    &lt;span class="nd"&gt;payer&lt;/span&gt; &lt;span class="nd"&gt;=&lt;/span&gt; &lt;span class="nd"&gt;user,&lt;/span&gt;
    &lt;span class="nd"&gt;space&lt;/span&gt; &lt;span class="nd"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;8&lt;/span&gt; &lt;span class="err"&gt;+&lt;/span&gt; &lt;span class="nd"&gt;Counter::INIT_SPACE,&lt;/span&gt;
    &lt;span class="nd"&gt;seeds&lt;/span&gt; &lt;span class="nd"&gt;=&lt;/span&gt; &lt;span class="err"&gt;[&lt;/span&gt;&lt;span class="s"&gt;b"counter"&lt;/span&gt;&lt;span class="nd"&gt;,&lt;/span&gt; &lt;span class="nd"&gt;user&lt;/span&gt;&lt;span class="err"&gt;.&lt;/span&gt;&lt;span class="nd"&gt;key()&lt;/span&gt;&lt;span class="err"&gt;.&lt;/span&gt;&lt;span class="nd"&gt;as_ref()]&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;bump&lt;/span&gt;
&lt;span class="p"&gt;)]&lt;/span&gt;
&lt;span class="k"&gt;pub&lt;/span&gt; &lt;span class="n"&gt;counter&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Account&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nv"&gt;'info&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Counter&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Let’s break this down.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;code&gt;b"counter"&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;A &lt;strong&gt;static seed prefix&lt;/strong&gt;. This namespaces the PDA so it does not collide with other PDAs in the same program.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;code&gt;user.key().as_ref()&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;A &lt;strong&gt;dynamic seed&lt;/strong&gt; based on the wallet interacting with the program.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;code&gt;seeds = [...]&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;Anchor hashes the seeds together with the &lt;strong&gt;program ID&lt;/strong&gt; to derive the PDA.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;code&gt;bump&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;The runtime searches for a one-byte value that produces an address &lt;strong&gt;outside the Ed25519 curve&lt;/strong&gt;. Because the resulting address has &lt;strong&gt;no corresponding private key&lt;/strong&gt;, only the program can sign for it using the same seeds.&lt;/p&gt;

&lt;p&gt;That last point was the biggest mental shift for me: &lt;strong&gt;PDAs are intentionally un-signable by wallets&lt;/strong&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  Why the seeds matter
&lt;/h2&gt;

&lt;p&gt;These two derivations look similar but behave very differently.&lt;/p&gt;

&lt;h3&gt;
  
  
  Per-user PDA
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="n"&gt;seeds&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;b"counter"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;user&lt;/span&gt;&lt;span class="nf"&gt;.key&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="nf"&gt;.as_ref&lt;/span&gt;&lt;span class="p"&gt;()]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Every wallet gets a &lt;strong&gt;different counter account&lt;/strong&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Global PDA
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="n"&gt;seeds&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;b"counter"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Every wallet resolves to the &lt;strong&gt;same PDA&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;That second pattern is useful for things like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;protocol configuration,&lt;/li&gt;
&lt;li&gt;treasury metadata,&lt;/li&gt;
&lt;li&gt;global admin settings.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It would be a terrible choice for a per-user counter because all users would be mutating the same account.&lt;/p&gt;




&lt;h2&gt;
  
  
  Authorization through constraints
&lt;/h2&gt;

&lt;p&gt;This is the close instruction from my program:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="nd"&gt;#[derive(Accounts)]&lt;/span&gt;
&lt;span class="k"&gt;pub&lt;/span&gt; &lt;span class="k"&gt;struct&lt;/span&gt; &lt;span class="n"&gt;CloseCounter&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nv"&gt;'info&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nd"&gt;#[account(&lt;/span&gt;
        &lt;span class="nd"&gt;mut,&lt;/span&gt;
        &lt;span class="nd"&gt;close&lt;/span&gt; &lt;span class="nd"&gt;=&lt;/span&gt; &lt;span class="nd"&gt;user,&lt;/span&gt;
        &lt;span class="nd"&gt;seeds&lt;/span&gt; &lt;span class="nd"&gt;=&lt;/span&gt; &lt;span class="err"&gt;[&lt;/span&gt;&lt;span class="s"&gt;b"counter"&lt;/span&gt;&lt;span class="nd"&gt;,&lt;/span&gt; &lt;span class="nd"&gt;user&lt;/span&gt;&lt;span class="err"&gt;.&lt;/span&gt;&lt;span class="nd"&gt;key()&lt;/span&gt;&lt;span class="err"&gt;.&lt;/span&gt;&lt;span class="nd"&gt;as_ref()]&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;bump&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;counter&lt;/span&gt;&lt;span class="py"&gt;.bump&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;has_one&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;user&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;)]&lt;/span&gt;
    &lt;span class="k"&gt;pub&lt;/span&gt; &lt;span class="n"&gt;counter&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Account&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nv"&gt;'info&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Counter&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;

    &lt;span class="nd"&gt;#[account(mut)]&lt;/span&gt;
    &lt;span class="k"&gt;pub&lt;/span&gt; &lt;span class="n"&gt;user&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Signer&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nv"&gt;'info&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&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;What surprised me is that &lt;strong&gt;most of the authorization happens before my handler runs&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Anchor automatically checks that:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;the PDA was derived from the expected seeds,&lt;/li&gt;
&lt;li&gt;the bump matches the stored bump,&lt;/li&gt;
&lt;li&gt;the &lt;code&gt;counter.user&lt;/code&gt; field equals the provided signer.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If any of those checks fail, the transaction is rejected &lt;strong&gt;before the business logic executes&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;That feels much closer to &lt;strong&gt;declarative authorization&lt;/strong&gt; than the manual guard clauses I usually write in backend APIs.&lt;/p&gt;




&lt;h2&gt;
  
  
  What the bump buys you
&lt;/h2&gt;

&lt;p&gt;A common misconception is that the bump is some kind of random nonce.&lt;/p&gt;

&lt;p&gt;It is not.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;find_program_address&lt;/code&gt; tries bump values from &lt;strong&gt;255 down to 0&lt;/strong&gt; until it finds a derivation that is &lt;strong&gt;not on the Ed25519 curve&lt;/strong&gt;. The first valid value is called the &lt;strong&gt;canonical bump&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;In practice:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="k"&gt;pub&lt;/span&gt; &lt;span class="n"&gt;bump&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;u8&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;is often stored inside the account so later instructions can reuse it:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="n"&gt;bump&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;counter&lt;/span&gt;&lt;span class="py"&gt;.bump&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This avoids re-deriving the PDA every time and guarantees you are using the same canonical derivation that was used during initialization.&lt;/p&gt;




&lt;h2&gt;
  
  
  The full lifecycle
&lt;/h2&gt;

&lt;p&gt;The pattern I ended up using throughout the week was:&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Derive
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;b"counter"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;user&lt;/span&gt;&lt;span class="nf"&gt;.key&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="nf"&gt;.as_ref&lt;/span&gt;&lt;span class="p"&gt;()]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  2. Initialize
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="nd"&gt;#[account(init,&lt;/span&gt; &lt;span class="nd"&gt;payer&lt;/span&gt; &lt;span class="nd"&gt;=&lt;/span&gt; &lt;span class="nd"&gt;user)]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This creates the on-chain account and allocates rent-exempt storage.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Mutate
&lt;/h3&gt;

&lt;p&gt;Subsequent instructions load the PDA account and update its fields.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Close
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="n"&gt;close&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;user&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Closing does &lt;strong&gt;not&lt;/strong&gt; mean “delete a row from a database.”&lt;/p&gt;

&lt;p&gt;It means:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;transfer the account’s &lt;strong&gt;lamports&lt;/strong&gt; (Solana’s smallest unit) to another account,&lt;/li&gt;
&lt;li&gt;zero out the data,&lt;/li&gt;
&lt;li&gt;mark the account for cleanup at the end of the transaction.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That distinction matters because account storage on Solana is fundamentally tied to &lt;strong&gt;lamports funding the account’s existence&lt;/strong&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  What I would tell past me
&lt;/h2&gt;

&lt;p&gt;A few things I wish I understood on Day 64:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;The program ID is part of the derivation.&lt;/strong&gt; The same seeds in a different program produce a completely different PDA.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;PDAs cannot sign transactions by themselves.&lt;/strong&gt; Programs sign on their behalf using the same seeds and bump.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Store the bump in the account.&lt;/strong&gt; It makes later instructions simpler and more reliable.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  The takeaway
&lt;/h2&gt;

&lt;p&gt;The biggest insight from this week is that &lt;strong&gt;PDAs are not a storage mechanism&lt;/strong&gt;. They are a &lt;strong&gt;deterministic addressing scheme for Solana accounts&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Once I stopped thinking of them as “special accounts” and started thinking of them as &lt;strong&gt;program-owned, reproducible addresses derived from business logic&lt;/strong&gt;, the entire Anchor model became much easier to reason about:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;logical identity
        ↓
seeds + program ID
        ↓
PDA
        ↓
on-chain account stored at that address
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That is the mental model I took away from working with PDAs this week.&lt;/p&gt;

</description>
      <category>solana</category>
      <category>rust</category>
      <category>blockchain</category>
      <category>100daysofsolana</category>
    </item>
    <item>
      <title>How I Built a Counter Program in Rust and Learned to Trust My Tests</title>
      <dc:creator>Akeem Palmer</dc:creator>
      <pubDate>Sun, 09 Aug 2026 03:13:15 +0000</pubDate>
      <link>https://dev.to/akeempalmer/how-i-built-a-counter-program-in-rust-and-learned-to-trust-my-tests-4b07</link>
      <guid>https://dev.to/akeempalmer/how-i-built-a-counter-program-in-rust-and-learned-to-trust-my-tests-4b07</guid>
      <description>&lt;p&gt;Building smart contracts on Solana using Rust and the Anchor framework requires a mindset shift from traditional Web2 backends. This week, I built a counter program, broke it on purpose, and used my test suite to verify that my security constraints were truly load-bearing. &lt;/p&gt;

&lt;p&gt;Here is how the program works under the hood and why every test in the suite exists.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;The Initialize Accounts Struct&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;In Anchor, security boundaries are enforced before your instruction logic ever runs. The &lt;code&gt;Initialize&lt;/code&gt; context defines three main accounts:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;counter&lt;/code&gt;&lt;/strong&gt;: Initialized as a new on-chain account allocated with exact bytes (8 bytes for Anchor's discriminator, 32 for the authority's public key, and 8 for the count value).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;authority&lt;/code&gt;&lt;/strong&gt;: Marked as a mutable signer who pays the account creation rent.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;system_program&lt;/code&gt;&lt;/strong&gt;: The native Solana System Program required to execute account creation.&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;strong&gt;Handler Logic &amp;amp; Constraints&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Because Anchor handles account creation and validation in the background, handler logic remains minimal.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Initialize Handler&lt;/strong&gt;&lt;br&gt;
The initialize handler receives the context, sets the counter account's authority field to match the transaction signer's public key, and sets the initial count state to zero.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Increment Instruction with Constraints&lt;/strong&gt;&lt;br&gt;
For the increment logic, Anchor uses an account constraint: &lt;code&gt;has_one = authority&lt;/code&gt;, directly on the account context. This guarantees that the key in &lt;code&gt;counter.authority&lt;/code&gt; matches the signer's wallet before any custom code executes. If an unauthorized wallet attempts to trigger an increment, Anchor rejects the transaction immediately at the constraint level.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Testing the Happy and Failure Paths&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;To prove these security checks work, I wrote unit tests for both valid execution and unauthorized attempts using LiteSVM.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. Happy Path: Successful Initialization&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;The Test:&lt;/strong&gt; Executes the initialize instruction and asserts that the fetched account's count value equals zero.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Why it exists:&lt;/strong&gt; If space allocation fails or account deserialization breaks, this test fails because the on-chain state won't reflect the expected starting value.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;2. Failure Path: Unauthorized Increment Attempt&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;The Test:&lt;/strong&gt; Attempts to trigger the increment instruction using an unauthorized attacker keypair, expecting the call to throw a &lt;code&gt;ConstraintHasOne&lt;/code&gt; error.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Why it exists:&lt;/strong&gt; If someone accidentally removes the &lt;code&gt;has_one = authority&lt;/code&gt; check from the struct, this test fails, warning us that arbitrary wallets can mutate state they don't own.&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;strong&gt;Planting Bugs to Test the Tests&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;A test suite that passes isn't helpful unless it fails when the program breaks. To test my harness, I deliberately introduced a bug by changing the counter increment logic from adding &lt;code&gt;1&lt;/code&gt; to adding &lt;code&gt;2&lt;/code&gt; in the handler.&lt;/p&gt;

&lt;p&gt;When running the test suite, it immediately caught the regression, throwing an assertion error showing an expected result of &lt;code&gt;1&lt;/code&gt; against an actual result of &lt;code&gt;2&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Seeing the assertion catch the precise mutation gave me complete confidence that my test suite was active and load-bearing rather than just passing silently.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;What’s Next&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Writing this post highlighted a gap in my understanding around program derived addresses (PDAs). We will continue working with PDAs and Rust.&lt;/p&gt;

</description>
      <category>100daysofsolana</category>
      <category>solana</category>
      <category>rust</category>
      <category>anchor</category>
    </item>
    <item>
      <title>Understanding Solana Token-2022: Transfer Fees, Interest-Bearing Tokens, &amp; Non-Transferable</title>
      <dc:creator>Akeem Palmer</dc:creator>
      <pubDate>Fri, 24 Jul 2026 03:58:40 +0000</pubDate>
      <link>https://dev.to/akeempalmer/understanding-solana-token-2022-transfer-fees-interest-bearing-tokens-non-transferable-58pi</link>
      <guid>https://dev.to/akeempalmer/understanding-solana-token-2022-transfer-fees-interest-bearing-tokens-non-transferable-58pi</guid>
      <description>&lt;p&gt;This week, I took a deep dive into &lt;strong&gt;Solana Token-2022&lt;/strong&gt; (also known as &lt;strong&gt;Token Extensions&lt;/strong&gt; or &lt;code&gt;spl-token-2022&lt;/code&gt;). &lt;/p&gt;

&lt;p&gt;If you're building on Solana, you've likely heard about Token-2022, but what actually &lt;em&gt;is&lt;/em&gt; it?&lt;/p&gt;

&lt;p&gt;In short, Token Extensions are protocol-level configurations enabled directly on a token's &lt;strong&gt;Mint Account&lt;/strong&gt;. Because these configurations exist at the mint level, every token account created under that mint automatically inherits those rules. &lt;/p&gt;

&lt;p&gt;The best part? You get advanced features natively out of the box, without having to write custom Rust smart contracts (programs) to handle complex token logic.&lt;/p&gt;

&lt;p&gt;In this post, we'll explore three popular token extensions: &lt;strong&gt;Transfer Fee&lt;/strong&gt;, &lt;strong&gt;Interest-Bearing&lt;/strong&gt;, and &lt;strong&gt;Non-Transferable&lt;/strong&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  1. Transfer Fee Extension
&lt;/h2&gt;

&lt;p&gt;The &lt;strong&gt;Transfer Fee Extension&lt;/strong&gt; allows token issuers to automatically collect a fee whenever tokens are transferred between accounts. &lt;/p&gt;

&lt;p&gt;Because the fee check happens at the base protocol level, it's impossible for secondary transfers or dApps to bypass it. Fees are configured using &lt;strong&gt;basis points&lt;/strong&gt; (where 100 basis points = 1%).&lt;/p&gt;

&lt;h3&gt;
  
  
  Primary Use Case: Payments &amp;amp; Treasuries
&lt;/h3&gt;

&lt;p&gt;If your protocol or merchant accepts your native token as payment, you can set a transfer fee where a small percentage of every transaction is automatically routed to a designated authority or treasury account.&lt;/p&gt;




&lt;h2&gt;
  
  
  2. Interest-Bearing Extension
&lt;/h2&gt;

&lt;p&gt;This extension brings native yield mechanics on-chain, allowing tokens to dynamically accumulate interest over time simply by residing in a wallet.&lt;/p&gt;

&lt;p&gt;What makes this extension fascinating is &lt;strong&gt;how&lt;/strong&gt; the balance calculation works under the hood:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;How Interest Calculation Works:&lt;/strong&gt;&lt;br&gt;
Suppose you transfer &lt;strong&gt;500 coins&lt;/strong&gt; to John's wallet. John's on-chain &lt;strong&gt;raw balance&lt;/strong&gt; remains exactly 500. Over six months, John's balance visually increases in the UI based on the set interest rate, but the raw balance on-chain never changes until a state transition occurs.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Solana calculates the visual display balance dynamically using three key variables:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Original Timestamp:&lt;/strong&gt; When the raw balance was last updated.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Current Timestamp:&lt;/strong&gt; When the balance UI/RPC is queried.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Interest Basis Rate:&lt;/strong&gt; The configured interest rate.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The actual interest is only settled on-chain when the tokens are moved or touched.&lt;/p&gt;




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

&lt;p&gt;For developers working in industries where &lt;strong&gt;KYC/KYB compliance&lt;/strong&gt; is critical, this extension provides an elegant protocol-level solution.&lt;/p&gt;

&lt;p&gt;By enabling this tag, a token becomes permanently tied to the recipient wallet upon minting (similar to a "Soulbound Token"). It cannot be transferred to any other address under any condition.&lt;/p&gt;

&lt;h3&gt;
  
  
  Primary Use Case: Compliance &amp;amp; Credentials
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;On-chain KYC/KYB identity badges&lt;/li&gt;
&lt;li&gt;Non-transferable event tickets or educational certificates&lt;/li&gt;
&lt;li&gt;Corporate credentials and soulbound access tokens&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Combining Extensions: Enforcing Protocol Policies
&lt;/h2&gt;

&lt;p&gt;The real superpower of Token-2022 is &lt;strong&gt;stacking extensions&lt;/strong&gt;. You can combine multiple configurations on a single mint to build complex behavior without writing custom Rust code.&lt;/p&gt;

&lt;p&gt;However, the combination must make logical sense:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Valid Stack:&lt;/strong&gt; &lt;em&gt;Transfer Fee&lt;/em&gt; + &lt;em&gt;Interest Bearing&lt;/em&gt; = Yield-generating payment token that collects a fee on transfer.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Invalid/Redundant Stack:&lt;/strong&gt; &lt;em&gt;Transfer Fee&lt;/em&gt; + &lt;em&gt;Non-Transferable&lt;/em&gt; = Unnecessary, because a token that cannot be transferred will never trigger a transfer fee.&lt;/li&gt;
&lt;/ul&gt;




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

&lt;p&gt;Solana's Token Extensions significantly reduce development overhead while increasing protocol level security. Enforcing complex token policies directly at the mint level, without custom smart contracts opens up huge possibilities for Web3 devs.&lt;/p&gt;

&lt;p&gt;Are you using Token-2022 in your project? Let me know in the comments which extensions you're building with!&lt;/p&gt;

</description>
      <category>100daysofsolana</category>
      <category>solana</category>
      <category>web3</category>
      <category>blockchain</category>
    </item>
    <item>
      <title>My First Look at NFTs on Solana</title>
      <dc:creator>Akeem Palmer</dc:creator>
      <pubDate>Sun, 28 Jun 2026 23:56:45 +0000</pubDate>
      <link>https://dev.to/akeempalmer/my-first-look-at-nfts-on-solana-dj9</link>
      <guid>https://dev.to/akeempalmer/my-first-look-at-nfts-on-solana-dj9</guid>
      <description>&lt;p&gt;When I first heard about NFTs, I assumed they were just randomly generated JPEG collections—mostly apes and profile pictures that became valuable because of hype. After building one on Solana, I realized an NFT is much more than an image. It's simply a token with a unique set of rules.&lt;/p&gt;

&lt;p&gt;Coming from a Web2 background, my biggest question was: &lt;strong&gt;What actually makes an NFT an NFT?&lt;/strong&gt; I expected there to be a special NFT object. Instead, I learned that on Solana, an NFT is just a token configured with the right properties and metadata.&lt;/p&gt;

&lt;p&gt;An NFT (Non-Fungible Token) is unique because it cannot be exchanged one-for-one like a cryptocurrency. To create one on Solana, the token typically has a supply of &lt;strong&gt;1&lt;/strong&gt;, uses &lt;strong&gt;0 decimals&lt;/strong&gt; so it cannot be divided into fractions, and has its mint authority removed after minting so no additional copies can be created. Metadata gives the NFT its identity by storing information such as its name, description, image, and collection.&lt;/p&gt;

&lt;p&gt;Before the introduction of Token Extensions, most NFT projects relied on Metaplex, an open-source protocol that simplified creating and managing NFTs on Solana. It provided standards for metadata, collections, and creators, making it the foundation for many NFT projects.&lt;/p&gt;

&lt;p&gt;One of the biggest things I learned this week is that Solana's Token Extensions now allow many of these features to be built directly into the token itself. Instead of depending entirely on external frameworks, developers can attach extensions that add new functionality while remaining compatible with the Solana ecosystem.&lt;/p&gt;

&lt;p&gt;Some of the extensions I explored include the &lt;strong&gt;Metadata Extension&lt;/strong&gt;, which stores information about the NFT, the &lt;strong&gt;Group&lt;/strong&gt; and &lt;strong&gt;Group Member&lt;/strong&gt; extensions for collections, and other extensions that introduce additional business logic.&lt;/p&gt;

&lt;p&gt;The biggest surprise for me was realizing that NFTs are not a completely different asset type. They are simply tokens with specific rules and metadata. Once I understood that mental model, the entire NFT ecosystem became much easier to understand.&lt;/p&gt;

&lt;p&gt;This project changed the way I look at Solana development. Instead of seeing NFTs as digital collectibles, I now see them as programmable digital ownership that can be used for tickets, memberships, certificates, gaming assets, and many other real-world applications.&lt;/p&gt;

</description>
      <category>solana</category>
      <category>web3</category>
      <category>nft</category>
      <category>blockchain</category>
    </item>
    <item>
      <title>A Deep Dive Into Building Compliance-Gated Tokens with Solana Token Extensions</title>
      <dc:creator>Akeem Palmer</dc:creator>
      <pubDate>Wed, 17 Jun 2026 00:27:55 +0000</pubDate>
      <link>https://dev.to/akeempalmer/a-deep-dive-into-building-compliance-gated-tokens-with-solana-token-extensions-3fj6</link>
      <guid>https://dev.to/akeempalmer/a-deep-dive-into-building-compliance-gated-tokens-with-solana-token-extensions-3fj6</guid>
      <description>&lt;p&gt;Building on Solana can massively simplify your application logic once set up correctly. Solana’s &lt;strong&gt;Token Extensions Program&lt;/strong&gt; streamlines development by providing native, customizable features directly at the protocol level. As the Solana documentation states, it "provides more features through extra instructions referred to as extensions." &lt;/p&gt;

&lt;p&gt;Let’s break down exactly what this means and how you can leverage it for compliance-gated assets.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Fundamentals: Mints, Authorities, and Minting
&lt;/h2&gt;

&lt;p&gt;Before diving into extensions, we need to align on three foundational terms:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Mint Account:&lt;/strong&gt; An account owned by the Solana SPL Token Program. It doesn’t hold tokens itself; instead, it acts as the global "source of truth" for a token's configuration (e.g., total supply, decimals).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Mint Authority:&lt;/strong&gt; The entity (wallet or program) with the power to increase the token supply by generating new units against the Mint Account. Think of it like a central bank or an issuing body.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Minting:&lt;/strong&gt; The actual process of generating new units of a token, which directly increases the total supply. &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;When you initialize a token on Solana; for instance, using the Command Line Interface (CLI), you can pass specific "tags" or arguments. These tags tell the network, &lt;em&gt;"Hey, I want to enable this specific feature for this token."&lt;/em&gt; That is exactly what Token Extensions are. &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Crucial Note:&lt;/strong&gt; A token’s extensions must be defined &lt;em&gt;at the moment of creation&lt;/em&gt;. Once the Mint Account is initialized, you cannot add or remove extensions.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  Key Extensions for Compliance and Control
&lt;/h2&gt;

&lt;p&gt;While the Token Extensions Program supports a wide array of features; including native metadata configuration (like setting your token's name, symbol, and image asset), it shines brightest when used to enforce compliance. &lt;/p&gt;

&lt;p&gt;Here are four powerful extensions to know:&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Non-Transferable Tokens
&lt;/h3&gt;

&lt;p&gt;This extension locks tokens to the account they are originally minted to, making them completely non-transferable between users. &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;How it works:&lt;/strong&gt; While they can't be traded, they can still be minted by the authority, burned (destroyed) by an authorized entity, or closed entirely once the balance hits zero.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Use Cases:&lt;/strong&gt; Non-transferable loyalty points, achievement badges, or identity-bound credentials.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  2. Interest-Bearing Tokens
&lt;/h3&gt;

&lt;p&gt;This feature allows a mint to store an annualized interest rate directly on-chain. &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;How it works:&lt;/strong&gt; It’s important to note that this &lt;em&gt;does not&lt;/em&gt; continuously inject new tokens into user accounts. The raw token balance stays the same. Instead, the &lt;strong&gt;UI amount&lt;/strong&gt; adjusts over time to reflect the accumulated interest. &lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Use Cases:&lt;/strong&gt; Real-world assets (RWAs), bonds, or compounding financial instruments.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  3. Immutable Owner
&lt;/h3&gt;

&lt;p&gt;By default, Solana allows a token account's ownership to be transferred to another wallet. The Immutable Owner extension permanently locks the account to its original owner.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Why it matters:&lt;/strong&gt; It prevents users from accidentally or maliciously bypassing transfer restrictions by simply trading the underlying wallet account structure.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  4. Transfer Hooks &amp;amp; Permanent Delegates (Delegation)
&lt;/h3&gt;

&lt;p&gt;This acts as the ultimate gatekeeper for your token ecosystem. By establishing a permanent delegate or a transfer hook, the mint-level authority can enforce custom validation rules for every single transfer or burn.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;How it works:&lt;/strong&gt; The authority retains the right to freeze, transfer, or burn tokens if a user violates platform policies.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Use Cases:&lt;/strong&gt; Regulated securities, compliance-gated enterprise tokens, or professional certifications that can be revoked if a holder breaks industry rules.&lt;/li&gt;
&lt;/ul&gt;




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

&lt;p&gt;The Solana Token Extensions Program is an incredibly potent tool for developers. By baking common guardrails, compliance rules, and financial logic directly into the token mint itself, you eliminate the need to write complex, risky custom smart contracts. &lt;/p&gt;

&lt;p&gt;As I dive deeper into the Solana ecosystem, I’ll be sharing more architectural deep dives. Thanks for reading! &lt;/p&gt;




&lt;h3&gt;
  
  
  What do you think?
&lt;/h3&gt;

&lt;p&gt;&lt;em&gt;Are you building with Token Extensions? Which extension do you find most useful for your project? Let's discuss in the comments!&lt;/em&gt;&lt;/p&gt;

</description>
      <category>100daysofsolana</category>
      <category>blockchain</category>
      <category>web3</category>
      <category>solana</category>
    </item>
    <item>
      <title>Demystifying Solana Mints and Token Extensions: A Web2 Developer’s Perspective</title>
      <dc:creator>Akeem Palmer</dc:creator>
      <pubDate>Sun, 07 Jun 2026 03:07:13 +0000</pubDate>
      <link>https://dev.to/akeempalmer/demystifying-solana-mints-and-token-extensions-a-web2-developers-perspective-41g8</link>
      <guid>https://dev.to/akeempalmer/demystifying-solana-mints-and-token-extensions-a-web2-developers-perspective-41g8</guid>
      <description>&lt;p&gt;Transitioning from a traditional Web2 background into the blockchain space can feel daunting, but completing days 29 through 33 of the Solana 100 Days Challenge completely shifted my perspective. On Solana, digital assets are deployed using the Solana Program Library (SPL). These can be fungible assets (like standard utility tokens or stablecoins) or non-fungible tokens (NFTs). As a software engineer getting my hands dirty with Web3 architecture for the first time, seeing these building blocks click together has been incredibly exciting.&lt;/p&gt;

&lt;p&gt;Here is my breakdown of how tokens actually function under the hood on Solana.&lt;/p&gt;




&lt;h2&gt;
  
  
  1. The Mint Account: The Blueprint
&lt;/h2&gt;

&lt;p&gt;We kicked off the challenge by creating a &lt;strong&gt;Mint Account&lt;/strong&gt; using the newer &lt;strong&gt;Token-2022 Program&lt;/strong&gt; (also known as the Token Extension Program). If you are coming from Web2, the easiest mental model is to think of the Mint Account as a &lt;em&gt;locked filing cabinet&lt;/em&gt; or a &lt;em&gt;master blueprint&lt;/em&gt;. This account does not actually hold your token balance; instead, it defines the global rules for the asset, such as the total supply, the number of decimals, and the authorized public keys allowed to mint or freeze the tokens.&lt;/p&gt;

&lt;p&gt;By leveraging &lt;strong&gt;Token Extensions&lt;/strong&gt;, we can natively bake metadata (like the token name, symbol, description, and image URI) directly into the mint initialization transaction.&lt;/p&gt;

&lt;p&gt;One of the coolest extensions we experimented with is the &lt;code&gt;--enable-non-transferable&lt;/code&gt; flag. When you pass this flag during creation, the mint permanently restricts the token from ever moving between wallets. It creates a "soulbound" asset perfect for digital certificates, achievement badges, or KYC verification records. &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;The catch?&lt;/strong&gt; This rule is immutable; you can only configure it at the exact moment the mint is deployed, and it can never be reversed. On the flip side, leaving this flag off creates standard transferable tokens, which form the backbone of everyday Web3 currencies and stablecoins.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  2. Token Accounts: The Folders Inside the Cabinet
&lt;/h2&gt;

&lt;p&gt;If the Mint Account is the master blueprint, how do we actually track who owns what? This is where &lt;strong&gt;Token Accounts&lt;/strong&gt; (and specifically, Associated Token Accounts, or ATAs) come into play.&lt;/p&gt;

&lt;p&gt;Think of a Token Account as an &lt;em&gt;individual folder&lt;/em&gt; placed inside our main filing cabinet. The folder is explicitly mapped to a specific user's wallet address. While the Mint Account coordinates the asset's rules, your actual token balance sits safely inside your unique Token Account.&lt;/p&gt;

&lt;p&gt;Before you can mint new supply or receive a transfer from someone else, that specific Token Account folder must be initialized on-chain. This structural segregation of data is what allows Solana to process transactions in parallel at lightning speeds, keeping assets secure and organized.&lt;/p&gt;




&lt;h2&gt;
  
  
  3. Execution: Minting, Burning, and Moving Assets
&lt;/h2&gt;

&lt;p&gt;Once your data accounts are active, you can interact with the Token-2022 program to manage the asset's lifecycle based on its initialized extensions:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;Non-Transferable Tokens:&lt;/strong&gt; The mint authority can issue tokens to a user's wallet folder, and the owner can safely burn (destroy) them if they expire or need to be revoked. However, attempting to send them to a friend will result in an immediate program-level rejection.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Transferable Tokens:&lt;/strong&gt; When you transfer tokens to a public wallet, the network routes the assets from your folder into theirs. If the recipient doesn't have a folder yet, a new Associated Token Account must be opened for them before the transfer can clear.&lt;/li&gt;
&lt;/ul&gt;




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

&lt;p&gt;Stepping through these operations made it clear how powerful Solana's architecture is. Instead of writing complex, risky custom smart contracts to handle basic asset behaviors, the Token-2022 Program allows us to implement enterprise-grade logic right out of the box using clear, concise program extensions.&lt;/p&gt;

</description>
      <category>100daysofsolana</category>
      <category>web3</category>
      <category>blockchain</category>
      <category>solana</category>
    </item>
    <item>
      <title>Understanding Solana Accounts: The Blockchain Filesystem</title>
      <dc:creator>Akeem Palmer</dc:creator>
      <pubDate>Tue, 02 Jun 2026 05:12:54 +0000</pubDate>
      <link>https://dev.to/akeempalmer/understanding-solana-accounts-the-blockchain-filesystem-49d9</link>
      <guid>https://dev.to/akeempalmer/understanding-solana-accounts-the-blockchain-filesystem-49d9</guid>
      <description>&lt;p&gt;If you want to understand how Solana works under the hood, you have to understand &lt;strong&gt;accounts&lt;/strong&gt;. &lt;/p&gt;

&lt;p&gt;I like to think of the Solana blockchain as a &lt;strong&gt;distributed operating system&lt;/strong&gt;, where every account is simply a &lt;strong&gt;file on a filesystem&lt;/strong&gt;. Unlike traditional Web2 architectures where applications live on a server and data lives in a database, Solana stores everything using a unified file-type system. &lt;/p&gt;

&lt;p&gt;Here is a breakdown of how these "files" work, what they contain, and how they shape the network.&lt;/p&gt;




&lt;h2&gt;
  
  
  The 5 Anatomy Fields of a Solana Account
&lt;/h2&gt;

&lt;p&gt;Every single account on Solana shares the exact same five-field structure. This structure is mapped to a 32-byte address, ensuring it aligns perfectly with IPv6 minimum MTU requirements. &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Lamports:&lt;/strong&gt; The account's SOL balance, where 1 SOL = 1,000,000,000 lamports.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Data:&lt;/strong&gt; A byte array that stores arbitrary state. For a wallet, this might be token balances; for a program, it stores the executable byte code.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Owner:&lt;/strong&gt; The specific program that controls the account (for most standard wallets, this is the System Program). &lt;strong&gt;Only the owner program can modify an account’s data or debit its lamports.&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Executable:&lt;/strong&gt; A binary flag (true/false) that tells the network whether the account can execute code and instructions.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Rent Epoch:&lt;/strong&gt; A legacy field (now deprecated) previously used to track the balance an account needed to maintain to avoid paying storage rent. Today, almost all accounts are loaded with enough SOL to be permanently rent-exempt.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  The Two Main Categories: Logic vs. Data
&lt;/h2&gt;

&lt;p&gt;Solana strictly separates code from data. Because of this, accounts broadly fall into two categories:&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Executable Accounts (The Apps)
&lt;/h3&gt;

&lt;p&gt;These accounts have their &lt;code&gt;executable&lt;/code&gt; flag set to true. They contain smart contract code (program logic) stored directly on the blockchain that automatically runs when specific conditions are met. Think of these as the applications or software running on the OS.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Non-Executable Accounts (The Databases)
&lt;/h3&gt;

&lt;p&gt;These accounts cannot execute code. Instead, they store data-such as balances, user info, or state-that executable programs read from and write to. Think of these as the databases or storage files used by the apps.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Four Functional Account Types
&lt;/h2&gt;

&lt;p&gt;To make development practical, these categories are split into four functional types that you interact with daily:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Account Type&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;th&gt;Web2 Analogy&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;System Accounts&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Regular user wallets (e.g., Phantom or Solflare). They hold your SOL balance and do not execute code.&lt;/td&gt;
&lt;td&gt;Your personal bank account&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Program Accounts&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Accounts that store compiled smart contract logic. They dictate &lt;em&gt;how&lt;/em&gt; things work but don't hold user state.&lt;/td&gt;
&lt;td&gt;The application software&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Data Accounts&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Accounts managed by programs to store specific information like user profiles, token balances, or settings.&lt;/td&gt;
&lt;td&gt;A database row or file&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Sysvars (System Variables)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Special global accounts that provide real-time network info (e.g., current time, fees, slot data).&lt;/td&gt;
&lt;td&gt;The system clock / OS settings&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  The Big Picture: Everything is a File
&lt;/h2&gt;

&lt;p&gt;By looking at Solana through the lens of an operating system, the architecture becomes incredibly intuitive. Every account is just a file, and each file consists of two things:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Metadata:&lt;/strong&gt; Who owns it, whether it can execute code, and how much money (lamports) it holds.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Contents:&lt;/strong&gt; The actual data or program code stored inside.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;In Solana, programs act &lt;em&gt;on&lt;/em&gt; accounts rather than possessing their own internal memory. By treating everything as a unified file system, Solana achieves incredible speed, transparency, and composability.&lt;/p&gt;

</description>
      <category>blockchain</category>
      <category>web3</category>
      <category>solana</category>
      <category>100daysofsolana</category>
    </item>
    <item>
      <title>Solana Transactions Explained for Backend Developers</title>
      <dc:creator>Akeem Palmer</dc:creator>
      <pubDate>Mon, 18 May 2026 01:34:24 +0000</pubDate>
      <link>https://dev.to/akeempalmer/solana-transactions-explained-for-backend-developers-122l</link>
      <guid>https://dev.to/akeempalmer/solana-transactions-explained-for-backend-developers-122l</guid>
      <description>&lt;p&gt;Before starting this challenge, I went from knowing next to nothing about Web3 transactions to being able to break down and extract granular details from the Solana ledger. That is progress. &lt;/p&gt;

&lt;p&gt;As backend developers, we are deeply familiar with how data moves in traditional systems. In this post, I will break down Solana transactions using the mental models we already use every day, and look at how they differ from the standard Web2 API calls we are used to.&lt;/p&gt;




&lt;h2&gt;
  
  
  Reframing the Architecture: From Private Servers to Shared State
&lt;/h2&gt;

&lt;p&gt;Before diving into Solana, let’s ground ourselves in Web2. An API (Application Programming Interface) is how we communicate between systems-whether via HTTP, gRPC, WebSockets, or SOAP. These communication techniques fundamentally rely on private servers, centralized databases, and authentication tied to a single entity's environment. &lt;/p&gt;

&lt;p&gt;Web3 completely flips this paradigm. In Web3, the blockchain operates as a decentralized, public, globally shared state machine. Because there is no single authoritative server, any action that mutates this state must be &lt;strong&gt;atomic&lt;/strong&gt;. If you have ever written a complex database transaction where multiple queries must either all succeed or all roll back together, you already understand the core execution model of Web3.&lt;/p&gt;




&lt;h2&gt;
  
  
  What is a Solana Transaction?
&lt;/h2&gt;

&lt;p&gt;According to the official Solana documentation: &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;"A transaction includes one or more instructions, the signatures of accounts that authorize the changes, and a recent blockhash. The network processes all instructions in a transaction together. If any instruction fails, the entire transaction fails and all state changes are reverted."&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;If we map this directly to Web2, a Solana transaction is the functional equivalent of an API request designed to trigger an atomic state change on a database. &lt;/p&gt;

&lt;h3&gt;
  
  
  Mapping the Data: Solana vs. HTTP
&lt;/h3&gt;

&lt;p&gt;To make this granular, let’s look at how a Solana transaction structure maps to a standard HTTP request:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Solana Transaction Component&lt;/th&gt;
&lt;th&gt;Web2 HTTP Equivalent&lt;/th&gt;
&lt;th&gt;Purpose / Function&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Transaction Signatures&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Auth Headers / JWT / API Keys&lt;/td&gt;
&lt;td&gt;Proves identity and cryptographic authorization to mutate data.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Transaction Message&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;HTTP Request (Headers + Body)&lt;/td&gt;
&lt;td&gt;The container holding the state change instructions and metadata.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Instructions&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;HTTP Request Body / Payload&lt;/td&gt;
&lt;td&gt;The specific business logic execution (e.g., calling a specific function with arguments).&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Account Keys&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Database Keys / URL Route Params&lt;/td&gt;
&lt;td&gt;Explicitly declares &lt;em&gt;which&lt;/em&gt; records/accounts will be read from or written to.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Recent Blockhash&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Idempotency Keys / Nonce / TTL&lt;/td&gt;
&lt;td&gt;Prevents replay attacks and acts as a time-to-live mechanism for the request.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  The Network Layer: Why Solana is High-Performance
&lt;/h2&gt;

&lt;p&gt;As backend engineers, we are used to treating network bandwidth as relatively cheap. A typical HTTP header alone can easily exceed 1,000 bytes due to bloated cookies, user-agent strings, and verbose metadata. &lt;/p&gt;

&lt;p&gt;Solana operates under strict architectural constraints. &lt;strong&gt;A Solana transaction is strictly limited to 1,232 bytes.&lt;/strong&gt; This size isn't arbitrary; it is designed to fit perfectly within the IPv6 MTU (Maximum Transmission Unit) size limit of 1,280 bytes, leaving exactly 48 bytes for network packet overhead. &lt;/p&gt;

&lt;p&gt;Because Solana transactions are entirely data-dense and predictable, validators can ingest, verify, and parallelize them instantly over UDP-based protocols like &lt;strong&gt;QUIC&lt;/strong&gt;. Unlike heavy HTTP payloads that require TCP handshakes, packet reassembly, and massive memory overhead, Solana transactions are built for raw, low-latency execution.&lt;/p&gt;




&lt;h2&gt;
  
  
  Final Thoughts
&lt;/h2&gt;

&lt;p&gt;Transitioning from Web2 to Web3 doesn't mean throwing away your backend knowledge. It means taking concepts you already know-like database atomicity, payload optimization, and cryptography-and applying them to a distributed runtime environment. Understanding the transaction lifecycle is the first step toward building highly optimized, scalable on-chain applications.&lt;/p&gt;

</description>
      <category>100daysofsolana</category>
      <category>web3</category>
      <category>blockchain</category>
      <category>solana</category>
    </item>
    <item>
      <title>Private Database (Web2) vs Public Account (Web3 - Solana)</title>
      <dc:creator>Akeem Palmer</dc:creator>
      <pubDate>Sun, 03 May 2026 00:12:17 +0000</pubDate>
      <link>https://dev.to/akeempalmer/private-database-web2-vs-public-account-web3-solana-407b</link>
      <guid>https://dev.to/akeempalmer/private-database-web2-vs-public-account-web3-solana-407b</guid>
      <description>&lt;p&gt;I've officially wrapped up the second week of my Solana deep dive. This week was all about moving from the "private" silos of Web2 databases to the "public" transparency of Blockchain and Solana accounts. &lt;/p&gt;

&lt;p&gt;Here are my key takeaways on how Solana handles data:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. The Anatomy of an Account&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Unlike a row in a SQL database, every Solana account contains five specific fields:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Lamports:&lt;/strong&gt; The SOL balance (1 SOL = 10^9 lamports)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Data:&lt;/strong&gt; The actual state stored in the account.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Owner:&lt;/strong&gt; The Program ID that has the authority to modify the data. &lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Executable:&lt;/strong&gt; A boolean flag indicating if the account is a smart program.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Rent Epoch:&lt;/strong&gt; (Now deprecated) Historically used for storage management. &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;2. Rent: "Living" on the Blockchain&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;In Web3, storage isn't free. While Transaction Fees cover the cost of processing, Rent covers the cost of storage. It scales linearly with data size.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;To be &lt;strong&gt;Rent Exempt&lt;/strong&gt;, an account must maintain a balance equivalent to 2 years of rent. Most modern wallets handle this automatically!&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;3. Transactions: Signatures &amp;amp; Messages&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Transparency is the superpower of the blockchain. Every transaction is public and cryptographically signed. A transaction consists of a Signature and a Message. The message itself contains:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The Header (metadata)&lt;/li&gt;
&lt;li&gt;Account Keys (who is involved)&lt;/li&gt;
&lt;li&gt;Recent Block hash (to prevent replays)&lt;/li&gt;
&lt;li&gt;Instructions (the actual logic being executed)&lt;/li&gt;
&lt;/ul&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%2Fw3ilnhk4s3qt4ro5vyqs.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%2Fw3ilnhk4s3qt4ro5vyqs.png" alt="Solana's account structure" width="800" height="183"&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%2F727lg3wwmpjmru00zcba.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%2F727lg3wwmpjmru00zcba.png" alt="Solana's production network vs development network" width="800" height="448"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I'm excited to keep building and sharing this journey with you guys!&lt;/p&gt;

</description>
      <category>100daysofsolana</category>
      <category>blockchain</category>
      <category>web3</category>
      <category>solana</category>
    </item>
    <item>
      <title>Day 7: Building My First Solana Wallet from Scratch</title>
      <dc:creator>Akeem Palmer</dc:creator>
      <pubDate>Sun, 26 Apr 2026 17:36:53 +0000</pubDate>
      <link>https://dev.to/akeempalmer/day-7-building-my-first-solana-wallet-from-scratch-21ik</link>
      <guid>https://dev.to/akeempalmer/day-7-building-my-first-solana-wallet-from-scratch-21ik</guid>
      <description>&lt;p&gt;I generated my first Solana key-pair using the CLI (Command Line Interface) and funded it through the Solana faucet, as well as a transfer from my Solflare wallet.&lt;/p&gt;

&lt;p&gt;After just six days in the 100 Days of Solana challenge, I’ve gained a solid foundation on how Solana works; covering identity, SOL, and Lamports.&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%2F9iogiiz0afq0kmk6ywwq.JPG" 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%2F9iogiiz0afq0kmk6ywwq.JPG" alt="Screenshot of my CLI wallet" width="800" height="198"&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%2Fe2zu3xwwdc5w9bm9iror.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%2Fe2zu3xwwdc5w9bm9iror.PNG" alt="Making a transfer to my CLI wallet from my Solflare wallet" width="800" height="1731"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you’re interested, check out my previous post on Solana identity: &lt;a href="https://dev.to/akeempalmer/exploring-web3-and-how-solana-handles-identity-468f"&gt;Exploring Web3 and How Solana Handles Identity&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Looking forward to continuing this journey and sharing more as I progress.&lt;/p&gt;

</description>
      <category>blockchain</category>
      <category>web3</category>
      <category>100daysofsolana</category>
      <category>solana</category>
    </item>
    <item>
      <title>Exploring Web3 and How Solana Handles Identity</title>
      <dc:creator>Akeem Palmer</dc:creator>
      <pubDate>Sun, 26 Apr 2026 15:07:07 +0000</pubDate>
      <link>https://dev.to/akeempalmer/exploring-web3-and-how-solana-handles-identity-468f</link>
      <guid>https://dev.to/akeempalmer/exploring-web3-and-how-solana-handles-identity-468f</guid>
      <description>&lt;p&gt;From Web2 to Web3, identity remains an important aspect for authentication and authorization for both users and the server owners. However, the underlying architecture is shifting. In Web2, we rely on usernames and passwords stored on server owner’s hardware or handled by SSO vendors like Auth0, Google or Microsoft. On the other hand, in Web3 we swap databases for cryptographic keys. In this post, we’ll dive into how the Solana network uses these keys for On-Chain Identification. &lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;The Key-pair: Your New Credentials&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Solana is a high-performance network powering decentralized finance (DeFi), NFTs and decentralized applications (dApps). Unlike traditional systems where a server “owns” your identity, Solana uses a Public Key as your unique address. &lt;/p&gt;

&lt;p&gt;Think of it this way:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Public Key (Your Username):&lt;/strong&gt; A unique 32-byte address. This is what people use to send you tokens.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Private Key (Your Password):&lt;/strong&gt; A digital signature that stays on your personal device. You use this to “sign” and authorize transactions. &lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Ed25519 vs. PDAs&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Wallets usually use the Ed25519 digital signature, with the exception of Multisig Wallets or Smart wallets (Escrows, etc..), When you create an account, it must be accompanied by a private key that you or a secure third-party vendor maintains. &lt;/p&gt;

&lt;p&gt;Solana uses PDAs (Program Derived Addresses), which are unique addresses that is not associated with a private key. Instead, they rely on a Program ID and specific seeds like user ID or user public key for authentication. This allows programs to programmatically sign for accounts. We can think of it like a service account in a cloud environment. &lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Beyond Usernames: What Identity Enables&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;On-chain identity isn’t just a replacement for a login, it’s a self-custodied foundation for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Token Ownership:&lt;/strong&gt; Providing what assets you hold.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Governance:&lt;/strong&gt; Your right to vote on protocol changes.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Reputation:&lt;/strong&gt; Your history on the public ledger is permanent and verifiable.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Because this is cryptographic, it works across every application on the network without needing server permission or an API integration. Your identity allows you to be discovered on the network, receive tokens, and maintain a wallet assignment globally.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;The Math: SOL and Lamports&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Once you have your identity, you’ll interact with SOL, Solana’s native cryptocurrency. Programmatically, we don’t usually work in whole SOL, we work in Lamports. Lamports are SOL’s smallest fractional unit. &lt;/p&gt;

&lt;p&gt;1 SOL = 1,000,000,000 (10⁹) Lamports.&lt;/p&gt;

&lt;p&gt;Think of Lamports as cents or pennies and SOL as dollars. This allows for high-precision transactions without the floating-point errors we try to avoid in financial code.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Conclusion: Who Owns The Server?&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;The biggest shift from Web2 to Web3 is ownership. In Web2, there is one true owner: the entity hosting the servers. In Web3, the network is decentralized and hosted across the globe. &lt;/p&gt;

&lt;p&gt;I’m currently participating in the &lt;a href="https://www.mlh.com/events/100-days-of-solana/challenges" rel="noopener noreferrer"&gt;100 Days of Solana challenge&lt;/a&gt; hosted by &lt;a href="https://www.mlh.com/" rel="noopener noreferrer"&gt;Major League Hacking (MLH)&lt;/a&gt;. If you’re a developer looking to move from centralized databases to the blockchain, I highly encourage you to join!&lt;/p&gt;

&lt;p&gt;I’d love to hear your feedback on this research in the comments below. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Image Generated By A.I&lt;/strong&gt;&lt;/p&gt;

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