<?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: Russell Oje</title>
    <description>The latest articles on DEV Community by Russell Oje (@russell_oje).</description>
    <link>https://dev.to/russell_oje</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3846695%2F5f9b12d1-01cf-4a2a-ab89-b52838094707.jpg</url>
      <title>DEV Community: Russell Oje</title>
      <link>https://dev.to/russell_oje</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/russell_oje"/>
    <language>en</language>
    <item>
      <title>#100DaysOfSolana Week4 Recap</title>
      <dc:creator>Russell Oje</dc:creator>
      <pubDate>Sun, 17 May 2026 21:57:29 +0000</pubDate>
      <link>https://dev.to/russell_oje/100daysofsolana-week4-recap-4ack</link>
      <guid>https://dev.to/russell_oje/100daysofsolana-week4-recap-4ack</guid>
      <description>&lt;p&gt;I opened my devnet account in Solana Explorer today and it clicked how much the explorer reveals: balance, owner, executable flag, and full transaction history in one view. I like Solana Explorer for this clarity.&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%2Fy0y57att1yuoxrcc87mx.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%2Fy0y57att1yuoxrcc87mx.png" alt="Solana Explorer" width="800" height="912"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;#100DaysOfSolana&lt;/code&gt;&lt;/p&gt;

</description>
      <category>100daysofsolana</category>
    </item>
    <item>
      <title>Week4 of #100DaysOfSolana: Solana's Account Model</title>
      <dc:creator>Russell Oje</dc:creator>
      <pubDate>Sun, 17 May 2026 21:47:11 +0000</pubDate>
      <link>https://dev.to/russell_oje/week4-of-100daysofsolana-solanas-account-model-4254</link>
      <guid>https://dev.to/russell_oje/week4-of-100daysofsolana-solanas-account-model-4254</guid>
      <description>&lt;p&gt;If you come from Web2, Solana's account model can feel strange at first. The first time I inspected an account with the CLI, I saw fields like &lt;code&gt;lamports&lt;/code&gt;, &lt;code&gt;owner&lt;/code&gt;, and &lt;code&gt;data&lt;/code&gt; all sitting together and thought, "Wait, where is the smart contract state stored?"&lt;/p&gt;

&lt;p&gt;That question is the whole lesson. On Solana, everything is an account. Wallets are accounts. Program code lives in accounts. Application state lives in accounts. There is no separate world of contract accounts versus externally owned accounts like you may have seen elsewhere. Solana uses one flat key-value store where the key is a 32-byte address and the value is the account itself.&lt;/p&gt;

&lt;p&gt;That design clicked for me when I started thinking about accounts like files in a filesystem. Each file has metadata, contents, and permissions. Solana accounts work the same way:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;the address is the filename&lt;/li&gt;
&lt;li&gt;the owner is the program allowed to manage it&lt;/li&gt;
&lt;li&gt;the data is the file contents&lt;/li&gt;
&lt;li&gt;the balance is the lamports stored alongside it&lt;/li&gt;
&lt;li&gt;the executable flag tells you whether the file is runnable code or just data&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That analogy is not perfect, but it gets you close fast. The System Program is like the operating system kernel. It creates accounts, assigns ownership, and handles basic bookkeeping. Other programs then read and write the accounts they own.&lt;/p&gt;

&lt;p&gt;Every Solana account has the same five fields:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;code&gt;lamports&lt;/code&gt; - the balance stored in the account. One SOL equals 1 billion lamports.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;data&lt;/code&gt; - a byte array that can hold arbitrary state.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;owner&lt;/code&gt; - the program that controls the account.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;executable&lt;/code&gt; - whether the account contains runnable program code.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;rent_epoch&lt;/code&gt; - a legacy field that is now effectively retired and set to the maximum value.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The most important rule is ownership. Only the owner program can modify an account's data or debit its lamports. That means a token program can update token accounts it owns, but nobody else can casually rewrite those bytes. At the same time, anyone can credit lamports to a writable account. That combination is simple, but it creates a very clear security model.&lt;/p&gt;

