<?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: Althaaf Mohamed </title>
    <description>The latest articles on DEV Community by Althaaf Mohamed  (@althaafm).</description>
    <link>https://dev.to/althaafm</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%2F4027736%2Ff517ccc9-310d-4569-b034-f79256cf96bb.png</url>
      <title>DEV Community: Althaaf Mohamed </title>
      <link>https://dev.to/althaafm</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/althaafm"/>
    <language>en</language>
    <item>
      <title>When your server has the right file, but the browser still won't show it</title>
      <dc:creator>Althaaf Mohamed </dc:creator>
      <pubDate>Tue, 28 Jul 2026 14:52:14 +0000</pubDate>
      <link>https://dev.to/althaafm/when-your-server-has-the-right-file-but-the-browser-still-wont-show-it-4fff</link>
      <guid>https://dev.to/althaafm/when-your-server-has-the-right-file-but-the-browser-still-wont-show-it-4fff</guid>
      <description>&lt;h2&gt;
  
  
  The bug: a feature that worked everywhere except where it mattered
&lt;/h2&gt;

&lt;p&gt;A new feature went into a web app's main file. Deployed, confirmed present on the actual server via a direct file check. Refreshed the browser — repeatedly, in incognito, on a different device. Nothing.&lt;/p&gt;

&lt;p&gt;The file was correct. The server had the file. The feature simply wasn't there.&lt;/p&gt;

&lt;h2&gt;
  
  
  First instinct: it's caching
&lt;/h2&gt;

&lt;p&gt;Hard refresh. Cleared browser cache entirely. Tried an incognito window — guaranteed no cache at all. Still nothing.&lt;/p&gt;

&lt;p&gt;Checked whether the &lt;em&gt;server&lt;/em&gt; itself might be caching an old version somewhere between disk and browser (a CDN, a reverse proxy). Fetched the file directly with a command-line tool, bypassing the browser completely: the new code was right there, in the actual response.&lt;/p&gt;

&lt;p&gt;So the correct file was genuinely being served. And still, the feature didn't run.&lt;/p&gt;

&lt;h2&gt;
  
  
  Second instinct: something's silently failing inside the code
&lt;/h2&gt;

&lt;p&gt;Added visible, unmissable debug messages directly inside the new function — the kind that pop up on screen, impossible to miss if the code runs at all.&lt;/p&gt;

&lt;p&gt;Nothing appeared. Not even the &lt;em&gt;most basic possible&lt;/em&gt; message, placed as the literal first line of the function.&lt;/p&gt;

&lt;p&gt;Yet other code in that same file — code that had been working for weeks — was demonstrably still running correctly, fetching live data successfully.&lt;/p&gt;

&lt;h2&gt;
  
  
  The real diagnostic question
&lt;/h2&gt;

&lt;p&gt;At this point, two things were true simultaneously: the file on the server was correct, and the code in that file wasn't executing. That's a genuinely strange combination — normally, if a browser has the right file, the code in it runs.&lt;/p&gt;

&lt;p&gt;Unless the browser wasn't loading &lt;em&gt;that&lt;/em&gt; file at all.&lt;/p&gt;

&lt;h2&gt;
  
  
  The actual root cause
&lt;/h2&gt;

&lt;p&gt;Web servers have a long-standing default behavior: when someone visits a bare address with no specific filename, the server looks for a file conventionally named &lt;code&gt;index.html&lt;/code&gt; and serves that automatically. It's such an old, ingrained convention that it's easy to forget it exists at all once a project has moved past its earliest setup.&lt;/p&gt;

&lt;p&gt;This particular project had, at some earlier point, needed exactly this fixed — the bare domain was serving a different, separate file than the one everyone had been actively editing since. The fix at the time was to make a copy. That copy was never revisited. Every edit since then went only into the "real" file — the one being tested was always the untouched, months-old copy sitting quietly under the conventional default name.&lt;/p&gt;

&lt;h2&gt;
  
  
  The actual lesson
&lt;/h2&gt;

&lt;p&gt;The instinct to suspect caching first is usually right — it's the most common cause of "I changed it and nothing happened." But caching has a specific signature: the &lt;em&gt;server itself&lt;/em&gt; returns the new content correctly when checked directly, while the browser stubbornly shows the old thing.&lt;/p&gt;

&lt;p&gt;Here, the server was &lt;em&gt;also&lt;/em&gt; consistently serving something old — just a genuinely different file than the one being edited, not a stale copy of the same one. That distinction is the actual tell: if a direct server check confirms new content, but the &lt;em&gt;live URL&lt;/em&gt; still shows old behavior, it's worth checking whether that URL is even resolving to the file you think it is, rather than assuming it must be some deeper, more exotic caching layer.&lt;/p&gt;

