<?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: Jedi of JavaScript</title>
    <description>The latest articles on DEV Community by Jedi of JavaScript (@jriffs).</description>
    <link>https://dev.to/jriffs</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%2F460648%2F84455982-c2ee-4629-b91a-962790e5f876.jpg</url>
      <title>DEV Community: Jedi of JavaScript</title>
      <link>https://dev.to/jriffs</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/jriffs"/>
    <language>en</language>
    <item>
      <title>Solana Transactions Aren't API Calls .. So what are they?</title>
      <dc:creator>Jedi of JavaScript</dc:creator>
      <pubDate>Thu, 11 Jun 2026 14:18:00 +0000</pubDate>
      <link>https://dev.to/jriffs/solana-transactions-arent-api-calls-so-what-are-they-4elf</link>
      <guid>https://dev.to/jriffs/solana-transactions-arent-api-calls-so-what-are-they-4elf</guid>
      <description>&lt;p&gt;As a backend developer, I came into Solana thinking transactions were basically API requests.&lt;/p&gt;

&lt;p&gt;You send some data, the network processes it, and you get a success or failure response.&lt;/p&gt;

&lt;p&gt;Technically that's not completely wrong.&lt;/p&gt;

&lt;p&gt;But after building my first transfer tool during the MLH 100 Days of Solana challenge, I realized that mental model breaks down pretty quickly.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Web2 Mental Model
&lt;/h2&gt;

&lt;p&gt;Most of us are used to something like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;fetch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;/api/transfer&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; 
     &lt;span class="na"&gt;method&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;POST&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; 
     &lt;span class="na"&gt;body&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;JSON&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;stringify&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; 
       &lt;span class="na"&gt;recipient&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;userId&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; 
       &lt;span class="na"&gt;amount&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&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;The server receives the request, checks permissions, updates a database, and sends back a response.&lt;/p&gt;

&lt;p&gt;The server is trusted.&lt;/p&gt;

&lt;p&gt;The database is trusted.&lt;/p&gt;

&lt;p&gt;Everything happens inside infrastructure controlled by a single organization.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Actually Happens On Solana
&lt;/h2&gt;

&lt;p&gt;A Solana transaction is much closer to a signed instruction package than an API request.&lt;br&gt;
When I built a CLI tool to transfer SOL, the process looked more like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nf"&gt;createTransactionMessage&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;version&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt; &lt;span class="p"&gt;}),&lt;/span&gt; 
 &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;tx&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;setTransactionMessageFeePayerSigner&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;sender&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;tx&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; 
 &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;tx&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;setTransactionMessageLifetimeUsingBlockhash&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;latestBlockhash&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;tx&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; 
 &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;tx&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; 
   &lt;span class="nf"&gt;appendTransactionMessageInstruction&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; 
     &lt;span class="nf"&gt;getTransferSolInstruction&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; 
       &lt;span class="na"&gt;source&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;sender&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; 
       &lt;span class="na"&gt;destination&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;recipient&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; 
       &lt;span class="na"&gt;amount&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;transferLamports&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; 
     &lt;span class="p"&gt;}),&lt;/span&gt; 
  &lt;span class="nx"&gt;tx&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;Before anything reaches the network, I have to:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Define the instruction&lt;/li&gt;
&lt;li&gt;Specify who pays the fee&lt;/li&gt;
&lt;li&gt;Add a recent blockhash&lt;/li&gt;
&lt;li&gt;Sign the transaction with my private key&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Only then can it be submitted.&lt;br&gt;
Unlike a typical API call, the network doesn't trust me just because I connected to it. I have to cryptographically prove I am authorized to perform the action.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Part That Surprised Me
&lt;/h2&gt;

&lt;p&gt;What surprised me most was transaction confirmation.&lt;/p&gt;

&lt;p&gt;In Web2, a successful response usually means you're done.&lt;/p&gt;

&lt;p&gt;On Solana, there are stages.&lt;/p&gt;

&lt;p&gt;A transaction moves through commitment levels:&lt;br&gt;
Processed&lt;br&gt;
↓&lt;br&gt;
Confirmed&lt;br&gt;
↓&lt;br&gt;
Finalized&lt;/p&gt;

&lt;p&gt;When I upgraded my transfer tool, I started tracking these stages explicitly:&lt;br&gt;
&lt;code&gt;await waitForCommitment(rpc, signature, "confirmed"); &lt;br&gt;
await waitForCommitment(rpc, signature, "finalized");&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;This gave me output like:&lt;/p&gt;

&lt;p&gt;Status: Sending transaction...&lt;br&gt;
Status: Processed&lt;br&gt;
Status: Confirmed&lt;br&gt;
Status: Finalized&lt;/p&gt;

&lt;p&gt;That felt much closer to watching a distributed system reach consensus than waiting for an API response.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where The Database Analogy Still Works
&lt;/h2&gt;

&lt;p&gt;One thing that felt familiar was atomicity.&lt;/p&gt;

&lt;p&gt;Like a database transaction, a Solana transaction is all-or-nothing.&lt;/p&gt;