&lt;p&gt;What surprised me most was the statelessness of programs. In Web2 terms, a program is not a server that keeps its own memory forever. It is more like a web server binary that reads from and writes to a database. The executable account stores the code, and separate data accounts store the application state. That separation is why the account model matters so much: if you understand who owns the account and what data it contains, you understand how the program behaves.&lt;/p&gt;

&lt;p&gt;Here is the kind of output I kept seeing while exploring accounts:&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%2F7efzo1a28y91axwcgqik.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%2F7efzo1a28y91axwcgqik.png" alt="Account" width="800" height="312"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Each field tells a story. A zero-length &lt;code&gt;data&lt;/code&gt; field means the account is just holding value. The owner &lt;code&gt;11111111111111111111111111111111&lt;/code&gt; is the System Program. &lt;code&gt;executable: false&lt;/code&gt; means this is not a program account. And the huge &lt;code&gt;rentEpoch&lt;/code&gt; value is a clue that rent exemption has taken over the old rent schedule.&lt;/p&gt;

&lt;p&gt;Rent exemption is another detail that makes Solana feel different from a traditional backend. Every account must hold a minimum lamport balance proportional to its data size if it wants to stay on-chain. If the account drops below that threshold, it risks being purged over time. For a tiny basic account, the minimum is around 0.00089 SOL, though the exact value depends on the account size. You can check it with &lt;code&gt;solana rent&lt;/code&gt; or the &lt;code&gt;getMinimumBalanceForRentExemption&lt;/code&gt; RPC method.&lt;/p&gt;

&lt;p&gt;That idea matters because it forces you to think about storage costs up front. If you create a larger state account, you need to fund it accordingly. In Web2, disk space is usually someone else's problem. On Solana, the cost of storage is part of the design.&lt;/p&gt;

&lt;p&gt;The account model also explains why Solana feels so composable. Programs do not hide their state inside private memory. They operate on explicit accounts that can be inspected, passed around, and reasoned about independently. Once I stopped thinking in terms of "a contract with internal state" and started thinking in terms of "a program that manages files," the architecture made much more sense.&lt;/p&gt;

&lt;p&gt;If you are a Web2 developer, that is the mental model I would keep: Solana is a filesystem for programmable state. Accounts are the files. Programs are the executables. The System Program is the kernel. And ownership is the permission system that keeps everything safe.&lt;/p&gt;

&lt;p&gt;That framing turned Solana from something mysterious into something structured. The account model is not just an implementation detail. It is the core abstraction that makes the rest of Solana understandable.&lt;/p&gt;

</description>
      <category>100daysofsolana</category>
      <category>blockchain</category>
      <category>web3</category>
    </item>
    <item>
      <title>Recap of Week3</title>
      <dc:creator>Russell Oje</dc:creator>
      <pubDate>Thu, 14 May 2026 10:55:19 +0000</pubDate>
      <link>https://dev.to/russell_oje/recap-of-week3-2ipf</link>
      <guid>https://dev.to/russell_oje/recap-of-week3-2ipf</guid>
      <description>&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%2Fzfnq07yqxg63fcdzrt3l.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%2Fzfnq07yqxg63fcdzrt3l.png" alt="Recap of Week3" width="800" height="569"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This week I built my some Solana tools: a CLI transfer app and a confirmation UI, and I deep-dived into transaction anatomy: signatures, blockhashes, and atomicity. &lt;/p&gt;

&lt;p&gt;I broke transactions to understand failure. Now I can send SOL, verify it on-chain, and explain exactly what's happening at every step.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;#100DaysOfSolana&lt;/code&gt;&lt;/p&gt;

</description>
      <category>100daysofsolana</category>
    </item>
    <item>
      <title>Week3 of #100DaysOfSolana: Understanding Solana Transactions</title>
      <dc:creator>Russell Oje</dc:creator>
      <pubDate>Thu, 14 May 2026 10:49:35 +0000</pubDate>
      <link>https://dev.to/russell_oje/week3-of-100daysofsolana-understanding-solana-transactions-12mp</link>
      <guid>https://dev.to/russell_oje/week3-of-100daysofsolana-understanding-solana-transactions-12mp</guid>
      <description>&lt;p&gt;By the end of Week 2, I understood how data lives on accounts, public keys, and the absence of a backend. This week was about understanding &lt;em&gt;change&lt;/em&gt;: how transactions work, how to build them, and what happens when they fail.&lt;/p&gt;