&lt;p&gt;Sometimes the boring, first-year-of-web-development default is exactly what's happening — precisely because it's old and easy to forget.&lt;/p&gt;

&lt;p&gt;Code: &lt;a href="https://github.com/AlthaafM/Quantum-Lattice" rel="noopener noreferrer"&gt;https://github.com/AlthaafM/Quantum-Lattice&lt;/a&gt;&lt;/p&gt;

</description>
      <category>debugging</category>
      <category>webdev</category>
      <category>javascript</category>
      <category>blockchain</category>
    </item>
    <item>
      <title>When three different bug fixes all fail identically, stop fixing and start diffing</title>
      <dc:creator>Althaaf Mohamed </dc:creator>
      <pubDate>Tue, 21 Jul 2026 09:46:27 +0000</pubDate>
      <link>https://dev.to/althaafm/when-three-different-bug-fixes-all-fail-identically-stop-fixing-and-start-diffing-5bj3</link>
      <guid>https://dev.to/althaafm/when-three-different-bug-fixes-all-fail-identically-stop-fixing-and-start-diffing-5bj3</guid>
      <description>&lt;h2&gt;
  
  
  The bug: a JSON error with no obvious cause
&lt;/h2&gt;

&lt;p&gt;Adding a biometric authentication plugin to a Tauri desktop app, the build started failing with this:&lt;/p&gt;

&lt;p&gt;failed to parse JSON: expected value at line 1 column 1: expected value at line 1 column 1&lt;/p&gt;

&lt;p&gt;No file path. No line number in our own code. Just a generic parse failure, somewhere inside Tauri's own build process.&lt;/p&gt;

&lt;h2&gt;
  
  
  First instinct: check the obvious file
&lt;/h2&gt;

&lt;p&gt;The error mentioned "capabilities" — Tauri's permission system — so the first suspect was the capability file itself. Opened it, read it carefully, looked completely valid. Removed the biometry-specific permissions entirely, leaving just the two that had worked before. Same error.&lt;/p&gt;

&lt;h2&gt;
  
  
  Second instinct: it's the plugin's fault
&lt;/h2&gt;

&lt;p&gt;Tried a different version of the plugin. Same error. Tried pulling the plugin directly from its GitHub source instead of the published package, in case the published version was missing a file. Same error, byte for byte.&lt;/p&gt;

&lt;p&gt;Three genuinely different attempts, identical failure. Worth sitting with that for a moment: when multiple different versions of the same dependency all fail identically, the dependency itself becomes a much less likely suspect than something upstream of it.&lt;/p&gt;

&lt;h2&gt;
  
  
  The actual test that mattered
&lt;/h2&gt;

&lt;p&gt;Rather than keep guessing at the plugin, the real diagnostic question became: does a completely fresh, untouched Tauri project — zero modifications — also fail this same way, on this same machine?&lt;/p&gt;

&lt;p&gt;It didn't. A brand-new scaffold built and ran fine immediately.&lt;/p&gt;

&lt;p&gt;That single test eliminated an entire category of hypotheses at once. Not the Rust toolchain. Not the Tauri version. Not the operating system. Something specific to &lt;em&gt;this&lt;/em&gt; project, that a fresh one didn't have.&lt;/p&gt;

&lt;h2&gt;
  
  
  Finding the actual difference
&lt;/h2&gt;

&lt;p&gt;With a genuinely working reference project sitting right there, the fastest path forward was direct comparison rather than more guessing. &lt;code&gt;Cargo.toml&lt;/code&gt;: identical in structure. &lt;code&gt;tauri.conf.json&lt;/code&gt;: identical. The capabilities file: nearly identical, except the broken project was missing one line the working one still had — a schema reference we'd removed earlier while chasing a different, unrelated hypothesis.&lt;/p&gt;

&lt;p&gt;Copying the working project's capability file over, byte for byte, fixed it immediately.&lt;/p&gt;

&lt;h2&gt;
  
  
  What actually happened
&lt;/h2&gt;

&lt;p&gt;The most likely explanation: repeated automated rewrites of that config file (through a terminal, across several rounds of troubleshooting) introduced a subtle encoding artifact — invisible on screen, but different from a byte-for-byte perspective. Not something a visual read-through would ever catch.&lt;/p&gt;

&lt;h2&gt;
  
  
  The actual lesson
