<?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>Forem: Alena</title>
    <description>The latest articles on Forem by Alena (@alenadevsoft).</description>
    <link>https://forem.com/alenadevsoft</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%2F3908355%2F2225cc41-06f2-4371-a91e-fc6292a4bc7b.jpeg</url>
      <title>Forem: Alena</title>
      <link>https://forem.com/alenadevsoft</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/alenadevsoft"/>
    <language>en</language>
    <item>
      <title>A .NET Dinosaur in Web3. Day 3 - Voting, Sybil Attacks and Identity</title>
      <dc:creator>Alena</dc:creator>
      <pubDate>Sun, 03 May 2026 09:51:21 +0000</pubDate>
      <link>https://forem.com/alenadevsoft/a-net-dinosaur-in-web3-3-7j9</link>
      <guid>https://forem.com/alenadevsoft/a-net-dinosaur-in-web3-3-7j9</guid>
      <description>&lt;p&gt;Day 3 was the first day that felt like actual software engineering rather than syntax tourism. The task: write a voting contract. Simple enough on the surface - until you start poking at the security model and realize the whole thing has serious gaps in its logic.&lt;/p&gt;

&lt;p&gt;What looked like a toy example turned out to be a good proxy for real system design problems.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Contract
&lt;/h2&gt;

&lt;p&gt;Instead of dumping a wall of code here, I moved the full contract and instructions to GitHub. This post is about what actually matters - how it works.&lt;/p&gt;

&lt;p&gt;GitHub: &lt;a href="https://github.com/alena-dev-soft/solidity-learn/tree/main/contracts/03day" rel="noopener noreferrer"&gt;github.com/alena-dev-soft/solidity-learn/contracts/03day/&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What Actually Clicked
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;&lt;code&gt;struct&lt;/code&gt; → &lt;code&gt;record&lt;/code&gt; in C#&lt;/strong&gt;&lt;br&gt;
Not a class. No methods, no behavior - pure data container. Closer to &lt;code&gt;record&lt;/code&gt;&lt;br&gt;
in C# than anything else.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;code&gt;mapping(address =&amp;gt; bool)&lt;/code&gt; → &lt;code&gt;Dictionary&amp;lt;address, bool&amp;gt;&lt;/code&gt;&lt;/strong&gt;&lt;br&gt;
Exact mental model. The key is a wallet address, the value is whether they've&lt;br&gt;
voted. Lookup is O(1), there's no iteration - same tradeoffs as &lt;code&gt;Dictionary&lt;/code&gt;&lt;br&gt;
in .NET.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;code&gt;view&lt;/code&gt; modifier → read-only, free to call&lt;/strong&gt;&lt;br&gt;
Methods marked &lt;code&gt;view&lt;/code&gt; don't write to state, so they don't cost gas. The EVM&lt;br&gt;
equivalent of a GET endpoint versus a POST. This clicked immediately because&lt;br&gt;
the cost model maps directly to why you'd separate reads from writes in&lt;br&gt;
any system.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;code&gt;require()&lt;/code&gt; → guard clauses + exception in one&lt;/strong&gt;&lt;br&gt;
&lt;code&gt;require(condition, "message")&lt;/code&gt; is exactly &lt;code&gt;if (!condition) throw new Exception("message")&lt;/code&gt; - except when it reverts, the entire transaction is reverted. No state is changed, but gas is still spent. Closer to a database transaction abort than a simple exception.&lt;/p&gt;

&lt;h2&gt;
  
  
  Key Insight
&lt;/h2&gt;

&lt;p&gt;At some point I stopped and asked myself a simple question.&lt;/p&gt;

&lt;p&gt;How does the contract know that "Alice" is actually Alice?&lt;/p&gt;

&lt;p&gt;The answer was a little unsettling - because I've spent years designing systems where knowing who the user is was fundamental. Authentication, authorization, identity verification. That was always the baseline.&lt;/p&gt;

&lt;p&gt;In Web3 there is no baseline like that.&lt;/p&gt;

&lt;p&gt;The contract sees only an address. Just a string starting with &lt;code&gt;0x&lt;/code&gt;. No name, no history, no face. If the same person creates 10 wallets - congratulations, they now have 10 votes.&lt;/p&gt;

&lt;p&gt;This is just how the system works.&lt;/p&gt;