&lt;p&gt;The turning point: transactions aren't requests to a server. They're cryptographically signed messages that prove you own the keypair and authorize a specific state change. And if they fail, the whole thing rolls back (even though you still pay the fee :)).&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;The Week 3 Journey&lt;/strong&gt;
&lt;/h2&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Day 15: Understand transaction anatomy&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;I started by taking apart an actual transaction on devnet. I sent a small transfer and then inspected it:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Pulled the transaction signature from the terminal&lt;/li&gt;
&lt;li&gt;Ran &lt;code&gt;solana confirm -v SIGNATURE&lt;/code&gt; to see the raw structure&lt;/li&gt;
&lt;li&gt;Opened the same transaction in Solana Explorer and compared the two views.&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%2Fj2yienp0qh29m6lgbzv3.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%2Fj2yienp0qh29m6lgbzv3.png" alt="Day 15" width="800" height="427"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;What I discovered: a transaction has exactly five parts:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Part&lt;/th&gt;
&lt;th&gt;What it means&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;Signatures&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;64-byte Ed25519 signatures proving you own the keypair&lt;/td&gt;
&lt;td&gt;Auth token&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Header&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Three bytes describing how many signers and read-only accounts&lt;/td&gt;
&lt;td&gt;HTTP headers&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;Every account the transaction may touch, in order&lt;/td&gt;
&lt;td&gt;Paths / query params&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;A recent block hash that expires in ~60-90 seconds&lt;/td&gt;
&lt;td&gt;CSRF token with expiry&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;The actual program calls with program ID, accounts, and data&lt;/td&gt;
&lt;td&gt;Request body&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The constraint clicked immediately: a serialized transaction must fit within &lt;strong&gt;1,232 bytes&lt;/strong&gt;. That's the maximum. And if any instruction fails, the whole transaction rolls back atomically (and like I stated before, you will still pay the fee).&lt;/p&gt;

&lt;p&gt;In Web2, I'm used to stateless request/response. This is different. A transaction is atomic, expiring, and size-limited. Those aren't bugs; they're features that make on-chain state changes safe and deterministic.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Day 16: Send your first SOL transfer&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Next, I built the practical skill: actually sending SOL on devnet.&lt;/p&gt;

&lt;p&gt;The steps felt straightforward:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Set the CLI to devnet: &lt;code&gt;solana config set -ud&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Airdrop 2 SOL (devnet only)&lt;/li&gt;
&lt;li&gt;Create a recipient keypair&lt;/li&gt;
&lt;li&gt;Send 0.5 SOL: &lt;code&gt;solana transfer RECIPIENT_PUBKEY 0.5 --allow-unfunded-recipient&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Verify both balances changed on-chain&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%2Fotdwn5hi732viuuftv7a.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%2Fotdwn5hi732viuuftv7a.png" alt="Day 16" width="800" height="166"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Day 17: Build a transfer tool&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Then I wrote a reusable CLI tool that accepts a recipient and amount. This wasn't just wrapping the CLI command. The tool worked. I could send SOL with three lines of code. But the real insight was seeing the transaction signature in the output. That signature is both the receipt and the transaction's unique ID. I can search it on Solana Explorer forever.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Day 18: Add transaction confirmation UI&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;On this day, I added a confirmation layer to transaction implementation:&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%2Fd1y9zqyyhruqago6qpa0.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%2Fd1y9zqyyhruqago6qpa0.png" alt="Day 18" width="800" height="474"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This added complexity, but it taught me something crucial: transactions are asynchronous. You send it, you get a signature immediately, but the transaction isn't confirmed until validators include it in a block. That can take seconds or fail entirely if the blockhash is too old.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Day 19: Explore failed transactions&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Finally, I broke transactions on purpose to understand failure modes.&lt;/p&gt;

