<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[Jeremy's Blog]]></title><description><![CDATA[Science & Tech Enthusiast. Currently focused on AWS and Blockchain.]]></description><link>https://jeremy.felder.link</link><image><url>https://cdn.hashnode.com/res/hashnode/image/upload/v1631715496317/xQpEdBOsA.png</url><title>Jeremy&apos;s Blog</title><link>https://jeremy.felder.link</link></image><generator>RSS for Node</generator><lastBuildDate>Sun, 19 Apr 2026 11:50:46 GMT</lastBuildDate><atom:link href="https://jeremy.felder.link/rss.xml" rel="self" type="application/rss+xml"/><language><![CDATA[en]]></language><ttl>60</ttl><item><title><![CDATA[Chain Runners: A new on chain paradigm?]]></title><description><![CDATA[We are going to deep dive into the how the latest on chain NFT project built their contract. They derived some inspiration from previous projects and gave them credit in their code (Anonymice, blitmap).
Table of Contents:

Project Overview
Contracts
...]]></description><link>https://jeremy.felder.link/chain-runners-breakdown</link><guid isPermaLink="true">https://jeremy.felder.link/chain-runners-breakdown</guid><category><![CDATA[NFT]]></category><category><![CDATA[Blockchain]]></category><category><![CDATA[Ethereum]]></category><category><![CDATA[learning]]></category><category><![CDATA[coding]]></category><dc:creator><![CDATA[Jeremy Felder]]></dc:creator><pubDate>Sun, 28 Nov 2021 22:31:44 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1638138504524/tK53_HCn2.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>We are going to deep dive into the how the latest on chain NFT project built their contract. They derived some inspiration from previous projects and gave them credit in their code (Anonymice, blitmap).</p>
<h1 id="heading-table-of-contents">Table of Contents:</h1>
<ol>
<li><a class="post-section-overview" href="#heading-project-overview">Project Overview</a></li>
<li><a class="post-section-overview" href="#heading-contracts">Contracts</a><ol>
<li><a class="post-section-overview" href="#heading-chainrunnerssol">ChainRunners.sol</a></li>
<li><a class="post-section-overview" href="#heading-chainrunnersbaserenderersol">ChainRunnersBaseRenderer.sol</a><ol>
<li><a class="post-section-overview" href="#heading-picking-the-layers">Picking the Layers</a></li>
<li><a class="post-section-overview" href="#heading-generating-the-pixels">Generating the Pixels</a></li>
</ol>
</li>
</ol>
</li>
<li><a class="post-section-overview" href="#heading-security-and-safety-considerations">Security and Safety Considerations</a><ol>
<li><a class="post-section-overview" href="#heading-setrenderingcontractaddress">setRenderingContractAddress</a></li>
<li><a class="post-section-overview" href="#heading-setlayers">setLayers</a></li>
</ol>
</li>
<li><a class="post-section-overview" href="#heading-notes">Notes</a></li>
</ol>
<h2 id="heading-project-overview">Project Overview</h2>
<p>Before we being, here are the contracts that we will be looking at:<br />
Main Contract: <a target="_blank" href="https://etherscan.io/address/0x97597002980134beA46250Aa0510C9B90d87A587">ChainRunners.sol</a> - stores NFT data and contains controls for minting<br />
Render Contract: <a target="_blank" href="https://etherscan.io/address/0xfdac77881ff861ff76a83cc43a1be3c317c6a1cc">ChainRunnersBaseRenderer.sol</a> - calculates the pixels/art and creates an SVG<br /></p>
<p><strong>Project Name</strong>: Chain Runners<br />
<strong>Website</strong>: https://www.chainrunners.xyz/ <br />
<strong>Description</strong>: 100% on chain generative pixel art. This means that all of the data making up the art is computed and stored on chain.<br />
<strong>Total Supply</strong>: 10,000 (85 reserved for founders)<br />
<strong>Mint Price</strong>: 0.05 ETH<br />
<strong>Early Access</strong>: Yes<br />
<strong>Mint Status</strong>: Finished<br />
<strong>OpenSea</strong>: https://opensea.io/collection/chain-runners-nft (OpenSea is a marketplace for buying and selling NFTs)</p>
<h2 id="heading-contracts">Contracts</h2>
<p>Now that we have an overview of the project lets dive in. We will start with the first contract</p>
<h3 id="heading-chainrunnerssol">ChainRunners.sol</h3>
<p>This contract is an ERC721 with some additional functionality to control minting access - founder, early access, and public minting - and creating the data that the NFTs will be built from.</p>
<p>The first function we want to look at is the internal <code>mint</code> function: </p>
<pre><code><span class="hljs-keyword">function</span> mint(uint256 tokenId) <span class="hljs-type">internal</span> {
    ChainRunnersTypes.ChainRunner memory runner;
    runner.dna = uint256(keccak256(abi.encodePacked(
        tokenId,
        msg.sender,
        block.difficulty,
        block.timestamp
    )));

    _safeMint(msg.sender, tokenId);
    runners[tokenId] = runner;
}
</code></pre><p>It is a simple function that does the following:</p>
<ol>
<li>Generates the dna of a runner based on the tokenId and some other parameters. We concatenate the parameters and then take the keccak256 (sha3) hash and cast it to a unsigned integer of 256 bits.<ol>
<li>It is possible to mint multiple runners (tokens) in a single transaction so using the tokenId as a parameter was necessary to ensure the dna would be different for every runner</li>
</ol>
</li>
<li>Mint the tokenId using the ERC721 <code>_safeMint</code></li>
<li>Save the runner (its dna) to a state variable</li>
</ol>
<p>The runners (and their dna) are stored on this main contract. We dont have an image/svg yet though. For this we will need to start using the second contract, but before we do, the second contract address must be set. It is set by, and only by, the owner of the contract. Remember this, we will discuss the tradeoffs soon.</p>
<pre><code><span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">setRenderingContractAddress</span>(<span class="hljs-params">address _renderingContractAddress</span>) <span class="hljs-title">public</span> <span class="hljs-title">onlyOwner</span> </span>{
    renderingContractAddress = _renderingContractAddress;
}
</code></pre><p>So far we have a list of tokenIds mapped to their runners (which contain the dna) and a rendering contract. In order to get the svg/rendering we need to call the function <code>tokenURI</code> (NOTE - it is not the <strong>only</strong> way but it is the easiest):</p>
<pre><code><span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">tokenURI</span>(<span class="hljs-params">uint256 _tokenId</span>) <span class="hljs-title">public</span> <span class="hljs-title">view</span> <span class="hljs-title">virtual</span> <span class="hljs-title">override</span> <span class="hljs-title">returns</span> (<span class="hljs-params"><span class="hljs-keyword">string</span> memory</span>) </span>{
    <span class="hljs-keyword">require</span>(_exists(_tokenId), <span class="hljs-string">"ERC721Metadata: URI query for nonexistent token"</span>);

    <span class="hljs-keyword">if</span> (renderingContractAddress == address(<span class="hljs-number">0</span>)) {
       <span class="hljs-keyword">return</span> <span class="hljs-string">''</span>;
    }

    IChainRunnersRenderer renderer = IChainRunnersRenderer(renderingContractAddress);
    <span class="hljs-keyword">return</span> renderer.tokenURI(_tokenId, runners[_tokenId]);
}
</code></pre><p>The <code>tokenURI</code> function calls the renderer contract's tokenURI function with the <code>tokenId</code> and the <code>runner</code> associated with the <code>tokenId</code>. What we get back is a base64 encoded string which when we decode it we see contains the SVG data which we can then render. 
<img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1638128242351/HaEL_8P7B.png" alt="image.png" />
<img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1638128377666/fuvqGY_re.png" alt="image.png" />
<img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1638128422620/3eIUlFBRM.png" alt="image.png" /></p>
<p>Its basically magic at this point, but lets take a look at the second contract and see how this magic happens.</p>
<h3 id="heading-chainrunnersbaserenderersol">ChainRunnersBaseRenderer.sol</h3>
<p>As we saw in the first contract, the main entry point on this contract is the <code>tokenURI</code> function. </p>
<pre><code> <span class="hljs-comment">/*
    Generate base64 encoded tokenURI.

    All string constants are pre-base64 encoded to save gas.
    Input strings are padded with spacing/etc to ensure their length is a multiple of 3.
    This way the resulting base64 encoded string is a multiple of 4 and will not include any '=' padding characters,
    which allows these base64 string snippets to be concatenated with other snippets.
    */</span>
    <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">tokenURI</span>(<span class="hljs-params">uint256 tokenId, ChainRunnersTypes.ChainRunner memory runnerData</span>) <span class="hljs-title">public</span> <span class="hljs-title">view</span> <span class="hljs-title">returns</span> (<span class="hljs-params"><span class="hljs-keyword">string</span> memory</span>) </span>{
        <span class="hljs-comment">// first we obtain the layers, colors, and traits</span>
        (Layer [NUM_LAYERS] memory tokenLayers, Color [NUM_COLORS][NUM_LAYERS] memory tokenPalettes, uint8 numTokenLayers, <span class="hljs-keyword">string</span>[NUM_LAYERS] memory traitTypes) = getTokenData(runnerData.dna);
        <span class="hljs-keyword">string</span> memory attributes;
        <span class="hljs-keyword">for</span> (uint8 i = <span class="hljs-number">0</span>; i &lt; numTokenLayers; i++) {
            attributes = <span class="hljs-keyword">string</span>(abi.encodePacked(attributes,
                bytes(attributes).length == <span class="hljs-number">0</span> ? <span class="hljs-string">'eyAg'</span> : <span class="hljs-string">'LCB7'</span>,
                <span class="hljs-string">'InRyYWl0X3R5cGUiOiAi'</span>, traitTypes[i], <span class="hljs-string">'IiwidmFsdWUiOiAi'</span>, tokenLayers[i].name, <span class="hljs-string">'IiB9'</span>
                ));
        }
        <span class="hljs-comment">// then we construct the svg from the layers and colors</span>
        <span class="hljs-keyword">string</span>[<span class="hljs-number">4</span>] memory svgBuffers = tokenSVGBuffer(tokenLayers, tokenPalettes, numTokenLayers);
        <span class="hljs-comment">// finally, we construct the final base64 encoded string</span>
        <span class="hljs-keyword">return</span> <span class="hljs-keyword">string</span>(abi.encodePacked(
                <span class="hljs-string">'data:application/json;base64,eyAgImltYWdlX2RhdGEiOiAiPHN2ZyB2ZXJzaW9uPScxLjEnIHZpZXdCb3g9JzAgMCAzMjAgMzIwJyB4bWxucz0naHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnIHNoYXBlLXJlbmRlcmluZz0nY3Jpc3BFZGdlcyc+'</span>,
                svgBuffers[<span class="hljs-number">0</span>], svgBuffers[<span class="hljs-number">1</span>], svgBuffers[<span class="hljs-number">2</span>], svgBuffers[<span class="hljs-number">3</span>],
                <span class="hljs-string">'PHN0eWxlPnJlY3R7d2lkdGg6MTBweDtoZWlnaHQ6MTBweDt9PC9zdHlsZT48L3N2Zz4gIiwgImF0dHJpYnV0ZXMiOiBb'</span>,
                attributes,
                <span class="hljs-string">'XSwgICAibmFtZSI6IlJ1bm5lciAj'</span>,
                Base64.encode(uintToByteString(tokenId, <span class="hljs-number">6</span>)),
                <span class="hljs-string">'IiwgImRlc2NyaXB0aW9uIjogIkNoYWluIFJ1bm5lcnMgYXJlIE1lZ2EgQ2l0eSByZW5lZ2FkZXMgMTAwJSBnZW5lcmF0ZWQgb24gY2hhaW4uIn0g'</span>
            ));
    }