&lt;p&gt;And once that clicks, it quietly rewires how you think about everything else: access control, fairness, "one person = one vote." All the assumptions we carry from Web2 - where identity is tied to accounts, emails, phone numbers - simply don't apply here.&lt;/p&gt;

&lt;p&gt;Ownership of a wallet is not identity. It's just… ownership of a wallet.&lt;/p&gt;

&lt;p&gt;The fix exists, of course. Several of them, actually.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Whitelist&lt;/strong&gt; - the owner manually approves addresses. Simple, but it requires trusting whoever manages the list. And it scales terribly.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;NFT / Token gating&lt;/strong&gt; - only wallets holding a specific token can participate. Think of it as a membership card. Still doesn't prove who the person is - just that they own the token.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Proof of Humanity&lt;/strong&gt; - on-chain verification that a real human stands behind the address. Technically elegant. Still a largely unsolved problem at scale.&lt;/p&gt;

&lt;p&gt;And then there's the quiet irony: most production solutions still route back to Web2 identity providers - Google, Binance, Microsoft and others. Web3 solved decentralized execution beautifully - identity remains outsourced to the old world.&lt;/p&gt;

&lt;p&gt;So no, dinosaurs aren't extinct yet. Apparently we're still needed. 🦕 (like me 🙃)&lt;/p&gt;

&lt;h2&gt;
  
  
  Side Observations
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Etherscan shows bytecode by default.&lt;/strong&gt; The contract is there, but unreadable - same as looking at compiled IL instead of C# source. To expose the actual Solidity code, you need to verify the contract: upload the source, match the compiler version exactly. One wrong version number and it fails silently.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Remix doesn't persist deployed contracts across page reloads.&lt;/strong&gt; After a refresh, the contract still exists on-chain - but Remix has no memory of it. Recovery is straightforward: find the contract address on Etherscan, use "At Address" in Remix to reattach. Good to know before it happens in a less forgiving context.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Testing multi-wallet scenarios requires either Remix VM or separate wallets with testnet ETH.&lt;/strong&gt; Browser Extension mode only sees what MetaMask sees. Not a problem - just a constraint to know upfront.&lt;/p&gt;

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

&lt;p&gt;Day 3 changed something in how I think about system design in Web3.&lt;/p&gt;

&lt;p&gt;In Web2, identity is assumed. You build on top of it. In Web3, identity is your problem to solve - and every solution is either a tradeoff or a dependency on something outside the chain.&lt;/p&gt;

&lt;p&gt;The contract works. The logic is sound. The gaps are in the model, not the code.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Stage: Dinosaur 🦕 - mapping the terrain. Starting to see where the edges are.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Day 4 incoming. 🚀&lt;/p&gt;

</description>
      <category>web3</category>
      <category>solidity</category>
      <category>learning</category>
    </item>
    <item>
      <title>A .NET Dinosaur in Web3. Day 2 - Access Control</title>
      <dc:creator>Alena</dc:creator>
      <pubDate>Sun, 03 May 2026 09:44:52 +0000</pubDate>
      <link>https://forem.com/alenadevsoft/a-net-dinosaur-in-web3-2-4g41</link>
      <guid>https://forem.com/alenadevsoft/a-net-dinosaur-in-web3-2-4g41</guid>
      <description>&lt;p&gt;New day, new challenge...&lt;br&gt;
Counter.sol - a little better than "Hello World", right?&lt;/p&gt;

&lt;p&gt;The goal: write a simple Counter contract - increment, decrement, reset -&lt;br&gt;
with real access rules.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Contract
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight cpp"&gt;&lt;code&gt;&lt;span class="c1"&gt;// SPDX-License-Identifier: MIT&lt;/span&gt;
&lt;span class="n"&gt;pragma&lt;/span&gt; &lt;span class="n"&gt;solidity&lt;/span&gt; &lt;span class="o"&gt;^&lt;/span&gt;&lt;span class="mf"&gt;0.8.0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="n"&gt;contract&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;uint256&lt;/span&gt; &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="n"&gt;count&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="n"&gt;address&lt;/span&gt; &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="n"&gt;owner&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="n"&gt;constructor&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;owner&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;msg&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;sender&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="n"&gt;count&lt;/span&gt; &lt;span class="o"&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="n"&gt;function&lt;/span&gt; &lt;span class="n"&gt;increment&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;count&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="n"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;decrement&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;count&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"Already zero"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="n"&gt;count&lt;/span&gt; &lt;span class="o"&gt;-=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="n"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;reset&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;msg&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;sender&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="n"&gt;owner&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"Only owner can reset!"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="n"&gt;count&lt;/span&gt; &lt;span class="o"&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="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;GitHub: &lt;a href="http://github.com/alena-dev-soft/solidity-learn/contracts/02day/" rel="noopener noreferrer"&gt;github.com/alena-dev-soft/solidity-learn/contracts/02day/&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What Actually Clicked
&lt;/h2&gt;

