{"id":7045,"date":"2025-01-07T08:11:57","date_gmt":"2025-01-07T07:11:57","guid":{"rendered":"https:\/\/wsj-crypto.com\/?p=7045"},"modified":"2025-01-07T08:11:57","modified_gmt":"2025-01-07T07:11:57","slug":"introducing-geth-v1-10-0-enhanced-performance-and-exciting-features","status":"publish","type":"post","link":"https:\/\/wsj-crypto.com\/index.php\/2025\/01\/07\/introducing-geth-v1-10-0-enhanced-performance-and-exciting-features\/","title":{"rendered":"Introducing Geth v1.10.0: Enhanced Performance and Exciting Features"},"content":{"rendered":"<p><\/p>\n<div id=\"\">\n<p class=\"chakra-text css-gi02ar\">Oh my, it\u2019s been quite some time&#8230; over 1.5 years since we introduced <!-- --><a class=\"chakra-link css-ug8vf0\" href=\"https:\/\/blog.ethereum.org\/2019\/07\/10\/geth-v1-9-0\">Geth v1.9.0<!-- --><\/a>. We did manage 26 incremental releases during this span (approximately one every three weeks), but releasing a significant update holds a particular significance. The rush of excitement from unveiling new features, combined with the anxiety of potential mishaps. Still uncertain whether I love it or despise it. Regardless, Ethereum is progressing and we must extend our capabilities to keep pace with it.<!-- --><\/p>\n<p><!-- --><\/p>\n<p class=\"chakra-text css-gi02ar\"><strong><em class=\"chakra-text css-0\">Without any more delay, please greet <!-- --><a target=\"_blank\" rel=\"noopener\" class=\"chakra-link css-ug8vf0\" href=\"https:\/\/github.com\/ethereum\/go-ethereum\/releases\/tag\/v1.10.0\">Geth v1.10.0<!-- --><\/a> as part of the Ethereum community.<!-- --><\/em><\/strong><\/p>\n<p><!-- --><\/p>\n<h2 class=\"chakra-heading css-1w54o5f\" id=\"here-be-dragons\">Beware of dragons<!-- --><\/h2>\n<p><!-- --><\/p>\n<p class=\"chakra-text css-gi02ar\"><em class=\"chakra-text css-0\">Before we delve into the specifics of our latest release, it&#8217;s crucial to highlight that <!-- --><strong>new features inherently bring new risks<!-- --><\/strong>. To accommodate users and projects with varying risk thresholds, many of our significant features can be (for the time being) activated or deactivated individually. Whether you consume the entire content of this blog entry &#8211; or only glance over sections that captivate your interest &#8211; <!-- --><strong>kindly take a moment to read the &#8216;Compatibility&#8217; section at the conclusion of this document<!-- --><\/strong>!<!-- --><\/em><\/p>\n<p><!-- --><\/p>\n<p class=\"chakra-text css-gi02ar\">Now that\u2019s addressed, let\u2019s plunge in and explore what Geth v1.10.0 has to offer!<!-- --><\/p>\n<p><!-- --><\/p>\n<h3 class=\"chakra-heading css-145upk7\" id=\"berlin-hard-fork\">Berlin hard-fork<!-- --><\/h3>\n<p><!-- --><\/p>\n<p class=\"chakra-text css-gi02ar\">Let\u2019s address the major issue first. Geth v1.10.0 <!-- --><strong>does not include<!-- --><\/strong> the <!-- --><a target=\"_blank\" rel=\"noopener\" class=\"chakra-link css-ug8vf0\" href=\"https:\/\/github.com\/ethereum\/eth1.0-specs\/blob\/master\/network-upgrades\/berlin.md\"><strong><em class=\"chakra-text css-0\">Berlin hard-fork<!-- --><\/em><\/strong><\/a> yet, as there were some last-minute concerns raised by the Solidity team regarding EIP-2315. Since v1.10.0 represents a major release, we prefer not to launch it too close to the fork. We will follow up shortly with v1.10.1 that will include the finalized list of EIPs and block numbers integrated.<!-- --><\/p>\n<p><!-- --><\/p>\n<h3 class=\"chakra-heading css-145upk7\" id=\"snapshots\">Snapshots<!-- --><\/h3>\n<p><!-- --><\/p>\n<p class=\"chakra-text css-gi02ar\">We&#8217;ve been <!-- --><a class=\"chakra-link css-ug8vf0\" href=\"https:\/\/blog.ethereum.org\/2020\/07\/17\/ask-about-geth-snapshot-acceleration\">discussing snapshots<!-- --><\/a> for such an extended period now; it feels surreal to finally witness their presence in a release. Without diving into excessive detail (see linked article), <!-- --><em class=\"chakra-text css-0\">snapshots<!-- --><\/em> are an accelerated data structure positioned atop the Ethereum state, enabling <!-- --><em class=\"chakra-text css-0\">accessing<!-- --><\/em> accounts and contract storage at a significantly quicker pace.<!-- --><\/p>\n<p><!-- --><\/p>\n<p class=\"chakra-text css-gi02ar\">To quantify this, the snapshot functionality reduces the expense of accessing an account from <!-- --><span class=\"chakra-text css-ons8vw\">O(logN)<\/span> to <!-- --><span class=\"chakra-text css-ons8vw\">O(1)<\/span>. This might not appear substantial at first glance, but in practical terms, on the mainnet with 140 million accounts, snapshots can save roughly 8 database lookups per account read. That&#8217;s nearly <!-- --><strong>a tenfold reduction<!-- --><\/strong> in disk lookups, guaranteed to remain constant regardless of state size.<!-- --><\/p>\n<p><!-- --><\/p>\n<p class=\"chakra-text css-gi02ar\"><em class=\"chakra-text css-0\">Wait, does this imply we can increase the gas limit by 10x?!&#8211; &#8211;><\/em> Regrettably, no. While snapshots indeed provide a tenfold improvement in read performance, EVM execution also <!-- --><em class=\"chakra-text css-0\">entails writing<!-- --><\/em> data, and these writes necessitate Merkle proof. The requirement for Merkle proof maintains the necessity for <!-- --><span class=\"chakra-text css-ons8vw\">O(logN)<\/span> disk access during writes.<!-- --><\/p>\n<p><!-- --><\/p>\n<p class=\"chakra-text css-gi02ar\"><em class=\"chakra-text css-0\">Then, what\u2019s the advantage?!<!-- --><\/em> While swift read access to accounts and contract storage isn&#8217;t adequate to raise the gas limit, it addresses several particularly challenging issues:<!-- --><\/p>\n<p><!-- --><\/p>\n<ul role=\"list\" class=\"css-1onhfjo\">\n<li class=\"css-cvpopp\"><strong>Denial-of-Service.<!-- --><\/strong> In 2016, Ethereum endured its most severe DoS attack ever &#8211; <!-- --><a target=\"_blank\" rel=\"noopener\" class=\"chakra-link css-ug8vf0\" href=\"https:\/\/2017.edcon.io\/ppt\/one\/Martin%20Holst%20Swende_The%20%27Shanghai%20%27Attacks_EDCON.pdf\">The Shanghai Attacks<!-- --><\/a> &#8211; that persisted for about 2-3 months. The attack centered on bloating Ethereum&#8217;s state and exploiting various underpriced opcodes to grind the network to a standstill. After multiple client optimizations and repricing hard forks, the assault was thwarted. The underlying issue still remains: state access opcodes incur a fixed EVM gas cost <!-- --><span class=\"chakra-text css-ons8vw\">O(1)<\/span>, yet an increasingly weaker execution cost <!-- --><span class=\"chakra-text css-ons8vw\">O(logN)<\/span>. We\u2019ve increased the gas costs in <!-- --><a target=\"_blank\" rel=\"noopener\" class=\"chakra-link css-ug8vf0\" href=\"https:\/\/eips.ethereum.org\/EIPS\/eip-150\">Tangerine Whistle<!-- --><\/a>, <!-- --><a target=\"_blank\" rel=\"noopener\" class=\"chakra-link css-ug8vf0\" href=\"https:\/\/eips.ethereum.org\/EIPS\/eip-1884\">Istanbul<!-- --><\/a>, and now <!-- --><a target=\"_blank\" rel=\"noopener\" class=\"chakra-link css-ug8vf0\" href=\"https:\/\/eips.ethereum.org\/EIPS\/eip-2929\">Berlin<!-- --><\/a> to align the EVM costs with runtime expenses, yet these are merely temporary solutions. Conversely, snapshots reduce the execution cost of state reads to <!-- --><span class=\"chakra-text css-ons8vw\">O(1)<\/span> &#8211; in accordance with EVM costs &#8211; thereby addressing the read-based DoS concerns long term (don\u2019t hold me to that).<!-- --><\/li>\n<li class=\"css-cvpopp\"><strong>Calls.<!-- --><\/strong> Evaluating a smart contract&#8217;s state in Ethereum entails a brief EVM execution. This includes running bytecode and reading state slots from disk. If you operate your personal Ethereum node purely for your own utilization, there\u2019s a good chance the current state access speed suffices. However, if you manage a node for the benefit of multiple users, the tenfold performance enhancement offered by snapshots implies that you can process ten times as many queries at approximately the same cost to you.<!-- --><\/li>\n<li class=\"css-cvpopp\"><strong>Synchronization.<!-- --><\/strong> There are two primary methods to synchronize an Ethereum node. You can download the blocks and execute all corresponding transactions within; or you can download the blocks, confirm the PoWs, and download the state linked to a recent block. The latter method is significantly quicker, but it depends on benefactors supplying you with a copy of the recent state. With the existing Merkle-Patricia state model, these benefactors read <!-- --><strong>16TB<!-- --><\/strong> of data off disk to assist a syncing node. With snapshots, serving nodes need only read <!-- --><strong>96GB<!-- --><\/strong> of data off disk to integrate a new node into the network. More details on this can be found in the <!-- --><em class=\"chakra-text css-0\">Snap sync<!-- --><\/em> section.<!-- --><\/li>\n<\/ul>\n<p><!-- --><\/p>\n<p class=\"chakra-text css-gi02ar\">As with all features, it\u2019s a matter of trade-offs. Although snapshots offer immense advantages, which we believe are significant enough to make available to everyone, there are certain drawbacks:<!-- --><\/p>\n<p><!-- --><\/p>\n<ul role=\"list\" class=\"css-1onhfjo\">\n<li class=\"css-cvpopp\">A snapshot serves as a redundant copy of the raw Ethereum state already present in the leaves of the Merkle Patricia trie. Thus, snapshotsentail an extra disk burden of approximately <!-- --><strong>20-25GB on mainnet<!-- --><\/strong> at present. Ideally, snapshots will enable us to implement additional state optimizations and possibly eliminate some of the disk burden of Merkle tries as they exist currently.<!-- --><\/li>\n<li class=\"css-cvpopp\">Given that no one has yet crafted snapshots within the network, nodes will initially need to incur the expense of traversing the state trie and generating the initial snapshot independently. Depending on the traffic to your node, this could take anywhere from <!-- --><strong>one day to a week<!-- --><\/strong>, but you only have to perform it a single time during the lifespan of your node (assuming everything functions as planned). The snapshot creation operates in the background, simultaneously with all other node processes. We intend to eliminate this requirement once snapshots are universally accessible in the network. More details on this can be found in the <!-- --><em class=\"chakra-text css-0\">Snap sync<!-- --><\/em> segment.<!-- --><\/li>\n<\/ul>\n<p><!-- --><\/p>\n<p class=\"chakra-text css-gi02ar\"><em class=\"chakra-text css-0\">If you have reservations about the snapshot capability, you <!-- --><strong>can deactivate it<!-- --><\/strong> in Geth 1.10.0 through <!-- --><span class=\"chakra-text css-ons8vw\">&#8211;snapshot=false<\/span>, but please note that we will make it compulsory in the long run to ensure a fundamental network health.<!-- --><\/em><\/p>\n<p><!-- --><\/p>\n<h3 class=\"chakra-heading css-145upk7\" id=\"snap-sync\">Snap sync<!-- --><\/h3>\n<p><!-- --><\/p>\n<p class=\"chakra-text css-gi02ar\">If you believed snapshots took a considerable period to deliver, just wait until you learn about snap sync! We introduced the preliminary prototype of a novel synchronization algorithm back in <!-- --><a target=\"_blank\" rel=\"noopener\" class=\"chakra-link css-ug8vf0\" href=\"https:\/\/github.com\/karalabe\/go-ethereum\/tree\/state-leaf-sync\">October, 2017<!-- --><\/a>&#8230; and then sat on that concept for over three years?! \ud83e\udd2f Before proceeding, a brief history recap.<!-- --><\/p>\n<p><!-- --><\/p>\n<p class=\"chakra-text css-gi02ar\">When Ethereum was launched, participants could select between two distinct methods for synchronizing the network: <!-- --><em class=\"chakra-text css-0\">full sync<!-- --><\/em> and <!-- --><em class=\"chakra-text css-0\">fast sync<!-- --><\/em> (excluding light clients from this conversation). <!-- --><em class=\"chakra-text css-0\">Full sync<!-- --><\/em> functioned by downloading the complete chain and processing all transactions; in contrast, <!-- --><em class=\"chakra-text css-0\">fast sync<!-- --><\/em> placed trust in a recently confirmed block and directly downloaded the state tied to it (after which it transitioned to block execution similar to full sync). Both operational modes led to the same final dataset, yet they favored different trade-offs:<!-- --><\/p>\n<p><!-- --><\/p>\n<ul role=\"list\" class=\"css-1onhfjo\">\n<li class=\"css-cvpopp\"><strong>Full sync<!-- --><\/strong> emphasized minimizing trust, opting to process all transactions from genesis to head. Although it is the most secure alternative, Ethereum mainnet currently comprises over <!-- --><a target=\"_blank\" rel=\"noopener\" class=\"chakra-link css-ug8vf0\" href=\"https:\/\/etherscan.io\/txs\">1.03 billion transactions<!-- --><\/a>, increasing at a rate of <!-- --><a target=\"_blank\" rel=\"noopener\" class=\"chakra-link css-ug8vf0\" href=\"https:\/\/etherscan.io\/chart\/tx\">1.25 million \/ day<!-- --><\/a>. Choosing to process everything from genesis implies that <!-- --><em class=\"chakra-text css-0\">full sync<!-- --><\/em> incurs a continuously growing expense. Presently, processing all those transactions requires 8-10 days on a relatively robust machine.<!-- --><\/li>\n<li class=\"css-cvpopp\"><strong>Fast sync<!-- --><\/strong> chose to depend on the security of the PoWs. Instead of executing every transaction, it operated under the assumption that constructing a block with 64 valid PoWs on top would be excessively costly, thus it&#8217;s acceptable to download the state related to <!-- --><span class=\"chakra-text css-ons8vw\">HEAD-64<\/span>. <!-- --><em class=\"chakra-text css-0\">Fast sync<!-- --><\/em> relied on the state root from a nearby block, facilitating the direct download of the state trie. This substitution transitioned the need from CPU &amp; disk IO to a requirement for network bandwidth and latency. Specifically, Ethereum mainnet presently consists of around 675 million state trie nodes, taking roughly 8-10 hours to download on a well-connected machine.<!-- --><\/li>\n<\/ul>\n<p><!-- --><\/p>\n<p class=\"chakra-text css-gi02ar\"><em class=\"chakra-text css-0\">Full sync<!-- --><\/em> has stayed accessible for anyone who desired to expend the resources to authenticate Ethereum&#8217;s complete history, but for the majority of individuals, <!-- --><em class=\"chakra-text css-0\">fast sync<!-- --><\/em> proved to be more than satisfactory\u2122. There&#8217;s a paradox in computer science that states that once a system exceeds 50 times its intended usage, it will malfunction. The rationale is that regardless of how something functions, apply sufficient pressure and an unexpected bottleneck will emerge.<!-- --><\/p>\n<p><!-- --><\/p>\n<p class=\"chakra-text css-gi02ar\">In the context of <!-- --><em class=\"chakra-text css-0\">fast sync<!-- --><\/em>, the unexpected bottleneck was <!-- --><strong><em class=\"chakra-text css-0\">latency<!-- --><\/em><\/strong>, arising from Ethereum&#8217;s data structure. Ethereum&#8217;s state trie is a Merkle tree, with leaves containing valuable data and each upper node being the hash of 16 children. Syncing from the tree&#8217;s root (the hash embedded within a block header) requires requesting each node <!-- --><strong>one-by-one<!-- --><\/strong>. With 675 million nodes to download, even by combining 384 requests at once, it necessitates 1.75 million round-trips. Assuming an overly generous 50ms RTT to 10 serving peers, <!-- --><em class=\"chakra-text css-0\">fast sync<!-- --><\/em> effectively amounts to waiting for over 150 minutes for data to arrive. However, network latency constitutes merely one-third of the issue.<!-- --><\/p>\n<p><!-- --><\/p>\n<p class=\"chakra-text css-gi02ar\">When a serving peer receives a query for trie nodes, it must <!-- --><strong>retrieve them from disk<!-- --><\/strong>. Ethereum&#8217;s Merkle trie does not alleviate this problem either. Since trie nodes are indexed by hash, there&#8217;s no significant method to store\/retrieve them in batches, with each necessitating its own database read. To exacerbate matters, LevelDB (utilized by Geth) arranges data across 7 levels, meaning a random read will generally involve multiple files. When everything is accounted for, a single network request for 384 nodes\u2014at 7 reads per query\u2014results in 2.7 thousand disk reads. With the fastest SATA SSDs achieving speeds of 100,000 IOPS, this results in an additional 37ms of latency. Assuming the same 10 serving peers as previously mentioned, <!-- --><em class=\"chakra-text css-0\">fast sync<!-- --><\/em> has just added an <!-- --><strong>extra waiting time of 108 minutes<!-- --><\/strong>. But serving latency represents only one-third of the issue.<!-- --><\/p>\n<p><!-- --><\/p>\n<p class=\"chakra-text css-gi02ar\">Requesting that many trie nodes individually necessitates uploading an equal number of hashes to remote peers for servicing. With 675 million nodes to download, that&#8217;s 675 million hashes to upload, or 675 * 32 bytes = 21GB. At a global average upload speed of 51Mbps (X Doubt), <!-- --><em class=\"chakra-text css-0\">fast sync<!-- --><\/em> has consequently added an <!-- --><strong>extra 56 minutes of waiting time<!-- --><\/strong>. Downloads are slightly more than double as large, so with global averages of 97Mbps, *fast sync* incurred a <!-- --><strong>further 63 minutes<!-- --><\/strong>. Bandwidth delays represent the final third of the challenge.<!-- --><\/p>\n<p><!-- --><\/p>\n<p class=\"chakra-text css-gi02ar\">Summing it all up, <!-- --><em class=\"chakra-text css-0\">fast sync<!-- --><\/em> ultimately spends an astonishing 6.3 hours not doing anything, merely <!-- --><strong>waiting for data<!-- --><\/strong>:<!-- --><\/p>\n<p><!-- --><\/p>\n<ul role=\"list\" class=\"css-1onhfjo\">\n<li class=\"css-cvpopp\"><strong><em class=\"chakra-text css-0\">If<!-- --><\/em><\/strong> your network connection exceeds average performance<!-- --><\/li>\n<li class=\"css-cvpopp\"><strong><em class=\"chakra-text css-0\">If<!-- --><\/em><\/strong> you have a good number of serving peers<!-- --><\/li>\n<p>&#8220;`html<\/p>\n<li class=\"css-cvpopp\"><strong><em class=\"chakra-text css-0\">In the event that<!-- --><\/em><\/strong> your associates do not assist anyone else except you<!-- --><\/li>\n<\/ul>\n<p><!-- --><\/p>\n<p class=\"chakra-text css-gi02ar\"><em class=\"chakra-text css-0\"><a target=\"_blank\" rel=\"noopener\" class=\"chakra-link css-ug8vf0\" href=\"https:\/\/github.com\/ethereum\/devp2p\/blob\/master\/caps\/snap.md\">Snap sync<!-- --><\/a><\/em> was developed to address all three of the outlined issues. The fundamental concept is relatively straightforward: rather than downloading the trie node-by-node, <!-- --><em class=\"chakra-text css-0\">snap sync<!-- --><\/em> retrieves contiguous segments of pertinent state data and reconstructs the Merkle trie locally:<!-- --><\/p>\n<p><!-- --><\/p>\n<ul role=\"list\" class=\"css-1onhfjo\">\n<li class=\"css-cvpopp\">By avoiding the download of intermediate Merkle trie nodes, state data can be accessed in large batches, eliminating the delay introduced by network latency.<!-- --><\/li>\n<li class=\"css-cvpopp\">By not downloading Merkle nodes, downstream data is reduced by fifty percent; and by neglecting to address each piece of data individually, upstream data becomes negligible, thereby removing the delay caused by bandwidth.<!-- --><\/li>\n<li class=\"css-cvpopp\">By eliminating random key data requests, peers merely perform a couple of contiguous disk reads to provide the responses, thus reducing the delay of disk IO (<!-- --><strong><em class=\"chakra-text css-0\">if the peers already have the data stored in an adequate flat format<!-- --><\/em><\/strong>).<!-- --><\/li>\n<\/ul>\n<p><!-- --><\/p>\n<p class=\"chakra-text css-gi02ar\">While <!-- --><em class=\"chakra-text css-0\">snap sync<!-- --><\/em> is remarkably akin to Parity&#8217;s <!-- --><a target=\"_blank\" rel=\"noopener\" class=\"chakra-link css-ug8vf0\" href=\"https:\/\/openethereum.github.io\/Warp-Sync.html\"><em class=\"chakra-text css-0\">warp sync<!-- --><\/em><\/a> &#8211; and indeed adopted numerous design concepts from it &#8211; there are notable enhancements over the latter:<!-- --><\/p>\n<p><!-- --><\/p>\n<ul role=\"list\" class=\"css-1onhfjo\">\n<li class=\"css-cvpopp\"><em class=\"chakra-text css-0\">Warp sync<!-- --><\/em> relies on <!-- --><a target=\"_blank\" rel=\"noopener\" class=\"chakra-link css-ug8vf0\" href=\"https:\/\/openethereum.github.io\/Warp-Sync-Snapshot-Format\">static snapshots<!-- --><\/a> produced every 30,000 blocks. This indicates that serving nodes must regenerate the snapshots every five days or so, although iterating the entire state trie can actually require more time than that. Consequently, <!-- --><em class=\"chakra-text css-0\">warp sync<!-- --><\/em> is not sustainable in the long run. In contrast, <!-- --><em class=\"chakra-text css-0\">snap sync<!-- --><\/em> is founded on <!-- --><a class=\"chakra-link css-ug8vf0\" href=\"https:\/\/blog.ethereum.org\/2020\/07\/17\/ask-about-geth-snapshot-acceleration\">dynamic snapshots<!-- --><\/a>, which are generated once, regardless of speed, and are subsequently updated as the chain evolves.<!-- --><\/li>\n<li class=\"css-cvpopp\"><em class=\"chakra-text css-0\">Warp sync<!-- --><\/em>&#8216;s snapshot structure does not conform to the Merkle trie format, resulting in chunks of warp-data <!-- --><strong><em class=\"chakra-text css-0\">being unable<!-- --><\/em><\/strong> to be individually validated. Syncing nodes must download the complete dataset of over 20GB before they can authenticate it. Consequently, <!-- --><em class=\"chakra-text css-0\">warp syncing<!-- --><\/em> nodes could theoretically face issues. Conversely, <!-- --><em class=\"chakra-text css-0\">snap sync<!-- --><\/em>&#8216;s snapshot format consists solely of sequential Merkle leaves, facilitating the validation of any range, hence erroneous data is identified immediately.<!-- --><\/li>\n<\/ul>\n<p><!-- --><\/p>\n<p class=\"chakra-text css-gi02ar\">To quantify <!-- --><em class=\"chakra-text css-0\">snap sync<!-- --><\/em> versus <!-- --><em class=\"chakra-text css-0\">fast sync<!-- --><\/em>, synchronizing the mainnet state (disregarding blocks and receipts, as those remain the same) against three serving peers, at block ~#11,177,000 yielded the following outcomes:<!-- --><\/p>\n<p><!-- --><\/p>\n<p class=\"chakra-text css-gi02ar\">\n<p><!-- --><\/p>\n<p class=\"chakra-text css-gi02ar\">Please note that <!-- --><em class=\"chakra-text css-0\">snap sync<!-- --><\/em> is included, but not yet activated, in Geth v1.10.0. The rationale is that serving <!-- --><em class=\"chakra-text css-0\">snap sync<!-- --><\/em> demands nodes to possess the <!-- --><em class=\"chakra-text css-0\">snapshot<!-- --><\/em> acceleration infrastructure already constructed, which currently does not exist, as it is also included in v1.10.0. You may manually activate snap sync via <!-- --><span class=\"chakra-text css-ons8vw\">&#8211;syncmode snap<\/span>, but be informed that we anticipate it <!-- --><strong>not to locate<!-- --><\/strong> to suitable peers until a few weeks following Berlin. We will enable it by default when we believe there are sufficient peers to depend on it.<!-- --><\/p>\n<p><!-- --><\/p>\n<h3 class=\"chakra-heading css-145upk7\" id=\"offline-pruning\">Offline pruning<!-- --><\/h3>\n<p><!-- --><\/p>\n<p class=\"chakra-text css-gi02ar\">We&#8217;re extremely proud of our accomplishments with Geth over recent years. Nevertheless, there&#8217;s always <!-- --><strong><em class=\"chakra-text css-0\">that one subject<!-- --><\/em><\/strong>, which causes you to flinch when queried about. For Geth, that subject is <!-- --><em class=\"chakra-text css-0\">state pruning<!-- --><\/em>. But what exactly is pruning and why is it necessary?<!-- --><\/p>\n<p><!-- --><\/p>\n<p class=\"chakra-text css-gi02ar\">When processing a new block, a node takes the current state of the network as input and modifies it according to the transactions in the block, creating a new output state. The output state is primarily the same as the input, with only a few thousand items altered. Because we cannot simply overwrite the previous state (otherwise we would not be able to accommodate block reorganizations), both the old and new states ultimately reside on disk. <!-- --><em class=\"chakra-text css-0\">(Sure, we&#8217;re a bit smarter and only write new diffs to disk if they persist and aren&#8217;t deleted in the following blocks, but let&#8217;s set aside that detail for the moment).<!-- --><\/em><\/p>\n<p><!-- --><\/p>\n<p class=\"chakra-text css-gi02ar\">Writing these new pieces of state data, block by block, to the database presents a challenge. They continue to accumulate. In theory, we could &#8220;just delete&#8221; state data that is old enough not to pose a risk of a reorg, but as it turns out, that&#8217;s quite a complex challenge. Given that state in Ethereum is stored in a tree structure &#8211; and that most blocks only modify a minor fraction of the state &#8211; these trees share substantial portions of the data with each other. We can easily determine if the root of an old trie is outdated and can be removed, but it is exceedingly expensive to ascertain whether a node deep within an old state is still referenced by any newer state.<!-- --><\/p>\n<p><!-- --><\/p>\n<p class=\"chakra-text css-gi02ar\">Over the years, we&#8217;ve implemented various pruning algorithms to eliminate leftovers (lost count, around ten), yet we&#8217;ve not found a solution that does not fail if sufficient data is presented. Consequently, people have become accustomed to Geth&#8217;s database starting lean following a <!-- --><em class=\"chakra-text css-0\">fast sync<!-- --><\/em>, and gradually expanding until you become frustrated and resync. This is aggravating to say the least, as re-downloading everything merely wastes bandwidth and contributes unnecessary downtime for the node.<!-- --><\/p>\n<p><!-- --><\/p>\n<p class=\"chakra-text css-gi02ar\">Geth v1.10.0 does not fully remedy the issue, but it represents a significant advancement toward a better user experience. If you have <!-- --><em class=\"chakra-text css-0\">snapshots<!-- --><\/em> activated and fully generated, Geth can utilize these as an acceleration framework to relatively swiftly identify which trie nodes should remain and which should be purged. Pruning trie nodes based on snapshots does carry the disadvantage that the chain may not progress during the pruning process. This necessitates stopping Geth, pruning its database, and subsequently restarting it.<!-- --><\/p>\n<p><!-- --><\/p>\n<p class=\"chakra-text css-gi02ar\">In terms of execution time, pruning requires a few hours (greatly depending on your disk speed and accumulated data), with one third dedicated to indexing recent trie nodes from snapshots, one third for deleting outdated trie nodes, and the final third for compacting the database to reclaim<br \/>\n&#8220;`freed space. By the conclusion of the procedure, your disk utilization should roughly equal what it would be after a complete synchronization. To trim your database, please execute <!-- --><span class=\"chakra-text css-ons8vw\">geth snapshot prune-state<\/span>.<!-- --><\/p>\n<p><!-- --><\/p>\n<p class=\"chakra-text css-gi02ar\"><em class=\"chakra-text css-0\">Please be aware that pruning is a <!-- --><strong>recent and potentially risky feature<!-- --><\/strong>, a malfunction of which may lead to corrupted blocks. We are assured of its dependability, but if an issue occurs, it\u2019s possible there won&#8217;t be a way to recover the database. Our advice &#8211; at least until the feature undergoes rigorous testing &#8211; is to back up your database before pruning and to experiment with testnet nodes initially prior to fully engaging with mainnet.<!-- --><\/em><\/p>\n<p><!-- --><\/p>\n<h3 class=\"chakra-heading css-145upk7\" id=\"transaction-unindexing\">Transaction unindexing<!-- --><\/h3>\n<p><!-- --><\/p>\n<p class=\"chakra-text css-gi02ar\">Ethereum has been operational for a significant duration, and in its nearly 6 years of existence, Ethereum users have conducted over <!-- --><a target=\"_blank\" rel=\"noopener\" class=\"chakra-link css-ug8vf0\" href=\"https:\/\/etherscan.io\/chart\/tx\"><strong><em class=\"chakra-text css-0\">1 billion<!-- --><\/em><\/strong><\/a> transactions. That\u2019s quite a considerable figure.<!-- --><\/p>\n<p><!-- --><\/p>\n<p class=\"chakra-text css-gi02ar\">Node operators have always assumed they could retrieve any arbitrary transaction from the past using just its <!-- --><em class=\"chakra-text css-0\">hash<!-- --><\/em>. To be honest, it seems like an obvious task. However, when crunching the numbers, we find ourselves in an unexpected situation. To make transactions searchable, we must &#8211; at the very least &#8211; map the complete range of transaction hashes to their respective blocks. Despite all adjustments made to minimize storage, we still have to save 1 block number (4 bytes) linked to 1 hash (32 bytes).<!-- --><\/p>\n<p><!-- --><\/p>\n<p class=\"chakra-text css-gi02ar\">36 bytes per transaction may not appear substantial, but when multiplied with <!-- --><em class=\"chakra-text css-0\">1 billion<!-- --><\/em> transactions, it aggregates to a remarkable <!-- --><strong><em class=\"chakra-text css-0\">36GB of storage<!-- --><\/em><\/strong> needed to confirm that transaction <!-- --><span class=\"chakra-text css-ons8vw\">0xdeadbeef<\/span> is located in block <!-- --><span class=\"chakra-text css-ons8vw\">N<\/span>. That&#8217;s a significant amount of data and a vast number of database entries to manage. Retaining 36GB seems a reasonable expense if one intends to search transactions from 6 years ago, but practically, most users do not desire this. For them, the additional disk usage and I\/O overhead are merely squandered resources. Furthermore, it\u2019s crucial to remember that transaction indices are not included in consensus and do not form part of the network protocol. They are purely a locally generated efficiency mechanism.<!-- --><\/p>\n<p><!-- --><\/p>\n<p class=\"chakra-text css-gi02ar\">Is it feasible to eliminate some &#8211; for us &#8211; superfluous information from our nodes? Absolutely! Geth v1.10.0 enables transaction unindexing by default and configures it to <!-- --><span class=\"chakra-text css-ons8vw\">2,350,000<\/span> blocks (approximately 1 year). The transaction unindexer will operate in the background, and with each new block that arrives, it guarantees that only the transactions from the most recent <!-- --><span class=\"chakra-text css-ons8vw\">N<\/span> blocks are indexed, removing older ones. Should a user choose to access older transactions, they can restart Geth with a higher <!-- --><span class=\"chakra-text css-ons8vw\">&#8211;txlookuplimit<\/span> value, and any blocks missing from the updated range will be reindexed (note, the activating event is still block import, so a wait for 1 new block is necessary).<!-- --><\/p>\n<p><!-- --><\/p>\n<p class=\"chakra-text css-gi02ar\">Given that around a third of <!-- --><a target=\"_blank\" rel=\"noopener\" class=\"chakra-link css-ug8vf0\" href=\"https:\/\/etherscan.io\/chart\/tx\">Ethereum&#8217;s transaction volume<!-- --><\/a> occurred in 2020, maintaining an entire year&#8217;s worth of transaction index will still exert a considerable burden on the database. The aim of transaction unindexing is not to discard an existing feature in the name of conserving space. The objective is to transition towards an operational mode where storage does not expand indefinitely with the history of the chain.<!-- --><\/p>\n<p><!-- --><\/p>\n<p class=\"chakra-text css-gi02ar\"><em class=\"chakra-text css-0\">If you wish to <!-- --><strong>turn off<!-- --><\/strong> transaction unindexing entirely, you can execute Geth with <!-- --><span class=\"chakra-text css-ons8vw\">&#8211;txlookuplimit=0<\/span>, which reverts to the previous behavior of keeping the lookup map for every transaction since inception.<!-- --><\/em><\/p>\n<p><!-- --><\/p>\n<h3 class=\"chakra-heading css-145upk7\" id=\"preimage-discarding\">Preimage discarding<!-- --><\/h3>\n<p><!-- --><\/p>\n<p class=\"chakra-text css-gi02ar\">Ethereum organizes all its data within a Merkle Patricia trie. The values at the leaves represent the raw data being stored (e.g., content of storage slots, account details), while the path to the leaf acts as the key by which the data is stored. However, the keys are <!-- --><strong><em class=\"chakra-text css-0\">not<!-- --><\/em><\/strong> the account addresses or storage addresses; rather they are the <!-- --><span class=\"chakra-text css-ons8vw\">Keccak256<\/span> hashes of those. This approach helps balance the branch depths of the state tries. Utilizing hashes for keys is adequate as users of Ethereum reference only the original addresses, which can be hashed as needed.<!-- --><\/p>\n<p><!-- --><\/p>\n<p class=\"chakra-text css-gi02ar\">There is one scenario, however, where someone possesses a hash stored in the state trie and wishes to retrieve its preimage: debugging. While traversing EVM bytecode, a developer might desire to examine all the variables within the smart contract. The data is available, but without the preimages, it becomes challenging to identify which data corresponds to which Solidity variable.<!-- --><\/p>\n<p><!-- --><\/p>\n<p class=\"chakra-text css-gi02ar\">Initially, Geth implemented a partially effective solution. We stored in the database all preimages that resulted from user calls (e.g. sending a transaction), but not those emanating from EVM calls (e.g. accessing a storage slot). This was insufficient for Remix, so we enhanced our tracing API to include saving preimages for all SHA3 (Keccak256) operations. Although this resolved the debugging issue for Remix, it prompted inquiries regarding all the data unused by non-debugging nodes.<!-- --><\/p>\n<p><!-- --><\/p>\n<p class=\"chakra-text css-gi02ar\">The preimages are not particularly heavy. If you perform a full sync from inception &#8211; re-executing all transactions &#8211; you&#8217;ll only incur an additional 5GB load. Nonetheless, there is no justification for retaining that data for users who aren&#8217;t utilizing it, as it merely increases the load on LevelDB compactions. Therefore, Geth v1.10.0 <!-- --><strong>disables<!-- --><\/strong> preimage collection by default, yet there is no method to actively eliminate preimages that have already been stored.<!-- --><\/p>\n<p><!-- --><\/p>\n<p class=\"chakra-text css-gi02ar\"><em class=\"chakra-text css-0\">If you are utilizing your Geth instance to debug transactions, you can <!-- --><strong>revert<!-- --><\/strong> to the original behavior using <!-- --><span class=\"chakra-text css-ons8vw\">&#8211;cache.preimages<\/span>. Please note, <!-- --><strong>it is not possible to regenerate preimages after the fact<!-- --><\/strong>. Should you run Geth with preimage collection turned off and have a change of heart, you will need to reimport the blocks.<!-- --><\/em><\/p>\n<p><!-- --><\/p>\n<h3 class=\"chakra-heading css-145upk7\" id=\"eth66-protocol\">ETH\/66 protocol<!-- --><\/h3>\n<p><!-- --><\/p>\n<p class=\"chakra-text css-gi02ar\">The <!-- --><a target=\"_blank\" rel=\"noopener\" class=\"chakra-link css-ug8vf0\" href=\"https:\/\/eips.ethereum.org\/EIPS\/eip-2481\"><span class=\"chakra-text css-ons8vw\">eth\/66<\/span><\/a> protocol is a relatively minor adjustment, yet carries numerous advantageous implications. In essence, the protocol introduces request and response IDs for all bidirectional packets. The intention behind these IDs is to facilitate a simpler alignment of responses to requests, particularly to effectively transmit a response back to the subsystem that initiated the original request.<!-- --><\/p>\n<p><!-- --><\/p>\n<p class=\"chakra-text css-gi02ar\">These IDsare not crucial, and indeed we\u2019ve been successfully navigating around their absence for the last six years. Regrettably, any code that needs to fetch data from the network becomes excessively complex if multiple subsystems can simultaneously request the same type of data. For instance, block headers can be fetched by the <!-- --><em class=\"chakra-text css-0\">downloader<!-- --><\/em> synchronizing the chain; it can be fetched by the <!-- --><em class=\"chakra-text css-0\">fetcher<!-- --><\/em> handling block announcements; and it can also be requested during fork challenges. Moreover, timeouts can result in delayed or unanticipated deliveries, prompting re-requests. In these scenarios, when a <!-- --><em class=\"chakra-text css-0\">header packet<!-- --><\/em> arrives, every subsystem checks the data to determine if it was intended for itself or for another subsystem. Consuming a response that was not designated for a specific subsystem can lead to failures elsewhere that require careful management. It becomes disorganized. Feasible, but disorganized.<!-- --><\/p>\n<p><!-- --><\/p>\n<p class=\"chakra-text css-gi02ar\">The significance of <!-- --><span class=\"chakra-text css-ons8vw\">eth\/66<\/span> in the context of this blog post lies not in its resolution of a specific issue, but rather in the fact that <!-- --><strong>it will be implemented before the Berlin hard-fork<!-- --><\/strong>. As all nodes are expected to upgrade by the time of the fork, this paves the way for Geth to begin phasing out the outdated protocols following the fork. Only after eliminating all older protocols can we restructure Geth\u2019s internals to utilize request IDs. In line with our <!-- --><a target=\"_blank\" rel=\"noopener\" class=\"chakra-link css-ug8vf0\" href=\"https:\/\/discord.com\/channels\/595666850260713488\/745077610685661265\/778217548893126666\">protocol deprecation schedule<!-- --><\/a>, we intend to discontinue <!-- --><span class=\"chakra-text css-ons8vw\">eth\/64<\/span> soon and <!-- --><span class=\"chakra-text css-ons8vw\">eth65<\/span> by summer&#8217;s end.<!-- --><\/p>\n<p><!-- --><\/p>\n<p class=\"chakra-text css-gi02ar\"><em class=\"chakra-text css-0\">Some individuals might view Geth leveraging its influence to enforce protocol updates on other clients. We wish to stress that the <!-- --><a target=\"_blank\" rel=\"noopener\" class=\"chakra-link css-ug8vf0\" href=\"https:\/\/eips.ethereum.org\/EIPS\/eip-2718\">typed transactions<!-- --><\/a> feature from the Berlin hard-fork originally called for a new protocol version. Since only Geth fully implemented the suite of <!-- --><span class=\"chakra-text css-ons8vw\">eth\/xy<\/span> protocols, other clients sought to &#8220;hack&#8221; it into older protocol versions to avoid focusing on networking at this time. The consensus was that Geth would backport typed transaction support into all its previous protocol code to give other developers time, but in return, would phase out the old versions within 6 months to prevent stagnation.<!-- --><\/em><\/p>\n<p><!-- --><\/p>\n<h3 class=\"chakra-heading css-145upk7\" id=\"chainid-enforcement\">ChainID enforcement<!-- --><\/h3>\n<p><!-- --><\/p>\n<p class=\"chakra-text css-gi02ar\">Back in 2016, when <!-- --><em class=\"chakra-text css-0\">TheDAO hard-fork<!-- --><\/em> was enacted, Ethereum introduced the concept of the <!-- --><a target=\"_blank\" rel=\"noopener\" class=\"chakra-link css-ug8vf0\" href=\"https:\/\/eips.ethereum.org\/EIPS\/eip-155\"><strong><em class=\"chakra-text css-0\">chain id<!-- --><\/em><\/strong><\/a>. The purpose was to adjust the digital signatures on transactions with a distinctive identifier to separate what is valid on Ethereum from what is valid on Ethereum Classic (and what is valid on test networks). Making a transaction valid on one network but not on another guarantees that they cannot be replayed without the owner&#8217;s awareness.<!-- --><\/p>\n<p><!-- --><\/p>\n<p class=\"chakra-text css-gi02ar\">To minimize complications during the transition, both new\/protected and old\/unprotected transactions remained valid. Fast forward five years, and about 15% of transactions on Ethereum still lack replay protection. This does not imply a fundamental vulnerability, unless the same keys are reused across several networks. <!-- --><strong><em class=\"chakra-text css-0\">Top tip: Don\u2019t!<!-- --><\/em><\/strong> Nonetheless, mistakes can occur, and certain Ethereum-based networks have been known to go offline due to replay problems.<!-- --><\/p>\n<p><!-- --><\/p>\n<p class=\"chakra-text css-gi02ar\">Although we do not wish to act as an overseer, we have chosen to encourage individuals and tools to abandon the outdated, unprotected signatures and adopt chain IDs everywhere. The straightforward approach would be to simply invalidate unprotected transactions at the consensus level, but doing so would leave 15% of users seeking emergency fixes. To gradually transition people toward safer alternatives without creating sudden disruptions, Geth v1.10.0 will <!-- --><strong>reject transactions<!-- --><\/strong> on the RPC that are not replay protected. <!-- --><strong>The propagation through the P2P protocols will remain unchanged<!-- --><\/strong> for the time being, but we shall advocate for rejection there too in the long run.<!-- --><\/p>\n<p><!-- --><\/p>\n<p class=\"chakra-text css-gi02ar\">If you are utilizing code generated by <!-- --><span class=\"chakra-text css-ons8vw\">abigen<\/span>, <!-- --><a target=\"_blank\" rel=\"noopener\" class=\"chakra-link css-ug8vf0\" href=\"https:\/\/github.com\/ethereum\/go-ethereum\/pull\/21356\">we&#8217;ve added<!-- --><\/a> in the <!-- --><span class=\"chakra-text css-ons8vw\">go-ethereum<\/span> libraries new signer constructors to facilitate the easy creation of chain-id-bound transactors. The legacy signers that were included by default were created prior to EIP155, and until now, you needed to manually construct the protected signer. As this was prone to errors and some assumed we inferred the chain ID internally, we opted to provide direct APIs ourselves. <!-- --><strong>We will phase out and eliminate the legacy signers over the long term<!-- --><\/strong>.<!-- --><\/p>\n<p><!-- --><\/p>\n<p class=\"chakra-text css-gi02ar\"><em class=\"chakra-text css-0\">Recognizing that individuals\/tools generating unprotected transactions cannot change overnight, Geth v1.10.0 <!-- --><strong>supports reverting<!-- --><\/strong> to the previous behavior and accepting non-EIP155 transactions via <!-- --><span class=\"chakra-text css-ons8vw\">&#8211;rpc.allow-unprotected-txs<\/span>. Please note that this is a temporary solution that <!-- --><strong>will be removed<!-- --><\/strong> in the future.<!-- --><\/em><\/p>\n<p><!-- --><\/p>\n<h3 class=\"chakra-heading css-145upk7\" id=\"database-introspection\">Database introspection<!-- --><\/h3>\n<p><!-- --><\/p>\n<p class=\"chakra-text css-gi02ar\">Occasionally, we receive reports of corrupted databases, with no effective means to debug them. Sending a 300GB data directory to us is impractical, and providing custom dissection tools to users is burdensome. Furthermore, since a corrupted database frequently presents itself as an inability to start Geth, even utilizing debugging RPC APIs proves futile.<!-- --><\/p>\n<p><!-- --><\/p>\n<p class=\"chakra-text css-gi02ar\">Geth v1.10.0 comes with a built-in database introspection tool to help ease this situation somewhat. It serves as a very low-level access point to LevelDB, permitting arbitrary data retrievals, insertions, and deletions. We cannot predict how instrumental these will be, but they at least provide a fighting chance to restore a compromised node without necessitating a resync.<!-- --><\/p>\n<p><!-- --><\/p>\n<p class=\"chakra-text css-gi02ar\">The supported commands entail:<!-- --><\/p>\n<p><!-- --><\/p>\n<ul role=\"list\" class=\"css-1onhfjo\">\n<li class=\"css-cvpopp\"><span class=\"chakra-text css-ons8vw\">geth db inspect<\/span> &#8211; Examine the storage size for each type of data in the database<!-- --><\/li>\n<li class=\"css-cvpopp\"><span class=\"chakra-text css-ons8vw\">geth db stats<\/span> &#8211; Output various database utilization and compaction statistics<!-- --><\/li>\n<li class=\"css-cvpopp\"><span class=\"chakra-text css-ons8vw\">geth db compact<\/span> &#8211; Compact the database, enhancing read access (<!-- --><strong>very slow<!-- --><\/strong>)<!-- --><\/li>\n<li class=\"css-cvpopp\"><span class=\"chakra-text css-ons8vw\">geth db get<\/span> &#8211; Fetch and display the value of a database key<!-- --><\/li>\n<li class=\"css-cvpopp\"><span class=\"chakra-text css-ons8vw\">geth db delete<\/span> &#8211; Eliminate a database key (<!-- --><strong>extremely perilous<!-- --><\/strong>)<!-- --><\/li>\n<li class=\"css-cvpopp\"><span class=\"chakra-text css-ons8vw\">geth db put<\/span> &#8211; Assign the value to a database key (<!-- --><strong>extremely perilous<!-- --><\/strong>)<!-- --><\/li>\n<\/ul>\n<p><!-- --><\/p>\n<h3 class=\"chakra-heading css-145upk7\" id=\"flag-deprecations\">Mark deprecations<!-- --><\/h3>\n<p><!-- --><\/p>\n<p class=\"chakra-text css-gi02ar\">Within the v1.9.x release lineage, we have designated several CLI flags as deprecated. Some were renamed for improved adherence to our naming standards, while others were eliminated due to discontinued functionalities (particularly Whisper). In the preceding release lineage, we maintained the functionality of the legacy deprecated flags, only displaying a warning when they were utilized instead of the preferred versions.<!-- --><\/p>\n<p><!-- --><\/p>\n<p class=\"chakra-text css-gi02ar\">Geth v1.10.0 utilizes this opportunity to entirely remove support for the previous CLI flags. Below is a compilation to aid you in rectifying your commands if you happen not to have upgraded to the new versions over the last year:<!-- --><\/p>\n<p><!-- --><\/p>\n<ul role=\"list\" class=\"css-1onhfjo\">\n<li class=\"css-cvpopp\"><span class=\"chakra-text css-ons8vw\">&#8211;rpc<\/span> -&gt; <!-- --><span class=\"chakra-text css-ons8vw\">&#8211;http<\/span> &#8211; Activate the HTTP-RPC server<!-- --><\/li>\n<li class=\"css-cvpopp\"><span class=\"chakra-text css-ons8vw\">&#8211;rpcaddr<\/span> -&gt; <!-- --><span class=\"chakra-text css-ons8vw\">&#8211;http.addr<\/span> &#8211; HTTP-RPC server listening interface<!-- --><\/li>\n<li class=\"css-cvpopp\"><span class=\"chakra-text css-ons8vw\">&#8211;rpcport<\/span> -&gt; <!-- --><span class=\"chakra-text css-ons8vw\">&#8211;http.port<\/span> &#8211; HTTP-RPC server listening port<!-- --><\/li>\n<li class=\"css-cvpopp\"><span class=\"chakra-text css-ons8vw\">&#8211;rpccorsdomain<\/span> -&gt; <!-- --><span class=\"chakra-text css-ons8vw\">&#8211;http.corsdomain<\/span> &#8211; Domain from which to permit requests<!-- --><\/li>\n<li class=\"css-cvpopp\"><span class=\"chakra-text css-ons8vw\">&#8211;rpcvhosts<\/span> -&gt; <!-- --><span class=\"chakra-text css-ons8vw\">&#8211;http.vhosts<\/span> &#8211; Virtual hostnames from which to permit requests<!-- --><\/li>\n<li class=\"css-cvpopp\"><span class=\"chakra-text css-ons8vw\">&#8211;rpcapi<\/span> -&gt; <!-- --><span class=\"chakra-text css-ons8vw\">&#8211;http.api<\/span> &#8211; APIs provided over the HTTP-RPC interface<!-- --><\/li>\n<li class=\"css-cvpopp\"><span class=\"chakra-text css-ons8vw\">&#8211;wsaddr<\/span> -&gt; <!-- --><span class=\"chakra-text css-ons8vw\">&#8211;ws.addr<\/span> &#8211; WS-RPC server listening interface<!-- --><\/li>\n<li class=\"css-cvpopp\"><span class=\"chakra-text css-ons8vw\">&#8211;wsport<\/span> -&gt; <!-- --><span class=\"chakra-text css-ons8vw\">&#8211;ws.port<\/span> &#8211; WS-RPC server listening port<!-- --><\/li>\n<li class=\"css-cvpopp\"><span class=\"chakra-text css-ons8vw\">&#8211;wsorigins<\/span> -&gt; <!-- --><span class=\"chakra-text css-ons8vw\">&#8211;ws.origins<\/span> &#8211; Origins from which to authorize websockets requests<!-- --><\/li>\n<li class=\"css-cvpopp\"><span class=\"chakra-text css-ons8vw\">&#8211;wsapi<\/span> -&gt; <!-- --><span class=\"chakra-text css-ons8vw\">&#8211;ws.api<\/span> &#8211; APIs provided over the WS-RPC interface<!-- --><\/li>\n<li class=\"css-cvpopp\"><span class=\"chakra-text css-ons8vw\">&#8211;gpoblocks<\/span> -&gt; <!-- --><span class=\"chakra-text css-ons8vw\">&#8211;gpo.blocks<\/span> &#8211; Number of blocks to inspect for gas prices<!-- --><\/li>\n<li class=\"css-cvpopp\"><span class=\"chakra-text css-ons8vw\">&#8211;gpopercentile<\/span> -&gt; <!-- --><span class=\"chakra-text css-ons8vw\">&#8211;gpo.percentile<\/span> &#8211; Percentile of recent transactions to utilize as gas recommendation<!-- --><\/li>\n<li class=\"css-cvpopp\"><span class=\"chakra-text css-ons8vw\">&#8211;graphql.addr<\/span> -&gt; <!-- --><span class=\"chakra-text css-ons8vw\">&#8211;graphql<\/span> &#8211; Activate GraphQL on the HTTP-RPC server<!-- --><\/li>\n<li class=\"css-cvpopp\"><span class=\"chakra-text css-ons8vw\">&#8211;graphql.port<\/span> -&gt; <!-- --><span class=\"chakra-text css-ons8vw\">&#8211;graphql<\/span> &#8211; Activate GraphQL on the HTTP-RPC server<!-- --><\/li>\n<li class=\"css-cvpopp\"><span class=\"chakra-text css-ons8vw\">&#8211;pprofport<\/span> -&gt; <!-- --><span class=\"chakra-text css-ons8vw\">&#8211;pprof.port<\/span> &#8211; Profiler HTTP server listening port<!-- --><\/li>\n<li class=\"css-cvpopp\"><span class=\"chakra-text css-ons8vw\">&#8211;pprofaddr<\/span> -&gt; <!-- --><span class=\"chakra-text css-ons8vw\">&#8211;pprof.addr<\/span> &#8211; Profiler HTTP server listening interface<!-- --><\/li>\n<li class=\"css-cvpopp\"><span class=\"chakra-text css-ons8vw\">&#8211;memprofilerate<\/span> -&gt; <!-- --><span class=\"chakra-text css-ons8vw\">&#8211;pprof.memprofilerate<\/span> &#8211; Enable memory profiling at the specified rate<!-- --><\/li>\n<li class=\"css-cvpopp\"><span class=\"chakra-text css-ons8vw\">&#8211;blockprofilerate<\/span> -&gt; <!-- --><span class=\"chakra-text css-ons8vw\">&#8211;pprof.blockprofilerate<\/span> &#8211; Activate block profiling at the specified rate<!-- --><\/li>\n<li class=\"css-cvpopp\"><span class=\"chakra-text css-ons8vw\">&#8211;cpuprofile<\/span> -&gt; <!-- --><span class=\"chakra-text css-ons8vw\">&#8211;pprof.cpuprofile<\/span> &#8211; Record CPU profile to the specified file<!-- --><\/li>\n<\/ul>\n<p><!-- --><\/p>\n<p class=\"chakra-text css-gi02ar\">A few of the aforementioned legacy flags may continue to function for several releases, but it is inadvisable to depend on their availability.<!-- --><\/p>\n<p><!-- --><\/p>\n<p class=\"chakra-text css-gi02ar\">As the majority of users operating full nodes do not utilize USB wallets through Geth &#8211; and considering the peculiarities associated with USB management across different platforms &#8211; many node administrators resorted to explicitly disabling USB via <!-- --><span class=\"chakra-text css-ons8vw\">&#8211;nosub<\/span>. To align the defaults with the needs of the majority, Geth v1.10.0 has disabled USB wallet support by default and deprecated the <!-- --><span class=\"chakra-text css-ons8vw\">&#8211;nousb<\/span> flag. <!-- --><strong>USB wallets can still be used, but explicit request is now required via <!-- --><span class=\"chakra-text css-ons8vw\">&#8211;usb<\/span><\/strong>.<!-- --><\/p>\n<p><!-- --><\/p>\n<h3 class=\"chakra-heading css-145upk7\" id=\"unclean-shutdown-tracking\">Monitoring unclean shutdowns<!-- --><\/h3>\n<p><!-- --><\/p>\n<p class=\"chakra-text css-gi02ar\">We often receive bug reports indicating that Geth began importing legacy blocks upon startup. This issue typically arises when the node operator halts Geth unexpectedly (power failure, OOM killer, overly brief shutdown timeout). Due to Geth maintaining a great deal of uncommitted state in memory &#8211; to prevent writing to disk data that may become outdated shortly after &#8211; a sudden shutdown can result in these not being flushed. With recent state absent upon startup, Geth is compelled to revert its local chain to the last saved progress point.<!-- --><\/p>\n<p><!-- --><\/p>\n<p class=\"chakra-text css-gi02ar\">In order to eliminate disputes regarding whether an operator shut down their node properly or not, and to prevent a clean cycle following a crash from obscuring the fact that data was lost, Geth v1.10.0 will commence <!-- --><a target=\"_blank\" rel=\"noopener\" class=\"chakra-link css-ug8vf0\" href=\"https:\/\/github.com\/ethereum\/go-ethereum\/pull\/21893\">monitoring and reporting<!-- --><\/a> node crashes. We are optimistic that this will enable operators to identify misconfigurations or issues within their infrastructure before they escalate into irreversible data loss.<!-- --><\/p>\n<p><!-- --><\/p>\n<div class=\"chakra-stack css-1uyok63\">\n<pre><pre style=\"color:white;font-family:Consolas, Monaco, &quot;Andale Mono&quot;, &quot;Ubuntu Mono&quot;, monospace;text-align:left;white-space:pre;word-spacing:normal;word-break:normal;word-wrap:normal;line-height:1.5;font-size:1em;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-hyphens:none;-moz-hyphens:none;-ms-hyphens:none;hyphens:none;padding:1em;margin:0.5em 0;overflow:auto;background:#011627\"><code class=\"language-bash\" style=\"color:#d6deeb;font-family:Consolas, Monaco, &quot;Andale Mono&quot;, &quot;Ubuntu Mono&quot;, monospace;text-align:left;white-space:pre;word-spacing:normal;word-break:normal;word-wrap:normal;line-height:1.5;font-size:1em;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-hyphens:none;-moz-hyphens:none;-ms-hyphens:none;hyphens:none\"><span>WARN <!-- --><\/span><span class=\"token\" style=\"color:rgb(199, 146, 234)\">[<!-- --><\/span><span>03-03<!-- --><\/span><span class=\"token\" style=\"color:rgb(127, 219, 202)\">|<!-- --><\/span><span>06:36:38.734<!-- --><\/span><span class=\"token\" style=\"color:rgb(199, 146, 234)\">]<!-- --><\/span><span> Unclean <!-- --><\/span><span class=\"token\" style=\"color:rgb(130, 170, 255)\">shutdown<!-- --><\/span><span> identified        <!-- --><\/span><span class=\"token assign-left\" style=\"color:rgb(214, 222, 235)\">booted<!-- --><\/span><span class=\"token\" style=\"color:rgb(127, 219, 202)\">=<!-- --><\/span><span class=\"token\" style=\"color:rgb(247, 140, 108)\">2021<!-- --><\/span><span>-02-03T06:47:28+0000 <!-- --><\/span><span class=\"token assign-left\" style=\"color:rgb(214, 222, 235)\">age<!-- --><\/span><span class=\"token\" style=\"color:rgb(127, 219, 202)\">=<!-- --><\/span><span>3w6d23h\n<!-- --><\/span><\/code><\/pre>\n<\/div>\n<p><!-- --><\/p>\n<h2 class=\"chakra-heading css-1w54o5f\" id=\"compatibility\">Compatibility<!-- --><\/h2>\n<p><!-- --><\/p>\n<p class=\"chakra-text css-gi02ar\">Executing a significant release so near to a hard fork is <!-- --><strong><em class=\"chakra-text css-0\">not ideal<!-- --><\/em><\/strong>, to put it mildly. Regrettably, delivering all the substantial features for the forthcoming generation Geth required 2 months longer than we initially expected. In an attempt to lessen potential production issues arising from the upgrade, <!-- --><strong>almost every new feature<!-- --><\/strong> can be disabled via CLI flags. There are still 6 weeks remaining until the anticipated mainnet block to guarantee a seamless experience. Despite this, <!-- --><strong><em class=\"chakra-text css-0\">we apologize for any troubles beforehand<!-- --><\/em><\/strong>.<!-- --><\/p>\n<p><!-- --><\/p>\n<p class=\"chakra-text css-gi02ar\">To revert as much functionality as feasible to the v1.9.x feature-set, kindly execute Geth with:<!-- --><\/p>\n<p><!-- --><\/p>\n<ul role=\"list\" class=\"css-1onhfjo\">\n<li class=\"css-cvpopp\"><span class=\"chakra-text css-ons8vw\">&#8211;snapshot=false<\/span> to deactivate the snapshot acceleration structure and snap sync<!-- --><\/li>\n<li class=\"css-cvpopp\"><span class=\"chakra-text css-ons8vw\">&#8211;txlookuplimit=0<\/span> to maintain indexing of all transactions, not merely the past year<!-- --><\/li>\n<li class=\"css-cvpopp\"><span class=\"chakra-text css-ons8vw\">&#8211;cache.preimages<\/span> to continue generating and preserving account preimages<!-- --><\/li>\n<li class=\"css-cvpopp\"><span class=\"chakra-text css-ons8vw\">&#8211;rpc.allow-unprotected-txs<\/span> &#8211; to permit non-replay-protected signatures<!-- --><\/li>\n<li class=\"css-cvpopp\"><span class=\"chakra-text css-ons8vw\">&#8211;usb<\/span> &#8211; to restore USB wallet support<!-- --><\/li>\n<\/ul>\n<p><!-- --><\/p>\n<p class=\"chakra-text css-gi02ar\"><em class=\"chakra-text css-0\">Please note, the <!-- --><span class=\"chakra-text css-ons8vw\">eth_protocolVersion<\/span> API call is removed as it was illogical. If you possess a <!-- --><strong>valid justification<!-- --><\/strong> for its necessity, do not hesitate to reach out for discussion.<!-- --><\/em><\/p>\n<p><!-- --><\/p>\n<h2 class=\"chakra-heading css-1w54o5f\" id=\"epilogue\">Epilogue<!-- --><\/h2>\n<p><!-- --><\/p>\n<p class=\"chakra-text css-gi02ar\">Like previous major releases, we take great pride in this one too. Although we delayed it significantly, it was done in the interest of stability to ensure that all critical features were thoroughly tested. We are hopeful that this new release family will pave the way for increased transaction throughput along with reduced fees.<!-- --><\/p>\n<p><!-- --><\/p>\n<p class=\"chakra-text css-gi02ar\">As with all our previous releases, you can locate the:<!-- --><\/p>\n<p><!-- --><\/div>\n<p><br \/>\n<br \/><a href=\"https:\/\/blog.ethereum.org\/en\/2021\/03\/03\/geth-v1-10-0\">Source link <\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Oh my, it\u2019s been quite some time&#8230; over 1.5 years since we introduced Geth v1.9.0. We did manage 26 incremental releases during this span (approximately one every three weeks), but releasing a significant update holds a particular significance. The rush of excitement from unveiling new features, combined with the anxiety of potential mishaps. Still uncertain<\/p>\n","protected":false},"author":3,"featured_media":5124,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[23],"tags":[753],"class_list":["post-7045","post","type-post","status-publish","format-standard","has-post-thumbnail","category-ethereum","tag-return-a-list-of-comma-separated-tags-from-this-title-geth-v1-10-0-ethereum-foundation-blog"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v26.3 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Introducing Geth v1.10.0: Enhanced Performance and Exciting Features - WSJ-Crypto<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/wsj-crypto.com\/index.php\/2025\/01\/07\/introducing-geth-v1-10-0-enhanced-performance-and-exciting-features\/\" \/>\n<meta property=\"og:locale\" content=\"it_IT\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Introducing Geth v1.10.0: Enhanced Performance and Exciting Features - WSJ-Crypto\" \/>\n<meta property=\"og:description\" content=\"Oh my, it\u2019s been quite some time&#8230; over 1.5 years since we introduced Geth v1.9.0. We did manage 26 incremental releases during this span (approximately one every three weeks), but releasing a significant update holds a particular significance. The rush of excitement from unveiling new features, combined with the anxiety of potential mishaps. Still uncertain\" \/>\n<meta property=\"og:url\" content=\"https:\/\/wsj-crypto.com\/index.php\/2025\/01\/07\/introducing-geth-v1-10-0-enhanced-performance-and-exciting-features\/\" \/>\n<meta property=\"og:site_name\" content=\"WSJ-Crypto\" \/>\n<meta property=\"article:published_time\" content=\"2025-01-07T07:11:57+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/wsj-crypto.com\/wp-content\/uploads\/2024\/11\/eth-org.jpeg\" \/>\n\t<meta property=\"og:image:width\" content=\"2100\" \/>\n\t<meta property=\"og:image:height\" content=\"900\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"author\" content=\"wsjcrypto\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Scritto da\" \/>\n\t<meta name=\"twitter:data1\" content=\"wsjcrypto\" \/>\n\t<meta name=\"twitter:label2\" content=\"Tempo di lettura stimato\" \/>\n\t<meta name=\"twitter:data2\" content=\"26 minuti\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\/\/wsj-crypto.com\/index.php\/2025\/01\/07\/introducing-geth-v1-10-0-enhanced-performance-and-exciting-features\/\",\"url\":\"https:\/\/wsj-crypto.com\/index.php\/2025\/01\/07\/introducing-geth-v1-10-0-enhanced-performance-and-exciting-features\/\",\"name\":\"Introducing Geth v1.10.0: Enhanced Performance and Exciting Features - WSJ-Crypto\",\"isPartOf\":{\"@id\":\"https:\/\/wsj-crypto.com\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/wsj-crypto.com\/index.php\/2025\/01\/07\/introducing-geth-v1-10-0-enhanced-performance-and-exciting-features\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/wsj-crypto.com\/index.php\/2025\/01\/07\/introducing-geth-v1-10-0-enhanced-performance-and-exciting-features\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/wsj-crypto.com\/wp-content\/uploads\/2024\/11\/eth-org.jpeg\",\"datePublished\":\"2025-01-07T07:11:57+00:00\",\"author\":{\"@id\":\"https:\/\/wsj-crypto.com\/#\/schema\/person\/88a93723b30416db1a352d5a0096c4a7\"},\"breadcrumb\":{\"@id\":\"https:\/\/wsj-crypto.com\/index.php\/2025\/01\/07\/introducing-geth-v1-10-0-enhanced-performance-and-exciting-features\/#breadcrumb\"},\"inLanguage\":\"it-IT\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/wsj-crypto.com\/index.php\/2025\/01\/07\/introducing-geth-v1-10-0-enhanced-performance-and-exciting-features\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"it-IT\",\"@id\":\"https:\/\/wsj-crypto.com\/index.php\/2025\/01\/07\/introducing-geth-v1-10-0-enhanced-performance-and-exciting-features\/#primaryimage\",\"url\":\"https:\/\/wsj-crypto.com\/wp-content\/uploads\/2024\/11\/eth-org.jpeg\",\"contentUrl\":\"https:\/\/wsj-crypto.com\/wp-content\/uploads\/2024\/11\/eth-org.jpeg\",\"width\":2100,\"height\":900},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/wsj-crypto.com\/index.php\/2025\/01\/07\/introducing-geth-v1-10-0-enhanced-performance-and-exciting-features\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/wsj-crypto.com\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Introducing Geth v1.10.0: Enhanced Performance and Exciting Features\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/wsj-crypto.com\/#website\",\"url\":\"https:\/\/wsj-crypto.com\/\",\"name\":\"WSJ-Crypto\",\"description\":\"Just Another Crypto News Website\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/wsj-crypto.com\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"it-IT\"},{\"@type\":\"Person\",\"@id\":\"https:\/\/wsj-crypto.com\/#\/schema\/person\/88a93723b30416db1a352d5a0096c4a7\",\"name\":\"wsjcrypto\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"it-IT\",\"@id\":\"https:\/\/wsj-crypto.com\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/86fe8af82ea089646d6639ca2f87e0243d8688d957bd8e3ec22ec3c457cc16d4?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/86fe8af82ea089646d6639ca2f87e0243d8688d957bd8e3ec22ec3c457cc16d4?s=96&d=mm&r=g\",\"caption\":\"wsjcrypto\"},\"url\":\"https:\/\/wsj-crypto.com\/index.php\/author\/wsjcrypto\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Introducing Geth v1.10.0: Enhanced Performance and Exciting Features - WSJ-Crypto","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/wsj-crypto.com\/index.php\/2025\/01\/07\/introducing-geth-v1-10-0-enhanced-performance-and-exciting-features\/","og_locale":"it_IT","og_type":"article","og_title":"Introducing Geth v1.10.0: Enhanced Performance and Exciting Features - WSJ-Crypto","og_description":"Oh my, it\u2019s been quite some time&#8230; over 1.5 years since we introduced Geth v1.9.0. We did manage 26 incremental releases during this span (approximately one every three weeks), but releasing a significant update holds a particular significance. The rush of excitement from unveiling new features, combined with the anxiety of potential mishaps. Still uncertain","og_url":"https:\/\/wsj-crypto.com\/index.php\/2025\/01\/07\/introducing-geth-v1-10-0-enhanced-performance-and-exciting-features\/","og_site_name":"WSJ-Crypto","article_published_time":"2025-01-07T07:11:57+00:00","og_image":[{"width":2100,"height":900,"url":"https:\/\/wsj-crypto.com\/wp-content\/uploads\/2024\/11\/eth-org.jpeg","type":"image\/jpeg"}],"author":"wsjcrypto","twitter_card":"summary_large_image","twitter_misc":{"Scritto da":"wsjcrypto","Tempo di lettura stimato":"26 minuti"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/wsj-crypto.com\/index.php\/2025\/01\/07\/introducing-geth-v1-10-0-enhanced-performance-and-exciting-features\/","url":"https:\/\/wsj-crypto.com\/index.php\/2025\/01\/07\/introducing-geth-v1-10-0-enhanced-performance-and-exciting-features\/","name":"Introducing Geth v1.10.0: Enhanced Performance and Exciting Features - WSJ-Crypto","isPartOf":{"@id":"https:\/\/wsj-crypto.com\/#website"},"primaryImageOfPage":{"@id":"https:\/\/wsj-crypto.com\/index.php\/2025\/01\/07\/introducing-geth-v1-10-0-enhanced-performance-and-exciting-features\/#primaryimage"},"image":{"@id":"https:\/\/wsj-crypto.com\/index.php\/2025\/01\/07\/introducing-geth-v1-10-0-enhanced-performance-and-exciting-features\/#primaryimage"},"thumbnailUrl":"https:\/\/wsj-crypto.com\/wp-content\/uploads\/2024\/11\/eth-org.jpeg","datePublished":"2025-01-07T07:11:57+00:00","author":{"@id":"https:\/\/wsj-crypto.com\/#\/schema\/person\/88a93723b30416db1a352d5a0096c4a7"},"breadcrumb":{"@id":"https:\/\/wsj-crypto.com\/index.php\/2025\/01\/07\/introducing-geth-v1-10-0-enhanced-performance-and-exciting-features\/#breadcrumb"},"inLanguage":"it-IT","potentialAction":[{"@type":"ReadAction","target":["https:\/\/wsj-crypto.com\/index.php\/2025\/01\/07\/introducing-geth-v1-10-0-enhanced-performance-and-exciting-features\/"]}]},{"@type":"ImageObject","inLanguage":"it-IT","@id":"https:\/\/wsj-crypto.com\/index.php\/2025\/01\/07\/introducing-geth-v1-10-0-enhanced-performance-and-exciting-features\/#primaryimage","url":"https:\/\/wsj-crypto.com\/wp-content\/uploads\/2024\/11\/eth-org.jpeg","contentUrl":"https:\/\/wsj-crypto.com\/wp-content\/uploads\/2024\/11\/eth-org.jpeg","width":2100,"height":900},{"@type":"BreadcrumbList","@id":"https:\/\/wsj-crypto.com\/index.php\/2025\/01\/07\/introducing-geth-v1-10-0-enhanced-performance-and-exciting-features\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/wsj-crypto.com\/"},{"@type":"ListItem","position":2,"name":"Introducing Geth v1.10.0: Enhanced Performance and Exciting Features"}]},{"@type":"WebSite","@id":"https:\/\/wsj-crypto.com\/#website","url":"https:\/\/wsj-crypto.com\/","name":"WSJ-Crypto","description":"Just Another Crypto News Website","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/wsj-crypto.com\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"it-IT"},{"@type":"Person","@id":"https:\/\/wsj-crypto.com\/#\/schema\/person\/88a93723b30416db1a352d5a0096c4a7","name":"wsjcrypto","image":{"@type":"ImageObject","inLanguage":"it-IT","@id":"https:\/\/wsj-crypto.com\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/86fe8af82ea089646d6639ca2f87e0243d8688d957bd8e3ec22ec3c457cc16d4?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/86fe8af82ea089646d6639ca2f87e0243d8688d957bd8e3ec22ec3c457cc16d4?s=96&d=mm&r=g","caption":"wsjcrypto"},"url":"https:\/\/wsj-crypto.com\/index.php\/author\/wsjcrypto\/"}]}},"amp_enabled":true,"_links":{"self":[{"href":"https:\/\/wsj-crypto.com\/index.php\/wp-json\/wp\/v2\/posts\/7045","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wsj-crypto.com\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/wsj-crypto.com\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/wsj-crypto.com\/index.php\/wp-json\/wp\/v2\/users\/3"}],"replies":[{"embeddable":true,"href":"https:\/\/wsj-crypto.com\/index.php\/wp-json\/wp\/v2\/comments?post=7045"}],"version-history":[{"count":3,"href":"https:\/\/wsj-crypto.com\/index.php\/wp-json\/wp\/v2\/posts\/7045\/revisions"}],"predecessor-version":[{"id":7048,"href":"https:\/\/wsj-crypto.com\/index.php\/wp-json\/wp\/v2\/posts\/7045\/revisions\/7048"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wsj-crypto.com\/index.php\/wp-json\/wp\/v2\/media\/5124"}],"wp:attachment":[{"href":"https:\/\/wsj-crypto.com\/index.php\/wp-json\/wp\/v2\/media?parent=7045"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wsj-crypto.com\/index.php\/wp-json\/wp\/v2\/categories?post=7045"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wsj-crypto.com\/index.php\/wp-json\/wp\/v2\/tags?post=7045"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}