&lt;/h2&gt;

&lt;p&gt;"I read the file and it looks fine" is a weaker claim than it feels like in the moment. Text that &lt;em&gt;displays&lt;/em&gt; correctly and text that &lt;em&gt;is&lt;/em&gt; byte-for-byte correct are different things, and most tools happily show you the first while hiding the second.&lt;/p&gt;

&lt;p&gt;When a config-driven failure resists every content-level fix, the more productive question isn't "what's wrong with what I wrote" — it's "is there a known-good reference I can diff against directly, rather than re-reading my own version one more time." A fresh scaffold, a fresh clone, a fresh anything genuinely different from what's already been touched repeatedly, is worth more than another careful read-through.&lt;/p&gt;

&lt;p&gt;Code: &lt;a href="https://github.com/AlthaafM/Quantum-Lattice" rel="noopener noreferrer"&gt;https://github.com/AlthaafM/Quantum-Lattice&lt;/a&gt;&lt;/p&gt;

</description>
      <category>rust</category>
      <category>debugging</category>
      <category>tauri</category>
      <category>webdev</category>
    </item>
    <item>
      <title>How do you estimate hashrate you can never directly measure?</title>
      <dc:creator>Althaaf Mohamed </dc:creator>
      <pubDate>Sun, 19 Jul 2026 15:31:22 +0000</pubDate>
      <link>https://dev.to/althaafm/how-do-you-estimate-hashrate-you-can-never-directly-measure-2jo3</link>
      <guid>https://dev.to/althaafm/how-do-you-estimate-hashrate-you-can-never-directly-measure-2jo3</guid>
      <description>&lt;h2&gt;
  
  
  The problem: you can't directly measure someone else's hashrate
&lt;/h2&gt;

&lt;p&gt;Building a mining pool dashboard, one question comes up immediately: how fast is each contributor's machine actually going? Seems simple, until you realize the pool never actually sees the raw hashing loop running — it only ever sees the occasional successful share submission. Everything in between is invisible.&lt;/p&gt;

&lt;p&gt;So the real question becomes: can you estimate hashrate from something you can observe, without ever measuring it directly?&lt;/p&gt;

&lt;h2&gt;
  
  
  The insight: difficulty tells you the odds
&lt;/h2&gt;

&lt;p&gt;A share is accepted when a hash meets a target difficulty — a certain number of leading zero bits. At difficulty D, the probability any single hash attempt succeeds is 1 in 2^D. That means, on average, finding one share takes 2^D attempts.&lt;/p&gt;

&lt;p&gt;That's the whole insight. If you know how many shares someone found, and how much time passed, you can work backward to an estimate of their actual hash rate:&lt;/p&gt;

&lt;p&gt;estimated_hashrate = (shares_found * 2^difficulty) / elapsed_seconds&lt;/p&gt;

&lt;p&gt;No cooperation needed from the miner, no telemetry, nothing extra to build into the client. Just difficulty, share count, and a clock — all data the pool already has.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why this is an estimate, not a measurement
&lt;/h2&gt;

&lt;p&gt;Worth being honest about the real limitation here: proof-of-work is genuinely random. Finding a share in half the "expected" time isn't unusual, and neither is taking twice as long. With a small number of shares, the estimate can swing noticeably even though the underlying hardware speed hasn't changed at all.&lt;/p&gt;

