{"id":8052,"date":"2025-02-02T04:36:33","date_gmt":"2025-02-02T03:36:33","guid":{"rendered":"https:\/\/wsj-crypto.com\/?p=8052"},"modified":"2025-02-02T04:36:33","modified_gmt":"2025-02-02T03:36:33","slug":"geth-1-9-0-unveiling-the-latest-features-and-enhancements","status":"publish","type":"post","link":"https:\/\/wsj-crypto.com\/index.php\/2025\/02\/02\/geth-1-9-0-unveiling-the-latest-features-and-enhancements\/","title":{"rendered":"Geth 1.9.0: Unveiling the Latest Features and Enhancements"},"content":{"rendered":"<p><\/p>\n<div id=\"\">\n<p class=\"chakra-text css-gi02ar\">After several months of quiet, we are thrilled to announce the v1.9.0 launch of Go Ethereum! While this version has been in development for considerably longer than we expected, we believe there will be some exciting features for all to appreciate!<!-- --><\/p>\n<p><!-- --><\/p>\n<p class=\"chakra-text css-gi02ar\"><strong>Caution: We have made every effort to eliminate all issues, but as with all significant releases, we suggest everyone exercise additional caution when upgrading. The v1.9.0 release includes alterations to the database schema, making it impossible to revert once updated. We also suggest performing a fresh fast sync, as it can significantly decrease the database size.<!-- --><\/strong><\/p>\n<p><!-- --><\/p>\n<p class=\"chakra-text css-gi02ar\">Several of the features outlined here have been quietly integrated throughout the 1.8.x release series, yet we have considered them essential enough to explicitly showcase.<!-- --><\/p>\n<p><!-- --><\/p>\n<h2 class=\"chakra-heading css-1w54o5f\" id=\"performance\">Performance<!-- --><\/h2>\n<p><!-- --><\/p>\n<p class=\"chakra-text css-gi02ar\">It\u2019s fascinating to note that the &#8220;Performance&#8221; segment was located toward the conclusion of previous announcements, but over time it has evolved into one of the most desired enhancements.<!-- --><\/p>\n<p><!-- --><\/p>\n<p class=\"chakra-text css-gi02ar\">Over the last six months, we have endeavored to analyze the various components crucial to block processing, striving to identify and enhance some of the bottlenecks. Among numerous enhancements, the most impactful ones included:<!-- --><\/p>\n<p><!-- --><\/p>\n<ul role=\"list\" class=\"css-1onhfjo\">\n<li class=\"css-cvpopp\">The identification and enhancement of a quadratic CPU and disk IO complexity, stemming from the Go implementation of LevelDB. This issue caused Geth to become starved and halted, worsening exponentially as the database expanded. A huge thank you to Gary Rong for his <!-- --><a target=\"_blank\" rel=\"noopener\" class=\"chakra-link css-ug8vf0\" href=\"https:\/\/github.com\/syndtr\/goleveldb\/pulls?q=is%3Apr+author%3Arjl493456442+is%3Aclosed\">tireless efforts<!-- --><\/a>, particularly as his contributions benefit the entire Go community.<!-- --><\/li>\n<li class=\"css-cvpopp\">The examination and improvement of the account and storage trie access methods across blocks. This led to the stabilization of Geth&#8217;s memory consumption even during the import of the Shanghai DoS blocks and accelerated overall block processing through concurrent heuristic state prefetching. <!-- --><a target=\"_blank\" rel=\"noopener\" class=\"chakra-link css-ug8vf0\" href=\"https:\/\/github.com\/ethereum\/go-ethereum\/pulls?utf8=%E2%9C%93&amp;q=is%3Apr+is%3Aclosed+trie+milestone%3A1.9.0+\">This effort<!-- --><\/a> was primarily executed by P\u00e9ter Szil\u00e1gyi.<!-- --><\/li>\n<li class=\"css-cvpopp\">The assessment and enhancement of various EVM opcodes, with the goal of uncovering anomalies in both Geth&#8217;s EVM implementation and Ethereum\u2019s protocol design overall. This work resulted in fixes within Geth as well as insights contributed to the Eth 1.x scaling conversations. A shoutout goes to Martin Holst Swende for <!-- --><a target=\"_blank\" rel=\"noopener\" class=\"chakra-link css-ug8vf0\" href=\"https:\/\/github.com\/holiman\/vmstats\">initiating<!-- --><\/a> this initiative.<!-- --><\/li>\n<li class=\"css-cvpopp\">The evaluation and optimization of our database schemas, aiming to eliminate redundant data and redesign indexes for lowered disk usage (sometimes at the cost of a slight CPU impact). Kudos for these efforts, which spanned 6-9 months, go to Alexey Akhunov, Gary Rong, P\u00e9ter Szil\u00e1gyi, and Matthew Halpern.<!-- --><\/li>\n<li class=\"css-cvpopp\">The discovery of LevelDB compaction overhead during the state sync phase of fast sync. By temporarily allocating pruning caches to fast sync blooms, we have managed to streamline most data accesses in memory. <!-- --><a target=\"_blank\" rel=\"noopener\" class=\"chakra-link css-ug8vf0\" href=\"https:\/\/github.com\/ethereum\/go-ethereum\/pull\/19489\">This work<!-- --><\/a> was chiefly carried out by P\u00e9ter Szil\u00e1gyi.<!-- --><\/li>\n<\/ul>\n<p><!-- --><\/p>\n<h3 class=\"chakra-heading css-145upk7\" id=\"tldr-fast-sync\">[TL;DR] Fast sync<!-- --><\/h3>\n<p><!-- --><\/p>\n<p class=\"chakra-text css-gi02ar\">We executed a fast sync benchmark on two <!-- --><span class=\"chakra-text css-ons8vw\">i3.2xlarge<\/span> AWS EC2 instances (8 core, 61 GiB RAM, 1.9 TiB NVMe SSD) with <!-- --><span class=\"chakra-text css-ons8vw\">&#8211;cache=4096 &#8211;maxpeers=50<\/span> (default settings in v1.9.0) on April 25th.<!-- --><\/p>\n<p><!-- --><\/p>\n<div class=\"css-ylxp7t\">\n<table role=\"table\" class=\"chakra-table css-nz8z8i\">\n<thead node=\"[object Object]\" class=\"css-0\">\n<tr role=\"row\" class=\"css-0\">\n<th class=\"css-aqvfe2\">Version<!-- --><\/th>\n<th class=\"css-aqvfe2\">Sync time<!-- --><\/th>\n<th class=\"css-aqvfe2\">Disk size<!-- --><\/th>\n<th class=\"css-aqvfe2\">Disk reads<!-- --><\/th>\n<th class=\"css-aqvfe2\">Disk writes<!-- --><\/th>\n<\/tr>\n<\/thead>\n<tbody node=\"[object Object]\" class=\"css-i54j9x\">\n<tr role=\"row\" class=\"css-0\">\n<td role=\"gridcell\" class=\"css-19nu0k5\">Geth v1.8.27<!-- --><\/td>\n<td role=\"gridcell\" class=\"css-19nu0k5\">11h 20m<!-- --><\/td>\n<td role=\"gridcell\" class=\"css-19nu0k5\">176GiB<!-- --><\/td>\n<td role=\"gridcell\" class=\"css-19nu0k5\">1.58TiB<!-- --><\/td>\n<td role=\"gridcell\" class=\"css-19nu0k5\">1.94TiB<!-- --><\/td>\n<\/tr>\n<tr role=\"row\" class=\"css-0\">\n<td role=\"gridcell\" class=\"css-19nu0k5\">Geth v1.9.0<!-- --><\/td>\n<td role=\"gridcell\" class=\"css-19nu0k5\">4h 8m<!-- --><\/td>\n<td role=\"gridcell\" class=\"css-19nu0k5\">131GiB<!-- --><\/td>\n<td role=\"gridcell\" class=\"css-19nu0k5\">0.91TiB<!-- --><\/td>\n<td role=\"gridcell\" class=\"css-19nu0k5\">1.06TiB<!-- --><\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<p><!-- --><\/p>\n<h3 class=\"chakra-heading css-145upk7\" id=\"tldr-full-sync\">[TL;DR] Full sync<!-- --><\/h3>\n<p><!-- --><\/p>\n<p class=\"chakra-text css-gi02ar\">We conducted a full sync benchmark on two <!-- --><span class=\"chakra-text css-ons8vw\">i3.2xlarge<\/span> AWS EC2 instances (8 core, 61 GiB RAM, 1.9 TiB NVMe SSD) with <!-- --><span class=\"chakra-text css-ons8vw\">&#8211;cache=4096 &#8211;maxpeers=50 &#8211;syncmode=full<\/span>.<!-- --><\/p>\n<p><!-- --><\/p>\n<div class=\"css-ylxp7t\">\n<table role=\"table\" class=\"chakra-table css-nz8z8i\">\n<thead node=\"[object Object]\" class=\"css-0\">\n<tr role=\"row\" class=\"css-0\">\n<th class=\"css-aqvfe2\">Version<!-- --><\/th>\n<th class=\"css-aqvfe2\">Sync time<!-- --><\/th>\n<th class=\"css-aqvfe2\">Disk size<!-- --><\/th>\n<th class=\"css-aqvfe2\">Disk reads<!-- --><\/th>\n<th class=\"css-aqvfe2\">Disk writes<!-- --><\/th>\n<\/tr>\n<\/thead>\n<tbody node=\"[object Object]\" class=\"css-i54j9x\">\n<tr role=\"row\" class=\"css-0\">\n<td role=\"gridcell\" class=\"css-19nu0k5\">Geth v1.8.27<!-- --><\/td>\n<td role=\"gridcell\" class=\"css-19nu0k5\">6d 15h 30m<!-- --><\/td>\n<td role=\"gridcell\" class=\"css-19nu0k5\">341GiB<!-- --><\/td>\n<td role=\"gridcell\" class=\"css-19nu0k5\">28.9TiB<!-- --><\/td>\n<td role=\"gridcell\" class=\"css-19nu0k5\">21.8TiB<!-- --><\/td>\n<\/tr>\n<tr role=\"row\" class=\"css-0\">\n<td role=\"gridcell\" class=\"css-19nu0k5\">Geth v1.9.0<!-- --><\/td>\n<td role=\"gridcell\" class=\"css-19nu0k5\">6d 8h 7m*<!-- --><\/td>\n<td role=\"gridcell\" class=\"css-19nu0k5\">303GiB<!-- --><\/td>\n<td role=\"gridcell\" class=\"css-19nu0k5\">40.2TiB*<!-- --><\/td>\n<td role=\"gridcell\" class=\"css-19nu0k5\">32.6TiB*<!-- --><\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<p><!-- --><\/p>\n<p class=\"chakra-text css-gi02ar\"><em class=\"chakra-text css-0\">*Although the performance is comparable, we achieved that while reducing memory usage by approximately one-third and completely eliminating unnecessary memory spikes (Shanghai DoS). The reason for the elevated disk IO is due to utilizing less memory for caching, necessitating more aggressive pushes to disk.<!-- --><\/em><\/p>\n<p><!-- --><\/p>\n<p class=\"chakra-text css-gi02ar\">\n<p><!-- --><\/p>\n<h3 class=\"chakra-heading css-145upk7\" id=\"tldr-archive-sync\">[TL;DR] Archive sync<!-- --><\/h3>\n<p><!-- --><\/p>\n<p class=\"chakra-text css-gi02ar\">We performed an archive sync benchmark on two <!-- --><span class=\"chakra-text css-ons8vw\">m5.2xlarge<\/span> AWS EC2 instances (8 core, 32 GiB RAM, 3TiB EBS SSD) with <!-- --><span class=\"chakra-text css-ons8vw\">&#8211;cache=4096 &#8211;syncmode=full &#8211;gcmode=archive<\/span>.<!-- --><\/p>\n<p><!-- --><\/p>\n<div class=\"css-ylxp7t\">\n<table role=\"table\" class=\"chakra-table css-nz8z8i\">\n<thead node=\"[object Object]\" class=\"css-0\">\n<tr role=\"row\" class=\"css-0\">\n<th class=\"css-aqvfe2\">Version<!-- --><\/th>\n<th class=\"css-aqvfe2\">Synchronization duration<!-- --><\/th>\n<th class=\"css-aqvfe2\">Disk capacity<!-- --><\/th>\n<th class=\"css-aqvfe2\">Disk reads<!-- --><\/th>\n<th class=\"css-aqvfe2\">Disk writes<!-- --><\/th>\n<\/tr>\n<\/thead>\n<tbody node=\"[object Object]\" class=\"css-i54j9x\">\n<tr role=\"row\" class=\"css-0\">\n<td role=\"gridcell\" class=\"css-19nu0k5\">Geth v1.8.27<!-- --><\/td>\n<td role=\"gridcell\" class=\"css-19nu0k5\">62d 4h<!-- --><\/td>\n<td role=\"gridcell\" class=\"css-19nu0k5\">2.57TiB<!-- --><\/td>\n<td role=\"gridcell\" class=\"css-19nu0k5\">69.29TiB<!-- --><\/td>\n<td role=\"gridcell\" class=\"css-19nu0k5\">49.03TiB<!-- --><\/td>\n<\/tr>\n<tr role=\"row\" class=\"css-0\">\n<td role=\"gridcell\" class=\"css-19nu0k5\">Geth v1.9.0<!-- --><\/td>\n<td role=\"gridcell\" class=\"css-19nu0k5\">13d 19h*<!-- --><\/td>\n<td role=\"gridcell\" class=\"css-19nu0k5\">2.32TiB<!-- --><\/td>\n<td role=\"gridcell\" class=\"css-19nu0k5\">104.73TiB<!-- --><\/td>\n<td role=\"gridcell\" class=\"css-19nu0k5\">91.4TiB<!-- --><\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<p><!-- --><\/p>\n<p class=\"chakra-text css-gi02ar\"><em class=\"chakra-text css-0\">* EBS volumes are considerably slower than physical SSDs connected to the VM. Improved performance can be attained on VMs with genuine SSDs or true physical hardware.<!-- --><\/em><\/p>\n<p><!-- --><\/p>\n<h2 class=\"chakra-heading css-1w54o5f\" id=\"freezer\">Freezer<!-- --><\/h2>\n<p><!-- --><\/p>\n<p class=\"chakra-text css-gi02ar\">Wouldn&#8217;t it be remarkable if we could conserve so much valuable storage on our costly and delicate SSDs to operate an Ethereum node, and instead transfer at least some of the information onto an economical and resilient HDD?<!-- --><\/p>\n<p><!-- --><\/p>\n<p class=\"chakra-text css-gi02ar\">With the release of version v1.9.0, Geth <!-- --><a target=\"_blank\" rel=\"noopener\" class=\"chakra-link css-ug8vf0\" href=\"https:\/\/github.com\/ethereum\/go-ethereum\/pull\/19244\">divided<!-- --><\/a> its database into two segments (carried out by P\u00e9ter Szil\u00e1gyi, Martin Holst Swende and Gary Rong):<!-- --><\/p>\n<p><!-- --><\/p>\n<ul role=\"list\" class=\"css-1onhfjo\">\n<li class=\"css-cvpopp\">Recent blocks, complete state, and acceleration structures are maintained in a swift key-value store (LevelDB) like before. This is intended to function atop an SSD, as disk IO performance is critical.<!-- --><\/li>\n<li class=\"css-cvpopp\">Blocks and receipts older than a specific cutoff point (3 epochs) are transferred from LevelDB to a custom <!-- --><em class=\"chakra-text css-0\">freezer<!-- --><\/em> database, supported by a set of append-only flat files. Since the node seldom requires access to these data, and only appends to them, an HDD should be more than adequate for this purpose.<!-- --><\/li>\n<\/ul>\n<p><!-- --><\/p>\n<p class=\"chakra-text css-gi02ar\">A new fast sync at block 7.77M allocated 79GB of data to the freezer and 60GB to LevelDB.<!-- --><\/p>\n<p><!-- --><\/p>\n<h3 class=\"chakra-heading css-145upk7\" id=\"freezer-basics\">Freezer fundamentals<!-- --><\/h3>\n<p><!-- --><\/p>\n<p class=\"chakra-text css-gi02ar\">By default, Geth will place your freezer within your <!-- --><span class=\"chakra-text css-ons8vw\">chaindata<\/span> directory, inside the <!-- --><span class=\"chakra-text css-ons8vw\">ancient<\/span> subfolder. The choice of using a sub-folder was to prevent disrupting any automated tools that might be relocating the database around or across instances. You can explicitly set the freezer in a different location using the <!-- --><span class=\"chakra-text css-ons8vw\">&#8211;datadir.ancient<\/span> CLI parameter.<!-- --><\/p>\n<p><!-- --><\/p>\n<p class=\"chakra-text css-gi02ar\">Upon upgrading to v1.9.0 from a prior version, Geth will automatically begin transferring blocks and receipts from the LevelDB database into the freezer. If you didn&#8217;t specify <!-- --><span class=\"chakra-text css-ons8vw\">&#8211;datadir.ancient<\/span> at that moment, but wish to relocate it afterward, you will need to manually copy the existing <!-- --><span class=\"chakra-text css-ons8vw\">ancient<\/span> folder and then initiate Geth with <!-- --><span class=\"chakra-text css-ons8vw\">&#8211;datadir.ancient<\/span> pointed to the appropriate path.<!-- --><\/p>\n<p><!-- --><\/p>\n<h3 class=\"chakra-heading css-145upk7\" id=\"freezer-tricks\">Freezer hacks<!-- --><\/h3>\n<p><!-- --><\/p>\n<p class=\"chakra-text css-gi02ar\">Since the freezer (cold data) is saved separately from the state (hot data), an intriguing question arises regarding what occurs if one of the two databases is lost?<!-- --><\/p>\n<p><!-- --><\/p>\n<ul role=\"list\" class=\"css-1onhfjo\">\n<li class=\"css-cvpopp\">If the <!-- --><em class=\"chakra-text css-0\">freezer<!-- --><\/em> is removed (or an incorrect path is given), you essentially pull the rug from underneath Geth. The node would become inoperative, hence it categorically forbids this action at startup.<!-- --><\/li>\n<li class=\"css-cvpopp\">Conversely, if the <!-- --><em class=\"chakra-text css-0\">state database<!-- --><\/em> is the one that is deleted, Geth will <!-- --><strong>reconstruct<!-- --><\/strong> all its indices based on the frozen data, and then perform a swift sync on top to <!-- --><strong>back-fill<!-- --><\/strong> the absent state.<!-- --><\/li>\n<\/ul>\n<p><!-- --><\/p>\n<p class=\"chakra-text css-gi02ar\">In essence, the freezer can function as a <!-- --><strong>guerrilla state pruner<!-- --><\/strong> to routinely eliminate accumulated debris. By deleting the state database, while retaining the freezer, the node will conduct a fast sync to retrieve the latest state, but will reuse all the pre-existing block and receipt data already downloaded beforehand.<!-- --><\/p>\n<p><!-- --><\/p>\n<p class=\"chakra-text css-gi02ar\">You can initiate this via <!-- --><span class=\"chakra-text css-ons8vw\">geth removedb<\/span> (along with the <!-- --><span class=\"chakra-text css-ons8vw\">&#8211;datadir<\/span> and <!-- --><span class=\"chakra-text css-ons8vw\">&#8211;datadir.ancient<\/span> options if you utilized custom ones); instructing it to solely remove the state database while leaving the ancient database intact.<!-- --><\/p>\n<p><!-- --><\/p>\n<p class=\"chakra-text css-gi02ar\"><em class=\"chakra-text css-0\">Please be aware that reindexing all the transactions from the ancient database can surpass one hour, and fast sync will commence only thereafter. This is likely to be transitioned into a background process in the near future.<!-- --><\/em><\/p>\n<p><!-- --><\/p>\n<h2 class=\"chakra-heading css-1w54o5f\" id=\"graphql\">GraphQL<!-- --><\/h2>\n<p><!-- --><\/p>\n<p class=\"chakra-text css-gi02ar\">Who doesn&#8217;t adore JSON-RPC? <!-- --><em class=\"chakra-text css-0\">Me!<!-- --><\/em><\/p>\n<p><!-- --><\/p>\n<p class=\"chakra-text css-gi02ar\">As its designation implies, JSON-RPC is a *Remote Procedure <!-- --><strong>Call*<!-- --><\/strong> framework. Its design intention is to facilitate <!-- --><em class=\"chakra-text css-0\">invoking functions<!-- --><\/em> that perform some arbitrary processing on the remote side, subsequently returning the result of said processing. Naturally &#8211; as the protocol is generic &#8211; it allows for running data inquiries on top, but there are no standardized query semantics, hence individuals tend to develop their own.<!-- --><\/p>\n<p><!-- --><\/p>\n<p class=\"chakra-text css-gi02ar\">In the absence of support for versatile queries, we end up squandering both computational and data transfer resources:<!-- --><\/p>\n<p><!-- --><\/p>\n<ul role=\"list\" class=\"css-1onhfjo\">\n<li class=\"css-cvpopp\">RPC calls that yield substantial data (e.g. <!-- --><span class=\"chakra-text css-ons8vw\">eth_getBlock<\/span>) consume bandwidth if the user is only interested in a few fields (e.g. just the header, or even less, solely the miner&#8217;s address).<!-- --><\/li>\n<li class=\"css-cvpopp\">RPC calls returning only a small amount of data (e.g. <!-- --><span class=\"chakra-text css-ons8vw\">eth_getTransactionReceipt<\/span>) deplete CPU resources if the user must repeat the call multiple times (e.g. retrieving all receipts one-by-one necessitates loading <!-- --><strong>all of them<!-- --><\/strong> from disk for each call).<!-- --><\/li>\n<\/ul>\n<p><!-- --><\/p>\n<p class=\"chakra-text css-gi02ar\">In the context of Ethereum&#8217;s JSON-RPC API, the issues mentioned above are exacerbated by the mini-reorg characteristics of the blockchain, as executing multiple inquiries (e.g.<!-- --><span class=\"chakra-text css-ons8vw\">eth_getBalance<\/span>) must genuinely guarantee that they operate against the identical state and even the same node (e.g. load-balanced backends might experience minor synchronization delays, potentially serving differing content).<!-- --><\/p>\n<p><!-- --><\/p>\n<p class=\"chakra-text css-gi02ar\">Indeed, we could devise a groundbreaking, highly efficient query mechanism that would allow us to obtain solely the information we require while reducing computational and data transfer strain&#8230; or we could opt to not-reinvent the wheel (once more) and instead utilize one that is already validated: <!-- --><a target=\"_blank\" rel=\"noopener\" class=\"chakra-link css-ug8vf0\" href=\"https:\/\/graphql.org\/\">GraphQL<!-- --><\/a>.<!-- --><\/p>\n<p><!-- --><\/p>\n<h3 class=\"chakra-heading css-145upk7\" id=\"querying-with-graphql\">Querying with GraphQL<!-- --><\/h3>\n<p><!-- --><\/p>\n<p class=\"chakra-text css-gi02ar\">To begin, a massive thank you goes to Ra\u00fal Kripalani, Kris Shinn, Nick Johnson, Infura, and Pegasys, for spearheading both the <!-- --><a target=\"_blank\" rel=\"noopener\" class=\"chakra-link css-ug8vf0\" href=\"http:\/\/eips.ethereum.org\/EIPS\/eip-1767\">GraphQL specification<!-- --><\/a> and its <!-- --><a target=\"_blank\" rel=\"noopener\" class=\"chakra-link css-ug8vf0\" href=\"https:\/\/github.com\/ethereum\/go-ethereum\/pull\/18445\">implementation<!-- --><\/a>, as well as to Guillaume Ballet for completing the final integrations!<!-- --><\/p>\n<p><!-- --><\/p>\n<p class=\"chakra-text css-gi02ar\">Geth v1.9.0 brings inbuilt GraphQL query functionalities through the <!-- --><span class=\"chakra-text css-ons8vw\">&#8211;graphql<\/span> CLI option. Since GraphQL operates as a protocol on top of HTTP, the entire suite of sub-flags (restrictions, CORS, and virtual host guidelines) is applicable just like for HTTP RPC. But enough chatter, let\u2019s dive into it!<!-- --><\/p>\n<p><!-- --><\/p>\n<p class=\"chakra-text css-gi02ar\">For a quick demonstration, let\u2019s seek out all the ENS domain registrations on the G\u00f6rli testnet! Launch Geth v1.9.0 on G\u00f6rli with GraphQL enabled (<!-- --><span class=\"chakra-text css-ons8vw\">geth &#8211;goerli &#8211;graphql<\/span>), allow it to sync (which should take roughly 1-2 minutes) and navigate your browser to the&#8230; gasp&#8230; integrated GraphQL explorer at <!-- --><span class=\"chakra-text css-ons8vw\">http:\/\/localhost:8547<\/span>!<!-- --><\/p>\n<p><!-- --><\/p>\n<p class=\"chakra-text css-gi02ar\">To keep it straightforward, <!-- --><a target=\"_blank\" rel=\"noopener\" class=\"chakra-link css-ug8vf0\" href=\"https:\/\/gist.github.com\/karalabe\/bb68b43e48a630baf73f9862521fe45c\">here&#8217;s a brief sample query<!-- --><\/a> that locates the ENS <!-- --><span class=\"chakra-text css-ons8vw\">HashRegistered<\/span> events and retrieves the address of the user who performed the registration together with the block number and timestamp it was included:<!-- --><\/p>\n<p><!-- --><\/p>\n<p class=\"chakra-text css-gi02ar\"><img decoding=\"async\" alt=\"GraphQL\" src=\"https:\/\/blog.ethereum.org\/images\/posts\/graphql.png\" class=\"chakra-image css-hw6q2r\"\/><\/p>\n<p><!-- --><\/p>\n<p class=\"chakra-text css-gi02ar\">While the example may be somewhat forced and basic, it emphasizes that GraphQL empowers us to handle complex &#8220;join queries&#8221; that previously necessitated multiple RPC calls, returning much more data than was actually required.<!-- --><\/p>\n<p><!-- --><\/p>\n<p class=\"chakra-text css-gi02ar\">As with all remarkable developer tools, Geth v1.9.0\u2019s GraphQL explorer comes equipped with integrated code completion, field documentation, and real-time query execution! Go and query something extraordinary!<!-- --><\/p>\n<p><!-- --><\/p>\n<h2 class=\"chakra-heading css-1w54o5f\" id=\"hardware-wallets\">Hardware wallets<!-- --><\/h2>\n<p><!-- --><\/p>\n<p class=\"chakra-text css-gi02ar\">Geth has already supported certain hardware wallets previously, but with the v1.9.0 update, we&#8217;ve significantly enhanced that roster!<!-- --><\/p>\n<p><!-- --><\/p>\n<p class=\"chakra-text css-gi02ar\"><img decoding=\"async\" alt=\"Wallets\" src=\"https:\/\/blog.ethereum.org\/images\/posts\/wallets.jpeg\" class=\"chakra-image css-hw6q2r\"\/><\/p>\n<p><!-- --><\/p>\n<h3 class=\"chakra-heading css-145upk7\" id=\"ledger-wallets\">Ledger wallets<!-- --><\/h3>\n<p><!-- --><\/p>\n<p class=\"chakra-text css-gi02ar\">We have been backing the <!-- --><a target=\"_blank\" rel=\"noopener\" class=\"chakra-link css-ug8vf0\" href=\"https:\/\/shop.ledger.com\/products\/ledger-nano-s\">Ledger Nano S<!-- --><\/a> for several years, but Geth v1.9.0 now also incorporates native support for the <!-- --><a target=\"_blank\" rel=\"noopener\" class=\"chakra-link css-ug8vf0\" href=\"https:\/\/shop.ledger.com\/pages\/ledger-nano-x\">Ledger Nano X<!-- --><\/a> (through USB)!<!-- --><\/p>\n<p><!-- --><\/p>\n<p class=\"chakra-text css-gi02ar\">Moreover, v1.9.0 updates the default HD derivation path from the legacy one, originally promoted by Ledger, to the canonical one utilized by all Ethereum wallets (and currently by Ledger as well). <!-- --><strong>No need to worry, Geth will identify all your previous accounts as well, just using the canonical path for new accounts!<!-- --><\/strong> <!-- --><a target=\"_blank\" rel=\"noopener\" class=\"chakra-link css-ug8vf0\" href=\"https:\/\/github.com\/ethereum\/go-ethereum\/pulls?q=is%3Apr+is%3Aclosed+ledger+milestone%3A1.9.0\">This development<!-- --><\/a> was executed by P\u00e9ter Szil\u00e1gyi.<!-- --><\/p>\n<p><!-- --><\/p>\n<p class=\"chakra-text css-gi02ar\">If you haven\u2019t utilized a Ledger through Geth until now, the process is as follows:<!-- --><\/p>\n<p><!-- --><\/p>\n<ul role=\"list\" class=\"css-1onhfjo\">\n<li class=\"css-cvpopp\">Connect your Ledger Nano S or Ledger Nano X and unlock it using your PIN.<!-- --><\/li>\n<li class=\"css-cvpopp\">Launch the Ethereum application on your Ledger (Geth will record <!-- --><span class=\"chakra-text css-ons8vw\">Ethereum app offline<\/span>).<!-- --><\/li>\n<li class=\"css-cvpopp\">You can view all your accounts via <!-- --><span class=\"chakra-text css-ons8vw\">personal.listWallets<\/span> from the Geth console.<br \/>\n<!-- --><\/p>\n<ul role=\"list\" class=\"css-1onhfjo\">\n<li class=\"css-cvpopp\">This will auto-derive any accounts that you&#8217;ve previously used + 1 additional empty one.<!-- --><\/li>\n<li class=\"css-cvpopp\">Alternatively, you can accomplish the same through RPC using <!-- --><span class=\"chakra-text css-ons8vw\">personal_listWallets<\/span>.<!-- --><\/li>\n<\/ul>\n<p><!-- --><\/li>\n<li class=\"css-cvpopp\">Perform transactions using your preferred method and Geth will relay the signing request to the Ledger.<!-- --><\/li>\n<\/ul>\n<p><!-- --><\/p>\n<p class=\"chakra-text css-gi02ar\"><em class=\"chakra-text css-0\">Linux users should note, you need to <!-- --><a target=\"_blank\" rel=\"noopener\" class=\"chakra-link css-ug8vf0\" href=\"https:\/\/support.ledger.com\/hc\/en-us\/articles\/115005165269-Fix-connection-issues\">explicitly allow<!-- --><\/a> your user to access your Ledger wallet via <!-- --><span class=\"chakra-text css-ons8vw\">udev<\/span> rules!<!-- --><\/em><\/p>\n<p><!-- --><\/p>\n<h3 class=\"chakra-heading css-145upk7\" id=\"trezor-wallets\">Trezor wallets<!-- --><\/h3>\n<p><!-- --><\/p>\n<p class=\"chakra-text css-gi02ar\">For nearly two years, we have offered support for the <!-- --><a target=\"_blank\" rel=\"noopener\" class=\"chakra-link css-ug8vf0\" href=\"https:\/\/shop.trezor.io\/product\/trezor-one-white\">Trezor One<!-- --><\/a>. Unfortunately, a firmware update (v1.7.0+) altered the USB protocol in an incompatible manner. While we recommend everyone to utilize the most recent software for security purposes, we also recognize the hesitance to frequently update firmware on a cold storage device.<!-- --><\/p>\n<p><!-- --><\/p>\n<p class=\"chakra-text css-gi02ar\">Consequently, Geth v1.9.0 adopts the new WebUSB protocol compatible with updated Trezor One models, while still retaining support for the older USB HID protocol for devices that haven\u2019t been updated. <!-- --><a target=\"_blank\" rel=\"noopener\" class=\"chakra-link css-ug8vf0\" href=\"https:\/\/github.com\/ethereum\/go-ethereum\/pulls?q=is%3Apr+webusb+milestone%3A1.9.0+is%3Aclosed\">This compatibility<!-- --><\/a> was implemented by Guillaume Ballet and P\u00e9ter Szil\u00e1gyi (we have even released a new <!-- --><a target=\"_blank\" rel=\"noopener\" class=\"chakra-link css-ug8vf0\" href=\"https:\/\/github.com\/karalabe\/usb\"><span class=\"chakra-text css-ons8vw\">usb<\/span><\/a> library for Go to facilitate support).<!-- --><\/p>\n<p><!-- --><\/p>\n<p class=\"chakra-text css-gi02ar\">The Trezor One procedure is slightly more intricate due to its unique PIN entry:<!-- --><\/p>\n<p><!-- -->&#8220;`html<\/p>\n<ul role=\"list\" class=\"css-1onhfjo\">\n<li class=\"css-cvpopp\">Connect your Trezor One; Geth will recognize it but will ask you to access it.<!-- --><\/li>\n<li class=\"css-cvpopp\">Execute <!-- --><span class=\"chakra-text css-ons8vw\">personal.openWallet(&#8216;trezor:\/\/&#8230;&#8217;)<\/span> using the device&#8217;s URL.<br \/>\n<!-- --><\/p>\n<ul role=\"list\" class=\"css-1onhfjo\">\n<li class=\"css-cvpopp\">If you are unaware of the URL, you can verify it using <!-- --><span class=\"chakra-text css-ons8vw\">personal_listWallets<\/span>.<!-- --><\/li>\n<li class=\"css-cvpopp\">The console will continuously prompt for PIN input and password as required.<!-- --><\/li>\n<li class=\"css-cvpopp\">When calling via RPC, <!-- --><span class=\"chakra-text css-ons8vw\">openWallet<\/span> provides a thorough error if another call is necessary.<!-- --><\/li>\n<\/ul>\n<p><!-- --><\/li>\n<li class=\"css-cvpopp\">You can enumerate all your accounts through personal.listWallets in the Geth console.<br \/>\n<!-- --><\/p>\n<ul role=\"list\" class=\"css-1onhfjo\">\n<li class=\"css-cvpopp\">This will automatically derive any accounts you have previously utilized plus 1 new empty account.<!-- --><\/li>\n<li class=\"css-cvpopp\">Alternatively, you can accomplish this through RPC using <!-- --><span class=\"chakra-text css-ons8vw\">personal_listWallets<\/span>.<!-- --><\/li>\n<\/ul>\n<p><!-- --><\/li>\n<li class=\"css-cvpopp\">Conduct transactions through your method of choice, and Geth will relay the signing request to the Trezor.<!-- --><\/li>\n<\/ul>\n<p><!-- --><\/p>\n<p class=\"chakra-text css-gi02ar\">Along with enhanced support for the Trezor One, Geth v1.9.0 also brings direct support for the <!-- --><a target=\"_blank\" rel=\"noopener\" class=\"chakra-link css-ug8vf0\" href=\"https:\/\/shop.trezor.io\/product\/trezor-model-t\">Trezor Model T<!-- --><\/a>. The workflow with the Model T is somewhat more straightforward, as the PIN entry occurs on the device:<!-- --><\/p>\n<p><!-- --><\/p>\n<ul role=\"list\" class=\"css-1onhfjo\">\n<li class=\"css-cvpopp\">Plug in your Trezor Model T and unlock it using your PIN; Geth should identify it.<!-- --><\/li>\n<li class=\"css-cvpopp\">You can list all your accounts through <!-- --><span class=\"chakra-text css-ons8vw\">personal.listWallets<\/span> from the Geth console.<br \/>\n<!-- --><\/p>\n<ul role=\"list\" class=\"css-1onhfjo\">\n<li class=\"css-cvpopp\">This will automatically derive any accounts you have used before plus 1 new empty one.<!-- --><\/li>\n<li class=\"css-cvpopp\">You can alternatively achieve the same through RPC using <!-- --><span class=\"chakra-text css-ons8vw\">personal_listWallets<\/span>.<!-- --><\/li>\n<\/ul>\n<p><!-- --><\/li>\n<li class=\"css-cvpopp\">Perform transactions through your preferred method, and Geth will send the signing request to the Trezor.<!-- --><\/li>\n<\/ul>\n<p><!-- --><\/p>\n<p class=\"chakra-text css-gi02ar\"><em class=\"chakra-text css-0\">Linux users should note that you need to <!-- --><a target=\"_blank\" rel=\"noopener\" class=\"chakra-link css-ug8vf0\" href=\"https:\/\/wiki.trezor.io\/Udev_rules\">explicitly allow<!-- --><\/a> your user to access your Trezor wallet via <!-- --><span class=\"chakra-text css-ons8vw\">udev<\/span> rules!<!-- --><\/em><\/p>\n<p><!-- --><\/p>\n<h3 class=\"chakra-heading css-145upk7\" id=\"status-keycards\">Status keycards<!-- --><\/h3>\n<p><!-- --><\/p>\n<p class=\"chakra-text css-gi02ar\">Originally prototyped over a year ago, Geth v1.9.0 finally provides support for the <!-- --><a target=\"_blank\" rel=\"noopener\" class=\"chakra-link css-ug8vf0\" href=\"https:\/\/keycard.status.im\/\">Status keycard<!-- --><\/a>, a full HD hardware wallet built on Java SmartCards. Currently, the Status keycard can only be utilized through Geth via the PC\/SC daemon (installation is required) and through USB (the <!-- --><a target=\"_blank\" rel=\"noopener\" class=\"chakra-link css-ug8vf0\" href=\"https:\/\/www.pluss-id.com\/\">+iD<!-- --><\/a> serves as a good USB smartcard reader). This effort<!-- --><a target=\"_blank\" rel=\"noopener\" class=\"chakra-link css-ug8vf0\" href=\"https:\/\/github.com\/ethereum\/go-ethereum\/pulls?q=is%3Apr+scwallet+is%3Aclosed+milestone%3A1.9.0\">was heavily handled by Nick Johnson, initially integrated by P\u00e9ter Szil\u00e1gyi and completed by Guillaume Ballet (along with Andrea Franz and the rest of the Status team).<!-- --><\/p>\n<p><!-- --><\/p>\n<p class=\"chakra-text css-gi02ar\">If you possess an initialized Status keycard, the Geth process is:<!-- --><\/p>\n<p><!-- --><\/p>\n<ul role=\"list\" class=\"css-1onhfjo\">\n<li class=\"css-cvpopp\">Insert your Status keycard via a USB card reader.<!-- --><\/li>\n<li class=\"css-cvpopp\">Confirm the status of your card via <!-- --><span class=\"chakra-text css-ons8vw\">personal_listWallets<\/span>.<!-- --><\/li>\n<li class=\"css-cvpopp\">Authorize Geth to utilize the card using <!-- --><span class=\"chakra-text css-ons8vw\">personal.openWallet(&#8216;keycard:\/\/&#8230;&#8217;)<\/span>.<br \/>\n<!-- --><\/p>\n<ul role=\"list\" class=\"css-1onhfjo\">\n<li class=\"css-cvpopp\">Initially, Geth will request you to pair your card using the passphrase.<!-- --><\/li>\n<li class=\"css-cvpopp\">Under normal circumstances, Geth will require you to unlock your card with your PIN.<!-- --><\/li>\n<li class=\"css-cvpopp\">After too many incorrect PIN attempts, Geth will prompt you to reset your card with your PUK code.<!-- --><\/li>\n<li class=\"css-cvpopp\"><strong>After excessive wrong PUK entries, your card will be rendered unusable, and reinstallation will be necessary.<!-- --><\/strong><\/li>\n<li class=\"css-cvpopp\">As an alternative, you can also perform the same procedure via RPC with multiple <!-- --><span class=\"chakra-text css-ons8vw\">personal_openWallet()<\/span>.<!-- --><\/li>\n<\/ul>\n<p><!-- --><\/li>\n<li class=\"css-cvpopp\">Engage in transactions through your chosen method, and Geth will transfer the signing request to the Status keycard.<!-- --><\/li>\n<\/ul>\n<p><!-- --><\/p>\n<p class=\"chakra-text css-gi02ar\">If you lack a pre-initialized Status keycard or are utilizing a developer card or have somehow rendered your existing card unusable (we\u2019re developers, we <!-- --><strong>must<!-- --><\/strong> understand the outcomes in such cases), you can follow our <!-- --><a target=\"_blank\" rel=\"noopener\" class=\"chakra-link css-ug8vf0\" href=\"https:\/\/github.com\/ethereum\/go-ethereum\/blob\/master\/accounts\/scwallet\/README.md\">technical guide<!-- --><\/a> for instructions on how to erase your keycard and reset it. <!-- --><strong>Note that wiping it will result in the loss of your private key.<!-- --><\/strong><\/p>\n<p><!-- --><\/p>\n<h2 class=\"chakra-heading css-1w54o5f\" id=\"clef\">Clef<!-- --><\/h2>\n<p><!-- --><\/p>\n<p class=\"chakra-text css-gi02ar\"><em class=\"chakra-text css-0\">Wallets, wallets everywhere!<!-- --><\/em><\/p>\n<p><!-- --><\/p>\n<p class=\"chakra-text css-gi02ar\">Upon Ethereum&#8217;s launch in 2015, there were no external tools available, which compelled client implementations to become comprehensive all-in-one solutions. This included everything from peer-to-peer networking to account management as well as contract and user interactions, all handled by the client. Although necessary, this was quite inefficient: accounts and networking do not securely integrate, and having all functionality within a single binary obstructs the creation of a modular ecosystem.<!-- --><\/p>\n<p><!-- --><\/p>\n<p class=\"chakra-text css-gi02ar\">We have aimed to address this for a minimum of two years, and Geth v1.9.0 ultimately delivers the <!-- --><a target=\"_blank\" rel=\"noopener\" class=\"chakra-link css-ug8vf0\" href=\"https:\/\/github.com\/ethereum\/go-ethereum\/pulls?q=is%3Apr+clef+is%3Aclosed\">contribution<!-- --><\/a> of Martin Holst Swende (supported by many others): a standalone signer for the <!-- --><strong>whole<!-- --><\/strong> Ethereum ecosystem named <!-- --><strong>Clef<!-- --><\/strong>. While &#8220;standalone signer&#8221; may sound simple, Clef is the culmination of extensive architectural work to ensure it is secure, adaptable, and composable.<!-- --><\/p>\n<p><!-- --><\/p>\n<p class=\"chakra-text css-gi02ar\">A brief release blog post alone cannot do justice to this project, but we will attempt to highlight the key features of Clef, the rationale behind the design, and the potential for new use cases.<!-- --><\/p>\n<p><!-- --><\/p>\n<h3 class=\"chakra-heading css-145upk7\" id=\"ecosystem-composability\">Ecosystem composability<!-- --><\/h3>\n<p><!-- --><\/p>\n<p class=\"chakra-text css-gi02ar\">The primary motivation for the development of Clef was to detach account management from Geth (there\u2019s no need to worry, the previous method will continue to function for the foreseeable future). This enables Geth to act as an &#8220;insecure&#8221; network gateway into Ethereum, potentially resolving many<br \/>\n&#8220;`many problems concerning unintentionally revealing accounts through RPC (and unlocking them, the lethal combination).<!-- --><\/p>\n<p><!-- --><\/p>\n<p class=\"chakra-text css-gi02ar\">However, monopolizing all this effort for Geth would not be fair to us. Instead, we crafted Clef to be utilized by various programs, enabling you to have a single signer <!-- --><strong>securely<!-- --><\/strong> managing your keys, to which any number of applications (e.g. Geth, Parity, Trinity, Metamask, MyCrypto, Augur) can transmit signing requests!<!-- --><\/p>\n<p><!-- --><\/p>\n<p class=\"chakra-text css-gi02ar\">To realize this, Clef offers a minimal <!-- --><a target=\"_blank\" rel=\"noopener\" class=\"chakra-link css-ug8vf0\" href=\"https:\/\/github.com\/ethereum\/go-ethereum\/tree\/master\/cmd\/clef#external-api-1\">external API<!-- --><\/a> (<!-- --><a target=\"_blank\" rel=\"noopener\" class=\"chakra-link css-ug8vf0\" href=\"https:\/\/github.com\/ethereum\/go-ethereum\/blob\/master\/cmd\/clef\/extapi_changelog.md\">changelog<!-- --><\/a>) available via IPC (default) or HTTP. Any application that can access these endpoints (e.g. Geth via IPC, Metamask via HTTP) is capable of sending <!-- --><strong>signing requests<!-- --><\/strong> to Clef, which will then ask the user for manual approval. The API is intentionally minimal and utilizes JSON-RPC, making it easy to support in any project.<!-- --><\/p>\n<p><!-- --><\/p>\n<p class=\"chakra-text css-gi02ar\">Our aspiration with Clef is not to solely be <!-- --><em class=\"chakra-text css-0\">&#8220;The Geth Signer&#8221;<!-- --><\/em>, but rather to evolve into a standalone entity usable by any other project, whether distinct client implementations (Trinity), browser integrations (Metamask), service components (Raiden) or decentralized applications (Augur). <!-- --><strong>If you wish to integrate Clef, contact us and we&#8217;ll HELP!<!-- --><\/strong><\/p>\n<p><!-- --><\/p>\n<h3 class=\"chakra-heading css-145upk7\" id=\"pluggable-interface\">Pluggable interface<!-- --><\/h3>\n<p><!-- --><\/p>\n<p class=\"chakra-text css-gi02ar\"><em class=\"chakra-text css-0\">What constitutes the ideal user interface?<!-- --><\/em><\/p>\n<p><!-- --><\/p>\n<p class=\"chakra-text css-gi02ar\">If you posed this question to me, I&#8217;d assert <!-- --><em class=\"chakra-text css-0\">command line<!-- --><\/em>: straightforward, operates over SSH, and I can script it :D. However, I represent a minority here and even I frequently prefer a proper UI. So, <!-- --><em class=\"chakra-text css-0\">Electron<!-- --><\/em>? Some consider it the greatest innovation since sliced bread, and numerous developers can create it; but it\u2019s bulky and slow and JavaScript :P. What about <!-- --><em class=\"chakra-text css-0\">Qt<!-- --><\/em>? It\u2019s platform-agnostic, compact, and efficient, but only a few developers are versed in it and it has an unusual license. Android, GTK, iThingy?&#8230; Win32 \ud83d\ude02?<!-- --><\/p>\n<p><!-- --><\/p>\n<p class=\"chakra-text css-gi02ar\">The answer is <!-- --><strong>all of them<!-- --><\/strong>! The ideal UI depends on your intended use, and we don\u2019t want to dictate that decision for you, but rather enable you to operate Clef in the manner that best integrates into your life:<!-- --><\/p>\n<p><!-- --><\/p>\n<ul role=\"list\" class=\"css-1onhfjo\">\n<li class=\"css-cvpopp\">If you are constantly on the move, you might prefer an Android or iOS interface.<!-- --><\/li>\n<li class=\"css-cvpopp\">If you own a secured remote server, you may favor CLI over SSH.<!-- --><\/li>\n<li class=\"css-cvpopp\">If you possess a powerful laptop, the allure of Electron might be just what you need.<!-- --><\/li>\n<li class=\"css-cvpopp\">If you have an offline signing machine, a Qt UI might be simple yet sufficient.<!-- --><\/li>\n<li class=\"css-cvpopp\">If you are a financial institution, you may require a custom integration into your infrastructure.<!-- --><\/li>\n<\/ul>\n<p><!-- --><\/p>\n<p class=\"chakra-text css-gi02ar\">We can&#8217;t realize all these options. But you can! We&#8217;ve designed Clef with sufficient adaptability to permit anyone to create a custom UI on top, without needing to alter Clef itself, or possess any knowledge of Go. The aim is to provide a foundation to the community so that designers and UI developers can excel in their craft, without needing to concern themselves with cryptography and related complexities.<!-- --><\/p>\n<p><!-- --><\/p>\n<p class=\"chakra-text css-gi02ar\">In order to accomplish this, Clef provides an expanded <!-- --><a target=\"_blank\" rel=\"noopener\" class=\"chakra-link css-ug8vf0\" href=\"https:\/\/github.com\/ethereum\/go-ethereum\/tree\/master\/cmd\/clef#ui-api\">internal API<!-- --><\/a> (<!-- --><a target=\"_blank\" rel=\"noopener\" class=\"chakra-link css-ug8vf0\" href=\"https:\/\/github.com\/ethereum\/go-ethereum\/blob\/master\/cmd\/clef\/intapi_changelog.md\">changelog<!-- --><\/a>), <!-- --><strong>solely<!-- --><\/strong> through standard input\/output. Any user interface is designed to initiate itself and internally start an instance of Clef, binding to its IO streams. The IO streams communicate using JSON-RPC, allowing the UI to send arbitrary <!-- --><strong>trusted<!-- --><\/strong> requests to Clef, and Clef will push notifications and confirmation prompts to the UI.<!-- --><\/p>\n<p><!-- --><\/p>\n<p class=\"chakra-text css-gi02ar\">Clef itself comes equipped with a built-in CLI interface (otherwise it wouldn\u2019t be particularly useful) and we&#8217;ve created a comprehensive <!-- --><a target=\"_blank\" rel=\"noopener\" class=\"chakra-link css-ug8vf0\" href=\"https:\/\/github.com\/ethereum\/go-ethereum\/blob\/master\/cmd\/clef\/tutorial.md\">Quickstart Guide<!-- --><\/a> to help you familiarize yourself with the overall features and concepts. Additionally, there are several <!-- --><a target=\"_blank\" rel=\"noopener\" class=\"chakra-link css-ug8vf0\" href=\"https:\/\/github.com\/ethereum\/go-ethereum\/tree\/master\/cmd\/clef#ui-implementations\">proof-of-concept UIs<!-- --><\/a> that we&#8217;ve used to validate architectural choices, but to achieve a robust UI, we need the community\u2019s help, as we lack the expertise ourselves!<!-- --><\/p>\n<p><!-- --><\/p>\n<h3 class=\"chakra-heading css-145upk7\" id=\"integrated-4bytes\">Integrated 4bytes<!-- --><\/h3>\n<p><!-- --><\/p>\n<p class=\"chakra-text css-gi02ar\">By now, you likely grasp the general aim. We intend for Clef to be a reusable component of the puzzle. The challenge is to ensure it\u2019s the right size! Too much functionality integrated (e.g. fixed UI) restricts potential uses. Too little (e.g. absence of hardware wallet) forces UI developers to reinvent the wheel. It\u2019s a delicate balance between maximizing utility and security without sacrificing flexibility.<!-- --><\/p>\n<p><!-- --><\/p>\n<p class=\"chakra-text css-gi02ar\">Thus, we concur that &#8220;fixed UI is undesirable, pluggable UI is favorable,&#8221; &#8220;absence of hardware wallet is bad, Ledger + Trezor + Keycard is advantageous.&#8221; What else do wallet implementations frequently reinvent? <!-- --><a target=\"_blank\" rel=\"noopener\" class=\"chakra-link css-ug8vf0\" href=\"https:\/\/www.4byte.directory\/\"><strong>4bytes<!-- --><\/strong><\/a>!<!-- --><\/p>\n<p><!-- --><\/p>\n<p class=\"chakra-text css-gi02ar\">In Ethereum, whenever a user interacts with a contract, they transmit a large blob of binary data, encoded in a very specific <!-- --><a target=\"_blank\" rel=\"noopener\" class=\"chakra-link css-ug8vf0\" href=\"https:\/\/solidity.readthedocs.io\/en\/latest\/abi-spec.html\">ABI format<!-- --><\/a>. This is necessary for the EVM to interpret it properly, and obviously, this is generated by some program (e.g. Augur). The problem arises when the user is then asked to confirm a transaction that resembles this:<!-- --><\/p>\n<p><!-- --><\/p>\n<p class=\"chakra-text css-gi02ar\"><img decoding=\"async\" alt=\"abi\" src=\"https:\/\/blog.ethereum.org\/images\/posts\/abi.png\" class=\"chakra-image css-hw6q2r\"\/><\/p>\n<p><!-- --><\/p>\n<p class=\"chakra-text css-gi02ar\">The solution proposed by the Ethereum community was to compile a <!-- --><span class=\"chakra-text css-ons8vw\">4byte<\/span> database, allowing users to look at the first 4 bytes of that data to infer what the remainder of the data represents, thus providing a meaningful overview of what they are about to approve (images above and below credited to Etherscan).<!-- --><\/p>\n<p><!-- --><\/p>\n<p class=\"chakra-text css-gi02ar\"><img decoding=\"async\" alt=\"4byte\" src=\"https:\/\/blog.ethereum.org\/images\/posts\/4byte.png\" class=\"chakra-image css-hw6q2r\"\/><\/p>\n<p><!-- --><\/p>\n<p class=\"chakra-text css-gi02ar\">At present, all Ethereum wallet UIs are reinventing the wheel regarding 4bytes integration! The database is public, yet the integrations are bespoke. Clef includes the entire 4byte database embedded within itself,and each time a transaction occurs, it decodes the calldata behind the scenes. Clef not only transmits the decoded call to the interface but also incorporates warning alerts if the data fails to align with the method signature! Clef will manage Ethereum; you can concentrate on the interface!<!-- --><\/p>\n<p><!-- --><\/p>\n<h3 class=\"chakra-heading css-145upk7\" id=\"programmatic-rules\">Programmatic guidelines<!-- --><\/h3>\n<p><!-- --><\/p>\n<p class=\"chakra-text css-gi02ar\">Clef appears fantastic, what else could we desire? Well&#8230; drawing from the preceding segments, we\u2019re capable of creating the ideal signer to approve any and every one of our transactions&#8230; manually. What occurs, though, if we wish to automate part of that (e.g. Clique signer, Raiden relay, Swarm exchange, etc.)? We <!-- --><em class=\"chakra-text css-0\">could<!-- --><\/em> simply disregard it and permit the interface to resolve it&#8230; but then we&#8217;re back to square one, as all wrapping interfaces need to recreate the same systems, and many will likely do so insecurely.<!-- --><\/p>\n<p><!-- --><\/p>\n<p class=\"chakra-text css-gi02ar\">Clef addresses this through an encrypted key-value repository and a clever rule engine! Instead of asking the user to confirm each request via a passphrase input, we can authorize Clef to sign on our behalf by saving our passphrase in its encrypted vault. This would enable passwordless signing but still necessitates manual approval!<!-- --><\/p>\n<p><!-- --><\/p>\n<p class=\"chakra-text css-gi02ar\">As an additional step, we can also supply Clef with a JavaScript <!-- --><a target=\"_blank\" rel=\"noopener\" class=\"chakra-link css-ug8vf0\" href=\"https:\/\/github.com\/ethereum\/go-ethereum\/blob\/master\/cmd\/clef\/rules.md\">rule file<!-- --><\/a>, which will execute whenever a request is received and can decide to auto-approve, auto-deny, or send the request for manual confirmation. The JavaScript rules have access to the full request and can also save arbitrary information in a key-value store for durability. For instance, an academic demonstration rule file:<!-- --><\/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-js\" 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 class=\"token\" style=\"color:rgb(127, 219, 202)\">function<!-- --><\/span><span> <!-- --><\/span><span class=\"token maybe-class-name\" style=\"color:rgb(130, 170, 255)\">ApproveSignData<!-- --><\/span><span class=\"token\" style=\"color:rgb(199, 146, 234)\">(<!-- --><\/span><span class=\"token parameter\">req<!-- --><\/span><span class=\"token\" style=\"color:rgb(199, 146, 234)\">)<!-- --><\/span><span> <!-- --><\/span><span class=\"token\" style=\"color:rgb(199, 146, 234)\">{<!-- --><\/span><span>\n<!-- --><\/span><span>  <!-- --><\/span><span class=\"token control-flow\" style=\"color:rgb(127, 219, 202)\">if<!-- --><\/span><span> <!-- --><\/span><span class=\"token\" style=\"color:rgb(199, 146, 234)\">(<!-- --><\/span><span>req<!-- --><\/span><span class=\"token\" style=\"color:rgb(199, 146, 234)\">.<!-- --><\/span><span class=\"token property-access\">address<!-- --><\/span><span class=\"token\" style=\"color:rgb(199, 146, 234)\">.<!-- --><\/span><span class=\"token method property-access\" style=\"color:rgb(130, 170, 255)\">toLowerCase<!-- --><\/span><span class=\"token\" style=\"color:rgb(199, 146, 234)\">(<!-- --><\/span><span class=\"token\" style=\"color:rgb(199, 146, 234)\">)<!-- --><\/span><span> <!-- --><\/span><span class=\"token\" style=\"color:rgb(127, 219, 202)\">==<!-- --><\/span><span> <!-- --><\/span><span class=\"token\" style=\"color:rgb(173, 219, 103)\">'0xd9c9cd5f6779558b6e0ed4e6acf6b1947e7fa1f3'<!-- --><\/span><span class=\"token\" style=\"color:rgb(199, 146, 234)\">)<!-- --><\/span><span> <!-- --><\/span><span class=\"token\" style=\"color:rgb(199, 146, 234)\">{<!-- --><\/span><span>\n<!-- --><\/span><span>    <!-- --><\/span><span class=\"token control-flow\" style=\"color:rgb(127, 219, 202)\">if<!-- --><\/span><span> <!-- --><\/span><span class=\"token\" style=\"color:rgb(199, 146, 234)\">(<!-- --><\/span><span>req<!-- --><\/span><span class=\"token\" style=\"color:rgb(199, 146, 234)\">.<!-- --><\/span><span class=\"token property-access\">messages<!-- --><\/span><span class=\"token\" style=\"color:rgb(199, 146, 234)\">[<!-- --><\/span><span class=\"token\" style=\"color:rgb(247, 140, 108)\">0<!-- --><\/span><span class=\"token\" style=\"color:rgb(199, 146, 234)\">]<!-- --><\/span><span class=\"token\" style=\"color:rgb(199, 146, 234)\">.<!-- --><\/span><span class=\"token property-access\">value<!-- --><\/span><span class=\"token\" style=\"color:rgb(199, 146, 234)\">.<!-- --><\/span><span class=\"token method property-access\" style=\"color:rgb(130, 170, 255)\">indexOf<!-- --><\/span><span class=\"token\" style=\"color:rgb(199, 146, 234)\">(<!-- --><\/span><span class=\"token\" style=\"color:rgb(173, 219, 103)\">'bazonk'<!-- --><\/span><span class=\"token\" style=\"color:rgb(199, 146, 234)\">)<!-- --><\/span><span> <!-- --><\/span><span class=\"token\" style=\"color:rgb(127, 219, 202)\">&gt;=<!-- --><\/span><span> <!-- --><\/span><span class=\"token\" style=\"color:rgb(247, 140, 108)\">0<!-- --><\/span><span class=\"token\" style=\"color:rgb(199, 146, 234)\">)<!-- --><\/span><span> <!-- --><\/span><span class=\"token\" style=\"color:rgb(199, 146, 234)\">{<!-- --><\/span><span>\n<!-- --><\/span><span>      <!-- --><\/span><span class=\"token control-flow\" style=\"color:rgb(127, 219, 202)\">return<!-- --><\/span><span> <!-- --><\/span><span class=\"token\" style=\"color:rgb(173, 219, 103)\">'Approve'<!-- --><\/span><span class=\"token\" style=\"color:rgb(199, 146, 234)\">;<!-- --><\/span><span>\n<!-- --><\/span><span>    <!-- --><\/span><span class=\"token\" style=\"color:rgb(199, 146, 234)\">}<!-- --><\/span><span>\n<!-- --><\/span><span>    <!-- --><\/span><span class=\"token control-flow\" style=\"color:rgb(127, 219, 202)\">return<!-- --><\/span><span> <!-- --><\/span><span class=\"token\" style=\"color:rgb(173, 219, 103)\">'Reject'<!-- --><\/span><span class=\"token\" style=\"color:rgb(199, 146, 234)\">;<!-- --><\/span><span>\n<!-- --><\/span><span>  <!-- --><\/span><span class=\"token\" style=\"color:rgb(199, 146, 234)\">}<!-- --><\/span><span>\n<!-- --><\/span><span>  <!-- --><\/span><span class=\"token\" style=\"color:rgb(99, 119, 119);font-style:italic\">\/\/ Otherwise goes to manual processing<!-- --><\/span><span>\n<!-- --><\/span><span\/><span class=\"token\" style=\"color:rgb(199, 146, 234)\">}<!-- --><\/span><span>\n<!-- --><\/span><\/code><\/pre>\n<\/div>\n<p><!-- --><\/p>\n<p class=\"chakra-text css-gi02ar\">The aim of these regulations is to enable you to establish arbitrary approval logic for whatever your requirements may be, whether that\u2019s automated server-side transactions (Clique, Raiden, Swarm, Faucet) or minor client-side automation (approve X Wei \/ 24h to Augur). The programmable regulations guarantee that Clef stays true to its promise of composability, allowing anyone to construct their ideal integration on top.<!-- --><\/p>\n<p><!-- --><\/p>\n<p class=\"chakra-text css-gi02ar\"><em class=\"chakra-text css-0\">For a thorough demonstration on how to configure automatic rules, please refer to the Clef <!-- --><a target=\"_blank\" rel=\"noopener\" class=\"chakra-link css-ug8vf0\" href=\"https:\/\/github.com\/ethereum\/go-ethereum\/blob\/master\/cmd\/clef\/tutorial.md\">Quickstart Guide<!-- --><\/a>.<!-- --><\/em><\/p>\n<p><!-- --><\/p>\n<h2 class=\"chakra-heading css-1w54o5f\" id=\"light-clients\">Light clients<!-- --><\/h2>\n<p><!-- --><\/p>\n<p class=\"chakra-text css-gi02ar\">Light clients are challenging and they complicate everything more than it needs to be. The primary reason is more philosophical than technical: the best aspects in life are free, and the secondbest are inexpensive. In Ethereum client terminology, the <!-- --><em class=\"chakra-text css-0\">&#8220;best&#8221;<!-- --><\/em> clients are those functioning with zero overhead (consider Metamask, Infura), while the next tier consists of the light clients.<!-- --><\/p>\n<p><!-- --><\/p>\n<p class=\"chakra-text css-gi02ar\">The issue lies in the fact that relying on trusted servers contradicts the foundational principles of the project, but light clients tend to be excessively demanding for devices with limited resources (ethash drains your phone&#8217;s battery). Geth v1.9.0 introduces a novel mode for light clients, referred to as an <!-- --><a target=\"_blank\" rel=\"noopener\" class=\"chakra-link css-ug8vf0\" href=\"https:\/\/hackmd.io\/@GMFZzCl1SH6s2lX25nC15A\/HJy7jjZpm?type=view\"><em class=\"chakra-text css-0\">ultra light client<!-- --><\/em><\/a>. This mode aims to find a balance on the security spectrum between a trusted server and a light server, substituting PoW verification with digital signatures from a majority of trusted servers.<!-- --><\/p>\n<p><!-- --><\/p>\n<p class=\"chakra-text css-gi02ar\">With a sufficient number of signatures from independent entities, one could attain adequate security for non-critical DApps. That being said, ultra light client mode is not intended for the typical node, but rather for projects looking to integrate Geth into their own processes. This <!-- --><a target=\"_blank\" rel=\"noopener\" class=\"chakra-link css-ug8vf0\" href=\"https:\/\/github.com\/ethereum\/go-ethereum\/pull\/16904\">effort<!-- --><\/a> was led by Boris Petrov and Status.<!-- --><\/p>\n<p><!-- --><\/p>\n<h3 class=\"chakra-heading css-145upk7\" id=\"checkpoint-oracle\">Checkpoint oracle<!-- --><\/h3>\n<p><!-- --><\/p>\n<p class=\"chakra-text css-gi02ar\">Light clients are sneaky little shortcuts! Instead of downloading and authenticating each header from the genesis to the chain head, they utilize a hardcoded checkpoint (included within Geth) as an initial reference point. Naturally, this checkpoint holds all necessary information to cryptographically validate even older headers, ensuring that security is not compromised.<!-- --><\/p>\n<p><!-- --><\/p>\n<p class=\"chakra-text css-gi02ar\">Nevertheless, as advantageous as the embedded checkpoints can be, they possess certain limitations:<!-- --><\/p>\n<p><!-- --><\/p>\n<ul role=\"list\" class=\"css-1onhfjo\">\n<li class=\"css-cvpopp\">Since the checkpoints are hardcoded within our release binaries, older versions will always commence synchronization from an earlier block. This is acceptable for a few months, but eventually, it becomes tedious. You can certainly update Geth to retrieve a new checkpoint, but that will also introduce all our behavioral changes, which you may prefer to avoid for various reasons.<!-- --><\/li>\n<li class=\"css-cvpopp\">Given that these checkpoints are incorporated into the code, you are out of options if you wish to support them in your own private network. You would need to either distribute a modified Geth, or configure the checkpoints through a configuration file, issuing a <!-- --><strong>new<!-- --><\/strong> one each time you update the checkpoint. It\u2019s feasible, but not particularly practical for the long term.<!-- --><\/li>\n<\/ul>\n<p><!-- --><\/p>\n<p class=\"chakra-text css-gi02ar\">This is where Gary Rong&#8217;s and Zsolt Felf\u00f6ldi&#8217;s <!-- --><a target=\"_blank\" rel=\"noopener\" class=\"chakra-link css-ug8vf0\" href=\"https:\/\/github.com\/ethereum\/go-ethereum\/pull\/19543\">contribution<!-- --><\/a> comes into play. Geth v1.9.0 incorporates support for an on-chain checkpoint oracle. Rather than depending on hard-coded checkpoints, light clients can connect with <!-- --><strong>untrusted<!-- --><\/strong> remote light servers (peer-to-peer, without any centralized nonsense) and request them to return an updated checkpoint stored within an on-chain smart contract. The most impressive aspect is that light clients can cryptographically validate that the returned data was signed by the required number of authorized signers!<!-- --><\/p>\n<p><!-- --><\/p>\n<p class=\"chakra-text css-gi02ar\">But wait, how does a light client determine who is authorized to sign an on-chain checkpoint? For networks natively supported, Geth includes hard-coded checkpoint oracle addresses and lists of authorized signers (thus trusting the same developers who provide Geth itself). For private networks, the oracle parameters can be defined via a configuration file.<!-- --><\/p>\n<p><!-- --><\/p>\n<p class=\"chakra-text css-gi02ar\">Although the old and new checkpoint systems appear similar (both necessitate hardcoded data in Geth or a configuration file), the new checkpoint oracle only needs to be configured <!-- --><strong>once<!-- --><\/strong> and can then be used indefinitely to release new checkpoints.<!-- --><\/p>\n<p><!-- --><\/p>\n<h4 class=\"chakra-heading css-1u9mv6z\" id=\"checkpoint-admin\"><span class=\"chakra-text css-ons8vw\">checkpoint-admin<\/span><\/h4>\n<p><!-- --><\/p>\n<p class=\"chakra-text css-gi02ar\">Ethereum contracts are formidable, but engaging with them is not for the timid. Our checkpoint oracle contract is especially challenging, because a) it goes to great lengths to maintain security even amidst chain reorganizations; and b) it must support the sharing and verification of checkpoints for clients that are not yet synced.<!-- --><\/p>\n<p><!-- --><\/p>\n<p class=\"chakra-text css-gi02ar\">As we do not anticipate anyone (ourselves included) to manually interact with the checkpoint oracle, Geth v1.9.0 also includes an administrative tool specifically for this contract, <!-- --><span class=\"chakra-text css-ons8vw\">checkpoint-admin<\/span>. <!-- --><em class=\"chakra-text css-0\">Keep in mind, you only need to concern yourself with this if you intend to operate your own checkpoint oracle for your private network.<!-- --><\/em><\/p>\n<p><!-- --><\/p>\n<p class=\"chakra-text css-gi02ar\">The <!-- --><span class=\"chakra-text css-ons8vw\">checkpoint-admin<\/span> can be utilized to inquire about the status of an already deployed contract (<!-- --><span class=\"chakra-text css-ons8vw\">&#8211;rpc<\/span> must target either a light node or a full node with <!-- --><span class=\"chakra-text css-ons8vw\">&#8211;lightserv<\/span> enabled, both exposing the <!-- --><span class=\"chakra-text css-ons8vw\">les<\/span> RCP API namespace):<!-- --><\/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>$ checkpoint-admin --rpc ~\/.ethereum\/rinkeby\/geth.ipc status\n<!-- --><\/span><span>Oracle <!-- --><\/span><span class=\"token\" style=\"color:rgb(127, 219, 202)\">=<!-- --><\/span><span class=\"token\" style=\"color:rgb(127, 219, 202)\">&gt;<!-- --><\/span><span> 0xebe8eFA441B9302A0d7eaECc277c09d20D684540\n<!-- --><\/span>\n<!-- --><span>Admin <!-- --><\/span><span class=\"token\" style=\"color:rgb(247, 140, 108)\">1<!-- --><\/span><span> <!-- --><\/span><span class=\"token\" style=\"color:rgb(127, 219, 202)\">=<!-- --><\/span><span class=\"token\" style=\"color:rgb(127, 219, 202)\">&gt;<!-- --><\/span><span> 0xD9C9Cd5f6779558b6e0eD4e6Acf6b1947E7fA1F3\n<!-- --><\/span><span>Admin <!-- --><\/span><span class=\"token\" style=\"color:rgb(247, 140, 108)\">2<!-- --><\/span><span> <!-- --><\/span><span class=\"token\" style=\"color:rgb(127, 219, 202)\">=<!-- --><\/span><span class=\"token\" style=\"color:rgb(127, 219, 202)\">&gt;<!-- --><\/span><span> 0x78d1aD571A1A09D60D9BBf25894b44e4C8859595\n<!-- --><\/span><span>Admin <!-- --><\/span><span class=\"token\" style=\"color:rgb(247, 140, 108)\">3<!-- --><\/span><span> <!-- --><\/span><span class=\"token\" style=\"color:rgb(127, 219, 202)\">=<!-- --><\/span><span class=\"token\" style=\"color:rgb(127, 219, 202)\">&gt;<!-- --><\/span><span> 0x286834935f4A8Cfb4FF4C77D5770C2775aE2b0E7\n<!-- --><\/span><span>Admin <!-- --><\/span><span class=\"token\" style=\"color:rgb(247, 140, 108)\">4<!-- --><\/span><span><!-- --><\/span><span class=\"token\" style=\"color:rgb(127, 219, 202)\">=<!-- --><\/span><span class=\"token\" style=\"color:rgb(127, 219, 202)\">&gt;<!-- --><\/span><span> 0xb86e2B0Ab5A4B1373e40c51A7C712c70Ba2f9f8E\n<!-- --><\/span>\n<!-- --><span>Checkpoint <!-- --><\/span><span class=\"token\" style=\"color:rgb(199, 146, 234)\">(<!-- --><\/span><span>released at <!-- --><\/span><span class=\"token\" style=\"color:rgb(99, 119, 119);font-style:italic\">#4638418) 140 =&gt; 0x488c2eba92d31baeccfb6968fad5c21a3df93181b43b4cf253b4d572b64172ef<!-- --><\/span><span>\n<!-- --><\/span><\/code><\/pre>\n<\/div>\n<p><!-- --><\/p>\n<p class=\"chakra-text css-gi02ar\">The admin command may also be utilized to <!-- --><em class=\"chakra-text css-0\">install<!-- --><\/em> a new oracle, <!-- --><em class=\"chakra-text css-0\">verify<!-- --><\/em> an upgraded checkpoint and <!-- --><em class=\"chakra-text css-0\">distribute<!-- --><\/em> it within the network. Moreover, <!-- --><span class=\"chakra-text css-ons8vw\">checkpoint-admin<\/span> also functions in offline mode (without a live chain to provide information) and can additionally be supported by <!-- --><span class=\"chakra-text css-ons8vw\">clef<\/span> for signing instead of utilizing key files, but elaborating on all these is meant for another occasion.<!-- --><\/p>\n<p><!-- --><\/p>\n<h2 class=\"chakra-heading css-1w54o5f\" id=\"monitoring\">Monitoring<!-- --><\/h2>\n<p><!-- --><\/p>\n<p class=\"chakra-text css-gi02ar\">This is possibly something that not many were aware of, but for quite some time, Geth has incorporated support for monitoring various subsystems and events. Naturally, the <!-- --><a target=\"_blank\" rel=\"noopener\" class=\"chakra-link css-ug8vf0\" href=\"https:\/\/github.com\/ethereum\/go-ethereum\/pull\/1321\">initial version<!-- --><\/a> was rather rudimentary \ud83e\udd23 (text UI, RPC reporting), but it laid the foundation. We can achieve more than this!<!-- --><\/p>\n<p><!-- --><\/p>\n<p class=\"chakra-text css-gi02ar\"><img decoding=\"async\" alt=\"Monitor\" src=\"https:\/\/blog.ethereum.org\/images\/posts\/monitor.png\" class=\"chakra-image css-hw6q2r\"\/><\/p>\n<p><!-- --><\/p>\n<h3 class=\"chakra-heading css-145upk7\" id=\"metrics-collection\">Metrics collection<!-- --><\/h3>\n<p><!-- --><\/p>\n<p class=\"chakra-text css-gi02ar\">First things first, metrics must be collected before they can be exported and visualized. Geth can be directed to gather all its established metrics using the <!-- --><span class=\"chakra-text css-ons8vw\">&#8211;metrics<\/span> CLI flag. To make these readings available to the external environment, Geth v1.9.0 offers 3 independent systems: <!-- --><a target=\"_blank\" rel=\"noopener\" class=\"chakra-link css-ug8vf0\" href=\"https:\/\/golang.org\/pkg\/expvar\/\">ExpVars<!-- --><\/a>, <!-- --><a target=\"_blank\" rel=\"noopener\" class=\"chakra-link css-ug8vf0\" href=\"https:\/\/www.influxdata.com\/products\/influxdb-overview\/\">InfluxDB<!-- --><\/a> and <!-- --><a target=\"_blank\" rel=\"noopener\" class=\"chakra-link css-ug8vf0\" href=\"https:\/\/prometheus.io\/\">Prometheus<!-- --><\/a>.<!-- --><\/p>\n<p><!-- --><\/p>\n<p class=\"chakra-text css-gi02ar\"><a target=\"_blank\" rel=\"noopener\" class=\"chakra-link css-ug8vf0\" href=\"https:\/\/golang.org\/pkg\/expvar\/\">ExpVars<!-- --><\/a> represent a somewhat customized approach in the Go ecosystem for exposing public variables on an HTTP interface. Geth employs its debug <!-- --><span class=\"chakra-text css-ons8vw\">pprof<\/span> endpoint for this purpose. Operating Geth with <!-- --><span class=\"chakra-text css-ons8vw\">&#8211;metrics &#8211;pprof<\/span> will unveil the metrics in <!-- --><span class=\"chakra-text css-ons8vw\">expvar<\/span> format at <!-- --><span class=\"chakra-text css-ons8vw\">http:\/\/127.0.0.1:6060\/debug\/metrics<\/span>. <!-- --><strong>Keep in mind, you should never expose the <!-- --><span class=\"chakra-text css-ons8vw\">pprof<\/span> HTTP endpoint to the public internet as it may trigger resource-heavy operations!<!-- --><\/strong><\/p>\n<p><!-- --><\/p>\n<p class=\"chakra-text css-gi02ar\">ExpVars are relatively well-supported within the Go ecosystem, yet they do not represent the industry standard. A comparable mechanism, but with a more standardized format, is the <!-- --><a target=\"_blank\" rel=\"noopener\" class=\"chakra-link css-ug8vf0\" href=\"https:\/\/prometheus.io\/\">Prometheus<!-- --><\/a> endpoint. Executing Geth with <!-- --><span class=\"chakra-text css-ons8vw\">&#8211;metrics &#8211;pprof<\/span> will also reveal this format at <!-- --><span class=\"chakra-text css-ons8vw\">http:\/\/127.0.0.1:6060\/debug\/metrics\/prometheus<\/span>. <!-- --><strong>Again, please refrain from exposing the <!-- --><span class=\"chakra-text css-ons8vw\">pprof<\/span> HTTP endpoint to the public internet!<!-- --><\/strong> Acknowledgements to Maxim Krasilnikov for <!-- --><a target=\"_blank\" rel=\"noopener\" class=\"chakra-link css-ug8vf0\" href=\"https:\/\/github.com\/ethereum\/go-ethereum\/pull\/17077\">adding<!-- --><\/a> this functionality.<!-- --><\/p>\n<p><!-- --><\/p>\n<p class=\"chakra-text css-gi02ar\">While ExpVars and Prometheus are <!-- --><em class=\"chakra-text css-0\">pull<!-- --><\/em> based monitoring systems (remote servers pull the data from Geth), we also accommodate <!-- --><em class=\"chakra-text css-0\">push<!-- --><\/em> based monitoring through <!-- --><a target=\"_blank\" rel=\"noopener\" class=\"chakra-link css-ug8vf0\" href=\"https:\/\/www.influxdata.com\/products\/influxdb-overview\/\">InfluxDB<!-- --><\/a> (Geth sends the data to remote servers). This capability requires several CLI flags to be configured to establish the database connection (server, database, username, password, and Geth instance tag). Please refer to the <!-- --><span class=\"chakra-text css-ons8vw\">METRICS AND STATS OPTIONS<\/span> section of <!-- --><span class=\"chakra-text css-ons8vw\">geth help<\/span> for specifics (<!-- --><span class=\"chakra-text css-ons8vw\">&#8211;metrics.influxdb<\/span> and subflags). <!-- --><a target=\"_blank\" rel=\"noopener\" class=\"chakra-link css-ug8vf0\" href=\"https:\/\/github.com\/ethereum\/go-ethereum\/pulls?q=is%3Apr+is%3Aclosed+influxdb+author%3Anonsense\">This initiative<!-- --><\/a> was carried out by Anton Evangelatov.<!-- --><\/p>\n<p><!-- --><\/p>\n<h3 class=\"chakra-heading css-145upk7\" id=\"metrics-visualization\">Metrics visualization<!-- --><\/h3>\n<p><!-- --><\/p>\n<p class=\"chakra-text css-gi02ar\">Visualizing metrics can prove to be somewhat challenging as you need to choose a charting tool\/service and invest considerable efforts into configuring all the hosts, charts, and dashboards.<!-- --><\/p>\n<p><!-- --><\/p>\n<p class=\"chakra-text css-gi02ar\">We ourselves utilize <!-- --><a target=\"_blank\" rel=\"noopener\" class=\"chakra-link css-ug8vf0\" href=\"https:\/\/www.datadoghq.com\/\">Datadog<!-- --><\/a> internally and have been consistently refining our monitoring dashboards ever since we set them up 1.5 years ago. If you are currently employing Datadog or contemplating doing so, here\u2019s a sneak peek of what you can create based on the metrics offered by Geth (this is the dashboard through which we evaluate PRs against the master branch):<!-- --><\/p>\n<p><!-- --><\/p>\n<p class=\"chakra-text css-gi02ar\"><img decoding=\"async\" alt=\"datadog\" src=\"https:\/\/blog.ethereum.org\/images\/posts\/datadog.png\" class=\"chakra-image css-hw6q2r\"\/><\/p>\n<p><!-- --><\/p>\n<p class=\"chakra-text css-gi02ar\">Unfortunately, Datadog does not permit sharing dashboards with external parties (since those depend on how the monitored machines have been configured). Hence, we cannot readily share the aforementioned work with you, but we did export a <!-- --><a target=\"_blank\" rel=\"noopener\" class=\"chakra-link css-ug8vf0\" href=\"https:\/\/gist.github.com\/karalabe\/7798e3ffb3c7da2e908d7de88935c2b4\">JSON dump<!-- --><\/a> of it in case anyone wishes to follow in our path!<!-- --><\/p>\n<p><!-- --><\/p>\n<p class=\"chakra-text css-gi02ar\">Of course, we also recognize that a paid service like Datadog might not always be ideal, especially if you are just beginning and do not have funds to expend on monitoring. An excellent no-cost monitoring tool is <!-- --><a target=\"_blank\" rel=\"noopener\" class=\"chakra-link css-ug8vf0\" href=\"https:\/\/grafana.com\/\">Grafana<!-- --><\/a>!<!-- --><\/p>\n<p><!-- --><\/p>\n<p class=\"chakra-text css-gi02ar\">Maxim Krasilnikov created a Grafana dashboard <!-- --><a target=\"_blank\" rel=\"noopener\" class=\"chakra-link css-ug8vf0\" href=\"https:\/\/github.com\/chapsuk\/geth-prometheus\">some time ago<!-- --><\/a> against an earlier developmentversion of Geth. We integrated his remarkable work with the metrics we became fond of in Datadog, resulting in a considerable amount of <!-- --><a target=\"_blank\" rel=\"noopener\" class=\"chakra-link css-ug8vf0\" href=\"https:\/\/github.com\/ethereum\/go-ethereum\/pull\/19692\">additional effort<!-- --><\/a> on Geth. The ultimate outcome, however, is impressive (anticipate more updates in upcoming releases):<!-- --><\/p>\n<p><!-- --><\/p>\n<p class=\"chakra-text css-gi02ar\"><img decoding=\"async\" alt=\"grafana\" src=\"https:\/\/blog.ethereum.org\/images\/posts\/grafana.png\" class=\"chakra-image css-hw6q2r\"\/><\/p>\n<p><!-- --><\/p>\n<p class=\"chakra-text css-gi02ar\">You can easily recreate the aforementioned graphs using <!-- --><a target=\"_blank\" rel=\"noopener\" class=\"chakra-link css-ug8vf0\" href=\"https:\/\/github.com\/karalabe\/geth-prometheus\">my version<!-- --><\/a> of Maxim Krasilnikov&#8217;s project by executing <!-- --><span class=\"chakra-text css-ons8vw\">docker-compose up<\/span> at the repository&#8217;s root and accessing <!-- --><span class=\"chakra-text css-ons8vw\">http:\/\/localhost:3000<\/span> with the <!-- --><span class=\"chakra-text css-ons8vw\">admin\/admin<\/span> credentials. Alternatively, you can explore <!-- --><a target=\"_blank\" rel=\"noopener\" class=\"chakra-link css-ug8vf0\" href=\"https:\/\/snapshot.raintank.io\/dashboard\/snapshot\/fdZDK5EBa65M5x6ZkvnpdJXS1BqIZGb7\">my test snapshot<!-- --><\/a> on Raintank or import <!-- --><a target=\"_blank\" rel=\"noopener\" class=\"chakra-link css-ug8vf0\" href=\"https:\/\/gist.github.com\/karalabe\/e7ca79abdec54755ceae09c08bd090cd\">this dashboard<!-- --><\/a> into your own Grafana instance<!-- --><\/p>\n<p><!-- --><\/p>\n<h2 class=\"chakra-heading css-1w54o5f\" id=\"puppeth-explorer\">Puppeth explorer<!-- --><\/h2>\n<p><!-- --><\/p>\n<p class=\"chakra-text css-gi02ar\">Once upon a time in a distant place, Puppeth saw the first illumination (specifically, in Mexico, nearly two years ago). If you haven&#8217;t heard about it, &#8220;Puppeth is a utility to assist you in constructing a new Ethereum network all the way to the genesis block, bootnodes, signers, ethstats, faucet, wallet, explorer, and dashboard&#8221;. Initially developed to support the deployment and maintenance of the Rinkeby testnet, it has since been utilized by various groups for other private networks as well.<!-- --><\/p>\n<p><!-- --><\/p>\n<p class=\"chakra-text css-gi02ar\">Puppeth is not intended for managing a high-value production network, but it has demonstrated enough resilience to keep Rinkeby relevant for over two years! If you&#8217;re interested in a more in-depth exploration of Puppeth, <!-- --><a target=\"_blank\" rel=\"noopener\" class=\"chakra-link css-ug8vf0\" href=\"https:\/\/www.youtube.com\/watch?v=T5RcjYPTG9g\">here&#8217;s my presentation<!-- --><\/a> from a while back. In this article, however, let&#8217;s concentrate on what&#8217;s new!<!-- --><\/p>\n<p><!-- --><\/p>\n<p class=\"chakra-text css-gi02ar\">Puppeth is incredible! It has enabled you since day one to deploy a fully functioning Ethereum network across multiple machines, enriched with a stats page for maintenance, along with a faucet and a dashboard to facilitate user onboarding. Nonetheless, Puppeth was deficient in a reliable block explorer, as the only options back then were <!-- --><a target=\"_blank\" rel=\"noopener\" class=\"chakra-link css-ug8vf0\" href=\"https:\/\/etherscan.io\/\">Etherscan<!-- --><\/a> and <!-- --><a target=\"_blank\" rel=\"noopener\" class=\"chakra-link css-ug8vf0\" href=\"https:\/\/www.etherchain.org\/\">Etherchain<!-- --><\/a>, both of which were closed-source. We did implement a basic solution, but it was somewhat <!-- --><em class=\"chakra-text css-0\">unremarkable<!-- --><\/em>&#8230;<!-- --><\/p>\n<p><!-- --><\/p>\n<p class=\"chakra-text css-gi02ar\">With the introduction of <!-- --><a target=\"_blank\" rel=\"noopener\" class=\"chakra-link css-ug8vf0\" href=\"https:\/\/blockscout.com\/\">Blockscout<!-- --><\/a> late last year, everything transformed! The Ethereum community finally acquired a genuine, open-source block explorer, thanks to the <!-- --><a target=\"_blank\" rel=\"noopener\" class=\"chakra-link css-ug8vf0\" href=\"https:\/\/poa.network\/\">POA Network<!-- --><\/a> team. While Blockscout still has some ground to cover compared to the established players, it is undeniably an incredibly useful tool. Therefore, Geth v1.9.0 includes a preliminary integration of Blockscout into Puppeth, addressing a significant gap in our private network deployment tool!<!-- --><\/p>\n<p><!-- --><\/p>\n<p class=\"chakra-text css-gi02ar\"><img decoding=\"async\" alt=\"blockscout\" src=\"https:\/\/blog.ethereum.org\/images\/posts\/blockscout.png\" class=\"chakra-image css-hw6q2r\"\/><\/p>\n<p><!-- --><\/p>\n<p class=\"chakra-text css-gi02ar\">This <!-- --><a target=\"_blank\" rel=\"noopener\" class=\"chakra-link css-ug8vf0\" href=\"https:\/\/github.com\/ethereum\/go-ethereum\/pull\/18261\">initiative<!-- --><\/a> was led by Gary Rong, but a significant recognition goes to Ayrat Badykov for his assistance in resolving issues, inquiries, and more.<!-- --><\/p>\n<p><!-- --><\/p>\n<p class=\"chakra-text css-gi02ar\"><em class=\"chakra-text css-0\">Please be aware that we foresee the initial integration to be rough (e.g., due to a <!-- --><a target=\"_blank\" rel=\"noopener\" class=\"chakra-link css-ug8vf0\" href=\"https:\/\/github.com\/poanetwork\/blockscout\/issues\/2308\">&#8220;bug&#8221;<!-- --><\/a> in Blockscout, the Puppeth explorer must fully sync a Geth archive node prior to launching the explorer web interface). Feel free to test it, run it, and report any concerns, but don&#8217;t be taken aback if it goes offline at 3 AM!<!-- --><\/em><\/p>\n<p><!-- --><\/p>\n<h2 class=\"chakra-heading css-1w54o5f\" id=\"discovery-protocol\">Discovery protocol<!-- --><\/h2>\n<p><!-- --><\/p>\n<p class=\"chakra-text css-gi02ar\">Now, here lies another remnant of legacy infrastructure! Besides a minuscule modification, Ethereum&#8217;s <!-- --><a target=\"_blank\" rel=\"noopener\" class=\"chakra-link css-ug8vf0\" href=\"https:\/\/github.com\/ethereum\/devp2p\/blob\/master\/discv4.md\">discovery protocol<!-- --><\/a> has been specified, implemented, and set in stone for practically eternity. For those curious about the discovery protocol, it&#8217;s the apparatus through which a new node can identify other Ethereum nodes on the internet and join them into a global peer-to-peer network.<!-- --><\/p>\n<p><!-- --><\/p>\n<p class=\"chakra-text css-gi02ar\"><em class=\"chakra-text css-0\">So&#8230; what&#8217;s the issue then? Hasn&#8217;t it functioned adequately until now? If it ain\u2019t broke, don&#8217;t fix it and all that?<!-- --><\/em><\/p>\n<p><!-- --><\/p>\n<p class=\"chakra-text css-gi02ar\">Well, Ethereum&#8217;s original discovery protocol was designed for a different era, a time when there was solely one chain, when private networks were nonexistent, and when every node in the network was an archive node. We have outgrown these simplistic beliefs, which, while a success story, also presents new challenges:<!-- --><\/p>\n<p><!-- --><\/p>\n<ul role=\"list\" class=\"css-1onhfjo\">\n<li class=\"css-cvpopp\">The Ethereum ecosystem today comprises numerous public, private, and test networks. Although the Ethereum mainnet consists of a multitude of machines, other networks tend to be much smaller (e.g., G\u00f6rli testnet). The discovery protocol does not make any distinctions among these networks, leading to a continual trial and error process of locating unknown peers, connecting to them, and then realizing they are on a different network.<!-- --><\/li>\n<li class=\"css-cvpopp\">The same original Ethereum network can end up dividing itself into several disconnected fragments, where participants might want to join one part or another. Ethereum Classic serves as one of the key examples here, but similar challenges arise each time a network upgrade (hard fork) occurs, and some nodes update late. Without details about the network&#8217;s rules, we revert to trial and error connectivity, which is computationally very costly.<!-- --><\/li>\n<li class=\"css-cvpopp\">Even if all nodes belong to the same network and adhere to the same fork rules, there exists the potential for challenging peering: if there is connectivity asymmetry, where certain nodes depend on services provided by a limited subset of machines (i.e., light clients vs. light servers).<!-- --><\/li>\n<\/ul>\n<p><!-- --><\/p>\n<p class=\"chakra-text css-gi02ar\">For the long term, we&#8217;re striving towards a <!-- --><a target=\"_blank\" rel=\"noopener\" class=\"chakra-link css-ug8vf0\" href=\"https:\/\/github.com\/ethereum\/devp2p\/blob\/master\/discv5\/discv5.md\">completely fresh version<!-- --><\/a> of the discovery protocol. Geth&#8217;s light clients have been using a PoC version of this for a long time, but implementing such a significant alteration for the entire Ethereum network demands substantial time and careful attention. This initiative is primarily led by Felix Lange and Frank Szendzielarz in partnership with Andrei Maiboroda from Aleth\/C++, Antoine Toulme with Java, Age Manning from Lighthouse\/Rust, and Tomasz Sta\u0144czak from Nethermind\/C#.<!-- --><\/p>\n<p><!-- --><\/p>\n<h3 class=\"chakra-heading css-145upk7\" id=\"ethereum-node-records\">Ethereum Node Records<!-- --><\/h3>\n<p><!-- --><\/p>\n<p class=\"chakra-text css-gi02ar\">The preceding content was an extensive discussion about something we haven&#8217;t released! However, what we have released is the <!-- --><a target=\"_blank\" rel=\"noopener\" class=\"chakra-link css-ug8vf0\" href=\"http:\/\/eips.ethereum.org\/EIPS\/eip-778\">Ethereum Node Record (ENR)<!-- --><\/a> extension of the new discovery protocol, which can indeed <!-- --><a target=\"_blank\" rel=\"noopener\" class=\"chakra-link css-ug8vf0\" href=\"https:\/\/eips.ethereum.org\/EIPS\/eip-868\">operate on top of the previous protocol<!-- --><\/a> as well! An ENR is a small, 300-byte arbitrary key-value data structure that nodes can promote and inquire about through discovery. While the new discovery protocol will offer advanced methods for sharing these within the network, the old protocol can also directly query them.<!-- --><\/p>\n<p><!-- --><\/p>\n<p class=\"chakra-text css-gi02ar\">The immediate advantage is that nodes can promote extensive metadata about themselves without an expensive TCP + crypto handshake, enabling potential peers to filter out undesirable connections without ever initiating them! All credit goes to Felix Lange for his relentless contributions in this area!<!-- --><\/p>\n<p><!-- --><\/p>\n<p class=\"chakra-text css-gi02ar\"><em class=\"chakra-text css-0\">Alright, alright, we understand it&#8217;s advanced. But what is it actually good for, in simple terms?<!-- --><\/em><\/p>\n<p><!-- --><\/p>\n<p class=\"chakra-text css-gi02ar\">Geth v1.9.0 introduces two extensions to the discovery protocol through ENRs:<!-- --><\/p>\n<p><!-- --><\/p>\n<ul role=\"list\" class=\"css-1onhfjo\">\n<li class=\"css-cvpopp\">The current discovery protocol can only manage one type of IP address (IPv4 or IPv6). Since the majority of the internet still relies on IPv4, that&#8217;s what peers advertise and exchange with one another. Even though IPv6 is feasible, in reality you <!-- --><em class=\"chakra-text css-0\">cannot<!-- --><\/em> find such peers. Felix Lange&#8217;s <!-- --><a target=\"_blank\" rel=\"noopener\" class=\"chakra-link css-ug8vf0\" href=\"https:\/\/github.com\/ethereum\/go-ethereum\/pull\/19663\">contribution<!-- --><\/a> on advertising <!-- --><strong>both<!-- --><\/strong> IPv4 and IPv6 addresses via ENRs enables peers to discover and maintain Kademlia routing tables for both IP types. Although further integration work remains, we aspire to elevate IPv6 to a first-class citizen within Ethereum.<!-- --><\/li>\n<li class=\"css-cvpopp\">Locating a Rinkeby node today works similarly to connecting to random websites to determine whether they are Google or not. The discovery protocol retains a mix of internet addresses that use the Ethereum protocol, but otherwise has no information about which chain or forks they are associated with. The only method to find out is to connect and observe, which is a costly game of chance. P\u00e9ter Szil\u00e1gyi <!-- --><a target=\"_blank\" rel=\"noopener\" class=\"chakra-link css-ug8vf0\" href=\"http:\/\/eips.ethereum.org\/EIPS\/eip-2124\">proposed<!-- --><\/a> an extension to ENR that allows nodes to convey their chain configuration via the discovery protocol, creating a 0-RTT mechanism to reject clearly unwanted peers.<!-- --><\/li>\n<\/ul>\n<p><!-- --><\/p>\n<p class=\"chakra-text css-gi02ar\">However, the most impressive aspect of ENR &#8211; and its already implemented features &#8211; is that anyone can develop a UDP crawler to index Ethereum nodes without needing to establish a connection (most nodes won\u2019t have available slots; and crawlers that do connect via TCP consume valuable resources). Accessing all nodes, their IPs\/ports, capabilities, and chain configurations facilitates the development of a brand new <!-- --><a target=\"_blank\" rel=\"noopener\" class=\"chakra-link css-ug8vf0\" href=\"https:\/\/eips.ethereum.org\/EIPS\/eip-1459\">discovery protocol based on DNS<!-- --><\/a>, enabling nodes with blocked UDP ports (e.g., via Tor) to join the network as well!<!-- --><\/p>\n<p><!-- --><\/p>\n<h2 class=\"chakra-heading css-1w54o5f\" id=\"bootnodes\">Bootnodes<!-- --><\/h2>\n<p><!-- --><\/p>\n<p class=\"chakra-text css-gi02ar\">We have experienced a varying quantity of bootnodes of differing quality, managed by various individuals since the Frontier launch. Although it functioned reasonably, from a devops perspective it left much to be desired, especially regarding monitoring and maintenance. In conjunction with our Geth v1.9.0 release, we have chosen to establish a new set of bootnodes that are managed through Terraform and Ansible, and monitored with Datadog and Papertrail. We have also enabled them to support light clients, hopefully enhancing the reliability of the light protocol along the way. Huge thanks to Rafael Matias for his efforts on this!<!-- --><\/p>\n<p><!-- --><\/p>\n<p class=\"chakra-text css-gi02ar\">Our new collection of bootnodes is:<!-- --><\/p>\n<p><!-- --><\/p>\n<ul role=\"list\" class=\"css-1onhfjo\">\n<li class=\"css-cvpopp\"><span class=\"chakra-text css-ons8vw\">enode:\/\/d860a01f9722d78051619d1e2351aba3f43f943f6f00718d1b9baa4101932a1f5011f16bb2b1bb35db20d6fe28fa0bf09636d26a87d31de9ec6203eeedb1f666@18.138.108.67:30303<\/span> (Singapore, AWS)<!-- --><\/li>\n<li class=\"css-cvpopp\"><span class=\"chakra-text css-ons8vw\">enode:\/\/22a8232c3abc76a16ae9d6c3b164f98775fe226f0917b0ca871128a74a8e9630b458460865bab457221f1d448dd9791d24c4e5d88786180ac185df813a68d4de@3.209.45.79:30303<\/span> (Virginia, AWS)<!-- --><\/li>\n<li class=\"css-cvpopp\"><span class=\"chakra-text css-ons8vw\">enode:\/\/ca6de62fce278f96aea6ec5a2daadb877e51651247cb96ee310a318def462913b653963c155a0ef6c7d50048bba6e6cea881130857413d9f50a621546b590758@34.255.23.113:30303<\/span> (Ireland, AWS)<!-- --><\/li>\n<li class=\"css-cvpopp\"><span class=\"chakra-text css-ons8vw\">enode:\/\/279944d8dcd428dffaa7436f25ca0ca43ae19e7bcf94a8fb7d1641651f92d121e972ac2e8f381414b80cc8e5555811c2ec6e1a99bb009b3f53c4c69923e11bd8@35.158.244.151:30303<\/span> (Frankfurt, AWS)<!-- --><\/li>\n<li class=\"css-cvpopp\"><span class=\"chakra-text css-ons8vw\">enode:\/\/8499da03c47d637b20eee24eec3c356c9a2e6148d6fe25ca195c7949ab8ec2c03e3556126b0d7ed644675e78c4318b08691b7b57de10e5f0d40d05b09238fa0a@52.187.207.27:30303<\/span> (Australia, Azure)<!-- --><\/li>\n<li class=\"css-cvpopp\"><span class=\"chakra-text css-ons8vw\">enode:\/\/103858bdb88756c71f15e9b5e09b56dc1be52f0a5021d46301dbbfb7e130029cc9d0d6f73f693bc29b665770fff7da4d34f3c6379fe12721b5d7a0bcb5ca1fc1@191.234.162.198:30303<\/span> (Brazil, Azure)<!-- --><\/li>\n<li class=\"css-cvpopp\"><span class=\"chakra-text css-ons8vw\">enode:\/\/715171f50508aba88aecd1250af392a45a330af91d7b90701c436b618c86aaa1589c9184561907bebbb56439b8f8787bc01f49a7c77276c58c1b09822d75e8e8@52.231.165.108:30303<\/span> (South Korea, Azure)<!-- --><\/li>\n<li class=\"css-cvpopp\"><span class=\"chakra-text css-ons8vw\">enode:\/\/5d6d7cd20d6da4bb83a1d28cadb5d409b64edf314c0335df658c1a54e32c7c4a7ab7823d57c39b6a757556e68ff1df17c748b698544a55cb488b52479a92b60f@104.42.217.25:30303<\/span> (West US, Azure)<!-- --><\/li>\n<\/ul>\n<p><!-- --><\/p>\n<p class=\"chakra-text css-gi02ar\"><em class=\"chakra-text css-0\">Our previous bootnodes will continue to operate for the time being, but will gradually be phased out in the coming months.<!-- --><\/em><\/p>\n<p><!-- --><\/p>\n<h2 class=\"chakra-heading css-1w54o5f\" id=\"other-changes\">Other changes<!-- --><\/h2>\n<p><!-- --><\/p>\n<p class=\"chakra-text css-gi02ar\">In addition to all the remarkable features listed above, there are a few more significant changes that, while not large enough to constitute their own section, are nevertheless crucial enough to specifically mention.<!-- --><\/p>\n<p><!-- --><\/p>\n<p class=\"chakra-text css-gi02ar\">RPC APIs:<!-- --><\/p>\n<p><!-- --><\/p>\n<ul role=\"list\" class=\"css-1onhfjo\">\n<li class=\"css-cvpopp\">The origin verification on WebSocket connections (<!-- --><span class=\"chakra-text css-ons8vw\">&#8211;wsorigins<\/span>) is enforced solely when the <!-- --><span class=\"chakra-text css-ons8vw\">Origin<\/span> header is included. This facilitates establishing a connection to Geth from non-browser environments like Node.js, while restricting access to the RPC endpoint from random sites.<!-- --><\/li>\n<li class=\"css-cvpopp\">You can establish the maximum gas for <!-- --><span class=\"chakra-text css-ons8vw\">eth_call<\/span> through the <!-- --><span class=\"chakra-text css-ons8vw\">&#8211;rpc.gascap<\/span> command line parameter. This is advantageous if you&#8217;re exposing the JSON-RPC endpoint to the public Internet.<!-- --><\/li>\n<li class=\"css-cvpopp\">All RPC method calls are now recorded at the <!-- --><span class=\"chakra-text css-ons8vw\">debug<\/span> level. Methods that fail are logged as <!-- --><span class=\"chakra-text css-ons8vw\">warning<\/span>, ensuring you can always identify when something isn&#8217;t functioning correctly.<!-- --><\/li>\n<li class=\"css-cvpopp\">Geth v1.9.0 introduces support for the <!-- --><span class=\"chakra-text css-ons8vw\">eth_chainId<\/span> RPC method as outlined in <!-- --><a target=\"_blank\" rel=\"noopener\" class=\"chakra-link css-ug8vf0\" href=\"http:\/\/eips.ethereum.org\/EIPS\/eip-695\">EIP 695<!-- --><\/a>.<!-- --><\/li>\n<\/ul>\n<p><!-- --><\/p>\n<p class=\"chakra-text css-gi02ar\">Networking:<!-- --><\/p>\n<p><!-- --><\/p>\n<ul role=\"list\" class=\"css-1onhfjo\">\n<li class=\"css-cvpopp\">The default number of peers has been increased to 50, replacing the previous 25. This modification enhances synchronization performance.<!-- --><\/li>\n<li class=\"css-cvpopp\">A new CLI utility (<!-- --><span class=\"chakra-text css-ons8vw\">cmd\/devp2p<\/span>) has been introduced to the source repository for debugging P2P network problems. Although this tool isn&#8217;t included in the <!-- --><span class=\"chakra-text css-ons8vw\">alltools<\/span> archive yet, it is quite helpful in diagnosing peer discovery issues.<!-- --><\/li>\n<li class=\"css-cvpopp\">The P2P server now declines connections from IPs that attempt to connect too frequently.<!-- --><\/li>\n<\/ul>\n<p><!-- --><\/p>\n<p class=\"chakra-text css-gi02ar\">Miscellaneous:<!-- --><\/p>\n<p><!-- --><\/p>\n<ul role=\"list\" class=\"css-1onhfjo\">\n<li class=\"css-cvpopp\">Substantial efforts have been made to enhance the <!-- --><span class=\"chakra-text css-ons8vw\">abigen<\/span> tool. Go bindings now accommodate Solidity <!-- --><span class=\"chakra-text css-ons8vw\">struct<\/span> and function pointer arguments. Additionally, the Java generator has seen improvements. The mobile framework is now capable of creating deploy transactions.<!-- --><\/li>\n<li class=\"css-cvpopp\">Considerable portions of the <!-- --><span class=\"chakra-text css-ons8vw\">go-ethereum<\/span> repository can now be built without CGO. Huge thanks to Jeremy Schlatter for this contribution.<!-- --><\/li>\n<\/ul>\n<p><!-- --><\/p>\n<h2 class=\"chakra-heading css-1w54o5f\" id=\"compatibility\">Compatibility<!-- --><\/h2>\n<p><!-- --><\/p>\n<p class=\"chakra-text css-gi02ar\">While Go Ethereum v1.9.0 introduces a remarkable array of enhancements, there are also a few backward-incompatible modifications. This segment outlines everything that has been altered or deprecated in the release:<!-- --><\/p>\n<p><!-- --><\/p>\n<ul role=\"list\" class=\"css-1onhfjo\">\n<li class=\"css-cvpopp\">Unlocking accounts via open HTTP, WebSocket, or GraphQL ports has been <!-- --><a target=\"_blank\" rel=\"noopener\" class=\"chakra-link css-ug8vf0\" href=\"https:\/\/github.com\/ethereum\/go-ethereum\/pull\/17037\">disallowed<!-- --><\/a> for security reasons. Advanced users can revert to the previous behavior using the <!-- --><span class=\"chakra-text css-ons8vw\">&#8211;allow-insecure-unlock<\/span> CLI flag at their own discretion.<!-- --><\/li>\n<li class=\"css-cvpopp\">The older Ubuntu Docker images and the <!-- --><strong>previous (monolithic)<!-- --><\/strong> Alpine Docker images have been <!-- --><a target=\"_blank\" rel=\"noopener\" class=\"chakra-link css-ug8vf0\" href=\"https:\/\/github.com\/ethereum\/go-ethereum\/pull\/19164\">removed<!-- --><\/a> as they were deemed deprecated over a year ago. If you didn&#8217;t configure your cluster back in 2016, you likely used the slim Alpine images and remain secure.<!-- --><\/li>\n<li class=\"css-cvpopp\">The original <!-- --><span class=\"chakra-text css-ons8vw\">geth monitor<\/span> CLI command was <!-- --><a target=\"_blank\" rel=\"noopener\" class=\"chakra-link css-ug8vf0\" href=\"https:\/\/github.com\/ethereum\/go-ethereum\/pull\/19399\">removed<!-- --><\/a> along with its associated <!-- --><span class=\"chakra-text css-ons8vw\">debug_metrics<\/span> RPC API endpoint. Individuals who depend on monitoring should utilize the ExpVar, InfluxDB, or Prometheus metrics reporting along with Datadog or Grafana.<!-- --><\/li>\n<li class=\"css-cvpopp\">The <!-- --><span class=\"chakra-text css-ons8vw\">geth bug<\/span> CLI command has been <!-- --><a target=\"_blank\" rel=\"noopener\" class=\"chakra-link css-ug8vf0\" href=\"https:\/\/github.com\/ethereum\/go-ethereum\/pull\/19400\">removed<!-- --><\/a>, considered an unnecessary feature. If you encounter a bug, you can easily file an issue on our <!-- --><a target=\"_blank\" rel=\"noopener\" class=\"chakra-link css-ug8vf0\" href=\"https:\/\/github.com\/ethereum\/go-ethereum\/issues\">GitHub tracker<!-- --><\/a> and complete the template manually.<!-- --><\/li>\n<li class=\"css-cvpopp\">The <!-- --><a target=\"_blank\" rel=\"noopener\" class=\"chakra-link css-ug8vf0\" href=\"https:\/\/github.com\/ethereum\/go-ethereum\/pull\/19403\"><span class=\"chakra-text css-ons8vw\">les\/1<\/span><\/a> and <!-- --><span class=\"chakra-text css-ons8vw\">eth\/62<\/span> protocols have been eliminated. <!-- --><span class=\"chakra-text css-ons8vw\">les\/1<\/span> was only supported by Geth, and everyone on Constantinople already uses <!-- --><span class=\"chakra-text css-ons8vw\">les\/2<\/span>. Furthermore, <!-- --><span class=\"chakra-text css-ons8vw\">eth\/62<\/span> was deprecated even before Frontier, but remained for <!-- --><span class=\"chakra-text css-ons8vw\">cpp-ethereum<\/span>.<!-- --><\/li>\n<li class=\"css-cvpopp\">Google+ authentication has been <!-- --><a target=\"_blank\" rel=\"noopener\" class=\"chakra-link css-ug8vf0\" href=\"https:\/\/github.com\/ethereum\/go-ethereum\/pull\/19539\">removed<!-- --><\/a> from the Puppeth faucet due to Google discontinuing its social network in early April 2019.<!-- --><\/li>\n<li class=\"css-cvpopp\">The Ledger HD wallet derivation path has been <!-- --><a target=\"_blank\" rel=\"noopener\" class=\"chakra-link css-ug8vf0\" href=\"https:\/\/github.com\/ethereum\/go-ethereum\/pull\/19438\">updated<!-- --><\/a> from the original legacy path to the canonical ecosystem path. <!-- --><strong>Accounts from the previous paths can still be detected.<!-- --><\/strong><\/li>\n<li class=\"css-cvpopp\">The default cache limit is <!-- --><a class=\"chakra-link css-ug8vf0\" href=\"\">determined dynamically<!-- --><\/a> according to the network and synchronization modes. Mainnet full nodes default to 4GB, test networks and private networks to 1GB, while light clients default to 128MB. Explicit <!-- --><span class=\"chakra-text css-ons8vw\">&#8211;cache<\/span> settings are obviously respected.<!-- --><\/li>\n<li class=\"css-cvpopp\">The PoW computation in Whisper v6 was incompatible with Parity as it did not fully comply with the specification. This has been <!-- --><a target=\"_blank\" rel=\"noopener\" class=\"chakra-link css-ug8vf0\" href=\"https:\/\/github.com\/ethereum\/go-ethereum\/pull\/19753\">fixed<!-- --><\/a>, but it also indicates that Whisped v6, included with Geth v1.9.0, is not compatible with earlier versions.<!-- --><\/li>\n<li class=\"css-cvpopp\">The <!-- --><span class=\"chakra-text css-ons8vw\">&#8211;lightserv<\/span> and <!-- --><span class=\"chakra-text css-ons8vw\">&#8211;lightpeers<\/span> flags have been <!-- --><a target=\"_blank\" rel=\"noopener\" class=\"chakra-link css-ug8vf0\" href=\"https:\/\/github.com\/ethereum\/go-ethereum\/pull\/19818\">renamed<!-- --><\/a> to <!-- --><span class=\"chakra-text css-ons8vw\">&#8211;light.serve<\/span> and <!-- --><span class=\"chakra-text css-ons8vw\">&#8211;light.maxpeers<\/span>, respectively. The original versions are now deprecated but will function for the next year or so.<!-- --><\/li>\n<li class=\"css-cvpopp\">The default data directory on Windows is now sourced from the <!-- --><span class=\"chakra-text css-ons8vw\">LocalAppData<\/span> environment variable. However, the previous location in <!-- --><span class=\"chakra-text css-ons8vw\">$HOME\/AppData\/Roaming<\/span> remains recognized. This location adjustment works better with Cygwin and configurations using remote user accounts.<!-- --><\/li>\n<li class=\"css-cvpopp\">The JSON-RPC server has undergone a rewrite and now enables bi-directional communication. You can define method handlers on the client side using the <!-- --><span class=\"chakra-text css-ons8vw\">rpc.Client.RegisterName<\/span> method. Though we performed extensive testing, there might be compatibility challenges with the new server. Please report any RPC issues that arise.<!-- --><\/li>\n<\/ul>\n<p><!-- --><\/p>\n<h2 class=\"chakra-heading css-1w54o5f\" id=\"epilogue\">Epilogue<!-- --><\/h2>\n<p><!-- --><\/p>\n<p class=\"chakra-text css-gi02ar\">We take great pride in this release! It took significantly longer than anticipated, but we aimed to bundle all the major changes to reduce unexpected challenges (upgrade issues); and to finalize the APIs of new features to avoid future disruptions. We hope you, too, will discover something valuable among our delivered <!-- --><a target=\"_blank\" rel=\"noopener\" class=\"chakra-link css-ug8vf0\" href=\"https:\/\/github.com\/ethereum\/go-ethereum\/milestone\/61?closed=1\">~370 changes<!-- --><\/a>.<!-- --><\/p>\n<p><!-- --><\/p>\n<p class=\"chakra-text css-gi02ar\">As with all our earlier releases, you can locate the:<!-- --><\/p>\n<p><!-- --><br \/>\n<!-- --><\/p>\n<p class=\"chakra-text css-gi02ar\">And as a final note before wrapping up (better safe than sorry):<!-- --><\/p>\n<p><!-- --><\/p>\n<p class=\"chakra-text css-gi02ar\"><strong>Warning: We\u2019ve done our utmost to eliminate all bugs, but as with any major release, we advise everyone to proceed with caution while upgrading. The v1.9.0 release includes changes to the database schema, making it impossible to revert once updated. We also recommend a fresh fast sync, as it can significantly decrease the database size.<!-- --><\/strong><\/p>\n<\/div>\n<p><br \/>\n<br \/><a href=\"https:\/\/blog.ethereum.org\/en\/2019\/07\/10\/geth-v1-9-0\">Source link <\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>After several months of quiet, we are thrilled to announce the v1.9.0 launch of Go Ethereum! While this version has been in development for considerably longer than we expected, we believe there will be some exciting features for all to appreciate! Caution: We have made every effort to eliminate all issues, but as with all<\/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":[1109],"class_list":["post-8052","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-9-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>Geth 1.9.0: Unveiling the Latest Features and Enhancements - 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\/02\/02\/geth-1-9-0-unveiling-the-latest-features-and-enhancements\/\" \/>\n<meta property=\"og:locale\" content=\"it_IT\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Geth 1.9.0: Unveiling the Latest Features and Enhancements - WSJ-Crypto\" \/>\n<meta property=\"og:description\" content=\"After several months of quiet, we are thrilled to announce the v1.9.0 launch of Go Ethereum! While this version has been in development for considerably longer than we expected, we believe there will be some exciting features for all to appreciate! Caution: We have made every effort to eliminate all issues, but as with all\" \/>\n<meta property=\"og:url\" content=\"https:\/\/wsj-crypto.com\/index.php\/2025\/02\/02\/geth-1-9-0-unveiling-the-latest-features-and-enhancements\/\" \/>\n<meta property=\"og:site_name\" content=\"WSJ-Crypto\" \/>\n<meta property=\"article:published_time\" content=\"2025-02-02T03:36: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=\"39 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\/02\/02\/geth-1-9-0-unveiling-the-latest-features-and-enhancements\/\",\"url\":\"https:\/\/wsj-crypto.com\/index.php\/2025\/02\/02\/geth-1-9-0-unveiling-the-latest-features-and-enhancements\/\",\"name\":\"Geth 1.9.0: Unveiling the Latest Features and Enhancements - WSJ-Crypto\",\"isPartOf\":{\"@id\":\"https:\/\/wsj-crypto.com\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/wsj-crypto.com\/index.php\/2025\/02\/02\/geth-1-9-0-unveiling-the-latest-features-and-enhancements\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/wsj-crypto.com\/index.php\/2025\/02\/02\/geth-1-9-0-unveiling-the-latest-features-and-enhancements\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/wsj-crypto.com\/wp-content\/uploads\/2025\/01\/eth-org.jpeg\",\"datePublished\":\"2025-02-02T03:36:33+00:00\",\"author\":{\"@id\":\"https:\/\/wsj-crypto.com\/#\/schema\/person\/88a93723b30416db1a352d5a0096c4a7\"},\"breadcrumb\":{\"@id\":\"https:\/\/wsj-crypto.com\/index.php\/2025\/02\/02\/geth-1-9-0-unveiling-the-latest-features-and-enhancements\/#breadcrumb\"},\"inLanguage\":\"it-IT\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/wsj-crypto.com\/index.php\/2025\/02\/02\/geth-1-9-0-unveiling-the-latest-features-and-enhancements\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"it-IT\",\"@id\":\"https:\/\/wsj-crypto.com\/index.php\/2025\/02\/02\/geth-1-9-0-unveiling-the-latest-features-and-enhancements\/#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\/02\/02\/geth-1-9-0-unveiling-the-latest-features-and-enhancements\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/wsj-crypto.com\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Geth 1.9.0: Unveiling the Latest Features and Enhancements\"}]},{\"@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":"Geth 1.9.0: Unveiling the Latest Features and Enhancements - 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\/02\/02\/geth-1-9-0-unveiling-the-latest-features-and-enhancements\/","og_locale":"it_IT","og_type":"article","og_title":"Geth 1.9.0: Unveiling the Latest Features and Enhancements - WSJ-Crypto","og_description":"After several months of quiet, we are thrilled to announce the v1.9.0 launch of Go Ethereum! While this version has been in development for considerably longer than we expected, we believe there will be some exciting features for all to appreciate! Caution: We have made every effort to eliminate all issues, but as with all","og_url":"https:\/\/wsj-crypto.com\/index.php\/2025\/02\/02\/geth-1-9-0-unveiling-the-latest-features-and-enhancements\/","og_site_name":"WSJ-Crypto","article_published_time":"2025-02-02T03:36: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":"39 minuti"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/wsj-crypto.com\/index.php\/2025\/02\/02\/geth-1-9-0-unveiling-the-latest-features-and-enhancements\/","url":"https:\/\/wsj-crypto.com\/index.php\/2025\/02\/02\/geth-1-9-0-unveiling-the-latest-features-and-enhancements\/","name":"Geth 1.9.0: Unveiling the Latest Features and Enhancements - WSJ-Crypto","isPartOf":{"@id":"https:\/\/wsj-crypto.com\/#website"},"primaryImageOfPage":{"@id":"https:\/\/wsj-crypto.com\/index.php\/2025\/02\/02\/geth-1-9-0-unveiling-the-latest-features-and-enhancements\/#primaryimage"},"image":{"@id":"https:\/\/wsj-crypto.com\/index.php\/2025\/02\/02\/geth-1-9-0-unveiling-the-latest-features-and-enhancements\/#primaryimage"},"thumbnailUrl":"https:\/\/wsj-crypto.com\/wp-content\/uploads\/2025\/01\/eth-org.jpeg","datePublished":"2025-02-02T03:36:33+00:00","author":{"@id":"https:\/\/wsj-crypto.com\/#\/schema\/person\/88a93723b30416db1a352d5a0096c4a7"},"breadcrumb":{"@id":"https:\/\/wsj-crypto.com\/index.php\/2025\/02\/02\/geth-1-9-0-unveiling-the-latest-features-and-enhancements\/#breadcrumb"},"inLanguage":"it-IT","potentialAction":[{"@type":"ReadAction","target":["https:\/\/wsj-crypto.com\/index.php\/2025\/02\/02\/geth-1-9-0-unveiling-the-latest-features-and-enhancements\/"]}]},{"@type":"ImageObject","inLanguage":"it-IT","@id":"https:\/\/wsj-crypto.com\/index.php\/2025\/02\/02\/geth-1-9-0-unveiling-the-latest-features-and-enhancements\/#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\/02\/02\/geth-1-9-0-unveiling-the-latest-features-and-enhancements\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/wsj-crypto.com\/"},{"@type":"ListItem","position":2,"name":"Geth 1.9.0: Unveiling the Latest Features and Enhancements"}]},{"@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\/8052","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=8052"}],"version-history":[{"count":2,"href":"https:\/\/wsj-crypto.com\/index.php\/wp-json\/wp\/v2\/posts\/8052\/revisions"}],"predecessor-version":[{"id":8056,"href":"https:\/\/wsj-crypto.com\/index.php\/wp-json\/wp\/v2\/posts\/8052\/revisions\/8056"}],"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=8052"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wsj-crypto.com\/index.php\/wp-json\/wp\/v2\/categories?post=8052"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wsj-crypto.com\/index.php\/wp-json\/wp\/v2\/tags?post=8052"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}