<?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: jian</title>
    <description>The latest articles on DEV Community by jian (@jian_fcdfc38b12da2c318f9d).</description>
    <link>https://dev.to/jian_fcdfc38b12da2c318f9d</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%2F3920678%2F1c938982-ec5f-4c0a-8245-58b9be5b98f6.jpg</url>
      <title>DEV Community: jian</title>
      <link>https://dev.to/jian_fcdfc38b12da2c318f9d</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/jian_fcdfc38b12da2c318f9d"/>
    <language>en</language>
    <item>
      <title>Building Sparrow — notes from writing a small Proof-of-Work blockchain in 2026</title>
      <dc:creator>jian</dc:creator>
      <pubDate>Fri, 08 May 2026 20:03:59 +0000</pubDate>
      <link>https://dev.to/jian_fcdfc38b12da2c318f9d/building-sparrow-notes-from-writing-a-small-proof-of-work-blockchain-in-2026-291h</link>
      <guid>https://dev.to/jian_fcdfc38b12da2c318f9d/building-sparrow-notes-from-writing-a-small-proof-of-work-blockchain-in-2026-291h</guid>
      <description>&lt;p&gt;I built a small Proof-of-Work cryptocurrency called &lt;strong&gt;Sparrow (SPW)&lt;/strong&gt; as a long-running side project. CPU-mineable (RandomX), Bitcoin-style UTXO ledger, optional stealth addresses, no pre-mine, no VC, no governance token. Mainnet has been running since April 2026. This post is about the design choices and what I'd do differently.&lt;/p&gt;




&lt;h2&gt;
  
  
  Why bother building another chain?
&lt;/h2&gt;

&lt;p&gt;Most of what gets called a "blockchain project" in 2025–2026 is one of three things:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;A high-FDV token launch with a small fraction unlocked at TGE and a reserved investor allocation that vests over years.&lt;/li&gt;
&lt;li&gt;A fork of an L1 with a different validator set and a token re-skin.&lt;/li&gt;
&lt;li&gt;A meme.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;That's fine — the market wants those. But there is essentially no one shipping the &lt;em&gt;original&lt;/em&gt; idea any more: a fixed-supply, proof-of-work, individually-mineable, cryptocurrency-shaped cryptocurrency. Bitcoin became infrastructure for institutions. Monero is solid but mandatory privacy puts it in a regulatory category I don't want to inherit. Kaspa is interesting but goes after a different design space (high TPS, BlockDAG).&lt;/p&gt;

&lt;p&gt;So I built Sparrow as a deliberately small project: &lt;strong&gt;the kind of chain a single developer can read end-to-end in an afternoon&lt;/strong&gt;. Roughly:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;spw_chain/
├── config.py        ~80 lines  — constants, emission schedule
├── core/            ~700 lines — Block, Transaction, Chain, Merkle
├── storage/         ~250 lines — sqlite-backed UTXO + chain index
├── wallet/          ~400 lines — keys, BIP39, BIP32, stealth
├── api/             ~300 lines — Flask REST endpoints
├── miner.py         ~120 lines — local PoW miner
├── miner_client.py  ~500 lines — remote miner (talks REST)
└── sparrow.py       ~260 lines — CLI entry point
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Total: about 2,500 lines of Python you can audit yourself. That is, in itself, a feature in 2026.&lt;/p&gt;




&lt;h2&gt;
  
  
  Design decision 1: RandomX over SHA-256
&lt;/h2&gt;

&lt;p&gt;Bitcoin uses SHA-256d — beautiful in 2009, but in 2026 it means ASIC farms, electricity contracts, and a barrier to entry that's already keeping out anyone who isn't running a hosted facility.&lt;/p&gt;