&lt;p&gt;I forced invalid scenarios:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Sending more SOL than I had&lt;/li&gt;
&lt;li&gt;Sending to invalid addresses&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%2Fjg60cyrd5w69z3dywdga.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%2Fjg60cyrd5w69z3dywdga.png" alt="Day 19" width="800" height="569"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Each failure gave me a different error message on-chain:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;InsufficientFunds&lt;/code&gt; — clear and expected&lt;/li&gt;
&lt;li&gt;Invalid address formats — caught during construction before sending&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;What Clicked for Me&lt;/strong&gt;
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Transactions as cryptographic proof&lt;/strong&gt;: In Web2, a request is just data sent to a trusted server. On Solana, a transaction is a cryptographically signed message that proves I authorized it and that it hasn't been tampered with. That's a fundamentally more trustless model.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Also, &lt;strong&gt;confirmation is different from sending&lt;/strong&gt;: The signature appears immediately, but confirmation requires validators to include the transaction in a block. Polling for confirmation taught me that devnet sometimes takes a few seconds, and mainnet is even less predictable. I can't assume a transaction is final just because I have the signature.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;What about you?&lt;/strong&gt; Have you built with Solana transactions yet? What surprised you most about how they work? Drop a comment below.&lt;/p&gt;

</description>
      <category>100daysofsolana</category>
      <category>web3</category>
      <category>blockchain</category>
    </item>
    <item>
      <title>Day 16 of #100DaysOfSolana</title>
      <dc:creator>Russell Oje</dc:creator>
      <pubDate>Tue, 05 May 2026 23:14:06 +0000</pubDate>
      <link>https://dev.to/russell_oje/day-16-of-100daysofsolana-3554</link>
      <guid>https://dev.to/russell_oje/day-16-of-100daysofsolana-3554</guid>
      <description>&lt;p&gt;I just made a transfer to a new Solana account in less than a second.&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%2F1u9vrxc68ci2sptn8twv.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%2F1u9vrxc68ci2sptn8twv.png" alt="Terminal Image" width="800" height="166"&gt;&lt;/a&gt;&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%2Fmv0n6ii4xamali4pqzl6.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%2Fmv0n6ii4xamali4pqzl6.png" alt="Explorer Image" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>100daysofsolana</category>
    </item>
    <item>
      <title>Week2 Recap of #100DaysOfSolana</title>
      <dc:creator>Russell Oje</dc:creator>
      <pubDate>Mon, 04 May 2026 14:14:04 +0000</pubDate>
      <link>https://dev.to/russell_oje/week2-recap-of-100daysofsolana-4ml</link>
      <guid>https://dev.to/russell_oje/week2-recap-of-100daysofsolana-4ml</guid>
      <description>&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%2Fsm0ub9hm3w9yl5b3i0hf.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%2Fsm0ub9hm3w9yl5b3i0hf.png" alt="My Solana Account" width="800" height="135"&gt;&lt;/a&gt;&lt;br&gt;
This week I queried on-chain data, built a dashboard, and mapped traditional databases to Solana's account model. The biggest shift: I don't need a backend. The RPC is the API. The ledger is the database. Wallets are auth. Same address, different networks, same architecture. It finally made sense. &lt;/p&gt;

&lt;p&gt;&lt;code&gt;#100DaysOfSolana&lt;/code&gt;&lt;/p&gt;

</description>
      <category>100daysofsolana</category>
      <category>solana</category>
      <category>web3</category>
    </item>
    <item>
      <title>Week2 of #100DaysOfSolana: The Account Model</title>
      <dc:creator>Russell Oje</dc:creator>
      <pubDate>Mon, 04 May 2026 14:11:03 +0000</pubDate>
      <link>https://dev.to/russell_oje/week2-of-100daysofsolana-the-account-model-2af5</link>
      <guid>https://dev.to/russell_oje/week2-of-100daysofsolana-the-account-model-2af5</guid>
      <description>&lt;p&gt;By the end of Week 1, I understood identity on Solana. This week was about understanding &lt;em&gt;state&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;In traditional Web2 development, I was trained to think in two separate layers: code lives on a server, data lives in a database. They talk to each other through the database queries and middleware. It felt natural because I built that way for years. But Solana doesn't work that way, and this week it finally made sense why.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;The Week 2 Journey: From RPC Queries to Account Architecture&lt;/strong&gt;
