migrates ghost blog to hugo

This commit is contained in:
2023-11-19 22:12:39 -05:00
commit dbd645375f
93 changed files with 5371 additions and 0 deletions
@@ -0,0 +1,237 @@
<!DOCTYPE html>
<html lang="en" dir="auto">
<head><meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
<meta name="robots" content="noindex, nofollow">
<title>InterPlanetary File System | dvdt.dev</title>
<meta name="keywords" content="">
<meta name="description" content="What will the Internet look like for colonists on Mars? It seems like a silly question since we&rsquo;re far away from having boots on the ground on our red planet neighbor. We&rsquo;ll likely need a moon base, which is itself likely decades away, before we can even think about attempting a manned trip to Mars. The problem is Mars is so far away the best possible latency is around 16 minutes round-trip.">
<meta name="author" content="David Lick">
<link rel="canonical" href="https://new.dvdt.dev/2020/06/interplanetary-file-system/">
<link crossorigin="anonymous" href="/assets/css/stylesheet.5cfc680b1eeaeef9efbced92d46c2a9e876b72ee14fba85846afc4cff9e6e6f8.css" integrity="sha256-XPxoCx7q7vnvvO2S1Gwqnodrcu4U&#43;6hYRq/Ez/nm5vg=" rel="preload stylesheet" as="style">
<script defer crossorigin="anonymous" src="/assets/js/highlight.f413e19d0714851f6474e7ee9632408e58ac146fbdbe62747134bea2fa3415e0.js" integrity="sha256-9BPhnQcUhR9kdOfuljJAjlisFG&#43;9vmJ0cTS&#43;ovo0FeA="
onload="hljs.initHighlightingOnLoad();"></script>
<link rel="icon" href="https://new.dvdt.dev/favicon.ico">
<link rel="icon" type="image/png" sizes="16x16" href="https://new.dvdt.dev/favicon-16x16.png">
<link rel="icon" type="image/png" sizes="32x32" href="https://new.dvdt.dev/favicon-32x32.png">
<link rel="apple-touch-icon" href="https://new.dvdt.dev/apple-touch-icon.png">
<link rel="mask-icon" href="https://new.dvdt.dev/safari-pinned-tab.svg">
<meta name="theme-color" content="#2e2e33">
<meta name="msapplication-TileColor" content="#2e2e33">
<noscript>
<style>
#theme-toggle,
.top-link {
display: none;
}
</style>
<style>
@media (prefers-color-scheme: dark) {
:root {
--theme: rgb(29, 30, 32);
--entry: rgb(46, 46, 51);
--primary: rgb(218, 218, 219);
--secondary: rgb(155, 156, 157);
--tertiary: rgb(65, 66, 68);
--content: rgb(196, 196, 197);
--hljs-bg: rgb(46, 46, 51);
--code-bg: rgb(55, 56, 62);
--border: rgb(51, 51, 51);
}
.list {
background: var(--theme);
}
.list:not(.dark)::-webkit-scrollbar-track {
background: 0 0;
}
.list:not(.dark)::-webkit-scrollbar-thumb {
border-color: var(--theme);
}
}
</style>
</noscript>
</head>
<body class="" id="top">
<script>
if (localStorage.getItem("pref-theme") === "dark") {
document.body.classList.add('dark');
} else if (localStorage.getItem("pref-theme") === "light") {
document.body.classList.remove('dark')
} else if (window.matchMedia('(prefers-color-scheme: dark)').matches) {
document.body.classList.add('dark');
}
</script>
<header class="header">
<nav class="nav">
<div class="logo">
<a href="https://new.dvdt.dev/" accesskey="h" title="dvdt.dev (Alt + H)">dvdt.dev</a>
<div class="logo-switches">
<button id="theme-toggle" accesskey="t" title="(Alt + T)">
<svg id="moon" xmlns="http://www.w3.org/2000/svg" width="24" height="18" viewBox="0 0 24 24"
fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round"
stroke-linejoin="round">
<path d="M21 12.79A9 9 0 1 1 11.21 3 7 7 0 0 0 21 12.79z"></path>
</svg>
<svg id="sun" xmlns="http://www.w3.org/2000/svg" width="24" height="18" viewBox="0 0 24 24"
fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round"
stroke-linejoin="round">
<circle cx="12" cy="12" r="5"></circle>
<line x1="12" y1="1" x2="12" y2="3"></line>
<line x1="12" y1="21" x2="12" y2="23"></line>
<line x1="4.22" y1="4.22" x2="5.64" y2="5.64"></line>
<line x1="18.36" y1="18.36" x2="19.78" y2="19.78"></line>
<line x1="1" y1="12" x2="3" y2="12"></line>
<line x1="21" y1="12" x2="23" y2="12"></line>
<line x1="4.22" y1="19.78" x2="5.64" y2="18.36"></line>
<line x1="18.36" y1="5.64" x2="19.78" y2="4.22"></line>
</svg>
</button>
</div>
</div>
<ul id="menu">
<li>
<a href="https://new.dvdt.dev/about-me/" title="about me">
<span>about me</span>
</a>
</li>
<li>
<a href="https://new.dvdt.dev/support" title="support">
<span>support</span>
</a>
</li>
</ul>
</nav>
</header>
<main class="main">
<article class="post-single">
<header class="post-header">
<h1 class="post-title">
InterPlanetary File System
</h1>
<div class="post-meta"><span title='2020-06-25 00:00:00 +0000 UTC'>June 25, 2020</span>&nbsp;·&nbsp;David Lick
</div>
</header>
<div class="post-content"><p><img loading="lazy" src="/img/orbit-model.jpg" alt="Solar system model" />
</p>
<p>What will the Internet look like for colonists on Mars? It seems like a silly question since we&rsquo;re far away from having boots on the ground on our red planet neighbor. We&rsquo;ll likely need a moon base, which is itself likely decades away, before we can even think about attempting a manned trip to Mars. The problem is Mars is so far away the best possible latency is around 16 minutes round-trip. So if you want to check your Twitter and the servers are here on Earth.. you&rsquo;re going to wait a very long time between page loads.</p>
<p>Enter the <a href="https://ipfs.io/">InterPlanetary File System</a>. IPFS, designed by <a href="https://protocol.ai/">Protocol Labs</a>, is part of a growing movement to decentralize the Internet which has wide reaching implications from resiliency to durability to availability and with that protection from censorship.</p>
<p>Simply, IPFS is a protocol that allows content-addressing instead of location-addressing. What that means is you make a request for specific files and you could get them from someone across the world or it could come from someone in your neighborhood. Additionally, each user of IPFS is another node in the network which can serve content. So in our Mars colony thought experiment, if anyone on Mars has downloaded content from Earth they become the closest seed for that content to all the users on Mars. Here on Earth, that means we can reduce loading times for content by fetching from nodes close to us. It also means that if one node is unreachable, you&rsquo;ll simply reach out to the next closest node for your content. IPFS can replace a portion of the HTTP traffic of the internet today since IPFS is particularly well suited for static content. However, it doesn&rsquo;t have to exclusively replace it. IPFS is just another tool in the toolbox to be used when applications or content need to be highly available, resilient and durable.</p>
<p><img loading="lazy" src="/img/geometric-3d.jpg" alt="Photo by &lt;a href=&#34;https://unsplash.com/@alinnnaaaa?utm_source=ghost&amp;amp;utm_medium=referral&amp;amp;utm_campaign=api-credit&#34;&gt;Alina Grubnyak&lt;/a&gt; / &lt;a href=&#34;https://unsplash.com/?utm_source=ghost&amp;amp;utm_medium=referral&amp;amp;utm_campaign=api-credit&#34;&gt;Unsplash&lt;/a&gt;" />
</p>
<h3 id="architecture">Architecture<a hidden class="anchor" aria-hidden="true" href="#architecture">#</a></h3>
<p>I&rsquo;ll keep this pretty high-level since the <a href="https://dhl-space.sfo2.digitaloceanspaces.com/assets/ipfs-p2p-file-system.pdf">IPFS white paper</a> goes in-depth of how the protocol works. IPFS relies on several key technologies born and evolved since the introduction of HTTP.</p>
<h3 id="coordination">Coordination<a hidden class="anchor" aria-hidden="true" href="#coordination">#</a></h3>
<p>Looking up which nodes are serving the content you want is powered by <a href="https://en.wikipedia.org/wiki/Distributed_hash_table">distributed hash tables</a> or DHTs. DHTs have been used in other widely distributed systems such as BitTorrent to track peers.</p>
<h3 id="hashing">Hashing<a hidden class="anchor" aria-hidden="true" href="#hashing">#</a></h3>
<p><a href="https://en.wikipedia.org/wiki/Distributed_hash_table">Hashing</a> is at the heart of what makes IPFS tick. Hashes are generated from file contents that uniquely describe what a file is. Hashes are exceptional for this because a single bit changed in a file will drastically change the hash output. This means we can uniquely describe an entire file with a short string of characters.</p>
<h3 id="merkle-trees">Merkle Trees<a hidden class="anchor" aria-hidden="true" href="#merkle-trees">#</a></h3>
<p><a href="https://en.wikipedia.org/wiki/Merkle_tree">Merkle trees</a> are the core technology used in version control systems for history tracking. IPFS uses them to similar ends as well as some interesting emergent features.</p>
<p>Everything in IPFS is described by a cryptographic hash. Folders are hashed by their contents and if that folder contains other folders they will be described by hashes of their contents. So on and so forth. Since all objects in the Merkle tree are described by their hashes, all files in IPFS are immutable. When a file is changed the previous version remains and the updated version is added. Both versions will have their own addresses.</p>
<p>Finally, since files are described by their hashes it&rsquo;s trivial to check that a file has been altered, whether maliciously or not. You simply hash the file and if the checksums do not match, you throw the file away.</p>
<h3 id="installing-and-using-ipfs">Installing and Using IPFS<a hidden class="anchor" aria-hidden="true" href="#installing-and-using-ipfs">#</a></h3>
<p>There&rsquo;s an excellent primer on installing and using IPFS <a href="https://github.com/ipfs-shipyard/ipfs-primer/tree/master">here</a>. Protocol Labs have done an excellent job creating useful command line tools as well as desktop applications for making accessing the network seamless and easy. <a href="https://github.com/ipfs-shipyard/ipfs-desktop">IPFS Desktop</a> is a convenient application which runs a local IPFS node which you use to access ipfs://, ipns:// and dweb: links as well as serve your own content to the network.</p>
<p><a href="https://brave.com/">Brave</a>, which I highly recommend for their privacy protection focused browser, have added an IPFS Companion toggle in their settings to enable IPFS&hellip; no need to install anything.</p>
<h3 id="ipfs-based-dapps">IPFS-Based DApps<a hidden class="anchor" aria-hidden="true" href="#ipfs-based-dapps">#</a></h3>
<p>Since IPFS is still relatively new discovery on the network is still difficult. There are no great search engines just yet. <a href="https://awesome.ipfs.io/">Awesome IPFS</a> is a neat place to find new tools and content hosted on IPFS.</p>
<p>Some cool applications I&rsquo;ve come across:</p>
<h3 id="dtubehttpsdtube"><a href="https://d.tube/">DTube</a><a hidden class="anchor" aria-hidden="true" href="#dtubehttpsdtube">#</a></h3>
<p>A distributed YouTube alternative. There&rsquo;s not a lot of content yet but as a PoC it shows that we definitely don&rsquo;t need Google for a video service like YouTube.</p>
<h3 id="killcordhttpskillcordio"><a href="https://killcord.io/">killcord</a><a hidden class="anchor" aria-hidden="true" href="#killcordhttpskillcordio">#</a></h3>
<p>Not sure I really have use of a deadman&rsquo;s switch but the concept is very cool!</p>
<h3 id="diffusehttpsdiffusesh"><a href="https://diffuse.sh/">Diffuse</a><a hidden class="anchor" aria-hidden="true" href="#diffusehttpsdiffusesh">#</a></h3>
<p>A cool in browser music player that supports playing content from IPFS as well as S3, Blockstack, Dropbox and other remote storage.</p>
<h3 id="openbazaarhttpswwwopenbazaarorg"><a href="https://www.openbazaar.org/">OpenBazaar</a><a hidden class="anchor" aria-hidden="true" href="#openbazaarhttpswwwopenbazaarorg">#</a></h3>
<p>OpenBazaar is a decentralized e-commerce platform built on IPFS which allows you to buy and sell with Bitcoin.</p>
<h3 id="conclusion">Conclusion<a hidden class="anchor" aria-hidden="true" href="#conclusion">#</a></h3>
<p>I&rsquo;ve only started scratching the surface of what IPFS can do. It makes me really excited for the future of the Internet. If it takes off it has the potential to wrench control of the Internet away from the few super large companies and put it back into the hands of the users. The worst case scenario for IPFS is it&rsquo;s used to make the Internet more durable, resilient and available. I&rsquo;m brainstorming project ideas to build on top of the protocol. I&rsquo;ll write a post later when I have something cool to show off and in the meantime, I&rsquo;m excited to see what others come up with!</p>
</div>
<footer class="post-footer">
<ul class="post-tags">
</ul>
</footer>
</article>
</main>
<footer class="footer">
<span>&copy; 2023 <a href="https://new.dvdt.dev/">dvdt.dev</a></span>
</footer>
<a href="#top" aria-label="go to top" title="Go to Top (Alt + G)" class="top-link" id="top-link" accesskey="g">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 12 6" fill="currentColor">
<path d="M12 6H0l6-6z" />
</svg>
</a><footer class="footer">PGP: 6FF9 2943 B795 21DC 51D2 4734 715C 88E0 E239 7C72</footer>
<script>
let menu = document.getElementById('menu')
if (menu) {
menu.scrollLeft = localStorage.getItem("menu-scroll-position");
menu.onscroll = function () {
localStorage.setItem("menu-scroll-position", menu.scrollLeft);
}
}
document.querySelectorAll('a[href^="#"]').forEach(anchor => {
anchor.addEventListener("click", function (e) {
e.preventDefault();
var id = this.getAttribute("href").substr(1);
if (!window.matchMedia('(prefers-reduced-motion: reduce)').matches) {
document.querySelector(`[id='${decodeURIComponent(id)}']`).scrollIntoView({
behavior: "smooth"
});
} else {
document.querySelector(`[id='${decodeURIComponent(id)}']`).scrollIntoView();
}
if (id === "top") {
history.replaceState(null, null, " ");
} else {
history.pushState(null, null, `#${id}`);
}
});
});
</script>
<script>
var mybutton = document.getElementById("top-link");
window.onscroll = function () {
if (document.body.scrollTop > 800 || document.documentElement.scrollTop > 800) {
mybutton.style.visibility = "visible";
mybutton.style.opacity = "1";
} else {
mybutton.style.visibility = "hidden";
mybutton.style.opacity = "0";
}
};
</script>
<script>
document.getElementById("theme-toggle").addEventListener("click", () => {
if (document.body.className.includes("dark")) {
document.body.classList.remove('dark');
localStorage.setItem("pref-theme", 'light');
} else {
document.body.classList.add('dark');
localStorage.setItem("pref-theme", 'dark');
}
})
</script>
</body>
</html>
@@ -0,0 +1,275 @@
<!DOCTYPE html>
<html lang="en" dir="auto">
<head><meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
<meta name="robots" content="noindex, nofollow">
<title>Running a Bitcoin Full Node | dvdt.dev</title>
<meta name="keywords" content="">
<meta name="description" content="I learned about Bitcoin in 2013. I watched it for a while before I entered the market in 2014. I dabbled in day-trading (bad idea, just don&rsquo;t if you like sleep at all&hellip;) I even wrote a Python trading bot back in the day that made some decent profits before my 24 year old self got nervous about playing with more money than I&rsquo;d ever had at once and turned it off.">
<meta name="author" content="David Lick">
<link rel="canonical" href="https://new.dvdt.dev/2020/06/running-a-bitcoin-full-node/">
<link crossorigin="anonymous" href="/assets/css/stylesheet.5cfc680b1eeaeef9efbced92d46c2a9e876b72ee14fba85846afc4cff9e6e6f8.css" integrity="sha256-XPxoCx7q7vnvvO2S1Gwqnodrcu4U&#43;6hYRq/Ez/nm5vg=" rel="preload stylesheet" as="style">
<script defer crossorigin="anonymous" src="/assets/js/highlight.f413e19d0714851f6474e7ee9632408e58ac146fbdbe62747134bea2fa3415e0.js" integrity="sha256-9BPhnQcUhR9kdOfuljJAjlisFG&#43;9vmJ0cTS&#43;ovo0FeA="
onload="hljs.initHighlightingOnLoad();"></script>
<link rel="icon" href="https://new.dvdt.dev/favicon.ico">
<link rel="icon" type="image/png" sizes="16x16" href="https://new.dvdt.dev/favicon-16x16.png">
<link rel="icon" type="image/png" sizes="32x32" href="https://new.dvdt.dev/favicon-32x32.png">
<link rel="apple-touch-icon" href="https://new.dvdt.dev/apple-touch-icon.png">
<link rel="mask-icon" href="https://new.dvdt.dev/safari-pinned-tab.svg">
<meta name="theme-color" content="#2e2e33">
<meta name="msapplication-TileColor" content="#2e2e33">
<noscript>
<style>
#theme-toggle,
.top-link {
display: none;
}
</style>
<style>
@media (prefers-color-scheme: dark) {
:root {
--theme: rgb(29, 30, 32);
--entry: rgb(46, 46, 51);
--primary: rgb(218, 218, 219);
--secondary: rgb(155, 156, 157);
--tertiary: rgb(65, 66, 68);
--content: rgb(196, 196, 197);
--hljs-bg: rgb(46, 46, 51);
--code-bg: rgb(55, 56, 62);
--border: rgb(51, 51, 51);
}
.list {
background: var(--theme);
}
.list:not(.dark)::-webkit-scrollbar-track {
background: 0 0;
}
.list:not(.dark)::-webkit-scrollbar-thumb {
border-color: var(--theme);
}
}
</style>
</noscript>
</head>
<body class="" id="top">
<script>
if (localStorage.getItem("pref-theme") === "dark") {
document.body.classList.add('dark');
} else if (localStorage.getItem("pref-theme") === "light") {
document.body.classList.remove('dark')
} else if (window.matchMedia('(prefers-color-scheme: dark)').matches) {
document.body.classList.add('dark');
}
</script>
<header class="header">
<nav class="nav">
<div class="logo">
<a href="https://new.dvdt.dev/" accesskey="h" title="dvdt.dev (Alt + H)">dvdt.dev</a>
<div class="logo-switches">
<button id="theme-toggle" accesskey="t" title="(Alt + T)">
<svg id="moon" xmlns="http://www.w3.org/2000/svg" width="24" height="18" viewBox="0 0 24 24"
fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round"
stroke-linejoin="round">
<path d="M21 12.79A9 9 0 1 1 11.21 3 7 7 0 0 0 21 12.79z"></path>
</svg>
<svg id="sun" xmlns="http://www.w3.org/2000/svg" width="24" height="18" viewBox="0 0 24 24"
fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round"
stroke-linejoin="round">
<circle cx="12" cy="12" r="5"></circle>
<line x1="12" y1="1" x2="12" y2="3"></line>
<line x1="12" y1="21" x2="12" y2="23"></line>
<line x1="4.22" y1="4.22" x2="5.64" y2="5.64"></line>
<line x1="18.36" y1="18.36" x2="19.78" y2="19.78"></line>
<line x1="1" y1="12" x2="3" y2="12"></line>
<line x1="21" y1="12" x2="23" y2="12"></line>
<line x1="4.22" y1="19.78" x2="5.64" y2="18.36"></line>
<line x1="18.36" y1="5.64" x2="19.78" y2="4.22"></line>
</svg>
</button>
</div>
</div>
<ul id="menu">
<li>
<a href="https://new.dvdt.dev/about-me/" title="about me">
<span>about me</span>
</a>
</li>
<li>
<a href="https://new.dvdt.dev/support" title="support">
<span>support</span>
</a>
</li>
</ul>
</nav>
</header>
<main class="main">
<article class="post-single">
<header class="post-header">
<h1 class="post-title">
Running a Bitcoin Full Node
</h1>
<div class="post-meta"><span title='2020-06-13 00:00:00 +0000 UTC'>June 13, 2020</span>&nbsp;·&nbsp;David Lick
</div>
</header>
<div class="post-content"><p><img loading="lazy" src="/img/bitcoin-cpu.jpg" alt="Bitcoin on CPU" />
</p>
<p>I learned about Bitcoin in 2013. I watched it for a while before I entered the market in 2014. I dabbled in day-trading (bad idea, just don&rsquo;t if you like sleep at all&hellip;) I even wrote a Python trading bot back in the day that made some decent profits before my 24 year old self got nervous about playing with more money than I&rsquo;d ever had at once and turned it off.</p>
<p>During the run up at the end of 2014 I sold out of my position a little before the peak. It was dumb luck, trust me I was no genius trader by any means and that&rsquo;s still true. I told myself the volatility was too much for me, and it was&hellip; I lost a lot of sleep that year. But I never stopped checking up on how Bitcoin was doing and recently I&rsquo;ve gotten back in the game. This year with the corona epidemic and the unprecedented amount of money being created, the multiple other currencies that have experienced hyper-inflation recently, Bitcoin&rsquo;s raison d&rsquo;être for existing is back in center-view.</p>
<p>I believe in Bitcoin and want to contribute to the network somehow. Mining is out of the question. It was out of the question even back in 2014 when ASICs started coming onto the scene. Another option is running a Bitcoin full node.</p>
<h3 id="what-is-a-full-node">What is a full node?<a hidden class="anchor" aria-hidden="true" href="#what-is-a-full-node">#</a></h3>
<p>To answer that question, let&rsquo;s take a step back and look at how the Bitcoin protocol works. Miners collect new transactions from the network together in blocks and then hash them over and over. They&rsquo;re looking for a hash that has a specific number of preceding zeroes, called the difficulty. This process is called proof of work and it&rsquo;s the heart of what makes Bitcoin work. The process of finding a hash that matches the difficulty takes a lot of computing power but checking that hash is trivially easy even for a low-powered computer.</p>
<p>Bitcoin is trust-less at every layer so we don&rsquo;t blindly trust the blocks miners give us; we verify. This is the work that full nodes do. They enforce the rules of Bitcoin always. If a miner produces a block that doesn&rsquo;t follow the rules it is ignored and if it happens enough that miner is also ignored. This gives miners a financial incentive to behave. If you don&rsquo;t follow the rules you don&rsquo;t receive the transaction fees or the block bounty. Full nodes are a check on the [51% attack.</p>
<p>Full nodes also give you a voting voice in the case of a hard-fork. The software you run determines the rules followed. This happened with <a href="https://www.investopedia.com/news/all-about-bitcoin-cash-hard-fork/">Bitcoin Cash</a> in 2019. Developers attempted to alter the Bitcoin consensus rules in a way that would defy Bitcoin&rsquo;s core tenant of limited supply scarcity. Contributors running full nodes voted on which fork to follow by running one version of the full node software or the other and overwhelmingly chose BTC. You can see that in the price of both today: BTC - $9450 vs. BCH - $240.</p>
<h3 id="tutorial">Tutorial<a hidden class="anchor" aria-hidden="true" href="#tutorial">#</a></h3>
<p>I have a home server which is my lab of sorts. I use it for all kinds of things and there are various tasks it runs for me and it has enough storage for this. You don&rsquo;t have to have a dedicated computer to run a full node. Lots of contributors run full nodes on Raspberry Pi&rsquo;s or other single-board computers. There are only a few requirements to run a full node:</p>
<ul>
<li>You are going to download the entire blockchain so you will need a sizable amount of free storage. The blockchain is 282GB as of this post. Each block is around 1MB and new blocks are mined every 10 minutes so the blockchain size grows linearly with time.</li>
</ul>
<p><img loading="lazy" src="/img/blockchain-size-graph-2020.png" alt="Blockchain size graph" />
</p>
<ul>
<li>Obviously you&rsquo;ll need to download the blockchain in its entirety so you&rsquo;ll want an unmetered internet connection. After the initial blockchain download you will download 20GB and upload 200GB per month on average.</li>
<li>You need the full node to run at least 6 hours per day. Running it all the time is better.</li>
<li>You probably don&rsquo;t want this running on a high powered gaming computer unless you like paying your energy company for electricity. This is a big reason a lot of people opt for a Raspberry Pi.</li>
</ul>
<p>Getting the full node up and running is actually very easy. There&rsquo;s a GUI version you can use but I run my Linux server headless so we&rsquo;ll go through the CLI version. The installation instructions found here are very good. The verification of the file integrity and the signing keys may not be obvious to novice users so I&rsquo;ll go through the steps here:</p>
<ol>
<li>First off, you need to <a href="https://bitcoin.org/en/download">download</a> the Linux tarball, the SHA256SUMS file and the release signing key corresponding to your version.</li>
<li>Now verify the download files integrity with the SHA256SUMS file. Run the following command and you should see an OK corresponding to the tarball you downloaded.</li>
</ol>
<pre tabindex="0"><code>~/Downloads$ sha256sum --ignore-missing -c SHA256SUMS.asc
bitcoin-0.20.0-x86_64-linux-gnu.tar.gz: OK
sha256sum: WARNING: 20 lines are improperly formatted
</code></pre><ol start="3">
<li>Import the public key into your GPG keyring. I installed version 0.20.0 so in my case the signing key was laanwj-releases.asc.</li>
</ol>
<pre tabindex="0"><code>~/Downloads$ gpg --import laanwj-releases.asc
gpg: key 90C8019E36C2E964: 51 signatures not checked due to missing keys
gpg: key 90C8019E36C2E964: public key &#34;Wladimir J. van der Laan (Bitcoin Core binary release signing key) &lt;laanwj@gmail.com&gt;&#34; imported
gpg: Total number processed: 1
gpg: imported: 1
gpg: no ultimately trusted keys found
</code></pre><ol start="4">
<li>Now verify the SHA256SUMS.asc file. If you are an extra cautious person you can go a step further and ask one of the project developers to verify the fingerprint.</li>
</ol>
<pre tabindex="0"><code>~/Downloads$ gpg --verify SHA256SUMS.asc
gpg: Signature made Wed 03 Jun 2020 05:59:52 AM EDT
gpg: using RSA key 90C8019E36C2E964
gpg: Good signature from &#34;Wladimir J. van der Laan (Bitcoin Core binary release signing key) &lt;laanwj@gmail.com&gt;&#34; [unknown]
gpg: WARNING: This key is not certified with a trusted signature!
gpg: There is no indication that the signature belongs to the owner.
Primary key fingerprint: 01EA 5486 DE18 A882 D4C2 6845 90C8 019E 36C2 E964
</code></pre><ol start="5">
<li>Now that we&rsquo;ve verified the download you can follow along with the installation instructions.</li>
</ol>
<h3 id="networkingfirewall">Networking/Firewall<a hidden class="anchor" aria-hidden="true" href="#networkingfirewall">#</a></h3>
<p>You&rsquo;ll also need to open the 8333 port for your full node. The process for this is very dependent on your set up. In my case, I needed to set up port forwarding through my router as well as open the port in my iptables firewall. I have my firewall set up to DROP any incoming traffic not explicitly allowed so I simply added an INPUT rule like this:</p>
<pre tabindex="0"><code>iptables -A INPUT -p tcp --dport 8333 -j ACCEPT
</code></pre><h3 id="starting-up">Starting up<a hidden class="anchor" aria-hidden="true" href="#starting-up">#</a></h3>
<p>I went the init script route for starting my full node using systemd instead of a crontab. If you want to use systemd:</p>
<ol>
<li>
<p>Add this <a href="https://github.com/bitcoin/bitcoin/blob/master/contrib/init/bitcoind.service">init script</a> to your /usr/lib/systemd/system folder.</p>
</li>
<li>
<p>Test by starting the script: systemctl start bitcoind</p>
</li>
<li>
<p>If bitcoind started successfully you can start it at boot time: systemctl enable bitcoind</p>
</li>
</ol>
<h3 id="initial-block-download">Initial Block Download<a hidden class="anchor" aria-hidden="true" href="#initial-block-download">#</a></h3>
<p>The inital block download will take a while to complete depending on your connection. I have a gigabit fiber connection and it still took the majority of 24 hours to complete. You are downloading a full copy of the blockchain from other contributors running a full node so even if you have a fast connection you will likely be limited by others upload speeds.</p>
<h3 id="conclusion">Conclusion<a hidden class="anchor" aria-hidden="true" href="#conclusion">#</a></h3>
<p>I hope this helps others get their full nodes up and running. It genuinely feels good to contribute to the network and keep Bitcoin safe. If this helped let me know on <a href="https://twitter.com/DalaiComma">Twitter</a> or if you did get stuck along the way, I&rsquo;d be happy to help you along if I can and I&rsquo;ll update this guide for others.</p>
</div>
<footer class="post-footer">
<ul class="post-tags">
</ul>
</footer>
</article>
</main>
<footer class="footer">
<span>&copy; 2023 <a href="https://new.dvdt.dev/">dvdt.dev</a></span>
</footer>
<a href="#top" aria-label="go to top" title="Go to Top (Alt + G)" class="top-link" id="top-link" accesskey="g">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 12 6" fill="currentColor">
<path d="M12 6H0l6-6z" />
</svg>
</a><footer class="footer">PGP: 6FF9 2943 B795 21DC 51D2 4734 715C 88E0 E239 7C72</footer>
<script>
let menu = document.getElementById('menu')
if (menu) {
menu.scrollLeft = localStorage.getItem("menu-scroll-position");
menu.onscroll = function () {
localStorage.setItem("menu-scroll-position", menu.scrollLeft);
}
}
document.querySelectorAll('a[href^="#"]').forEach(anchor => {
anchor.addEventListener("click", function (e) {
e.preventDefault();
var id = this.getAttribute("href").substr(1);
if (!window.matchMedia('(prefers-reduced-motion: reduce)').matches) {
document.querySelector(`[id='${decodeURIComponent(id)}']`).scrollIntoView({
behavior: "smooth"
});
} else {
document.querySelector(`[id='${decodeURIComponent(id)}']`).scrollIntoView();
}
if (id === "top") {
history.replaceState(null, null, " ");
} else {
history.pushState(null, null, `#${id}`);
}
});
});
</script>
<script>
var mybutton = document.getElementById("top-link");
window.onscroll = function () {
if (document.body.scrollTop > 800 || document.documentElement.scrollTop > 800) {
mybutton.style.visibility = "visible";
mybutton.style.opacity = "1";
} else {
mybutton.style.visibility = "hidden";
mybutton.style.opacity = "0";
}
};
</script>
<script>
document.getElementById("theme-toggle").addEventListener("click", () => {
if (document.body.className.includes("dark")) {
document.body.classList.remove('dark');
localStorage.setItem("pref-theme", 'light');
} else {
document.body.classList.add('dark');
localStorage.setItem("pref-theme", 'dark');
}
})
</script>
</body>
</html>