&lt;p&gt;The alternative I picked was &lt;strong&gt;RandomX&lt;/strong&gt;, the same algorithm Monero uses. The short version of why:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;CPU-optimized&lt;/strong&gt;: it's &lt;em&gt;designed&lt;/em&gt; to make CPUs the fastest hardware, not GPUs or ASICs.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Memory-hard&lt;/strong&gt;: ~2 GB of memory per VM in fast mode. ASIC economics don't work when you need that much DRAM.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Battle-tested&lt;/strong&gt;: it's been live in production on Monero for years.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Hooking it in was almost embarrassingly simple — RandomX has a clean Python binding:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;randomx&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;hashlib&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;pow_hash&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;header_bytes&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;bytes&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;bytes&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;bytes&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;vm&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;randomx&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;RandomX&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;vm&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;calculate_hash&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;header_bytes&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;block_hash&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;raw&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;bytes&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="c1"&gt;# txid / Merkle still uses SHA-256d (cheap, well-understood)
&lt;/span&gt;    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;hashlib&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;sha256&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;hashlib&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;sha256&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;raw&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;digest&lt;/span&gt;&lt;span class="p"&gt;()).&lt;/span&gt;&lt;span class="nf"&gt;hexdigest&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The mining loop is the obvious one: increment the nonce, hash, compare against the target. The interesting part isn't the loop — it's that &lt;strong&gt;the loop is winnable on a laptop&lt;/strong&gt;. I tested with a 2020 ThinkPad and it found blocks on testnet. That's the whole point.&lt;/p&gt;

&lt;p&gt;The trade-off you're accepting: hashrate will be lower than a SHA-256 chain at the same valuation. That's fine for a network whose pitch is "individuals can participate," not "secure trillions of dollars."&lt;/p&gt;




&lt;h2&gt;
  
  
  Design decision 2: UTXO over accounts
&lt;/h2&gt;

&lt;p&gt;Ethereum-style account models are easier to reason about for smart contracts. UTXO is easier to reason about for &lt;strong&gt;money&lt;/strong&gt;. I went with UTXO because:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;It composes trivially with multi-input/multi-output transactions, change addresses, CoinJoin-style protocols, and stealth addresses.&lt;/li&gt;
&lt;li&gt;The validation logic is local — each input only depends on its referenced output.&lt;/li&gt;
&lt;li&gt;It plays well with how Bitcoin wallets, hardware wallets, BIP standards, etc. already work.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The internal representation is straightforward — outputs, inputs, transaction:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="nd"&gt;@dataclass&lt;/span&gt;
&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;TxOutput&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;amount&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;  &lt;span class="nb"&gt;int&lt;/span&gt;           &lt;span class="c1"&gt;# in feathers (10^-8 SPW)
&lt;/span&gt;    &lt;span class="n"&gt;address&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;           &lt;span class="c1"&gt;# Base58Check, version 0x1e
&lt;/span&gt;
&lt;span class="nd"&gt;@dataclass&lt;/span&gt;
&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;TxInput&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;prev_txid&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;
    &lt;span class="n"&gt;vout&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;      &lt;span class="nb"&gt;int&lt;/span&gt;
    &lt;span class="n"&gt;script_sig&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;        &lt;span class="c1"&gt;# ECDSA signature over signing_data()
&lt;/span&gt;    &lt;span class="n"&gt;pubkey&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;    &lt;span class="nb"&gt;str&lt;/span&gt;

&lt;span class="nd"&gt;@dataclass&lt;/span&gt;
&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Transaction&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;inputs&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;  &lt;span class="nb"&gt;list&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;TxInput&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
    &lt;span class="n"&gt;outputs&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;list&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;TxOutput&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
    &lt;span class="c1"&gt;# txid = SHA-256d(canonical_bytes)
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The chain stores UTXOs in a SQLite table indexed by &lt;code&gt;(txid, vout)&lt;/code&gt; plus a secondary index on &lt;code&gt;address&lt;/code&gt;. That's enough for a balance lookup at REST API speed:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;get_balance&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;address&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;int&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;row&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;cursor&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;execute&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;SELECT COALESCE(SUM(amount), 0) FROM utxos WHERE address = ?&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;address&lt;/span&gt;&lt;span class="p"&gt;,)&lt;/span&gt;
    &lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;fetchone&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;row&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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;No fancy state tree, no Merkle Patricia, no per-account journaling. SQLite is the boring, reliable answer for a chain you intend to keep small.&lt;/p&gt;




&lt;h2&gt;
  
  
  Design decision 3: A bell-curve emission
&lt;/h2&gt;

