惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Hugging Face - Blog
Hugging Face - Blog
Microsoft Azure Blog
Microsoft Azure Blog
月光博客
月光博客
S
Securelist
J
Java Code Geeks
Recorded Future
Recorded Future
Exploit-DB.com RSS Feed
Exploit-DB.com RSS Feed
K
KPMG report finds enterprise disconnect between AI and its ROI | CIO
M
MIT News - Artificial intelligence
S
Secure Thoughts
Y
Y Combinator Blog
H
Hackread – Cybersecurity News, Data Breaches, AI and More
D
Docker
Martin Fowler
Martin Fowler
The Last Watchdog
The Last Watchdog
WordPress大学
WordPress大学
The GitHub Blog
The GitHub Blog
Vercel News
Vercel News
O
OpenAI News
www.infosecurity-magazine.com
www.infosecurity-magazine.com
博客园_首页
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
PCI Perspectives
PCI Perspectives
N
News and Events Feed by Topic
H
Heimdal Security Blog
SecWiki News
SecWiki News
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
博客园 - 【当耐特】
T
Troy Hunt's Blog
L
LINUX DO - 最新话题
Hacker News: Ask HN
Hacker News: Ask HN
Hacker News - Newest:
Hacker News - Newest: "LLM"
N
Netflix TechBlog - Medium
A
Arctic Wolf
The Hacker News
The Hacker News
I
Intezer
S
Schneier on Security
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
Apple Machine Learning Research
Apple Machine Learning Research
L
Lohrmann on Cybersecurity
宝玉的分享
宝玉的分享
P
Privacy & Cybersecurity Law Blog
Stack Overflow Blog
Stack Overflow Blog
T
Tor Project blog
小众软件
小众软件
Simon Willison's Weblog
Simon Willison's Weblog
The Cloudflare Blog
Jina AI
Jina AI

DEV Community

