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