&lt;p&gt;Bitcoin's halving has interesting properties — predictable supply, decreasing inflation, long-term scarcity — but it also front-loads almost all coin issuance into the early years. By the time most people heard about Bitcoin in ~2017, ~80% of supply was already mined.&lt;/p&gt;

&lt;p&gt;Sparrow uses a &lt;strong&gt;bell-curve schedule&lt;/strong&gt; instead:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# Block reward by year (1 SPW = 10^8 feathers, blocks per year ≈ 525,600)
&lt;/span&gt;&lt;span class="n"&gt;EMISSION_TABLE&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
    &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;BPY&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;  &lt;span class="mf"&gt;1.0&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;  &lt;span class="c1"&gt;# year 0–1: bootstrap
&lt;/span&gt;    &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;BPY&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;  &lt;span class="mf"&gt;1.0&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;  &lt;span class="c1"&gt;# year 1–2: bootstrap
&lt;/span&gt;    &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;BPY&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;  &lt;span class="mf"&gt;1.0&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;  &lt;span class="c1"&gt;# year 2–3: bootstrap
&lt;/span&gt;    &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;BPY&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;  &lt;span class="mf"&gt;1.0&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;  &lt;span class="c1"&gt;# year 3–4: bootstrap → ≈10% of supply
&lt;/span&gt;    &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;BPY&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;  &lt;span class="mf"&gt;3.0&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;BPY&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;  &lt;span class="mf"&gt;5.0&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;  &lt;span class="c1"&gt;# ← peak years 5–7
&lt;/span&gt;    &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;7&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;BPY&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;  &lt;span class="mf"&gt;5.0&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;BPY&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;  &lt;span class="mf"&gt;3.0&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="c1"&gt;# ... gradual decline through year 20, then tail emissions
&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The intent: the first four years are intentionally low so the project has a long, fair on-ramp. Whoever shows up early doesn't get a windfall just for being early — they get rewarded for &lt;em&gt;staying&lt;/em&gt;. The peak comes later, when you can reasonably hope the network has actually attracted some hashrate.&lt;/p&gt;