Authentication Security Deep Dive: From Brute Force to Salted Hashing (With Java Examples) Why AI Systems Don’t Fail — They Drift Spilling beans for how i learn for exam😁"Reinforcement Learning Cheat Sheet" I Replaced Chrome with Safari for AI Browser Automation. Here's What Broke (and What Finally Worked) How Python Borrows Other People's Work The $40 Architecture: Processing 1 Billion API Requests with 99.99% Uptime Vibe Coding: A Workflow Guide (From Zero to SaaS) Most webhook security guides protect the wrong side. The scary part is delivery. Headless CMS for TanStack Start: Build a Blog with Cosmic EU Age Verification App "Hacked in 2 Minutes" — What Actually Happened Comfy Cloud’s delete function does not actually remove files Running AI Models on GPU Cloud Servers: A Beginner Guide Event-driven media intelligence with AWS Step Functions and Bedrock I scored 500 AI prompts across 8 quality dimensions — here's what broke How to Call Google Gemini API from Next.js (Free Tier, No Backend Needed) The Portal Protocol: Reclaiming Human Connection in the Age of AI How to Fix Your Team's Scattered Knowledge Problem With a Self-Hosted Forum Intro to tc Cloud Functors: A Graph-First Mental Model for the Modern Cloud Designing Multi-Tenant Backends With Both Ownership and Team Access I Built a Neumorphic CSS Library with 77+ Components — Here's What I Learned PostgreSQL Performance Optimization: Why Connection Pooling Is Critical at Scale Cómo construí un SaaS multi-rubro para gestionar expensas en Argentina con FastAPI + Vue 3 🚀 I Built an Ethical Hacking Scanner Tool – Open Source Project I Replaced /usage and /context in Claude Code With a Single Statusline A Pythonic Way to Handle Emails (IMAP/SMTP) with Auto-Discovery and AI-Ready Design I Collected 8.9 Million Polymarket Price Points — Here's What I Found About How Markets Really Move EcoTrack AI — Carbon Footprint Tracker & Dashboard Everyone's Using AI. No One Agrees How. 5 self-hosted ebook managers worth trying in 2026 Building Your First AI Agent with LangChain: From Chatbot to Autonomous Assistant Common SOC 2 Failures (Real World) Stop Vibe-Checking Your AI App: A Practical Guide to Evals How to Use SonarQube and SonarScanner Locally to Level Up Your Code Quality Your Next To-Do App Is Dead — I Replaced Mine with an OpenClaw AI Sign a Nostr event in 60 lines of Python using coincurve — no nostr-sdk, no nbxplorer, no rust toolchain ITGC Audit Explained Like You’re in Big 4 Patch Tuesday abril 2026: Microsoft parcha 163 vulnerabilidades y un zero-day en SharePoint Stop scraping everything: a better way to track competitor price changes Listing on MCPize + the Official MCP Registry while routing payments OUTSIDE the marketplace — how I kept 100% of my x402 revenue Building an AI-Powered Risk Intelligence System Using Serverless Architecture Why We Ripped Function Overloading Out of Our AI Toolchain Testing AI-Generated Code: How to Actually Know If It Works SaaS Churn Is Killing Your Business. Here Is What to Do About It (Without a Support Team) The Speed of AI Is No Longer Linear - And Self-Improving Models Are Why How to Implement RBAC for MCP Tools: A Practical Guide for Engineering Teams From Standard Quote to Persuasive Proposal: AI Automation for Arborists I built a CLI that scaffolds complete multi-tenant SaaS apps Axios CVE-2025–62718: The Silent SSRF Bug That Could Be Hiding in Your Node.js App Right Now The dashboard that ended our friendship Data Pipelines Explained Simply (and How to Build Them with Python) The Hidden Cost of AI Systems Nobody Talks About. undefined vs undeclared, and how typeof behaves Switching from file-based jobs to NATS/Kafka in Rust without changing code io_uring Adventures: Rust Servers That Love Syscalls Why Agentic AI is Killing the Traditional Database The POUR principles of web accessibility for developers and designers Quantum Neural Network 3D — A Deep Dive into Interactive WebGL Visualization How To Install Caveman In Codex On macOS And Windows Automation Pipeline Reliability: Why Your Workflow Breaks When Nobody Is Watching I Built an 'Open World' AI Coding Agent — It Works From ANY Folder From Freelancing to Product: A Tech Service Company's SaaS Transformation China's AI Giants: Adding Tencent Hunyuan & ByteDance Doubao to AI University (74 Providers) On the Vibe Coders and Their Lies clerk: Auto-Summarize Your Claude Code Sessions AI Weekly — 2026/04/10–04/17 | The Model Lockdown Is Here, but the Toolchain Is the Real Battleground AI 週報 — 2026/04/10–2026/04/17 模型封鎖潮來了,但工具鏈才是真戰場 Maybe this is how Open-Source apps are born... 🚀 Fine-Tune LLMs with LoRA and QLoRA: 2026 Guide tRPC v11 + Next.js App Router: End-to-End Type Safety Without the Boilerplate ShadCN UI in 2026: Why I Stopped Installing Component Libraries and Started Owning My Components SaaS Billing in React Server Components: Stripe + Supabase Without a Single `useEffect` Join our DEV Weekend Challenge — $1,000 in Prizes Across TEN winners! Submissions Due April 20 at 6:59 AM UTC. Implementing FSRS Spaced Repetition in Flutter + Supabase — Adding Memory Science to an AI Learning App "I Texted My Localhost From the Train — Claude Code Fixed the Bug Before I Got Home" I Built a Sales Prep AI and It Went Deeper Than Expected Design to Code #2: One JSON, Eleven Outputs Solving the 100M-Row Problem: A Summary Table Pattern for High-Volume Push Notification Logs Flutter Web With Wasm: What Actually Changes For Developers I Built 50 Royalty-Free Soundtracks for My Side Project in a Weekend Using AI Music Generation The Vibe Coding Security Checklist: 7 Things to Check Before You Ship Stop Letting Googlebot Guess Fix Your React App's SEO Right Desconstruindo o Streaming do LinkedIn: Como Criar um Engine de Extração de Vídeo de Alta Performance com HLS e FFmpeg (EDA Part-1) EDA (Exploratory Data Analysis) Explained With Real Life — Why Looking at Your Data Is the Most Important Step in Machine Learning Brand Relationship Management at Scale: Our 4-Touch Outreach System for 200+ Brands Why String.fromEnvironment() Might Return an Empty String in Dart JGuardrails 1.0.0 — Hardening Java LLM Apps Against Jailbreaks, Toxicity, and Prompt Injection Plan and Schedule a Full Week of Threads Content From One Claude Conversation Coding Cat Oran Ep3, Five Tables Changed Everything Updated: BFF Pattern I'm done watching freelancers get buried by 200 proposals. So I'm building the alternative. This is my first post BFS Algorithm in Java Step by Step Tutorial with Examples Tracking LLM Pricing Monthly: An Open Dataset for 22 AI Models How We Measure Content ROI on a Comparison Site: Revenue Attribution Without Perfect Data Introducing Nova AI Ops: The AI-Native Operating System for SRE Teams I built a free desktop video downloader for Windows — Grabbit How Talkie OCR Helps Vision-Impaired & Dyslexic Users Read the World Around Them VRCFaceTracking安装和iPhone面捕配置教程,有bug Even CrowdStrike Can't See Your Agents The Automation Gold Rush: What n8n Workflows and Claude Are Opening Up for Developers Right Now
Building Bitcoin Core From Source on Linux — A Field Guide to What Actually Goes Wrong
Dishon Oketch · 2026-06-19 · via DEV Community