&lt;/h2&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Day 8: "Read your first on-chain data"&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;I wrote a simple script that connected to devnet's RPC and queried a balance. It felt like calling a REST API, just pointing at a different kind of backend.&lt;/p&gt;

&lt;p&gt;The key moment: I realized I wasn't querying a database. I was asking the Solana network for the state of an &lt;em&gt;account&lt;/em&gt;. That account is not a row in a table somewhere. It's a first-class entity on the ledger itself.&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%2Fs5lpz4x12efgovdfin6w.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%2Fs5lpz4x12efgovdfin6w.png" alt="Day 8" width="800" height="203"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Day 9: "Fetch transactions"&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Next, I pulled transaction history for an address. Seeing block times, signatures, and slot numbers make me realize: every state change is a transaction, and every transaction is immutable history on-chain.&lt;/p&gt;

&lt;p&gt;For the first time, I understood audit logs at the protocol level. There's no way to delete a transaction. No way to "update" the past. If a balance changed, that change is forever stored on-chain, visible to everyone.&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%2Fugkbira1lb684ilmspvs.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%2Fugkbira1lb684ilmspvs.png" alt="Day 9" width="800" height="221"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Day 10: "Build a dashboard"&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Similar to Day 4 of Week1, I also built a browser app, but this one displays account data. Nothing fancy, just RPC calls in the frontend, rendered on the page.&lt;/p&gt;

&lt;p&gt;What clicked: the dashboard talks directly to the network. No backend API needed. No session management. The wallet in the browser is the auth. The RPC endpoint is the database. This is genuinely different.&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%2F8f3pv8y9d7syi4te594l.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%2F8f3pv8y9d7syi4te594l.png" alt="Day 10" width="800" height="468"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Day 11: "Compare accounts vs databases"&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;On this day, I mapped Web2 database concepts to Solana accounts:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Rows → Accounts&lt;/li&gt;
&lt;li&gt;Tables → A flat space of accounts identified by public key&lt;/li&gt;
&lt;li&gt;Auto-increment IDs → Base58 public keys&lt;/li&gt;
&lt;li&gt;Middleware auth → Program ownership rules&lt;/li&gt;
&lt;li&gt;Storage costs → Rent-exempt deposits&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Seeing the comparison table made it real. The account model isn't just a different API. It's a fundamentally different way to think about data architecture. And like I leaned here, in web3, there's no "join" operation because you organize data differently from the start. You fetch accounts by address, not by filtering queries. And you pay explicitly for storage, which makes you think carefully about what you store.&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%2F4ejy6t0jxr9xlwy3n5hj.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%2F4ejy6t0jxr9xlwy3n5hj.png" alt="Day 11" width="800" height="135"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Day 12: "Compare networks"&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Finally, I queried the same address on both devnet and mainnet. Different balances, different transaction histories, same address model.&lt;/p&gt;

&lt;p&gt;The insight: the architecture is identical, but the state is independent. Devnet is a sandbox. Mainnet is production. Both follow the same rules. I could deploy the same program to both and it would work. Same address derivation, same account queries, different network validators securing different state.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fhnyzkr48hes8u6hbxu3x.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%2Fhnyzkr48hes8u6hbxu3x.png" alt="Day 12" width="800" height="361"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;What Surprised Me&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;The biggest surprise was realizing I could build a complete on-chain app without writing a backend. In Web2, "no backend" means leaning on a third-party service (Firebase, Supabase, etc.). On Solana, "no backend" means the network &lt;em&gt;is&lt;/em&gt; the backend. The RPC is the API. The ledger is the database. Wallets handle identity.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;What's Still Confusing&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;PDAs (Program Derived Addresses) and how they relate to accounts. I saw them mentioned but haven't built with them yet. The concept of accounts owned by programs, and how programs use PDAs to derive deterministic addresses.&lt;/p&gt;

&lt;p&gt;Also, the economics of rent. I understand the concept, but I haven't felt the weight of deploying a large program or managing multiple accounts yet. When do rent costs become a serious consideration? When do I need to optimize?&lt;/p&gt;

