{"id":7417,"date":"2025-01-16T20:54:33","date_gmt":"2025-01-16T19:54:33","guid":{"rendered":"https:\/\/wsj-crypto.com\/?p=7417"},"modified":"2025-01-16T20:54:33","modified_gmt":"2025-01-16T19:54:33","slug":"unveiling-geth-the-power-of-snapshot-acceleration","status":"publish","type":"post","link":"https:\/\/wsj-crypto.com\/index.php\/2025\/01\/16\/unveiling-geth-the-power-of-snapshot-acceleration\/","title":{"rendered":"Unveiling Geth: The Power of Snapshot Acceleration"},"content":{"rendered":"<p><\/p>\n<div id=\"\">\n<p class=\"chakra-text css-gi02ar\">*This is installment #1 of a <!-- --><a target=\"_blank\" rel=\"noopener\" class=\"chakra-link css-ug8vf0\" href=\"https:\/\/twitter.com\/peter_szilagyi\/status\/1283060443808968705\">collection<!-- --><\/a> where anyone can pose inquiries about Geth and I&#8217;ll strive to respond to the most popular one each week with a brief writeup. This week&#8217;s top voted question was: <!-- --><strong>Would you mind explaining how the flat database structure differs from the legacy structure?*<!-- --><\/strong><\/p>\n<p><!-- --><\/p>\n<h2 class=\"chakra-heading css-1w54o5f\" id=\"state-in-ethereum\">State in Ethereum<!-- --><\/h2>\n<p><!-- --><\/p>\n<p class=\"chakra-text css-gi02ar\">Before delving into an optimization structure, let\u2019s review what Ethereum refers to as <!-- --><em class=\"chakra-text css-0\">state<!-- --><\/em> and how it is currently maintained at its various layers of abstraction.<!-- --><\/p>\n<p><!-- --><\/p>\n<p class=\"chakra-text css-gi02ar\">Ethereum holds two distinct types of state: the collection of accounts; and a series of storage slots for each contract account. From a <!-- --><strong><em class=\"chakra-text css-0\">purely conceptual viewpoint<!-- --><\/em><\/strong>, both are straightforward key\/value mappings. The collection of accounts maps addresses to their nonce, balance, etc. A storage section of a single contract maps arbitrary keys &#8211; defined and utilized by the contract &#8211; to arbitrary values.<!-- --><\/p>\n<p><!-- --><\/p>\n<p class=\"chakra-text css-gi02ar\">Regrettably, while storing these key-value pairs as flat data would be quite efficient, validating their accuracy becomes computationally unmanageable. Each time a change is made, we&#8217;d need to hash all that data from the beginning.<!-- --><\/p>\n<p><!-- --><\/p>\n<p class=\"chakra-text css-gi02ar\">Rather than hashing the entire dataset repeatedly, we could partition it into small contiguous segments and construct a tree on top! The original relevant data would reside in the leaves, and each internal node would represent a hash of all data beneath it. This would permit us to only recalculate a logarithmic number of hashes when modifications occur. This data structure actually has a designation, it is the renowned <!-- --><a target=\"_blank\" rel=\"noopener\" class=\"chakra-link css-ug8vf0\" href=\"https:\/\/en.wikipedia.org\/wiki\/Merkle_tree\">Merkle tree<!-- --><\/a>.<!-- --><\/p>\n<p><!-- --><\/p>\n<p class=\"chakra-text css-gi02ar\">Unfortunately, we still experience a limitation in computational complexity. The aforementioned Merkle tree configuration is very effective for managing changes to existing data, but insertions and deletions shift the segment boundaries and invalidate <!-- --><strong>all<!-- --><\/strong> calculated hashes.<!-- --><\/p>\n<p><!-- --><\/p>\n<p class=\"chakra-text css-gi02ar\">Instead of indiscriminately chunking the dataset, we could utilize the keys themselves to arrange the data into a tree structure based on shared prefixes! This method ensures that an insertion or deletion wouldn&#8217;t shift all nodes, but would only alter the logarithmic path from root to leaf. This data structure is referred to as a <!-- --><a target=\"_blank\" rel=\"noopener\" class=\"chakra-link css-ug8vf0\" href=\"https:\/\/en.wikipedia.org\/wiki\/Trie\">Patricia tree<!-- --><\/a>.<!-- --><\/p>\n<p><!-- --><\/p>\n<p class=\"chakra-text css-gi02ar\">By merging the two concepts &#8211; the tree structure of a Patricia tree and the hashing mechanism of a Merkle tree &#8211; you arrive at a <!-- --><a target=\"_blank\" rel=\"noopener\" class=\"chakra-link css-ug8vf0\" href=\"https:\/\/eth.wiki\/en\/fundamentals\/patricia-tree\">Merkle Patricia tree<!-- --><\/a>, the actual data structure utilized to represent state in Ethereum. It guarantees logarithmic complexity for modifications, insertions, deletions, and verifications! <!-- --><em class=\"chakra-text css-0\">An additional minor detail is that keys are hashed prior to insertion to balance the tries.<!-- --><\/em><\/p>\n<p><!-- --><\/p>\n<h2 class=\"chakra-heading css-1w54o5f\" id=\"state-storage-in-ethereum\">State storage in Ethereum<!-- --><\/h2>\n<p><!-- --><\/p>\n<p class=\"chakra-text css-gi02ar\">The preceding explanation clarifies <!-- --><em class=\"chakra-text css-0\">why<!-- --><\/em> Ethereum utilizes a Merkle Patricia tree for its state. However, as rapid as the desired operations are, every option entails a trade-off. The cost of <!-- --><em class=\"chakra-text css-0\">logarithmic updates and logarithmic verification<!-- --><\/em> corresponds to <!-- --><em class=\"chakra-text css-0\">logarithmic reads and logarithmic storage<!-- --><\/em> for <!-- --><strong><em class=\"chakra-text css-0\">every single key<!-- --><\/em><\/strong>. This arises because every internal trie node must be individually stored on disk.<!-- --><\/p>\n<p><!-- --><\/p>\n<p class=\"chakra-text css-gi02ar\">I don\u2019t possess an exact figure for the depth of the account trie at this moment, but approximately a year ago, we were reaching the depth of 7. This suggests that every trie operation (e.g., reading balance, writing nonce) interacts with at least 7-8 internal nodes, thereby necessitating at least 7-8 persistent database access attempts. LevelDB also organizes its data across a maximum of 7 levels, resulting in an additional multiplier from that. The overall consequence is that a <!-- --><strong><em class=\"chakra-text css-0\">single<!-- --><\/em><\/strong> state access is predicted to escalate into <!-- --><strong><em class=\"chakra-text css-0\">25-50 random<!-- --><\/em><\/strong> disk accesses. Multiply this by all the state read and write operations that every transaction in a block entails and you arrive at a <!-- --><strong><em class=\"chakra-text css-0\">daunting<!-- --><\/em><\/strong> figure.<!-- --><\/p>\n<p><!-- --><\/p>\n<p class=\"chakra-text css-gi02ar\"><em class=\"chakra-text css-0\">[Of course, all client implementations strive to minimize this burden. Geth employs large memory spaces for caching trie nodes; and also uses in-memory pruning to avoid writing to disk nodes that are deleted anyway after several blocks. That topic belongs to a different blog post, however.]<!-- --><\/em><\/p>\n<p><!-- --><\/p>\n<p class=\"chakra-text css-gi02ar\">Despite how alarming these figures may be, these are the costs associated with operating an Ethereum node and maintaining the ability to cryptographically validate all state at all times. But can we improve?<!-- --><\/p>\n<p><!-- --><\/p>\n<h2 class=\"chakra-heading css-1w54o5f\" id=\"not-all-accesses-are-created-equal\">Not all accesses are created equal<!-- --><\/h2>\n<p><!-- --><\/p>\n<p class=\"chakra-text css-gi02ar\">Ethereum relies on cryptographic proofs to establish its state. There is no way to circumvent the disk amplifications if we wish to maintain our capacity to verify all the data. That being said, we <!-- --><strong><em class=\"chakra-text css-0\">can &#8211; and do &#8211;<!-- --><\/em><\/strong> trust the data we&#8217;ve previously verified.<!-- --><\/p>\n<p><!-- --><\/p>\n<p class=\"chakra-text css-gi02ar\">There is no value in validating and re-verifying each state item, every time we retrieve it from disk. The Merkle Patricia tree is crucial for writes, but it presents an overhead for reads. We cannot eliminate it, nor can we slim it down; but that <!-- --><strong><em class=\"chakra-text css-0\">doesn\u2019t imply<!-- --><\/em><\/strong> we must necessarily employ it everywhere.<!-- --><\/p>\n<p><!-- --><\/p>\n<p class=\"chakra-text css-gi02ar\">An Ethereum node accesses state through several different channels:<!-- --><\/p>\n<p><!-- --><\/p>\n<ul role=\"list\" class=\"css-1onhfjo\">\n<li class=\"css-cvpopp\">When importing a new block, EVM code execution typically involves a roughly equal number of state reads and writes. A denial-of-service block might, however, produce significantly more reads than writes.<!-- --><\/li>\n<li class=\"css-cvpopp\">When a node operator retrieves state (e.g., <!-- --><span class=\"chakra-text css-ons8vw\">eth_call<\/span> and family), EVM code execution primarily involves reads (it can write too, but those changes are discarded at the end and not persisted).<!-- --><\/li>\n<li class=\"css-cvpopp\">During synchronization, a node requests state from remote nodes that need to retrieve and service it over the network.<!-- --><\/li>\n<\/ul>\n<p><!-- --><\/p>\n<p class=\"chakra-text css-gi02ar\">Considering the above access patterns, if we can bypass reads from hitting the state trie, a multitude of node operations will become <!-- --><strong><em class=\"chakra-text css-0\">considerably<!-- --><\/em><\/strong> faster. It might evenenable some innovative access patterns (such as state iteration) which were previously prohibitively costly.<!-- --><\/p>\n<p><!-- --><\/p>\n<p class=\"chakra-text css-gi02ar\"><em class=\"chakra-text css-0\">Naturally, there&#8217;s always a compromise. Unless we eliminate the trie, any newly introduced acceleration structure incurs additional overhead. The core question is if the surplus overhead brings sufficient value to justify it?<!-- --><\/em><\/p>\n<p><!-- --><\/p>\n<h2 class=\"chakra-heading css-1w54o5f\" id=\"back-to-the-roots\">Returning to the fundamentals<!-- --><\/h2>\n<p><!-- --><\/p>\n<p class=\"chakra-text css-gi02ar\">We constructed this extraordinary Merkle Patricia tree to address all our challenges, and now we seek ways to bypass it for readings. Which acceleration framework should we employ to expedite reads once more? Well, if we can forgo the trie, we can eliminate all the intricacy it introduced. We can revert all the way to the beginning.<!-- --><\/p>\n<p><!-- --><\/p>\n<p class=\"chakra-text css-gi02ar\">As noted at the outset of this discussion, the <!-- --><em class=\"chakra-text css-0\">theoretical perfect<!-- --><\/em> data storage for Ethereum&#8217;s state is a straightforward key-value store (distinct for accounts and each contract). However, without the restrictions of the Merkle Patricia tree, there\u2019s &#8220;nothing&#8221; preventing us from executing the ideal remedy!<!-- --><\/p>\n<p><!-- --><\/p>\n<p class=\"chakra-text css-gi02ar\">Some time ago, Geth launched its <!-- --><strong><em class=\"chakra-text css-0\">snapshot<!-- --><\/em><\/strong> acceleration structure (not activated by default). A snapshot provides a complete view of the Ethereum state at a specific block. In abstract implementation terms, it is a dump of all accounts and storage slots, represented by a flat key-value repository.<!-- --><\/p>\n<p><!-- --><\/p>\n<p class=\"chakra-text css-gi02ar\">Whenever we want to access an account or storage slot, we only incur 1 LevelDB lookup instead of 7-8 as dictated by the trie. Updating the snapshot is also theoretically straightforward\u2014after processing a block, we perform one additional LevelDB write for each updated slot.<!-- --><\/p>\n<p><!-- --><\/p>\n<p class=\"chakra-text css-gi02ar\">The snapshot fundamentally lowers read times from O(log n) to O(1) (multiplied by LevelDB overhead) while increasing writes from O(log n) to O(1 + log n) (again multiplied by LevelDB overhead) and boosting disk storage from O(n log n) to O(n + n log n).<!-- --><\/p>\n<p><!-- --><\/p>\n<h2 class=\"chakra-heading css-1w54o5f\" id=\"devils-in-the-details\">The devil lies in the details<!-- --><\/h2>\n<p><!-- --><\/p>\n<p class=\"chakra-text css-gi02ar\">Maintaining a functional snapshot of the Ethereum state comes with its intricacies. As long as blocks arrive sequentially, each one building upon the previous, the simplistic method of integrating changes into the snapshot suffices. However, if a minor reorganization occurs (even just a single block), we are at risk because there\u2019s no option for reversal. Persistent writes are a one-way action for a flat data presentation. To complicate matters, accessing older state (e.g. 3 blocks back for some DApp or 64+ for fast\/snap sync) becomes unfeasible.<!-- --><\/p>\n<p><!-- --><\/p>\n<p class=\"chakra-text css-gi02ar\">To mitigate this restriction, Geth&#8217;s snapshot comprises two components: a persistent disk layer that is a complete snapshot of a previous block (e.g. HEAD-128); and a tree of in-memory difference layers that accumulate the writes on top.<!-- --><\/p>\n<p><!-- --><\/p>\n<p class=\"chakra-text css-gi02ar\">Whenever a new block is processed, we do not directly merge the writes into the disk layer; instead, we simply create a new in-memory difference layer to capture the changes. If numerous in-memory difference layers stack up, the oldest ones begin merging and are ultimately pushed to disk. Whenever a state entry is to be accessed, we start from the topmost difference layer and continue backward until we locate it or reach the disk.<!-- --><\/p>\n<p><!-- --><\/p>\n<p class=\"chakra-text css-gi02ar\">This data representation is highly effective since it resolves numerous issues. Since the in-memory difference layers are structured as a tree, reorgs no deeper than 128 blocks can easily select the difference layer associated with the parent block and proceed from there. DApps and remote synchronizers requiring older state have access to 128 recent states. The cost does rise by 128 map lookups, but 128 in-memory lookups are exponentially faster than 8 disk reads amplified 4x-5x by LevelDB.<!-- --><\/p>\n<p><!-- --><\/p>\n<p class=\"chakra-text css-gi02ar\">Of course, many intricacies and caveats exist. Without delving too deeply, a quick enumeration of the essential points includes:<!-- --><\/p>\n<p><!-- --><\/p>\n<ul role=\"list\" class=\"css-1onhfjo\">\n<li class=\"css-cvpopp\">Self-destructs (and deletions) pose unique challenges as they require a shortcut through the difference layer descent.<!-- --><\/li>\n<li class=\"css-cvpopp\">Should a reorg extend beyond the persistent disk layer, the snapshot must be entirely discarded and regenerated, which is highly resource-intensive.<!-- --><\/li>\n<li class=\"css-cvpopp\">Upon shutdown, in-memory difference layers must be saved into a journal and restored, or the snapshot risks becoming ineffective on restart.<!-- --><\/li>\n<li class=\"css-cvpopp\">Utilize the lowest difference layer as an accumulator and flush to disk only when it surpasses a certain memory threshold. This enables deduplication of writes for identical slots across blocks.<!-- --><\/li>\n<li class=\"css-cvpopp\">Implement a read cache for the disk layer so that contracts accessing the same historical slot repeatedly do not incur disk traffic.<!-- --><\/li>\n<li class=\"css-cvpopp\">Employ cumulative bloom filters within the in-memory difference layers to swiftly determine if an item might exist in the diffs, or if we can head to disk directly.<!-- --><\/li>\n<li class=\"css-cvpopp\">The keys are not the raw data (account address, storage key), but rather the hashes of these, ensuring that the snapshot preserves the same iteration sequence as the Merkle Patricia tree.<!-- --><\/li>\n<li class=\"css-cvpopp\">Creating the persistent disk layer requires significantly more time compared to the pruning window for the state tries, hence the generator must dynamically follow the chain.<!-- --><\/li>\n<\/ul>\n<p><!-- --><\/p>\n<h2 class=\"chakra-heading css-1w54o5f\" id=\"the-good-the-bad-the-ugly\">The good, the bad, the ugly<!-- --><\/h2>\n<p><!-- --><\/p>\n<p class=\"chakra-text css-gi02ar\">Geth&#8217;s snapshot acceleration structure reduces the complexity of state reads by approximately an order of magnitude. This leads to read-based DoS attacks becoming an order of magnitude more challenging to execute; and <!-- --><span class=\"chakra-text css-ons8vw\">eth_call<\/span> invocations becoming an order of magnitude quicker (barring CPU constraints).<!-- --><\/p>\n<p><!-- --><\/p>\n<p class=\"chakra-text css-gi02ar\">The snapshot also facilitates incredibly rapid state iteration for the most recent blocks. <!-- --><strong><em class=\"chakra-text css-0\">This was indeed the primary motivation for developing snapshots<!-- --><\/em><\/strong>, as it enabled the establishment of the new <!-- --><a target=\"_blank\" rel=\"noopener\" class=\"chakra-link css-ug8vf0\" href=\"https:\/\/github.com\/ethereum\/devp2p\/pull\/145\"><span class=\"chakra-text css-ons8vw\">snap<\/span> sync algorithm<!-- --><\/a>. Detailing this is an entirely separate blog entry, but the latest benchmarks on Rinkeby speak volumes:<!-- --><\/p>\n<p><!-- --><\/p>\n<p class=\"chakra-text css-gi02ar\">\n<p><!-- --><\/p>\n<p class=\"chakra-text css-gi02ar\">Naturally, the compromises are always prevalent. After the initial synchronization is completed, it takes approximately 9-10 hours on the mainnet to generate the initial snapshot (it&#8217;s maintained live thereafter) and around 15+GB of additional disk space is required.<!-- --><\/p>\n<p><!-- --><\/p>\n<p class=\"chakra-text css-gi02ar\">As for the undesirable aspects? Well, it took us over 6 months to feel sufficiently assured about the snapshot to launch it, yet even now it remains under the <!-- --><span class=\"chakra-text css-ons8vw\">&#8211;snapshot<\/span> flag, and there is still fine-tuning and refinement needed regarding memory consumption and recovery from crashes.<!-- --><\/p>\n<p><!-- --><\/p>\n<p class=\"chakra-text css-gi02ar\">Overall, we take great pride in this enhancement. It entailed an enormous amount of effort and it was quite a leap of faith to implement everything while hoping it would come together successfully. Just as a fun fact, the initial version of snap sync (leaf sync) was developed 2.5 years ago and had been stalled ever since due to our lack of the necessary acceleration to saturate it.<!-- --><\/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\">I hope you found this inaugural post of <!-- --><em class=\"chakra-text css-0\">Ask about Geth<!-- --><\/em>. It took me approximately twice the time to complete it than I had planned, but I considered the subject justified the extra effort. See you next week.<!-- --><\/p>\n<p><!-- --><\/p>\n<p class=\"chakra-text css-gi02ar\"><em class=\"chakra-text css-0\">[PS: I intentionally didn\u2019t link to the asking\/voting site in this post as I believe it is a temporary arrangement and I do not wish to leave any broken links for future reference; nor do I want someone to acquire the name and host something harmful later on. You can find it <!-- --><a target=\"_blank\" rel=\"noopener\" class=\"chakra-link css-ug8vf0\" href=\"https:\/\/twitter.com\/peter_szilagyi\">among my Twitter updates<!-- --><\/a>.]<!-- --><\/em><\/p>\n<\/div>\n<p><script async src=\"\/\/platform.twitter.com\/widgets.js\" charset=\"utf-8\"><\/script><br \/>\n<br \/><br \/>\n<br \/><a href=\"https:\/\/blog.ethereum.org\/en\/2020\/07\/17\/ask-about-geth-snapshot-acceleration\">Source link <\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>*This is installment #1 of a collection where anyone can pose inquiries about Geth and I&#8217;ll strive to respond to the most popular one each week with a brief writeup. This week&#8217;s top voted question was: Would you mind explaining how the flat database structure differs from the legacy structure?* State in Ethereum Before delving<\/p>\n","protected":false},"author":3,"featured_media":7155,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[23],"tags":[886],"class_list":["post-7417","post","type-post","status-publish","format-standard","has-post-thumbnail","category-ethereum","tag-return-a-list-of-comma-separated-tags-from-this-title-ask-about-geth-snapshot-acceleration"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v26.3 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Unveiling Geth: The Power of Snapshot Acceleration - 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\/16\/unveiling-geth-the-power-of-snapshot-acceleration\/\" \/>\n<meta property=\"og:locale\" content=\"it_IT\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Unveiling Geth: The Power of Snapshot Acceleration - WSJ-Crypto\" \/>\n<meta property=\"og:description\" content=\"*This is installment #1 of a collection where anyone can pose inquiries about Geth and I&#8217;ll strive to respond to the most popular one each week with a brief writeup. This week&#8217;s top voted question was: Would you mind explaining how the flat database structure differs from the legacy structure?* State in Ethereum Before delving\" \/>\n<meta property=\"og:url\" content=\"https:\/\/wsj-crypto.com\/index.php\/2025\/01\/16\/unveiling-geth-the-power-of-snapshot-acceleration\/\" \/>\n<meta property=\"og:site_name\" content=\"WSJ-Crypto\" \/>\n<meta property=\"article:published_time\" content=\"2025-01-16T19:54:33+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/wsj-crypto.com\/wp-content\/uploads\/2025\/01\/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=\"10 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\/16\/unveiling-geth-the-power-of-snapshot-acceleration\/\",\"url\":\"https:\/\/wsj-crypto.com\/index.php\/2025\/01\/16\/unveiling-geth-the-power-of-snapshot-acceleration\/\",\"name\":\"Unveiling Geth: The Power of Snapshot Acceleration - WSJ-Crypto\",\"isPartOf\":{\"@id\":\"https:\/\/wsj-crypto.com\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/wsj-crypto.com\/index.php\/2025\/01\/16\/unveiling-geth-the-power-of-snapshot-acceleration\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/wsj-crypto.com\/index.php\/2025\/01\/16\/unveiling-geth-the-power-of-snapshot-acceleration\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/wsj-crypto.com\/wp-content\/uploads\/2025\/01\/eth-org.jpeg\",\"datePublished\":\"2025-01-16T19:54:33+00:00\",\"author\":{\"@id\":\"https:\/\/wsj-crypto.com\/#\/schema\/person\/88a93723b30416db1a352d5a0096c4a7\"},\"breadcrumb\":{\"@id\":\"https:\/\/wsj-crypto.com\/index.php\/2025\/01\/16\/unveiling-geth-the-power-of-snapshot-acceleration\/#breadcrumb\"},\"inLanguage\":\"it-IT\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/wsj-crypto.com\/index.php\/2025\/01\/16\/unveiling-geth-the-power-of-snapshot-acceleration\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"it-IT\",\"@id\":\"https:\/\/wsj-crypto.com\/index.php\/2025\/01\/16\/unveiling-geth-the-power-of-snapshot-acceleration\/#primaryimage\",\"url\":\"https:\/\/wsj-crypto.com\/wp-content\/uploads\/2025\/01\/eth-org.jpeg\",\"contentUrl\":\"https:\/\/wsj-crypto.com\/wp-content\/uploads\/2025\/01\/eth-org.jpeg\",\"width\":2100,\"height\":900},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/wsj-crypto.com\/index.php\/2025\/01\/16\/unveiling-geth-the-power-of-snapshot-acceleration\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/wsj-crypto.com\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Unveiling Geth: The Power of Snapshot Acceleration\"}]},{\"@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":"Unveiling Geth: The Power of Snapshot Acceleration - 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\/16\/unveiling-geth-the-power-of-snapshot-acceleration\/","og_locale":"it_IT","og_type":"article","og_title":"Unveiling Geth: The Power of Snapshot Acceleration - WSJ-Crypto","og_description":"*This is installment #1 of a collection where anyone can pose inquiries about Geth and I&#8217;ll strive to respond to the most popular one each week with a brief writeup. This week&#8217;s top voted question was: Would you mind explaining how the flat database structure differs from the legacy structure?* State in Ethereum Before delving","og_url":"https:\/\/wsj-crypto.com\/index.php\/2025\/01\/16\/unveiling-geth-the-power-of-snapshot-acceleration\/","og_site_name":"WSJ-Crypto","article_published_time":"2025-01-16T19:54:33+00:00","og_image":[{"width":2100,"height":900,"url":"https:\/\/wsj-crypto.com\/wp-content\/uploads\/2025\/01\/eth-org.jpeg","type":"image\/jpeg"}],"author":"wsjcrypto","twitter_card":"summary_large_image","twitter_misc":{"Scritto da":"wsjcrypto","Tempo di lettura stimato":"10 minuti"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/wsj-crypto.com\/index.php\/2025\/01\/16\/unveiling-geth-the-power-of-snapshot-acceleration\/","url":"https:\/\/wsj-crypto.com\/index.php\/2025\/01\/16\/unveiling-geth-the-power-of-snapshot-acceleration\/","name":"Unveiling Geth: The Power of Snapshot Acceleration - WSJ-Crypto","isPartOf":{"@id":"https:\/\/wsj-crypto.com\/#website"},"primaryImageOfPage":{"@id":"https:\/\/wsj-crypto.com\/index.php\/2025\/01\/16\/unveiling-geth-the-power-of-snapshot-acceleration\/#primaryimage"},"image":{"@id":"https:\/\/wsj-crypto.com\/index.php\/2025\/01\/16\/unveiling-geth-the-power-of-snapshot-acceleration\/#primaryimage"},"thumbnailUrl":"https:\/\/wsj-crypto.com\/wp-content\/uploads\/2025\/01\/eth-org.jpeg","datePublished":"2025-01-16T19:54:33+00:00","author":{"@id":"https:\/\/wsj-crypto.com\/#\/schema\/person\/88a93723b30416db1a352d5a0096c4a7"},"breadcrumb":{"@id":"https:\/\/wsj-crypto.com\/index.php\/2025\/01\/16\/unveiling-geth-the-power-of-snapshot-acceleration\/#breadcrumb"},"inLanguage":"it-IT","potentialAction":[{"@type":"ReadAction","target":["https:\/\/wsj-crypto.com\/index.php\/2025\/01\/16\/unveiling-geth-the-power-of-snapshot-acceleration\/"]}]},{"@type":"ImageObject","inLanguage":"it-IT","@id":"https:\/\/wsj-crypto.com\/index.php\/2025\/01\/16\/unveiling-geth-the-power-of-snapshot-acceleration\/#primaryimage","url":"https:\/\/wsj-crypto.com\/wp-content\/uploads\/2025\/01\/eth-org.jpeg","contentUrl":"https:\/\/wsj-crypto.com\/wp-content\/uploads\/2025\/01\/eth-org.jpeg","width":2100,"height":900},{"@type":"BreadcrumbList","@id":"https:\/\/wsj-crypto.com\/index.php\/2025\/01\/16\/unveiling-geth-the-power-of-snapshot-acceleration\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/wsj-crypto.com\/"},{"@type":"ListItem","position":2,"name":"Unveiling Geth: The Power of Snapshot Acceleration"}]},{"@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\/7417","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=7417"}],"version-history":[{"count":2,"href":"https:\/\/wsj-crypto.com\/index.php\/wp-json\/wp\/v2\/posts\/7417\/revisions"}],"predecessor-version":[{"id":7419,"href":"https:\/\/wsj-crypto.com\/index.php\/wp-json\/wp\/v2\/posts\/7417\/revisions\/7419"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wsj-crypto.com\/index.php\/wp-json\/wp\/v2\/media\/7155"}],"wp:attachment":[{"href":"https:\/\/wsj-crypto.com\/index.php\/wp-json\/wp\/v2\/media?parent=7417"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wsj-crypto.com\/index.php\/wp-json\/wp\/v2\/categories?post=7417"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wsj-crypto.com\/index.php\/wp-json\/wp\/v2\/tags?post=7417"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}