Bitcoin Core's own documentation recommends building from source if you want the latest code, full control over feature flags, and a real understanding of what's actually running on your machine. That's a fair trade — but the build system makes almost every non-trivial feature an opt-in flag rather than a default, which means it's easy to produce a binary that compiles cleanly and runs fine while silently missing something you'll need three steps later.

This is a guide to the failure categories that actually show up when building Bitcoin Core (and a Lightning implementation on top of it) on Linux, why they happen, and how to avoid losing a day to each one.

Before You Clone Anything: Check Your Package Sources

The single most disruptive failure mode has nothing to do with Bitcoin at all. If apt install build-essential cmake comes back with every package showing "no installation candidate" — not "not found," but no candidate at all — the problem isn't a missing package. It's a missing repository component.

On modern Ubuntu, package sources live in /etc/apt/sources.list.d/ubuntu.sources, and they look like this:

Types: deb
URIs: http://archive.ubuntu.com/ubuntu/
Suites: noble noble-updates noble-backports
Components: restricted universe multiverse

The Components line is the part to scrutinize. Ubuntu splits its package universe into main (the base system and most common software), restricted (drivers and similar), universe (community-maintained), and multiverse (non-free licensing). If main is missing from that list — as it was here — apt's index simply doesn't contain build-essential, cmake, git, or anything else considered foundational, even though the mirrors are reachable and apt update reports success. There's no error pointing at this; the symptom is just "everything is unavailable" with no obvious cause.

Components: main restricted universe multiverse

Adding that one word and re-running apt-get update resolves the entire category of failure. This is worth checking before attempting any build on an unfamiliar or freshly-provisioned Ubuntu box — it costs ten seconds and rules out the most confusing failure mode up front.

Cloning: Shallow by Default

git clone https://github.com/bitcoin/bitcoin.git pulls the project's full commit history, which is large and, on a flaky or rate-limited connection, prone to dying mid-transfer with HTTP/2 stream errors. Forcing http.version HTTP/1.1 sometimes helps, but the more reliable fix is to not download history you don't need:

git clone --depth 1 https://github.com/bitcoin/bitcoin.git

A shallow clone fetches only the latest snapshot. For building and running a node, that's all that's relevant — the history is dead weight. This is a generally good default for any from-source build where you're not planning to git log your way through the project's past.

Feature Flags Are the Whole Game

This is the core lesson of building Bitcoin Core specifically: the CMake build treats most non-essential subsystems as opt-in, controlled by flags passed at the cmake -B build configure step. Getting a binary that "just builds" tells you almost nothing about which of these subsystems actually made it in.

The flags that matter most for a regtest/development setup:

-DENABLE_IPC — Bitcoin Core's newer multiprocess architecture, which splits the node into cooperating processes communicating via Cap'n Proto. If Cap'n Proto isn't installed, configure fails outright with a clear message suggesting -DENABLE_IPC=OFF. For a single-process regtest node, IPC isn't needed, and turning it off is safe and recommended unless you specifically want multiprocess mode.