</description>
      <category>100daysofsolana</category>
      <category>solana</category>
      <category>web3</category>
      <category>blockchain</category>
    </item>
    <item>
      <title>Solana Accounts vs Web2 Databases</title>
      <dc:creator>Russell Oje</dc:creator>
      <pubDate>Fri, 01 May 2026 09:43:27 +0000</pubDate>
      <link>https://dev.to/russell_oje/solana-accounts-vs-web2-databases-12a9</link>
      <guid>https://dev.to/russell_oje/solana-accounts-vs-web2-databases-12a9</guid>
      <description>&lt;p&gt;&lt;em&gt;"Unlike when you are used to building full-stack applications; a Next.js frontend, connected to a Laravel backend, and modeling state in MySQL or PostgreSQL; moving to Solana requires rewiring how you think about data."&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;I've been exploring blockchain development with Solana, and the biggest hurdle initially is the phrase: &lt;em&gt;"Everything is an account."&lt;/em&gt;&lt;/p&gt;

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

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5c257tzk01t805tj86bb.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%2F5c257tzk01t805tj86bb.png" alt="Solana Account" width="800" height="135"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The output of the CLI command above maps out exactly how traditional Web2 database concepts translate to the Solana runtime. &lt;/p&gt;

&lt;p&gt;Here is the side-by-side comparison I put together:&lt;/p&gt;

&lt;h3&gt;
  
  
  The Web2 vs. Solana comparison table
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Concept&lt;/th&gt;
&lt;th&gt;Web2&lt;/th&gt;
&lt;th&gt;Solana&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Data Storage&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;MySQL/PostgreSQL rows or MongoDB docs&lt;/td&gt;
&lt;td&gt;A "flat" byte array in an Account&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Logic vs. State&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Your Laravel/Node code is the logic; the DB is the state&lt;/td&gt;
&lt;td&gt;Both are Accounts; logic is just an account with &lt;code&gt;executable: true&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Primary Keys&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Auto-increment IDs or UUIDs (e.g., &lt;code&gt;user_id: 101&lt;/code&gt;)&lt;/td&gt;
&lt;td&gt;Base58 Public Keys (32 bytes) or PDAs&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Security/Auth&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Middleware checks (e.g., &lt;code&gt;$request-&amp;gt;user()&lt;/code&gt;)&lt;/td&gt;
&lt;td&gt;The Runtime checks: only the "Owner" program can write&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Filtering/Joins&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;SELECT * FROM table WHERE...&lt;/code&gt; (Server-side)&lt;/td&gt;
&lt;td&gt;No Joins. You fetch the account by address or filter off-chain via RPC&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Infrastructure&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;AWS/DigitalOcean monthly bills&lt;/td&gt;
&lt;td&gt;"Rent": A lamport deposit you get back when you &lt;code&gt;close()&lt;/code&gt; the account&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Deployment&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;CI/CD pushes code to a server&lt;/td&gt;
&lt;td&gt;Deploying a Program creates an account owned by the BPF Loader&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  The Biggest Takeaway
&lt;/h3&gt;

&lt;p&gt;In a traditional setup, you deploy your code to a server, and that code orchestrates database transactions. On Solana, both your application logic (programs) and your user data live as accounts in the exact same global space. &lt;/p&gt;

&lt;p&gt;There are no native queries, no joins, and no backend middleware guarding your tables. You pay upfront for the bytes you store via rent, and the runtime itself physically blocks unauthorized writes. Your database instincts around data modeling still matter, but the architectural execution is completely flipped. &lt;/p&gt;

&lt;p&gt;&lt;code&gt;#100DaysOfSolana&lt;/code&gt;&lt;/p&gt;

</description>
      <category>100daysofsolana</category>
      <category>solana</category>
      <category>blockchain</category>
    </item>
    <item>
      <title>Week1 Recap of #100DaysOfSolana</title>
      <dc:creator>Russell Oje</dc:creator>
      <pubDate>Mon, 27 Apr 2026 09:49:04 +0000</pubDate>
      <link>https://dev.to/russell_oje/week1-recap-of-100daysofsolana-2ei4</link>
      <guid>https://dev.to/russell_oje/week1-recap-of-100daysofsolana-2ei4</guid>
      <description>&lt;p&gt;This week I generated my first Solana keypair, persisted it, and connected a browser wallet to read my devnet balance in a small app. What surprised me most was realizing my identity is not a username in someone’s database; it is a keypair I control. &lt;/p&gt;