&lt;p&gt;Either every instruction succeeds, or the entire transaction fails.&lt;/p&gt;

&lt;p&gt;There is no partial success.&lt;/p&gt;

&lt;p&gt;But unlike a database transaction, Solana transactions must also be signed, broadcast to a decentralized network, voted on by validators, and confirmed before they're considered final.&lt;/p&gt;

&lt;p&gt;That's where the analogy stops being useful.&lt;/p&gt;

&lt;h2&gt;
  
  
  My Biggest Takeaway
&lt;/h2&gt;

&lt;p&gt;The biggest mental shift for me was realizing that a Solana transaction isn't a request asking a server to do something.&lt;/p&gt;

&lt;p&gt;It's a signed statement saying:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"I authorize these exact state changes."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The network then verifies that statement, executes it, and reaches consensus on the result.&lt;/p&gt;

&lt;p&gt;That sounds like a small distinction, but it completely changes how you think about application architecture.&lt;/p&gt;

&lt;p&gt;As a Web2 developer learning Solana, that was the moment transactions finally clicked for me.&lt;/p&gt;

</description>
      <category>100daysofsolana</category>
      <category>solana</category>
      <category>web3</category>
    </item>
    <item>
      <title>My 100-days-of-solana experience so far</title>
      <dc:creator>Jedi of JavaScript</dc:creator>
      <pubDate>Mon, 08 Jun 2026 12:30:49 +0000</pubDate>
      <link>https://dev.to/jriffs/my-100-days-of-solana-experience-so-far-1in3</link>
      <guid>https://dev.to/jriffs/my-100-days-of-solana-experience-so-far-1in3</guid>
      <description>&lt;p&gt;My experience honestly has been fun .. learning about the Solana blockchain, how to build on it and everything in between. the concept which has stuck with me the most is this:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;For Traditional Web2.0 databases where everything is private and you choose what to make public, it's sorta the reverse for Solana where everything is public and you choose what is private.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Although it isn't exactly your choice, but you get the idea 😪😉&lt;/p&gt;

</description>
      <category>100daysofsolana</category>
      <category>web3</category>
    </item>
    <item>
      <title>My Pronouns Are Public-Key &amp; Wallet</title>
      <dc:creator>Jedi of JavaScript</dc:creator>
      <pubDate>Sat, 06 Jun 2026 23:58:50 +0000</pubDate>
      <link>https://dev.to/jriffs/my-pronouns-are-public-key-wallet-1cc2</link>
      <guid>https://dev.to/jriffs/my-pronouns-are-public-key-wallet-1cc2</guid>
      <description>&lt;p&gt;If you're coming from Web2, identity usually means some combination of:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Username&lt;/li&gt;
&lt;li&gt;Email address&lt;/li&gt;
&lt;li&gt;Password&lt;/li&gt;
&lt;li&gt;OAuth ("Sign in with Google")&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In other words, your identity is typically managed by a server somewhere.&lt;/p&gt;

&lt;p&gt;Solana flips that idea on its head.&lt;/p&gt;

&lt;p&gt;On Solana, your identity is your wallet.&lt;/p&gt;

&lt;p&gt;More specifically, it's your public key.&lt;/p&gt;

&lt;p&gt;Think of a wallet as an SSH key pair. If you've ever generated an SSH key to connect to a server, you've already seen the core idea. You have:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A public key that can be shared freely&lt;/li&gt;
&lt;li&gt;A private key that must remain secret&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Solana wallets work the same way. The fun and interesting part is that - &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Both keys are basically just math numbers, carefully crafted collection of 1's and zero's (sophisticated cryptography, so you can't just write a bunch of numbers and expect em to work .. lol), and they are created independent of the blockchain but still completely legit and recognized by the blockchain&lt;br&gt;
.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Your public key is your address. Anyone can see it, send assets to it, or verify actions associated with it.&lt;/p&gt;

&lt;p&gt;Your private key is proof that you control that address. Instead of logging in with a password, you prove ownership by signing transactions and messages.&lt;/p&gt;

&lt;p&gt;What's also interesting is that there are no usernames or accounts built into Solana itself. The blockchain doesn't know your name, email, or profile picture. It only knows that a particular public key signed a particular action.&lt;/p&gt;

&lt;p&gt;That means identity becomes portable.&lt;/p&gt;

&lt;p&gt;If I use my wallet to connect to ten different Solana applications, I'm still the same identity everywhere. I don't need ten different accounts or ten different passwords. My wallet is the account.&lt;/p&gt;

&lt;p&gt;This is why wallet connection buttons in Solana apps feel similar to "Sign in with Google" in Web2. The difference is that Google owns your identity, while your wallet is owned by you.&lt;/p&gt;

&lt;p&gt;After spending the first few days learning Solana, this was the biggest mental shift for me:&lt;/p&gt;

&lt;p&gt;In Web2, identity is something a platform gives you.&lt;/p&gt;

&lt;p&gt;In Solana, identity is something you bring with you.&lt;/p&gt;

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