&lt;p&gt;In the .NET world we use &lt;code&gt;HttpContext.User&lt;/code&gt; to know who's making a request. In Solidity it's &lt;code&gt;msg.sender&lt;/code&gt; - the wallet address of whoever called the method. No login system, no JWT, no sessions. Just a cryptographically verified address. The contract knows exactly who you are. Always.&lt;/p&gt;

&lt;p&gt;The next thing - calling &lt;code&gt;count&lt;/code&gt; to check the current value is free.Simple rule: no transaction, no gas.&lt;/p&gt;

&lt;p&gt;But there's a warning that almost everyone forgets - which makes it kind of dangerous for your budget. If you forget to switch from the real network to the test network, those transactions will cost you actual money. Every single one.&lt;/p&gt;

&lt;h2&gt;
  
  
  The .NET → Solidity Map (So Far)
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Solidity&lt;/th&gt;
&lt;th&gt;.NET equivalent&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;msg.sender&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;HttpContext.User&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;require()&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Guard clause + exception&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;uint256&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;uint&lt;/code&gt; (unsigned)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;address&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;No direct equivalent — wallet ID&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Day 2 Score: 10/10
&lt;/h2&gt;

&lt;p&gt;Everything is mapping cleanly to .NET concepts. The mental model is familiar, the syntax is new.&lt;/p&gt;

&lt;p&gt;Tomorrow I want something with real-world application - not a toy example, but a contract that actually does something useful.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Stage: Dinosaur 🦕 - mapping the terrain.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Day 3 incoming. 🚀&lt;/em&gt;&lt;/p&gt;

</description>
      <category>web3</category>
      <category>learning</category>
      <category>solidity</category>
    </item>
    <item>
      <title>A .NET Dinosaur in Web3. Day 1 - First Smart Contract</title>
      <dc:creator>Alena</dc:creator>
      <pubDate>Sun, 03 May 2026 09:37:47 +0000</pubDate>
      <link>https://forem.com/alenadevsoft/a-net-dinosaur-in-web3-1-38g7</link>
      <guid>https://forem.com/alenadevsoft/a-net-dinosaur-in-web3-1-38g7</guid>
      <description>&lt;p&gt;I've been writing .NET for many years. Today I deployed my first smart contract.&lt;br&gt;
Here's what actually happened.&lt;/p&gt;

&lt;p&gt;I'd like to share my journey into Web3 — every single day.&lt;br&gt;
Maybe it'll be helpful for someone out there.&lt;/p&gt;

&lt;p&gt;I love what I do — really. I'm a .NET Dinosaur and Azure-passionate developer,&lt;br&gt;
but let's be honest — the .NET niche isn't exactly overflowing with money 💵.&lt;br&gt;
I've been meaning to try something new for a while. Something with a cool and&lt;br&gt;
live market. Something different. So I chose Web3.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Setup: I Built Myself an AI Mentor
&lt;/h2&gt;

&lt;p&gt;Instead of drowning in YouTube tutorials and boring courses, I did something&lt;br&gt;
a little different. Well — I have ADHD. And I know my brain. It needs dopamine&lt;br&gt;
to stay focused (weird combo, ADHD person and software engineer — but for me,&lt;br&gt;
coding is my dopamine). My brain needs a clear win every single day, not a&lt;br&gt;
promise of understanding. So I configured Claude as my personal AI mentor:&lt;br&gt;
one goal per day, theory only when it's actually needed, and an honest debrief&lt;br&gt;
of where I got stuck.&lt;/p&gt;

&lt;p&gt;Think of it as a personal trainer who never judges you for asking "stupid"&lt;br&gt;
questions, and is available 24/7.&lt;/p&gt;

&lt;p&gt;So — today was Day 1.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Goal
&lt;/h2&gt;

&lt;p&gt;Deploy your first smart contract to a test network and see its address&lt;br&gt;
on the blockchain.&lt;/p&gt;