&lt;p&gt;Total supply: 21,024,000 SPW. (Bitcoin's number, plus 24,000 — partly a nod, partly to avoid being mistaken for a Bitcoin clone.)&lt;/p&gt;




&lt;h2&gt;
  
  
  Design decision 4: Optional stealth addresses
&lt;/h2&gt;

&lt;p&gt;Privacy is a spectrum. The two ends are:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Bitcoin&lt;/strong&gt;: every transaction publicly traceable. Convenient, regulator-friendly, weak privacy.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Monero&lt;/strong&gt;: every transaction private by default. Strong privacy, strong regulatory headwinds, listings problems.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I wanted the middle. Sparrow uses &lt;strong&gt;opt-in ECDH stealth addresses&lt;/strong&gt;: you can publish a "view public key" + "spend public key" pair. Senders use ECDH with your view key to derive a one-time output key on the chain. Only you can recover the spend key for it; an outside observer sees a totally fresh address.&lt;/p&gt;

&lt;p&gt;The recipient's wallet has two private keys:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;spend_key  →  authorises spending UTXOs (keep secret, ever)
view_key   →  scans the chain for incoming stealth payments
              (can be shared with an auditor/accountant for read-only access)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The default user experience is unchanged — Bitcoin-style transparent addresses. Privacy is something you opt into per receive, not something the network forces on every transaction. That keeps the protocol out of the privacy-coin regulatory bucket while still giving people a real privacy tool when they want one.&lt;/p&gt;




&lt;h2&gt;
  
  
  Design decision 5: Boring, Bitcoin-shaped addresses
&lt;/h2&gt;

&lt;p&gt;Sparrow addresses are &lt;strong&gt;Base58Check, version byte &lt;code&gt;0x1e&lt;/code&gt;&lt;/strong&gt;, which produces addresses starting with &lt;code&gt;D&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;DAhg6h7yEsGJsH8aZqwS3FbBRG4vJVdAZf
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Why not bech32? Because every wallet, hardware wallet, parser, and block explorer in the world already knows how to handle Base58Check. I didn't want users to copy an address into a tool that breaks because it doesn't know about a custom HRP.&lt;/p&gt;

&lt;p&gt;The HD wallet path is BIP44 standard:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;m / 44' / 1926' / account' / 0 / index
       ^------ pending SLIP-0044 registration
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You can import your 12-word BIP39 mnemonic into the SPW wallet, derive the same chain of addresses you'd derive anywhere else, and your existing mental model just works.&lt;/p&gt;




&lt;h2&gt;
  
  
  What I'd do differently
&lt;/h2&gt;

&lt;p&gt;A few things in retrospect:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;P2P first.&lt;/strong&gt; Right now the reference node at &lt;code&gt;spw.network&lt;/code&gt; is the canonical chain, which is fine for an early single-operator phase but obviously isn't decentralised yet. If I started over I'd ship libp2p-based gossip in week one rather than as roadmap item six.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Write tests, not docs first.&lt;/strong&gt; I wrote a lot of design notes. The test suite is decent but should have been the first artifact, not the last.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Pick one language for the whole stack.&lt;/strong&gt; Chain is Python, wallet is vanilla JS, the connect SDK is also JS. Having two languages was fine but the friction during refactors was real.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  What's actually shipped vs not
&lt;/h2&gt;

&lt;p&gt;Honest about state:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Shipped&lt;/th&gt;
&lt;th&gt;Not yet&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;RandomX PoW chain, UTXO ledger, mainnet live&lt;/td&gt;
&lt;td&gt;P2P gossip protocol (single canonical node today)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Browser PWA wallet (BIP39 + BIP32 + stealth)&lt;/td&gt;
&lt;td&gt;Mining pool / Stratum&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Public REST API + explorer&lt;/td&gt;
&lt;td&gt;Exchange listings&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;One-line CPU miner installer (sh + ps1)&lt;/td&gt;
&lt;td&gt;Hardware-wallet integration&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Stealth addresses (ECDH)&lt;/td&gt;
&lt;td&gt;More than one independent client&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The chain works. The decentralisation story is incomplete. I'd rather say that out loud than pretend otherwise.&lt;/p&gt;




&lt;h2&gt;
  
  
  If you want to try it
&lt;/h2&gt;

&lt;p&gt;It's CPU-mineable — that's the whole point. You can be on the network in one line:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Linux / macOS&lt;/span&gt;
curl &lt;span class="nt"&gt;-fsSL&lt;/span&gt; https://spw.network/install-miner.sh | bash

&lt;span class="c"&gt;# Windows (PowerShell)&lt;/span&gt;
iwr &lt;span class="nt"&gt;-useb&lt;/span&gt; https://spw.network/install-miner.ps1 | iex
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The installer creates a virtualenv, drops in the miner client, generates a wallet (with backup), and writes a &lt;code&gt;start.sh&lt;/code&gt; you can run whenever. Rewards land at your address as blocks land.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Site: &lt;a href="https://spw.network" rel="noopener noreferrer"&gt;spw.network&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Whitepaper: &lt;a href="https://spw.network/whitepaper.html" rel="noopener noreferrer"&gt;spw.network/whitepaper.html&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Wallet (open-source): &lt;a href="https://github.com/otisaipro/spw-wallet" rel="noopener noreferrer"&gt;github.com/otisaipro/spw-wallet&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  A note on what this is and isn't
&lt;/h2&gt;

&lt;p&gt;Sparrow is an experimental open-source PoW network. The network value depends on adoption that has not happened yet. There are no exchange listings. The code is open and the rules are fixed, but a small network can stay small.&lt;/p&gt;

&lt;p&gt;Treat any SPW you mine or receive as exactly that — an experiment in whether a small, fair-launch, CPU-mineable cryptocurrency can still exist in 2026. If you've got a laptop and want to find out, the door's open.&lt;/p&gt;

&lt;p&gt;If you've shipped something similar (or want to argue with a design choice above), I'd genuinely like to hear it — drop a comment.&lt;/p&gt;

</description>
      <category>blockchain</category>
      <category>python</category>
      <category>cryptocurrency</category>
      <category>showdev</category>
    </item>
  </channel>
</rss>