</code></pre><p>There are two functions that are called here that do the heavy lifting. First, the function <code>getTokenData</code> is called which picks the race, layers, and colors. Then the function <code>tokenSVGBuffer</code> creates the svg rects (pixels). Lastly, the remaining code in <code>tokenURI</code> bundles everything together in the final base64 string</p>
<p>Before jumping into the details, lets define some of the data we will see:</p>
<ul>
<li>WEIGHTS - Rarity weights split by Race and Layer; they determine the frequency of that layer for that race</li>
<li>Race - There are 3 races in this contract. They are hard coded and created on contract creation<ol>
<li>Alien/Human</li>
<li>Skull</li>
<li>Bot</li>
</ol>
</li>
<li>Layers - These are the traits that layer on top of each other to create the image. These are set by the owner using the <code>setLayers</code> function.
There are 13 traits which are pre-encoded in base64:<ol>
<li>Background - QmFja2dyb3VuZCAg</li>
<li>Race - UmFjZSAg</li>
<li>Face - RmFjZSAg</li>
<li>Mouth - TW91dGgg</li>
<li>Nose - Tm9zZSAg</li>
<li>Eyes - RXllcyAg</li>
<li>Ear Accessory - RWFyIEFjY2Vzc29yeSAg</li>
<li>Face Accessory - RmFjZSBBY2Nlc3Nvcnkg</li>
<li>Mask - TWFzayAg</li>
<li>Head Below - SGVhZCBCZWxvdyAg</li>
<li>Eye Accessory - RXllIEFjY2Vzc29yeSAg</li>
<li>Head Above - SGVhZCBBYm92ZSAg</li>
<li>Mouth Accessory - TW91dGggQWNjZXNzb3J5</li>
</ol>
</li>
</ul>
<h4 id="heading-picking-the-layers">Picking the Layers</h4>
<p>The function <code>getTokenData</code> splits the dna into 13 pieces. The second piece is used to obtain the Race by using the weights associated with the default race. Other pieces are used to obtain specific traits such as having a mask or a face accessory. This is done to make sure layers are compatible with each other visually (it wouldn't look good if the NFT had a mask with a mouth accessory).</p>
<p>Then we generate the layers that will make up the NFT. For each piece of dna, we generate the layer index using the weights of race and the current iteration. This gives us a layer which contains a name, an item index, a layer index, and a hexString. The hexString is used to generate RGBA colors that will be transformed into a 6 letter hex string later on. The iteration is also used to select the trait name from the 13 traits to be used in the final base64 string listed as attributes.</p>
<h4 id="heading-generating-the-pixels">Generating the Pixels</h4>
<p>Once we have the layers and the colors, we can start building the NFT pixel by pixel. The function <code>tokenSVGBuffer</code> creates 8 buffers of 4 pixels 32 times (8<em>4</em>32=1024). It creates 4 pixels independently and then bundles those into a base64 encoded string. Each pixel combines the individual colors from the layer at a specific position in the hexString. Since most of the layers wont have overlapping pixels we only combine the first two non-transparent layers. The combination of the layers is then converted into a 6 letter hex string. Doing this 8 times in a single iteration creates an entire row of pixels. This happens 32 times generating all of the rows.</p>
<h2 id="heading-security-and-safety-considerations">Security and Safety Considerations</h2>
<p>Overall, generating and storing the data and logic that makes the NFTs/art on chain is a big step in the direction of complete ownership over the NFT and immutable art. Here we see two caveats (albeit small ones) that make it not 100% immutable.</p>
<h3 id="heading-setrenderingcontractaddress">setRenderingContractAddress</h3>
<p>Going back to the first contract, we saw the function <code>setRenderingContractAddress</code> which can only be set by the owner. Since all of the logic for creating the art from the dna is in the rendering contract it is possible for the owner to change the way the dna is rendered. Is this a bad thing? Maybe, maybe not. It really all depends on trusting the owners. It might be an issue if the owner's account is hacked or the owner becomes malicious; they can change the rendering contract to something new making an entirely new project. On the other hand, the owner can upgrade the rendering contract to something new which contains additional functionality and extends the current project. At this point, there isn't a need to fear a malicious owner and the community seems to be growing. I'm definitely leaning to the side of extensible upgrades.</p>
<h3 id="heading-setlayers">setLayers</h3>
<p>In the second contract there is a function <code>setLayers</code>, which the owner uses to set the different layers of traits and pixel colors to use for generating the art. The only checks on this function are for the caller to be the owner. This means the owner can change the layers at any point and change the art by doing so since the art is recomputed on each call to tokenURI. Given that it costed the owners close to 7 ETH (you can add up all the fees from the 2nd-8th transactions on the contract) just to upload the original layers' data, its unlikely that they will use this to change the art. It might have been interesting to store the hash of the entire tokenURI to prove no manipulation has been done but then again maybe the team has bigger plans for expanding the narrative and needs the flexibility.</p>
<h2 id="heading-notes">Notes</h2>
<ol>
<li><p>If we look at the first contract again, we can see that there is a function <code>mintRunnerZero</code>. It is callable by anyone <strong>but</strong> in order to mint it, you need to know the seed used to configure runnerZero which is set by the owner using <code>configureRunnerZero</code>. These functions have not been called yet by the owners! This is one reason that I believe the above security considerations are meant to be used as upgrades in a second/additional narrative to the Chain Runners sagas.</p>
</li>
<li><p>There isn't a single hard coded plain text string in the entire render contract. Anything that is meant to be a string was pre-encoded to base64. This saves on computation and can also save on gas if the functions are called as part of an external call (not an external view call). The only down side to this is readibility, though decoding base64 isn't difficult.</p>
</li>
<li><p>The only pieces of data that are stored are:</p>
<ul>
<li>WEIGHTS</li>
<li>Layers</li>
<li>Runner DNA</li>
<li>Pre-encoded base64 strings</li>
</ul>
</li>
</ol>
]]></content:encoded></item><item><title><![CDATA[What is a Blockchain Anyway?]]></title><description><![CDATA[What the heck is a blockchain? The short (and overly simplified) answer; it’s a network of computers that communicate and verify transactions in order to keep an immutable distributed ledger.
Whaaaaaat 🤔🤯🤔🤯🤔🤯
Don't worry, we will go through eac...]]></description><link>https://jeremy.felder.link/what-is-a-blockchain-anyway</link><guid isPermaLink="true">https://jeremy.felder.link/what-is-a-blockchain-anyway</guid><category><![CDATA[Blockchain]]></category><category><![CDATA[learning]]></category><category><![CDATA[Cryptocurrency]]></category><category><![CDATA[Beginner Developers]]></category><dc:creator><![CDATA[Jeremy Felder]]></dc:creator><pubDate>Mon, 01 Nov 2021 19:01:50 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1635509857638/1kRUuYqf1.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>What the heck is a blockchain? The short (and overly simplified) answer; it’s a network of computers that communicate and verify transactions in order to keep an immutable distributed ledger.</p>
<p>Whaaaaaat 🤔🤯🤔🤯🤔🤯</p>
<p>Don't worry, we will go through each piece of that sentence and you'll be a pro. Much of what we define will be limited to what we need to understand a blockchain. If you want a TL;DR, skip to the end😉.</p>
<h3 id="a-network-of-computers-that-communicate">A Network of Computers that Communicate</h3>
<p>You're currently using a laptop, tablet, phone, or another electronic device to read this article. We can consider any of these a "Computer" - some electronic device that can process information and communicate with other devices that are similar (this is not a strict definition of a Computer, just a definition that we will use).</p>
<p>A Network of Computers is many of these devices that are connected by some capability of communication. </p>
<p>As an example, let’s assume you're at home and connected to your WiFi along with a friend that is also connected to the same WiFi. The two devices can communicate through the WiFi network. This is an example of a small network, your home WiFi. 
Bigger networks can be created by combining smaller networks and so on. Eventually we get to what we call the Internet - a massive network of many many smaller networks.</p>
<p>A blockchain is exactly this - a small network. A bunch of computers that are continuously talking to each other as one network. In order to join this network and be able to communicate with the other computers, a computer must start a program specific to the blockchain network it wants to join. This program is what allows each computer in the network to speak the same language and communicate with each other. You can think of this as somewhat like WhatsApp - if you want to communicate with someone who is using WhatsApp you must start WhatsApp and then you can talk.</p>
<p><strong>Quick recap:</strong> A blockchain is a network of computers that are all running the same program enabling them to communicate with each other.</p>
<h3 id="and-verify-transactions">And Verify Transactions</h3>
<p>In the simplest sense, a transaction is some command that is sent to one of the computers in the network. For us, we will assume that all of these commands are of the format "Send X (an amount) Y (some currency) to Z (a person/account)". We can think of it much like using PayPal, Venmo, or any other money sending app.</p>
<p>Each computer in the network (we will call these <em>nodes</em>) will receive some transactions from people using the blockchain. Those nodes will communicate with other nodes about each new transaction they become aware of. This will repeat, until all the nodes know about all of the current transactions. Each node will verify each transaction it knows about to ensure that the person sending actually owns the funds they are trying to send.</p>
<p>As an example, let’s say Alice has 5 dollars and she sends the following transaction to a node: "Send 4 dollars to Bob". That node needs to verify that Alice actually has 4 dollars to send. The node will also notify other nodes that they received this transaction and each of those nodes will also verify that Alice actually has 4 dollars.</p>
<p>Once there are enough verified transactions, one of the nodes creates a block - a chunk of verified transactions. This block is then added to the end of the latest block that was created making a chain of blocks. As more transactions occur, more blocks are created and appended, making the blockchain longer.</p>
<p><strong>Quick recap:</strong> Computers in the network, called nodes, receive transactions from users. The node will verify that the transaction is valid and will notify other nodes about the transaction. These other nodes will also verify that the transaction is valid. Once many transactions have been verified, they are bundled into a block which is appended to the last created block, creating a chain of blocks - aka The Blockchain.</p>
<h3 id="to-keep-an-immutable-distributed-ledger">To Keep an Immutable Distributed Ledger</h3>
<p>All of these transactions and blocks are making up a ledger of who owns what funds based off of incoming and outgoing transactions. Each node holds an exact copy of these records and runs the same program to keep the ledger up to date and valid. This is what makes the ledger distributed; all nodes perform some action to compute a single outcome that is shared with all nodes.</p>
<p>As time progresses, more transactions are being verified and more blocks are being added to the chain. Each block contains a few pieces of data; the list of transactions, a unique identifier (called a <em>hash</em>) of the block, and the previous block’s hash. Since each block contains the hash of the previous block, each block is linked to the previous one. This means, if someone wanted to change the history of the chain by removing one of the blocks, everyone would know since the block after the one removed would not contain the hash of the block before the one removed. </p>
<p>Assume we have a blockchain that contains 100 blocks currently. Someone wants to change history and remove block #97. If this happened, then we would have block #96 before block #98. BUT Block #98 contains #97's hash not #96's so everyone would know that some history is missing or is incorrect and would not accept the change.</p>
<p>This is what makes the blockchain immutable. Or does it? What if we removed blocks #97, 98, 99, and 100 and replaced them with <strong>valid</strong> but different blocks? Since the historical chain is valid it should be accepted. </p>
<p>This is true and it is possible that it can happen. So how is a blockchain immutable???</p>
<p>Since the current history is progressing by adding blocks, the alternate history needs to be created at a faster rate than the current history. This is both extremely costly and time consuming as we will see in a later post, making it very unlikely to happen and causing the blockchain to be probabilistically immutable.</p>
<p>In a later post we will discuss <strong><em>Why</em></strong> blockchains are useful and matter in today's world.</p>
<h3 id="full-recap">Full Recap</h3>
<p>A blockchain is a network of computers (<em>nodes</em>) that are all running the same program allowing them to communicate about transactions that each one knows of. </p>
<p>Transactions are sent to each node to verify that they are valid and viable transactions. Once a chunk of transactions have been verified, a block containing these verified transactions is appended to the end of the current chain of previous blocks which contain the history of validated and verified transactions - this chain of blocks is the ledger aka The Blockchain. </p>
<p>Each node holds their own copy of the agreed upon blockchain. Each block contains a piece of the previous block linking them together in the history. In order to change the history, one of the nodes must create an alternate history that is both valid and longer than the current history (we will see that this is not 100% for every blockchain). Since the current history is progressing by adding blocks, the alternate history needs to be created at a faster rate than the current history. This is both extremely costly and time consuming, making it very unlikely to happen and causing the blockchain to be probabilistically immutable.</p>
<p>So what is Bitcoin?</p>
<p>Stay tuned for part 2 of Crypto College</p>
]]></content:encoded></item><item><title><![CDATA[Crypto College]]></title><description><![CDATA[Welcome to Crypto College!
This series will take you on a journey through the cryptoverse. We will begin with the basics and build on top to more complex ideas and hands on tutorials. No prior knowledge of blockchains is needed, however some familiar...]]></description><link>https://jeremy.felder.link/crypto-college</link><guid isPermaLink="true">https://jeremy.felder.link/crypto-college</guid><category><![CDATA[learning]]></category><category><![CDATA[crypto]]></category><category><![CDATA[Blockchain]]></category><category><![CDATA[Bitcoin]]></category><dc:creator><![CDATA[Jeremy Felder]]></dc:creator><pubDate>Mon, 01 Nov 2021 18:57:57 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1635501939336/aX7LSctrW.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<h2 id="welcome-to-crypto-college">Welcome to Crypto College!</h2>
<p>This series will take you on a journey through the cryptoverse. We will begin with the basics and build on top to more complex ideas and hands on tutorials. No prior knowledge of blockchains is needed, however some familiarity with computer concepts is recommended.</p>
<p>After each post is released, the list below will be updated with links to each post. Italicized titles are coming soon. If you have specific topics you want covered please comment below and I will try to add them to the list.</p>
<p>I always appreciate feedback, corrections, and questions; Feel free to email me jeremy.felder1@gmail.com (or comment below) and I will try to respond as much as possible.</p>
<h2 id="intro-to-blockchain-and-money">Intro to blockchain and money</h2>
<ul>
<li><a target="_blank" href="https://jeremy.felder.link/what-is-a-blockchain-anyway">What is a blockchain anyway?</a></li>
<li><em>So what is Bitcoin?</em></li>
<li><em>Why does blockchain technology matter: A history of money</em></li>
<li><em>So what is Ethereum?</em></li>
</ul>
]]></content:encoded></item></channel></rss>