-DENABLE_WALLET — controls whether wallet functionality, including wallet-related RPC methods (createwallet, getbalance, sendtoaddress, all of it), gets compiled into bitcoind itself. This is the dangerous one. If you hit a linker error specifically in the standalone bitcoin-wallet tool (a separate CLI utility, not the core wallet code), the instinct might be to disable wallet support to dodge the error. Don't — that flag doesn't just drop the standalone tool, it strips wallet RPC out of the daemon entirely. A bitcoind built with -DENABLE_WALLET=OFF will start, accept connections, and respond to non-wallet RPCs perfectly normally, while every wallet command returns:

error code: -32601
error message: Method not found

There's no warning at build time that you've removed something downstream exercises depend on. If you're hitting a wallet-tool linker error, look at whether -DENABLE_IPC=OFF alone resolves it before reaching for -DENABLE_WALLET=OFF — the IPC code path is a more common source of the kind of undefined reference to G_TRANSLATION_FUN / FastRandomContext::RandomSeed() linker noise that looks wallet-related but usually isn't.

-DWITH_ZMQ — controls whether bitcoind compiles in support for publishing block and transaction notifications over ZeroMQ. This matters enormously if you're running any Lightning implementation on top of regtest, because LND and similar software subscribe to these ZMQ sockets to learn about new blocks and transactions in near-real-time instead of polling. Critically, WITH_ZMQ only takes effect if the libzmq3-dev development package is also installed — the flag alone doesn't pull in the dependency. If it's missing, you'll see no build error; ZMQ support is just quietly absent. The result of trying to start a Lightning node against a ZMQ-less bitcoind is a connection-refused error on ports 28332/28333 that has nothing obviously to do with a missing build flag:

unable to subscribe for zmq block events: dial tcp 127.0.0.1:28332: connect: connection refused

The fast way to check whether your bitcoind actually has ZMQ compiled in, without reading build logs, is asking it directly:

bitcoin-cli -regtest getzmqnotifications

An empty array or a Method not found error means ZMQ isn't there, regardless of what's in your bitcoin.conf. A real Bitcoin Core build with ZMQ enabled returns the configured endpoints:

[
  { "type": "pubrawblock", "address": "tcp://127.0.0.1:28332", "hwm": 1000 },
  { "type": "pubrawtx",    "address": "tcp://127.0.0.1:28333", "hwm": 1000 }
]

The general principle: before disabling a flag to clear an error, ask what else depends on it. A flag disabled to solve today's problem can silently remove function needed by a completely different part of the system later, with no link between the two failures other than "I turned this off three rebuilds ago."

Config File Gotchas

Bitcoin Core's bitcoin.conf has a quirk that trips people up specifically when configuring regtest: network-specific settings like rpcport, rpcbind, and rpcallowip need to live inside a [regtest] section header, not at the top level, if you've also set regtest=1 at the top level. Putting them at the top produces a non-fatal warning and the daemon silently doesn't bind where expected:

Config setting for -rpcbind only applied on regtest network when in [regtest] section.

The structure that actually works:

regtest=1
server=1
daemon=1
fallbackfee=0.0001
txindex=1

[regtest]
rpcuser=bootcamp
rpcpassword=bootcamp123
rpcport=18443
rpcallowip=127.0.0.1
rpcbind=127.0.0.1

Network-agnostic settings (whether to run as a daemon, fee policy, indexing) go at the top; anything network-specific belongs under the bracketed section for that network.

The other config gotcha: bitcoind does not hot-reload bitcoin.conf. If you edit the file to add ZMQ endpoints, RPC credentials, or anything else while the daemon is already running, those changes have no effect until you actually stop and restart it:

bitcoin-cli -regtest stop
bitcoind

A surprising number of "my new config setting isn't working" issues are just this.

Compiling Without Cooking Your Laptop