&lt;p&gt;Next I hope to turn this into real on-chain interactions and ship something people can use. &lt;/p&gt;

&lt;p&gt;&lt;code&gt;#100DaysOfSolana&lt;/code&gt;&lt;/p&gt;

</description>
      <category>solana</category>
      <category>100daysofsolana</category>
    </item>
    <item>
      <title>Week1 of #100DaysOfSolana</title>
      <dc:creator>Russell Oje</dc:creator>
      <pubDate>Mon, 27 Apr 2026 09:37:29 +0000</pubDate>
      <link>https://dev.to/russell_oje/week1-of-100daysofsolana-5bb5</link>
      <guid>https://dev.to/russell_oje/week1-of-100daysofsolana-5bb5</guid>
      <description>&lt;p&gt;On Day 1 of this challenge, I thought I was doing something small: generate a wallet, print an address, move on.&lt;/p&gt;

&lt;p&gt;I ran a script, got a fresh keypair, and saw a long string appear in my terminal. It looked random and slightly intimidating, but also familiar in the same way SSH keys feel familiar. In Web2, I have dozens of identities: GitHub username, work email, banking login, social accounts. Every system has its own account model, its own password reset flow, and its own lockout rules.&lt;/p&gt;

&lt;p&gt;Solana felt different immediately. That one keypair was not just an account for one app. It was the beginning of identity across an entire network.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;## The Week 1 Journey&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;### Day 1: "Here is your wallet"&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The first script generated a keypair and printed the public key. The idea seemed simple:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Public key = safe to share&lt;/li&gt;
&lt;li&gt;Private key = proof of ownership&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%2Fk7r5tjh3h0r7af9gpce7.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%2Fk7r5tjh3h0r7af9gpce7.png" alt="Day1" width="800" height="161"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;At this stage, it still felt like setup boilerplate.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;### Day 2: "Make it persistent"&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Then I built a script that loads an existing wallet from &lt;code&gt;wallet.json&lt;/code&gt; or creates one if missing. That changed the feeling.&lt;/p&gt;

&lt;p&gt;In Web2, identity is often a row in a database controlled by a platform. In this script, identity became something I could hold, persist, and re-use without asking anyone for permission. I also started to understand responsibility: if I lose this private key, there is no "Forgot Password" link.&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%2Fjkd1z9qcbzyt4b0lo3mf.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%2Fjkd1z9qcbzyt4b0lo3mf.png" alt="Day2" width="800" height="375"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;### Day 3: SOL vs lamports&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;I set up the CLI wallet and looked at balances both in SOL and in lamports. One SOL equals one billion lamports. Seeing balances in the smallest unit made Solana feel less abstract. It reminded me of cents in payments systems, except enforced by protocol rules instead of application code conventions.&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%2F2octe2pomn156uxeto7y.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%2F2octe2pomn156uxeto7y.png" alt="Day3" width="800" height="149"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;### Day 4: Browser wallet connection&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;This was the turning point. I built a Vite page, discovered installed wallets with Wallet Standard, connected Phantom, and fetched balance from RPC.&lt;/p&gt;

&lt;p&gt;In Web2 terms, this is what stood out: the app did not "create" my identity. The wallet presented an account, and the app read state from the network. The identity lived outside the app. If I switch apps, I keep the same on-chain identity because it is tied to my keypair, not that product's user table.&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%2Fef42gq2cobmxxvgwgs1n.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%2Fef42gq2cobmxxvgwgs1n.png" alt="Day4" width="800" height="561"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;### Day 5: Compare wallet types&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;After trying CLI, browser, and mobile wallets, I saw a practical tradeoff:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;CLI:&lt;/strong&gt; Fastest for scripts; least secure (plaintext file).&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Browser:&lt;/strong&gt; Best for dApps; medium security (password/encryption).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Mobile:&lt;/strong&gt; Best for personal use; highest hot-wallet security (biometrics).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Different interfaces, same underlying identity model.&lt;/p&gt;

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