&lt;p&gt;Simple, concrete — and I received detailed instructions, step by step.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I Actually Did
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Set up MetaMask.&lt;/strong&gt; "Piece of cake" — really. I already had an account,&lt;br&gt;
but I'd forgotten my keys (things happen). So I had to create a new one.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Switched to the Sepolia test network.&lt;/strong&gt; A staging environment where&lt;br&gt;
everything works exactly like the real Ethereum network — but you're not&lt;br&gt;
using real money.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Got free test ETH.&lt;/strong&gt; ETH is needed for "gas" — the fee you pay for&lt;br&gt;
every piece of code the blockchain executes. It's free, but finding a working&lt;br&gt;
faucet with an empty wallet took 3 attempts.&lt;br&gt;
&lt;em&gt;(I'm a beginner — I don't have funds for that yet 😅)&lt;/em&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Wrote my first Solidity contract in Remix IDE.&lt;/strong&gt; Solidity, by the way,&lt;br&gt;
reads really easily — like other typed languages. For a .NET brain, it's&lt;br&gt;
immediately familiar: classes, constructors, typed fields, public methods.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Deployed it.&lt;/strong&gt; One click, one MetaMask confirmation, 30 seconds of&lt;br&gt;
waiting — and pure happiness when I received a contract address.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Where I Got Stuck
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;MetaMask's UI has changed.&lt;/strong&gt; Sometimes my AI mentor provided instructions&lt;br&gt;
for the old version, so finding things took a little more time than expected.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Three faucets, one winner.&lt;/strong&gt; Getting free test ETH required more tries&lt;br&gt;
than expected:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Faucet&lt;/th&gt;
&lt;th&gt;Result&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="http://sepoliafaucet.com" rel="noopener noreferrer"&gt;sepoliafaucet.com&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;❌ Requires conditions I didn't meet&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://faucets.chain.link/sepolia" rel="noopener noreferrer"&gt;faucets.chain.link/sepolia&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;❌ Asks for LINK tokens&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://cloud.google.com/application/web3/faucet/ethereum/sepolia" rel="noopener noreferrer"&gt;Google Web3 Faucet&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;✅ Worked immediately&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Day 1 Score: 9/10
&lt;/h2&gt;

&lt;p&gt;Easier than expected, honestly. The .NET background helps more than I thought —&lt;br&gt;
typed languages, deployment concepts, staging vs production thinking. It all&lt;br&gt;
maps over. I played with the code and the environment.&lt;/p&gt;

&lt;p&gt;Solidity feels like home. A strange, decentralised, immutable home — but home.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Stage: Dinosaur 🦕 — mapping the terrain.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;See you on Day 2. 🚀&lt;/p&gt;

</description>
      <category>web3</category>
      <category>solidity</category>
      <category>learning</category>
    </item>
    <item>
      <title>Hello!</title>
      <dc:creator>Alena</dc:creator>
      <pubDate>Sun, 03 May 2026 09:31:21 +0000</pubDate>
      <link>https://forem.com/alenadevsoft/hello-12p9</link>
      <guid>https://forem.com/alenadevsoft/hello-12p9</guid>
      <description>&lt;p&gt;&lt;strong&gt;I'm a .NET dinosaur. And I'm done being one.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Senior .NET and Azure backend developer, also former Tech Lead. Years of enterprise systems, clean architecture, corporate backend at scale. It's a solid career. It's also, if I'm being honest - started to feel like the same hallway walked in circles.&lt;/p&gt;

&lt;p&gt;So I'm changing direction. Slowly and deliberately.&lt;br&gt;
Not because .NET is bad or I don't like it anymore. But the work got repetitive, the market got crowded, and somewhere along the way the technology stopped feeling like a frontier.&lt;br&gt;
My new space is blockchain. The execution model is different. The trust model is different. The economics are different. And unlike most of my .NET career - the output is visible, verifiable, and lives on a public ledger forever.&lt;br&gt;
So I'm learning Solidity from scratch. Publicly.&lt;/p&gt;

&lt;p&gt;The series "A .NET Dinosaur in Web3" will contain real code, real mistakes, real "naive" thoughts, .NET analogies where they help - and honest notes on what it actually takes to make this switch.&lt;/p&gt;

&lt;p&gt;I started writing on another platform - and will gradually move my "historic" articles here.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Stage: Dinosaur 🦕 - mapping the terrain.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>programming</category>
      <category>web3</category>
      <category>solidity</category>
      <category>learning</category>
    </item>
  </channel>
</rss>