A full from-source build compiles not just Bitcoin Core but its bundled dependency tree — secp256k1, leveldb, univalue, and more. Running that with -j $(nproc) (use every CPU core) is the default advice in most guides, and on a desktop with real cooling it's fine. On a laptop, it's a fast way to trigger thermal throttling partway through a long compile, which paradoxically makes the build slower than a more conservative job count would have been, while also stressing the hardware.

cmake --build build -j 2    # or -j 1 on smaller/hotter machines

The thing that makes lower parallelism a safe trade rather than just "slower": CMake (and the Makefiles it generates) track which object files have already been compiled and skip them on a subsequent invocation. A build interrupted at 30%, whether by Ctrl+C or a hard thermal shutdown, resumes exactly where it stopped on the next run of the same build command. Nothing is lost except wall-clock time — which makes "let it run as far as it gets, let the machine cool, run the same command again" a perfectly viable strategy for compiling on constrained hardware. It also means changing a single CMake flag and rebuilding doesn't restart from zero — only the object files actually affected by that flag need recompiling, so a flag-only rebuild (say, adding -DWITH_ZMQ=ON after dependencies are already met) is typically much faster than the original build.

Version Skew Is Its Own Category of Bug

The from-source path eventually surfaces a class of problem that no amount of local flag-tweaking fixes: a development snapshot of Bitcoin Core (the kind you get by building straight off the default branch, rather than checking out a tagged release) doesn't necessarily match what any given release of a downstream project — like an LND build — was tested against.

Concretely, this shows up as the two layers disagreeing about wire-protocol or version-detection details that have nothing to do with your build configuration:

  • An older LND release's getnetworkinfo parser expects the warnings field as a plain string; a newer Core build returns it as an array (to support multiple simultaneous warnings), and the older client fails to even parse the response: json: cannot unmarshal array into Go struct field GetNetworkInfoResult.warnings of type string.
  • A newer LND release checks the connected node's reported version string against a known-good pattern before enabling taproot-dependent features, and a development snapshot's version string doesn't match that pattern even though the underlying functionality (taproot has been active on every Bitcoin network for years) is fully present: node backend does not support taproot.
  • LND's local channel-graph database is versioned, and a newer LND release will bump that schema on first run. Downgrading to an older LND release afterward refuses to open that database at all, by design, since schema downgrades risk silent corruption: Refusing to revert from db_version=33 to lower version=31.

None of these are configuration mistakes in the sense of "you set the wrong flag." They're genuine incompatibilities between two independently-versioned, fast-moving codebases that were never tested against each other in that exact combination. The diagnostic signal that you've hit this category, rather than a build or config issue, is that the error changes meaningfully when you swap only the LND version, with the Bitcoin Core side held constant — if upgrading or downgrading one side of the pair changes the failure mode entirely, you're debugging version compatibility, not your own setup.

This category of bug is not really solvable by more careful local configuration. It's solved by picking versions known to work together, or — more practically — by using tooling that has already done that pairing for you. This is precisely the gap that Docker-based tools like Polar fill: they ship pre-built, version-matched images of bitcoind alongside several Lightning implementations (LND, Core Lightning, Eclair), specifically chosen and tested as compatible pairs, so you're not the one discovering the incompatibility in production.

A Practical Decision Rule

Given all of the above, here's the general approach worth taking:

Build from source when you're working with a single component (bitcoind alone, no Lightning layer), you want a specific feature flag combination unavailable in packaged builds, or understanding the build process is itself the goal. Check main is in your apt sources first. Decide your feature flags (IPC, WALLET, ZMQ) deliberately and together, not reactively one error at a time — rebuilding to add a flag you should have set from the start costs real time even with caching. Use conservative -j values on laptops.

Reach for matched-version tooling (Polar, or equivalent) when you're stacking multiple independently-versioned projects on top of each other — bitcoind plus any Lightning implementation is the classic case — and especially when at least one of those projects is a development snapshot rather than a tagged release. The value of building from source mostly accrues to the single component you're building; it doesn't extend to guaranteeing compatibility with everything else you plan to run alongside it.

Verify features directly, don't infer them from config. bitcoin-cli -regtest getzmqnotifications, bitcoin-cli -regtest help | grep wallet, and similar direct queries tell you what's actually compiled into the binary in front of you, which is more reliable than checking what flags you think you set three rebuilds ago.