&lt;p&gt;This showed up immediately in testing — a contributor with a real, measured 4.5 MH/s (from their own miner's direct count of nonces tried) saw the dashboard estimate their hashrate at roughly a third of that, purely from a stretch of below-average luck early on. The estimate wasn't wrong — it's honestly reporting what the observed data implies — it just needs more samples to converge toward the true value. This is the same reason real, established pools show hashrate as a rolling average over a window of time rather than an instantaneous number: smoothing out exactly this kind of natural statistical noise.&lt;/p&gt;

&lt;h2&gt;
  
  
  What this means for choosing a difficulty setting
&lt;/h2&gt;

&lt;p&gt;This estimation math also directly informs a separate, practical decision: how much easier should the pool's share-difficulty be than the real network target? Too close to the real difficulty, and shares arrive so rarely that the estimate above never has enough samples to mean anything. Too far below it, and the pool gets flooded with submissions for no real benefit.&lt;/p&gt;

&lt;p&gt;The setting that worked well here: roughly 16 bits easier than the real network difficulty, aiming for a share every 20-30 seconds for a typical modern CPU — frequent enough for a meaningful, quickly-converging estimate, without excessive request volume.&lt;/p&gt;

&lt;h2&gt;
  
  
  A real, honest gap worth naming
&lt;/h2&gt;

&lt;p&gt;Right now, difficulty is one fixed value applied to every connected contributor. A high-end machine and a modest laptop both get the same target — meaning the powerful machine floods the pool with shares while the modest one waits a while between each. The correct, standard fix is per-contributor variable difficulty: adjusting each miner's individual target based on their own observed submission rate, so everyone gets a similarly steady rhythm regardless of hardware. Real, valuable improvement, genuinely on the roadmap, not built yet.&lt;/p&gt;

&lt;p&gt;Code: &lt;a href="https://github.com/AlthaafM/Quantum-Lattice" rel="noopener noreferrer"&gt;https://github.com/AlthaafM/Quantum-Lattice&lt;/a&gt;&lt;br&gt;
Live dashboard: &lt;a href="https://ql-pool.futuristicai.co.za" rel="noopener noreferrer"&gt;https://ql-pool.futuristicai.co.za&lt;/a&gt;&lt;/p&gt;

</description>
      <category>blockchain</category>
      <category>rust</category>
      <category>statistics</category>
      <category>distributedsystems</category>
    </item>
    <item>
      <title>Quantum-Lattice mining pool is now live — tested, proportional payouts</title>
      <dc:creator>Althaaf Mohamed </dc:creator>
      <pubDate>Sun, 19 Jul 2026 08:08:46 +0000</pubDate>
      <link>https://dev.to/althaafm/quantum-lattice-mining-pool-is-now-live-tested-proportional-payouts-1hg</link>
      <guid>https://dev.to/althaafm/quantum-lattice-mining-pool-is-now-live-tested-proportional-payouts-1hg</guid>
      <description>&lt;h2&gt;
  
  
  Why a pool needs its own identity, not each miner's
&lt;/h2&gt;

&lt;p&gt;Quantum-Lattice just shipped a mining pool, and the core design decision worth writing about is one that isn't obvious until you actually try to build it: &lt;strong&gt;a pool can't simply "collect" rewards on behalf of whoever finds them.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The proof-of-work hash includes the miner's own public key as an input:&lt;/p&gt;

&lt;p&gt;sha3_256(version, previous_block_hash, merkle_root, block_height, miner_pubkey, nonce)&lt;/p&gt;

&lt;p&gt;That means a winning nonce is cryptographically tied to &lt;em&gt;whichever address was hashed with it&lt;/em&gt;. If each connected contributor searched using their own address, a share that happened to also satisfy the real network difficulty would be a valid block — but only under &lt;em&gt;that specific miner's&lt;/em&gt; identity. The pool could never swap in its own address afterward and resubmit; changing the address changes the hash entirely.&lt;/p&gt;

&lt;h2&gt;
  
  
  The actual fix
&lt;/h2&gt;

&lt;p&gt;The pool builds one template using &lt;strong&gt;its own address&lt;/strong&gt;, and hands that exact template out to everyone connected. Every contributor searches for a nonce against a header that already has the pool's identity baked in — their own wallet address is only ever used separately, for bookkeeping, never inside the actual hash.&lt;/p&gt;

&lt;p&gt;Concretely:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Pool fetches a real template from the node (block height, previous hash, merkle root, real difficulty)&lt;/li&gt;
&lt;li&gt;Pool constructs a candidate header using its own address as the "miner" field&lt;/li&gt;
&lt;li&gt;Pool hands this out to connected miners, at a deliberately easier, pool-set difficulty&lt;/li&gt;
&lt;li&gt;A miner finds a nonce meeting the &lt;em&gt;easier&lt;/em&gt; target, submits &lt;code&gt;{their own address (for credit), nonce}&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Pool checks: does this nonce, on the header with the pool's own address, also satisfy the &lt;em&gt;real&lt;/em&gt; difficulty?&lt;/li&gt;
&lt;li&gt;If yes — genuine block, submitted under the pool's identity, real reward earned&lt;/li&gt;
&lt;li&gt;Pool signs and sends individual payouts to every contributor, proportional to shares submitted since the last win&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  A real bug this design surfaced
&lt;/h2&gt;

&lt;p&gt;The first version of the payout logic assumed the pool had just earned a full 48 QL block reward, and split that fixed amount. During testing — funding the pool with a smaller, deliberate test amount to verify the split logic without waiting on real network odds — it tried to sign a payout for &lt;em&gt;more&lt;/em&gt; than the pool's actual balance.&lt;/p&gt;

&lt;p&gt;The fix: query the pool's real, current balance from the node immediately before calculating any payout, rather than assuming a fixed reward amount. Obvious in hindsight, but a good reminder that "we know what triggered this" doesn't mean "we know how much is actually available" — those are separate facts, and only one of them is safe to assume.&lt;/p&gt;

&lt;h2&gt;
  
  
  Testing it properly before shipping
&lt;/h2&gt;

&lt;p&gt;Two independent machines contributed real, different amounts of work. The pool was funded with a small, real amount specifically to test the payout mechanism without waiting on genuine 38-bit network odds. The trigger produced two separate signed transactions, correctly proportional to each machine's actual share count, and both wallets showed the correct, confirmed balance increase shortly after.&lt;/p&gt;

&lt;p&gt;That's the difference between "the logic looks right" and "the logic is right" — worth the extra step before anything goes live.&lt;/p&gt;

&lt;h2&gt;
  
  
  What's next
&lt;/h2&gt;

&lt;p&gt;Difficulty is currently one fixed value for every connected contributor. A meaningfully better version adjusts difficulty &lt;em&gt;per miner&lt;/em&gt;, based on their individual submission rate — so a high-end machine and a modest laptop both get a similarly steady rhythm of shares, rather than one flooding the pool and the other waiting a long time between confirmations. Real, valuable improvement, not yet built.&lt;/p&gt;

&lt;p&gt;Code: &lt;a href="https://github.com/AlthaafM/Quantum-Lattice" rel="noopener noreferrer"&gt;https://github.com/AlthaafM/Quantum-Lattice&lt;/a&gt;&lt;br&gt;
Try it: &lt;a href="https://quantum-lattice.futuristicai.co.za" rel="noopener noreferrer"&gt;https://quantum-lattice.futuristicai.co.za&lt;/a&gt;&lt;/p&gt;

</description>
      <category>blockchain</category>
      <category>rust</category>
      <category>cryptography</category>
      <category>opensource</category>
    </item>
    <item>
      <title>A silent bug: how a missing timeout froze our sync loop forever</title>
      <dc:creator>Althaaf Mohamed </dc:creator>
      <pubDate>Sat, 18 Jul 2026 11:51:19 +0000</pubDate>
      <link>https://dev.to/althaafm/a-silent-bug-how-a-missing-timeout-froze-our-sync-loop-forever-1af</link>
      <guid>https://dev.to/althaafm/a-silent-bug-how-a-missing-timeout-froze-our-sync-loop-forever-1af</guid>
      <description>&lt;h2&gt;
  
  
  The setup
&lt;/h2&gt;

&lt;p&gt;We recently added continuous peer syncing to Quantum-Lattice's node — instead of checking for missed blocks only once at startup, nodes now re-check periodically in the background, so they recover automatically after any brief network interruption.&lt;/p&gt;

&lt;p&gt;Testing it live went well at first: a test node correctly caught up on a real gap, pulling and applying dozens of missing blocks over a genuine internet connection. Then... nothing. No errors. No crash. Just silence, for 15 minutes straight, while the real chain kept advancing without it.&lt;/p&gt;

&lt;h2&gt;
  
  
  The investigation
&lt;/h2&gt;

&lt;p&gt;The node was still alive — CPU usage was normal, no panic in the logs. That ruled out a crash. The periodic task was clearly supposed to run every 60 seconds indefinitely:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;\&lt;/code&gt;&lt;code&gt;rust&lt;br&gt;
tokio::spawn(async move {&lt;br&gt;
    loop {&lt;br&gt;
        catch_up(...).await;&lt;br&gt;
        tokio::time::sleep(Duration::from_secs(60)).await;&lt;br&gt;
    }&lt;br&gt;
});&lt;br&gt;
\&lt;/code&gt;&lt;code&gt;\&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Nothing about that loop looks wrong on its own. The bug wasn't in the loop — it was in what the loop was waiting on.&lt;/p&gt;

&lt;h2&gt;
  
  
  The actual bug
&lt;/h2&gt;

&lt;p&gt;Inside catch_up(), the function that opens a connection to a peer and asks "what's your current height?" had no timeout at all:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;\&lt;/code&gt;&lt;code&gt;rust&lt;br&gt;
let mut stream = TcpStream::connect(peer).await.ok()?;&lt;br&gt;
\&lt;/code&gt;&lt;code&gt;\&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;If that connection attempt ever hangs — doesn't cleanly succeed, doesn't cleanly fail, just sits there — the .await never resolves. The loop isn't broken; it's just permanently parked on one single call that will never return. It worked once because that first connection happened to succeed quickly. Some time later, one connection attempt didn't, and the entire background task quietly stopped forever.&lt;/p&gt;

&lt;h2&gt;
  
  
  The fix
&lt;/h2&gt;

&lt;p&gt;Wrap the connection attempt (and the subsequent read) in an explicit timeout:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;\&lt;/code&gt;&lt;code&gt;rust&lt;br&gt;
let mut stream = tokio::time::timeout(&lt;br&gt;
    Duration::from_secs(10),&lt;br&gt;
    TcpStream::connect(peer),&lt;br&gt;
).await.ok()?.ok()?;&lt;br&gt;
\&lt;/code&gt;&lt;code&gt;\&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Now a hung attempt fails cleanly after 10 seconds instead of blocking forever, the loop proceeds to its next sleep-and-retry cycle, and a temporary network hiccup becomes a temporary hiccup — not a permanent, silent failure.&lt;/p&gt;

&lt;h2&gt;
  
  
  The lesson
&lt;/h2&gt;

&lt;p&gt;Every .await in a loop meant to run forever is a place where "forever" can quietly mean "until this one specific call never returns." We'd already added timeouts to every inbound connection this node handles — but the outbound calls this same node makes to check on its peers had been overlooked entirely. Worth explicitly auditing every unattended, long-running loop for exactly this: not "can this fail?" but "can this specific await simply never resolve at all?"&lt;/p&gt;

&lt;p&gt;Confirmed fixed with a real, live re-test — the same node now recovers correctly and repeatedly, watched over several consecutive cycles rather than assumed from a single pass.&lt;/p&gt;

&lt;p&gt;Code: &lt;a href="https://github.com/AlthaafM/Quantum-Lattice" rel="noopener noreferrer"&gt;https://github.com/AlthaafM/Quantum-Lattice&lt;/a&gt;&lt;/p&gt;

</description>
      <category>rust</category>
      <category>asnyc</category>
      <category>debugging</category>
      <category>blockchain</category>
    </item>
    <item>
      <title>Quantum-Lattice's first independent node: what it actually took</title>
      <dc:creator>Althaaf Mohamed </dc:creator>
      <pubDate>Fri, 17 Jul 2026 20:15:47 +0000</pubDate>
      <link>https://dev.to/althaafm/quantum-lattices-first-independent-node-what-it-actually-took-2dim</link>
      <guid>https://dev.to/althaafm/quantum-lattices-first-independent-node-what-it-actually-took-2dim</guid>
      <description>&lt;h2&gt;
  
  
  A real external node, not just a design goal
&lt;/h2&gt;

&lt;p&gt;Today, Quantum-Lattice got its first genuinely independent, externally-operated full node — someone running their own copy of the chain, verifying it themselves, entirely separate from our own infrastructure. Worth sharing what that actually involves, since "just clone the repo and run it" undersells a real technical detail worth understanding.&lt;/p&gt;

&lt;h2&gt;
  
  
  The genesis problem
&lt;/h2&gt;

&lt;p&gt;When a brand-new node starts with no existing chain data, it generates its own genesis block locally. That's normal — every node needs &lt;em&gt;a&lt;/em&gt; genesis to start from. The problem: genesis includes real, specific values (in our case, two treasury vault public keys), and every subsequent block links back to it by hash. A node that generates its own fresh genesis is, cryptographically, starting an entirely separate, incompatible chain — not "behind" the real network, just fundamentally different from it.&lt;/p&gt;

&lt;p&gt;This means peer-to-peer catch-up syncing — the normal mechanism for "ask a peer what I'm missing and pull it" — can't bridge that gap. No amount of requesting blocks from a peer fixes a mismatched genesis.&lt;/p&gt;

&lt;h2&gt;
  
  
  The fix: seed once, sync forever after
&lt;/h2&gt;

&lt;p&gt;The practical solution is straightforward once you see the problem clearly: give a new node a real, already-synced copy of the chain database to start from. Once it shares the genuine genesis and history, ongoing P2P sync works exactly as designed — we tested this directly today, watching a fresh node correctly request and apply 43 real, missing blocks from a peer, complete with correctly recalculated difficulty retargeting at each step, purely over a real internet connection.&lt;/p&gt;

&lt;h2&gt;
  
  
  Worth knowing if you're building something similar
&lt;/h2&gt;

&lt;p&gt;If you're designing a P2P system with any kind of genesis or bootstrap state, it's worth deciding early whether brand-new participants will generate their own bootstrap state (fine for fully independent instances) or need a shared, distributed starting point (necessary if they're meant to join &lt;em&gt;your&lt;/em&gt; specific network). We hadn't fully separated these two cases early on — worth building in from the start if you're doing this yourself.&lt;/p&gt;

&lt;p&gt;Genuinely one of the more interesting problems this project has hit so far — not a bug, just a real consequence of how trustless verification actually has to work.&lt;/p&gt;

&lt;p&gt;Code: &lt;a href="https://github.com/AlthaafM/Quantum-Lattice" rel="noopener noreferrer"&gt;https://github.com/AlthaafM/Quantum-Lattice&lt;/a&gt;&lt;br&gt;
Explorer: &lt;a href="https://quantum-lattice.futuristicai.co.za" rel="noopener noreferrer"&gt;https://quantum-lattice.futuristicai.co.za&lt;/a&gt;&lt;br&gt;
Discussion and questions welcome in our Telegram: &lt;a href="https://t.me/+QfarLtaccHM0NzFk" rel="noopener noreferrer"&gt;https://t.me/+QfarLtaccHM0NzFk&lt;/a&gt;&lt;/p&gt;

</description>
      <category>blockchain</category>
      <category>rust</category>
      <category>opensource</category>
      <category>distributedsystems</category>
    </item>
    <item>
      <title>Quantum-Lattice update: real multi-threaded mining, and 130+ wallets since launch</title>
      <dc:creator>Althaaf Mohamed </dc:creator>
      <pubDate>Thu, 16 Jul 2026 09:25:26 +0000</pubDate>
      <link>https://dev.to/althaafm/quantum-lattice-update-real-multi-threaded-mining-and-130-wallets-since-launch-5597</link>
      <guid>https://dev.to/althaafm/quantum-lattice-update-real-multi-threaded-mining-and-130-wallets-since-launch-5597</guid>
      <description>&lt;h2&gt;
  
  
  What's changed since launch
&lt;/h2&gt;

&lt;p&gt;A couple of genuine updates worth sharing, both driven by real user feedback rather than planned in advance.&lt;/p&gt;

&lt;h2&gt;
  
  
  Multi-threaded mining is now live
&lt;/h2&gt;

&lt;p&gt;Someone running a high-core-count machine (a Threadripper) flagged that the mining client was only using a single CPU core, regardless of how many were actually available. A real, honest limitation — now fixed.&lt;/p&gt;

&lt;p&gt;Both the Linux and Windows mining clients automatically detect and use every available CPU core by default now, with an optional argument to override the count if you'd rather limit it. Confirmed working on real multi-core hardware — batch sizes now scale correctly with thread count instead of staying fixed regardless of the machine running it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Real, sustained growth
&lt;/h2&gt;

&lt;p&gt;Over 130 real wallets created since launch, up from 35 just a couple of days in — genuinely encouraging, continuing growth rather than a single launch-day spike. Steady mining activity, and some genuinely good technical conversations happening on &lt;a href="https://bitcointalk.org" rel="noopener noreferrer"&gt;Bitcointalk&lt;/a&gt; and Reddit.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where to find it
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;🌐 Explorer: &lt;a href="https://quantum-lattice.futuristicai.co.za" rel="noopener noreferrer"&gt;https://quantum-lattice.futuristicai.co.za&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;👛 Wallet: &lt;a href="https://qlwallet.futuristicai.co.za" rel="noopener noreferrer"&gt;https://qlwallet.futuristicai.co.za&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;💻 Code: &lt;a href="https://github.com/AlthaafM/Quantum-Lattice" rel="noopener noreferrer"&gt;https://github.com/AlthaafM/Quantum-Lattice&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>cryptography</category>
      <category>blockchain</category>
      <category>rust</category>
      <category>opensource</category>
    </item>
    <item>
      <title>Why Post-Quantum Signatures Matter, and How Quantum-Lattice Implements Them</title>
      <dc:creator>Althaaf Mohamed </dc:creator>
      <pubDate>Mon, 13 Jul 2026 19:13:59 +0000</pubDate>
      <link>https://dev.to/althaafm/why-post-quantum-signatures-matter-and-how-quantum-lattice-implements-them-2mgm</link>
      <guid>https://dev.to/althaafm/why-post-quantum-signatures-matter-and-how-quantum-lattice-implements-them-2mgm</guid>
      <description>&lt;h2&gt;
  
  
  The Problem Most Blockchains Are Ignoring
&lt;/h2&gt;

&lt;p&gt;Every major blockchain today — Bitcoin, Ethereum, and nearly everything built on top of them — signs transactions using elliptic-curve cryptography (ECDSA or similar schemes). This has worked well for over a decade, and against classical computers, it still holds up fine.&lt;/p&gt;

&lt;p&gt;The problem is &lt;strong&gt;Shor's algorithm&lt;/strong&gt; — a quantum algorithm that, given a sufficiently powerful quantum computer, can efficiently solve the exact mathematical problem elliptic-curve cryptography relies on. Once that hardware exists at scale, ECDSA-based signatures stop being secure, full stop.&lt;/p&gt;

&lt;p&gt;Here's the part that makes this an active concern today, not a someday problem: an adversary doesn't need a quantum computer right now to start the attack. Public keys and signatures on every blockchain are, by design, public and permanent. Someone can record that data today, store it, and simply wait — decrypting it retroactively once the hardware exists. This is known as &lt;strong&gt;"harvest now, decrypt later,"&lt;/strong&gt; and it means the security of transactions happening on ECDSA-based chains right now is already partly dependent on how long quantum hardware takes to mature.&lt;/p&gt;

&lt;h2&gt;
  
  
  ML-DSA-65: What Quantum-Lattice Actually Uses
&lt;/h2&gt;

&lt;p&gt;Quantum-Lattice signs every single transaction using &lt;strong&gt;ML-DSA-65&lt;/strong&gt; — Module-Lattice-Based Digital Signature Algorithm, standardized by NIST as &lt;strong&gt;FIPS 204&lt;/strong&gt; in 2024, after nearly a decade of public cryptanalysis and competition among candidate algorithms.&lt;/p&gt;

&lt;p&gt;Instead of relying on the elliptic-curve discrete logarithm problem (the thing Shor's algorithm breaks), ML-DSA is built on the hardness of certain lattice problems — specifically, problems believed to be hard for both classical and quantum computers. The "65" refers to NIST's security category 3, a substantial security margin appropriate for long-lived infrastructure like a blockchain.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Real Trade-off: Size
&lt;/h2&gt;

&lt;p&gt;Post-quantum security isn't free. ML-DSA-65 public keys are &lt;strong&gt;1,952 bytes&lt;/strong&gt;, and signatures run &lt;strong&gt;3,309 bytes&lt;/strong&gt; — dramatically larger than ECDSA's roughly 33-byte public keys and ~72-byte signatures.&lt;/p&gt;

&lt;p&gt;This is a genuine, honest trade-off worth naming rather than glossing over: every Quantum-Lattice transaction carries real extra weight compared to a legacy chain. We consider that weight the actual cost of the security margin — not overhead to be hidden, but the visible price of resistance to an attack ECDSA simply cannot resist at all.&lt;/p&gt;

&lt;h2&gt;
  
  
  Proof, Not Just Claims
&lt;/h2&gt;

&lt;p&gt;Rather than asking anyone to just trust that this is implemented correctly, Quantum-Lattice publishes real, independently reproducible cryptographic test vectors on its live explorer — a fixed seed, its derived public key, a signed message, and the resulting signature, alongside SHA3-256 and proof-of-work hash examples using the network's actual construction. Anyone can run the same computation themselves and verify the output matches exactly.&lt;/p&gt;

&lt;p&gt;The full source code is open and Apache 2.0 licensed &lt;a href="https://github.com/AlthaafM/Quantum-Lattice" rel="noopener noreferrer"&gt;on GitHub&lt;/a&gt;, so the actual implementation — not just the description of it — is available for anyone to read.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where This Leaves Us
&lt;/h2&gt;

&lt;p&gt;Quantum-Lattice is a real, working network today — live mining, a functioning non-custodial wallet, and a public explorer showing real chain activity. It's early-stage, and we've been upfront about that from day one. But the cryptography underneath it isn't speculative — it's the actual finalized NIST standard, implemented, tested, and open for anyone to verify.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;🌐 Explorer: &lt;a href="https://quantum-lattice.futuristicai.co.za" rel="noopener noreferrer"&gt;https://quantum-lattice.futuristicai.co.za&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;👛 Wallet: &lt;a href="https://qlwallet.futuristicai.co.za" rel="noopener noreferrer"&gt;https://qlwallet.futuristicai.co.za&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;💻 Code: &lt;a href="https://github.com/AlthaafM/Quantum-Lattice" rel="noopener noreferrer"&gt;https://github.com/AlthaafM/Quantum-Lattice&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>cryptography</category>
      <category>blockchain</category>
      <category>rust</category>
      <category>security</category>
    </item>
  </channel>
</rss>
