From 8b94616495de2a578eb30c2b073aea0bce8db23b Mon Sep 17 00:00:00 2001 From: Joe Date: Fri, 15 Jul 2022 11:06:22 +0100 Subject: [PATCH 001/286] update page w pos-merge content --- src/content/energy-consumption/index.md | 50 +++++++++++++------------ 1 file changed, 26 insertions(+), 24 deletions(-) diff --git a/src/content/energy-consumption/index.md b/src/content/energy-consumption/index.md index d01475a0151..bd7b4bf0dae 100644 --- a/src/content/energy-consumption/index.md +++ b/src/content/energy-consumption/index.md @@ -7,50 +7,52 @@ sidebar: true # Ethereum energy consumption {#introduction} -Ethereum's energy consumption will be reduced by ~99.95% following [The Merge](/en/upgrades/merge) from proof-of-work (PoW) to proof-of-stake (PoS). After The Merge, Ethereum will use dramatically less carbon to be more secure. +Ethereum is a green blockchain. It uses a [proof-of-stake](/developers/docs/consensus-mechanisms/pos) consensus mechanism that +can be run on low-powered devices and does not require heavy computation to participate. Under Ethereum's proof-of-stake mechanism +the network is secured using staked Ether rather than expended energy (as in [proof-of-work](/developers/docs/consensus-mechanisms/pos)). This means the energy expended by the Etheruem network is very small - on the order of 0.01 TWhr/yr. -Since its inception, Ethereum has aimed to implement a proof-of-stake consensus mechanism, but doing this without sacrificing security and decentralization has taken years of focused research and development. Therefore, the network started by using proof-of-work consensus. Proof-of-work consensus requires miners to use their computing hardware to solve a puzzle. The solution to the puzzle proves that energy has been expended by the miner, demonstrating that they invested real-world value for the right to add to the blockchain. Both proof-of-work and proof-of-stake are just mechanisms to decide who gets to add the next block. Swapping proof-of-work for proof-of-stake, where the real-world value invested comes from ETH staked directly in a smart contract, removes the need for miners to burn energy to add to the blockchain. Therefore, the environmental cost of securing the network is drastically reduced. +## Proof-of-stake energy expenditure {#proof-of-stake-energy} -## The Merge {#the-merge} +The energy expenditure of Ethereum is roughly equal to the cost of running a modest laptop for each node on the network. -[The Beacon Chain](/upgrades/beacon-chain/) has been running the proof-of-stake since November 2020 alongside the proof-of-work Ethereum Mainnet. In 2022, Ethereum developers transitioned several **testing networks (testnets)** running proof-of-stake to proof-of-stake by merging with their own Beacon Chains. These helped client teams test the software before moving to longer-lived networks. After these testnets, Ethereum developers launched new testnets for the community to use (Kiln & Kintsugi) and ran multiple shadow forks of existing testnets and Mainnet. Now that these have stabilized, teams are moving to the final stages of testing: transitioning long-lived testnets (Ropsten, Goerli, Sepolia) to proof-of-stake. Merging Ethereum Mainnet with the Beacon Chain is expected to happen in the second half of 2022. At the moment of the merge, Ethereum's proof-of-work mining will be switched off, proof-of-stake consensus will take over, and the energy consumed by the network will drop to <0.05% of its pre-merge amount. +Many articles estimate "per-transaction" energy expenditure to compare blockchains to other industries. The benefit of this is that it is easy to understand, but the energy required to mine a block is independent of the number of transactions within it. A per transaction unit of energy expenditure implies that fewer transactions would lead to smaller energy expenditure and vice-versa, which is not the case. A per-transaction estimate is highly dependent upon how a blockchain's transaction throughput is defined, and tweaking this definition can be gamed to make the value seem larger or smaller. -## Why proof-of-stake is greener than proof-of-work {#why-pos-is-greener-than-pow} +For example, on Ethereum, the transaction throughput is not only that of the base layer - it is also the sum of the transaction throughput of all of its "[layer 2](/layer-2/)" rollups, which are not generally included in calculations and would drastically reduce them. This is one reason why tools that compare energy consumption per transaction across platforms are misleading. -Proof-of-work is a robust way to secure the network. Transactions on the Ethereum blockchain are validated by [miners](/developers/docs/consensus-mechanisms/pow/mining). Miners bundle together transactions into ordered blocks and add them to the Ethereum blockchain. The new blocks get broadcast to all the other node operators who run the transactions independently and verify that they are valid. Any dishonesty shows up as an inconsistency between different nodes. Honest blocks are added to the blockchain and become an immutable part of history. -The ability for any miner to add new blocks only works if there is a cost associated with mining and unpredictability about which specific node submits the next block. These conditions are met by imposing proof-of-work. To be eligible to submit a block of transactions, a miner must be the first to submit the solution to a computationally expensive puzzle. To successfully take control of the blockchain, a dishonest miner would have to consistently win the proof-of-work race by investing in sufficient hardware and energy to outperform the majority of other miners. +More relevant is the overall energy consumption and carbon footprint of the network as a whole. From those values, we can examine what that network offers to its users and society at large and make a more holistic evaluation of whether that energy expenditure is justified or not. Per transaction measurements, on the other hand, imply the value of the network only comes from its role in transferring crypto between accounts and prohibits an honest cost-benefit analysis. -This mechanism of securing the network is problematic for several reasons. First, miners can increase their odds of success by investing in more powerful hardware, creating conditions for an arms race with miners acquiring increasingly power-hungry mining equipment. This increases the network's energy consumption and generates hardware waste. Second, Ethereum's proof-of-work protocol currently has a total annualized power consumption approximately equal to that of Finland [^1] and a carbon footprint similar to Switzerland[^1]. +[Digiconomist provides whole-network energy consumption and carbon footprints for Bitcoin and Ethereum](https://digiconomist.net/ethereum-energy-consumption). At the time of writing this article, Bitcoin expends about 200 TWh/yr of energy and emits about 100 MT/yr C, while generating about 32,000 T of electrical waste from obsolete hardware annually. In comparison, the total energy expenditure for securing Ethereum is closer to **0.01 TWh/yr**. -Proof-of-stake uses validators instead of miners. Validators perform the same function as miners, except that instead of expending their assets up-front as energy expenditure, they stake ETH as collateral against dishonest behavior. This staked ETH can be destroyed if the validator misbehaves, with more severe penalties for more nefarious actions. This strongly incentivizes active and honest participation in securing the network without requiring large energy expenditure. Since almost all of the energy expended securing the proof-of-work network comes from the mining algorithm, switching to proof-of-stake dramatically reduces energy expenditure. There is also no benefit to be had by investing in more powerful hardware under proof-of-stake, so there is no arms-race condition and less electronic waste. Ethereum validators can run on typical laptops or low-power devices such as [Raspberry Pi](https://ethereum-on-arm-documentation.readthedocs.io/en/latest/user-guide/ethereum2.0.html). +![Comparison of energy expenditure across industries](./energy.png) -Read more on [how Ethereum implements proof-of-stake](/developers/docs/consensus-mechanisms/pos) and how it compares to proof-of-work. +The figure above shows the estimated annual energy consumption in TWh/yr for various industries (retrieved in June 2022). +_Note that the estimates presented in the plot are from publicly available sources that have been linked to in the text below. They are +illustrative and do not represent an official estimate, promise or forecast._ -## Proof-of-stake energy expenditure {#proof-of-stake-energy} +To put Ethereum's energy consumption in context, we can compare annualized estimates for other industries. Taking Ethereum to be a platform for securely holding digital assets as investments, perhaps we can compare to mining gold, which has been estimated to expend about [240 TWh/yr](https://www.kitco.com/news/2021-05-17/Gold-s-energy-consumption-doubles-that-of-bitcoin-Galaxy-Digital.html). As a digital payments platform we could perhaps compare to PayPal (estimated to consume about [0.26 TWh/yr](https://app.impaakt.com/analyses/paypal-consumed-264100-mwh-of-energy-in-2020-24-from-non-renewable-sources-27261)). As an entertainment platform we could perhaps compare to the gaming industry which has been estimated to expend about [34 TW/yr](https://www.researchgate.net/publication/336909520_Toward_Greener_Gaming_Estimating_National_Energy_Use_and_Energy_Efficiency_Potential). Estimates of energy consumption by Netflix range dramatically between [about 0.45TWhr/yr](https://s22.q4cdn.com/959853165/files/doc_downloads/2020/02/0220_Netflix_EnvironmentalSocialGovernanceReport_FINAL.pdf) (their own estimates reported in 2019) up to about 94 TWh/yr (as estimated by [Shift Project](https://theshiftproject.org/en/article/unsustainable-use-online-video/)) - there is some discussion about the assumptions underlying these estimates available on [Carbon Brief](https://www.carbonbrief.org/factcheck-what-is-the-carbon-footprint-of-streaming-video-on-netflix). Alternatively, Ethereum could be compared to Youtube which has been estimated to expend about [244 TWh/yr](https://thefactsource.com/how-much-electricity-does-youtube-use/), although these values depend a lot on the type of device videos are streamed on and the energy-efficiency of underlying infrastructure such as data centers. Estimates of Youtube's energy expenditure have been broken down by channel and individual videos. [Those estimates](https://thefactsource.com/how-much-electricity-does-youtube-use/) imply that people consumed 45 times more energy watching Gangnam Style in 2019 than proof-of-stake Ethereum uses in a year. -Estimates based on the current Beacon Chain suggest that The Merge to proof-of-stake could result in a 99.95% reduction in total energy use, with proof-of-stake being ~2000x more energy-efficient than proof-of-work. The energy expenditure of Ethereum will be roughly equal to the cost of running a modest laptop for each node on the network. +## A green application layer {#green-applications} -Many articles estimate "per-transaction" energy expenditure to compare blockchains to other industries. The benefit of this is that it is easy to understand, but the energy required to mine a block is independent of the number of transactions within it. A per transaction unit of energy expenditure implies that fewer transactions would lead to smaller energy expenditure and vice-versa, which is not the case. A per-transaction estimate is highly dependent upon how a blockchain's transaction throughput is defined, and tweaking this definition can be gamed to make the value seem larger or smaller. +While Ethereum's energy consumption is very low, there are is also a substantial, growing, and highly active **regenerative finance (ReFI)** community building on Ethereum. ReFi applications use DeFi components to build financial applications that have positive externalities benefiting the environment. ReFi is part of a wider "Solarpunk" movement that is closely aligned with Ethereum and aims to couple technological advancement and environmental stewardship. The decentralized, permissionless, composable nature of Ethereum makes it the ideal base layer for the ReFi and solarpunk communities. Through the development of these (and other, e.g. [DeSci](/desci)) Ethereum is becoming an environmentally and socially-positive technology. -For example, on Ethereum, the transaction throughput is not only that of the base layer - it is also the sum of the transaction throughput of all of its "[layer 2](/layer-2/)" rollups, which are not generally included in calculations and would drastically reduce them. This is why tools that compare energy consumption per transaction across platforms are misleading. +## Ethereum's Carbon debt -More relevant is the overall energy consumption and carbon footprint of the network as a whole. From those values, we can examine what that network offers to its users and society at large and make a more holistic evaluation of whether that energy expenditure is justified or not. Per transaction measurements, on the other hand, imply the value of the network only comes from its role in transferring crypto between accounts and prohibits an honest cost-benefit analysis. +Ethereum's current energy expenditure is very low, but this has not always been the case. Ethereum switched on it's proof-of-stake consensus mechanism in autumn 2022, but for eight years before then it used a proof-of-work mechanism with a much greater environmental cost. -[Digiconomist provides whole-network energy consumption and carbon footprints for Bitcoin and Ethereum](https://digiconomist.net/ethereum-energy-consumption). At the time of writing this article, Ethereum's total energy consumption is ~112 TWh/yr, comparable to that of the Netherlands, with a Carbon emission equivalent to that of Singapore (53 MT/yr). For comparison, Bitcoin currently expends about 200 TWh/yr of energy and emits about 100 MT/yr C, while generating about 32,000 T of electrical waste from obsolete hardware annually. Switching off Ethereum's proof-of-work in favor of proof-of-stake will reduce this energy expenditure by more than 99.95%, implying that the total energy expenditure for securing Ethereum is closer to **0.01 TWh/yr**. +Since its inception, Ethereum aimed to implement a proof-of-stake consensus mechanism, but doing so without sacrificing security and decentralization took years of focused research and development. Therefore, a proof-of-work mechanism was used to get the network started. Proof-of-work consensus requires miners to use their computing hardware to solve a puzzle, expending energy in the process. The solution to the puzzle proves that energy has been expended by the miner, demonstrating that they invested real-world value for the right to add to the blockchain. Ethereum's total energy consumption peaked during the apex of the crypto bull market in February 2022 at just under 94 TWh/yr. In the summer before the switch to proof-of-stake, the energy consumption was closer to 60 TWh/yr, comparable to that of Uzbekistan, with a Carbon emission equivalent to that of Azerbaijan (33 MT/yr). -![Comparison of energy expenditure across industries](./energy.png) +Both proof-of-work and proof-of-stake are just mechanisms to decide who gets to add the next block. Swapping proof-of-work for proof-of-stake, where the real-world value invested comes from ETH staked directly in a smart contract, removes the need for miners to burn energy to add to the blockchain. Therefore, the environmental cost of securing the network is drastically reduced. -The figure above shows the estimated annual energy consumption in TWh/yr for various industries (retrieved in June 2022). -_Note that the estimates presented in the plot are from publicly available sources that have been linked to in the text below. They are -illustrative and do not represent an official estimate, promise or forecast._ +## Why proof-of-stake is greener than proof-of-work {#why-pos-is-greener-than-pow} -To put Ethereum's energy consumption in context, we can compare annualized estimates for other industries. If we take Ethereum to be a platform for securely holding digital assets as investments, perhaps we can compare to mining gold, which has been estimated to expend about [240 TWh/yr](https://www.kitco.com/news/2021-05-17/Gold-s-energy-consumption-doubles-that-of-bitcoin-Galaxy-Digital.html). As a digital payments platform we could perhaps compare to PayPal (estimated to consume about [0.26 TWh/yr](https://app.impaakt.com/analyses/paypal-consumed-264100-mwh-of-energy-in-2020-24-from-non-renewable-sources-27261)). As an entertainment platform we could perhaps compare to the gaming industry which has been estimated to expend about [34 TW/yr](https://www.researchgate.net/publication/336909520_Toward_Greener_Gaming_Estimating_National_Energy_Use_and_Energy_Efficiency_Potential). Estimates of energy consumption by Netflix range dramatically between [about 0.45TWhr/yr](https://s22.q4cdn.com/959853165/files/doc_downloads/2020/02/0220_Netflix_EnvironmentalSocialGovernanceReport_FINAL.pdf) (their own estimates reported in 2019) up to about 94 TWh/yr (as estimated by [Shift Project](https://theshiftproject.org/en/article/unsustainable-use-online-video/)) - there is some discussion about the assumptions underlying these estimates available on [Carbon Brief](https://www.carbonbrief.org/factcheck-what-is-the-carbon-footprint-of-streaming-video-on-netflix). Alternatively, Ethereum could be compared to Youtube which has been estimated to expend about [244 TWh/yr](https://thefactsource.com/how-much-electricity-does-youtube-use/), although these values depend a lot on the type of device videos are streamed on and the energy-efficiency of underlying infrastructure such as data centers. Estimates of Youtube's energy expenditure have been broken down by channel and individual videos. [Those estimates](https://thefactsource.com/how-much-electricity-does-youtube-use/) imply that people consumed 45 times more energy watching Gangnam Style in 2019 than proof-of-stake Ethereum will use in a year. +Proof-of-work is a robust way to secure the network. Transactions on the Ethereum blockchain are validated by [miners](/developers/docs/consensus-mechanisms/pow/mining). Miners bundle together transactions into ordered blocks and add them to the Ethereum blockchain. The new blocks get broadcast to all the other node operators who run the transactions independently and verify that they are valid. Any dishonesty shows up as an inconsistency between different nodes. Honest blocks are added to the blockchain and become an immutable part of history. +The ability for any miner to add new blocks only works if there is a cost associated with mining and unpredictability about which specific node submits the next block. These conditions are met by imposing proof-of-work. To be eligible to submit a block of transactions, a miner must be the first to submit the solution to a computationally expensive puzzle. To successfully take control of the blockchain, a dishonest miner would have to consistently win the proof-of-work race by investing in sufficient hardware and energy to outperform the majority of other miners. -## A greener Ethereum {#green-ethereum} +This mechanism of securing the network is problematic for several reasons. First, miners can increase their odds of success by investing in more powerful hardware, creating conditions for an arms race with miners acquiring increasingly power-hungry mining equipment. This increases the network's energy consumption and generates hardware waste. Second, Ethereum's proof-of-work protocol currently has a total annualized power consumption approximately equal to that of Finland [^1] and a carbon footprint similar to Switzerland[^1]. -While Ethereum's energy consumption has historically been substantial, there has been a significant investment of developer time and intellect into transitioning from energy-hungry to energy-efficient block production. To quote [Bankless](http://podcast.banklesshq.com/), the best way to reduce the energy consumed by proof-of-work is simply to "turn it off", which is the approach Ethereum has committed to taking. +Proof-of-stake uses validators instead of miners. Validators perform the same function as miners, except that instead of expending their assets up-front as energy expenditure, they stake ETH as collateral against dishonest behavior. This staked ETH can be destroyed if the validator misbehaves, with more severe penalties for more nefarious actions. This strongly incentivizes active and honest participation in securing the network without requiring large energy expenditure. Since almost all of the energy expended securing the proof-of-work network comes from the mining algorithm, switching to proof-of-stake dramatically reduces energy expenditure. There is also no benefit to be had by investing in more powerful hardware under proof-of-stake, so there is no arms-race condition and less electronic waste. Ethereum validators can run on typical laptops or low-power devices such as [Raspberry Pi](https://ethereum-on-arm-documentation.readthedocs.io/en/latest/user-guide/ethereum2.0.html). -At the same time, there is a substantial, growing, and highly active **regenerative finance (ReFI)** community building on Ethereum. ReFi applications use DeFi components to build financial applications that have positive externalities benefiting the environment. ReFi is part of a wider "Solarpunk" movement that is closely aligned with Ethereum and aims to couple technological advancement and environmental stewardship. The decentralized, permissionless, composable nature of Ethereum makes it the ideal base layer for the ReFi and solarpunk communities. After The Merge, the technology and philosophy of Ethereum will finally reconcile, and Ethereum should become an environmentally-positive technology. +Read more on [how Ethereum implements proof-of-stake](/developers/docs/consensus-mechanisms/pos) and how it compares to proof-of-work. If you think these stats are incorrect or can be made more accurate, please raise an issue or PR. These are estimates by the ethereum.org team made using publicly accessible information and the current Ethereum roadmap. These statements don't represent an official promise from the Ethereum Foundation. From b3283ed8c27835f168af0f9918d1ba0fe273ae2a Mon Sep 17 00:00:00 2001 From: Joshua <62268199+minimalsm@users.noreply.github.com> Date: Fri, 15 Jul 2022 12:13:48 +0100 Subject: [PATCH 002/286] Update src/content/energy-consumption/index.md --- src/content/energy-consumption/index.md | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/content/energy-consumption/index.md b/src/content/energy-consumption/index.md index bd7b4bf0dae..4da550fe36b 100644 --- a/src/content/energy-consumption/index.md +++ b/src/content/energy-consumption/index.md @@ -7,9 +7,7 @@ sidebar: true # Ethereum energy consumption {#introduction} -Ethereum is a green blockchain. It uses a [proof-of-stake](/developers/docs/consensus-mechanisms/pos) consensus mechanism that -can be run on low-powered devices and does not require heavy computation to participate. Under Ethereum's proof-of-stake mechanism -the network is secured using staked Ether rather than expended energy (as in [proof-of-work](/developers/docs/consensus-mechanisms/pos)). This means the energy expended by the Etheruem network is very small - on the order of 0.01 TWhr/yr. +Ethereum is a green blockchain. It uses a [proof-of-stake](/developers/docs/consensus-mechanisms/pos) consensus mechanism that can be run on low-powered devices and does not require heavy computation to participate. Under Ethereum's proof-of-stake mechanism the network is secured using staked Ether rather than expended energy (as in [proof-of-work](/developers/docs/consensus-mechanisms/pos)). This means the energy expended by the Etheruem network is very small - on the order of 0.01 TWhr/yr. ## Proof-of-stake energy expenditure {#proof-of-stake-energy} From 5acbdebfaa9950c0347a61adf4ab05182455cbb4 Mon Sep 17 00:00:00 2001 From: Joseph Cook <33655003+jmcook1186@users.noreply.github.com> Date: Fri, 15 Jul 2022 13:00:03 +0100 Subject: [PATCH 003/286] Apply suggestions from code review Co-authored-by: Joshua <62268199+minimalsm@users.noreply.github.com> --- src/content/energy-consumption/index.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/content/energy-consumption/index.md b/src/content/energy-consumption/index.md index 4da550fe36b..379ef500c57 100644 --- a/src/content/energy-consumption/index.md +++ b/src/content/energy-consumption/index.md @@ -7,7 +7,7 @@ sidebar: true # Ethereum energy consumption {#introduction} -Ethereum is a green blockchain. It uses a [proof-of-stake](/developers/docs/consensus-mechanisms/pos) consensus mechanism that can be run on low-powered devices and does not require heavy computation to participate. Under Ethereum's proof-of-stake mechanism the network is secured using staked Ether rather than expended energy (as in [proof-of-work](/developers/docs/consensus-mechanisms/pos)). This means the energy expended by the Etheruem network is very small - on the order of 0.01 TWhr/yr. +Ethereum is a green blockchain. It uses a [proof-of-stake](/developers/docs/consensus-mechanisms/pos) consensus mechanism that can be run on low-powered devices and does not require heavy computation to participate. Ethereum's proof-of-stake mechanism secures the network by using staked ETH rather than expended energy, like in [proof-of-work](/developers/docs/consensus-mechanisms/pos). The switch to proof-of-stake means the energy expended by the Ethereum network is relatively small - on the order of 0.01 TWh/yr. ## Proof-of-stake energy expenditure {#proof-of-stake-energy} @@ -31,11 +31,11 @@ To put Ethereum's energy consumption in context, we can compare annualized estim ## A green application layer {#green-applications} -While Ethereum's energy consumption is very low, there are is also a substantial, growing, and highly active **regenerative finance (ReFI)** community building on Ethereum. ReFi applications use DeFi components to build financial applications that have positive externalities benefiting the environment. ReFi is part of a wider "Solarpunk" movement that is closely aligned with Ethereum and aims to couple technological advancement and environmental stewardship. The decentralized, permissionless, composable nature of Ethereum makes it the ideal base layer for the ReFi and solarpunk communities. Through the development of these (and other, e.g. [DeSci](/desci)) Ethereum is becoming an environmentally and socially-positive technology. +While Ethereum's energy consumption is very low, there is also a substantial, growing, and highly active **regenerative finance (ReFI)** community building on Ethereum. ReFi applications use DeFi components to build financial applications that have positive externalities benefiting the environment. ReFi is part of a wider "Solarpunk" movement that is closely aligned with Ethereum and aims to couple technological advancement and environmental stewardship. The decentralized, permissionless, composable nature of Ethereum makes it the ideal base layer for the ReFi and solarpunk communities. Through the development of these (and others, e.g. [DeSci](/desci/)), Ethereum is becoming an environmentally and socially-positive technology. -## Ethereum's Carbon debt +## Ethereum's carbon debt {#carbon-debt} -Ethereum's current energy expenditure is very low, but this has not always been the case. Ethereum switched on it's proof-of-stake consensus mechanism in autumn 2022, but for eight years before then it used a proof-of-work mechanism with a much greater environmental cost. +Ethereum's current energy expenditure is very low, but this has not always been the case. Ethereum switched on its proof-of-stake consensus mechanism in Q3 2022. However, Ethereum used a proof-of-work mechanism from 2014-2022, which had a much greater environmental cost. Since its inception, Ethereum aimed to implement a proof-of-stake consensus mechanism, but doing so without sacrificing security and decentralization took years of focused research and development. Therefore, a proof-of-work mechanism was used to get the network started. Proof-of-work consensus requires miners to use their computing hardware to solve a puzzle, expending energy in the process. The solution to the puzzle proves that energy has been expended by the miner, demonstrating that they invested real-world value for the right to add to the blockchain. Ethereum's total energy consumption peaked during the apex of the crypto bull market in February 2022 at just under 94 TWh/yr. In the summer before the switch to proof-of-stake, the energy consumption was closer to 60 TWh/yr, comparable to that of Uzbekistan, with a Carbon emission equivalent to that of Azerbaijan (33 MT/yr). From e841390952fd1031f8e8a887cc85748602185539 Mon Sep 17 00:00:00 2001 From: Joseph Cook <33655003+jmcook1186@users.noreply.github.com> Date: Fri, 15 Jul 2022 13:09:17 +0100 Subject: [PATCH 004/286] remove rogue "mine" --- src/content/energy-consumption/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/content/energy-consumption/index.md b/src/content/energy-consumption/index.md index 379ef500c57..a296fcd8246 100644 --- a/src/content/energy-consumption/index.md +++ b/src/content/energy-consumption/index.md @@ -13,7 +13,7 @@ Ethereum is a green blockchain. It uses a [proof-of-stake](/developers/docs/cons The energy expenditure of Ethereum is roughly equal to the cost of running a modest laptop for each node on the network. -Many articles estimate "per-transaction" energy expenditure to compare blockchains to other industries. The benefit of this is that it is easy to understand, but the energy required to mine a block is independent of the number of transactions within it. A per transaction unit of energy expenditure implies that fewer transactions would lead to smaller energy expenditure and vice-versa, which is not the case. A per-transaction estimate is highly dependent upon how a blockchain's transaction throughput is defined, and tweaking this definition can be gamed to make the value seem larger or smaller. +Many articles estimate "per-transaction" energy expenditure to compare blockchains to other industries. The benefit of this is that it is easy to understand. However, transaction-based estimates can be misleading because the energy required to propose and validate a block is independent of the number of transactions within it. A per transaction unit of energy expenditure implies that fewer transactions would lead to smaller energy expenditure and vice-versa, which is not the case. A per-transaction estimate is highly dependent upon how a blockchain's transaction throughput is defined, and tweaking this definition can be gamed to make the value seem larger or smaller. For example, on Ethereum, the transaction throughput is not only that of the base layer - it is also the sum of the transaction throughput of all of its "[layer 2](/layer-2/)" rollups, which are not generally included in calculations and would drastically reduce them. This is one reason why tools that compare energy consumption per transaction across platforms are misleading. From c9b454e0ca8f1dbe69a5e5b47251b287b3745e37 Mon Sep 17 00:00:00 2001 From: Joe Date: Fri, 15 Jul 2022 15:06:42 +0100 Subject: [PATCH 005/286] update content for post-merge --- src/content/nft/index.md | 135 ++++----------------------------------- 1 file changed, 14 insertions(+), 121 deletions(-) diff --git a/src/content/nft/index.md b/src/content/nft/index.md index f6e09540ab1..e12443d1ad6 100644 --- a/src/content/nft/index.md +++ b/src/content/nft/index.md @@ -20,7 +20,7 @@ If Andy Warhol had been born in the late 90s, he probably would have minted Camp ## What's an NFT? {#what-are-nfts} -NFTs are tokens that we can use to represent ownership of unique items. They let us tokenise things like art, collectibles, even real estate. They can only have one official owner at a time and they're secured by the Ethereum blockchain – no one can modify the record of ownership or copy/paste a new NFT into existence. +NFTs are tokens that we can use to represent ownership of unique items. They let us tokenize things like art, collectibles, even real estate. Ownership of an asset is secured by the Ethereum blockchain – no one can modify the record of ownership or copy/paste a new NFT into existence. NFT stands for non-fungible token. Non-fungible is an economic term that you could use to describe things like your furniture, a song file, or your computer. These things are not interchangeable for other items because they have unique properties. @@ -96,7 +96,7 @@ NFTs are different from ERC-20 tokens, such as DAI or LINK, in that each individ - Signatures - Lots and lots more options to get creative with! -An NFT can only have one owner at a time. Ownership is managed through the uniqueID and metadata that no other token can replicate. NFTs are minted through smart contracts that assign ownership and manage the transferability of the NFT's. When someone creates or mints an NFT, they execute code stored in smart contracts that conform to different standards, such as ERC-721. This information is added to the blockchain where the NFT is being managed. The minting process, from a high level, has the following steps that it goes through: +Ownership of NFTs is managed through the uniqueID and metadata that no other token can replicate. NFTs are minted through smart contracts that assign ownership and manage the transferability of the NFT's. When someone creates or mints an NFT, they execute code stored in smart contracts that conform to different standards, such as ERC-721. This information is added to the blockchain where the NFT is being managed. The minting process, from a high level, has the following steps that it goes through: - Creating a new block - Validating information @@ -291,11 +291,10 @@ NFTs are growing in popularity which means they're also coming under increased s To clarify a few things: -- NFTs aren't directly increasing the carbon footprint of Ethereum. -- The way Ethereum keeps your funds and assets secure is currently energy-intensive but it's about to improve. -- Once improved, Ethereum's carbon footprint will be 99.95% better, making it more energy efficient than many existing industries. +- Creating and transferring NFTs are just Ethereum transactions - they have no direct impact on the energy expended by Ethereum, nor do they independently expend their own energy. +- Ethereum is a low-energy blockchain, meaning the environmental impact of creating, buying and transferring NFTs is very small. -To explain further we're going to have to get a little more technical so bear with us... +The next sections explain further with a little more technical detail... ### Don't blame it on the NFTs {#nft-qualities} @@ -305,9 +304,9 @@ Decentralized meaning you and everyone else can verify you own something. All wi Secure meaning no one can copy/paste your NFT or steal it. -These qualities of Ethereum makes digitally owning unique items and getting a fair price for your content possible. But it comes at a cost. Blockchains like Bitcoin and Ethereum are energy intensive right now because it takes a lot of energy to preserve these qualities. If it was easy to rewrite Ethereum's history to steal NFTs or cryptocurrency, the system collapses. +These qualities of Ethereum makes digitally owning unique items and getting a fair price for your content possible. Ethereum protects the assets using a decentralized consensus mechanism called ['proof-of-stake'](/developers/docs/consensus-mechanisms/pos). This is a low carbon consensus mechanism that is also considered more secure than the energy-intensive alternative, ['proof-of-work'](/developers/docs/consensus-mechanisms/pow). NFTs have been associated with high energy expenditure because Ethereum used to be secured using proof-of-work. This is no longer true. -#### The work in minting your NFT {#minting-nfts} +#### Minting NFTs {#minting-nfts} When you mint an NFT, a few things have to happen: @@ -316,56 +315,16 @@ When you mint an NFT, a few things have to happen: - The transactions that confirm the above need to be added to a block and "immortalised" on the chain. - The block needs to be confirmed by everyone in the network as "correct". This consensus removes the need for intermediaries because the network agrees that your NFT exists and belongs to you. And it's on chain so anyone can check it. This is one of the ways Ethereum helps NFT creators to maximise their earnings. -All these tasks are done by miners. And they let the rest of the network know about your NFT and who owns it. This means mining needs to be sufficiently difficult, otherwise anyone could just claim that they own the NFT you just minted and fraudulently transfer ownership. There are lots of incentives in place to make sure miners are acting honestly. +All these tasks are done by block producers and validators. Block proposers add your NFT transaction to a block and broadcast it to the rest of the network. Validators check that the transaction is valid and then add it to their databases. There are lots of crypto-economic incentives in place to make sure validators are acting honestly. Otherwise, anyone could just claim that they own the NFT you just minted and fraudulently transfer ownership. -[More on mining](/developers/docs/consensus-mechanisms/pow/) +#### NFT security {#nft-security} -#### Securing your NFT with mining {#securing-nfts} +Ethereum's security comes from its proof-of-stake consensus mechanism - validators deposit 32 ETH into a contract that can be destroyed if they misbehave. The system is designed to strongly economically disincentivize malicious actions, making Ethereum effectively tamper-proof. This is what makes NFTs possible. Once the block containing your NFT transaction becomes finalized it would cost an attacker millions of ether to change it, and even then their success is not guaranteed because the Ethereum community could decide to fork their malicious actions away. Anyone running Ethereum software would immediately be able to detect dishonest tampering with an NFT and the bad actor would be economically penalized and ejected from the pool of validators to prevent it from happening. -Mining difficulty comes from the fact that it takes a lot of computing power to create new blocks in the chain. Importantly, blocks are created consistently, not just when they're needed. They're created every 12 seconds or so. +Security issues relating to NFTs are most often related to phishing scams, smart contract vulnerabilities or user errors (such as inadvertently exposing private keys), making good wallet security critical for NFT owners. -This is important for making Ethereum tamper-proof, one of the qualities that makes NFTs possible. The more blocks the more secure the chain. If your NFT was created in block #600 and a hacker were to try and steal your NFT by modifying its data, the digital fingerprint of all subsequent blocks would change. That means anyone running Ethereum software would immediately be able to detect and prevent it from happening. - -However this means that computing power needs to be used constantly. It also means that a block that contains 0 NFT transactions will still have roughly the same carbon footprint, because computing power will still be consumed to create it. Other non-NFT transactions will fill the blocks. - -#### Blockchains are energy intensive, right now {#blockchains-intensive} - -So yes, there is a carbon footprint associated with creating blocks by mining – and this is a problem for chains like Bitcoin too – but it's not directly the fault of NFTs. - -A lot of mining uses renewable energy sources or untapped energy in remote locations. And there is the argument that the industries that NFTs and cryptocurrencies are disrupting have huge carbon footprints too. But just because existing industries are bad, doesn't mean we shouldn't strive to be better. - -And we are. Ethereum is evolving to make using Ethereum (and by virtue, NFTs) more energy efficient. And that's always been the plan. - -We're not here to defend the environmental footprint of mining, instead we want to explain how things are changing for the better. - -### A greener future... {#a-greener-future} - -For as long as Ethereum has been around, the energy-consumption of mining has been a huge focus area for developers and researchers. And the vision has always been to replace it as soon as possible. [More on Ethereum's vision](/upgrades/vision/) - -This vision is being delivered right now. - -#### A greener Ethereum {#greener-ethereum} - -Ethereum is currently going through a series of upgrades that will replace mining with [staking](/staking/). This will remove computing power as a security mechanism, and reduce Ethereum's carbon footprint by ~99.95%[^1]. In this world, stakers commit funds instead of computing power to secure the network. - -The energy-cost of Ethereum will become the cost of running a home computer multiplied by the number of nodes in the network. If there are 10,000 nodes in the network and the cost of running a home computer is roughly 525kWh per year. That's 5,250,000kWh[^1] per year for the entire network. - -We can use this to compare the future of Ethereum to a global service like Visa. 100,000 Visa transactions uses 149kWh of energy[^2]. In proof-of-stake Ethereum, that same number of transactions would cost 17.4kWh of energy or ~11% of the total energy[^3]. That's without considering the many optimizations being worked on in parallel to the consensus layer and shard chains, like [rollups](/glossary/#rollups). It could be as little as 0.1666666667kWh of energy for 100,000 transactions. - -Importantly this improves the energy efficiency while preserving Ethereum's decentralization and security. Many other blockchains out there might already use some form of staking, but they're secured by a select few stakers, not the thousands that Ethereum will have. The more decentralization, the more secure the system. - -[More on energy estimates](#footnotes-and-sources) - -_We’ve provided the basic comparison to Visa to baseline your understanding of proof-of-stake Ethereum energy consumption against a familiar name. However, in practice, it’s not really correct to compare based on number of transactions. Ethereum’s energy output is time-based. If Ethereum did more or less transactions from one minute to the next, the energy output would stay the same._ - -_It’s also important to remember that Ethereum does more than just financial transactions, it’s a platform for applications, so a fairer comparison might be to many companies/industries including Visa, AWS and more!_ - -#### Timelines {#timelines} - -The process has already started. [The Beacon Chain](/upgrades/beacon-chain/), the first upgrade, shipped in December 2020. This provides the foundation for staking by allowing stakers to join the system. The next step relevant to energy efficiency is to merge the current chain, the one secured by miners, into the Beacon Chain where mining isn't needed. Timelines can't be exact at this stage, but it's estimated that this will happen sometime in 2022. This process is known as The Merge (formerly referred to as the docking). [More on The Merge](/upgrades/merge/). - - - More on Ethereum upgrades + + More on security ## Build with NFTs {#build-with-nfts} @@ -379,71 +338,5 @@ Most NFTs are built using a consistent standard known as [ERC-721](/developers/d - [A beginner's guide to NFTs](https://linda.mirror.xyz/df649d61efb92c910464a4e74ae213c4cab150b9cbcc4b7fb6090fc77881a95d) – _Linda Xie, January 2020_ - [Everything you need to know about the metaverse](https://foundation.app/blog/enter-the-metaverse) – _Foundation team, foundation.app_ - [No, CryptoArtists Aren’t Harming the Planet](https://medium.com/superrare/no-cryptoartists-arent-harming-the-planet-43182f72fc61) +- [Ethereum's energy consumption](/energy_consumption) - [A country's worth of power, no more](https://blog.ethereum.org/2021/05/18/country-power-no-more/) – _Carl Beekhuizen, May 18 2021_ - - - -### Footnotes and sources {#footnotes-and-sources} - -This explains how we arrived at our energy estimates above. These estimates apply to the network as a whole and are not just reserved for the process of creating, buying, or selling NFTs. - -#### 1. 99.95% energy reduction from mining {#fn-1} - -The 99.95% reduction in energy consumption from a system secured by mining to a system secured by staking is calculated using the following data sources: - -- 44.49 TWh of annualized electrical energy is consumed by mining Ethereum - [Digiconomist](https://digiconomist.net/ethereum-energy-consumption) - -- The average desktop computer, all that's needed to run proof-of-stake, uses 0.06kWh of energy per hour – [Silicon Valley power chart](https://www.siliconvalleypower.com/residents/save-energy/appliance-energy-use-chart) (Some estimates are a little higher at 0.15kWh) - -At the time of writing, there are 140 592 validators from 16 405 unique addresses. -Of those, 87 897 validators are assumed to be staking from home. - -It is assumed the average person staking from home uses a 100 watt desktop personal computer setup to run an average of 5.4 validator clients. - -The 87 897 validators running from home gives us 16 300 users consuming ~1.64 megawatt of energy. - -The rest of the validators are run by custodial stakers such as exchanges and staking services. -It can be assumed that they use 100w per 5.5 validators. This is a gross overestimation to be on the safe side. - -In total, Ethereum on proof-of-stake therefore consumes something on the order of 2.62 megawatt, which is about the same as a small American town. - -This is a reduction of at least 99.95% in total energy usage from the Digiconomist estimate of 44.94 TWh per year that the Ethereum miners currently consume. - -#### 2. Visa energy consumption {#fn-2} - -The cost of 100,000 Visa transactions is 149 kwH - [Bitcoin network average energy consumption per transaction compared to VISA network as of 2020, Statista](https://www.statista.com/statistics/881541/bitcoin-energy-consumption-transaction-comparison-visa/) - -Year-ending September 2020 they processed 140,839,000,000 transactions – [Visa financials report Q4 2020](https://s1.q4cdn.com/050606653/files/doc_financials/2020/q4/Visa-Inc.-Q4-2020-Operational-Performance-Data.pdf) - -#### 3. Energy usage for 100,000 transactions on a sharded proof-of-stake network {#fn-3} - -It's estimated that scalability upgrades will allow the network to process between 25,000 and 100,000 transactions per second, with [100,000 as the theoretical maximum right now](https://ethereum-magicians.org/t/a-rollup-centric-ethereum-roadmap/4698). - -[Vitalik Buterin on transactions per second potential with sharding](https://twitter.com/VitalikButerin/status/1312905884549300224) - -At the bare minimum, sharding will allow 64 times the amount of transactions as today which sits at around 15 transactions. That's the amount of shard chains (extra data and capacity) being introduced. [More on shard chains](/upgrades/sharding/) - -That means we can estimate how long it will take to process 100,000 transactions so we can compare it to the Visa example above. - -- `15 * 64 = 960` transactions per second. -- `100,000 / 960 = 104.2` seconds to process 100,000 transactions. - -In 104.2 seconds, the Ethereum network will use the following amount of energy: - -`1.44kWh daily usage * 10,000 network nodes = 14,400kWh` per day. - -There are 86,400 seconds in a day, so `14,400 / 86,400 = 0.1666666667kWh` per second. - -If we multiply that by the amount of time it takes to process 100,000 transaction: `0.1666666667 * 104.2 = 17.3666666701 kWh`. - -That is **11.6554809866%** of the energy consumed by the same amount of transactions on Visa. - -And remember, this is based on the minimum amount of transactions that Ethereum will be able to handle per second. If Ethereum reaches its potential of 100,000 transactions per second, 100,000 transactions would consume 0.1666666667kWh. - -To put it another way, if Visa handled 140,839,000,000 transactions at a cost of 149 kWh per 100,000 transactions that's 209,850,110 kWh energy consumed for the year. - -Ethereum in a single year stands to consume 5,256,000 kWh. With a potential of 788,940,000,000 - 3,153,600,000,000 transactions processed in that time. - - - If you think these stats are incorrect or can be made more accurate, please raise an issue or PR. These are estimates by the ethereum.org team made using publicly accessible information and the planned Ethereum design. This doesn't represent an official promise from the Ethereum Foundation. - From 7587ade8289e8c789dafc61275e2a09844ff5e6f Mon Sep 17 00:00:00 2001 From: Joe Date: Fri, 15 Jul 2022 15:37:33 +0100 Subject: [PATCH 006/286] update gas page content for post-merge --- src/content/developers/docs/gas/index.md | 44 +++++------------------- 1 file changed, 9 insertions(+), 35 deletions(-) diff --git a/src/content/developers/docs/gas/index.md b/src/content/developers/docs/gas/index.md index 94a73a1cdec..0b115f83fa8 100644 --- a/src/content/developers/docs/gas/index.md +++ b/src/content/developers/docs/gas/index.md @@ -23,29 +23,9 @@ _Diagram adapted from [Ethereum EVM illustrated](https://takenobu-hs.github.io/d Gas fees are paid in Ethereum's native currency, ether (ETH). Gas prices are denoted in gwei, which itself is a denomination of ETH - each gwei is equal to 0.000000001 ETH (10-9 ETH). For example, instead of saying that your gas costs 0.000000001 ether, you can say your gas costs 1 gwei. The word 'gwei' itself means 'giga-wei', and it is equal to 1,000,000,000 wei. Wei itself (named after [Wei Dai](https://wikipedia.org/wiki/Wei_Dai), creator of [b-money](https://www.investopedia.com/terms/b/bmoney.asp)) is the smallest unit of ETH. -## Prior to the London upgrade {#pre-london} +## How Gas works {#how-gas-works} -The way transaction fees on the Ethereum network were calculated changed with [the London Upgrade](/history/#london) of August 2021. Here is a recap of how things used to work: - -Let's say Alice had to pay Bob 1 ETH. -In the transaction, the gas limit is 21,000 units, and the gas price is 200 gwei. - -Total fee would have been: `Gas units (limit) * Gas price per unit` -i.e `21,000 * 200 = 4,200,000 gwei` or 0.0042 ETH - -When Alice sent the money, 1.0042 ETH would be deducted from Alice's account. -Bob would be credited 1.0000 ETH. -Miner would receive 0.0042 ETH. - -This video offers a concise overview of gas and why it exists: - - - -## After the London upgrade {#post-london} - -[The London Upgrade](/history/#london) was implemented on August 5th, 2021, to make transacting on Ethereum more predictable for users by overhauling Ethereum's transaction-fee-mechanism. The high-level benefits introduced by this change include better transaction fee estimation, generally quicker transaction inclusion, and offsetting the ETH issuance by burning a percentage of transaction fees. - -Starting with the London network upgrade, every block has a base fee, the minimum price per unit of gas for inclusion in this block, calculated by the network based on demand for block space. As the base fee of the transaction fee is burnt, users are also expected to set a tip (priority fee) in their transactions. The tip compensates miners for executing and propagating user transactions in blocks and is expected to be set automatically by most wallets. +Since the [London Upgrade](/history/#london) every block has a base fee, the minimum price per unit of gas for inclusion in this block, calculated by the network based on demand for block space. As the base fee of the transaction fee is burnt, users are also expected to set a tip (priority fee) in their transactions. The tip compensates validators for executing and propagating user transactions in blocks and is expected to be set automatically by most wallets. Calculating the total transaction fee works as follows: `Gas units (limit) * (Base fee + Tip)` @@ -55,7 +35,7 @@ Using the formula above we can calculate this as `21,000 * (100 + 10) = 2,310,00 When Jordan sends the money, 1.00231 ETH will be deducted from Jordan's account. Taylor will be credited 1.0000 ETH. -Miner receives the tip of 0.00021 ETH. +Validator receives the tip of 0.00021 ETH. Base fee of 0.0021 ETH is burned. Additionally, Jordan can also set a max fee (`maxFeePerGas`) for the transaction. The difference between the max fee and the actual fee is refunded to Jordan, i.e. `refund = max fee - (base fee + priority fee)`. Jordan can set a maximum amount to pay for the transaction to execute and not worry about overpaying "beyond" the base fee when the transaction is executed. @@ -68,7 +48,7 @@ The London Upgrade introduced variable-size blocks to Ethereum. Each block has a ### Base fee {#base-fee} -Every block has a base fee which acts as a reserve price. To be eligible for inclusion in a block the offered price per gas must at least equal the base fee. The base fee is calculated independently of the current block and is instead determined by the blocks before it - making transaction fees more predictable for users. When the block is mined this base fee is "burned", removing it from circulation. +Every block has a base fee which acts as a reserve price. To be eligible for inclusion in a block the offered price per gas must at least equal the base fee. The base fee is calculated independently of the current block and is instead determined by the blocks before it - making transaction fees more predictable for users. When the block is added to the blockchain this base fee is "burned", removing it from circulation. The base fee is calculated by a formula that compares the size of the previous block (the amount of gas used for all the transactions) with the target size. The base fee will increase by a maximum of 12.5% per block if the target block size is exceeded. This exponential growth makes it economically non-viable for block size to remain high indefinitely. @@ -97,9 +77,7 @@ It's also important to note it is unlikely we will see extended spikes of full b ### Priority fee (tips) {#priority-fee} -Before the London Upgrade, miners would receive the total gas fee from any transaction included in a block. - -With the new base fee getting burned, the London Upgrade introduced a priority fee (tip) to incentivize miners to include a transaction in the block. Without tips, miners would find it economically viable to mine empty blocks, as they would receive the same block reward. Under normal conditions, a small tip provides miners a minimal incentive to include a transaction. For transactions that need to get preferentially executed ahead of other transactions in the same block, a higher tip will be necessary to attempt to outbid competing transactions. +In addition to the base fee, which is burned, there is also a priority fee (tip) to incentivize validators to include a transaction in the block. Without tips, validators would find it economically viable to propose empty blocks, as they would receive the same block reward. Under normal conditions, a small tip provides validators a sufficient incentive to include a transaction. For transactions that need to get preferentially executed ahead of other transactions in the same block, a higher tip will be necessary to attempt to outbid competing transactions. ### Max fee {#maxfee} @@ -107,13 +85,13 @@ To execute a transaction on the network, users can specify a maximum limit they ### Calculating fees {#calculating-fees} -One of the main benefits of the London upgrade is improving the user's experience when setting transaction fees. For wallets that support the upgrade, instead of explicitly stating how much you are willing to pay to get your transaction through, wallet providers will automatically set a recommended transaction fee (base fee + recommended priority fee) to reduce the amount of complexity burdened onto their users. +For wallets that support the London upgrade, instead of explicitly stating how much you are willing to pay to get your transaction through, wallet providers will automatically set a recommended transaction fee (base fee + recommended priority fee) to reduce the amount of complexity burdened onto their users. ## EIP-1559 {#eip-1559} The implementation of [EIP-1559](https://github.com/ethereum/EIPs/blob/master/EIPS/eip-1559.md) in the London Upgrade made the transaction fee mechanism more complex than the previous gas price auction, but it has the advantage of making gas fees more predictable, resulting in a more efficient transaction fee market. Users can submit transactions with a `maxFeePerGas` corresponding to how much they are willing to pay for the transaction to be executing, knowing that they will not pay more than the market price for gas (`baseFeePerGas`), and get any extra, minus their tip, refunded. -This video explains EIP-1559 and the benefits it brings: +This video explains EIP-1559 and the benefits it brought: @@ -135,7 +113,7 @@ _Diagram adapted from [Ethereum EVM illustrated](https://takenobu-hs.github.io/d Gas limit refers to the maximum amount of gas you are willing to consume on a transaction. More complicated transactions involving [smart contracts](/developers/docs/smart-contracts/) require more computational work, so they require a higher gas limit than a simple payment. A standard ETH transfer requires a gas limit of 21,000 units of gas. -For example, if you put a gas limit of 50,000 for a simple ETH transfer, the EVM would consume 21,000, and you would get back the remaining 29,000. However, if you specify too little gas, for example, a gas limit of 20,000 for a simple ETH transfer, the EVM will consume your 20,000 gas units attempting to fulfill the transaction, but it will not complete. The EVM then reverts any changes, but since the miner has already done 20k gas units worth of work, that gas is consumed. +For example, if you put a gas limit of 50,000 for a simple ETH transfer, the EVM would consume 21,000, and you would get back the remaining 29,000. However, if you specify too little gas, for example, a gas limit of 20,000 for a simple ETH transfer, the EVM will consume your 20,000 gas units attempting to fulfill the transaction, but it will not complete. The EVM then reverts any changes, but since the block-proposer has already done 20k gas units worth of work, that gas is consumed. ## Why can gas fees get so high? {#why-can-gas-fees-get-so-high} @@ -151,7 +129,7 @@ Layer 2 scaling is a primary initiative to greatly improve gas costs, user exper ## Strategies for you to reduce gas costs {#strategies-for-you-to-reduce-gas-costs} -If you are looking to reduce gas costs for your ETH, you can set a tip to indicate the priority level of your transaction. Miners will 'work on' and execute transactions that offer a higher tip per gas, as they get to keep the tips that you pay and will be less inclined to execute transactions with lower tips set. +If you are looking to reduce gas costs for your ETH, you can set a tip to indicate the priority level of your transaction. Validators will execute transactions that offer a higher tip per gas, as they get to keep the tips that you pay and will be less inclined to execute transactions with lower tips set. If you want to monitor gas prices, so you can send your ETH for less, you can use many different tools such as: @@ -172,7 +150,3 @@ If you want to monitor gas prices, so you can send your ETH for less, you can us - [Is Ethereum more expensive to use as price rises?](https://docs.ethhub.io/questions-about-ethereum/is-ethereum-more-expensive-to-use-as-price-rises/) - [Reducing the gas consumption of your Smart Contracts](https://medium.com/coinmonks/8-ways-of-reducing-the-gas-consumption-of-your-smart-contracts-9a506b339c0a) - [Proof of Stake versus Proof of Work](https://blockgeeks.com/guides/proof-of-work-vs-proof-of-stake/) - -## Related topics {#related-topics} - -- [Mining](/developers/docs/consensus-mechanisms/pow/mining/) From 0b9efeac2d14229bb9678ce5192527edb8e54616 Mon Sep 17 00:00:00 2001 From: Joe Date: Fri, 15 Jul 2022 15:47:39 +0100 Subject: [PATCH 007/286] text spacing for calculation --- src/content/developers/docs/gas/index.md | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/src/content/developers/docs/gas/index.md b/src/content/developers/docs/gas/index.md index 0b115f83fa8..74e90bc8eba 100644 --- a/src/content/developers/docs/gas/index.md +++ b/src/content/developers/docs/gas/index.md @@ -18,7 +18,7 @@ Gas refers to the unit that measures the amount of computational effort required Since each Ethereum transaction requires computational resources to execute, each transaction requires a fee. Gas refers to the fee required to conduct a transaction on Ethereum successfully. -![A diagram showing where gas is needed in EVM operations](./gas.png) +![A diagram showing where gas is needed in EVM operations](/developers/docs/gas/gas.png) _Diagram adapted from [Ethereum EVM illustrated](https://takenobu-hs.github.io/downloads/ethereum_evm_illustrated.pdf)_ Gas fees are paid in Ethereum's native currency, ether (ETH). Gas prices are denoted in gwei, which itself is a denomination of ETH - each gwei is equal to 0.000000001 ETH (10-9 ETH). For example, instead of saying that your gas costs 0.000000001 ether, you can say your gas costs 1 gwei. The word 'gwei' itself means 'giga-wei', and it is equal to 1,000,000,000 wei. Wei itself (named after [Wei Dai](https://wikipedia.org/wiki/Wei_Dai), creator of [b-money](https://www.investopedia.com/terms/b/bmoney.asp)) is the smallest unit of ETH. @@ -27,11 +27,15 @@ Gas fees are paid in Ethereum's native currency, ether (ETH). Gas prices are den Since the [London Upgrade](/history/#london) every block has a base fee, the minimum price per unit of gas for inclusion in this block, calculated by the network based on demand for block space. As the base fee of the transaction fee is burnt, users are also expected to set a tip (priority fee) in their transactions. The tip compensates validators for executing and propagating user transactions in blocks and is expected to be set automatically by most wallets. -Calculating the total transaction fee works as follows: `Gas units (limit) * (Base fee + Tip)` +Calculating the total transaction fee works as follows: + +`Gas units (limit) * (Base fee + Tip)` Let's say Jordan has to pay Taylor 1 ETH. In the transaction, the gas limit is 21,000 units and the base fee is 100 gwei. Jordan includes a tip of 10 gwei. -Using the formula above we can calculate this as `21,000 * (100 + 10) = 2,310,000 gwei` or 0.00231 ETH. +Using the formula above we can calculate this as + +`21,000 * (100 + 10) = 2,310,000 gwei` or 0.00231 ETH. When Jordan sends the money, 1.00231 ETH will be deducted from Jordan's account. Taylor will be credited 1.0000 ETH. From 8b0914c9feb4aa625122096f358614ec5e209477 Mon Sep 17 00:00:00 2001 From: Joe Date: Mon, 18 Jul 2022 10:13:35 +0100 Subject: [PATCH 008/286] update pow index for post-merge --- .../docs/consensus-mechanisms/pow/index.md | 43 ++++++++----------- 1 file changed, 19 insertions(+), 24 deletions(-) diff --git a/src/content/developers/docs/consensus-mechanisms/pow/index.md b/src/content/developers/docs/consensus-mechanisms/pow/index.md index 49694e7776b..d8553f90faf 100644 --- a/src/content/developers/docs/consensus-mechanisms/pow/index.md +++ b/src/content/developers/docs/consensus-mechanisms/pow/index.md @@ -3,12 +3,11 @@ title: Proof-of-work (PoW) description: An explanation of the proof-of-work consensus protocol and its role in Ethereum. lang: en sidebar: true -incomplete: true --- -Ethereum, like Bitcoin, currently uses a consensus protocol called **[Proof-of-work (PoW)](https://wikipedia.org/wiki/Proof_of_work)**. This allows the nodes of the Ethereum network to agree on the state of all information recorded on the Ethereum blockchain and prevents certain kinds of economic attacks. +Ethereum was always intended to be a [proof-of-stake](/developers/docs/consensus-mechanisms/pos) network, but the research and development required to implement proof-of-stake safely, securely and performantly took several years. The network was therefore started with a different consensus mechanism called **[Proof-of-work (PoW)](https://wikipedia.org/wiki/Proof_of_work)**. This allowed the nodes of the Ethereum network to agree on the state of all information recorded on the Ethereum blockchain and prevents certain kinds of economic attacks. -Over the next year, proof-of-work will be phased out in favour of **[Proof-of-stake (PoS)](/developers/docs/consensus-mechanisms/pos)**. The transition to proof-of-stake will also phase out mining from Ethereum. [More on The Merge.](/upgrades/merge/) +**Note**: _proof-of-work has now been deprecated. Ethereum no longer uses proof-of-work as a consensus mechanism._ ## Prerequisites {#prerequisites} @@ -16,63 +15,59 @@ To better understand this page, we recommend you first read up on [transactions] ## What is Proof-of-work (PoW)? {#what-is-pow} -Proof-of-work is the mechanism that allows the decentralized Ethereum network to come to consensus, or agree on things like account balances and the order of transactions. This prevents users from "double spending" their coins and ensures that the Ethereum chain is tremendously difficult to attack or manipulate. +Proof-of-work is the mechanism that once allowed the decentralized Ethereum network to come to consensus (i.e. all nodes agree) on things like account balances and the order of transactions. This prevented users from "double spending" their coins and ensured that the Ethereum chain was tremendously difficult to attack or manipulate. These security properties now come from proof-of-stake instead. ## Proof-of-work and mining {#pow-and-mining} -Proof-of-work is the underlying algorithm that sets the difficulty and rules for the work miners do. Mining is the "work" itself. It's the act of adding valid blocks to the chain. This is important because the chain's length helps the network follow the correct Ethereum chain and understand Ethereum's current state. The more "work" done, the longer the chain, and the higher the block number, the more certain the network can be of the current state of things. +Proof-of-work is the underlying algorithm that sets the difficulty and rules for the work miners do on proof-of-work blockchains. Mining is the "work" itself. It's the act of adding valid blocks to the chain. This is important because the chain's length helps the network follow the correct fork of the blockchain. The more "work" done, the longer the chain, and the higher the block number, the more certain the network can be of the current state of things. [More on mining](/developers/docs/consensus-mechanisms/pow/mining/) -## How does Ethereum's proof-of-work work? {#how-it-works} +## How did Ethereum's proof-of-work work? {#how-it-works} -Ethereum transactions are processed into blocks. Each block has a: +Ethereum transactions are processed into blocks. In proof-of-work Ethereum, each block contained: - block difficulty – for example: 3,324,092,183,262,715 - mixHash – for example: `0x44bca881b07a6a09f83b130798072441705d9a665c5ac8bdf2f39a3cdf3bee29` - nonce – for example: `0xd3ee432b4fb3d26b` -This block data is directly related to proof-of-work. +This block data was directly related to proof-of-work. ### The work in proof-of-work {#the-work} -The proof-of-work protocol, Ethash, requires miners to go through an intense race of trial and error to find the nonce for a block. Only blocks with a valid nonce can be added to the chain. +The proof-of-work protocol, Ethash, required miners to go through an intense race of trial and error to find the nonce for a block. Only blocks with a valid nonce could be added to the chain. -When racing to create a block, a miner will repeatedly put a dataset, that you can only get from downloading and running the full chain (as a miner does), through a mathematical function. The dataset gets used to generate a mixHash below a target nonce, as dictated by the block difficulty. The best way to do this is through trial and error. +When racing to create a block, a miner repeatedly put a dataset, that could only be obtained by downloading and running the full chain (as a miner does), through a mathematical function. The dataset was used to generate a mixHash below a target nonce, as dictated by the block difficulty. The best way to do this is through trial and error. -The difficulty determines the target for the hash. The lower the target, the smaller the set of valid hashes. Once generated, this is incredibly easy for other miners and clients to verify. Even if one transaction were to change, the hash would be completely different, signalling fraud. +The difficulty determined the target for the hash. The lower the target, the smaller the set of valid hashes. Once generated, this was incredibly easy for other miners and clients to verify. Even if one transaction were to change, the hash would be completely different, signalling fraud. -Hashing makes fraud easy to spot. But proof-of-work as a process is also a big deterrent to attacking the chain. +Hashing makes fraud easy to spot. But proof-of-work as a process was also a big deterrent to attacking the chain. ### Proof-of-work and security {#security} -Miners are incentivised to do this work on the main Ethereum chain. There is little incentive for a subset of miners to start their own chain – it undermines the system. Blockchains rely on having a single state as a source of truth. And users will always choose the longest or "heaviest" chain. +Miners were incentivised to do this work on the main Ethereum chain. There was little incentive for a subset of miners to start their own chain – it undermines the system. Blockchains rely on having a single state as a source of truth. -The objective of proof-of-work is to extend the chain. The longest chain is most believable as the valid one because it's had the most computational work done. Within Ethereum's PoW system, it's nearly impossible to create new blocks that erase transactions, create fake ones, or maintain a second chain. That's because a malicious miner would need to always solve the block nonce faster than everyone else. +The objective of proof-of-work was to extend the chain. The longest chain was most believable as the valid one because it had the most computational work done to generate it. Within Ethereum's PoW system, it was nearly impossible to create new blocks that erase transactions, create fake ones, or maintain a second chain. That's because a malicious miner would have needed to always solve the block nonce faster than everyone else. -To consistently create malicious yet valid blocks, you'd need over 51% of the network mining power to beat everyone else. You'd need a lot of computing power to be able to do this amount of "work". And the energy spent might even outweigh the gains you'd make in an attack. +To consistently create malicious yet valid blocks, a malicious miner would have needed over 51% of the network mining power to beat everyone else. That amount of "work" requires a lot of expensive computing power and the energy spent might even have outweighed the gains made in an attack. ### Proof-of-work economics {#economics} -Proof-of-work is also responsible for issuing new currency into the system and incentivizing miners to do the work. +Proof-of-work was also responsible for issuing new currency into the system and incentivizing miners to do the work. -Miners who successfully create a block get rewarded with two freshly minted ETH but no longer receive all the transaction fees, as the base fee gets burned, while the tip and block reward goes to the miner. A miner may also get 1.75 ETH for an uncle block. Uncle blocks are valid blocks created by a miner practically at the same time as another miner mined the successful block. Uncle blocks usually happen due to network latency. +Miners who successfully create a block were rewarded with two freshly minted ETH and part of the transaction fees. 1.75 ETH was also paid for an uncle block. Uncle blocks are valid blocks created by a miner practically at the same time as another miner mined the successful block. Uncle blocks usually happen due to network latency. ## Finality {#finality} A transaction has "finality" on Ethereum when it's part of a block that can't change. -Because miners work in a decentralized way, two valid blocks can get mined at the same time. This creates a temporary fork. Eventually, one of these chains will become the accepted chain after a subsequent block has been mined and added, making it longer. +Because miners worked in a decentralized way, two valid blocks could be mined at the same time. This creates a temporary fork. Eventually, one of these chains became the accepted chain after subsequent blocks were mined and added to it, making it longer. -But to complicate things further, transactions rejected on the temporary fork may have been included in the accepted chain. This means it could get reversed. So finality refers to the time you should wait before considering a transaction irreversible. For Ethereum, the recommended time is six blocks or just over 1 minute. After six blocks, you can say with relative confidence that the transaction was successful. You can wait longer for even greater assurances. - -Finality is something to bear in mind when designing dapps. It would be a poor user experience to misrepresent transaction information to your users, especially if the transaction is of high value. - -Remember, this timing doesn't include the wait times for having a transaction picked up by a miner. +But to complicate things further, transactions rejected on the temporary fork may have been included in the accepted chain. This means it could get reversed. So finality refers to the time you should wait before considering a transaction irreversible. For Ethereum, the recommended time was six blocks or just over 1 minute. After six blocks, there was high confidence that the transaction was successful - lonmgher waits gave higher confidence. Now, with proof-of-stake, finalization is an explicit, rather than probabilistic, property of a block. ## Proof-of-work energy-usage {#energy} -A major criticism of proof-of-work is the amount of energy output required to keep the network safe. To maintain security and decentralization, Ethereum on proof-of-work consumes 73.2 TWh annually, the energy equivalent of a medium-sized country like Austria. +A major criticism of proof-of-work is the amount of energy output required to keep the network safe. To maintain security and decentralization, Ethereum on proof-of-work consumed large amounts of energy. Shortly before switching to proof-of-stake, Ethereum miners were collectively consuming about 70 TWh/yr (about the same as the Czech Republic - according to [digiconomist](digiconomist.net) on 18/07/22). ## Pros and cons {#pros-and-cons} From fd4fc29f62e1cb2c34ff42b37dd7633df6cbc168 Mon Sep 17 00:00:00 2001 From: Joe Date: Mon, 18 Jul 2022 10:20:14 +0100 Subject: [PATCH 009/286] upgrade note to banner --- src/content/developers/docs/consensus-mechanisms/pow/index.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/content/developers/docs/consensus-mechanisms/pow/index.md b/src/content/developers/docs/consensus-mechanisms/pow/index.md index d8553f90faf..6a28194c0b8 100644 --- a/src/content/developers/docs/consensus-mechanisms/pow/index.md +++ b/src/content/developers/docs/consensus-mechanisms/pow/index.md @@ -7,7 +7,9 @@ sidebar: true Ethereum was always intended to be a [proof-of-stake](/developers/docs/consensus-mechanisms/pos) network, but the research and development required to implement proof-of-stake safely, securely and performantly took several years. The network was therefore started with a different consensus mechanism called **[Proof-of-work (PoW)](https://wikipedia.org/wiki/Proof_of_work)**. This allowed the nodes of the Ethereum network to agree on the state of all information recorded on the Ethereum blockchain and prevents certain kinds of economic attacks. -**Note**: _proof-of-work has now been deprecated. Ethereum no longer uses proof-of-work as a consensus mechanism._ + + Proof-of-work has now been deprecated. Ethereum no longer uses proof-of-work as a consensus mechanism. Instead, it uses proof-of-stake. Read more on proof-of-stake and staking. + ## Prerequisites {#prerequisites} From a842b2739c8fc3c1377f699fccc097e71f804295 Mon Sep 17 00:00:00 2001 From: Joe Date: Mon, 18 Jul 2022 10:30:26 +0100 Subject: [PATCH 010/286] revert gas page changes in pow branch --- src/content/developers/docs/gas/index.md | 52 +++++++++++++++++------- 1 file changed, 37 insertions(+), 15 deletions(-) diff --git a/src/content/developers/docs/gas/index.md b/src/content/developers/docs/gas/index.md index 74e90bc8eba..94a73a1cdec 100644 --- a/src/content/developers/docs/gas/index.md +++ b/src/content/developers/docs/gas/index.md @@ -18,28 +18,44 @@ Gas refers to the unit that measures the amount of computational effort required Since each Ethereum transaction requires computational resources to execute, each transaction requires a fee. Gas refers to the fee required to conduct a transaction on Ethereum successfully. -![A diagram showing where gas is needed in EVM operations](/developers/docs/gas/gas.png) +![A diagram showing where gas is needed in EVM operations](./gas.png) _Diagram adapted from [Ethereum EVM illustrated](https://takenobu-hs.github.io/downloads/ethereum_evm_illustrated.pdf)_ Gas fees are paid in Ethereum's native currency, ether (ETH). Gas prices are denoted in gwei, which itself is a denomination of ETH - each gwei is equal to 0.000000001 ETH (10-9 ETH). For example, instead of saying that your gas costs 0.000000001 ether, you can say your gas costs 1 gwei. The word 'gwei' itself means 'giga-wei', and it is equal to 1,000,000,000 wei. Wei itself (named after [Wei Dai](https://wikipedia.org/wiki/Wei_Dai), creator of [b-money](https://www.investopedia.com/terms/b/bmoney.asp)) is the smallest unit of ETH. -## How Gas works {#how-gas-works} +## Prior to the London upgrade {#pre-london} -Since the [London Upgrade](/history/#london) every block has a base fee, the minimum price per unit of gas for inclusion in this block, calculated by the network based on demand for block space. As the base fee of the transaction fee is burnt, users are also expected to set a tip (priority fee) in their transactions. The tip compensates validators for executing and propagating user transactions in blocks and is expected to be set automatically by most wallets. +The way transaction fees on the Ethereum network were calculated changed with [the London Upgrade](/history/#london) of August 2021. Here is a recap of how things used to work: -Calculating the total transaction fee works as follows: +Let's say Alice had to pay Bob 1 ETH. +In the transaction, the gas limit is 21,000 units, and the gas price is 200 gwei. -`Gas units (limit) * (Base fee + Tip)` +Total fee would have been: `Gas units (limit) * Gas price per unit` +i.e `21,000 * 200 = 4,200,000 gwei` or 0.0042 ETH -Let's say Jordan has to pay Taylor 1 ETH. In the transaction, the gas limit is 21,000 units and the base fee is 100 gwei. Jordan includes a tip of 10 gwei. +When Alice sent the money, 1.0042 ETH would be deducted from Alice's account. +Bob would be credited 1.0000 ETH. +Miner would receive 0.0042 ETH. + +This video offers a concise overview of gas and why it exists: + + -Using the formula above we can calculate this as +## After the London upgrade {#post-london} -`21,000 * (100 + 10) = 2,310,000 gwei` or 0.00231 ETH. +[The London Upgrade](/history/#london) was implemented on August 5th, 2021, to make transacting on Ethereum more predictable for users by overhauling Ethereum's transaction-fee-mechanism. The high-level benefits introduced by this change include better transaction fee estimation, generally quicker transaction inclusion, and offsetting the ETH issuance by burning a percentage of transaction fees. + +Starting with the London network upgrade, every block has a base fee, the minimum price per unit of gas for inclusion in this block, calculated by the network based on demand for block space. As the base fee of the transaction fee is burnt, users are also expected to set a tip (priority fee) in their transactions. The tip compensates miners for executing and propagating user transactions in blocks and is expected to be set automatically by most wallets. + +Calculating the total transaction fee works as follows: `Gas units (limit) * (Base fee + Tip)` + +Let's say Jordan has to pay Taylor 1 ETH. In the transaction, the gas limit is 21,000 units and the base fee is 100 gwei. Jordan includes a tip of 10 gwei. + +Using the formula above we can calculate this as `21,000 * (100 + 10) = 2,310,000 gwei` or 0.00231 ETH. When Jordan sends the money, 1.00231 ETH will be deducted from Jordan's account. Taylor will be credited 1.0000 ETH. -Validator receives the tip of 0.00021 ETH. +Miner receives the tip of 0.00021 ETH. Base fee of 0.0021 ETH is burned. Additionally, Jordan can also set a max fee (`maxFeePerGas`) for the transaction. The difference between the max fee and the actual fee is refunded to Jordan, i.e. `refund = max fee - (base fee + priority fee)`. Jordan can set a maximum amount to pay for the transaction to execute and not worry about overpaying "beyond" the base fee when the transaction is executed. @@ -52,7 +68,7 @@ The London Upgrade introduced variable-size blocks to Ethereum. Each block has a ### Base fee {#base-fee} -Every block has a base fee which acts as a reserve price. To be eligible for inclusion in a block the offered price per gas must at least equal the base fee. The base fee is calculated independently of the current block and is instead determined by the blocks before it - making transaction fees more predictable for users. When the block is added to the blockchain this base fee is "burned", removing it from circulation. +Every block has a base fee which acts as a reserve price. To be eligible for inclusion in a block the offered price per gas must at least equal the base fee. The base fee is calculated independently of the current block and is instead determined by the blocks before it - making transaction fees more predictable for users. When the block is mined this base fee is "burned", removing it from circulation. The base fee is calculated by a formula that compares the size of the previous block (the amount of gas used for all the transactions) with the target size. The base fee will increase by a maximum of 12.5% per block if the target block size is exceeded. This exponential growth makes it economically non-viable for block size to remain high indefinitely. @@ -81,7 +97,9 @@ It's also important to note it is unlikely we will see extended spikes of full b ### Priority fee (tips) {#priority-fee} -In addition to the base fee, which is burned, there is also a priority fee (tip) to incentivize validators to include a transaction in the block. Without tips, validators would find it economically viable to propose empty blocks, as they would receive the same block reward. Under normal conditions, a small tip provides validators a sufficient incentive to include a transaction. For transactions that need to get preferentially executed ahead of other transactions in the same block, a higher tip will be necessary to attempt to outbid competing transactions. +Before the London Upgrade, miners would receive the total gas fee from any transaction included in a block. + +With the new base fee getting burned, the London Upgrade introduced a priority fee (tip) to incentivize miners to include a transaction in the block. Without tips, miners would find it economically viable to mine empty blocks, as they would receive the same block reward. Under normal conditions, a small tip provides miners a minimal incentive to include a transaction. For transactions that need to get preferentially executed ahead of other transactions in the same block, a higher tip will be necessary to attempt to outbid competing transactions. ### Max fee {#maxfee} @@ -89,13 +107,13 @@ To execute a transaction on the network, users can specify a maximum limit they ### Calculating fees {#calculating-fees} -For wallets that support the London upgrade, instead of explicitly stating how much you are willing to pay to get your transaction through, wallet providers will automatically set a recommended transaction fee (base fee + recommended priority fee) to reduce the amount of complexity burdened onto their users. +One of the main benefits of the London upgrade is improving the user's experience when setting transaction fees. For wallets that support the upgrade, instead of explicitly stating how much you are willing to pay to get your transaction through, wallet providers will automatically set a recommended transaction fee (base fee + recommended priority fee) to reduce the amount of complexity burdened onto their users. ## EIP-1559 {#eip-1559} The implementation of [EIP-1559](https://github.com/ethereum/EIPs/blob/master/EIPS/eip-1559.md) in the London Upgrade made the transaction fee mechanism more complex than the previous gas price auction, but it has the advantage of making gas fees more predictable, resulting in a more efficient transaction fee market. Users can submit transactions with a `maxFeePerGas` corresponding to how much they are willing to pay for the transaction to be executing, knowing that they will not pay more than the market price for gas (`baseFeePerGas`), and get any extra, minus their tip, refunded. -This video explains EIP-1559 and the benefits it brought: +This video explains EIP-1559 and the benefits it brings: @@ -117,7 +135,7 @@ _Diagram adapted from [Ethereum EVM illustrated](https://takenobu-hs.github.io/d Gas limit refers to the maximum amount of gas you are willing to consume on a transaction. More complicated transactions involving [smart contracts](/developers/docs/smart-contracts/) require more computational work, so they require a higher gas limit than a simple payment. A standard ETH transfer requires a gas limit of 21,000 units of gas. -For example, if you put a gas limit of 50,000 for a simple ETH transfer, the EVM would consume 21,000, and you would get back the remaining 29,000. However, if you specify too little gas, for example, a gas limit of 20,000 for a simple ETH transfer, the EVM will consume your 20,000 gas units attempting to fulfill the transaction, but it will not complete. The EVM then reverts any changes, but since the block-proposer has already done 20k gas units worth of work, that gas is consumed. +For example, if you put a gas limit of 50,000 for a simple ETH transfer, the EVM would consume 21,000, and you would get back the remaining 29,000. However, if you specify too little gas, for example, a gas limit of 20,000 for a simple ETH transfer, the EVM will consume your 20,000 gas units attempting to fulfill the transaction, but it will not complete. The EVM then reverts any changes, but since the miner has already done 20k gas units worth of work, that gas is consumed. ## Why can gas fees get so high? {#why-can-gas-fees-get-so-high} @@ -133,7 +151,7 @@ Layer 2 scaling is a primary initiative to greatly improve gas costs, user exper ## Strategies for you to reduce gas costs {#strategies-for-you-to-reduce-gas-costs} -If you are looking to reduce gas costs for your ETH, you can set a tip to indicate the priority level of your transaction. Validators will execute transactions that offer a higher tip per gas, as they get to keep the tips that you pay and will be less inclined to execute transactions with lower tips set. +If you are looking to reduce gas costs for your ETH, you can set a tip to indicate the priority level of your transaction. Miners will 'work on' and execute transactions that offer a higher tip per gas, as they get to keep the tips that you pay and will be less inclined to execute transactions with lower tips set. If you want to monitor gas prices, so you can send your ETH for less, you can use many different tools such as: @@ -154,3 +172,7 @@ If you want to monitor gas prices, so you can send your ETH for less, you can us - [Is Ethereum more expensive to use as price rises?](https://docs.ethhub.io/questions-about-ethereum/is-ethereum-more-expensive-to-use-as-price-rises/) - [Reducing the gas consumption of your Smart Contracts](https://medium.com/coinmonks/8-ways-of-reducing-the-gas-consumption-of-your-smart-contracts-9a506b339c0a) - [Proof of Stake versus Proof of Work](https://blockgeeks.com/guides/proof-of-work-vs-proof-of-stake/) + +## Related topics {#related-topics} + +- [Mining](/developers/docs/consensus-mechanisms/pow/mining/) From d95d117d64450ca5f3ab2494ee9a9b0c311bc351 Mon Sep 17 00:00:00 2001 From: Joe Date: Mon, 18 Jul 2022 11:40:08 +0100 Subject: [PATCH 011/286] update pow/mining for post-merge --- .../consensus-mechanisms/pow/mining/index.md | 26 +++++++++---------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/src/content/developers/docs/consensus-mechanisms/pow/mining/index.md b/src/content/developers/docs/consensus-mechanisms/pow/mining/index.md index 08c9078bc63..9c1a47f5f51 100644 --- a/src/content/developers/docs/consensus-mechanisms/pow/mining/index.md +++ b/src/content/developers/docs/consensus-mechanisms/pow/mining/index.md @@ -3,47 +3,45 @@ title: Mining description: An explanation of how mining works in Ethereum and how it helps keep Ethereum secure and decentralized. lang: en sidebar: true -preMergeBanner: true --- - Proof-of-stake will soon replace proof-of-work as Ethereum's consensus mechanism, meaning mining will be switched off. Instead, Ethereum will be secured by validators who stake ETH. You can start staking your ETH today. Read more on The Merge, proof-of-stake and staking. + Proof-of-work is no longer Ethereum's consensus mechanism, meaning mining has been switched off. Instead, Ethereum is secured by validators who stake ETH. You can start staking your ETH today. Read more on The Merge, proof-of-stake and staking. This page is for historical interest! - + + ## Prerequisites {#prerequisites} To better understand this page, we recommend you first read up on [transactions](/developers/docs/transactions/), [blocks](/developers/docs/blocks/) and [proof-of-work](/developers/docs/consensus-mechanisms/pow/). ## What is Ethereum mining? {#what-is-ethereum-mining} -Mining is the process of creating a block of transactions to be added to the Ethereum blockchain. +Mining is the process of creating a block of transactions to be added to the Ethereum blockchain in Ethereum's now-deprecated proof-of-work architecture. -The word mining originates in the context of the gold analogy for crypto currencies. Gold or precious metals are scarce, so are digital tokens, and the only way to increase the total volume is through mining. This is appropriate to the extent that in Ethereum too, the only mode of issuance post launch is via mining. Unlike these examples however, mining is also the way to secure the network by creating, verifying, publishing and propagating blocks in the blockchain. +The word mining originates in the context of the gold analogy for crypto currencies. Gold or precious metals are scarce, so are digital tokens, and the only way to increase the total volume in a proof-of-work system is through mining. In proof-of-work Ethereum, the only mode of issuance was via mining. Unlike gold or precious metals however, Ethereum mining was also the way to secure the network by creating, verifying, publishing and propagating blocks in the blockchain. Mining ether = Securing the Network -Ethereum, like Bitcoin, currently uses a [proof-of-work (PoW)](/developers/docs/consensus-mechanisms/pow/) consensus mechanism. Mining is the lifeblood of proof-of-work. Ethereum miners - computers running software - using their time and computation power to process transactions and produce blocks. +Mining is the lifeblood of proof-of-work. Ethereum miners - computers running software - used their time and computation power to process transactions and produce blocks. ## Why do miners exist? {#why-do-miners-exist} -In decentralized systems like Ethereum, we need to ensure that everyone agrees on the order of transactions. Miners help this happen by solving computationally difficult puzzles to produce blocks, securing the network from attacks. +In decentralized systems like Ethereum, we need to ensure that everyone agrees on the order of transactions. Miners helped this happen by solving computationally difficult puzzles to produce blocks, securing the network from attacks. [More on proof-of-work](/developers/docs/consensus-mechanisms/pow/) -## Who can become a miner on Ethereum? {#who-can-become-a-miner} - -Technically, anyone can mine on the Ethereum network using their computer. However, not everyone can mine ether (ETH) profitably. In most cases, miners must purchase dedicated computer hardware to mine profitably. While it is true anyone can run the mining software on their computer, it is unlikely that the average computer would earn enough block rewards to cover the associated costs of mining. +Anyone could mine on the Ethereum network using their computer. However, not everyone could mine ether (ETH) profitably. In most cases, miners had to purchase dedicated computer hardware. The average computer was unlikely to earn enough block rewards to cover the associated costs of mining. ### Cost of mining {#cost-of-mining} - Potential costs of the hardware necessary to build and maintain a mining rig - Electrical cost of powering the mining rig -- If you are mining in a pool, mining pools typically charge a flat % fee of each block generated by the pool +- If you were mining in a pool, mining pools typically charge a flat % fee of each block generated by the pool - Potential cost of equipment to support mining rig (ventilation, energy monitoring, electrical wiring, etc.) To further explore mining profitability, use a mining calculator, such as the one [Etherscan](https://etherscan.io/ether-mining-calculator) provides. -## How Ethereum transactions are mined {#how-ethereum-transactions-are-mined} +## How Ethereum transactions were mined {#how-ethereum-transactions-were-mined} 1. A user writes and signs a [transaction](/developers/docs/transactions/) request with the private key of some [account](/developers/docs/accounts/). 2. The user broadcasts the transaction request to the entire Ethereum network from some [node](/developers/docs/nodes-and-clients/). @@ -66,7 +64,9 @@ Watch Austin walk you through mining and the proof-of-work blockchain. ## The mining algorithm {#mining-algorithm} -The Ethereum mining algorithm has undergone several upgrades since its inception. The original algorithm, "Dagger Hashimoto" was based around the provision of a large, transient, randomly generated dataset which forms a [Directed Acyclic Graph](https://en.wikipedia.org/wiki/Directed_acyclic_graph) (the Dagger-part), with miners attempting to solve a particular constraint on it, partly determined through a block’s header-hash. This algorithm was novel because it had high memory-access bandwidth requirements but could be run using a modest processor, making it GPU-friendly but resistant to the type of ASIC-driven hardware arms race that could pose a centralization risk (more on [problems with ASICS](https://www.investopedia.com/investing/why-centralized-crypto-mining-growing-problem/)). After substantial upgrades to the algorithm, it was renamed to "Ethash". This renaming happened before mining began on Ethereum mainnet. Dagger-Hashimoto was a precursor, research algorithm that was not used on Ethereum mainnet. +Ethereum Mainnet onyl ever used one mining algorithm - ['Ethash'](/developers/docs/consensus-mechanisms/pow/mining/mining-algorithms/ethash). This was a successor to an original R&D algorithm known as ['Dagger-Hashamoto'](/developers/docs/consensus-mechanisms/pow/mining/mining-algorithms/dagger-hashamoto). + +The algorithm is based around the provision of a large, transient, randomly generated dataset which forms a [Directed Acyclic Graph](https://en.wikipedia.org/wiki/Directed_acyclic_graph) (the Dagger-part), with miners attempting to solve a particular constraint on it, partly determined through a block’s header-hash. This has high memory-access bandwidth requirements but could be run using a modest processor, making it GPU-friendly but resistant to the type of ASIC-driven hardware arms race that could pose a centralization risk (more on [problems with ASICS](https://www.investopedia.com/investing/why-centralized-crypto-mining-growing-problem/)). ASICs for Ethereum mining were eventually developed, but the majority of mining on Ethereum was nevertheless done using GPUs. More information on these mining algorithms is available at our [mining algorithms page](/developers/docs/consensus-mechanisms/pow/mining-algorithms/). From 361b5aef8b6c9cfcaa9a66ec3f7732cafe70692e Mon Sep 17 00:00:00 2001 From: Joe Date: Mon, 18 Jul 2022 11:46:03 +0100 Subject: [PATCH 012/286] update mining algorithms page --- .../pow/mining-algorithms/index.md | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/src/content/developers/docs/consensus-mechanisms/pow/mining-algorithms/index.md b/src/content/developers/docs/consensus-mechanisms/pow/mining-algorithms/index.md index dae534116c8..e7a444f933c 100644 --- a/src/content/developers/docs/consensus-mechanisms/pow/mining-algorithms/index.md +++ b/src/content/developers/docs/consensus-mechanisms/pow/mining-algorithms/index.md @@ -6,9 +6,12 @@ sidebar: true preMergeBanner: true --- -Ethereum mining has used two mining algorithms, Dagger Hashimoto and Ethash. Dagger Hashimoto was never used to mine Ethereum, being superseded by Ethash before mainet launched. It was a R&D mining algorithm that paved the way for Ethash. However, it has historical significance as an important innovation in Ethereum's development. Proof-of-work mining itself will be deprecated in favor of proof-of-stake during [The Merge](/upgrades/merge/), which is forecast to happen in Q3-Q4 2022. - -The fundamental idea of both mining algorithms is that a miner tries to find a nonce input using brute force computation so that the result is below a certain difficulty threshold. This difficulty threshold can be dynamically adjusted, allowing block production to happen at a regular interval. + + Proof-of-work is no longer Ethereum's consensus mechanism, meaning mining has been switched off. Instead, Ethereum is secured by validators who stake ETH. You can start staking your ETH today. Read more on The Merge, proof-of-stake and staking. This page is for historical interest! + + + +Ethereum mining used an algorithm known as Ethash. The fundamental idea of the algorithm is that a miner tries to find a nonce input using brute force computation so that the result is below a certain difficulty threshold. This difficulty threshold can be dynamically adjusted, allowing block production to happen at a regular interval. ## Prerequisites {#prerequisites} @@ -16,7 +19,7 @@ To better understand this page, we recommend you first read up on [proof-of-work ## Dagger Hashimoto {#dagger-hashimoto} -Dagger Hashimoto was a precursor research algorithm for Ethereum mining that Ethash superseded. It was an amalgamation of two different algorithms: Dagger and Hashimoto. +Dagger Hashimoto was a precursor research algorithm for Ethereum mining that Ethash superseded. It was an amalgamation of two different algorithms: Dagger and Hashimoto. It was only ever a research implementation and was superceded by Ethash by the time Ethereum Mainnet launched. [Dagger](http://www.hashcash.org/papers/dagger.html) involves the generation of a [Directed Acyclic Graph](https://en.wikipedia.org/wiki/Directed_acyclic_graph), random slices of which get hashed together. The core principle is that each nonce only requires a small portion of a large total data tree. Recomputing the subtree for each nonce is prohibitive for mining - hence the need to store the tree - but okay for a single nonce’s worth of verification. Dagger was designed to be an alternative to existing algorithms like Scrypt, which are memory-hard but difficult to verify when their memory-hardness increases to genuinely secure levels. However, Dagger was vulnerable to shared memory hardware acceleration and dropped in favor of other avenues of research. @@ -28,7 +31,7 @@ More on [Dagger-Hashimoto](/developers/docs/consensus-mechanisms/pow/mining-algo ## Ethash {#ethash} -Ethash is Ethereum's current mining algorithm. Ethash was effectively a new name given to a specific version of Dagger-Hashimoto after the algorithm got significantly updated, whilst still inheriting the fundamental principles of its predecessor. Ethereum mainnet has only ever used Ethash - Dagger Hashimoto was an R&D version of the mining algorithm that was superseded before mining started on Ethereum mainnet. +Ethash the mining algorithm that was actually used on the real Ethereum Mainnet. Ethash was effectively a new name given to a specific version of Dagger-Hashimoto after the algorithm got significantly updated, whilst still inheriting the fundamental principles of its predecessor. Ethereum Mainnet only ever used Ethash - Dagger Hashimoto was an R&D version of the mining algorithm that was superseded before mining started on Ethereum mainnet. [More on Ethash](/developers/docs/consensus-mechanisms/pow/mining-algorithms/ethash). From 71f098e89feb0d2c2cc7235993ac49fb0d04450f Mon Sep 17 00:00:00 2001 From: Joe Date: Mon, 18 Jul 2022 11:56:40 +0100 Subject: [PATCH 013/286] update ethash page --- .../pow/mining-algorithms/ethash/index.md | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/src/content/developers/docs/consensus-mechanisms/pow/mining-algorithms/ethash/index.md b/src/content/developers/docs/consensus-mechanisms/pow/mining-algorithms/ethash/index.md index b937f7ea659..a7a89f53548 100644 --- a/src/content/developers/docs/consensus-mechanisms/pow/mining-algorithms/ethash/index.md +++ b/src/content/developers/docs/consensus-mechanisms/pow/mining-algorithms/ethash/index.md @@ -5,9 +5,15 @@ lang: en sidebar: true --- -**Note that Ethash is Ethereum's proof-of-work mining algorithm. Proof-of-work mining will be switched off completely at [The Merge](/upgrades/merge) at which point Ethereum will be secured using a [proof-of-stake](/developers/docs/consensus-mechanisms/pos) mechanism instead.** + + Ethash is Ethereum's proof-of-work mining algorithm. Proof-of-work has now been **switched off entirely** and Ethereum is now secured using [proof-of-stake](/developers/docs/consensus-mechanisms/pos) instead. Read more on The Merge, proof-of-stake and staking. This page is for historical interest! + -[Ethash](https://github.com/ethereum/wiki/wiki/Ethash) is a modified version of the [Dagger-Hashimoto](/developers/docs/consensus-mechanisms/pow/mining-algorithms/dagger-hashamoto) algorithm. Ethash proof-of-work is [memory hard](https://wikipedia.org/wiki/Memory-hard_function), which was thought to make the algorithm ASIC resistant, but ASIC Ethash-mining has since been shown to be possible. Memory hardness is achieved with a proof of work algorithm that requires choosing subsets of a fixed resource dependent on the nonce and block header. This resource (a few gigabytes in size) is called a DAG. The DAG is changed every 30000 blocks, a 125-hour window called an epoch (roughly 5.2 days) and takes a while to generate. Since the DAG only depends on block height, it can be pre-generated but if it's not, the client needs to wait until the end of this process to produce a block. If clients do not pre-generate and cache DAGs ahead of time the network may experience massive block delay on each epoch transition. Note that the DAG does not need to be generated for verifying the proof-of-work essentially allowing for verification with both low CPU and small memory. +[Ethash](https://github.com/ethereum/wiki/wiki/Ethash) is a modified version of the [Dagger-Hashimoto](/developers/docs/consensus-mechanisms/pow/mining-algorithms/dagger-hashamoto) algorithm. Ethash proof-of-work is [memory hard](https://wikipedia.org/wiki/Memory-hard_function), which was thought to make the algorithm ASIC resistant. Ethash ASICs were eventually developed but GPU mining was still a viable option until proof-of-work was switched off. Ethash is still used to mine other coins on other non-Ethereum proof-of-work networks. + +## How does Ethash work? {#how-does-ethash-work} + +Memory hardness is achieved with a proof of work algorithm that requires choosing subsets of a fixed resource dependent on the nonce and block header. This resource (a few gigabytes in size) is called a DAG. The DAG is changed every 30000 blocks, a 125-hour window called an epoch (roughly 5.2 days) and takes a while to generate. Since the DAG only depends on block height, it can be pre-generated but if it's not, the client needs to wait until the end of this process to produce a block. If clients do not pre-generate and cache DAGs ahead of time the network may experience massive block delay on each epoch transition. Note that the DAG does not need to be generated for verifying the proof-of-work essentially allowing for verification with both low CPU and small memory. The general route that the algorithm takes is as follows: From 30d8b351fd48ac62075916792e55ff2432d80aa6 Mon Sep 17 00:00:00 2001 From: Joshua <62268199+minimalsm@users.noreply.github.com> Date: Mon, 18 Jul 2022 12:38:07 +0100 Subject: [PATCH 014/286] Update src/content/developers/docs/consensus-mechanisms/pow/mining-algorithms/ethash/index.md --- .../consensus-mechanisms/pow/mining-algorithms/ethash/index.md | 1 + 1 file changed, 1 insertion(+) diff --git a/src/content/developers/docs/consensus-mechanisms/pow/mining-algorithms/ethash/index.md b/src/content/developers/docs/consensus-mechanisms/pow/mining-algorithms/ethash/index.md index a7a89f53548..04ddfa90f12 100644 --- a/src/content/developers/docs/consensus-mechanisms/pow/mining-algorithms/ethash/index.md +++ b/src/content/developers/docs/consensus-mechanisms/pow/mining-algorithms/ethash/index.md @@ -11,6 +11,7 @@ sidebar: true [Ethash](https://github.com/ethereum/wiki/wiki/Ethash) is a modified version of the [Dagger-Hashimoto](/developers/docs/consensus-mechanisms/pow/mining-algorithms/dagger-hashamoto) algorithm. Ethash proof-of-work is [memory hard](https://wikipedia.org/wiki/Memory-hard_function), which was thought to make the algorithm ASIC resistant. Ethash ASICs were eventually developed but GPU mining was still a viable option until proof-of-work was switched off. Ethash is still used to mine other coins on other non-Ethereum proof-of-work networks. + ## How does Ethash work? {#how-does-ethash-work} Memory hardness is achieved with a proof of work algorithm that requires choosing subsets of a fixed resource dependent on the nonce and block header. This resource (a few gigabytes in size) is called a DAG. The DAG is changed every 30000 blocks, a 125-hour window called an epoch (roughly 5.2 days) and takes a while to generate. Since the DAG only depends on block height, it can be pre-generated but if it's not, the client needs to wait until the end of this process to produce a block. If clients do not pre-generate and cache DAGs ahead of time the network may experience massive block delay on each epoch transition. Note that the DAG does not need to be generated for verifying the proof-of-work essentially allowing for verification with both low CPU and small memory. From dab2cddb66c3b4f769d08ae74442fa8f63e1d1a4 Mon Sep 17 00:00:00 2001 From: Joshua <62268199+minimalsm@users.noreply.github.com> Date: Mon, 18 Jul 2022 12:47:43 +0100 Subject: [PATCH 015/286] Update src/content/developers/docs/consensus-mechanisms/pow/mining-algorithms/ethash/index.md --- .../consensus-mechanisms/pow/mining-algorithms/ethash/index.md | 1 - 1 file changed, 1 deletion(-) diff --git a/src/content/developers/docs/consensus-mechanisms/pow/mining-algorithms/ethash/index.md b/src/content/developers/docs/consensus-mechanisms/pow/mining-algorithms/ethash/index.md index 04ddfa90f12..a7a89f53548 100644 --- a/src/content/developers/docs/consensus-mechanisms/pow/mining-algorithms/ethash/index.md +++ b/src/content/developers/docs/consensus-mechanisms/pow/mining-algorithms/ethash/index.md @@ -11,7 +11,6 @@ sidebar: true [Ethash](https://github.com/ethereum/wiki/wiki/Ethash) is a modified version of the [Dagger-Hashimoto](/developers/docs/consensus-mechanisms/pow/mining-algorithms/dagger-hashamoto) algorithm. Ethash proof-of-work is [memory hard](https://wikipedia.org/wiki/Memory-hard_function), which was thought to make the algorithm ASIC resistant. Ethash ASICs were eventually developed but GPU mining was still a viable option until proof-of-work was switched off. Ethash is still used to mine other coins on other non-Ethereum proof-of-work networks. - ## How does Ethash work? {#how-does-ethash-work} Memory hardness is achieved with a proof of work algorithm that requires choosing subsets of a fixed resource dependent on the nonce and block header. This resource (a few gigabytes in size) is called a DAG. The DAG is changed every 30000 blocks, a 125-hour window called an epoch (roughly 5.2 days) and takes a while to generate. Since the DAG only depends on block height, it can be pre-generated but if it's not, the client needs to wait until the end of this process to produce a block. If clients do not pre-generate and cache DAGs ahead of time the network may experience massive block delay on each epoch transition. Note that the DAG does not need to be generated for verifying the proof-of-work essentially allowing for verification with both low CPU and small memory. From 2790bf92a4381dad05e97895d59fceb8b6cc5cf8 Mon Sep 17 00:00:00 2001 From: Joe Date: Mon, 18 Jul 2022 13:42:13 +0100 Subject: [PATCH 016/286] update staking content --- src/content/staking/pools/index.md | 12 ++---------- src/content/staking/saas/index.md | 14 +------------- src/content/staking/solo/index.md | 22 +++------------------- 3 files changed, 6 insertions(+), 42 deletions(-) diff --git a/src/content/staking/pools/index.md b/src/content/staking/pools/index.md index b1e24cca95a..2fafcf9b19f 100644 --- a/src/content/staking/pools/index.md +++ b/src/content/staking/pools/index.md @@ -67,17 +67,9 @@ Typically ERC-20 liquidity tokens are issued to stakers that represents the valu -Currently, withdrawing funds from a validator on the Beacon Chain is not possible, which currently limits the ability to actually redeem your liquidity token for the ETH rewards locked in the consensus layer. +Currently, withdrawing funds from an Ethereum validator is not possible, which limits the ability to actually redeem your liquidity token for the ETH rewards locked in the consensus layer. -Alternatively, pools that utilize an ERC-20 liquidity token allow users to trade this token in the open market, effectively allowing you to "withdraw" without actually removing ETH from the Beacon Chain. - - - -Pooled stakers do not need to do anything to prepare for The Merge. - -However, as The Merge approaches, be on high alert for scammers. **You do not need to upgrade your ETH or staked ETH tokens** for the transition to proof-of-stake. - -Learn more about [The Merge](/upgrades/merge/) +Alternatively, pools that utilize an ERC-20 liquidity token allow users to trade this token in the open market, effectively allowing you to "withdraw" without actually removing ETH from the staking contract. diff --git a/src/content/staking/saas/index.md b/src/content/staking/saas/index.md index a1cbfb54500..34de01d1bc3 100644 --- a/src/content/staking/saas/index.md +++ b/src/content/staking/saas/index.md @@ -76,21 +76,9 @@ All of these keys can always be regenerated in a reproducible manner using your - When you stake 32 ETH with a SaaS provider, that ETH is still deposited to the official staking deposit contract. As such, SaaS stakers are currently limited by the same withdrawal restrictions as solo stakers. This means that staking your ETH is currently a one-way deposit. This will be the case until the Shanghai upgrade planned to follow the Merge. + When you stake 32 ETH with a SaaS provider, that ETH is still deposited to the official staking deposit contract. As such, SaaS stakers are currently limited by the same withdrawal restrictions as solo stakers. This means that staking your ETH is currently a one-way deposit. This will be the case until the Shanghai upgrade. - - After the Merge, SaaS stakers will begin to receive unburnt transaction fees/tips. Check with your provider to determine how to update your settings to include an Ethereum address you control where these funds will be sent when the time comes. - -The Merge will not enable the ability to withdraw your stake or protocol rewards; this feature is planned for the Shanghai upgrade, which will follow the Merge by an estimated six months to a year. - - - -SaaS stakers do not need to do anything to prepare for The Merge. - -There are a few things node operators must attend to for this upgrade. Check with your staking provider for assurance their systems are ready to go. - -Learn more about [The Merge](/upgrades/merge/) diff --git a/src/content/staking/solo/index.md b/src/content/staking/solo/index.md index 4f64ba0b2e0..14232b6a67f 100644 --- a/src/content/staking/solo/index.md +++ b/src/content/staking/solo/index.md @@ -9,7 +9,7 @@ image: ../../../assets/staking/leslie-solo.png alt: Leslie the rhino on her own computer chip. sidebarDepth: 2 summaryPoints: - - Receive maximum rewards directly from the protocol (including unburnt fees after The Merge) for keeping your validator properly functioning and online + - Receive maximum rewards directly from the protocol for keeping your validator properly functioning and online - Run home hardware and personally add to the security and decentralization of the Ethereum network - Remove trust, and never give up control of the keys to your funds --- @@ -58,7 +58,7 @@ As much as we wish that solo staking was accessible and risk free to everyone, t

Ethereum security and scam prevention

- Withdrawing staked ETH or rewards from a validator balance is not yet supported. Support for withdrawals are planned for the Shanghai upgrade following The Merge. You should anticipate your ETH being locked for at least one-to-two years. After the Shanghai upgrade you will be able to freely withdraw portions or all of your stake if you wish. + Withdrawing staked ETH or rewards from a validator balance is not yet supported. Support for withdrawals are planned for the Shanghai upgrade. You should anticipate your ETH being locked for at least one-to-two years. After the Shanghai upgrade you will be able to freely withdraw portions or all of your stake if you wish. Hardware occasionally fails, network connections error out, and client software occasionally needs upgrading. Node maintenance is inevitable and will occasionally require your attention. You'll want to be sure you stay aware of any anticipated network upgrades, or other critical client upgrades. @@ -89,10 +89,6 @@ The Staking Launchpad is an open source application that will help you become a - -Note for existing stakers: The Merge is approaching, which brings a few changes since staking was launched. Make sure you're prepared with the Merge readiness checklist over on the Staking Launchpad. - - ## What to consider with node and client setup tools {#node-tool-considerations} There are a growing number of tools and services to help you solo stake your ETH, but each come with different risks and benefits. @@ -130,7 +126,7 @@ Have a suggestion for a staking tool we missed? Check out our [product listing p These are a few of the most common questions about staking that are worth knowing about. -A validator is a virtual entity that lives on the Beacon Chain and participates in the consensus of the Ethereum protocol. Validators are represented by a balance, public key, and other properties. A validator client is the software that acts on behalf of the validator by holding and using its private key. A single validator client can hold many key pairs, controlling many validators. +A validator is a virtual entity that lives on Ethereum and participates in the consensus of the Ethereum protocol. Validators are represented by a balance, public key, and other properties. A validator client is the software that acts on behalf of the validator by holding and using its private key. A single validator client can hold many key pairs, controlling many validators. @@ -180,18 +176,6 @@ Offline penalties are proportional to how many others are offline at the same ti More on rewards and penalties - -Stakers currently running a consensus layer client (Beacon Chain) will also be required to run an execution layer client after The Merge. The new Engine API will be used to interface between the two layers, requiring a JWT secret. If you currently run a Beacon Chain without an execution layer client, you will need to sync the execution layer before The Merge to stay in sync with the network. - -The Merge will also bring unburnt transaction fees to validators. These fees do not accumulate in the balance associated with the validator keys but instead can be directed to a regular Ethereum address of your choice. To receive your tips (priority fees) from proposed blocks, you should update your client settings with the address you want your tips sent to. - -Links to individual client documentation and additional information can be found on the Merge readiness checklist over on the Launchpad. - - -Merge readiness checklist - - - ## Further reading {#further-reading} - [Ethereum's Client Diversity Problem](https://hackernoon.com/ethereums-client-diversity-problem) - _@emmanuelawosika 2022_ From 794af2cd355801ec2515fed0764246326934348d Mon Sep 17 00:00:00 2001 From: Joe Date: Mon, 18 Jul 2022 14:29:04 +0100 Subject: [PATCH 017/286] update pos page --- .../docs/consensus-mechanisms/pos/index.md | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/src/content/developers/docs/consensus-mechanisms/pos/index.md b/src/content/developers/docs/consensus-mechanisms/pos/index.md index a54dbc96483..f8ee157dccd 100644 --- a/src/content/developers/docs/consensus-mechanisms/pos/index.md +++ b/src/content/developers/docs/consensus-mechanisms/pos/index.md @@ -5,7 +5,7 @@ lang: en sidebar: true --- -Proof-of-stake (PoS) is the [consensus mechanism](/developers/docs/consensus-mechanisms/) that Ethereum will use after [The Merge](/upgrades/merge). Ethereum is moving off of [proof-of-work (PoW)](/developers/docs/consensus-mechanisms/pow/) to proof-of-stake because it is more secure, less energy-intensive, and better for implementing new scaling solutions. While it has always been the plan to transition to proof-of-stake, it is also more complex than proof-of-work, and refining the mechanism has taken years of research and development. The challenge now is to implement proof-of-stake on Ethereum Mainnet. This process is called ["The Merge"](/upgrades/merge/). +Proof-of-stake (PoS) is Ethereum's [consensus mechanism](/developers/docs/consensus-mechanisms/). Ethereum switched on its proof-of-stake mechanism in 2022 because it is more secure, less energy-intensive, and better for implementing new scaling solutions compared to the previous consensus mechanism, [proof-of-work](/developers/docs/consensus-mechanisms/pow). ## Prerequisites {#prerequisites} @@ -13,9 +13,9 @@ To better understand this page, we recommend you first read up on [consensus mec ## What is proof-of-stake (PoS)? {#what-is-pos} -Proof-of-stake is a type of [consensus mechanism](/developers/docs/consensus-mechanisms/) used by blockchains to achieve distributed consensus. In proof-of-work, miners prove they have capital at risk by expending energy. In proof-of-stake, validators explicitly stake capital in the form of ether into a smart contract on Ethereum. This staked ether then acts as collateral that can be destroyed if the validator behaves dishonestly or lazily. The validator is then responsible for checking that new blocks propagated over the network are valid and occasionally creating and propagating new blocks themselves. +Proof-of-stake is a type of [consensus mechanism](/developers/docs/consensus-mechanisms/) used by blockchains to achieve distributed consensus. In proof-of-work, miners prove they have capital at risk by expending energy. In proof-of-stake, validators explicitly stake capital in the form of ETH into a smart contract on Ethereum. This staked ETH then acts as collateral that can be destroyed if the validator behaves dishonestly or lazily. The validator is then responsible for checking that new blocks propagated over the network are valid and occasionally creating and propagating new blocks themselves. -Proof-of-stake comes with a number of improvements to the proof-of-work system: +Proof-of-stake comes with a number of improvements to the now-deprecated proof-of-work system: - better energy efficiency – there is no need to use lots of energy on proof-of-work computations - lower barriers to entry, reduced hardware requirements – there is no need for elite hardware to stand a chance of creating new blocks @@ -26,17 +26,17 @@ Proof-of-stake comes with a number of improvements to the proof-of-work system: ## Validators {#validators} -To participate as a validator, a user must deposit 32 ETH into the deposit contract and run three separate pieces of software: an execution client, a consensus client, and a validator. On depositing their ether, the user joins an activation queue that limits the rate of new validators joining the network. Once activated, validators receive new blocks from peers on the Ethereum network. The transactions delivered in the block are re-executed, and the block signature is checked to ensure the block is valid. The validator then sends a vote (called an attestation) in favor of that block across the network. +To participate as a validator, a user must deposit 32 ETH into the deposit contract and run three separate pieces of software: an execution client, a consensus client, and a validator. On depositing their ETH, the user joins an activation queue that limits the rate of new validators joining the network. Once activated, validators receive new blocks from peers on the Ethereum network. The transactions delivered in the block are re-executed, and the block signature is checked to ensure the block is valid. The validator then sends a vote (called an attestation) in favor of that block across the network. Whereas under proof-of-work, the timing of blocks is determined by the mining difficulty, in proof-of-stake, the tempo is fixed. Time in proof-of-stake Ethereum is divided into slots (12 seconds) and epochs (32 slots). One validator is randomly selected to be a block proposer in every slot. This validator is responsible for creating a new block and sending it out to other nodes on the network. Also in every slot, a committee of validators is randomly chosen, whose votes are used to determine the validity of the block being proposed. ## Finality {#finality} -A transaction has "finality" in distributed networks when it's part of a block that can't change without a significant amount of ether getting burned. On proof-of-stake Ethereum, this is managed using "checkpoint" blocks. The first block in each epoch is a checkpoint. Validators vote for pairs of checkpoints that it considers to be valid. If a pair of checkpoints attracts votes representing at least two-thirds of the total staked ether, the checkpoints are upgraded. The more recent of the two (target) becomes "justified". The earlier of the two is already justified because it was the "target" in the previous epoch. Now it is upgraded to "finalized". To revert a finalized block, an attacker would commit to losing at least one-third of the total supply of staked ether (currently around $10,000,000,000). The exact reason for this is explained [in this Ethereum Foundation blog post](https://blog.ethereum.org/2016/05/09/on-settlement-finality/). Since finality requires a two-thirds majority, an attacker could prevent the network from reaching finality by voting with one-third of the total stake. There is a mechanism to defend against this: the [inactivity leak](https://arxiv.org/pdf/2003.03052.pdf). This activates whenever the chain fails to finalize for more than four epochs. The inactivity leak bleeds away the staked ether from validators voting against the majority, allowing the majority to regain a two-thirds majority and finalize the chain. +A transaction has "finality" in distributed networks when it's part of a block that can't change without a significant amount of ETH getting burned. On proof-of-stake Ethereum, this is managed using "checkpoint" blocks. The first block in each epoch is a checkpoint. Validators vote for pairs of checkpoints that it considers to be valid. If a pair of checkpoints attracts votes representing at least two-thirds of the total staked ETH, the checkpoints are upgraded. The more recent of the two (target) becomes "justified". The earlier of the two is already justified because it was the "target" in the previous epoch. Now it is upgraded to "finalized". To revert a finalized block, an attacker would commit to losing at least one-third of the total supply of staked ETH. The exact reason for this is explained in this [Ethereum Foundation blog post](https://blog.ethereum.org/2016/05/09/on-settlement-finality/). Since finality requires a two-thirds majority, an attacker could prevent the network from reaching finality by voting with one-third of the total stake. There is a mechanism to defend against this: the [inactivity leak](https://arxiv.org/pdf/2003.03052.pdf). This activates whenever the chain fails to finalize for more than four epochs. The inactivity leak bleeds away the staked ETH from validators voting against the majority, allowing the majority to regain a two-thirds majority and finalize the chain. ## Crypto-economic security {#crypto-economic-security} -Running a validator is a commitment. The validator is expected to maintain sufficient hardware and connectivity to participate in block validation and proposal. In return, the validator is paid in ether (their staked balance increases). On the other hand, participating as a validator also opens new avenues for users to attack the network for personal gain or sabotage. To prevent this, validators miss out on ether rewards if they fail to participate when called upon, and their existing stake can be destroyed if they behave dishonestly. There are two primary behaviors that can be considered dishonest: proposing multiple blocks in a single slot (equivocating) and submitting contradictory attestations. The amount of ether slashed depends on how many validators are also being slashed at around the same time. This is known as the ["correlation penalty"](https://arxiv.org/pdf/2003.03052.pdf), and it can be minor (~1% stake for a single validator slashed on their own) or can result in 100% of the validator's stake getting destroyed (mass slashing event). It is imposed halfway through a forced exit period that begins with an immediate penalty (up to 0.5 ETH) on Day 1, the correlation penalty on Day 18, and finally, ejection from the network on Day 36. They receive minor attestation penalties every day because they are present on the network but not submitting votes. This all means a coordinated attack would be very costly for the attacker. +Running a validator is a commitment. The validator is expected to maintain sufficient hardware and connectivity to participate in block validation and proposal. In return, the validator is paid in ETH (their staked balance increases). On the other hand, participating as a validator also opens new avenues for users to attack the network for personal gain or sabotage. To prevent this, validators miss out on ETH rewards if they fail to participate when called upon, and their existing stake can be destroyed if they behave dishonestly. There are two primary behaviors that can be considered dishonest: proposing multiple blocks in a single slot (equivocating) and submitting contradictory attestations. The amount of ETH slashed depends on how many validators are also being slashed at around the same time. This is known as the ["correlation penalty"](https://arxiv.org/pdf/2003.03052.pdf), and it can be minor (~1% stake for a single validator slashed on their own) or can result in 100% of the validator's stake getting destroyed (mass slashing event). It is imposed halfway through a forced exit period that begins with an immediate penalty (up to 0.5 ETH) on Day 1, the correlation penalty on Day 18, and finally, ejection from the network on Day 36. They receive minor attestation penalties every day because they are present on the network but not submitting votes. This all means a coordinated attack would be very costly for the attacker. ## Fork choice {#fork-choice} @@ -44,7 +44,7 @@ When the network performs optimally and honestly, there is only ever one new blo ## Proof-of-stake and security {#pos-and-security} -The threat of a [51% attack](https://www.investopedia.com/terms/1/51-attack.asp) still exists on proof-of-stake as it does on proof-of-work, but it's even riskier for the attackers. A attacker would need 51% of the staked ETH (about $15,000,000,000 USD). They could then use their own attestations to ensure their preferred fork was the one with the most accumulated attestations. The 'weight' of accumulated attestations is what consensus clients use to determine the correct chain, so this attacker would be able to make their fork the canonical one. However, a strength of proof-of-stake over proof-of-work is that the community has flexibility in mounting a counter-attack. For example, the honest validators could decide to keep building on the minority chain and ignore the attacker's fork while encouraging apps, exchanges, and pools to do the same. They could also decide to forcibly remove the attacker from the network and destroy their staked ether. These are strong economic defenses against a 51% attack. +The threat of a [51% attack](https://www.investopedia.com/terms/1/51-attack.asp) still exists on proof-of-stake as it does on proof-of-work, but it's even riskier for the attackers. A attacker would need 51% of the staked ETH. They could then use their own attestations to ensure their preferred fork was the one with the most accumulated attestations. The 'weight' of accumulated attestations is what consensus clients use to determine the correct chain, so this attacker would be able to make their fork the canonical one. However, a strength of proof-of-stake over proof-of-work is that the community has flexibility in mounting a counter-attack. For example, the honest validators could decide to keep building on the minority chain and ignore the attacker's fork while encouraging apps, exchanges, and pools to do the same. They could also decide to forcibly remove the attacker from the network and destroy their staked ETH. These are strong economic defenses against a 51% attack. 51% attacks are just one flavor of malicious activity. Bad actors could attempt long-range attacks (although the finality gadget neutralizes this attack vector), short range 'reorgs' (although proposer boosting and attestation deadlines mitigate this), bouncing and balancing attacks (also mitigated by proposer boosting, and these attacks have anyway only been demonstrated under idealized network conditions) or avalanche attacks (neutralized by the fork choice algorithms rule of only considering the latest message). @@ -57,7 +57,7 @@ Overall, proof-of-stake, as it is implemented on Ethereum, has been demonstrated | Staking makes it easier for individuals to participate in securing the network, promoting decentralization. validator node can be run on a normal laptop. Staking pools allow users to stake without having 32 ETH. | Proof-of-stake is younger and less battle-tested compared to proof-of-work | | Staking is more decentralized. Economies of scale do not apply in the same way that they do for PoW mining. | Proof-of-stake is more complex to implement than proof-of-work | | Proof-of-stake offers greater crypto-economic security than proof-of-work | Users need to run three pieces of software to participate in Ethereum's proof-of-stake. | -| Less issuance of new ether is required to incentivize network participants | | +| Less issuance of new ETH is required to incentivize network participants | | ## Further reading {#further-reading} @@ -67,6 +67,7 @@ Overall, proof-of-stake, as it is implemented on Ethereum, has been demonstrated - [The Beacon Chain Ethereum 2.0 explainer you need to read first](https://ethos.dev/beacon-chain/) _Ethos.dev_ - [Why Proof of Stake (Nov 2020)](https://vitalik.ca/general/2020/11/06/pos2020.html) _Vitalik Buterin_ - [Proof of Stake: How I Learned to Love Weak Subjectivity](https://blog.ethereum.org/2014/11/25/proof-stake-learned-love-weak-subjectivity/) _Vitalik Buterin_ +- [PoS Ethereum attack and defense](https://mirror.xyz/jmcook.eth/YqHargbVWVNRQqQpVpzrqEQ8IqwNUJDIpwRP7SS5FXs) - [A Proof of Stake Design Philosophy](https://medium.com/@VitalikButerin/a-proof-of-stake-design-philosophy-506585978d51) _Vitalik Buterin_ ## Related topics {#related-topics} From 2809beabc9b3141b6a47582c36abb1eef4038f5e Mon Sep 17 00:00:00 2001 From: Joe Date: Mon, 18 Jul 2022 15:54:34 +0100 Subject: [PATCH 018/286] update staking landing page --- src/intl/en/page-staking.json | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/intl/en/page-staking.json b/src/intl/en/page-staking.json index e638e305b48..8ba428770d7 100644 --- a/src/intl/en/page-staking.json +++ b/src/intl/en/page-staking.json @@ -10,7 +10,7 @@ "page-staking-check-address": "Check deposit address", "page-staking-deposit-address": "Check the deposit address", "page-staking-deposit-address-desc": "If you’ve already followed the setup instructions on the launchpad, you’ll know you need to send a transaction to the staking deposit contract. We recommend you check the address very carefully. You can find the official address on ethereum.org and a number of other trusted sites.", - "page-staking-description": "Staking is the act of depositing 32 ETH to activate validator software. As a validator you’ll be responsible for storing data, processing transactions, and adding new blocks to the blockchain. This will keep Ethereum secure for everyone and earn you new ETH in the process. This process, known as proof-of-stake, is being introduced by the Beacon Chain.", + "page-staking-description": "Staking is the act of depositing 32 ETH to activate validator software. As a validator you’ll be responsible for storing data, processing transactions, and adding new blocks to the blockchain. This will keep Ethereum secure for everyone and earn you new ETH in the process.", "page-staking-hero-title": "How to stake your ETH", "page-staking-hero-header": "Earn rewards while securing Ethereum", "page-staking-hero-subtitle": "Staking is a public good for the Ethereum ecosystem. Any user with any amount of ETH can help secure the network and earn rewards in the process.", @@ -139,7 +139,7 @@ "page-staking-section-comparison-rewards-title": "Rewards", "page-staking-section-comparison-solo-rewards-li1": "Maximum rewards - receive full rewards directly from the protocol", "page-staking-section-comparison-solo-rewards-li2": "You'll get rewards for batching transactions into a new block or checking the work of other validators to keep the chain running securely", - "page-staking-section-comparison-solo-rewards-li3": "After The Merge you'll receive unburnt transaction fees for blocks you propose", + "page-staking-section-comparison-solo-rewards-li3": "You'll also receive unburnt transaction fees for blocks you propose", "page-staking-section-comparison-saas-rewards-li1": "Usually involves full protocol rewards minus monthly fee for node operations", "page-staking-section-comparison-saas-rewards-li2": "Dashboards often available to easily track your validator client", "page-staking-section-comparison-pools-rewards-li1": "Pooled stakers accrue rewards differently, depending on which method of pooled staking chosen", @@ -163,15 +163,15 @@ "page-staking-section-comparison-pools-requirements-li1": "Lowest ETH requirements, some projects require as little as 0.01 ETH", "page-staking-section-comparison-pools-requirements-li2": "Deposit directly from your wallet to different pooled staking platforms or simply trade for one of the staking liquidity tokens", "page-staking-faq-1-question": "What is a validator?", - "page-staking-faq-1-answer": "A validator is a virtual entity that lives on the Beacon Chain and participates in the consensus of the Ethereum protocol. Validators are represented by a balance, public key, and other properties. A validator client is the software that acts on behalf of the validator by holding and using its private key. A single validator client can hold many key pairs, controlling many validators.", + "page-staking-faq-1-answer": "A validator is a virtual entity that lives on Ethereum and participates in the consensus of the Ethereum protocol. Validators are represented by a balance, public key, and other properties. A validator client is the software that acts on behalf of the validator by holding and using its private key. A single validator client can hold many key pairs, controlling many validators.", "page-staking-faq-2-question": "Why do I need to have funds at stake?", "page-staking-faq-2-answer": "A validator has the ability to propose and attest to blocks for the network. To prevent dishonest behavior, users must have their funds at stake. This allows the protocol to penalize malicious actors. Staking is a means to keep you honest, as your actions will have financial consequences.", "page-staking-faq-3-question": "Can I buy 'Eth2'?", - "page-staking-faq-3-answer-p1": "There is no 'Eth2' token native to the protocol, as the native token ether (ETH) will not change with the transition to proof-of-stake. Learn more about The Merge", + "page-staking-faq-3-answer-p1": "There is no 'Eth2' token native to the protocol, as the native token ether (ETH) did not change when Ethereum switched to proof-of-stake.", "page-staking-faq-3-answer-p2": "There are derivative tokens/tickers that may represent staked ETH (ie. rETH from Rocket Pool, stETH from Lido, ETH2 from Coinbase). Learn more about staking pools", "page-staking-faq-4-question": "Is staking already live?", - "page-staking-faq-4-answer-p1": "Yes and no. Staking has been live since December 1, 2020, but until the Merge happens, the proof-of-stake consensus remains isolated on its own chain, while the existing Ethereum network as we know it continues to operate using proof-of-work. These two chains start separate, but with the Merge, proof-of-work will be fully deprecated, and proof-of-stake will become the sole means of consensus from here-on-out.", - "page-staking-faq-4-answer-p2": "This means that staking is currently live for users to deposit their ETH, run a validator client, and start earning rewards. After the Merge, stakers will earn higher rewards as validators begin to process transactions and earn fee tips on top of protocol rewards. After the Shanghai update (planned to follow the Merge by a few months), stakers will then be able to withdraw rewards and funds from their validator balance.", + "page-staking-faq-4-answer-p1": "Yes. Staking has been live since December 1, 2020", + "page-staking-faq-4-answer-p2": "This means that staking is currently live for users to deposit their ETH, run a validator client, and start earning rewards. After the Shanghai update, stakers will then be able to withdraw rewards and funds from their validator balance.", "page-staking-toc-how-to-stake-your-eth": "How to stake your ETH", "page-staking-toc-comparison-of-options": "Comparison of staking options", "page-staking-toc-faq": "FAQ", From a37abcb109e4e769912da719691e0b72e5562ab4 Mon Sep 17 00:00:00 2001 From: Joshua <62268199+minimalsm@users.noreply.github.com> Date: Mon, 18 Jul 2022 16:31:03 +0100 Subject: [PATCH 019/286] Update src/content/developers/docs/consensus-mechanisms/pos/index.md --- src/content/developers/docs/consensus-mechanisms/pos/index.md | 1 + 1 file changed, 1 insertion(+) diff --git a/src/content/developers/docs/consensus-mechanisms/pos/index.md b/src/content/developers/docs/consensus-mechanisms/pos/index.md index f8ee157dccd..106d7090331 100644 --- a/src/content/developers/docs/consensus-mechanisms/pos/index.md +++ b/src/content/developers/docs/consensus-mechanisms/pos/index.md @@ -5,6 +5,7 @@ lang: en sidebar: true --- + Proof-of-stake (PoS) is Ethereum's [consensus mechanism](/developers/docs/consensus-mechanisms/). Ethereum switched on its proof-of-stake mechanism in 2022 because it is more secure, less energy-intensive, and better for implementing new scaling solutions compared to the previous consensus mechanism, [proof-of-work](/developers/docs/consensus-mechanisms/pow). ## Prerequisites {#prerequisites} From e74c8b6ec7949cf9216fab6d411069b67ae882e5 Mon Sep 17 00:00:00 2001 From: Joshua <62268199+minimalsm@users.noreply.github.com> Date: Mon, 18 Jul 2022 16:31:23 +0100 Subject: [PATCH 020/286] Update src/content/developers/docs/consensus-mechanisms/pos/index.md --- src/content/developers/docs/consensus-mechanisms/pos/index.md | 1 - 1 file changed, 1 deletion(-) diff --git a/src/content/developers/docs/consensus-mechanisms/pos/index.md b/src/content/developers/docs/consensus-mechanisms/pos/index.md index 106d7090331..f8ee157dccd 100644 --- a/src/content/developers/docs/consensus-mechanisms/pos/index.md +++ b/src/content/developers/docs/consensus-mechanisms/pos/index.md @@ -5,7 +5,6 @@ lang: en sidebar: true --- - Proof-of-stake (PoS) is Ethereum's [consensus mechanism](/developers/docs/consensus-mechanisms/). Ethereum switched on its proof-of-stake mechanism in 2022 because it is more secure, less energy-intensive, and better for implementing new scaling solutions compared to the previous consensus mechanism, [proof-of-work](/developers/docs/consensus-mechanisms/pow). ## Prerequisites {#prerequisites} From 0c51dc407ba437957f979ee95c845a7d550d2293 Mon Sep 17 00:00:00 2001 From: Joseph Cook <33655003+jmcook1186@users.noreply.github.com> Date: Tue, 19 Jul 2022 10:32:38 +0100 Subject: [PATCH 021/286] Update src/content/developers/docs/consensus-mechanisms/pow/index.md --- src/content/developers/docs/consensus-mechanisms/pow/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/content/developers/docs/consensus-mechanisms/pow/index.md b/src/content/developers/docs/consensus-mechanisms/pow/index.md index 6a28194c0b8..3ac8baeb813 100644 --- a/src/content/developers/docs/consensus-mechanisms/pow/index.md +++ b/src/content/developers/docs/consensus-mechanisms/pow/index.md @@ -5,7 +5,7 @@ lang: en sidebar: true --- -Ethereum was always intended to be a [proof-of-stake](/developers/docs/consensus-mechanisms/pos) network, but the research and development required to implement proof-of-stake safely, securely and performantly took several years. The network was therefore started with a different consensus mechanism called **[Proof-of-work (PoW)](https://wikipedia.org/wiki/Proof_of_work)**. This allowed the nodes of the Ethereum network to agree on the state of all information recorded on the Ethereum blockchain and prevents certain kinds of economic attacks. +The Ethereum network started using a consensus mechanism called **[Proof-of-work (PoW)](/developers/docs/consensus-mechanisms/pow)**. This allowed the nodes of the Ethereum network to agree on the state of all information recorded on the Ethereum blockchain and prevents certain kinds of economic attacks. However, Ethereum switched off proof-of-work in 2022 and started using [proof-of-stake](/developers/docs/consensus-mechanisms/pos) instead. Proof-of-work has now been deprecated. Ethereum no longer uses proof-of-work as a consensus mechanism. Instead, it uses proof-of-stake. Read more on proof-of-stake and staking. From 369542b86cffb1bbc8bd3ddb024b71aba28758de Mon Sep 17 00:00:00 2001 From: Joe Date: Tue, 19 Jul 2022 10:41:58 +0100 Subject: [PATCH 022/286] update web2vweb3 page --- src/content/developers/docs/web2-vs-web3/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/content/developers/docs/web2-vs-web3/index.md b/src/content/developers/docs/web2-vs-web3/index.md index 18d9d83f92d..2b94b42bea3 100644 --- a/src/content/developers/docs/web2-vs-web3/index.md +++ b/src/content/developers/docs/web2-vs-web3/index.md @@ -32,7 +32,7 @@ This doesn't mean that all services need to be turned into a dapp. These example Web3 has some limitations right now: -- Scalability – transactions are slower on web3 because they're decentralized. Changes to state, like a payment, need to be processed by a miner and propagated throughout the network. +- Scalability – transactions are slower on web3 because they're decentralized. Changes to state, like a payment, need to be processed by a node and propagated throughout the network. - UX – interacting with web3 applications can require extra steps, software, and education. This can be a hurdle to adoption. - Accessibility – the lack of integration in modern web browsers makes web3 less accessible to most users. - Cost – most successful dapps put very small portions of their code on the blockchain as it's expensive. From bbf278908190be708643209d2d0bb090954a997a Mon Sep 17 00:00:00 2001 From: Joe Date: Tue, 19 Jul 2022 11:37:13 +0100 Subject: [PATCH 023/286] update merge page --- src/content/upgrades/merge/index.md | 148 +++++++++++----------------- 1 file changed, 55 insertions(+), 93 deletions(-) diff --git a/src/content/upgrades/merge/index.md b/src/content/upgrades/merge/index.md index 7b0b5ba177e..db3b18999b2 100644 --- a/src/content/upgrades/merge/index.md +++ b/src/content/upgrades/merge/index.md @@ -1,61 +1,50 @@ --- title: The Merge -description: Learn about The Merge - when Mainnet Ethereum joins the Beacon Chain coordinated proof-of-stake system. +description: Learn about The Merge - when Mainnet Ethereum adotped proof-of-stake. lang: en template: upgrade sidebar: true image: ../../../assets/upgrades/merge.png -summaryPoint1: Soon, the current Ethereum Mainnet will merge with the Beacon Chain proof-of-stake system. -summaryPoint2: This will mark the end of proof-of-work for Ethereum, and the full transition to proof-of-stake. -summaryPoint3: This sets the stage for future scaling upgrades including sharding. -summaryPoint4: The Merge will reduce Ethereum's energy consumption by ~99.95%. +summaryPoint1: Ethereum Mainnet uses proof-of-stake, but this wasn't always the case. +summaryPoint2: The transition from the original proof-of-work mechanism to proof-of-stake was called The Merge. +summaryPoint3: The Merge refers to the original Ethereum Mainnet becoming part of a separate proof-of0-stake blockchain called the Beacon Chain. +summaryPoint4: The Merge reduced Ethereum's energy consumption by ~99.95%. --- - -The Merge is the most significant upgrade in the history of Ethereum. Extensive testing and bug bounties were undertaken to ensure a safe transition to proof-of-stake. -This process is in its final stages, with plans to undergo The Merge on a few public testnets before finally moving forward with Mainnet. If you're excited about The Merge, follow the [EF Blog](https://blog.ethereum.org) or the client communication channels for the latest official word on _When Merge?_ - +## What was The Merge? {#what-is-the-merge} -## What is The Merge? {#what-is-the-merge} - -The Merge represents the joining of the existing execution layer of Ethereum (the Mainnet we use today) with its new proof-of-stake consensus layer, the Beacon Chain. It eliminates the need for energy-intensive mining and instead secures the network using staked ETH. A truly exciting step in realizing the Ethereum vision – more scalability, security, and sustainability. +The Merge was the joining of the original execution layer of Ethereum (the Mainnet we use today) with its new proof-of-stake consensus layer, the Beacon Chain. It eliminated the need for energy-intensive mining and instead enabled the the network to be secured using staked ETH. It was a truly exciting step in realizing the Ethereum vision – more scalability, security, and sustainability. -It's important to remember that initially, the [Beacon Chain](/upgrades/beacon-chain/) shipped separately from [Mainnet](/glossary/#mainnet). Ethereum Mainnet - with all it's accounts, balances, smart contracts, and blockchain state - continues to be secured by [proof-of-work](/developers/docs/consensus-mechanisms/pow/), even while the Beacon Chain runs in parallel using [proof-of-stake](/developers/docs/consensus-mechanisms/pos/). The approaching Merge is when these two systems finally come together, and proof-of-work is replaced permanently by proof-of-stake. +Initially, the [Beacon Chain](/upgrades/beacon-chain/) shipped separately from [Mainnet](/glossary/#mainnet). Ethereum Mainnet - with all it's accounts, balances, smart contracts, and blockchain state - continued to be secured by [proof-of-work](/developers/docs/consensus-mechanisms/pow/), even while the Beacon Chain ran in parallel using [proof-of-stake](/developers/docs/consensus-mechanisms/pos/). The Merge was when these two systems finally came together, and proof-of-work was permanently replaced by proof-of-stake. -Let's consider an analogy. Imagine Ethereum is a spaceship that isn't quite ready for an interstellar voyage. With the Beacon Chain, the community has built a new engine and a hardened hull. After significant testing, it's almost time to hot-swap the new engine for the old mid-flight. This will merge the new, more efficient engine into the existing ship, ready to put in some serious lightyears and take on the universe. +Imagine Ethereum is a spaceship that wasn't quite ready for an interstellar voyage. With the Beacon Chain, the community built a new engine and a hardened hull. After significant testing, it became time to hot-swap the new engine for the old one mid-flight. This merged the new, more efficient engine into the existing ship enabling it to put in some serious lightyears and take on the universe. ## Merging with Mainnet {#merging-with-mainnet} -Since [genesis](/history/#frontier), proof-of-work has secured Mainnet. This is the Ethereum blockchain we're all used to—it contains every transaction, smart contract, and balance since it began in July 2015. +Proof-of-work secured Ethereum Mainnet from genesis until The Merge. This allowed the Ethereum blockchain we're all used to to come into existence in July 2015 with all its familiar features - transactions, smart contracts, accounts, etc. -Throughout Ethereum's history, developers have been hard at work preparing for an eventual transition away from proof-of-work to proof-of-stake. On December 1, 2020, the Beacon Chain was created, which has since existed as a separate blockchain to Mainnet, running in parallel. +Throughout Ethereum's history, developers have prepared for an eventual transition away from proof-of-work to proof-of-stake. On December 1, 2020, the Beacon Chain was created as a separate blockchain to Mainnet, running in parallel. -The Beacon Chain has not been processing Mainnet transactions. Instead, it has been reaching consensus on its own state by agreeing on active validators and their account balances. After extensive testing, the Beacon Chain's time to reach consensus on more is rapidly approaching. After The Merge, the Beacon Chain will be the consensus engine for all network data, including execution layer transactions and account balances. +The Beacon Chain was not processing Mainnet transactions. Instead, it was reaching consensus on its own state by agreeing on active validators and their account balances. After extensive testing, it became time for the Beacon Chain to reach consensus on real world data. After The Merge, the Beacon Chain became the consensus engine for all network data, including execution layer transactions and account balances. -The Merge represents the official switch to using the Beacon Chain as the engine of block production. Mining will no longer be the means of producing valid blocks. Instead, the proof-of-stake validators assume this role and will be responsible for processing the validity of all transactions and proposing blocks. +The Merge represented the official switch to using the Beacon Chain as the engine of block production. Mining is no longer be the means of producing valid blocks. Instead, the proof-of-stake validators have adopted this role and are now responsible for processing the validity of all transactions and proposing blocks. -No history is lost. As Mainnet gets merged with the Beacon Chain, it will also merge the entire transactional history of Ethereum. You don't need to do anything. Your funds are safe. +No history was lost in The Merge. As Mainnet merged with the Beacon Chain, it also merged the entire transactional history of Ethereum. -This transition to proof-of-stake will come with some changes to the way ether is supplied. Learn more about ether issuance before and after The Merge. +This transition to proof-of-stake changed the way ether is issued. Learn more about ether issuance before and after The Merge. -## What do I need to do to get ready? {#preparing-for-the-merge} - -The Merge is one of the most significant and anticipated upgrades in the history of Ethereum, and although in the long-term its impact will be felt by everyone, in the near-term some folks will need to take action to be fully prepared. - ### Users and holders {#users-holders} -**You do not need to do anything to protect your funds entering The Merge.** +**The Merge did not change anything for holders/users.** -_This bears repeating_: As a user or holder of ETH or any other digital asset on Ethereum, as well as non-node-operating stakers, **you do not need to do anything with your funds or wallet before The Merge.** +_This bears repeating_: As a user or holder of ETH or any other digital asset on Ethereum, as well as non-node-operating stakers, **you do not need to do anything with your funds or wallet to account for The Merge.** ETH is just ETH. There is no such thing as "old ETH"/"new ETH" or "ETH1"/"ETH2" and wallets work exactly the same after The Merge as they did before - people tellign you otherwise are likely scammers. -Despite swapping out proof-of-work, the entire history of Ethereum since genesis remains intact and unaltered after the transition to proof-of-stake. Any funds held in your wallet before The Merge will still be accessible after The Merge. **No action is required to upgrade on your part.** - -As we approach The Merge of Ethereum Mainnet, **you should be on high alert for scams trying to take advantage of users during this transition.** Do not send your ETH anywhere in an attempt to "upgrade to ETH2." There is no "ETH2" token, and there is nothing more you need to do for your funds to remain safe. +Despite swapping out proof-of-work, the entire history of Ethereum since genesis remained intact and unaltered by the transition to proof-of-stake. Any funds held in your wallet before The Merge will are still accessible after The Merge. **No action is required to upgrade on your part.** [More on Ethereum security](/security/#eth2-token-scam) @@ -63,49 +52,43 @@ As we approach The Merge of Ethereum Mainnet, **you should be on high alert for Key action items include: -1. Run _both_ a consensus layer client and an execution layer client; third-party endpoints to obtain execution data will be unavailable after The Merge. -1. Authenticate both execution layer and consensus layer clients with a shared JWT secret so they can securely communicate. -1. Set a `fee recipient` address to receive your earned transaction fee tips/MEV. +1. Run _both_ a consensus layer client and an execution layer client; third-party endpoints to obtain execution data no longer work since The Merge. +2. Authenticate both execution layer and consensus layer clients with a shared JWT secret so they can securely communicate. +3. Set a `fee recipient` address to receive your earned transaction fee tips/MEV. -Not completing the first two items above items will result in your node being seen as "offline" after The Merge until both layers are synced and authenticated. +Not completing the first two items above items will result in your node being seen as "offline" until both layers are synced and authenticated. Not setting a `fee recipient` will still allow your validator to behave as usual, but you will miss out on unburnt fee tips and any MEV you would have otherwise earned in blocks your validator proposes. -For more detailed information and a summary of links to client resources, stakers are encouraged to check out the [Merge Readiness Checklist](https://launchpad.ethereum.org/en/merge-readiness/) over on the Staking Launchpad to make sure you're fully prepared for The Merge. - -Note for stakers using [SaaS](/staking/saas/) or [staking pools](/staking/pools/): There is nothing you need to do to prepare for The Merge. [More below on staying safe.](#users-holders) - - -You probably are already running an execution layer client, such as Geth, Erigon, Besu or Nethermind. Up until The Merge, an execution layer client was enough to receive, properly validate, and propagate blocks being gossiped by the network. _After The Merge_, the validity of transactions contained within an execution payload will also depend on the validity of the "consensus block" it is contained within. +Up until The Merge, an execution layer client was enough to receive, properly validate, and propagate blocks being gossiped by the network. _After The Merge_, the validity of transactions contained within an execution payload now also also depends on the validity of the "consensus block" it is contained within. -As a result, a full Ethereum node after The Merge requires both an execution layer client and a consensus layer client. These two clients work together using a new Engine API. The Engine API requires authentication using a JWT secret, which is provided to both clients allowing secure communication. +As a result, a full Ethereum node now requires both an execution layer client and a consensus layer client. These two clients work together using a new Engine API. The Engine API requires authentication using a JWT secret, which is provided to both clients allowing secure communication. Key action items include: - Install a consensus layer client in addition to an execution layer client - Authenticate execution and consensus clients with a shared JWT secret so they can securely communicate with one another. -Not completing the above items in time for The Merge will result in your node appearing to be "offline" until both layers are synced and authenticated. +Not completing the above items will result in your node appearing to be "offline" until both layers are synced and authenticated. -Node operators can also check out the [Merge Readiness Checklist](https://launchpad.ethereum.org/en/merge-readiness/) on the Staking Launchpad for more information, as many of the details apply to all node operators. -The Merge comes with changes to consensus, which also includes changes related to: +The Merge came with changes to consensus, which also includes changes related to: - block structure - slot/block timing @@ -116,17 +99,20 @@ The Merge comes with changes to consensus, which also includes changes related t For more information, check out this blog post by Tim Beiko on [How The Merge Impacts Ethereum’s Application Layer](https://blog.ethereum.org/2021/11/29/how-the-merge-impacts-app-layer/). -## After The Merge {#after-the-merge} +## The Merge and energy consumption {#merge-and-energy} + +The Merge marked the end of proof-of-work for Ethereum and start the era of a more sustainable, eco-friendly Ethereum. Ethereum's energy consumption dropped by an estimated 99.95%, making Ethereum a green blockchain. Learn more about [Ethereum energy consumption](/energy-consumption/). + -This will signal the end of proof-of-work for Ethereum and start the era of a more sustainable, eco-friendly Ethereum. Learn more about [Ethereum energy consumption](/energy-consumption/). +## The Merge and scaling {#merge-and-scaling} -This will also set the stage for further scalability upgrades not possible under proof-of-work, bringing Ethereum one step closer to achieving the full scale, security and sustainability outlined in its [Ethereum vision](/upgrades/vision/). +The Merge also set the stage for further scalability upgrades not possible under proof-of-work, bringing Ethereum one step closer to achieving the full scale, security and sustainability outlined in its [Ethereum vision](/upgrades/vision/). ## Misconceptions about The Merge {#misconceptions} +contentPreview="False. Anyone is free to sync their own self-verified copy of Ethereum (i.e. run a node). No ETH is required - nmt before The Merge, not after The Merge, not ever."> There are two types of Ethereum nodes: nodes that can propose blocks and nodes that don't. Nodes that propose blocks are only a small number of the total nodes on Ethereum. This category includes mining nodes under proof-of-work (PoW) and validator nodes under proof-of-stake (PoS). This category requires committing economic resources (such as GPU hash power in proof-of-work or staked ETH in proof-of-stake) in exchange for the ability to occasionally propose the next block and earn protocol rewards. @@ -142,41 +128,38 @@ The ability for anyone to run their own node is _absolutely essential_ to mainta -Gas fees are a product of network demand relative to the capacity of the network. The Merge deprecates the use of proof-of-work, transitioning to proof-of-stake for consensus, but does not significantly change any parameters that directly influence network capacity or throughput. +title="Misconception: "The Merge failed to reduced gas fees."" +contentPreview="False. The Merge was a change of consensus mechanism, not an expansion of network capacity, and was never intended to lower gas fees."> +Gas fees are a product of network demand relative to the capacity of the network. The Merge deprecated the use of proof-of-work, transitioning to proof-of-stake for consensus, but did not significantly change any parameters that directly influence network capacity or throughput. With a [rollup-centric roadmap](https://ethereum-magicians.org/t/a-rollup-centric-ethereum-roadmap/4698), efforts are being focused on scaling user activity at [layer 2](/layer-2/), while enabling layer 1 Mainnet as a secure decentralized settlement layer optimized for rollup data storage to help make rollup transactions exponentially cheaper. The transition to proof-of-stake is a critical precursor to realizing this. [More on gas and fees.](/developers/docs/gas/) +title="Misconception: "Transactions are noticeably faster after The Merge."" +contentPreview="False. Though some slight changes exist, transaction speed is mostly remain the same on layer 1."> A transaction's "speed" can be measured in a few ways, including time to be included in a block and time to finalization. Both of these changes slightly, but not in a way that users will notice. -Historically, on proof-of-work, the target was to have a new block every ~13.3 seconds. On the Beacon Chain, slots occur precisely every 12 seconds, each of which is an opportunity for a validator to publish a block. Most slots have blocks, but not necessarily all (i.e. a validator is offline). On proof-of-stake blocks will be produced ~10% more frequently than on proof-of-work. This is a fairly insignificant change and is unlikely to be noticed by users. +Historically, on proof-of-work, the target was to have a new block every ~13.3 seconds. Under proof-of-stake, slots occur precisely every 12 seconds, each of which is an opportunity for a validator to publish a block. Most slots have blocks, but not necessarily all (i.e. a validator is offline). In proof-of-stake blocks are be produced ~10% more frequently than on proof-of-work. This is a fairly insignificant change and is unlikely to be noticed by users. -Proof-of-stake introduces the transaction finality concept that did not previously exist. On proof-of-work, the ability to reverse a block gets exponentially more difficult with every passing block mined on top of a transaction, but it never quite reaches zero. Under proof-of-stake, blocks are bundled into epochs (6.4 minute spans of time containing 32 chances for blocks) which validators vote on. When an epoch ends, validators vote on whether to consider the epoch 'justified'. If validators agree to justify the epoch, it gets finalized in the next epoch. Undoing finalized transactions is economically unviable as it would require obtaining and burning over one-third of the total staked ETH. +Proof-of-stake introduced the transaction finality concept that did not previously exist. In proof-of-work, the ability to reverse a block gets exponentially more difficult with every passing block mined on top of a transaction, but it never quite reaches zero. Under proof-of-stake, blocks are bundled into epochs (6.4 minute spans of time containing 32 chances for blocks) which validators vote on. When an epoch ends, validators vote on whether to consider the epoch 'justified'. If validators agree to justify the epoch, it gets finalized in the next epoch. Undoing finalized transactions is economically unviable as it would require obtaining and burning over one-third of the total staked ETH. -Many dapps require a number of proof-of-work block confirmations that take a period of time on par with how long proof-of-stake finality takes. Finality can offer additional security guarantees, but will not significantly speed up transactions. -Staked ETH, staking rewards to date, and newly issued ETH immediately after The Merge will still be locked on the Beacon Chain without the ability to withdraw. - -Withdrawals are planned for the Shanghai upgrade, the next major upgrade following The Merge. This means that newly issued ETH, though accumulating on the Beacon Chain, will remain locked and illiquid for at least 6-12 months following The Merge. +Staked ETH and staking rewards continue to be locked without the ability to withdraw. Withdrawals are planned for the Shanghai upgrade. -This may seem counterintuitive to the above note that withdrawals are not enabled til the Shanghai upgrade, but validators WILL have immediate access to the fee rewards/MEV earned during block proposals. +contentPreview="False. Fee tips/MEV are credited to a Mainnet account controlled by the validator, available immediately."> +This may seem counterintuitive to the above note that withdrawals are not enabled til the Shanghai upgrade, but validators DO have immediate access to the fee rewards/MEV earned during block proposals. -The protocol issues ETH as a reward to validators for contributing to consensus. This Beacon Chain accounts for the newly issued ETH, where a validator has a unique address that holds its staked ETH and protocol rewards. This ETH is locked until Shanghai. +The protocol issues ETH as a reward to validators for contributing to consensus. The validator nominates an account to receive the newly issued ETH, where a validator has a unique address that holds its staked ETH and protocol rewards. This ETH is locked until Shanghai. -ETH on the execution layer (Ethereum Mainnet as we know it today) is accounted for separately from the consensus layer. When users execute transactions on Ethereum Mainnet, ETH must be paid to cover the gas, including a tip to the validator. This ETH is already on the execution layer, is NOT being newly issued by the protocol, and is available to the validator immediately (given a proper `fee recipient` address is provided to the client software). +ETH on the execution layer is accounted for separately from the consensus layer. When users execute transactions on Ethereum Mainnet, ETH must be paid to cover the gas, including a tip to the validator. This ETH is already on the execution layer, is NOT being newly issued by the protocol, and is available to the validator immediately (given a proper `fee recipient` address is provided to the client software). - -The APR for stakers is expected to increase post-merge. To understand by how much, it is important to recognize where this increase in APR is coming from. This does not come from an increase in protocol ETH issuance (ETH issuance after The Merge is decreasing by ~90%), but is instead a reallocation of transaction fees that will start going to validators instead of miners. - -This will be a new separate source of revenue for validators when they propose blocks. As you can imagine, the amount of fees a validator receives is proportional to network activity at the time of their proposed block. The more fees being paid by users, the more fees validators will receive. - -Looking at recent blockchain activity, approximately 10% of all gas fees being paid are currently going to miners in the form of a tip, while the rest is burnt. Outdated predictions estimated this percentage to be much higher, and was calculated when network usage was at all time highs. Extrapolating the 10% number to average recent network activity, it is estimated that the APR for staking will increase to ~7%, approximately 50% higher than the base issuance APR (as of June 2022). - - - -An immense amount of work has been put into making sure the transition to proof-of-stake does not disrupt the network or its users. - -The Merge is like changing an engine on a rocketship mid-flight and is designed to be performed without needing to pause anything during the switch. The Merge will be triggered by **[terminal total difficulty (TTD)](/glossary/#terminal-total-difficult)**, which is a cumulative measure of the total mining power that has gone into building the chain. When the time comes, and this criterion is met, blocks will go from being built using proof-of-work in one block to being built by proof-of-stake in the next. - -Ethereum does not have downtime. - - ## What happened to 'Eth2'? {#eth2} -The term 'Eth2' has been deprecated as we approach The Merge. - -After merging 'Eth1' and 'Eth2' into a single chain, there will no longer be two distinct Ethereum networks; there will only be Ethereum. +The term 'Eth2' has been deprecated. After merging 'Eth1' and 'Eth2' into a single chain, there is no longer any need to +distinguish between two Ethereum networks; there is just Ethereum. To limit confusion, the community has updated these terms: @@ -230,9 +192,9 @@ The Ethereum upgrades are all somewhat interrelated. So let’s recap how The Me ### The Merge and the Beacon Chain {#merge-and-beacon-chain} -The Merge represents the formal adoption of the Beacon Chain as the new consensus layer to the current Mainnet execution layer. Once The Merge happens, validators will be assigned to secure Ethereum Mainnet, and mining on [proof-of-work](/developers/docs/consensus-mechanisms/pow/) will no longer be a valid means of block production. +The Merge represents the formal adoption of the Beacon Chain as the new consensus layer to the original Mainnet execution layer. Since the Merge, validators are assigned to secure Ethereum Mainnet, and mining on [proof-of-work](/developers/docs/consensus-mechanisms/pow/) is no longer a valid means of block production. -Blocks will instead be proposed by validating nodes that have ether staked for the right to participate in consensus. These upgrades set the stage for future scalability upgrades, including sharding. +Blocks are instead proposed by validating nodes that have staked ETH in return for the right to participate in consensus. These upgrades set the stage for future scalability upgrades, including sharding. The Beacon Chain @@ -240,13 +202,13 @@ Blocks will instead be proposed by validating nodes that have ether staked for t ### The Merge and the Shanghai upgrade {#merge-and-shanghai} -In order to simplify and maximize focus on a successful transition to proof-of-stake, The Merge upgrade will not include certain anticipated features such as the ability to withdraw staked ETH. The Shanghai upgrade is planned to follow The Merge, which will enable the ability for stakers to withdraw. +In order to simplify and maximize focus on a successful transition to proof-of-stake, The Merge upgrade did not include certain anticipated features such as the ability to withdraw staked ETH. The Shanghai upgrade is planned to follow The Merge, which will enable the ability for stakers to withdraw. Stay up-to-date with the [Shanghai upgrade planning issue on GitHub](https://github.com/ethereum/pm/issues/450), or the [EF Research and Development Blog](https://blog.ethereum.org/category/research-and-development/). For those curious, learn more about [What Happens After The Merge](https://youtu.be/7ggwLccuN5s?t=101), presented by Vitalik at the April 2021 ETHGlobal event. ### The Merge and sharding {#merge-and-data-sharding} -Originally, the plan was to work on sharding before The Merge to address scalability. However, with the boom of [layer 2 scaling solutions](/layer-2/), the priority has shifted to swapping proof-of-work to proof-of-stake via The Merge. +Originally, the plan was to work on sharding before The Merge to address scalability. However, with the boom of [layer 2 scaling solutions](/layer-2/), the priority shifted to swapping proof-of-work to proof-of-stake first. Plans for sharding are rapidly evolving, but given the rise and success of layer 2 technologies to scale transaction execution, sharding plans have shifted to finding the most optimal way to distribute the burden of storing compressed calldata from rollup contracts, allowing for exponential growth in network capacity. This would not be possible without first transitioning to proof-of-stake. From bf79ac6531a42dc2cc3d8ec225e850c37abcbb45 Mon Sep 17 00:00:00 2001 From: Joe Date: Tue, 19 Jul 2022 12:46:53 +0100 Subject: [PATCH 024/286] fix typos --- src/content/upgrades/merge/index.md | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/src/content/upgrades/merge/index.md b/src/content/upgrades/merge/index.md index db3b18999b2..7baca5f4dfe 100644 --- a/src/content/upgrades/merge/index.md +++ b/src/content/upgrades/merge/index.md @@ -1,6 +1,6 @@ --- title: The Merge -description: Learn about The Merge - when Mainnet Ethereum adotped proof-of-stake. +description: Learn about The Merge - when Mainnet Ethereum adopted proof-of-stake. lang: en template: upgrade sidebar: true @@ -11,7 +11,6 @@ summaryPoint3: The Merge refers to the original Ethereum Mainnet becoming part o summaryPoint4: The Merge reduced Ethereum's energy consumption by ~99.95%. --- - ## What was The Merge? {#what-is-the-merge} The Merge was the joining of the original execution layer of Ethereum (the Mainnet we use today) with its new proof-of-stake consensus layer, the Beacon Chain. It eliminated the need for energy-intensive mining and instead enabled the the network to be secured using staked ETH. It was a truly exciting step in realizing the Ethereum vision – more scalability, security, and sustainability. @@ -42,7 +41,7 @@ This transition to proof-of-stake changed the way ether is issued. Learn more ab **The Merge did not change anything for holders/users.** -_This bears repeating_: As a user or holder of ETH or any other digital asset on Ethereum, as well as non-node-operating stakers, **you do not need to do anything with your funds or wallet to account for The Merge.** ETH is just ETH. There is no such thing as "old ETH"/"new ETH" or "ETH1"/"ETH2" and wallets work exactly the same after The Merge as they did before - people tellign you otherwise are likely scammers. +_This bears repeating_: As a user or holder of ETH or any other digital asset on Ethereum, as well as non-node-operating stakers, **you do not need to do anything with your funds or wallet to account for The Merge.** ETH is just ETH. There is no such thing as "old ETH"/"new ETH" or "ETH1"/"ETH2" and wallets work exactly the same after The Merge as they did before - people tellign you otherwise are likely scammers. Despite swapping out proof-of-work, the entire history of Ethereum since genesis remained intact and unaltered by the transition to proof-of-stake. Any funds held in your wallet before The Merge will are still accessible after The Merge. **No action is required to upgrade on your part.** @@ -103,7 +102,6 @@ For more information, check out this blog post by Tim Beiko on [How The Merge Im The Merge marked the end of proof-of-work for Ethereum and start the era of a more sustainable, eco-friendly Ethereum. Ethereum's energy consumption dropped by an estimated 99.95%, making Ethereum a green blockchain. Learn more about [Ethereum energy consumption](/energy-consumption/). - ## The Merge and scaling {#merge-and-scaling} The Merge also set the stage for further scalability upgrades not possible under proof-of-work, bringing Ethereum one step closer to achieving the full scale, security and sustainability outlined in its [Ethereum vision](/upgrades/vision/). @@ -112,7 +110,7 @@ The Merge also set the stage for further scalability upgrades not possible under +contentPreview="False. Anyone is free to sync their own self-verified copy of Ethereum (i.e. run a node). No ETH is required - not before The Merge, not after The Merge, not ever."> There are two types of Ethereum nodes: nodes that can propose blocks and nodes that don't. Nodes that propose blocks are only a small number of the total nodes on Ethereum. This category includes mining nodes under proof-of-work (PoW) and validator nodes under proof-of-stake (PoS). This category requires committing economic resources (such as GPU hash power in proof-of-work or staked ETH in proof-of-stake) in exchange for the ability to occasionally propose the next block and earn protocol rewards. @@ -174,7 +172,7 @@ The APR is intentionally dynamic, allowing a market of stakers to balance how mu ## What happened to 'Eth2'? {#eth2} -The term 'Eth2' has been deprecated. After merging 'Eth1' and 'Eth2' into a single chain, there is no longer any need to +The term 'Eth2' has been deprecated. After merging 'Eth1' and 'Eth2' into a single chain, there is no longer any need to distinguish between two Ethereum networks; there is just Ethereum. To limit confusion, the community has updated these terms: From 79a7236d3ab7cbe3c410bc8301dcb4a0b24d5443 Mon Sep 17 00:00:00 2001 From: Joe Date: Wed, 20 Jul 2022 10:36:41 +0100 Subject: [PATCH 025/286] update intro to ether page --- .../docs/intro-to-ethereum/index.md | 20 +++++++++---------- 1 file changed, 9 insertions(+), 11 deletions(-) diff --git a/src/content/developers/docs/intro-to-ethereum/index.md b/src/content/developers/docs/intro-to-ethereum/index.md index c53ca51325f..be6a55ff38e 100644 --- a/src/content/developers/docs/intro-to-ethereum/index.md +++ b/src/content/developers/docs/intro-to-ethereum/index.md @@ -16,15 +16,9 @@ A blockchain is a public database that is updated and shared across many compute Every computer in the network must agree upon each new block and the chain as a whole. These computers are known as "nodes". Nodes ensure everyone interacting with the blockchain has the same data. To accomplish this distributed agreement, blockchains need a consensus mechanism. -Ethereum currently uses a [proof-of-work](/developers/docs/consensus-mechanisms/pow/) consensus mechanism. This means that anyone who wants to add new blocks to the chain must solve a difficult puzzle that requires a lot of computing power. Solving the puzzle "proves" that you have done the "work" by using computational resources. Doing this is known as [mining](/developers/docs/consensus-mechanisms/pow/mining/). Mining is typically brute force trial and error, but successfully adding a block is rewarded in ETH. +Ethereum uses a proof-of-stake based consensus mechanism. This means that anyone who wants to add new blocks to the chain must stake at least 32 ETH into the deposit contract and run validator software. They then have a chance of being randomly selected to propose blocks that other validators check and add to the blockchain. In this model there is usually only one chain, but network latency and dishoinest behaviour can cause multiple blocks to exist at the same position near the head of the chain. To resolve this, a fork-choice algorithm selects one canonical set of blocks. The blocks selected are the ones that form the heaviest possible chain, where 'heavy' refers to the number of validators that have endorsed the blocks (weighted by the ETH they have staked). There is a system of rewards and penalties that strongly incentivize participants to be honest and online as much as possible. -New blocks are broadcast to the nodes in the network, checked and verified, thus updating the state of the blockchain for everyone. - -So to summarize, when you send ETH to someone, the transaction must be added to the block which will get mined. The updated state is then shared with the entire network. - -Watch Austin walk you through blockchains: - - +More on [proof-of-stake](/developers/docs/consensus-mechanisms/pos). If you want to see how blockchain hashes data and then the previous block references all the past blocks, be sure to check out [this demo](https://andersbrownworth.com/blockchain/blockchain) by Anders Brownworth and watch the accompanying video below. @@ -34,6 +28,8 @@ Watch Anders explain hashes in blockchains: ## What is Ethereum? {#what-is-ethereum} +Ethereum is a blockchain with a computer embedded in it. It serves as the foundation for building apps and organizations is a decentralized, permissionless, censorship resistant way. + In the Ethereum universe, there is a single, canonical computer (called the Ethereum Virtual Machine, or EVM) whose state everyone on the Ethereum network agrees on. Everyone who participates in the Ethereum network (every Ethereum node) keeps a copy of the state of this computer. Additionally, any participant can broadcast a request for this computer to perform arbitrary computation. Whenever such a request is broadcast, other participants on the network verify, validate, and carry out ("execute") the computation. This execution causes a state change in the EVM, which is committed and propagated throughout the entire network. Requests for computation are called transaction requests; the record of all transactions and the EVM's present state gets stored on the blockchain, which in turn is stored and agreed upon by all nodes. @@ -42,11 +38,13 @@ Cryptographic mechanisms ensure that once transactions are verified as valid and ## What is ether? {#what-is-ether} -**Ether (ETH)** is the native cryptocurrency of Ethereum. The purpose of ether is to allow for a market for computation. Such a market provides an economic incentive for participants to verify and execute transaction requests and provide computational resources to the network. +**Ether (ETH)** is the native cryptocurrency of Ethereum. The purpose of ETH is to allow for a market for computation. Such a market provides an economic incentive for participants to verify and execute transaction requests and provide computational resources to the network. + +Any participant who broadcasts a transaction request must also offer some amount of ETH to the network as a bounty. This bounty will be awarded to whoever eventually does the work of verifying the transaction, executing it, committing it to the blockchain, and broadcasting it to the network. -Any participant who broadcasts a transaction request must also offer some amount of ether to the network as a bounty. This bounty will be awarded to whoever eventually does the work of verifying the transaction, executing it, committing it to the blockchain, and broadcasting it to the network. +The amount of ETH paid corresponds to the time required to do the computation. These bounties also prevent malicious participants from intentionally clogging the network by requesting the execution of infinite computation or other resource-intensive scripts, as these participants must pay for computation time. -The amount of ether paid corresponds to the time required to do the computation. These bounties also prevent malicious participants from intentionally clogging the network by requesting the execution of infinite computation or other resource-intensive scripts, as these participants must pay for computation time. +ETH is also used to provide crypto-economic security to the network, in three main ways: 1) it is used as a means to reward validators who propose blocks or call out dishonest behaviour by other validators; 2) It is staked by validators, acting as collateral against dishionest behaviour - if validators attempt to misbehave their ETH can be destroyed; 3) it is used to weight 'votes' for newly proposed blocks, feeding into the fork-choice part of the consensus mechanism. ## What are smart contracts? {#what-are-smart-contracts} From 53e6d0afaf95ce7ef451765d3e03b582cb17d29b Mon Sep 17 00:00:00 2001 From: Joe Date: Wed, 20 Jul 2022 11:06:16 +0100 Subject: [PATCH 026/286] update evm details for post-merge --- src/content/developers/docs/evm/index.md | 2 +- .../developers/docs/evm/opcodes/index.md | 290 +++++++++--------- 2 files changed, 146 insertions(+), 146 deletions(-) diff --git a/src/content/developers/docs/evm/index.md b/src/content/developers/docs/evm/index.md index 208b2fcddfe..5bbb03a7b89 100644 --- a/src/content/developers/docs/evm/index.md +++ b/src/content/developers/docs/evm/index.md @@ -11,7 +11,7 @@ The Ethereum protocol itself exists solely for the purpose of keeping the contin ## Prerequisites {#prerequisites} -Some basic familiarity with common terminology in computer science such as [bytes](https://wikipedia.org/wiki/Byte), [memory](https://wikipedia.org/wiki/Computer_memory), and a [stack]() are necessary to understand the EVM. It would also be helpful to be comfortable with cryptography/blockchain concepts like [hash functions](https://wikipedia.org/wiki/Cryptographic_hash_function), [proof-of-work](https://wikipedia.org/wiki/Proof_of_work) and the [Merkle tree](https://wikipedia.org/wiki/Merkle_tree). +Some basic familiarity with common terminology in computer science such as [bytes](https://wikipedia.org/wiki/Byte), [memory](https://wikipedia.org/wiki/Computer_memory), and a [stack]() are necessary to understand the EVM. It would also be helpful to be comfortable with cryptography/blockchain concepts like [hash functions](https://wikipedia.org/wiki/Cryptographic_hash_function) and the [Merkle tree](https://wikipedia.org/wiki/Merkle_tree). ## From ledger to state machine {#from-ledger-to-state-machine} diff --git a/src/content/developers/docs/evm/opcodes/index.md b/src/content/developers/docs/evm/opcodes/index.md index 59b464a059d..1eb7b937292 100644 --- a/src/content/developers/docs/evm/opcodes/index.md +++ b/src/content/developers/docs/evm/opcodes/index.md @@ -12,156 +12,156 @@ If you want to be certain of correctness and aware of every edge case, using the For operations with dynamic gas costs, see [gas.md](https://github.com/wolflo/evm-opcodes/blob/main/gas.md). -| Stack | Name | Gas | Initial Stack | Resulting Stack | Mem / Storage | Notes | -| :---: | :------------- | :---------------------------------------------------------------------------------------------: | :---------------------------------------------------------------------------------------- | :----------------------------- | :---------------------------------------------------------------------------- | :---------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------- | -| 00 | STOP | 0 | | | | halt execution | -| 01 | ADD | 3 | `a, b` | `a + b` | | (u)int256 addition modulo 2\*\*256 | -| 02 | MUL | 5 | `a, b` | `a * b` | | (u)int256 multiplication modulo 2\*\*256 | -| 03 | SUB | 3 | `a, b` | `a - b` | | (u)int256 addition modulo 2\*\*256 | -| 04 | DIV | 5 | `a, b` | `a // b` | | uint256 division | -| 05 | SDIV | 5 | `a, b` | `a // b` | | int256 division | -| 06 | MOD | 5 | `a, b` | `a % b` | | uint256 modulus | -| 07 | SMOD | 5 | `a, b` | `a % b` | | int256 modulus | -| 08 | ADDMOD | 8 | `a, b, N` | `(a + b) % N` | | (u)int256 addition modulo N | -| 09 | MULMOD | 8 | `a, b, N` | `(a * b) % N` | | (u)int256 multiplication modulo N | -| 0A | EXP | [A1](https://github.com/wolflo/evm-opcodes/blob/main/gas.md#a1-exp) | `a, b` | `a ** b` | | uint256 exponentiation modulo 2\*\*256 | -| 0B | SIGNEXTEND | 5 | `b, x` | `SIGNEXTEND(x, b)` | | [sign extend](https://wikipedia.org/wiki/Sign_extension) `x` from `(b+1)` bytes to 32 bytes | +| Stack | Name | Gas | Initial Stack | Resulting Stack | Mem / Storage | Notes | +| :---: | :------------- | :---------------------------------------------------------------------------------------------: | :---------------------------------------------------------------------------------------- | :------------------------------------ | :---------------------------------------------------------------------------- | :---------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------- | +| 00 | STOP | 0 | | | | halt execution | +| 01 | ADD | 3 | `a, b` | `a + b` | | (u)int256 addition modulo 2\*\*256 | +| 02 | MUL | 5 | `a, b` | `a * b` | | (u)int256 multiplication modulo 2\*\*256 | +| 03 | SUB | 3 | `a, b` | `a - b` | | (u)int256 addition modulo 2\*\*256 | +| 04 | DIV | 5 | `a, b` | `a // b` | | uint256 division | +| 05 | SDIV | 5 | `a, b` | `a // b` | | int256 division | +| 06 | MOD | 5 | `a, b` | `a % b` | | uint256 modulus | +| 07 | SMOD | 5 | `a, b` | `a % b` | | int256 modulus | +| 08 | ADDMOD | 8 | `a, b, N` | `(a + b) % N` | | (u)int256 addition modulo N | +| 09 | MULMOD | 8 | `a, b, N` | `(a * b) % N` | | (u)int256 multiplication modulo N | +| 0A | EXP | [A1](https://github.com/wolflo/evm-opcodes/blob/main/gas.md#a1-exp) | `a, b` | `a ** b` | | uint256 exponentiation modulo 2\*\*256 | +| 0B | SIGNEXTEND | 5 | `b, x` | `SIGNEXTEND(x, b)` | | [sign extend](https://wikipedia.org/wiki/Sign_extension) `x` from `(b+1)` bytes to 32 bytes | | 0C-0F | _invalid_ | -| 10 | LT | 3 | `a, b` | `a < b` | | uint256 less-than | -| 11 | GT | 3 | `a, b` | `a > b` | | uint256 greater-than | -| 12 | SLT | 3 | `a, b` | `a < b` | | int256 less-than | -| 13 | SGT | 3 | `a, b` | `a > b` | | int256 greater-than | -| 14 | EQ | 3 | `a, b` | `a == b` | | (u)int256 equality | -| 15 | ISZERO | 3 | `a` | `a == 0` | | (u)int256 iszero | -| 16 | AND | 3 | `a, b` | `a && b` | | bitwise AND | -| 17 | OR | 3 | `a, b` | `a \|\| b` | | bitwise OR | -| 18 | XOR | 3 | `a, b` | `a ^ b` | | bitwise XOR | -| 19 | NOT | 3 | `a` | `~a` | | bitwise NOT | -| 1A | BYTE | 3 | `i, x` | `(x >> (248 - i * 8)) && 0xFF` | | `i`th byte of (u)int256 `x`, from the left | -| 1B | SHL | 3 | `shift, val` | `val << shift` | | shift left | -| 1C | SHR | 3 | `shift, val` | `val >> shift` | | logical shift right | -| 1D | SAR | 3 | `shift, val` | `val >> shift` | | arithmetic shift right | +| 10 | LT | 3 | `a, b` | `a < b` | | uint256 less-than | +| 11 | GT | 3 | `a, b` | `a > b` | | uint256 greater-than | +| 12 | SLT | 3 | `a, b` | `a < b` | | int256 less-than | +| 13 | SGT | 3 | `a, b` | `a > b` | | int256 greater-than | +| 14 | EQ | 3 | `a, b` | `a == b` | | (u)int256 equality | +| 15 | ISZERO | 3 | `a` | `a == 0` | | (u)int256 iszero | +| 16 | AND | 3 | `a, b` | `a && b` | | bitwise AND | +| 17 | OR | 3 | `a, b` | `a \|\| b` | | bitwise OR | +| 18 | XOR | 3 | `a, b` | `a ^ b` | | bitwise XOR | +| 19 | NOT | 3 | `a` | `~a` | | bitwise NOT | +| 1A | BYTE | 3 | `i, x` | `(x >> (248 - i * 8)) && 0xFF` | | `i`th byte of (u)int256 `x`, from the left | +| 1B | SHL | 3 | `shift, val` | `val << shift` | | shift left | +| 1C | SHR | 3 | `shift, val` | `val >> shift` | | logical shift right | +| 1D | SAR | 3 | `shift, val` | `val >> shift` | | arithmetic shift right | | 1E-1F | _invalid_ | -| 20 | SHA3 | [A2](https://github.com/wolflo/evm-opcodes/blob/main/gas.md#a2-sha3) | `ost, len` | `keccak256(mem[ost:ost+len])` | | keccak256 | +| 20 | SHA3 | [A2](https://github.com/wolflo/evm-opcodes/blob/main/gas.md#a2-sha3) | `ost, len` | `keccak256(mem[ost:ost+len])` | | keccak256 | | 21-2F | _invalid_ | -| 30 | ADDRESS | 2 | `.` | `address(this)` | | address of executing contract | -| 31 | BALANCE | [A5](https://github.com/wolflo/evm-opcodes/blob/main/gas.md#a5-balance-extcodesize-extcodehash) | `addr` | `addr.balance` | | balance, in wei | -| 32 | ORIGIN | 2 | `.` | `tx.origin` | | address that originated the tx | -| 33 | CALLER | 2 | `.` | `msg.sender` | | address of msg sender | -| 34 | CALLVALUE | 2 | `.` | `msg.value` | | msg value, in wei | -| 35 | CALLDATALOAD | 3 | `idx` | `msg.data[idx:idx+32]` | | read word from msg data at index `idx` | -| 36 | CALLDATASIZE | 2 | `.` | `len(msg.data)` | | length of msg data, in bytes | -| 37 | CALLDATACOPY | [A3](https://github.com/wolflo/evm-opcodes/blob/main/gas.md#a3-copy-operations) | `dstOst, ost, len` | `.` | mem[dstOst:dstOst+len] := msg.data[ost:ost+len | copy msg data | -| 38 | CODESIZE | 2 | `.` | `len(this.code)` | | length of executing contract's code, in bytes | -| 39 | CODECOPY | [A3](https://github.com/wolflo/evm-opcodes/blob/main/gas.md#a3-copy-operations) | `dstOst, ost, len` | `.` | | mem[dstOst:dstOst+len] := this.code[ost:ost+len] | copy executing contract's bytecode | -| 3A | GASPRICE | 2 | `.` | `tx.gasprice` | | gas price of tx, in wei per unit gas [\*\*](https://github.com/ethereum/EIPs/blob/0341984ff14c8ce398f6d2b3e009c07cd99df8eb/EIPS/eip-1559.md#gasprice) | -| 3B | EXTCODESIZE | [A5](https://github.com/wolflo/evm-opcodes/blob/main/gas.md#a5-balance-extcodesize-extcodehash) | `addr` | `len(addr.code)` | | size of code at addr, in bytes | -| 3C | EXTCODECOPY | [A4](https://github.com/wolflo/evm-opcodes/blob/main/gas.md#a4-extcodecopy) | `addr, dstOst, ost, len` | `.` | mem[dstOst:dstOst+len] := addr.code[ost:ost+len] | copy code from `addr` | -| 3D | RETURNDATASIZE | 2 | `.` | `size` | | size of returned data from last external call, in bytes | -| 3E | RETURNDATACOPY | [A3](https://github.com/wolflo/evm-opcodes/blob/main/gas.md#a3-copy-operations) | `dstOst, ost, len` | `.` | mem[dstOst:dstOst+len] := returndata[ost:ost+len] | copy returned data from last external call | -| 3F | EXTCODEHASH | [A5](https://github.com/wolflo/evm-opcodes/blob/main/gas.md#a5-balance-extcodesize-extcodehash) | `addr` | `hash` | | hash = addr.exists ? keccak256(addr.code) : 0 | -| 40 | BLOCKHASH | 20 | `blockNum` | `blockHash(blockNum)` | | -| 41 | COINBASE | 2 | `.` | `block.coinbase` | | address of miner of current block | -| 42 | TIMESTAMP | 2 | `.` | `block.timestamp` | | timestamp of current block | -| 43 | NUMBER | 2 | `.` | `block.number` | | number of current block | -| 44 | DIFFICULTY | 2 | `.` | `block.difficulty` | | difficulty of current block | -| 45 | GASLIMIT | 2 | `.` | `block.gaslimit` | | gas limit of current block | -| 46 | CHAINID | 2 | `.` | `chain_id` | | push current [chain id](https://eips.ethereum.org/EIPS/eip-155) onto stack | -| 47 | SELFBALANCE | 5 | `.` | `address(this).balance` | | balance of executing contract, in wei | -| 48 | BASEFEE | 2 | `.` | `block.basefee` | | base fee of current block | +| 30 | ADDRESS | 2 | `.` | `address(this)` | | address of executing contract | +| 31 | BALANCE | [A5](https://github.com/wolflo/evm-opcodes/blob/main/gas.md#a5-balance-extcodesize-extcodehash) | `addr` | `addr.balance` | | balance, in wei | +| 32 | ORIGIN | 2 | `.` | `tx.origin` | | address that originated the tx | +| 33 | CALLER | 2 | `.` | `msg.sender` | | address of msg sender | +| 34 | CALLVALUE | 2 | `.` | `msg.value` | | msg value, in wei | +| 35 | CALLDATALOAD | 3 | `idx` | `msg.data[idx:idx+32]` | | read word from msg data at index `idx` | +| 36 | CALLDATASIZE | 2 | `.` | `len(msg.data)` | | length of msg data, in bytes | +| 37 | CALLDATACOPY | [A3](https://github.com/wolflo/evm-opcodes/blob/main/gas.md#a3-copy-operations) | `dstOst, ost, len` | `.` | mem[dstOst:dstOst+len] := msg.data[ost:ost+len | copy msg data | +| 38 | CODESIZE | 2 | `.` | `len(this.code)` | | length of executing contract's code, in bytes | +| 39 | CODECOPY | [A3](https://github.com/wolflo/evm-opcodes/blob/main/gas.md#a3-copy-operations) | `dstOst, ost, len` | `.` | | mem[dstOst:dstOst+len] := this.code[ost:ost+len] | copy executing contract's bytecode | +| 3A | GASPRICE | 2 | `.` | `tx.gasprice` | | gas price of tx, in wei per unit gas [\*\*](https://github.com/ethereum/EIPs/blob/0341984ff14c8ce398f6d2b3e009c07cd99df8eb/EIPS/eip-1559.md#gasprice) | +| 3B | EXTCODESIZE | [A5](https://github.com/wolflo/evm-opcodes/blob/main/gas.md#a5-balance-extcodesize-extcodehash) | `addr` | `len(addr.code)` | | size of code at addr, in bytes | +| 3C | EXTCODECOPY | [A4](https://github.com/wolflo/evm-opcodes/blob/main/gas.md#a4-extcodecopy) | `addr, dstOst, ost, len` | `.` | mem[dstOst:dstOst+len] := addr.code[ost:ost+len] | copy code from `addr` | +| 3D | RETURNDATASIZE | 2 | `.` | `size` | | size of returned data from last external call, in bytes | +| 3E | RETURNDATACOPY | [A3](https://github.com/wolflo/evm-opcodes/blob/main/gas.md#a3-copy-operations) | `dstOst, ost, len` | `.` | mem[dstOst:dstOst+len] := returndata[ost:ost+len] | copy returned data from last external call | +| 3F | EXTCODEHASH | [A5](https://github.com/wolflo/evm-opcodes/blob/main/gas.md#a5-balance-extcodesize-extcodehash) | `addr` | `hash` | | hash = addr.exists ? keccak256(addr.code) : 0 | +| 40 | BLOCKHASH | 20 | `blockNum` | `blockHash(blockNum)` | | +| 41 | COINBASE | 2 | `.` | `block.coinbase` | | address of miner of current block | +| 42 | TIMESTAMP | 2 | `.` | `block.timestamp` | | timestamp of current block | +| 43 | NUMBER | 2 | `.` | `block.number` | | number of current block | +| 44 | PREVRANDAO | 2 | `.` | `block.execution_payload.prev_randao` | | output of beacon chain randomness function | +| 45 | GASLIMIT | 2 | `.` | `block.gaslimit` | | gas limit of current block | +| 46 | CHAINID | 2 | `.` | `chain_id` | | push current [chain id](https://eips.ethereum.org/EIPS/eip-155) onto stack | +| 47 | SELFBALANCE | 5 | `.` | `address(this).balance` | | balance of executing contract, in wei | +| 48 | BASEFEE | 2 | `.` | `block.basefee` | | base fee of current block | | 49-4F | _invalid_ | -| 50 | POP | 2 | `_anon` | `.` | | remove item from top of stack and discard it | -| 51 | MLOAD | 3[\*](https://github.com/wolflo/evm-opcodes/blob/main/gas.md#a0-1-memory-expansion) | `ost` | `mem[ost:ost+32]` | | read word from memory at offset `ost` | -| 52 | MSTORE | 3[\*](https://github.com/wolflo/evm-opcodes/blob/main/gas.md#a0-1-memory-expansion) | `ost, val` | `.` | mem[ost:ost+32] := val | write a word to memory | -| 53 | MSTORE8 | 3[\*](https://github.com/wolflo/evm-opcodes/blob/main/gas.md#a0-1-memory-expansion) | `ost, val` | `.` | mem[ost] := val && 0xFF | write a single byte to memory | -| 54 | SLOAD | [A6](https://github.com/wolflo/evm-opcodes/blob/main/gas.md#a6-sload) | `key` | `storage[key]` | | read word from storage | -| 55 | SSTORE | [A7](https://github.com/wolflo/evm-opcodes/blob/main/gas.md#a7-sstore) | `key, val` | `.` | storage[key] := val | write word to storage | -| 56 | JUMP | 8 | `dst` | `.` | | `$pc := dst` mark that `pc` is only assigned if `dst` is a valid jumpdest | -| 57 | JUMPI | 10 | `dst, condition` | `.` | | `$pc := condition ? dst : $pc + 1` | -| 58 | PC | 2 | `.` | `$pc` | | program counter | -| 59 | MSIZE | 2 | `.` | `len(mem)` | | size of memory in current execution context, in bytes | -| 5A | GAS | 2 | `.` | `gasRemaining` | | -| 5B | JUMPDEST | 1 | | | mark valid jump destination | a valid jump destination for example a jump destination not inside the push data | +| 50 | POP | 2 | `_anon` | `.` | | remove item from top of stack and discard it | +| 51 | MLOAD | 3[\*](https://github.com/wolflo/evm-opcodes/blob/main/gas.md#a0-1-memory-expansion) | `ost` | `mem[ost:ost+32]` | | read word from memory at offset `ost` | +| 52 | MSTORE | 3[\*](https://github.com/wolflo/evm-opcodes/blob/main/gas.md#a0-1-memory-expansion) | `ost, val` | `.` | mem[ost:ost+32] := val | write a word to memory | +| 53 | MSTORE8 | 3[\*](https://github.com/wolflo/evm-opcodes/blob/main/gas.md#a0-1-memory-expansion) | `ost, val` | `.` | mem[ost] := val && 0xFF | write a single byte to memory | +| 54 | SLOAD | [A6](https://github.com/wolflo/evm-opcodes/blob/main/gas.md#a6-sload) | `key` | `storage[key]` | | read word from storage | +| 55 | SSTORE | [A7](https://github.com/wolflo/evm-opcodes/blob/main/gas.md#a7-sstore) | `key, val` | `.` | storage[key] := val | write word to storage | +| 56 | JUMP | 8 | `dst` | `.` | | `$pc := dst` mark that `pc` is only assigned if `dst` is a valid jumpdest | +| 57 | JUMPI | 10 | `dst, condition` | `.` | | `$pc := condition ? dst : $pc + 1` | +| 58 | PC | 2 | `.` | `$pc` | | program counter | +| 59 | MSIZE | 2 | `.` | `len(mem)` | | size of memory in current execution context, in bytes | +| 5A | GAS | 2 | `.` | `gasRemaining` | | +| 5B | JUMPDEST | 1 | | | mark valid jump destination | a valid jump destination for example a jump destination not inside the push data | | 5C-5F | _invalid_ | -| 60 | PUSH1 | 3 | `.` | `uint8` | | push 1-byte value onto stack | -| 61 | PUSH2 | 3 | `.` | `uint16` | | push 2-byte value onto stack | -| 62 | PUSH3 | 3 | `.` | `uint24` | | push 3-byte value onto stack | -| 63 | PUSH4 | 3 | `.` | `uint32` | | push 4-byte value onto stack | -| 64 | PUSH5 | 3 | `.` | `uint40` | | push 5-byte value onto stack | -| 65 | PUSH6 | 3 | `.` | `uint48` | | push 6-byte value onto stack | -| 66 | PUSH7 | 3 | `.` | `uint56` | | push 7-byte value onto stack | -| 67 | PUSH8 | 3 | `.` | `uint64` | | push 8-byte value onto stack | -| 68 | PUSH9 | 3 | `.` | `uint72` | | push 9-byte value onto stack | -| 69 | PUSH10 | 3 | `.` | `uint80` | | push 10-byte value onto stack | -| 6A | PUSH11 | 3 | `.` | `uint88` | | push 11-byte value onto stack | -| 6B | PUSH12 | 3 | `.` | `uint96` | | push 12-byte value onto stack | -| 6C | PUSH13 | 3 | `.` | `uint104` | | push 13-byte value onto stack | -| 6D | PUSH14 | 3 | `.` | `uint112` | | push 14-byte value onto stack | -| 6E | PUSH15 | 3 | `.` | `uint120` | | push 15-byte value onto stack | -| 6F | PUSH16 | 3 | `.` | `uint128` | | push 16-byte value onto stack | -| 70 | PUSH17 | 3 | `.` | `uint136` | | push 17-byte value onto stack | -| 71 | PUSH18 | 3 | `.` | `uint144` | | push 18-byte value onto stack | -| 72 | PUSH19 | 3 | `.` | `uint152` | | push 19-byte value onto stack | -| 73 | PUSH20 | 3 | `.` | `uint160` | | push 20-byte value onto stack | -| 74 | PUSH21 | 3 | `.` | `uint168` | | push 21-byte value onto stack | -| 75 | PUSH22 | 3 | `.` | `uint176` | | push 22-byte value onto stack | -| 76 | PUSH23 | 3 | `.` | `uint184` | | push 23-byte value onto stack | -| 77 | PUSH24 | 3 | `.` | `uint192` | | push 24-byte value onto stack | -| 78 | PUSH25 | 3 | `.` | `uint200` | | push 25-byte value onto stack | -| 79 | PUSH26 | 3 | `.` | `uint208` | | push 26-byte value onto stack | -| 7A | PUSH27 | 3 | `.` | `uint216` | | push 27-byte value onto stack | -| 7B | PUSH28 | 3 | `.` | `uint224` | | push 28-byte value onto stack | -| 7C | PUSH29 | 3 | `.` | `uint232` | | push 29-byte value onto stack | -| 7D | PUSH30 | 3 | `.` | `uint240` | | push 30-byte value onto stack | -| 7E | PUSH31 | 3 | `.` | `uint248` | | push 31-byte value onto stack | -| 7F | PUSH32 | 3 | `.` | `uint256` | | push 32-byte value onto stack | -| 80 | DUP1 | 3 | `a` | `a, a` | | clone 1st value on stack | -| 81 | DUP2 | 3 | `_, a` | `a, _, a` | | clone 2nd value on stack | -| 82 | DUP3 | 3 | `_, _, a` | `a, _, _, a` | | clone 3rd value on stack | -| 83 | DUP4 | 3 | `_, _, _, a` | `a, _, _, _, a` | | clone 4th value on stack | -| 84 | DUP5 | 3 | `..., a` | `a, ..., a` | | clone 5th value on stack | -| 85 | DUP6 | 3 | `..., a` | `a, ..., a` | | clone 6th value on stack | -| 86 | DUP7 | 3 | `..., a` | `a, ..., a` | | clone 7th value on stack | -| 87 | DUP8 | 3 | `..., a` | `a, ..., a` | | clone 8th value on stack | -| 88 | DUP9 | 3 | `..., a` | `a, ..., a` | | clone 9th value on stack | -| 89 | DUP10 | 3 | `..., a` | `a, ..., a` | | clone 10th value on stack | -| 8A | DUP11 | 3 | `..., a` | `a, ..., a` | | clone 11th value on stack | -| 8B | DUP12 | 3 | `..., a` | `a, ..., a` | | clone 12th value on stack | -| 8C | DUP13 | 3 | `..., a` | `a, ..., a` | | clone 13th value on stack | -| 8D | DUP14 | 3 | `..., a` | `a, ..., a` | | clone 14th value on stack | -| 8E | DUP15 | 3 | `..., a` | `a, ..., a` | | clone 15th value on stack | -| 8F | DUP16 | 3 | `..., a` | `a, ..., a` | | clone 16th value on stack | -| 90 | SWAP1 | 3 | `a, b` | `b, a` | | -| 91 | SWAP2 | 3 | `a, _, b` | `b, _, a` | | -| 92 | SWAP3 | 3 | `a, _, _, b` | `b, _, _, a` | | -| 93 | SWAP4 | 3 | `a, _, _, _, b` | `b, _, _, _, a` | | -| 94 | SWAP5 | 3 | `a, ..., b` | `b, ..., a` | | -| 95 | SWAP6 | 3 | `a, ..., b` | `b, ..., a` | | -| 96 | SWAP7 | 3 | `a, ..., b` | `b, ..., a` | | -| 97 | SWAP8 | 3 | `a, ..., b` | `b, ..., a` | | -| 98 | SWAP9 | 3 | `a, ..., b` | `b, ..., a` | | -| 99 | SWAP10 | 3 | `a, ..., b` | `b, ..., a` | | -| 9A | SWAP11 | 3 | `a, ..., b` | `b, ..., a` | | -| 9B | SWAP12 | 3 | `a, ..., b` | `b, ..., a` | | -| 9C | SWAP13 | 3 | `a, ..., b` | `b, ..., a` | | -| 9D | SWAP14 | 3 | `a, ..., b` | `b, ..., a` | | -| 9E | SWAP15 | 3 | `a, ..., b` | `b, ..., a` | | -| 9F | SWAP16 | 3 | `a, ..., b` | `b, ..., a` | | -| A0 | LOG0 | [A8](https://github.com/wolflo/evm-opcodes/blob/main/gas.md#a8-log-operations) | `ost, len` | `.` | | LOG0(memory[ost:ost+len]) | -| A1 | LOG1 | [A8](https://github.com/wolflo/evm-opcodes/blob/main/gas.md#a8-log-operations) | `ost, len, topic0` | `.` | | LOG1(memory[ost:ost+len], topic0) | -| A2 | LOG2 | [A8](https://github.com/wolflo/evm-opcodes/blob/main/gas.md#a8-log-operations) | `ost, len, topic0, topic1` | `.` | | LOG1(memory[ost:ost+len], topic0, topic1) | -| A3 | LOG3 | [A8](https://github.com/wolflo/evm-opcodes/blob/main/gas.md#a8-log-operations) | `ost, len, topic0, topic1, topic2` | `.` | | LOG1(memory[ost:ost+len], topic0, topic1, topic2) | -| A4 | LOG4 | [A8](https://github.com/wolflo/evm-opcodes/blob/main/gas.md#a8-log-operations) | `ost, len, topic0, topic1, topic2, topic3` | `.` | | LOG1(memory[ost:ost+len], topic0, topic1, topic2, topic3) | +| 60 | PUSH1 | 3 | `.` | `uint8` | | push 1-byte value onto stack | +| 61 | PUSH2 | 3 | `.` | `uint16` | | push 2-byte value onto stack | +| 62 | PUSH3 | 3 | `.` | `uint24` | | push 3-byte value onto stack | +| 63 | PUSH4 | 3 | `.` | `uint32` | | push 4-byte value onto stack | +| 64 | PUSH5 | 3 | `.` | `uint40` | | push 5-byte value onto stack | +| 65 | PUSH6 | 3 | `.` | `uint48` | | push 6-byte value onto stack | +| 66 | PUSH7 | 3 | `.` | `uint56` | | push 7-byte value onto stack | +| 67 | PUSH8 | 3 | `.` | `uint64` | | push 8-byte value onto stack | +| 68 | PUSH9 | 3 | `.` | `uint72` | | push 9-byte value onto stack | +| 69 | PUSH10 | 3 | `.` | `uint80` | | push 10-byte value onto stack | +| 6A | PUSH11 | 3 | `.` | `uint88` | | push 11-byte value onto stack | +| 6B | PUSH12 | 3 | `.` | `uint96` | | push 12-byte value onto stack | +| 6C | PUSH13 | 3 | `.` | `uint104` | | push 13-byte value onto stack | +| 6D | PUSH14 | 3 | `.` | `uint112` | | push 14-byte value onto stack | +| 6E | PUSH15 | 3 | `.` | `uint120` | | push 15-byte value onto stack | +| 6F | PUSH16 | 3 | `.` | `uint128` | | push 16-byte value onto stack | +| 70 | PUSH17 | 3 | `.` | `uint136` | | push 17-byte value onto stack | +| 71 | PUSH18 | 3 | `.` | `uint144` | | push 18-byte value onto stack | +| 72 | PUSH19 | 3 | `.` | `uint152` | | push 19-byte value onto stack | +| 73 | PUSH20 | 3 | `.` | `uint160` | | push 20-byte value onto stack | +| 74 | PUSH21 | 3 | `.` | `uint168` | | push 21-byte value onto stack | +| 75 | PUSH22 | 3 | `.` | `uint176` | | push 22-byte value onto stack | +| 76 | PUSH23 | 3 | `.` | `uint184` | | push 23-byte value onto stack | +| 77 | PUSH24 | 3 | `.` | `uint192` | | push 24-byte value onto stack | +| 78 | PUSH25 | 3 | `.` | `uint200` | | push 25-byte value onto stack | +| 79 | PUSH26 | 3 | `.` | `uint208` | | push 26-byte value onto stack | +| 7A | PUSH27 | 3 | `.` | `uint216` | | push 27-byte value onto stack | +| 7B | PUSH28 | 3 | `.` | `uint224` | | push 28-byte value onto stack | +| 7C | PUSH29 | 3 | `.` | `uint232` | | push 29-byte value onto stack | +| 7D | PUSH30 | 3 | `.` | `uint240` | | push 30-byte value onto stack | +| 7E | PUSH31 | 3 | `.` | `uint248` | | push 31-byte value onto stack | +| 7F | PUSH32 | 3 | `.` | `uint256` | | push 32-byte value onto stack | +| 80 | DUP1 | 3 | `a` | `a, a` | | clone 1st value on stack | +| 81 | DUP2 | 3 | `_, a` | `a, _, a` | | clone 2nd value on stack | +| 82 | DUP3 | 3 | `_, _, a` | `a, _, _, a` | | clone 3rd value on stack | +| 83 | DUP4 | 3 | `_, _, _, a` | `a, _, _, _, a` | | clone 4th value on stack | +| 84 | DUP5 | 3 | `..., a` | `a, ..., a` | | clone 5th value on stack | +| 85 | DUP6 | 3 | `..., a` | `a, ..., a` | | clone 6th value on stack | +| 86 | DUP7 | 3 | `..., a` | `a, ..., a` | | clone 7th value on stack | +| 87 | DUP8 | 3 | `..., a` | `a, ..., a` | | clone 8th value on stack | +| 88 | DUP9 | 3 | `..., a` | `a, ..., a` | | clone 9th value on stack | +| 89 | DUP10 | 3 | `..., a` | `a, ..., a` | | clone 10th value on stack | +| 8A | DUP11 | 3 | `..., a` | `a, ..., a` | | clone 11th value on stack | +| 8B | DUP12 | 3 | `..., a` | `a, ..., a` | | clone 12th value on stack | +| 8C | DUP13 | 3 | `..., a` | `a, ..., a` | | clone 13th value on stack | +| 8D | DUP14 | 3 | `..., a` | `a, ..., a` | | clone 14th value on stack | +| 8E | DUP15 | 3 | `..., a` | `a, ..., a` | | clone 15th value on stack | +| 8F | DUP16 | 3 | `..., a` | `a, ..., a` | | clone 16th value on stack | +| 90 | SWAP1 | 3 | `a, b` | `b, a` | | +| 91 | SWAP2 | 3 | `a, _, b` | `b, _, a` | | +| 92 | SWAP3 | 3 | `a, _, _, b` | `b, _, _, a` | | +| 93 | SWAP4 | 3 | `a, _, _, _, b` | `b, _, _, _, a` | | +| 94 | SWAP5 | 3 | `a, ..., b` | `b, ..., a` | | +| 95 | SWAP6 | 3 | `a, ..., b` | `b, ..., a` | | +| 96 | SWAP7 | 3 | `a, ..., b` | `b, ..., a` | | +| 97 | SWAP8 | 3 | `a, ..., b` | `b, ..., a` | | +| 98 | SWAP9 | 3 | `a, ..., b` | `b, ..., a` | | +| 99 | SWAP10 | 3 | `a, ..., b` | `b, ..., a` | | +| 9A | SWAP11 | 3 | `a, ..., b` | `b, ..., a` | | +| 9B | SWAP12 | 3 | `a, ..., b` | `b, ..., a` | | +| 9C | SWAP13 | 3 | `a, ..., b` | `b, ..., a` | | +| 9D | SWAP14 | 3 | `a, ..., b` | `b, ..., a` | | +| 9E | SWAP15 | 3 | `a, ..., b` | `b, ..., a` | | +| 9F | SWAP16 | 3 | `a, ..., b` | `b, ..., a` | | +| A0 | LOG0 | [A8](https://github.com/wolflo/evm-opcodes/blob/main/gas.md#a8-log-operations) | `ost, len` | `.` | | LOG0(memory[ost:ost+len]) | +| A1 | LOG1 | [A8](https://github.com/wolflo/evm-opcodes/blob/main/gas.md#a8-log-operations) | `ost, len, topic0` | `.` | | LOG1(memory[ost:ost+len], topic0) | +| A2 | LOG2 | [A8](https://github.com/wolflo/evm-opcodes/blob/main/gas.md#a8-log-operations) | `ost, len, topic0, topic1` | `.` | | LOG1(memory[ost:ost+len], topic0, topic1) | +| A3 | LOG3 | [A8](https://github.com/wolflo/evm-opcodes/blob/main/gas.md#a8-log-operations) | `ost, len, topic0, topic1, topic2` | `.` | | LOG1(memory[ost:ost+len], topic0, topic1, topic2) | +| A4 | LOG4 | [A8](https://github.com/wolflo/evm-opcodes/blob/main/gas.md#a8-log-operations) | `ost, len, topic0, topic1, topic2, topic3` | `.` | | LOG1(memory[ost:ost+len], topic0, topic1, topic2, topic3) | | A5-EF | _invalid_ | -| F0 | CREATE | [A9](https://github.com/wolflo/evm-opcodes/blob/main/gas.md#a9-create-operations) | `val, ost, len` | `addr` | | addr = keccak256(rlp([address(this), this.nonce])) | -| F1 | CALL | [AA](https://github.com/wolflo/evm-opcodes/blob/main/gas.md#aa-call-operations) | gas, addr, val, argOst, argLen, retOst, retLen | `success` | mem[retOst:retOst+retLen] := returndata | -| F2 | CALLCODE | [AA](https://github.com/wolflo/evm-opcodes/blob/main/gas.md#aa-call-operations) | `gas, addr, val, argOst, argLen, retOst, retLen` | `success` | mem[retOst:retOst+retLen] = returndata | same as DELEGATECALL, but does not propagate original msg.sender and msg.value | -| F3 | RETURN | 0[\*](https://github.com/wolflo/evm-opcodes/blob/main/gas.md#a0-1-memory-expansion) | `ost, len` | `.` | | return mem[ost:ost+len] | -| F4 | DELEGATECALL | [AA](https://github.com/wolflo/evm-opcodes/blob/main/gas.md#aa-call-operations) | `gas, addr, argOst, argLen, retOst, retLen` | `success` | mem[retOst:retOst+retLen] := returndata | -| F5 | CREATE2 | [A9](https://github.com/wolflo/evm-opcodes/blob/main/gas.md#a9-create-operations) | `val, ost, len, salt` | `addr` | | addr = keccak256(0xff ++ address(this) ++ salt ++ keccak256(mem[ost:ost+len]))[12:] | +| F0 | CREATE | [A9](https://github.com/wolflo/evm-opcodes/blob/main/gas.md#a9-create-operations) | `val, ost, len` | `addr` | | addr = keccak256(rlp([address(this), this.nonce])) | +| F1 | CALL | [AA](https://github.com/wolflo/evm-opcodes/blob/main/gas.md#aa-call-operations) | gas, addr, val, argOst, argLen, retOst, retLen | `success` | mem[retOst:retOst+retLen] := returndata | +| F2 | CALLCODE | [AA](https://github.com/wolflo/evm-opcodes/blob/main/gas.md#aa-call-operations) | `gas, addr, val, argOst, argLen, retOst, retLen` | `success` | mem[retOst:retOst+retLen] = returndata | same as DELEGATECALL, but does not propagate original msg.sender and msg.value | +| F3 | RETURN | 0[\*](https://github.com/wolflo/evm-opcodes/blob/main/gas.md#a0-1-memory-expansion) | `ost, len` | `.` | | return mem[ost:ost+len] | +| F4 | DELEGATECALL | [AA](https://github.com/wolflo/evm-opcodes/blob/main/gas.md#aa-call-operations) | `gas, addr, argOst, argLen, retOst, retLen` | `success` | mem[retOst:retOst+retLen] := returndata | +| F5 | CREATE2 | [A9](https://github.com/wolflo/evm-opcodes/blob/main/gas.md#a9-create-operations) | `val, ost, len, salt` | `addr` | | addr = keccak256(0xff ++ address(this) ++ salt ++ keccak256(mem[ost:ost+len]))[12:] | | F6-F9 | _invalid_ | -| FA | STATICCALL | [AA](https://github.com/wolflo/evm-opcodes/blob/main/gas.md#aa-call-operations) | `gas, addr, argOst, argLen, retOst, retLen` | `success` | mem[retOst:retOst+retLen] := returndata | +| FA | STATICCALL | [AA](https://github.com/wolflo/evm-opcodes/blob/main/gas.md#aa-call-operations) | `gas, addr, argOst, argLen, retOst, retLen` | `success` | mem[retOst:retOst+retLen] := returndata | | FB-FC | _invalid_ | -| FD | REVERT | 0[\*](https://github.com/wolflo/evm-opcodes/blob/main/gas.md#a0-1-memory-expansion) | `ost, len` | `.` | | revert(mem[ost:ost+len]) | -| FE | INVALID | [AF](https://github.com/wolflo/evm-opcodes/blob/main/gas.md#af-invalid) | | | designated invalid opcode - [EIP-141](https://eips.ethereum.org/EIPS/eip-141) | -| FF | SELFDESTRUCT | [AB](https://github.com/wolflo/evm-opcodes/blob/main/gas.md#ab-selfdestruct) | `addr` | `.` | | | destroy contract and sends all funds to `addr` | +| FD | REVERT | 0[\*](https://github.com/wolflo/evm-opcodes/blob/main/gas.md#a0-1-memory-expansion) | `ost, len` | `.` | | revert(mem[ost:ost+len]) | +| FE | INVALID | [AF](https://github.com/wolflo/evm-opcodes/blob/main/gas.md#af-invalid) | | | designated invalid opcode - [EIP-141](https://eips.ethereum.org/EIPS/eip-141) | +| FF | SELFDESTRUCT | [AB](https://github.com/wolflo/evm-opcodes/blob/main/gas.md#ab-selfdestruct) | `addr` | `.` | | | destroy contract and sends all funds to `addr` | From 9a18e8aeb5ea974ccfe7b294e6ae4bdf7d4df77a Mon Sep 17 00:00:00 2001 From: Joe Date: Wed, 20 Jul 2022 11:52:47 +0100 Subject: [PATCH 027/286] update consensus mechanism page --- .../docs/consensus-mechanisms/index.md | 36 +++++++++---------- 1 file changed, 16 insertions(+), 20 deletions(-) diff --git a/src/content/developers/docs/consensus-mechanisms/index.md b/src/content/developers/docs/consensus-mechanisms/index.md index 7af78499c9e..9dd023f1a37 100644 --- a/src/content/developers/docs/consensus-mechanisms/index.md +++ b/src/content/developers/docs/consensus-mechanisms/index.md @@ -5,9 +5,7 @@ lang: en sidebar: true --- -When it comes to blockchains like Ethereum, which are, in essence, distributed databases, the network's nodes must reach an agreement on the network's current state. This agreement is achieved using consensus mechanisms. - -Although consensus mechanisms aren't directly related to building a dapp, understanding them will illuminate concepts relevant to you and your users' experience, like gas prices and transaction times. +The term 'consensus mechanism' is often used colloquially to refer to 'proof-of-stake', 'proof-of-work' or 'proof-of-authority' protocols.However, these are just components in consensus mechanisms that protect against Sybil attacks. Consensus mechanisms are the complete stack of ideas, protocols and incentives that enable a distributed set of nodes to agree on the state of a blockchain. ## Prerequisites {#prerequisites} @@ -15,31 +13,31 @@ To better understand this page, we recommend you first read our [introduction to ## What is consensus? {#what-is-consensus} -By consensus, we mean that a general agreement has been reached. Consider a group of people going to the cinema. If there is not a disagreement on a proposed choice of film, then a consensus is achieved. In the extreme case the group will eventually split. +By consensus, we mean that a general agreement has been reached. Consider a group of people going to the cinema. If there is no disagreement on a proposed choice of film, then a consensus is achieved. In the extreme case the group will eventually split. -In regards to blockchain, the process is formalized, and reaching consensus means that at least 51% of the nodes on the network agree on the next global state of the network. +In regards to the Ethereum blockchain, the process is formalized, and reaching consensus means that at least 66% of the nodes on the network agree on the global state of the network. ## What is a consensus mechanism? {#what-is-a-consensus-mechanism} -Consensus mechanisms (also known as consensus protocols or consensus algorithms) allow distributed systems (networks of computers) to work together and stay secure. +The term consensus mechanism refers to the entire stack of protocols, incentives and ideas that allow a network of nodes to come to agreement about the state of a blockchain. -Consensus protocols and consensus algorithms are often used interchangeably. However, protocols and algorithms are different. A protocol is a set of rules defined in a standard that governs how a system and its many functioning parts operate and interact. Algorithms are like exact recipes on how to solve a problem or calculate a result. +Ethereum uses a proof-of-stake based consensus mechanism that derives its crypto-economic security from a set of rewards and penalties applied to capital staked by validators. This incentive structure encourages individual validators to act honestly, punishes those that don't, and also creates an extremely high cost to attack the network. -For decades, these mechanisms have been used to establish consensus among database nodes, application servers, and other enterprise infrastructure. In recent years, new consensus mechanisms have been invented to allow cryptoeconomic systems, such as Ethereum, to agree on the state of the network. +Then, there is a protocol that governs how honest validators are selected to propose or validate blocks, process transactions and vote for their view of the head of the chain. In the rare situations where there are multiple blocks in the same position near the head of the chain, there is a fork-choice mechanism that selects blocks that make up the 'heaviest' chain, measured by the number of validators that voted for the blocks weighted by thier staked ether balance. -A consensus mechanism in a cryptoeconomic system also helps prevent certain kinds of economic attacks. In theory, an attacker can compromise consensus by controlling 51% of the network. Consensus mechanisms are designed to make this "51% attack" unfeasible. Different mechanisms are engineered to solve this security problem in different ways. +There are also concepts that are important to consensus that are not explicitly defined in code, such as the additional security offered by potential out-of-band social coordination as a last line of defense against attacks on the network. - +These components together form the consensus mechanism. ## Types of consensus mechanisms {#types-of-consensus-mechanisms} -### Proof-of-work {#proof-of-work} +### Proof-of-work based {#proof-of-work} -Ethereum, like Bitcoin, currently uses a **proof-of-work (PoW)** consensus protocol. +Like Bitcoin, Ethereum once used a **proof-of-work (PoW)** based consensus protocol. #### Block creation {#pow-block-creation} -Proof-of-work is done by [miners](/developers/docs/consensus-mechanisms/pow/mining/), who compete to create new blocks full of processed transactions. The winner shares the new block with the rest of the network and earns some freshly minted ETH. The race is won by the computer which is able to solve a math puzzle fastest – this produces the cryptographic link between the current block and the block that went before. Solving this puzzle is the work in "proof-of-work". +Proof-of-work is done by [miners](/developers/docs/consensus-mechanisms/pow/mining/), who compete to create new blocks full of processed transactions. The winner shares the new block with the rest of the network and earns some freshly minted ETH. The race is won by the computer which is able to solve a math puzzle fastest – this produces the cryptographic link between the current block and the block that went before. Solving this puzzle is the work in "proof-of-work". The true head of the chain is then determined byh a fork-choice rule that selects the set of blocks that have had the most work done to mine them. #### Security {#pow-security} @@ -47,9 +45,9 @@ The network is kept secure by the fact that you'd need 51% of the network's comp More on [proof-of-work](/developers/docs/consensus-mechanisms/pow/) -### Proof-of-stake {#proof-of-stake} +### Proof-of-stake based {#proof-of-stake} -Ethereum plans to upgrade to a **proof-of-stake (PoS)** consensus protocol. +Ethereum now uses a **proof-of-stake (PoS)** consensus protocol. #### Block creation {#pos-block-creation} @@ -57,7 +55,7 @@ Proof-of-stake is done by validators who have staked ETH to participate in the s #### Security {#pos-security} -A proof-of-stake system is kept secure by the fact that you'd need 51% of the total staked ETH to defraud the chain. And that your stake is slashed for malicious behaviour. +A proof-of-stake system is kept secure crypto-economically because a huge amount of ether must be destroyed by an attacker attempting to take control of the chain. A system of rewards an penalties incentivize individual miners to behave honestly. More on [proof-of-stake](/developers/docs/consensus-mechanisms/pos/) @@ -69,15 +67,13 @@ Watch more on the different types of consensus mechanisms used on Ethereum: ### Sybil resistance & chain selection {#sybil-chain} -Now technically, proof-of-work and proof-of-stake are not consensus protocols by themselves, but they are often referred to as such for simplicity. They are actually Sybil resistance mechanisms and block author selectors; they are a way to decide who is the author of the latest block. It's this Sybil resistance mechanism combined with a chain selection rule that makes up a true consensus mechanism. +As mentioned earlier, proof-of-work and proof-of-stake are not consensus protocols by themselves, but they are often referred to as such for simplicity. They are actually Sybil resistance mechanisms and block author selectors; they are a way to decide who is the author of the latest block. It's this Sybil resistance mechanism combined with a chain selection rule that makes up a true consensus mechanism. **Sybil resistance** measures how a protocol fares against a [Sybil attack](https://wikipedia.org/wiki/Sybil_attack). Sybil attacks are when one user or group pretends to be many users. Resistance to this type of attack is essential for a decentralized blockchain and enables miners and validators to be rewarded equally based on resources put in. Proof-of-work and proof-of-stake protect against this by making users expend a lot of energy or put up a lot of collateral. These protections are an economic deterrent to Sybil attacks. A **chain selection rule** is used to decide which chain is the "correct" chain. Ethereum and Bitcoin currently use the "longest chain" rule, which means that whichever blockchain is the longest will be the one the rest of the nodes accept as valid and work with. For proof-of-work chains, the longest chain is determined by the chain's total cumulative proof-of-work difficulty. -The combination of proof-of-work and longest chain rule is known as "Nakamoto Consensus." - -The [Beacon Chain](/upgrades/beacon-chain/) uses a consensus mechanism called [Casper the Friendly Finality Gadget](https://arxiv.org/abs/1710.09437), which is proof-of-stake based. +Ethereum uses a consensus mechanism that combines [Casper FFG](https://arxiv.org/abs/1710.09437) proof-of-stake with the [GHOST](https://arxiv.org/abs/2003.03052) fork-choice rule. ## Further reading {#further-reading} From 716a4d2a0eaad1720aa67690f3a0bbde0dfed70b Mon Sep 17 00:00:00 2001 From: Joe Date: Wed, 20 Jul 2022 11:56:56 +0100 Subject: [PATCH 028/286] more changes --- src/content/developers/docs/consensus-mechanisms/index.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/content/developers/docs/consensus-mechanisms/index.md b/src/content/developers/docs/consensus-mechanisms/index.md index 9dd023f1a37..767f886c805 100644 --- a/src/content/developers/docs/consensus-mechanisms/index.md +++ b/src/content/developers/docs/consensus-mechanisms/index.md @@ -67,11 +67,11 @@ Watch more on the different types of consensus mechanisms used on Ethereum: ### Sybil resistance & chain selection {#sybil-chain} -As mentioned earlier, proof-of-work and proof-of-stake are not consensus protocols by themselves, but they are often referred to as such for simplicity. They are actually Sybil resistance mechanisms and block author selectors; they are a way to decide who is the author of the latest block. It's this Sybil resistance mechanism combined with a chain selection rule that makes up a true consensus mechanism. +As mentioned earlier, proof-of-work and proof-of-stake are not consensus protocols by themselves, but they are often referred to as such for simplicity. They are actually Sybil resistance mechanisms and block author selectors; they are a way to decide who is the author of the latest block. Another important component is the chain selection (a.k.a fork choice) algorithm that enables nodes to pick one single correct block at the head of the chain in scenarios where multiple blocks exist in the same position. **Sybil resistance** measures how a protocol fares against a [Sybil attack](https://wikipedia.org/wiki/Sybil_attack). Sybil attacks are when one user or group pretends to be many users. Resistance to this type of attack is essential for a decentralized blockchain and enables miners and validators to be rewarded equally based on resources put in. Proof-of-work and proof-of-stake protect against this by making users expend a lot of energy or put up a lot of collateral. These protections are an economic deterrent to Sybil attacks. -A **chain selection rule** is used to decide which chain is the "correct" chain. Ethereum and Bitcoin currently use the "longest chain" rule, which means that whichever blockchain is the longest will be the one the rest of the nodes accept as valid and work with. For proof-of-work chains, the longest chain is determined by the chain's total cumulative proof-of-work difficulty. +A **chain selection rule** is used to decide which chain is the "correct" chain. Bitcoin uses the "longest chain" rule, which means that whichever blockchain is the longest will be the one the rest of the nodes accept as valid and work with. For proof-of-work chains, the longest chain is determined by the chain's total cumulative proof-of-work difficulty. Ethereum used to use the longest chain rule too; however, now that Etheruem runs on proof-of-stake it adopted an updated fork-choice algorithm that measures the 'weight' of the chain. The weight is the accumulated sum of validator votes, weighted by validator staked-ether balances. Ethereum uses a consensus mechanism that combines [Casper FFG](https://arxiv.org/abs/1710.09437) proof-of-stake with the [GHOST](https://arxiv.org/abs/2003.03052) fork-choice rule. From f711facc3d80e6339fd7f9c5f9c390c6bd0cb620 Mon Sep 17 00:00:00 2001 From: Joe Date: Thu, 21 Jul 2022 10:27:55 +0100 Subject: [PATCH 029/286] rm reference to pow --- src/content/developers/docs/dapps/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/content/developers/docs/dapps/index.md b/src/content/developers/docs/dapps/index.md index dbe336e3137..5275cdc09e4 100644 --- a/src/content/developers/docs/dapps/index.md +++ b/src/content/developers/docs/dapps/index.md @@ -40,7 +40,7 @@ A smart contract is code that lives on the Ethereum blockchain and runs exactly ## Drawbacks of dapp development {#drawbacks-of-dapp-development} - **Maintenance** – Dapps can be harder to maintain because the code and data published to the blockchain are harder to modify. It’s hard for developers to make updates to their dapps (or the underlying data stored by a dapp) once they are deployed, even if bugs or security risks are identified in an old version. -- **Performance overhead** – There is a huge performance overhead, and scaling is really hard. To achieve the level of security, integrity, transparency, and reliability that Ethereum aspires to, every node runs and stores every transaction. On top of this, proof-of-work takes time as well. A back-of-the-envelope calculation puts the overhead at something like 1,000,000x that of standard computation currently. +- **Performance overhead** – There is a huge performance overhead, and scaling is really hard. To achieve the level of security, integrity, transparency, and reliability that Ethereum aspires to, every node runs and stores every transaction. On top of this, proof-of-stake consensus takes time as well. - **Network congestion** – When one dapp uses too many computational resources, the entire network gets backed up. Currently, the network can only process about 10-15 transactions per second; if transactions are being sent in faster than this, the pool of unconfirmed transactions can quickly balloon. - **User experience** – It may be harder to engineer user-friendly experiences because the average end-user might find it too difficult to set up a tool stack necessary to interact with the blockchain in a truly secure fashion. - **Centralization** – User-friendly and developer-friendly solutions built on top of the base layer of Ethereum might end up looking like centralized services anyways. For example, such services may store keys or other sensitive information server-side, serve a frontend using a centralized server, or run important business logic on a centralized server before writing to the blockchain. Centralization eliminates many (if not all) of the advantages of blockchain over the traditional model. From 322071b83993efab68f1e2cf8c92f3c881fc5469 Mon Sep 17 00:00:00 2001 From: Joseph Cook <33655003+jmcook1186@users.noreply.github.com> Date: Mon, 25 Jul 2022 11:53:42 +0100 Subject: [PATCH 030/286] Apply suggestions from code review Co-authored-by: Paul Wackerow <54227730+wackerow@users.noreply.github.com> --- src/content/nft/index.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/content/nft/index.md b/src/content/nft/index.md index e12443d1ad6..23d3f1e2e72 100644 --- a/src/content/nft/index.md +++ b/src/content/nft/index.md @@ -96,7 +96,7 @@ NFTs are different from ERC-20 tokens, such as DAI or LINK, in that each individ - Signatures - Lots and lots more options to get creative with! -Ownership of NFTs is managed through the uniqueID and metadata that no other token can replicate. NFTs are minted through smart contracts that assign ownership and manage the transferability of the NFT's. When someone creates or mints an NFT, they execute code stored in smart contracts that conform to different standards, such as ERC-721. This information is added to the blockchain where the NFT is being managed. The minting process, from a high level, has the following steps that it goes through: +Ownership of NFTs is managed through the unique ID and metadata that no other token can replicate. NFTs are minted through smart contracts that assign ownership and manage the transferability of the NFT's. When someone creates or mints an NFT, they execute code stored in smart contracts that conform to different standards, such as [ERC-721](/developers/docs/standards/tokens/erc-721/). This information is added to the blockchain where the NFT is being managed. The minting process, from a high level, has the following steps that it goes through: - Creating a new block - Validating information @@ -304,7 +304,7 @@ Decentralized meaning you and everyone else can verify you own something. All wi Secure meaning no one can copy/paste your NFT or steal it. -These qualities of Ethereum makes digitally owning unique items and getting a fair price for your content possible. Ethereum protects the assets using a decentralized consensus mechanism called ['proof-of-stake'](/developers/docs/consensus-mechanisms/pos). This is a low carbon consensus mechanism that is also considered more secure than the energy-intensive alternative, ['proof-of-work'](/developers/docs/consensus-mechanisms/pow). NFTs have been associated with high energy expenditure because Ethereum used to be secured using proof-of-work. This is no longer true. +These qualities of Ethereum makes digitally owning unique items and getting a fair price for your content possible. Ethereum protects the assets using a decentralized consensus mechanism which involves ['proof-of-stake'](/developers/docs/consensus-mechanisms/pos). This is a low carbon method to determine who can add a block of transactions to the chain, and is considered more secure than the energy-intensive alternative, ['proof-of-work'](/developers/docs/consensus-mechanisms/pow). NFTs have been associated with high energy expenditure because Ethereum used to be secured using proof-of-work. This is no longer true. #### Minting NFTs {#minting-nfts} @@ -312,8 +312,8 @@ When you mint an NFT, a few things have to happen: - It needs to be confirmed as an asset on the blockchain. - The owner's account balance must be updated to include that asset. This makes it possible for it to then be traded or verifiably "owned". -- The transactions that confirm the above need to be added to a block and "immortalised" on the chain. -- The block needs to be confirmed by everyone in the network as "correct". This consensus removes the need for intermediaries because the network agrees that your NFT exists and belongs to you. And it's on chain so anyone can check it. This is one of the ways Ethereum helps NFT creators to maximise their earnings. +- The transactions that confirm the above need to be added to a block and "immortalized" on the chain. +- The block needs to be confirmed by everyone in the network as "correct". This consensus removes the need for intermediaries because the network agrees that your NFT exists and belongs to you. And it's on chain so anyone can check it. This is one of the ways Ethereum helps NFT creators to maximize their earnings. All these tasks are done by block producers and validators. Block proposers add your NFT transaction to a block and broadcast it to the rest of the network. Validators check that the transaction is valid and then add it to their databases. There are lots of crypto-economic incentives in place to make sure validators are acting honestly. Otherwise, anyone could just claim that they own the NFT you just minted and fraudulently transfer ownership. From 5769638eeaf95bf59d356e66272743345d899df1 Mon Sep 17 00:00:00 2001 From: Joseph Cook <33655003+jmcook1186@users.noreply.github.com> Date: Mon, 25 Jul 2022 11:55:47 +0100 Subject: [PATCH 031/286] rm forking from security discussion --- src/content/nft/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/content/nft/index.md b/src/content/nft/index.md index 23d3f1e2e72..235a4f01d81 100644 --- a/src/content/nft/index.md +++ b/src/content/nft/index.md @@ -319,7 +319,7 @@ All these tasks are done by block producers and validators. Block proposers add #### NFT security {#nft-security} -Ethereum's security comes from its proof-of-stake consensus mechanism - validators deposit 32 ETH into a contract that can be destroyed if they misbehave. The system is designed to strongly economically disincentivize malicious actions, making Ethereum effectively tamper-proof. This is what makes NFTs possible. Once the block containing your NFT transaction becomes finalized it would cost an attacker millions of ether to change it, and even then their success is not guaranteed because the Ethereum community could decide to fork their malicious actions away. Anyone running Ethereum software would immediately be able to detect dishonest tampering with an NFT and the bad actor would be economically penalized and ejected from the pool of validators to prevent it from happening. +Ethereum's security comes from its consensus mechanism which uses proof-of-stake. Validators deposit 32 ETH into a contract that can be destroyed if they misbehave. The system is designed to strongly economically disincentivize malicious actions, making Ethereum effectively tamper-proof. This is what makes NFTs possible. Once the block containing your NFT transaction becomes finalized it would cost an attacker millions of ETH to change it. Anyone running Ethereum software would immediately be able to detect dishonest tampering with an NFT and the bad actor would be economically penalized and ejected from the pool of validators to prevent it from happening. Security issues relating to NFTs are most often related to phishing scams, smart contract vulnerabilities or user errors (such as inadvertently exposing private keys), making good wallet security critical for NFT owners. From 4b0876b111d5bceff924773dc22974590aada87b Mon Sep 17 00:00:00 2001 From: Joseph Cook <33655003+jmcook1186@users.noreply.github.com> Date: Mon, 25 Jul 2022 11:58:19 +0100 Subject: [PATCH 032/286] Apply suggestions from code review Co-authored-by: Paul Wackerow <54227730+wackerow@users.noreply.github.com> --- src/content/energy-consumption/index.md | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/src/content/energy-consumption/index.md b/src/content/energy-consumption/index.md index a296fcd8246..d877ba2ecd9 100644 --- a/src/content/energy-consumption/index.md +++ b/src/content/energy-consumption/index.md @@ -19,7 +19,7 @@ For example, on Ethereum, the transaction throughput is not only that of the bas More relevant is the overall energy consumption and carbon footprint of the network as a whole. From those values, we can examine what that network offers to its users and society at large and make a more holistic evaluation of whether that energy expenditure is justified or not. Per transaction measurements, on the other hand, imply the value of the network only comes from its role in transferring crypto between accounts and prohibits an honest cost-benefit analysis. -[Digiconomist provides whole-network energy consumption and carbon footprints for Bitcoin and Ethereum](https://digiconomist.net/ethereum-energy-consumption). At the time of writing this article, Bitcoin expends about 200 TWh/yr of energy and emits about 100 MT/yr C, while generating about 32,000 T of electrical waste from obsolete hardware annually. In comparison, the total energy expenditure for securing Ethereum is closer to **0.01 TWh/yr**. +[Digiconomist provides whole-network energy consumption and carbon footprints for Bitcoin and Ethereum](https://digiconomist.net/ethereum-energy-consumption). At the time of writing this article, Bitcoin expends about 200 TWh/yr of energy and emits about 100 MT (megatons) of carbon per year, while generating about 32,000 T of electrical waste from obsolete hardware annually. In comparison, the total energy expenditure for securing Ethereum is closer to **0.01 TWh/yr**. ![Comparison of energy expenditure across industries](./energy.png) @@ -27,28 +27,28 @@ The figure above shows the estimated annual energy consumption in TWh/yr for var _Note that the estimates presented in the plot are from publicly available sources that have been linked to in the text below. They are illustrative and do not represent an official estimate, promise or forecast._ -To put Ethereum's energy consumption in context, we can compare annualized estimates for other industries. Taking Ethereum to be a platform for securely holding digital assets as investments, perhaps we can compare to mining gold, which has been estimated to expend about [240 TWh/yr](https://www.kitco.com/news/2021-05-17/Gold-s-energy-consumption-doubles-that-of-bitcoin-Galaxy-Digital.html). As a digital payments platform we could perhaps compare to PayPal (estimated to consume about [0.26 TWh/yr](https://app.impaakt.com/analyses/paypal-consumed-264100-mwh-of-energy-in-2020-24-from-non-renewable-sources-27261)). As an entertainment platform we could perhaps compare to the gaming industry which has been estimated to expend about [34 TW/yr](https://www.researchgate.net/publication/336909520_Toward_Greener_Gaming_Estimating_National_Energy_Use_and_Energy_Efficiency_Potential). Estimates of energy consumption by Netflix range dramatically between [about 0.45TWhr/yr](https://s22.q4cdn.com/959853165/files/doc_downloads/2020/02/0220_Netflix_EnvironmentalSocialGovernanceReport_FINAL.pdf) (their own estimates reported in 2019) up to about 94 TWh/yr (as estimated by [Shift Project](https://theshiftproject.org/en/article/unsustainable-use-online-video/)) - there is some discussion about the assumptions underlying these estimates available on [Carbon Brief](https://www.carbonbrief.org/factcheck-what-is-the-carbon-footprint-of-streaming-video-on-netflix). Alternatively, Ethereum could be compared to Youtube which has been estimated to expend about [244 TWh/yr](https://thefactsource.com/how-much-electricity-does-youtube-use/), although these values depend a lot on the type of device videos are streamed on and the energy-efficiency of underlying infrastructure such as data centers. Estimates of Youtube's energy expenditure have been broken down by channel and individual videos. [Those estimates](https://thefactsource.com/how-much-electricity-does-youtube-use/) imply that people consumed 45 times more energy watching Gangnam Style in 2019 than proof-of-stake Ethereum uses in a year. +To put Ethereum's energy consumption in context, we can compare annualized estimates for other industries. Taking Ethereum to be a platform for securely holding digital assets as investments, perhaps we can compare to mining gold, which has been estimated to expend about [240 TWh/yr](https://www.kitco.com/news/2021-05-17/Gold-s-energy-consumption-doubles-that-of-bitcoin-Galaxy-Digital.html). As a digital payments platform we could perhaps compare to PayPal (estimated to consume about [0.26 TWh/yr](https://app.impaakt.com/analyses/paypal-consumed-264100-mwh-of-energy-in-2020-24-from-non-renewable-sources-27261)). As an entertainment platform we could perhaps compare to the gaming industry which has been estimated to expend about [34 TW/yr](https://www.researchgate.net/publication/336909520_Toward_Greener_Gaming_Estimating_National_Energy_Use_and_Energy_Efficiency_Potential). Estimates of energy consumption by Netflix range dramatically between [about 0.45TWhr/yr](https://s22.q4cdn.com/959853165/files/doc_downloads/2020/02/0220_Netflix_EnvironmentalSocialGovernanceReport_FINAL.pdf) (their own estimates reported in 2019) up to about 94 TWh/yr (as estimated by [Shift Project](https://theshiftproject.org/en/article/unsustainable-use-online-video/)) - there is some discussion about the assumptions underlying these estimates available on [Carbon Brief](https://www.carbonbrief.org/factcheck-what-is-the-carbon-footprint-of-streaming-video-on-netflix). Alternatively, Ethereum could be compared to Youtube which has been estimated to expend about [244 TWh/yr](https://thefactsource.com/how-much-electricity-does-youtube-use/), although these values depend a lot on the type of device videos are streamed on and the energy-efficiency of underlying infrastructure such as data centers. Estimates of YouTube's energy expenditure have been broken down by channel and individual videos. [Those estimates](https://thefactsource.com/how-much-electricity-does-youtube-use/) imply that people consumed 45 times more energy watching Gangnam Style in 2019 than proof-of-stake Ethereum uses in a year. ## A green application layer {#green-applications} -While Ethereum's energy consumption is very low, there is also a substantial, growing, and highly active **regenerative finance (ReFI)** community building on Ethereum. ReFi applications use DeFi components to build financial applications that have positive externalities benefiting the environment. ReFi is part of a wider "Solarpunk" movement that is closely aligned with Ethereum and aims to couple technological advancement and environmental stewardship. The decentralized, permissionless, composable nature of Ethereum makes it the ideal base layer for the ReFi and solarpunk communities. Through the development of these (and others, e.g. [DeSci](/desci/)), Ethereum is becoming an environmentally and socially-positive technology. +While Ethereum's energy consumption is very low, there is also a substantial, growing, and highly active **regenerative finance (ReFi)** community building on Ethereum. ReFi applications use DeFi components to build financial applications that have positive externalities benefiting the environment. ReFi is part of a wider ["solarpunk"](https://en.wikipedia.org/wiki/Solarpunk) movement that is closely aligned with Ethereum and aims to couple technological advancement and environmental stewardship. The decentralized, permissionless, composable nature of Ethereum makes it the ideal base layer for the ReFi and solarpunk communities. Through the development of these (and others, e.g. [DeSci](/desci/)), Ethereum is becoming an environmentally and socially-positive technology. ## Ethereum's carbon debt {#carbon-debt} Ethereum's current energy expenditure is very low, but this has not always been the case. Ethereum switched on its proof-of-stake consensus mechanism in Q3 2022. However, Ethereum used a proof-of-work mechanism from 2014-2022, which had a much greater environmental cost. -Since its inception, Ethereum aimed to implement a proof-of-stake consensus mechanism, but doing so without sacrificing security and decentralization took years of focused research and development. Therefore, a proof-of-work mechanism was used to get the network started. Proof-of-work consensus requires miners to use their computing hardware to solve a puzzle, expending energy in the process. The solution to the puzzle proves that energy has been expended by the miner, demonstrating that they invested real-world value for the right to add to the blockchain. Ethereum's total energy consumption peaked during the apex of the crypto bull market in February 2022 at just under 94 TWh/yr. In the summer before the switch to proof-of-stake, the energy consumption was closer to 60 TWh/yr, comparable to that of Uzbekistan, with a Carbon emission equivalent to that of Azerbaijan (33 MT/yr). +Since its inception, Ethereum aimed to implement a proof-of-stake consensus mechanism, but doing so without sacrificing security and decentralization took years of focused research and development. Therefore, a proof-of-work mechanism was used to get the network started. Proof-of-work consensus requires miners to use their computing hardware to solve a puzzle, expending energy in the process. The solution to the puzzle proves that energy has been expended by the miner, demonstrating that they invested real-world value for the right to add to the blockchain. Ethereum's total energy consumption peaked during the apex of the crypto bull market in February 2022 at just under 94 TWh/yr. In the summer before the switch to proof-of-stake, the energy consumption was closer to 60 TWh/yr, comparable to that of Uzbekistan, with a carbon emission equivalent to that of Azerbaijan (33 MT/yr). Both proof-of-work and proof-of-stake are just mechanisms to decide who gets to add the next block. Swapping proof-of-work for proof-of-stake, where the real-world value invested comes from ETH staked directly in a smart contract, removes the need for miners to burn energy to add to the blockchain. Therefore, the environmental cost of securing the network is drastically reduced. ## Why proof-of-stake is greener than proof-of-work {#why-pos-is-greener-than-pow} -Proof-of-work is a robust way to secure the network. Transactions on the Ethereum blockchain are validated by [miners](/developers/docs/consensus-mechanisms/pow/mining). Miners bundle together transactions into ordered blocks and add them to the Ethereum blockchain. The new blocks get broadcast to all the other node operators who run the transactions independently and verify that they are valid. Any dishonesty shows up as an inconsistency between different nodes. Honest blocks are added to the blockchain and become an immutable part of history. +Proof-of-work is a robust way to secure the network. Transactions on the Ethereum blockchain under the previous proof-of-work system were validated by [miners](/developers/docs/consensus-mechanisms/pow/mining). Miners bundled together transactions into ordered blocks and added them to the Ethereum blockchain. The new blocks got broadcast to all the other node operators who run the transactions independently and verify that they are valid. Any dishonesty showed up as an inconsistency between different nodes. Honest blocks were added to the blockchain and became an immutable part of history. The ability for any miner to add new blocks only works if there is a cost associated with mining and unpredictability about which specific node submits the next block. These conditions are met by imposing proof-of-work. To be eligible to submit a block of transactions, a miner must be the first to submit the solution to a computationally expensive puzzle. To successfully take control of the blockchain, a dishonest miner would have to consistently win the proof-of-work race by investing in sufficient hardware and energy to outperform the majority of other miners. -This mechanism of securing the network is problematic for several reasons. First, miners can increase their odds of success by investing in more powerful hardware, creating conditions for an arms race with miners acquiring increasingly power-hungry mining equipment. This increases the network's energy consumption and generates hardware waste. Second, Ethereum's proof-of-work protocol currently has a total annualized power consumption approximately equal to that of Finland [^1] and a carbon footprint similar to Switzerland[^1]. +This mechanism of securing the network is problematic for several reasons. First, miners would increase their odds of success by investing in more powerful hardware, creating conditions for an arms race with miners acquiring increasingly power-hungry mining equipment. This increased the network's energy consumption and generated hardware waste. Second, Ethereum's proof-of-work protocol (prior to transitioning to proof-of-stake) had a total annualized power consumption approximately equal to that of Finland [^1] and a carbon footprint similar to Switzerland[^1]. -Proof-of-stake uses validators instead of miners. Validators perform the same function as miners, except that instead of expending their assets up-front as energy expenditure, they stake ETH as collateral against dishonest behavior. This staked ETH can be destroyed if the validator misbehaves, with more severe penalties for more nefarious actions. This strongly incentivizes active and honest participation in securing the network without requiring large energy expenditure. Since almost all of the energy expended securing the proof-of-work network comes from the mining algorithm, switching to proof-of-stake dramatically reduces energy expenditure. There is also no benefit to be had by investing in more powerful hardware under proof-of-stake, so there is no arms-race condition and less electronic waste. Ethereum validators can run on typical laptops or low-power devices such as [Raspberry Pi](https://ethereum-on-arm-documentation.readthedocs.io/en/latest/user-guide/ethereum2.0.html). +Proof-of-stake uses validators instead of miners. Validators perform the same function as miners, except that instead of expending their assets up-front as energy expenditure, they stake ETH as collateral against dishonest behavior. This staked ETH can be destroyed if the validator misbehaves, with more severe penalties for more nefarious actions. This strongly incentivizes active and honest participation in securing the network without requiring large energy expenditure. Since almost all of the energy expended securing the proof-of-work network came from the mining algorithm, the switch to proof-of-stake dramatically reduced energy expenditure. There is also no benefit to be had by investing in more powerful hardware under proof-of-stake, so there is no arms-race condition and less electronic waste. Ethereum validators can run on typical laptops or low-power devices such as a [Raspberry Pi](https://ethereum-on-arm-documentation.readthedocs.io/en/latest/user-guide/ethereum2.0.html). Read more on [how Ethereum implements proof-of-stake](/developers/docs/consensus-mechanisms/pos) and how it compares to proof-of-work. From c12f0f076c38ab931b61dbf8ca86eb66d13a113b Mon Sep 17 00:00:00 2001 From: Joseph Cook <33655003+jmcook1186@users.noreply.github.com> Date: Mon, 25 Jul 2022 13:57:35 +0100 Subject: [PATCH 033/286] Apply suggestions from code review Co-authored-by: Paul Wackerow <54227730+wackerow@users.noreply.github.com> --- .../docs/consensus-mechanisms/pow/index.md | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/src/content/developers/docs/consensus-mechanisms/pow/index.md b/src/content/developers/docs/consensus-mechanisms/pow/index.md index 3ac8baeb813..48a81da0d12 100644 --- a/src/content/developers/docs/consensus-mechanisms/pow/index.md +++ b/src/content/developers/docs/consensus-mechanisms/pow/index.md @@ -5,10 +5,10 @@ lang: en sidebar: true --- -The Ethereum network started using a consensus mechanism called **[Proof-of-work (PoW)](/developers/docs/consensus-mechanisms/pow)**. This allowed the nodes of the Ethereum network to agree on the state of all information recorded on the Ethereum blockchain and prevents certain kinds of economic attacks. However, Ethereum switched off proof-of-work in 2022 and started using [proof-of-stake](/developers/docs/consensus-mechanisms/pos) instead. +The Ethereum network began by using a consensus mechanism that involved **[Proof-of-work (PoW)](/developers/docs/consensus-mechanisms/pow)**. This allowed the nodes of the Ethereum network to agree on the state of all information recorded on the Ethereum blockchain and prevented certain kinds of economic attacks. However, Ethereum switched off proof-of-work in 2022 and started using [proof-of-stake](/developers/docs/consensus-mechanisms/pos) instead. - Proof-of-work has now been deprecated. Ethereum no longer uses proof-of-work as a consensus mechanism. Instead, it uses proof-of-stake. Read more on proof-of-stake and staking. + Proof-of-work has now been deprecated. Ethereum no longer uses proof-of-work as part of its consensus mechanism. Instead, it uses proof-of-stake. Read more on proof-of-stake and staking. ## Prerequisites {#prerequisites} @@ -17,7 +17,7 @@ To better understand this page, we recommend you first read up on [transactions] ## What is Proof-of-work (PoW)? {#what-is-pow} -Proof-of-work is the mechanism that once allowed the decentralized Ethereum network to come to consensus (i.e. all nodes agree) on things like account balances and the order of transactions. This prevented users from "double spending" their coins and ensured that the Ethereum chain was tremendously difficult to attack or manipulate. These security properties now come from proof-of-stake instead. +Nakamoto consensus, which utilizes proof-of-work, is the mechanism that once allowed the decentralized Ethereum network to come to consensus (i.e. all nodes agree) on things like account balances and the order of transactions. This prevented users from "double spending" their coins and ensured that the Ethereum chain was tremendously difficult to attack or manipulate. These security properties now come from proof-of-stake instead using the consensus mechanism known as [Gasper](/developers/docs/consensus-mechanisms/pos/gasper/). ## Proof-of-work and mining {#pow-and-mining} @@ -27,7 +27,7 @@ Proof-of-work is the underlying algorithm that sets the difficulty and rules for ## How did Ethereum's proof-of-work work? {#how-it-works} -Ethereum transactions are processed into blocks. In proof-of-work Ethereum, each block contained: +Ethereum transactions are processed into blocks. In the now-deprecated proof-of-work Ethereum, each block contained: - block difficulty – for example: 3,324,092,183,262,715 - mixHash – for example: `0x44bca881b07a6a09f83b130798072441705d9a665c5ac8bdf2f39a3cdf3bee29` @@ -39,7 +39,7 @@ This block data was directly related to proof-of-work. The proof-of-work protocol, Ethash, required miners to go through an intense race of trial and error to find the nonce for a block. Only blocks with a valid nonce could be added to the chain. -When racing to create a block, a miner repeatedly put a dataset, that could only be obtained by downloading and running the full chain (as a miner does), through a mathematical function. The dataset was used to generate a mixHash below a target nonce, as dictated by the block difficulty. The best way to do this is through trial and error. +When racing to create a block, a miner repeatedly put a dataset, that could only be obtained by downloading and running the full chain (as a miner does), through a mathematical function. The dataset was used to generate a mixHash below a target that is dictated by the block difficulty. The best way to do this is through trial and error. The difficulty determined the target for the hash. The lower the target, the smaller the set of valid hashes. Once generated, this was incredibly easy for other miners and clients to verify. Even if one transaction were to change, the hash would be completely different, signalling fraud. @@ -47,7 +47,7 @@ Hashing makes fraud easy to spot. But proof-of-work as a process was also a big ### Proof-of-work and security {#security} -Miners were incentivised to do this work on the main Ethereum chain. There was little incentive for a subset of miners to start their own chain – it undermines the system. Blockchains rely on having a single state as a source of truth. +Miners were incentivized to do this work on the main Ethereum chain. There was little incentive for a subset of miners to start their own chain—it undermines the system. Blockchains rely on having a single state as a source of truth. The objective of proof-of-work was to extend the chain. The longest chain was most believable as the valid one because it had the most computational work done to generate it. Within Ethereum's PoW system, it was nearly impossible to create new blocks that erase transactions, create fake ones, or maintain a second chain. That's because a malicious miner would have needed to always solve the block nonce faster than everyone else. @@ -57,7 +57,7 @@ To consistently create malicious yet valid blocks, a malicious miner would have Proof-of-work was also responsible for issuing new currency into the system and incentivizing miners to do the work. -Miners who successfully create a block were rewarded with two freshly minted ETH and part of the transaction fees. 1.75 ETH was also paid for an uncle block. Uncle blocks are valid blocks created by a miner practically at the same time as another miner mined the successful block. Uncle blocks usually happen due to network latency. +Since the [Constantinople upgrade](/history/#constantinople), miners who successfully create a block were rewarded with two freshly minted ETH and part of the transaction fees. Ommer blocks also compensated 1.75 ETH. Ommer blocks were valid blocks created by a miner practically at the same time as another miner created the canonical block, which was ultimately determined by which chain was built on top of first. Ommer blocks usually happened due to network latency. ## Finality {#finality} @@ -65,11 +65,11 @@ A transaction has "finality" on Ethereum when it's part of a block that can't ch Because miners worked in a decentralized way, two valid blocks could be mined at the same time. This creates a temporary fork. Eventually, one of these chains became the accepted chain after subsequent blocks were mined and added to it, making it longer. -But to complicate things further, transactions rejected on the temporary fork may have been included in the accepted chain. This means it could get reversed. So finality refers to the time you should wait before considering a transaction irreversible. For Ethereum, the recommended time was six blocks or just over 1 minute. After six blocks, there was high confidence that the transaction was successful - lonmgher waits gave higher confidence. Now, with proof-of-stake, finalization is an explicit, rather than probabilistic, property of a block. +To complicate things further, transactions rejected on the temporary fork may not have been included in the accepted chain. This means it could get reversed. So finality refers to the time you should wait before considering a transaction irreversible. Under the previous proof-of-work Ethereum, the more blocks were mined on top of a specific block `N`, the higher confidence that the transactions in `N` were successful and would not be reverted. Now, with proof-of-stake, finalization is an explicit, rather than probabilistic, property of a block. ## Proof-of-work energy-usage {#energy} -A major criticism of proof-of-work is the amount of energy output required to keep the network safe. To maintain security and decentralization, Ethereum on proof-of-work consumed large amounts of energy. Shortly before switching to proof-of-stake, Ethereum miners were collectively consuming about 70 TWh/yr (about the same as the Czech Republic - according to [digiconomist](digiconomist.net) on 18/07/22). +A major criticism of proof-of-work is the amount of energy output required to keep the network safe. To maintain security and decentralization, Ethereum on proof-of-work consumed large amounts of energy. Shortly before switching to proof-of-stake, Ethereum miners were collectively consuming about 70 TWh/yr (about the same as the Czech Republic - according to [digiconomist](digiconomist.net) on 18-July-2022). ## Pros and cons {#pros-and-cons} From 3a484bb0c6430ab5ed124e5e431ab03a0e6168fa Mon Sep 17 00:00:00 2001 From: Joseph Cook <33655003+jmcook1186@users.noreply.github.com> Date: Mon, 25 Jul 2022 14:00:29 +0100 Subject: [PATCH 034/286] Apply suggestions from code review Co-authored-by: Paul Wackerow <54227730+wackerow@users.noreply.github.com> --- .../docs/consensus-mechanisms/pow/mining/index.md | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/src/content/developers/docs/consensus-mechanisms/pow/mining/index.md b/src/content/developers/docs/consensus-mechanisms/pow/mining/index.md index 9c1a47f5f51..10929b7b665 100644 --- a/src/content/developers/docs/consensus-mechanisms/pow/mining/index.md +++ b/src/content/developers/docs/consensus-mechanisms/pow/mining/index.md @@ -6,10 +6,9 @@ sidebar: true --- - Proof-of-work is no longer Ethereum's consensus mechanism, meaning mining has been switched off. Instead, Ethereum is secured by validators who stake ETH. You can start staking your ETH today. Read more on The Merge, proof-of-stake and staking. This page is for historical interest! + Proof-of-work is no longer underlying Ethereum's consensus mechanism, meaning mining has been switched off. Instead, Ethereum is secured by validators who stake ETH. You can start staking your ETH today. Read more on The Merge, proof-of-stake and staking. This page is for historical interest! - ## Prerequisites {#prerequisites} To better understand this page, we recommend you first read up on [transactions](/developers/docs/transactions/), [blocks](/developers/docs/blocks/) and [proof-of-work](/developers/docs/consensus-mechanisms/pow/). @@ -18,11 +17,11 @@ To better understand this page, we recommend you first read up on [transactions] Mining is the process of creating a block of transactions to be added to the Ethereum blockchain in Ethereum's now-deprecated proof-of-work architecture. -The word mining originates in the context of the gold analogy for crypto currencies. Gold or precious metals are scarce, so are digital tokens, and the only way to increase the total volume in a proof-of-work system is through mining. In proof-of-work Ethereum, the only mode of issuance was via mining. Unlike gold or precious metals however, Ethereum mining was also the way to secure the network by creating, verifying, publishing and propagating blocks in the blockchain. +The word mining originates in the context of the gold analogy for cryptocurrencies. Gold or precious metals are scarce, so are digital tokens, and the only way to increase the total volume in a proof-of-work system is through mining. In proof-of-work Ethereum, the only mode of issuance was via mining. Unlike gold or precious metals however, Ethereum mining was also the way to secure the network by creating, verifying, publishing and propagating blocks in the blockchain. Mining ether = Securing the Network -Mining is the lifeblood of proof-of-work. Ethereum miners - computers running software - used their time and computation power to process transactions and produce blocks. +Mining is the lifeblood of any proof-of-work blockchain. Ethereum miners - computers running software - used their time and computation power to process transactions and produce blocks prior to the transition to proof-of-stake. ## Why do miners exist? {#why-do-miners-exist} @@ -30,13 +29,13 @@ In decentralized systems like Ethereum, we need to ensure that everyone agrees o [More on proof-of-work](/developers/docs/consensus-mechanisms/pow/) -Anyone could mine on the Ethereum network using their computer. However, not everyone could mine ether (ETH) profitably. In most cases, miners had to purchase dedicated computer hardware. The average computer was unlikely to earn enough block rewards to cover the associated costs of mining. +Anyone was previously able to mine on the Ethereum network using their computer. However, not everyone could mine ether (ETH) profitably. In most cases, miners had to purchase dedicated computer hardware, and have access to inexpensive energy sources. The average computer was unlikely to earn enough block rewards to cover the associated costs of mining. ### Cost of mining {#cost-of-mining} - Potential costs of the hardware necessary to build and maintain a mining rig - Electrical cost of powering the mining rig -- If you were mining in a pool, mining pools typically charge a flat % fee of each block generated by the pool +- If you were mining in a pool, these pools typically charged a flat % fee of each block generated by the pool - Potential cost of equipment to support mining rig (ventilation, energy monitoring, electrical wiring, etc.) To further explore mining profitability, use a mining calculator, such as the one [Etherscan](https://etherscan.io/ether-mining-calculator) provides. @@ -64,9 +63,9 @@ Watch Austin walk you through mining and the proof-of-work blockchain. ## The mining algorithm {#mining-algorithm} -Ethereum Mainnet onyl ever used one mining algorithm - ['Ethash'](/developers/docs/consensus-mechanisms/pow/mining/mining-algorithms/ethash). This was a successor to an original R&D algorithm known as ['Dagger-Hashamoto'](/developers/docs/consensus-mechanisms/pow/mining/mining-algorithms/dagger-hashamoto). +Ethereum Mainnet only ever used one mining algorithm - ['Ethash'](/developers/docs/consensus-mechanisms/pow/mining/mining-algorithms/ethash). This was a successor to an original R&D algorithm known as ['Dagger-Hashamoto'](/developers/docs/consensus-mechanisms/pow/mining/mining-algorithms/dagger-hashamoto). -The algorithm is based around the provision of a large, transient, randomly generated dataset which forms a [Directed Acyclic Graph](https://en.wikipedia.org/wiki/Directed_acyclic_graph) (the Dagger-part), with miners attempting to solve a particular constraint on it, partly determined through a block’s header-hash. This has high memory-access bandwidth requirements but could be run using a modest processor, making it GPU-friendly but resistant to the type of ASIC-driven hardware arms race that could pose a centralization risk (more on [problems with ASICS](https://www.investopedia.com/investing/why-centralized-crypto-mining-growing-problem/)). ASICs for Ethereum mining were eventually developed, but the majority of mining on Ethereum was nevertheless done using GPUs. +The algorithm is based around the provision of a large, transient, randomly generated dataset which forms a [Directed Acyclic Graph](https://en.wikipedia.org/wiki/Directed_acyclic_graph) (the Dagger part), with miners attempting to solve a particular constraint on it, partly determined through a block’s header-hash. This has high memory-access bandwidth requirements but could be run using a modest processor, making it GPU-friendly but resistant to the type of ASIC-driven hardware arms race that could pose a centralization risk (more on [problems with ASICS](https://www.investopedia.com/investing/why-centralized-crypto-mining-growing-problem/)). ASICs for Ethereum mining were eventually developed, but the majority of mining on Ethereum was nevertheless done using GPUs. More information on these mining algorithms is available at our [mining algorithms page](/developers/docs/consensus-mechanisms/pow/mining-algorithms/). From f56697e020fa43ba3c32047861020bcf43a5e8f3 Mon Sep 17 00:00:00 2001 From: Joseph Cook <33655003+jmcook1186@users.noreply.github.com> Date: Mon, 25 Jul 2022 14:02:56 +0100 Subject: [PATCH 035/286] Apply suggestions from code review Co-authored-by: Paul Wackerow <54227730+wackerow@users.noreply.github.com> --- .../consensus-mechanisms/pow/mining-algorithms/index.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/content/developers/docs/consensus-mechanisms/pow/mining-algorithms/index.md b/src/content/developers/docs/consensus-mechanisms/pow/mining-algorithms/index.md index e7a444f933c..4b8bea458a5 100644 --- a/src/content/developers/docs/consensus-mechanisms/pow/mining-algorithms/index.md +++ b/src/content/developers/docs/consensus-mechanisms/pow/mining-algorithms/index.md @@ -7,11 +7,11 @@ preMergeBanner: true --- - Proof-of-work is no longer Ethereum's consensus mechanism, meaning mining has been switched off. Instead, Ethereum is secured by validators who stake ETH. You can start staking your ETH today. Read more on The Merge, proof-of-stake and staking. This page is for historical interest! + Proof-of-work is no longer underlying Ethereum's consensus mechanism, meaning mining has been switched off. Instead, Ethereum is secured by validators who stake ETH. You can start staking your ETH today. Read more on The Merge, proof-of-stake and staking. This page is for historical interest! -Ethereum mining used an algorithm known as Ethash. The fundamental idea of the algorithm is that a miner tries to find a nonce input using brute force computation so that the result is below a certain difficulty threshold. This difficulty threshold can be dynamically adjusted, allowing block production to happen at a regular interval. +Ethereum mining used an algorithm known as Ethash. The fundamental idea of the algorithm is that a miner tries to find a nonce input using brute force computation so that the resulting hash is smaller than a threshold determined by the calculated difficulty. This difficulty level can be dynamically adjusted, allowing block production to happen at a regular interval. ## Prerequisites {#prerequisites} @@ -31,7 +31,7 @@ More on [Dagger-Hashimoto](/developers/docs/consensus-mechanisms/pow/mining-algo ## Ethash {#ethash} -Ethash the mining algorithm that was actually used on the real Ethereum Mainnet. Ethash was effectively a new name given to a specific version of Dagger-Hashimoto after the algorithm got significantly updated, whilst still inheriting the fundamental principles of its predecessor. Ethereum Mainnet only ever used Ethash - Dagger Hashimoto was an R&D version of the mining algorithm that was superseded before mining started on Ethereum mainnet. +Ethash was the mining algorithm that was actually used on the real Ethereum Mainnet under the now deprecated proof-of-work architecture. Ethash was effectively a new name given to a specific version of Dagger-Hashimoto after the algorithm got significantly updated, whilst still inheriting the fundamental principles of its predecessor. Ethereum Mainnet only ever used Ethash - Dagger Hashimoto was an R&D version of the mining algorithm that was superseded before mining started on Ethereum mainnet. [More on Ethash](/developers/docs/consensus-mechanisms/pow/mining-algorithms/ethash). From 6308a2625df517c12e31f9ce7dc744d49d6bb4c1 Mon Sep 17 00:00:00 2001 From: Joseph Cook <33655003+jmcook1186@users.noreply.github.com> Date: Mon, 25 Jul 2022 14:04:10 +0100 Subject: [PATCH 036/286] Apply suggestions from code review Co-authored-by: Paul Wackerow <54227730+wackerow@users.noreply.github.com> --- src/content/developers/docs/gas/index.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/content/developers/docs/gas/index.md b/src/content/developers/docs/gas/index.md index 74e90bc8eba..e89691815d7 100644 --- a/src/content/developers/docs/gas/index.md +++ b/src/content/developers/docs/gas/index.md @@ -31,16 +31,16 @@ Calculating the total transaction fee works as follows: `Gas units (limit) * (Base fee + Tip)` -Let's say Jordan has to pay Taylor 1 ETH. In the transaction, the gas limit is 21,000 units and the base fee is 100 gwei. Jordan includes a tip of 10 gwei. +Let's say Jordan has to pay Taylor 1 ETH. In the transaction, the gas limit is 21,000 units and the base fee is 10 gwei. Jordan includes a tip of 2 gwei. Using the formula above we can calculate this as -`21,000 * (100 + 10) = 2,310,000 gwei` or 0.00231 ETH. +`21,000 * (10 + 2) = 252,000 gwei` or 0.000252 ETH. -When Jordan sends the money, 1.00231 ETH will be deducted from Jordan's account. +When Jordan sends the money, 1.000252 ETH will be deducted from Jordan's account. Taylor will be credited 1.0000 ETH. -Validator receives the tip of 0.00021 ETH. -Base fee of 0.0021 ETH is burned. +Validator receives the tip of 0.000042 ETH. +Base fee of 0.00021 ETH is burned. Additionally, Jordan can also set a max fee (`maxFeePerGas`) for the transaction. The difference between the max fee and the actual fee is refunded to Jordan, i.e. `refund = max fee - (base fee + priority fee)`. Jordan can set a maximum amount to pay for the transaction to execute and not worry about overpaying "beyond" the base fee when the transaction is executed. From 85a2c2d59f018249bcb004501a0efc68e3f85c54 Mon Sep 17 00:00:00 2001 From: Joseph Cook <33655003+jmcook1186@users.noreply.github.com> Date: Mon, 25 Jul 2022 14:10:44 +0100 Subject: [PATCH 037/286] Apply suggestions from code review Co-authored-by: Paul Wackerow <54227730+wackerow@users.noreply.github.com> --- .../pow/mining-algorithms/ethash/index.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/content/developers/docs/consensus-mechanisms/pow/mining-algorithms/ethash/index.md b/src/content/developers/docs/consensus-mechanisms/pow/mining-algorithms/ethash/index.md index a7a89f53548..22a6ee8230f 100644 --- a/src/content/developers/docs/consensus-mechanisms/pow/mining-algorithms/ethash/index.md +++ b/src/content/developers/docs/consensus-mechanisms/pow/mining-algorithms/ethash/index.md @@ -6,14 +6,14 @@ sidebar: true --- - Ethash is Ethereum's proof-of-work mining algorithm. Proof-of-work has now been **switched off entirely** and Ethereum is now secured using [proof-of-stake](/developers/docs/consensus-mechanisms/pos) instead. Read more on The Merge, proof-of-stake and staking. This page is for historical interest! + Ethash was Ethereum's proof-of-work mining algorithm. Proof-of-work has now been **switched off entirely** and Ethereum is now secured using [proof-of-stake](/developers/docs/consensus-mechanisms/pos) instead. Read more on The Merge, proof-of-stake and staking. This page is for historical interest! [Ethash](https://github.com/ethereum/wiki/wiki/Ethash) is a modified version of the [Dagger-Hashimoto](/developers/docs/consensus-mechanisms/pow/mining-algorithms/dagger-hashamoto) algorithm. Ethash proof-of-work is [memory hard](https://wikipedia.org/wiki/Memory-hard_function), which was thought to make the algorithm ASIC resistant. Ethash ASICs were eventually developed but GPU mining was still a viable option until proof-of-work was switched off. Ethash is still used to mine other coins on other non-Ethereum proof-of-work networks. ## How does Ethash work? {#how-does-ethash-work} -Memory hardness is achieved with a proof of work algorithm that requires choosing subsets of a fixed resource dependent on the nonce and block header. This resource (a few gigabytes in size) is called a DAG. The DAG is changed every 30000 blocks, a 125-hour window called an epoch (roughly 5.2 days) and takes a while to generate. Since the DAG only depends on block height, it can be pre-generated but if it's not, the client needs to wait until the end of this process to produce a block. If clients do not pre-generate and cache DAGs ahead of time the network may experience massive block delay on each epoch transition. Note that the DAG does not need to be generated for verifying the proof-of-work essentially allowing for verification with both low CPU and small memory. +Memory hardness is achieved with a proof of work algorithm that requires choosing subsets of a fixed resource dependent on the nonce and block header. This resource (a few gigabytes in size) is called a DAG. The DAG is changed every 30000 blocks, a ~125-hour window called an epoch (roughly 5.2 days) and takes a while to generate. Since the DAG only depends on block height, it can be pre-generated, but if it's not the client needs to wait until the end of this process to produce a block. If clients do not pre-generate and cache DAGs ahead of time the network may experience massive block delay on each epoch transition. Note that the DAG does not need to be generated for verifying the proof-of-work essentially allowing for verification with both low CPU and small memory. The general route that the algorithm takes is as follows: From 87aa0b346cfe50a36e5891399478ac1cdc6207de Mon Sep 17 00:00:00 2001 From: Joseph Cook <33655003+jmcook1186@users.noreply.github.com> Date: Mon, 25 Jul 2022 14:24:37 +0100 Subject: [PATCH 038/286] Apply suggestions from code review Co-authored-by: Paul Wackerow <54227730+wackerow@users.noreply.github.com> --- src/content/staking/pools/index.md | 2 +- src/content/staking/saas/index.md | 2 -- src/content/staking/solo/index.md | 2 +- 3 files changed, 2 insertions(+), 4 deletions(-) diff --git a/src/content/staking/pools/index.md b/src/content/staking/pools/index.md index 2fafcf9b19f..51749893ee4 100644 --- a/src/content/staking/pools/index.md +++ b/src/content/staking/pools/index.md @@ -69,7 +69,7 @@ Typically ERC-20 liquidity tokens are issued to stakers that represents the valu Currently, withdrawing funds from an Ethereum validator is not possible, which limits the ability to actually redeem your liquidity token for the ETH rewards locked in the consensus layer. -Alternatively, pools that utilize an ERC-20 liquidity token allow users to trade this token in the open market, effectively allowing you to "withdraw" without actually removing ETH from the staking contract. +Alternatively, pools that utilize an ERC-20 liquidity token allow users to trade this token in the open market, allowing you to sell your staking position, effectively "withdrawing" without actually removing ETH from the staking contract. diff --git a/src/content/staking/saas/index.md b/src/content/staking/saas/index.md index 34de01d1bc3..fd4fcc9b764 100644 --- a/src/content/staking/saas/index.md +++ b/src/content/staking/saas/index.md @@ -79,8 +79,6 @@ All of these keys can always be regenerated in a reproducible manner using your When you stake 32 ETH with a SaaS provider, that ETH is still deposited to the official staking deposit contract. As such, SaaS stakers are currently limited by the same withdrawal restrictions as solo stakers. This means that staking your ETH is currently a one-way deposit. This will be the case until the Shanghai upgrade. - - By using an SaaS provider, you are entrusting the operation of your node to someone else. This comes with the risk of poor node performance, which is not in your control. In the event your validator is slashed, your validator balance will be penalized and forcibly removed from the validator pool. These funds will be locked until withdrawals are enabled at the protocol level. diff --git a/src/content/staking/solo/index.md b/src/content/staking/solo/index.md index 14232b6a67f..0fcf330cac5 100644 --- a/src/content/staking/solo/index.md +++ b/src/content/staking/solo/index.md @@ -58,7 +58,7 @@ As much as we wish that solo staking was accessible and risk free to everyone, t

Ethereum security and scam prevention

- Withdrawing staked ETH or rewards from a validator balance is not yet supported. Support for withdrawals are planned for the Shanghai upgrade. You should anticipate your ETH being locked for at least one-to-two years. After the Shanghai upgrade you will be able to freely withdraw portions or all of your stake if you wish. + Withdrawing staked ETH or rewards from a validator balance is not yet supported. Support for withdrawals are planned for the upcoming Shanghai upgrade. You should anticipate your ETH being locked for at least one-to-two years. After the Shanghai upgrade you will be able to freely withdraw portions or all of your stake if you wish. Hardware occasionally fails, network connections error out, and client software occasionally needs upgrading. Node maintenance is inevitable and will occasionally require your attention. You'll want to be sure you stay aware of any anticipated network upgrades, or other critical client upgrades. From 6e96ee262d297233995d279a2eb3787c0e5e6fd5 Mon Sep 17 00:00:00 2001 From: Joseph Cook <33655003+jmcook1186@users.noreply.github.com> Date: Mon, 25 Jul 2022 15:46:22 +0100 Subject: [PATCH 039/286] Apply suggestions from code review Co-authored-by: Paul Wackerow <54227730+wackerow@users.noreply.github.com> --- src/content/developers/docs/consensus-mechanisms/pos/index.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/content/developers/docs/consensus-mechanisms/pos/index.md b/src/content/developers/docs/consensus-mechanisms/pos/index.md index f8ee157dccd..2d29321ad7f 100644 --- a/src/content/developers/docs/consensus-mechanisms/pos/index.md +++ b/src/content/developers/docs/consensus-mechanisms/pos/index.md @@ -5,7 +5,7 @@ lang: en sidebar: true --- -Proof-of-stake (PoS) is Ethereum's [consensus mechanism](/developers/docs/consensus-mechanisms/). Ethereum switched on its proof-of-stake mechanism in 2022 because it is more secure, less energy-intensive, and better for implementing new scaling solutions compared to the previous consensus mechanism, [proof-of-work](/developers/docs/consensus-mechanisms/pow). +Proof-of-stake (PoS) underlies Ethereum's [consensus mechanism](/developers/docs/consensus-mechanisms/). Ethereum switched on its proof-of-stake mechanism in 2022 because it is more secure, less energy-intensive, and better for implementing new scaling solutions compared to the previous [proof-of-work](/developers/docs/consensus-mechanisms/pow) architecture. ## Prerequisites {#prerequisites} @@ -13,7 +13,7 @@ To better understand this page, we recommend you first read up on [consensus mec ## What is proof-of-stake (PoS)? {#what-is-pos} -Proof-of-stake is a type of [consensus mechanism](/developers/docs/consensus-mechanisms/) used by blockchains to achieve distributed consensus. In proof-of-work, miners prove they have capital at risk by expending energy. In proof-of-stake, validators explicitly stake capital in the form of ETH into a smart contract on Ethereum. This staked ETH then acts as collateral that can be destroyed if the validator behaves dishonestly or lazily. The validator is then responsible for checking that new blocks propagated over the network are valid and occasionally creating and propagating new blocks themselves. +Proof-of-stake underlies certain [consensus mechanisms](/developers/docs/consensus-mechanisms/) used by blockchains to achieve distributed consensus. In proof-of-work, miners prove they have capital at risk by expending energy. Ethereum uses proof-of-stake, where validators explicitly stake capital in the form of ETH into a smart contract on Ethereum. This staked ETH then acts as collateral that can be destroyed if the validator behaves dishonestly or lazily. The validator is then responsible for checking that new blocks propagated over the network are valid and occasionally creating and propagating new blocks themselves. Proof-of-stake comes with a number of improvements to the now-deprecated proof-of-work system: From 75283e7332e985b60750d8bfbeb04aba85d80ea3 Mon Sep 17 00:00:00 2001 From: Paul Wackerow <54227730+wackerow@users.noreply.github.com> Date: Mon, 25 Jul 2022 09:10:02 -0700 Subject: [PATCH 040/286] Apply suggestions from code review --- src/content/developers/docs/intro-to-ethereum/index.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/content/developers/docs/intro-to-ethereum/index.md b/src/content/developers/docs/intro-to-ethereum/index.md index be6a55ff38e..e09b9b89a94 100644 --- a/src/content/developers/docs/intro-to-ethereum/index.md +++ b/src/content/developers/docs/intro-to-ethereum/index.md @@ -16,7 +16,7 @@ A blockchain is a public database that is updated and shared across many compute Every computer in the network must agree upon each new block and the chain as a whole. These computers are known as "nodes". Nodes ensure everyone interacting with the blockchain has the same data. To accomplish this distributed agreement, blockchains need a consensus mechanism. -Ethereum uses a proof-of-stake based consensus mechanism. This means that anyone who wants to add new blocks to the chain must stake at least 32 ETH into the deposit contract and run validator software. They then have a chance of being randomly selected to propose blocks that other validators check and add to the blockchain. In this model there is usually only one chain, but network latency and dishoinest behaviour can cause multiple blocks to exist at the same position near the head of the chain. To resolve this, a fork-choice algorithm selects one canonical set of blocks. The blocks selected are the ones that form the heaviest possible chain, where 'heavy' refers to the number of validators that have endorsed the blocks (weighted by the ETH they have staked). There is a system of rewards and penalties that strongly incentivize participants to be honest and online as much as possible. +Ethereum uses a proof-of-stake based consensus mechanism. This means that anyone who wants to add new blocks to the chain must stake at least 32 ETH into the deposit contract and run validator software. They then have a chance of being randomly selected to propose blocks that other validators check and add to the blockchain. In this model there is usually only one chain, but network latency and dishonest behavior can cause multiple blocks to exist at the same position near the head of the chain. To resolve this, a fork-choice algorithm selects one canonical set of blocks. The blocks selected are the ones that form the heaviest possible chain, where 'heavy' refers to the number of validators that have endorsed the blocks (weighted by the ETH they have staked). There is a system of rewards and penalties that strongly incentivize participants to be honest and online as much as possible. More on [proof-of-stake](/developers/docs/consensus-mechanisms/pos). @@ -28,7 +28,7 @@ Watch Anders explain hashes in blockchains: ## What is Ethereum? {#what-is-ethereum} -Ethereum is a blockchain with a computer embedded in it. It serves as the foundation for building apps and organizations is a decentralized, permissionless, censorship resistant way. +Ethereum is a blockchain with a computer embedded in it. It serves as the foundation for building apps and organizations in a decentralized, permissionless, censorship resistant way. In the Ethereum universe, there is a single, canonical computer (called the Ethereum Virtual Machine, or EVM) whose state everyone on the Ethereum network agrees on. Everyone who participates in the Ethereum network (every Ethereum node) keeps a copy of the state of this computer. Additionally, any participant can broadcast a request for this computer to perform arbitrary computation. Whenever such a request is broadcast, other participants on the network verify, validate, and carry out ("execute") the computation. This execution causes a state change in the EVM, which is committed and propagated throughout the entire network. @@ -44,7 +44,7 @@ Any participant who broadcasts a transaction request must also offer some amount The amount of ETH paid corresponds to the time required to do the computation. These bounties also prevent malicious participants from intentionally clogging the network by requesting the execution of infinite computation or other resource-intensive scripts, as these participants must pay for computation time. -ETH is also used to provide crypto-economic security to the network, in three main ways: 1) it is used as a means to reward validators who propose blocks or call out dishonest behaviour by other validators; 2) It is staked by validators, acting as collateral against dishionest behaviour - if validators attempt to misbehave their ETH can be destroyed; 3) it is used to weight 'votes' for newly proposed blocks, feeding into the fork-choice part of the consensus mechanism. +ETH is also used to provide crypto-economic security to the network, in three main ways: 1) it is used as a means to reward validators who propose blocks or call out dishonest behavior by other validators; 2) It is staked by validators, acting as collateral against dishonest behavior—if validators attempt to misbehave their ETH can be destroyed; 3) it is used to weight 'votes' for newly proposed blocks, feeding into the fork-choice part of the consensus mechanism. ## What are smart contracts? {#what-are-smart-contracts} From 997ec1201cf5c0dec6639c247abc1324962111bf Mon Sep 17 00:00:00 2001 From: Joe Date: Tue, 26 Jul 2022 09:51:56 +0100 Subject: [PATCH 041/286] update index, revert intl changes --- src/content/developers/docs/intro-to-ether/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/content/developers/docs/intro-to-ether/index.md b/src/content/developers/docs/intro-to-ether/index.md index e0d4a255bb2..d508dfe6208 100644 --- a/src/content/developers/docs/intro-to-ether/index.md +++ b/src/content/developers/docs/intro-to-ether/index.md @@ -34,7 +34,7 @@ It is [common](https://www.reuters.com/article/us-crypto-currencies-lending-insi Minting is the process in which new ether gets created on the Ethereum ledger. The underlying Ethereum protocol creates the new ether, and it is not possible for a user to create ether. -Ether is minted when a new block is created on the Ethereum blockchain. As an incentive to build blocks, the protocol grants a reward in each block, incrementing the balance of an address set by the block producer. The block reward has changed over time, and today it is 2 ETH per block. After the merge issuance to each validator depends upon the amount of ether they have staked and their performance. +Ether is minted as a reward for each block proposed, and also at every epoch checkpoint for other validator activity related to reaching consensus. The total amount issued depends on the number of validators and how much ether they have staked. This total issuance is divided equally among validators in the ideal case that all validators are honest and online, but in reality it varies based on validator performance. About 1/8 of the total issuance goes to the block proposer, the remainder is distributed across the other validators. Block proposers also receive tips from transaction fees and MEV related income but these come from recycled ether, not fresh issuance. ## Burning ether {#burning-ether} From 35450d1b39020aae2f530ac6a7cb21c272e08b2c Mon Sep 17 00:00:00 2001 From: Joseph Cook <33655003+jmcook1186@users.noreply.github.com> Date: Tue, 26 Jul 2022 09:57:31 +0100 Subject: [PATCH 042/286] Apply suggestions from code review Co-authored-by: Paul Wackerow <54227730+wackerow@users.noreply.github.com> --- .../docs/consensus-mechanisms/index.md | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/src/content/developers/docs/consensus-mechanisms/index.md b/src/content/developers/docs/consensus-mechanisms/index.md index 767f886c805..cafed97daa3 100644 --- a/src/content/developers/docs/consensus-mechanisms/index.md +++ b/src/content/developers/docs/consensus-mechanisms/index.md @@ -5,7 +5,7 @@ lang: en sidebar: true --- -The term 'consensus mechanism' is often used colloquially to refer to 'proof-of-stake', 'proof-of-work' or 'proof-of-authority' protocols.However, these are just components in consensus mechanisms that protect against Sybil attacks. Consensus mechanisms are the complete stack of ideas, protocols and incentives that enable a distributed set of nodes to agree on the state of a blockchain. +The term 'consensus mechanism' is often used colloquially to refer to 'proof-of-stake', 'proof-of-work' or 'proof-of-authority' protocols. However, these are just components in consensus mechanisms that protect against Sybil attacks. Consensus mechanisms are the complete stack of ideas, protocols and incentives that enable a distributed set of nodes to agree on the state of a blockchain. ## Prerequisites {#prerequisites} @@ -13,7 +13,7 @@ To better understand this page, we recommend you first read our [introduction to ## What is consensus? {#what-is-consensus} -By consensus, we mean that a general agreement has been reached. Consider a group of people going to the cinema. If there is no disagreement on a proposed choice of film, then a consensus is achieved. In the extreme case the group will eventually split. +By consensus, we mean that a general agreement has been reached. Consider a group of people going to the cinema. If there is no disagreement on a proposed choice of film, then a consensus is achieved. If there is disagreement, the group must have a means to decide which film to see. In the extreme case the group will eventually split. In regards to the Ethereum blockchain, the process is formalized, and reaching consensus means that at least 66% of the nodes on the network agree on the global state of the network. @@ -21,7 +21,7 @@ In regards to the Ethereum blockchain, the process is formalized, and reaching c The term consensus mechanism refers to the entire stack of protocols, incentives and ideas that allow a network of nodes to come to agreement about the state of a blockchain. -Ethereum uses a proof-of-stake based consensus mechanism that derives its crypto-economic security from a set of rewards and penalties applied to capital staked by validators. This incentive structure encourages individual validators to act honestly, punishes those that don't, and also creates an extremely high cost to attack the network. +Ethereum uses a proof-of-stake based consensus mechanism that derives its crypto-economic security from a set of rewards and penalties applied to capital locked by stakers. This incentive structure encourages individual stakers to operate honest validators, punishes those that don't, and also creates an extremely high cost to attack the network. Then, there is a protocol that governs how honest validators are selected to propose or validate blocks, process transactions and vote for their view of the head of the chain. In the rare situations where there are multiple blocks in the same position near the head of the chain, there is a fork-choice mechanism that selects blocks that make up the 'heaviest' chain, measured by the number of validators that voted for the blocks weighted by thier staked ether balance. @@ -37,7 +37,7 @@ Like Bitcoin, Ethereum once used a **proof-of-work (PoW)** based consensus proto #### Block creation {#pow-block-creation} -Proof-of-work is done by [miners](/developers/docs/consensus-mechanisms/pow/mining/), who compete to create new blocks full of processed transactions. The winner shares the new block with the rest of the network and earns some freshly minted ETH. The race is won by the computer which is able to solve a math puzzle fastest – this produces the cryptographic link between the current block and the block that went before. Solving this puzzle is the work in "proof-of-work". The true head of the chain is then determined byh a fork-choice rule that selects the set of blocks that have had the most work done to mine them. +Proof-of-work is done by [miners](/developers/docs/consensus-mechanisms/pow/mining/), who compete to create new blocks full of processed transactions. The winner shares the new block with the rest of the network and earns some freshly minted ETH. The race is won by the computer which is able to solve a math puzzle fastest—this produces the cryptographic link between the current block and the block that went before. Solving this puzzle is the work in "proof-of-work". The true head of the chain is then determined by a fork-choice rule that selects the set of blocks that have had the most work done to mine them. #### Security {#pow-security} @@ -47,7 +47,7 @@ More on [proof-of-work](/developers/docs/consensus-mechanisms/pow/) ### Proof-of-stake based {#proof-of-stake} -Ethereum now uses a **proof-of-stake (PoS)** consensus protocol. +Ethereum now uses a **proof-of-stake (PoS)** based consensus protocol. #### Block creation {#pos-block-creation} @@ -55,7 +55,7 @@ Proof-of-stake is done by validators who have staked ETH to participate in the s #### Security {#pos-security} -A proof-of-stake system is kept secure crypto-economically because a huge amount of ether must be destroyed by an attacker attempting to take control of the chain. A system of rewards an penalties incentivize individual miners to behave honestly. +A proof-of-stake system is kept secure crypto-economically because a huge amount of ether must be destroyed by an attacker attempting to take control of the chain. A system of rewards incentivizes individual stakers to behave honestly, and penalties disincentivize stakers from acting maliciously. More on [proof-of-stake](/developers/docs/consensus-mechanisms/pos/) @@ -67,13 +67,13 @@ Watch more on the different types of consensus mechanisms used on Ethereum: ### Sybil resistance & chain selection {#sybil-chain} -As mentioned earlier, proof-of-work and proof-of-stake are not consensus protocols by themselves, but they are often referred to as such for simplicity. They are actually Sybil resistance mechanisms and block author selectors; they are a way to decide who is the author of the latest block. Another important component is the chain selection (a.k.a fork choice) algorithm that enables nodes to pick one single correct block at the head of the chain in scenarios where multiple blocks exist in the same position. +As mentioned earlier, proof-of-work and proof-of-stake are not consensus protocols by themselves, but they are often referred to as such for simplicity. They are actually Sybil resistance mechanisms and block author selectors; they are a way to decide who is the author of the latest block. Another important component is the chain selection (aka fork choice) algorithm that enables nodes to pick one single correct block at the head of the chain in scenarios where multiple blocks exist in the same position. **Sybil resistance** measures how a protocol fares against a [Sybil attack](https://wikipedia.org/wiki/Sybil_attack). Sybil attacks are when one user or group pretends to be many users. Resistance to this type of attack is essential for a decentralized blockchain and enables miners and validators to be rewarded equally based on resources put in. Proof-of-work and proof-of-stake protect against this by making users expend a lot of energy or put up a lot of collateral. These protections are an economic deterrent to Sybil attacks. A **chain selection rule** is used to decide which chain is the "correct" chain. Bitcoin uses the "longest chain" rule, which means that whichever blockchain is the longest will be the one the rest of the nodes accept as valid and work with. For proof-of-work chains, the longest chain is determined by the chain's total cumulative proof-of-work difficulty. Ethereum used to use the longest chain rule too; however, now that Etheruem runs on proof-of-stake it adopted an updated fork-choice algorithm that measures the 'weight' of the chain. The weight is the accumulated sum of validator votes, weighted by validator staked-ether balances. -Ethereum uses a consensus mechanism that combines [Casper FFG](https://arxiv.org/abs/1710.09437) proof-of-stake with the [GHOST](https://arxiv.org/abs/2003.03052) fork-choice rule. +Ethereum uses a consensus mechanism known as [Gasper](/developers/docs/consensus-mechanisms/pos/gasper/) that combines [Casper FFG](https://arxiv.org/abs/1710.09437) proof-of-stake with the [GHOST](https://arxiv.org/abs/2003.03052) fork-choice rule. ## Further reading {#further-reading} From 1d94e044fc6b07b7deb4ddff0a3f5bcda16b2ae7 Mon Sep 17 00:00:00 2001 From: Joseph Cook <33655003+jmcook1186@users.noreply.github.com> Date: Tue, 26 Jul 2022 10:03:12 +0100 Subject: [PATCH 043/286] Apply suggestions from code review Co-authored-by: Paul Wackerow <54227730+wackerow@users.noreply.github.com> --- src/content/upgrades/merge/index.md | 34 ++++++++++++++--------------- 1 file changed, 17 insertions(+), 17 deletions(-) diff --git a/src/content/upgrades/merge/index.md b/src/content/upgrades/merge/index.md index 7baca5f4dfe..430731cc2d2 100644 --- a/src/content/upgrades/merge/index.md +++ b/src/content/upgrades/merge/index.md @@ -7,27 +7,27 @@ sidebar: true image: ../../../assets/upgrades/merge.png summaryPoint1: Ethereum Mainnet uses proof-of-stake, but this wasn't always the case. summaryPoint2: The transition from the original proof-of-work mechanism to proof-of-stake was called The Merge. -summaryPoint3: The Merge refers to the original Ethereum Mainnet becoming part of a separate proof-of0-stake blockchain called the Beacon Chain. +summaryPoint3: The Merge refers to the original Ethereum Mainnet becoming part of a separate proof-of-stake blockchain called the Beacon Chain, now existing as one chain. summaryPoint4: The Merge reduced Ethereum's energy consumption by ~99.95%. --- ## What was The Merge? {#what-is-the-merge} -The Merge was the joining of the original execution layer of Ethereum (the Mainnet we use today) with its new proof-of-stake consensus layer, the Beacon Chain. It eliminated the need for energy-intensive mining and instead enabled the the network to be secured using staked ETH. It was a truly exciting step in realizing the Ethereum vision – more scalability, security, and sustainability. +The Merge was the joining of the original execution layer of Ethereum (the Mainnet that has existed since [genesis](/history/#frontier)) with its new proof-of-stake consensus layer, the Beacon Chain. It eliminated the need for energy-intensive mining and instead enabled the the network to be secured using staked ETH. It was a truly exciting step in realizing the Ethereum vision—more scalability, security, and sustainability. Initially, the [Beacon Chain](/upgrades/beacon-chain/) shipped separately from [Mainnet](/glossary/#mainnet). Ethereum Mainnet - with all it's accounts, balances, smart contracts, and blockchain state - continued to be secured by [proof-of-work](/developers/docs/consensus-mechanisms/pow/), even while the Beacon Chain ran in parallel using [proof-of-stake](/developers/docs/consensus-mechanisms/pos/). The Merge was when these two systems finally came together, and proof-of-work was permanently replaced by proof-of-stake. -Imagine Ethereum is a spaceship that wasn't quite ready for an interstellar voyage. With the Beacon Chain, the community built a new engine and a hardened hull. After significant testing, it became time to hot-swap the new engine for the old one mid-flight. This merged the new, more efficient engine into the existing ship enabling it to put in some serious lightyears and take on the universe. +Imagine Ethereum is a spaceship that launched before it was quite ready for an interstellar voyage. With the Beacon Chain, the community built a new engine and a hardened hull. After significant testing, it became time to hot-swap the new engine for the old one mid-flight. This merged the new, more efficient engine into the existing ship enabling it to put in some serious lightyears and take on the universe. ## Merging with Mainnet {#merging-with-mainnet} -Proof-of-work secured Ethereum Mainnet from genesis until The Merge. This allowed the Ethereum blockchain we're all used to to come into existence in July 2015 with all its familiar features - transactions, smart contracts, accounts, etc. +Proof-of-work secured Ethereum Mainnet from genesis until The Merge. This allowed the Ethereum blockchain we're all used to to come into existence in July 2015 with all its familiar features—transactions, smart contracts, accounts, etc. -Throughout Ethereum's history, developers have prepared for an eventual transition away from proof-of-work to proof-of-stake. On December 1, 2020, the Beacon Chain was created as a separate blockchain to Mainnet, running in parallel. +Throughout Ethereum's history, developers prepared for an eventual transition away from proof-of-work to proof-of-stake. On December 1, 2020, the Beacon Chain was created as a separate blockchain to Mainnet, running in parallel. -The Beacon Chain was not processing Mainnet transactions. Instead, it was reaching consensus on its own state by agreeing on active validators and their account balances. After extensive testing, it became time for the Beacon Chain to reach consensus on real world data. After The Merge, the Beacon Chain became the consensus engine for all network data, including execution layer transactions and account balances. +The Beacon Chain was not originally processing Mainnet transactions. Instead, it was reaching consensus on its own state by agreeing on active validators and their account balances. After extensive testing, it became time for the Beacon Chain to reach consensus on real world data. After The Merge, the Beacon Chain became the consensus engine for all network data, including execution layer transactions and account balances. The Merge represented the official switch to using the Beacon Chain as the engine of block production. Mining is no longer be the means of producing valid blocks. Instead, the proof-of-stake validators have adopted this role and are now responsible for processing the validity of all transactions and proposing blocks. @@ -41,7 +41,7 @@ This transition to proof-of-stake changed the way ether is issued. Learn more ab **The Merge did not change anything for holders/users.** -_This bears repeating_: As a user or holder of ETH or any other digital asset on Ethereum, as well as non-node-operating stakers, **you do not need to do anything with your funds or wallet to account for The Merge.** ETH is just ETH. There is no such thing as "old ETH"/"new ETH" or "ETH1"/"ETH2" and wallets work exactly the same after The Merge as they did before - people tellign you otherwise are likely scammers. +_This bears repeating_: As a user or holder of ETH or any other digital asset on Ethereum, as well as non-node-operating stakers, **you do not need to do anything with your funds or wallet to account for The Merge.** ETH is just ETH. There is no such thing as "old ETH"/"new ETH" or "ETH1"/"ETH2" and wallets work exactly the same after The Merge as they did before—people telling you otherwise are likely scammers. Despite swapping out proof-of-work, the entire history of Ethereum since genesis remained intact and unaltered by the transition to proof-of-stake. Any funds held in your wallet before The Merge will are still accessible after The Merge. **No action is required to upgrade on your part.** @@ -56,8 +56,8 @@ id="staking-node-operators"> Key action items include: -1. Run _both_ a consensus layer client and an execution layer client; third-party endpoints to obtain execution data no longer work since The Merge. -2. Authenticate both execution layer and consensus layer clients with a shared JWT secret so they can securely communicate. +1. Run _both_ a consensus client and an execution client; third-party endpoints to obtain execution data no longer work since The Merge. +2. Authenticate both execution and consensus clients with a shared JWT secret so they can securely communicate. 3. Set a `fee recipient` address to receive your earned transaction fee tips/MEV. Not completing the first two items above items will result in your node being seen as "offline" until both layers are synced and authenticated. @@ -69,13 +69,13 @@ title="Non-validating node operators and infrastructure providers" contentPreview="If you're operating a non-validating Ethereum node, the most significant change that came with The Merge was the requirement to run clients for BOTH the execution layer AND the consensus layer." id="node-operators"> -Up until The Merge, an execution layer client was enough to receive, properly validate, and propagate blocks being gossiped by the network. _After The Merge_, the validity of transactions contained within an execution payload now also also depends on the validity of the "consensus block" it is contained within. +Up until The Merge, an execution client (such as Geth, Erigon, Besu or Nethermind) was enough to receive, properly validate, and propagate blocks being gossiped by the network. _After The Merge_, the validity of transactions contained within an execution payload now also also depends on the validity of the "consensus block" it is contained within. -As a result, a full Ethereum node now requires both an execution layer client and a consensus layer client. These two clients work together using a new Engine API. The Engine API requires authentication using a JWT secret, which is provided to both clients allowing secure communication. +As a result, a full Ethereum node now requires both an execution client and a consensus client. These two clients work together using a new Engine API. The Engine API requires authentication using a JWT secret, which is provided to both clients allowing secure communication. Key action items include: -- Install a consensus layer client in addition to an execution layer client +- Install a consensus client in addition to an execution client - Authenticate execution and consensus clients with a shared JWT secret so they can securely communicate with one another. Not completing the above items will result in your node appearing to be "offline" until both layers are synced and authenticated. @@ -110,7 +110,7 @@ The Merge also set the stage for further scalability upgrades not possible under +contentPreview="False. Anyone is free to sync their own self-verified copy of Ethereum (i.e. run a node). No ETH is required—not before The Merge, not after The Merge, not ever."> There are two types of Ethereum nodes: nodes that can propose blocks and nodes that don't. Nodes that propose blocks are only a small number of the total nodes on Ethereum. This category includes mining nodes under proof-of-work (PoW) and validator nodes under proof-of-stake (PoS). This category requires committing economic resources (such as GPU hash power in proof-of-work or staked ETH in proof-of-stake) in exchange for the ability to occasionally propose the next block and earn protocol rewards. @@ -138,7 +138,7 @@ title="Misconception: "Transactions are noticeably faster after The Merge.& contentPreview="False. Though some slight changes exist, transaction speed is mostly remain the same on layer 1."> A transaction's "speed" can be measured in a few ways, including time to be included in a block and time to finalization. Both of these changes slightly, but not in a way that users will notice. -Historically, on proof-of-work, the target was to have a new block every ~13.3 seconds. Under proof-of-stake, slots occur precisely every 12 seconds, each of which is an opportunity for a validator to publish a block. Most slots have blocks, but not necessarily all (i.e. a validator is offline). In proof-of-stake blocks are be produced ~10% more frequently than on proof-of-work. This is a fairly insignificant change and is unlikely to be noticed by users. +Historically, on proof-of-work, the target was to have a new block every ~13.3 seconds. Under proof-of-stake, slots occur precisely every 12 seconds, each of which is an opportunity for a validator to publish a block. Most slots have blocks, but not necessarily all (i.e. a validator is offline). In proof-of-stake, blocks are produced ~10% more frequently than on proof-of-work. This was a fairly insignificant change and is unlikely to be noticed by users. Proof-of-stake introduced the transaction finality concept that did not previously exist. In proof-of-work, the ability to reverse a block gets exponentially more difficult with every passing block mined on top of a transaction, but it never quite reaches zero. Under proof-of-stake, blocks are bundled into epochs (6.4 minute spans of time containing 32 chances for blocks) which validators vote on. When an epoch ends, validators vote on whether to consider the epoch 'justified'. If validators agree to justify the epoch, it gets finalized in the next epoch. Undoing finalized transactions is economically unviable as it would require obtaining and burning over one-third of the total staked ETH. @@ -147,12 +147,12 @@ Proof-of-stake introduced the transaction finality concept that did not previous -Staked ETH and staking rewards continue to be locked without the ability to withdraw. Withdrawals are planned for the Shanghai upgrade. +Staked ETH and staking rewards continue to be locked without the ability to withdraw. Withdrawals are planned for the upcoming Shanghai upgrade. +contentPreview="False. Fee tips/MEV are credited to a non-staking account controlled by the validator, available immediately."> This may seem counterintuitive to the above note that withdrawals are not enabled til the Shanghai upgrade, but validators DO have immediate access to the fee rewards/MEV earned during block proposals. The protocol issues ETH as a reward to validators for contributing to consensus. The validator nominates an account to receive the newly issued ETH, where a validator has a unique address that holds its staked ETH and protocol rewards. This ETH is locked until Shanghai. @@ -190,7 +190,7 @@ The Ethereum upgrades are all somewhat interrelated. So let’s recap how The Me ### The Merge and the Beacon Chain {#merge-and-beacon-chain} -The Merge represents the formal adoption of the Beacon Chain as the new consensus layer to the original Mainnet execution layer. Since the Merge, validators are assigned to secure Ethereum Mainnet, and mining on [proof-of-work](/developers/docs/consensus-mechanisms/pow/) is no longer a valid means of block production. +The Merge represents the formal adoption of the Beacon Chain as the new consensus layer to the original Mainnet execution layer. Since The Merge, validators are assigned to secure Ethereum Mainnet, and mining on [proof-of-work](/developers/docs/consensus-mechanisms/pow/) is no longer a valid means of block production. Blocks are instead proposed by validating nodes that have staked ETH in return for the right to participate in consensus. These upgrades set the stage for future scalability upgrades, including sharding. From 1a433f8c51ca59c16d130cb197771683020087de Mon Sep 17 00:00:00 2001 From: Joseph Cook <33655003+jmcook1186@users.noreply.github.com> Date: Tue, 26 Jul 2022 10:13:57 +0100 Subject: [PATCH 044/286] Apply suggestions from code review Co-authored-by: Paul Wackerow <54227730+wackerow@users.noreply.github.com> --- src/content/upgrades/merge/index.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/content/upgrades/merge/index.md b/src/content/upgrades/merge/index.md index 430731cc2d2..68174231812 100644 --- a/src/content/upgrades/merge/index.md +++ b/src/content/upgrades/merge/index.md @@ -134,8 +134,8 @@ With a [rollup-centric roadmap](https://ethereum-magicians.org/t/a-rollup-centri +title="Misconception: "Transactions were accelerated substantially by The Merge."" +contentPreview="False. Though some slight changes exist, transaction speed is mostly the same on layer 1 now as it was before The Merge."> A transaction's "speed" can be measured in a few ways, including time to be included in a block and time to finalization. Both of these changes slightly, but not in a way that users will notice. Historically, on proof-of-work, the target was to have a new block every ~13.3 seconds. Under proof-of-stake, slots occur precisely every 12 seconds, each of which is an opportunity for a validator to publish a block. Most slots have blocks, but not necessarily all (i.e. a validator is offline). In proof-of-stake, blocks are produced ~10% more frequently than on proof-of-work. This was a fairly insignificant change and is unlikely to be noticed by users. @@ -155,7 +155,7 @@ title="Misconception: "Validators will not receive any liquid ETH rewards t contentPreview="False. Fee tips/MEV are credited to a non-staking account controlled by the validator, available immediately."> This may seem counterintuitive to the above note that withdrawals are not enabled til the Shanghai upgrade, but validators DO have immediate access to the fee rewards/MEV earned during block proposals. -The protocol issues ETH as a reward to validators for contributing to consensus. The validator nominates an account to receive the newly issued ETH, where a validator has a unique address that holds its staked ETH and protocol rewards. This ETH is locked until Shanghai. +The protocol issues ETH as a reward to validators for contributing to consensus. The consensus layer accounts for the newly issued ETH, where a validator has a unique address that holds its staked ETH and protocol rewards. This ETH is locked until Shanghai. ETH on the execution layer is accounted for separately from the consensus layer. When users execute transactions on Ethereum Mainnet, ETH must be paid to cover the gas, including a tip to the validator. This ETH is already on the execution layer, is NOT being newly issued by the protocol, and is available to the validator immediately (given a proper `fee recipient` address is provided to the client software). From 7bfc549038142a26ff17f991b58d99acf140d430 Mon Sep 17 00:00:00 2001 From: Joe Date: Tue, 26 Jul 2022 16:05:12 +0100 Subject: [PATCH 045/286] update networks page --- src/content/developers/docs/networks/index.md | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/src/content/developers/docs/networks/index.md b/src/content/developers/docs/networks/index.md index bbd409ec25e..f0fdd45de60 100644 --- a/src/content/developers/docs/networks/index.md +++ b/src/content/developers/docs/networks/index.md @@ -30,15 +30,13 @@ In addition to Mainnet, there are public testnets. These are networks used by pr You should test any contract code you write on a testnet before deploying to Mainnet. Among dapps that integrate with existing smart contracts, most projects have copies deployed to testnets. -Most testnets use a proof-of-authority consensus mechanism. This means a small number of nodes are chosen to validate transactions and create new blocks – staking their identity in the process. Testnets do not incentivize proof-of-work mining, which can leave them vulnerable. - -As [The Merge](/upgrades/merge) get closer more of the public proof-of-work and proof-of-authority testnets are becoming proof-of-stake. Swapping their consensus mechanisms acts as rehearsals for the Ethereum Mainnet merge. Ropsten, Sepolia and Goerli are all expected to be proof-of-stake networks by the end of summer 2022, with Goerli being maintained long term. +Most testnets started by using a proof-of-authority consensus mechanism. This means a small number of nodes are chosen to validate transactions and create new blocks – staking their identity in the process. Alternatively, some testnets started off using a proof-of-work consensus mechanism with just a few permissioned miners. However, in preparation for [The Merge](/upgrades/merge), these testnets underwent their own transitions to proof-of-stake, offering the opportunity for multiple 'dress-rehearsals' before developers merged Ethereum Mainnet. The Ethereum testnets are now proof-of-stake, just like Ethereum Mainnet. ETH on testnets has no real value; therefore, there are no markets for testnet ETH. Since you need ETH to actually interact with Ethereum, most people get testnet ETH from faucets. Most faucets are webapps where you can input an address which you request ETH to be sent to. #### Sepolia {#sepolia} -A proof-of-work testnet; this means it's the best like-for-like representation of Ethereum. Sepolia is expected to undergo The Merge to proof-of-stake in summer 2022. It is not yet certain whether it will then be maintained long term. +Originally a proof-of-work testnet, now proof-of-stake. Sepolia is still running but it might not be maintained long term. - [Website](https://sepolia.dev/) - [GitHub](https://github.com/goerli/sepolia) @@ -52,7 +50,7 @@ A proof-of-work testnet; this means it's the best like-for-like representation o #### Goerli {#goerli} -A proof-of-authority testnet that works across clients; an ideal testnet for application developers. Goerli will be the final testnet merged to proof-of-stake before Ethereum Mainnet is merged. This is expected to happen in summer 2022. Goerli is expected to be maintained long term as a proof-of-stake testnet. +Originally a proof-of-authority testnet, now proof-of-stake. Goerli is expected to be maintained long term as a stable testnet for application developers. - [Website](https://goerli.net/) - [GitHub](https://github.com/goerli/testnet) @@ -68,7 +66,7 @@ A proof-of-authority testnet that works across clients; an ideal testnet for app _Note, [the Ropsten testnet is deprecated](https://github.com/ethereum/pm/issues/460) and will no longer receive protocol upgrades. Please consider migrating your applications to Sepolia or Goerli._ -Ropsten was a proof-of-work testnet that went through The Merge to proof-of-stake in May 2022. It can be used to test applications on a merged network, but it is not expected to be maintained long term and is likely to deprecated before summer 2023. +Ropsten was a proof-of-work testnet that went through The Merge to proof-of-stake in May 2022. It is likely to deprecated soon. ##### Ropsten faucets From d81603002d3a28be5596ea6bc397d8a983025dd5 Mon Sep 17 00:00:00 2001 From: Joe Date: Tue, 26 Jul 2022 16:16:51 +0100 Subject: [PATCH 046/286] update client diversity page --- .../docs/nodes-and-clients/client-diversity/index.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/content/developers/docs/nodes-and-clients/client-diversity/index.md b/src/content/developers/docs/nodes-and-clients/client-diversity/index.md index 80e3a73e919..43528c23a07 100644 --- a/src/content/developers/docs/nodes-and-clients/client-diversity/index.md +++ b/src/content/developers/docs/nodes-and-clients/client-diversity/index.md @@ -11,7 +11,7 @@ The behavior of an Ethereum node is controlled by the client software it runs. T ## Prerequisites {#prerequisites} -If you don't already have an understanding of what nodes and clients are, check out [nodes and clients](/developers/docs/nodes-and-clients/). The Beacon Chain is explained [here](/upgrades/beacon-chain/). [Execution](/glossary/#execution-layer) and [consensus](/glossary/#consensus-layer) layers are defined in the glossary. +If you don't already have an understanding of what nodes and clients are, check out [nodes and clients](/developers/docs/nodes-and-clients/). [Execution](/glossary/#execution-layer) and [consensus](/glossary/#consensus-layer) layers are defined in the glossary. ## Why are there multiple clients? {#why-multiple-clients} @@ -31,11 +31,11 @@ Client diversity also offers resilience to attacks. For example, an attack that ### Proof-of-stake finality {#finality} -Ethereum has had 100% uptime since the network began. After The Merge, the risks caused by poor client diversity become more alarming. A critical bug in a consensus client with over 33% of the Ethereum nodes could prevent the Beacon Chain from finalizing, causing Ethereum to go offline. +A bug in a consensus client with over 33% of the Ethereum nodes could prevent the Beacon Chain from finalizing, meaning users could not trust that transactions would not be reverted or changed at some point. This would be very problematic for many of the apps built on top of Ethereum, particularly DeFi. Worse still, a critical bug in a client with a two-thirds majority could cause the chain to incorrectly split and finalize, leading to a large set of validators getting stuck on an invalid chain. If they want to rejoin the correct chain, these validators face slashing or a slow and expensive voluntary withdrawal and reactivation. The magnitude of a slashing scales with the number of culpable nodes with a two-thirds majority slashed maximally (32 ETH). -Although these are unlikely scenarios, the Ethereum eco-system can mitigate their risk by evening out the distribution of clients across the active nodes. Ideally, no consensus client would ever have more than a 33% share of the total nodes. +Although these are unlikely scenarios, the Ethereum eco-system can mitigate their risk by evening out the distribution of clients across the active nodes. Ideally, no consensus client would ever reach a 33% share of the total nodes. ### Shared responsibility {#responsibility} From 3db743031bb3441b849075fa4872cf4dcc74d1c1 Mon Sep 17 00:00:00 2001 From: Joe Date: Tue, 26 Jul 2022 16:42:15 +0100 Subject: [PATCH 047/286] update mev page --- src/content/developers/docs/mev/index.md | 22 ++++++++++------------ 1 file changed, 10 insertions(+), 12 deletions(-) diff --git a/src/content/developers/docs/mev/index.md b/src/content/developers/docs/mev/index.md index 65ea0f9f728..79d6526c17f 100644 --- a/src/content/developers/docs/mev/index.md +++ b/src/content/developers/docs/mev/index.md @@ -10,19 +10,19 @@ Maximal extractable value (MEV) refers to the maximum value that can be extracte ### Miner extractable value -This concept was first applied in the context of [proof-of-work](/developers/docs/consensus-mechanisms/pow/), and was initially referred to as "miner extractable value". This is because in proof-of-work, miners control transaction inclusion, exclusion, and ordering. However, after the transition to proof-of-stake via [The Merge](/upgrades/merge) validators will be responsible for these roles, and mining will no longer be applicable. The value extraction methods here will still persist after this transition, and thus the term "miner extractable value" is no longer valid. "Maximal extractable value" is now used as a more inclusive replacement. +This concept was first applied in the context of [proof-of-work](/developers/docs/consensus-mechanisms/pow/), and was initially referred to as "miner extractable value". This is because in proof-of-work, miners control transaction inclusion, exclusion, and ordering. However, since the transition to proof-of-stake via [The Merge](/upgrades/merge) validators have been responsible for these roles, and mining is no longer part of the Ethereum protocol. The value extraction methods still exist, though, so the term "Maximal extractable value" is now used instead. ## Prerequisites {#prerequisites} -Make sure you're familiar with [transactions](/developers/docs/transactions/), [blocks](/developers/docs/blocks/), [gas](/developers/docs/gas/), and [mining](/developers/docs/consensus-mechanisms/pow/mining/). Familiarity with [dapps](/dapps/) and [DeFi](/defi/) is helpful as well. +Make sure you're familiar with [transactions](/developers/docs/transactions/), [blocks](/developers/docs/blocks/) and [gas](/developers/docs/gas/). Familiarity with [dapps](/dapps/) and [DeFi](/defi/) is helpful as well. ## MEV extraction {#mev-extraction} -In theory MEV accrues entirely to miners/validators because they are the only party that can guarantee the execution of a profitable MEV opportunity. In practice, however, a large portion of MEV is extracted by independent network participants referred to as "searchers." Searchers run complex algorithms on blockchain data to detect profitable MEV opportunities and have bots to automatically submit those profitable transactions to the network. +In theory MEV accrues entirely to validators because they are the only party that can guarantee the execution of a profitable MEV opportunity. In practice, however, a large portion of MEV is extracted by independent network participants referred to as "searchers." Searchers run complex algorithms on blockchain data to detect profitable MEV opportunities and have bots to automatically submit those profitable transactions to the network. -Miners/validators do get a portion of the full MEV amount anyway because searchers are willing to pay high gas fees (which go to the miner/validator) in exchange for higher likelihood of inclusion of their profitable transactions in a block. Assuming searchers are economically rational, the gas fee that a searcher is willing to pay will be an amount up to 100% of the searcher's MEV (because if the gas fee was higher, the searcher would lose money). +Validators do get a portion of the full MEV amount anyway because searchers are willing to pay high gas fees (which go to the validator) in exchange for higher likelihood of inclusion of their profitable transactions in a block. Assuming searchers are economically rational, the gas fee that a searcher is willing to pay will be an amount up to 100% of the searcher's MEV (because if the gas fee was higher, the searcher would lose money). -With that, for some highly competitive MEV opportunities, such as [DEX arbitrage](#mev-examples-dex-arbitrage), searchers may have to pay 90% or even more of their total MEV revenue in gas fees to the miner/validator because so many people want to run the same profitable arbitrage trade. This is because the only way to guarantee that their arbitrage transaction runs is if they submit the transaction with the highest gas price. +With that, for some highly competitive MEV opportunities, such as [DEX arbitrage](#mev-examples-dex-arbitrage), searchers may have to pay 90% or even more of their total MEV revenue in gas fees to the validator because so many people want to run the same profitable arbitrage trade. This is because the only way to guarantee that their arbitrage transaction runs is if they submit the transaction with the highest gas price. ### Gas golfing {#mev-extraction-gas-golfing} @@ -36,9 +36,7 @@ Rather than programming complex algorithms to detect profitable MEV opportunitie ### Flashbots {#mev-extraction-flashbots} -Flashbots is an independent project which extends the go-ethereum client with a service that allows searchers to submit MEV transactions to miners without revealing them to the public mempool. This prevents transactions from being frontrun by generalized frontrunners. - -As of this writing, a significant portion of MEV transactions is routed through Flashbots, meaning generalized frontrunners aren't as effective as they used to be. +Flashbots is an independent project which extends the go-ethereum client with a service that allows searchers to submit MEV transactions to validators without revealing them to the public mempool. This prevents transactions from being frontrun by generalized frontrunners. ## MEV examples {#mev-examples} @@ -104,17 +102,17 @@ At the application layer, some forms of MEV, like sandwich trading, result in an At the network layer, generalized frontrunners and the gas-price auctions they often engage in (when two or more frontrunners compete for their transaction to be included in the next block by progressively raising their own transactions' gas price) result in network congestion and high gas prices for everyone else trying to run regular transactions. -Beyond what's happening _within_ blocks, MEV can have deleterious effects _between_ blocks. If the MEV available in a block significantly exceeds the standard block reward, miners may be incentivized to remine blocks and capture the MEV for themselves, causing blockchain re-organization and consensus instability. +Beyond what's happening _within_ blocks, MEV can have deleterious effects _between_ blocks. If the MEV available in a block significantly exceeds the standard block reward, validators may be incentivized to remine blocks and capture the MEV for themselves, causing blockchain re-organization and consensus instability. -This possibility of blockchain re-organization has been [previously explored on the Bitcoin blockchain](https://dl.acm.org/doi/10.1145/2976749.2978408). As Bitcoin's block reward halves and transaction fees make up a greater and greater portion of the block reward, situations arise where it becomes economically rational for miners to give up the next block's reward and instead remine past blocks with higher fees. With the growth of MEV, the same sort of situation could occur in Ethereum, threatening the integrity of the blockchain. +This possibility of blockchain re-organization has been [previously explored on the Bitcoin blockchain](https://dl.acm.org/doi/10.1145/2976749.2978408). As Bitcoin's block reward halves and transaction fees make up a greater and greater portion of the block reward, situations arise where it becomes economically rational for validators to give up the next block's reward and instead remine past blocks with higher fees. With the growth of MEV, the same sort of situation could occur in Ethereum, threatening the integrity of the blockchain. ## State of MEV {#state-of-mev} MEV extraction ballooned in early 2021, resulting in extremely high gas prices in the first few months of the year. The emergence of Flashbots's MEV relay has reduced the effectiveness of generalized frontrunners and has taken gas price auctions off-chain, lowering gas prices for ordinary users. -While many searchers are still making good money from MEV, as opportunities become more well-known and more and more searchers compete for the same opportunity, miners/validators will capture more and more total MEV revenue (because the same sort of gas auctions as originally described above also occur in Flashbots, albeit privately, and miners will capture the resulting gas revenue). MEV is also not unique to Ethereum, and as opportunities become more competitive on Ethereum, searchers are moving to alternate blockchains like Binance Smart Chain, where similar MEV opportunities as those on Ethereum exist with less competition. +While many searchers are still making good money from MEV, as opportunities become more well-known and more and more searchers compete for the same opportunity, validators will capture more and more total MEV revenue (because the same sort of gas auctions as originally described above also occur in Flashbots, albeit privately, and validators will capture the resulting gas revenue). MEV is also not unique to Ethereum, and as opportunities become more competitive on Ethereum, searchers are moving to alternate blockchains like Binance Smart Chain, where similar MEV opportunities as those on Ethereum exist with less competition. -As DeFi grows and increases in popularity, MEV may soon significantly outweigh the base Ethereum block reward. With that comes a growing possibility of selfish block remining and consensus instability. Some consider this to be an existential threat to Ethereum, and disincentivizing selfish mining is an active area of research in Ethereum protocol theory. One solution currently being explored is [MEV reward smoothing](https://ethresear.ch/t/committee-driven-mev-smoothing/10408). +On the other hand, the transition from proof-of-work to proof-of-stake and the ongoing efforst to scale Ethereum using rollups and sharding all change the MEV landscape in ways that are still somewhat unclear. It is not yet well known how having guarantees block-proposers known slightly in advance changes the dynamics of MEV extraction compared to the probabilistic model in proof-of-work, or how this will be disrupted when [single secret leader election](https://ethresear.ch/t/secret-non-single-leader-election/11789) and [distributed validator technology](https://github.com/ethereum/distributed-validator-specs) get implemented. Similarly, it remains to be seen what MEV opportunities exist when most user-activity is ported away from Ethereum and onto its Layer-2 rollups and shards. ## Related resources {#related-resources} From a3c105a806323becf4ac046a925e4a250f69263e Mon Sep 17 00:00:00 2001 From: Ori Pomerantz Date: Tue, 26 Jul 2022 15:01:59 -0500 Subject: [PATCH 048/286] Create index.md --- .../erc20-with-safety-rails/index.md | 23 +++++++++++++++++++ 1 file changed, 23 insertions(+) create mode 100644 src/content/developers/tutorials/erc20-with-safety-rails/index.md diff --git a/src/content/developers/tutorials/erc20-with-safety-rails/index.md b/src/content/developers/tutorials/erc20-with-safety-rails/index.md new file mode 100644 index 00000000000..2a83cb1c230 --- /dev/null +++ b/src/content/developers/tutorials/erc20-with-safety-rails/index.md @@ -0,0 +1,23 @@ +--- +title: ERC-20 with Safety Rails +description: How to help people avoid silly mistakes +author: Ori Pomerantz +lang: en +sidebar: true +tags: ["erc-20"] +skill: beginner +published: 2022-09-01 +--- + +## Introduction {#introduction} + +One of the great things about Ethereum is that there is no central authority that can modify or undo your transactions. One of the great problems with Ethereum is that ther is no central authority with the power to undo user mistakes or illicit transactions. In this article you learn about some of the common mistakes that users commit with [ERC-20](/developers/docs/standards/tokens/erc-20/) tokens, as well as how to create ERC-20 contracts that help users to avoid those mistakes, or that give a central authority some limited power to undo them. + +Note that while we will use the [OpenZeppelin ERC-20 token contract](https://github.com/OpenZeppelin/openzeppelin-contracts/tree/master/contracts/token/ERC20), this article does not explain it in great details. You can find this information [here](/developers/tutorials/erc20-annotated-code). + +### Common mistakes {#commom-mistakes} + +Users sometimes send tokens to the wrong address. While we cannot read their minds to know what they meant to do, there are two error types that happen a lot and are easy to detect: + +1. Sending the tokens to the contract's own address. For example, [Optimism's OP token](https://optimism.mirror.xyz/qvd0WfuLKnePm1Gxb9dpGchPf5uDz5NSMEFdgirDS4c) managed to accumulate [over 120,000](https://optimistic.etherscan.io/address/0x4200000000000000000000000000000000000042#tokentxns) OP tokens in less than two months. This represents a significant amount of wealth that presumably people just lost. +2. Sending the tokens to an empty address, one that doesn't correspond to an [externally owned account](/developers/docs/accounts/#externally-owned-accounts-and-key-pairs) or a [smart contract](/developers/docs/smart-contracts). While I don't have statistics on how often this happens, [one incident could have cost 20,000,000 tokens](https://gov.optimism.io/t/message-to-optimism-community-from-wintermute/2595). From 5a1543f130ece3063274fd2c6be1ed06405e4736 Mon Sep 17 00:00:00 2001 From: Ori Pomerantz Date: Tue, 26 Jul 2022 19:29:29 -0500 Subject: [PATCH 049/286] Update index.md --- .../erc20-with-safety-rails/index.md | 59 ++++++++++++++++++- 1 file changed, 58 insertions(+), 1 deletion(-) diff --git a/src/content/developers/tutorials/erc20-with-safety-rails/index.md b/src/content/developers/tutorials/erc20-with-safety-rails/index.md index 2a83cb1c230..38e02b36800 100644 --- a/src/content/developers/tutorials/erc20-with-safety-rails/index.md +++ b/src/content/developers/tutorials/erc20-with-safety-rails/index.md @@ -15,9 +15,66 @@ One of the great things about Ethereum is that there is no central authority tha Note that while we will use the [OpenZeppelin ERC-20 token contract](https://github.com/OpenZeppelin/openzeppelin-contracts/tree/master/contracts/token/ERC20), this article does not explain it in great details. You can find this information [here](/developers/tutorials/erc20-annotated-code). -### Common mistakes {#commom-mistakes} +## Creating an ERC-20 contract {#creating-an-erc-20-contract} + +Before we can add the safety rail functionality we need an ERC-20 contract. In this article we'll use [the OpenZeppelin Contracts Wizard](https://docs.openzeppelin.com/contracts/4.x/wizard). Open it in another browser and follow these instructions: + +1. Select **ERC20**. +2. Enter these settings: + + | Parameter | Value | + | - | - | + | Name | SafetyRailsToken + | Symbol | SAFE + | Premint | 1000 + | Features | None + | Access Control | Ownable + | Upgradability | None + +3. Scroll up and click **Open in Remix** (for Remix) or **Download** to use a different environment. I'm going to assume you're using Remix, if you use something else just make the appropriate changes. +4. We now have a fully functional ERC-20 contract. You can expand `.deps` > `npm` to see the imported code. +5. Compile, deploy, and play with the contract to see that it functions as an ERC-20 contract. If you need to learn how to use Remix, [use this tutorial](https://remix.ethereum.org/?#activate=udapp,solidity,LearnEth). + + +## Common mistakes {#commom-mistakes} + +### What are they? {#what-are-they} Users sometimes send tokens to the wrong address. While we cannot read their minds to know what they meant to do, there are two error types that happen a lot and are easy to detect: 1. Sending the tokens to the contract's own address. For example, [Optimism's OP token](https://optimism.mirror.xyz/qvd0WfuLKnePm1Gxb9dpGchPf5uDz5NSMEFdgirDS4c) managed to accumulate [over 120,000](https://optimistic.etherscan.io/address/0x4200000000000000000000000000000000000042#tokentxns) OP tokens in less than two months. This represents a significant amount of wealth that presumably people just lost. + 2. Sending the tokens to an empty address, one that doesn't correspond to an [externally owned account](/developers/docs/accounts/#externally-owned-accounts-and-key-pairs) or a [smart contract](/developers/docs/smart-contracts). While I don't have statistics on how often this happens, [one incident could have cost 20,000,000 tokens](https://gov.optimism.io/t/message-to-optimism-community-from-wintermute/2595). + + +### How do we prevent them? {#how-do-we-prevent-them} + +The OpenZeppelin ERC-20 contract includes [a hook, `_beforeTokenTransfer`](https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC20/ERC20.sol#L364-L368), that is called before a token is transferred. By default this hook does not do anything, but we can hang our own functionality on it. So we can add this function after the constructor: + +```solidity + function _beforeTokenTransfer(address from, address to, uint256 amount) + internal + override(ERC20) + { + super._beforeTokenTransfer(from, to, amount); + } +``` + +Some parts of this function may be new if you aren't very familiar with Solidity: + +```solidity + override(ERC20) +``` + +We have to specify explicitly that we're [overriding](https://docs.soliditylang.org/en/v0.8.15/contracts.html#function-overriding) the ERC20 token definition of `_beforeTokenTransfer`. In general, explicit definitions are a lot better, from the security standpoint, than implicit ones - you cannot forget that you've done something if it's right in front of you. That is also the reason we need to specify which superclass's `_beforeTokenTransfer` we are overriding. + +```solidity + super._beforeTokenTransfer(from, to, amount); +``` + +This line calls the `_beforeTokenTransfer` function of the contract or contracts from which we inherited which have it. In this case, that is only `ERC20`, `Ownable` does not have this hook. + + +## Conclusion + +Add extendability. From 0dc63f25273abe6465e20fef02c40b1a1c70cb0b Mon Sep 17 00:00:00 2001 From: Ori Pomerantz Date: Tue, 26 Jul 2022 20:24:39 -0500 Subject: [PATCH 050/286] Update index.md --- .../erc20-with-safety-rails/index.md | 34 +++++++++++++++++-- 1 file changed, 32 insertions(+), 2 deletions(-) diff --git a/src/content/developers/tutorials/erc20-with-safety-rails/index.md b/src/content/developers/tutorials/erc20-with-safety-rails/index.md index 38e02b36800..954d8f8487b 100644 --- a/src/content/developers/tutorials/erc20-with-safety-rails/index.md +++ b/src/content/developers/tutorials/erc20-with-safety-rails/index.md @@ -72,9 +72,39 @@ We have to specify explicitly that we're [overriding](https://docs.soliditylang. super._beforeTokenTransfer(from, to, amount); ``` -This line calls the `_beforeTokenTransfer` function of the contract or contracts from which we inherited which have it. In this case, that is only `ERC20`, `Ownable` does not have this hook. +This line calls the `_beforeTokenTransfer` function of the contract or contracts from which we inherited which have it. In this case, that is only `ERC20`, `Ownable` does not have this hook. Even though currently `ERC20._beforeTokenTransfer` doesn't do anything, we call it in case functionality is added in the future (and we then decide to redeploy the contract, because contracts don't change after deployment). + +We want to add these requirements to the function: + +- The `to` address cannot equal `address(this)`, the address of the ERC-20 contract itself. +- The `to` address cannot be empty, it has to be either: + - An externally owned accounts (EOA). We can't check if an address is an EOA directly, but we can check an address's ETH balance. EOAs almost always have a balance, even if they are no longer used - it's difficult to clear them to the last wei. + - A smart contract. Testing if an address is a smart contract is a bit harder. There is an opcode that checks the external code length, called [`EXTCODESIZE`](https://www.evm.codes/#3b), but it is not available directly in Solidity. We have to use [Yul](https://docs.soliditylang.org/en/v0.8.15/yul.html), which is EVM assembly, for it. There are other values we could use from Solidity ([`
.code` and `
.codehash`](https://docs.soliditylang.org/en/v0.8.15/units-and-global-variables.html#members-of-address-types)), but they cost more. + +Lets go over the new code line by line: + +```solidity +require(to != address(this), "Can't send tokens to the contract address"); +``` + +This is the first requirement, check that `to` and `this(address)` are not the same thing. + +```solidity +bool isToContract; +assembly { + isToContract := gt(extcodesize(to), 0) +} +``` + +This is how we check if an address is a contract. We cannot receive output directly from Yul, so instead we define a variable to hold the result (`isToContract` in this case). The way Yul works every opcode is considered a function. So first we call [`EXTCODESIZE`](https://www.evm.codes/#3b) to get the contract size, and then use [`GT`](https://www.evm.codes/#11) to check it is not zero (we are dealing with unsigned integers, so of course it can't be negative). We then write the result to `isToContract`. + +```solidity +require(to.balance != 0 || isToContract, "Can't send tokens to an empty address"); +```solidity + +And finally, we have the actual check. + - ## Conclusion Add extendability. From 37bd3685e69e71f35af4a5512b32e9ea10b4a29d Mon Sep 17 00:00:00 2001 From: Ori Pomerantz Date: Tue, 26 Jul 2022 20:26:12 -0500 Subject: [PATCH 051/286] Update index.md --- .../tutorials/erc20-with-safety-rails/index.md | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/src/content/developers/tutorials/erc20-with-safety-rails/index.md b/src/content/developers/tutorials/erc20-with-safety-rails/index.md index 954d8f8487b..2381d37b65c 100644 --- a/src/content/developers/tutorials/erc20-with-safety-rails/index.md +++ b/src/content/developers/tutorials/erc20-with-safety-rails/index.md @@ -84,23 +84,23 @@ We want to add these requirements to the function: Lets go over the new code line by line: ```solidity -require(to != address(this), "Can't send tokens to the contract address"); + require(to != address(this), "Can't send tokens to the contract address"); ``` This is the first requirement, check that `to` and `this(address)` are not the same thing. ```solidity -bool isToContract; -assembly { - isToContract := gt(extcodesize(to), 0) -} + bool isToContract; + assembly { + isToContract := gt(extcodesize(to), 0) + } ``` This is how we check if an address is a contract. We cannot receive output directly from Yul, so instead we define a variable to hold the result (`isToContract` in this case). The way Yul works every opcode is considered a function. So first we call [`EXTCODESIZE`](https://www.evm.codes/#3b) to get the contract size, and then use [`GT`](https://www.evm.codes/#11) to check it is not zero (we are dealing with unsigned integers, so of course it can't be negative). We then write the result to `isToContract`. ```solidity -require(to.balance != 0 || isToContract, "Can't send tokens to an empty address"); -```solidity + require(to.balance != 0 || isToContract, "Can't send tokens to an empty address"); +``` And finally, we have the actual check. From e795bcd4c2913e1537f0c5629eaf79b6853ae3f9 Mon Sep 17 00:00:00 2001 From: Ori Pomerantz Date: Tue, 26 Jul 2022 20:30:16 -0500 Subject: [PATCH 052/286] Update index.md --- .../developers/tutorials/erc20-with-safety-rails/index.md | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/content/developers/tutorials/erc20-with-safety-rails/index.md b/src/content/developers/tutorials/erc20-with-safety-rails/index.md index 2381d37b65c..59216ea8c37 100644 --- a/src/content/developers/tutorials/erc20-with-safety-rails/index.md +++ b/src/content/developers/tutorials/erc20-with-safety-rails/index.md @@ -102,7 +102,12 @@ This is how we check if an address is a contract. We cannot receive output direc require(to.balance != 0 || isToContract, "Can't send tokens to an empty address"); ``` -And finally, we have the actual check. +And finally, we have the actual check for empty addresses. + + +## Administrative access + +It is sometimes useful to have account administrators that can modify or undo certain actions. ## Conclusion From ee88b66b970bf6692bc5cd5fe25d7ded8ad86f4a Mon Sep 17 00:00:00 2001 From: Joe Date: Wed, 27 Jul 2022 10:41:54 +0100 Subject: [PATCH 053/286] update transactions page --- .../developers/docs/transactions/index.md | 20 +++++++++---------- 1 file changed, 9 insertions(+), 11 deletions(-) diff --git a/src/content/developers/docs/transactions/index.md b/src/content/developers/docs/transactions/index.md index 27c7d73cfff..99450221a1c 100644 --- a/src/content/developers/docs/transactions/index.md +++ b/src/content/developers/docs/transactions/index.md @@ -19,9 +19,9 @@ An Ethereum transaction refers to an action initiated by an externally-owned acc ![Diagram showing a transaction cause state change](./tx.png) _Diagram adapted from [Ethereum EVM illustrated](https://takenobu-hs.github.io/downloads/ethereum_evm_illustrated.pdf)_ -Transactions, which change the state of the EVM, need to be broadcast to the whole network. Any node can broadcast a request for a transaction to be executed on the EVM; after this happens, a miner will execute the transaction and propagate the resulting state change to the rest of the network. +Transactions, which change the state of the EVM, need to be broadcast to the whole network. Any node can broadcast a request for a transaction to be executed on the EVM; after this happens, a validator will execute the transaction and propagate the resulting state change to the rest of the network. -Transactions require a fee and must be mined to become valid. To make this overview simpler we'll cover gas fees and mining elsewhere. +Transactions require a fee and must be included in a validated block. To make this overview simpler we'll cover gas fees and validation elsewhere. A submitted transaction includes the following information: @@ -30,10 +30,10 @@ A submitted transaction includes the following information: - `value` – amount of ETH to transfer from sender to recipient (in WEI, a denomination of ETH) - `data` – optional field to include arbitrary data - `gasLimit` – the maximum amount of gas units that can be consumed by the transaction. Units of gas represent computational steps -- `maxPriorityFeePerGas` - the maximum amount of gas to be included as a tip to the miner +- `maxPriorityFeePerGas` - the maximum amount of gas to be included as a tip to the validator - `maxFeePerGas` - the maximum amount of gas willing to be paid for the transaction (inclusive of `baseFeePerGas` and `maxPriorityFeePerGas`) -Gas is a reference to the computation required to process the transaction by a miner. Users have to pay a fee for this computation. The `gasLimit`, and `maxPriorityFeePerGas` determine the maximum transaction fee paid to the miner. [More on Gas](/developers/docs/gas/). +Gas is a reference to the computation required to process the transaction by a validator. Users have to pay a fee for this computation. The `gasLimit`, and `maxPriorityFeePerGas` determine the maximum transaction fee paid to the validator. [More on Gas](/developers/docs/gas/). The transaction object will look a little like this: @@ -158,7 +158,7 @@ Alice's account will be credited **+1.0 ETH** The base fee will be burned **-0.00399 ETH** -Miner keeps the tip **+0.000210 ETH** +Validator keeps the tip **+0.000210 ETH** Gas is required for any smart contract interaction too. @@ -174,11 +174,10 @@ Once the transaction has been submitted the following happens: 1. Once you send a transaction, cryptography generates a transaction hash: `0x97d99bc7729211111a21b12c933c949d4f31684f1d6954ff477d0477538ff017` 2. The transaction is then broadcast to the network and included in a pool with lots of other transactions. -3. A miner must pick your transaction and include it in a block in order to verify the transaction and consider it "successful". - - You may end up waiting at this stage if the network is busy and miners aren't able to keep up. -4. Your transaction will receive "confirmations". The number of confirmations is the number of blocks created since the block that included your transaction. The higher the number, the greater the certainty that the network processed and recognized the transaction. - - Recent blocks may get re-organized, giving the impression the transaction was unsuccessful; however, the transaction may still be valid but included in a different block. - - The probability of a re-organization diminishes with every subsequent block mined, i.e. the greater the number of confirmations, the more immutable the transaction is. +3. A validator must pick your transaction and include it in a block in order to verify the transaction and consider it "successful". +4. As time passes the block containing your transaction will be upgraded to "justified" then "finalized". These upgrades make it much + more certain that your transaction was successful and will never be altered. Once a block is "finalized" it could only ever be changed + by an attack that would cost many billions of dollars. ## A visual demo {#a-visual-demo} @@ -216,4 +215,3 @@ _Know of a community resource that helped you? Edit this page and add it!_ - [Accounts](/developers/docs/accounts/) - [Ethereum virtual machine (EVM)](/developers/docs/evm/) - [Gas](/developers/docs/gas/) -- [Mining](/developers/docs/consensus-mechanisms/pow/mining/) From fc20f7435207e14e8567ed2e017bb1364f590a3b Mon Sep 17 00:00:00 2001 From: Joseph Cook <33655003+jmcook1186@users.noreply.github.com> Date: Wed, 27 Jul 2022 14:37:05 +0100 Subject: [PATCH 054/286] Apply suggestions from code review Co-authored-by: Joshua <62268199+minimalsm@users.noreply.github.com> --- src/content/developers/docs/mev/index.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/content/developers/docs/mev/index.md b/src/content/developers/docs/mev/index.md index 79d6526c17f..3ea3eb129a6 100644 --- a/src/content/developers/docs/mev/index.md +++ b/src/content/developers/docs/mev/index.md @@ -10,11 +10,11 @@ Maximal extractable value (MEV) refers to the maximum value that can be extracte ### Miner extractable value -This concept was first applied in the context of [proof-of-work](/developers/docs/consensus-mechanisms/pow/), and was initially referred to as "miner extractable value". This is because in proof-of-work, miners control transaction inclusion, exclusion, and ordering. However, since the transition to proof-of-stake via [The Merge](/upgrades/merge) validators have been responsible for these roles, and mining is no longer part of the Ethereum protocol. The value extraction methods still exist, though, so the term "Maximal extractable value" is now used instead. +Maximal extractable value was first applied in the context of [proof-of-work](/developers/docs/consensus-mechanisms/pow/), and initially referred to as "miner extractable value". This is because in proof-of-work, miners control transaction inclusion, exclusion, and ordering. However, since the transition to proof-of-stake via [The Merge](/upgrades/merge) validators have been responsible for these roles, and mining is no longer part of the Ethereum protocol. The value extraction methods still exist, though, so the term "Maximal extractable value" is now used instead. ## Prerequisites {#prerequisites} -Make sure you're familiar with [transactions](/developers/docs/transactions/), [blocks](/developers/docs/blocks/) and [gas](/developers/docs/gas/). Familiarity with [dapps](/dapps/) and [DeFi](/defi/) is helpful as well. +Make sure you're familiar with [transactions](/developers/docs/transactions/), [blocks](/developers/docs/blocks/), [proof-of-stake](/developers/docs/consensus-mechanisms/pos) and [gas](/developers/docs/gas/). Familiarity with [dapps](/dapps/) and [DeFi](/defi/) is helpful as well. ## MEV extraction {#mev-extraction} @@ -112,7 +112,7 @@ MEV extraction ballooned in early 2021, resulting in extremely high gas prices i While many searchers are still making good money from MEV, as opportunities become more well-known and more and more searchers compete for the same opportunity, validators will capture more and more total MEV revenue (because the same sort of gas auctions as originally described above also occur in Flashbots, albeit privately, and validators will capture the resulting gas revenue). MEV is also not unique to Ethereum, and as opportunities become more competitive on Ethereum, searchers are moving to alternate blockchains like Binance Smart Chain, where similar MEV opportunities as those on Ethereum exist with less competition. -On the other hand, the transition from proof-of-work to proof-of-stake and the ongoing efforst to scale Ethereum using rollups and sharding all change the MEV landscape in ways that are still somewhat unclear. It is not yet well known how having guarantees block-proposers known slightly in advance changes the dynamics of MEV extraction compared to the probabilistic model in proof-of-work, or how this will be disrupted when [single secret leader election](https://ethresear.ch/t/secret-non-single-leader-election/11789) and [distributed validator technology](https://github.com/ethereum/distributed-validator-specs) get implemented. Similarly, it remains to be seen what MEV opportunities exist when most user-activity is ported away from Ethereum and onto its Layer-2 rollups and shards. +On the other hand, the transition from proof-of-work to proof-of-stake and the ongoing effort to scale Ethereum using rollups and sharding all change the MEV landscape in ways that are still somewhat unclear. It is not yet well known how having guarantees block-proposers known slightly in advance changes the dynamics of MEV extraction compared to the probabilistic model in proof-of-work or how this will be disrupted when [single secret leader election](https://ethresear.ch/t/secret-non-single-leader-election/11789) and [distributed validator technology](https://github.com/ethereum/distributed-validator-specs) get implemented. Similarly, it remains to be seen what MEV opportunities exist when most user activity is ported away from Ethereum and onto its Layer-2 rollups and shards. ## Related resources {#related-resources} From cbc1c44e33d1adc55eebf3d88e4e34efce6e2670 Mon Sep 17 00:00:00 2001 From: Joshua <62268199+minimalsm@users.noreply.github.com> Date: Wed, 27 Jul 2022 14:38:47 +0100 Subject: [PATCH 055/286] Update src/content/developers/docs/nodes-and-clients/client-diversity/index.md --- .../developers/docs/nodes-and-clients/client-diversity/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/content/developers/docs/nodes-and-clients/client-diversity/index.md b/src/content/developers/docs/nodes-and-clients/client-diversity/index.md index 43528c23a07..f17e541d618 100644 --- a/src/content/developers/docs/nodes-and-clients/client-diversity/index.md +++ b/src/content/developers/docs/nodes-and-clients/client-diversity/index.md @@ -11,7 +11,7 @@ The behavior of an Ethereum node is controlled by the client software it runs. T ## Prerequisites {#prerequisites} -If you don't already have an understanding of what nodes and clients are, check out [nodes and clients](/developers/docs/nodes-and-clients/). [Execution](/glossary/#execution-layer) and [consensus](/glossary/#consensus-layer) layers are defined in the glossary. +If you don't already understand what nodes and clients are, check out [nodes and clients](/developers/docs/nodes-and-clients/). [Execution](/glossary/#execution-layer) and [consensus](/glossary/#consensus-layer) layers are defined in the glossary. ## Why are there multiple clients? {#why-multiple-clients} From 0d4512b65775361f0d695b129060308963ab818b Mon Sep 17 00:00:00 2001 From: Joshua <62268199+minimalsm@users.noreply.github.com> Date: Wed, 27 Jul 2022 15:30:20 +0100 Subject: [PATCH 056/286] Apply suggestions from code review --- src/content/developers/docs/intro-to-ethereum/index.md | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/src/content/developers/docs/intro-to-ethereum/index.md b/src/content/developers/docs/intro-to-ethereum/index.md index e09b9b89a94..83b88c3c758 100644 --- a/src/content/developers/docs/intro-to-ethereum/index.md +++ b/src/content/developers/docs/intro-to-ethereum/index.md @@ -16,9 +16,8 @@ A blockchain is a public database that is updated and shared across many compute Every computer in the network must agree upon each new block and the chain as a whole. These computers are known as "nodes". Nodes ensure everyone interacting with the blockchain has the same data. To accomplish this distributed agreement, blockchains need a consensus mechanism. -Ethereum uses a proof-of-stake based consensus mechanism. This means that anyone who wants to add new blocks to the chain must stake at least 32 ETH into the deposit contract and run validator software. They then have a chance of being randomly selected to propose blocks that other validators check and add to the blockchain. In this model there is usually only one chain, but network latency and dishonest behavior can cause multiple blocks to exist at the same position near the head of the chain. To resolve this, a fork-choice algorithm selects one canonical set of blocks. The blocks selected are the ones that form the heaviest possible chain, where 'heavy' refers to the number of validators that have endorsed the blocks (weighted by the ETH they have staked). There is a system of rewards and penalties that strongly incentivize participants to be honest and online as much as possible. +Ethereum uses a [proof-of-stake-based consensus mechanism](/developers/docs/consensus-mechanisms/pos). Anyone who wants to add new blocks to the chain must stake at least 32 ETH into the deposit contract and run validator software. They then can be randomly selected to propose blocks that other validators check and add to the blockchain. In this model, there is usually only one chain, but network latency and dishonest behavior can cause multiple blocks to exist at the same position near the head of the chain. To resolve this, a fork-choice algorithm selects one canonical set of blocks. The blocks selected are the ones that form the heaviest possible chain, where 'heavy' refers to the number of validators that have endorsed the blocks (weighted by the ETH they have staked). There is a system of rewards and penalties that strongly incentivize participants to be honest and online as much as possible. -More on [proof-of-stake](/developers/docs/consensus-mechanisms/pos). If you want to see how blockchain hashes data and then the previous block references all the past blocks, be sure to check out [this demo](https://andersbrownworth.com/blockchain/blockchain) by Anders Brownworth and watch the accompanying video below. @@ -28,7 +27,7 @@ Watch Anders explain hashes in blockchains: ## What is Ethereum? {#what-is-ethereum} -Ethereum is a blockchain with a computer embedded in it. It serves as the foundation for building apps and organizations in a decentralized, permissionless, censorship resistant way. +Ethereum is a blockchain with a computer embedded in it. It is the foundation for building apps and organizations in a decentralized, permissionless, censorship-resistant way. In the Ethereum universe, there is a single, canonical computer (called the Ethereum Virtual Machine, or EVM) whose state everyone on the Ethereum network agrees on. Everyone who participates in the Ethereum network (every Ethereum node) keeps a copy of the state of this computer. Additionally, any participant can broadcast a request for this computer to perform arbitrary computation. Whenever such a request is broadcast, other participants on the network verify, validate, and carry out ("execute") the computation. This execution causes a state change in the EVM, which is committed and propagated throughout the entire network. @@ -40,11 +39,11 @@ Cryptographic mechanisms ensure that once transactions are verified as valid and **Ether (ETH)** is the native cryptocurrency of Ethereum. The purpose of ETH is to allow for a market for computation. Such a market provides an economic incentive for participants to verify and execute transaction requests and provide computational resources to the network. -Any participant who broadcasts a transaction request must also offer some amount of ETH to the network as a bounty. This bounty will be awarded to whoever eventually does the work of verifying the transaction, executing it, committing it to the blockchain, and broadcasting it to the network. +Any participant who broadcasts a transaction request must also offer some amount of ETH to the network as a bounty. The network will award this bounty to whoever eventually does the work of verifying the transaction, executing it, committing it to the blockchain, and broadcasting it to the network. The amount of ETH paid corresponds to the time required to do the computation. These bounties also prevent malicious participants from intentionally clogging the network by requesting the execution of infinite computation or other resource-intensive scripts, as these participants must pay for computation time. -ETH is also used to provide crypto-economic security to the network, in three main ways: 1) it is used as a means to reward validators who propose blocks or call out dishonest behavior by other validators; 2) It is staked by validators, acting as collateral against dishonest behavior—if validators attempt to misbehave their ETH can be destroyed; 3) it is used to weight 'votes' for newly proposed blocks, feeding into the fork-choice part of the consensus mechanism. +ETH is also used to provide crypto-economic security to the network in three main ways: 1) it is used as a means to reward validators who propose blocks or call out dishonest behavior by other validators; 2) It is staked by validators, acting as collateral against dishonest behavior—if validators attempt to misbehave their ETH can be destroyed; 3) it is used to weight 'votes' for newly proposed blocks, feeding into the fork-choice part of the consensus mechanism. ## What are smart contracts? {#what-are-smart-contracts} From bcc7ec3aa67d50ca1a168cf4a27c192ac68a20f4 Mon Sep 17 00:00:00 2001 From: Joshua <62268199+minimalsm@users.noreply.github.com> Date: Wed, 27 Jul 2022 15:30:46 +0100 Subject: [PATCH 057/286] Update src/content/developers/docs/intro-to-ethereum/index.md --- src/content/developers/docs/intro-to-ethereum/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/content/developers/docs/intro-to-ethereum/index.md b/src/content/developers/docs/intro-to-ethereum/index.md index 83b88c3c758..2f54854b5c6 100644 --- a/src/content/developers/docs/intro-to-ethereum/index.md +++ b/src/content/developers/docs/intro-to-ethereum/index.md @@ -16,7 +16,7 @@ A blockchain is a public database that is updated and shared across many compute Every computer in the network must agree upon each new block and the chain as a whole. These computers are known as "nodes". Nodes ensure everyone interacting with the blockchain has the same data. To accomplish this distributed agreement, blockchains need a consensus mechanism. -Ethereum uses a [proof-of-stake-based consensus mechanism](/developers/docs/consensus-mechanisms/pos). Anyone who wants to add new blocks to the chain must stake at least 32 ETH into the deposit contract and run validator software. They then can be randomly selected to propose blocks that other validators check and add to the blockchain. In this model, there is usually only one chain, but network latency and dishonest behavior can cause multiple blocks to exist at the same position near the head of the chain. To resolve this, a fork-choice algorithm selects one canonical set of blocks. The blocks selected are the ones that form the heaviest possible chain, where 'heavy' refers to the number of validators that have endorsed the blocks (weighted by the ETH they have staked). There is a system of rewards and penalties that strongly incentivize participants to be honest and online as much as possible. +Ethereum uses a [proof-of-stake-based consensus mechanism](/developers/docs/consensus-mechanisms/pos/). Anyone who wants to add new blocks to the chain must stake at least 32 ETH into the deposit contract and run validator software. They then can be randomly selected to propose blocks that other validators check and add to the blockchain. In this model, there is usually only one chain, but network latency and dishonest behavior can cause multiple blocks to exist at the same position near the head of the chain. To resolve this, a fork-choice algorithm selects one canonical set of blocks. The blocks selected are the ones that form the heaviest possible chain, where 'heavy' refers to the number of validators that have endorsed the blocks (weighted by the ETH they have staked). There is a system of rewards and penalties that strongly incentivize participants to be honest and online as much as possible. If you want to see how blockchain hashes data and then the previous block references all the past blocks, be sure to check out [this demo](https://andersbrownworth.com/blockchain/blockchain) by Anders Brownworth and watch the accompanying video below. From 3a08f6496e8191a4d72ab9a4f67429c445d92f93 Mon Sep 17 00:00:00 2001 From: Joe Date: Wed, 27 Jul 2022 15:43:31 +0100 Subject: [PATCH 058/286] add page on pos validator keys --- .../consensus-mechanisms/pos/keys/index.md | 93 ++++++++++++++++++ .../pos/keys/multiple-keys.png | Bin 0 -> 63768 bytes .../pos/keys/validator-key-schematic.png | Bin 0 -> 85053 bytes src/data/developer-docs-links.yaml | 6 +- src/intl/en/page-developers-docs.json | 1 + 5 files changed, 98 insertions(+), 2 deletions(-) create mode 100644 src/content/developers/docs/consensus-mechanisms/pos/keys/index.md create mode 100644 src/content/developers/docs/consensus-mechanisms/pos/keys/multiple-keys.png create mode 100644 src/content/developers/docs/consensus-mechanisms/pos/keys/validator-key-schematic.png diff --git a/src/content/developers/docs/consensus-mechanisms/pos/keys/index.md b/src/content/developers/docs/consensus-mechanisms/pos/keys/index.md new file mode 100644 index 00000000000..bb0109d8c73 --- /dev/null +++ b/src/content/developers/docs/consensus-mechanisms/pos/keys/index.md @@ -0,0 +1,93 @@ +--- +title: Keys in proof-of-stake Ethereum +description: An explanation of keys used in Ethereum since the transition to proof-of-stake. +lang: en +sidebar: true +--- + +Ethereum secures user's assets using public-private key cryptography. The public key is used as the basis for an +Ethereum address - that is, it is visible to the general public and used as a unique identifier. The private (or 'secret') +key should only ever be accessible to an account owner. The private key is used to 'sign' transactions and data so +that it can be cryptographically proven that some actionw as approved by the holder of a specific private key. + +Ethereum's keys are generated using [elliptic-curve cryptography](https://en.wikipedia.org/wiki/Elliptic-curve_cryptography). + +However, when Ethereum switched from [proof-of-work](/developers/docs/consensus-mechanisms/pow) to [proof-of-stake](/developers/docs/consensus-mechanisms/pos) a new type of key was added to Ethereum. The original keys still work exactly the same as before - there were no changes to the elliptic-curve based keys securing accounts. However, for users that wanted to participate in proof-of-stake by staking ETH and running validators, a new type of key was needed. This need arose from scalability challenges associated with many messages passign between large numbers of validators that required a cryptographic method that could easily be aggregated to reduce the amount of communication required for the network to come to consensus. + +This new type of key uses the Boneh-Lyn-Shacham, [BLS](https://en.wikipedia.org/wiki/Boneh%E2%80%93Lynn%E2%80%93Shacham), signature scheme. This scheme enables very efficient aggregation of signatures but also allows reverse engineering of the individual validator keys that were aggregated - ideal for managing actions between validators. + +## The two types of validator key {#two-types-of-key} + +Before the switch to proof-of-stake, Ethereum users only had a single elliptic-curve based private key that they used to access their funds. With the introduction of proof-of-stake, users that wished to be solo stakers also required a **validator key** and a **withdrawal key**. + +### The validator key {#validator-key} + +The validator signing key consists of two elements: + +- Validator **private** key +- Validator **public** key + +The purpose of the validator private key is to actively sign on-chain operations such as block proposals and attestations. Therefore these keys have to be held in a hot wallet. + +This flexibility has the advantage to move validator signing keys very quickly from one device to another, however, if they have gotten lost or stolen, a thief may be able to **act maliciously** in the following ways: + +- Get the validator slashed) by: + - Being a proposer and signing two different beacon blocks for the same slot + - Being an attester and signing an attestation that "surrounds" another one. + - Being an attester and signing two different attestations having the same target. +- Force a voluntary exit, which stops the validator from staking, and grants access to its ETH balance to the withdrawal key owner. + +The **validator public key** is included in the _deposit data_ which allows Ethereum to identify the validator. + +### The withdrawal key {#withdrawal-key} + +The withdrawal key will be required to move the validator balance after this is enabled in the upcoming Shanghai upgrade. Just like the validator keys, the withdrawal keys also consist of two components: + +- Withdrawal **private** key +- Withdrawal **public** key + +Losing this key means losing access to the validator balance. However, the validator can still sign attestations and blocks since these actions require the validator private key, but there is little to no incentive to do so if the keys are lost. + +Separating out the validator keys from the Ethereum account keys enables multiple validators to be run by a single user. + +![validator key schematic](validator-key-schematic.png) + +## Deriving keys from other keys {#deriving-keys-from-keys} + +If every 32 ETH staked required a new set of 2 completely independent keys to be created, key management would quickly become unwieldy especially for users running multiple validators. To get around this problem, multiple validator keys can be derived from a single common secret. Storing that single secret allows access to multiple validator keys. + +[Mnemonics](https://en.bitcoinwiki.org/wiki/Mnemonic_phrase) and paths are a well-known feature that users often encounter when [they access](https://ethereum.stackexchange.com/questions/19055/what-is-the-difference-between-m-44-60-0-0-and-m-44-60-0) their hardware wallets. The mnemonic is a sequence of words that act as an initial seed for a private key. When combined with additional data, the mnemonic is used to generate a hash known as the 'master key'. This can be thought of as the root of a tree. Branches from this root can then be drived using a heirarchical path, so that child nodes can exist as combinations of their parent node's hash and their index in the tree. + +These paths have the following structure which will be familiar to users who have interacted with hardware wallets: + +``` +m/44'/60'/0'/0` +``` + +The slashes in this path separate components of the private key as follows: + +``` +master_key / purpose / coin_type / account / change / address_index +``` + +This logic enables a user to attach as many validators to a single **withdrawal key** as they want, because the root of the tree can be common and differentiation can happen at the branches. The user can **derive any number of keys** from the Mnemonic phrase. + +``` + [m / 0] + / + / +[m] - [m / 1] + \ + \ + [m / 2] +``` + +Each branch is separated by a `/` so `m/2` means start with the master key and follow branch 2. In the schematic below a single mnemonic phrase is used to store three withdrawal keys, each with two associated validators. + +![validator key logic](multiple-keys.png) + +## Further Reading {#further-reading} + +[Ethereum Foundation blog post by Carl Beekhuizen](https://blog.ethereum.org/2020/05/21/keys/) + +[EIP-2333 BLS12-381 key generation](https://eips.ethereum.org/EIPS/eip-2333) diff --git a/src/content/developers/docs/consensus-mechanisms/pos/keys/multiple-keys.png b/src/content/developers/docs/consensus-mechanisms/pos/keys/multiple-keys.png new file mode 100644 index 0000000000000000000000000000000000000000..f75b39ab0937433c042581378a1d114f0404ec8b GIT binary patch literal 63768 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 RxKi*(UuQ2ZNBcnd{{eG`Bt-xK literal 0 HcmV?d00001 diff --git a/src/content/developers/docs/consensus-mechanisms/pos/keys/validator-key-schematic.png b/src/content/developers/docs/consensus-mechanisms/pos/keys/validator-key-schematic.png new file mode 100644 index 0000000000000000000000000000000000000000..83dcbeaddeec9b2128caf63f43411cf90b698cc6 GIT binary patch literal 85053 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%0AyiJgH!`JXL^k~y`Thv$Df3) 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 q6s5K@y9HiiaU6%wBkI{YtGJjrk%L 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 Date: Wed, 27 Jul 2022 15:55:38 +0100 Subject: [PATCH 059/286] Update src/content/nft/index.md --- src/content/nft/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/content/nft/index.md b/src/content/nft/index.md index 235a4f01d81..c34b4b70f42 100644 --- a/src/content/nft/index.md +++ b/src/content/nft/index.md @@ -338,5 +338,5 @@ Most NFTs are built using a consistent standard known as [ERC-721](/developers/d - [A beginner's guide to NFTs](https://linda.mirror.xyz/df649d61efb92c910464a4e74ae213c4cab150b9cbcc4b7fb6090fc77881a95d) – _Linda Xie, January 2020_ - [Everything you need to know about the metaverse](https://foundation.app/blog/enter-the-metaverse) – _Foundation team, foundation.app_ - [No, CryptoArtists Aren’t Harming the Planet](https://medium.com/superrare/no-cryptoartists-arent-harming-the-planet-43182f72fc61) -- [Ethereum's energy consumption](/energy_consumption) +- [Ethereum's energy consumption](/energy-consumption/) - [A country's worth of power, no more](https://blog.ethereum.org/2021/05/18/country-power-no-more/) – _Carl Beekhuizen, May 18 2021_ From bf9f8ff42060aa98ba0dee022c4e531439e68b5e Mon Sep 17 00:00:00 2001 From: Joseph Cook <33655003+jmcook1186@users.noreply.github.com> Date: Wed, 27 Jul 2022 15:55:47 +0100 Subject: [PATCH 060/286] Apply suggestions from code review Co-authored-by: Joshua <62268199+minimalsm@users.noreply.github.com> --- .../docs/consensus-mechanisms/index.md | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/src/content/developers/docs/consensus-mechanisms/index.md b/src/content/developers/docs/consensus-mechanisms/index.md index cafed97daa3..9a6f842762d 100644 --- a/src/content/developers/docs/consensus-mechanisms/index.md +++ b/src/content/developers/docs/consensus-mechanisms/index.md @@ -13,19 +13,19 @@ To better understand this page, we recommend you first read our [introduction to ## What is consensus? {#what-is-consensus} -By consensus, we mean that a general agreement has been reached. Consider a group of people going to the cinema. If there is no disagreement on a proposed choice of film, then a consensus is achieved. If there is disagreement, the group must have a means to decide which film to see. In the extreme case the group will eventually split. +By consensus, we mean that a general agreement has been reached. Consider a group of people going to the cinema. If there is no disagreement on a proposed choice of film, then a consensus is achieved. If there is disagreement, the group must have the means to decide which film to see. In extreme cases, the group will eventually split. In regards to the Ethereum blockchain, the process is formalized, and reaching consensus means that at least 66% of the nodes on the network agree on the global state of the network. ## What is a consensus mechanism? {#what-is-a-consensus-mechanism} -The term consensus mechanism refers to the entire stack of protocols, incentives and ideas that allow a network of nodes to come to agreement about the state of a blockchain. +The term consensus mechanism refers to the entire stack of protocols, incentives and ideas that allow a network of nodes to agree on the state of a blockchain. -Ethereum uses a proof-of-stake based consensus mechanism that derives its crypto-economic security from a set of rewards and penalties applied to capital locked by stakers. This incentive structure encourages individual stakers to operate honest validators, punishes those that don't, and also creates an extremely high cost to attack the network. +Ethereum uses a proof-of-stake-based consensus mechanism that derives its crypto-economic security from a set of rewards and penalties applied to capital locked by stakers. This incentive structure encourages individual stakers to operate honest validators, punishes those who don't, and creates an extremely high cost to attack the network. -Then, there is a protocol that governs how honest validators are selected to propose or validate blocks, process transactions and vote for their view of the head of the chain. In the rare situations where there are multiple blocks in the same position near the head of the chain, there is a fork-choice mechanism that selects blocks that make up the 'heaviest' chain, measured by the number of validators that voted for the blocks weighted by thier staked ether balance. +Then, there is a protocol that governs how honest validators are selected to propose or validate blocks, process transactions and vote for their view of the head of the chain. In the rare situations where multiple blocks are in the same position near the head of the chain, there is a fork-choice mechanism that selects blocks that make up the 'heaviest' chain, measured by the number of validators that voted for the blocks weighted by their staked ether balance. -There are also concepts that are important to consensus that are not explicitly defined in code, such as the additional security offered by potential out-of-band social coordination as a last line of defense against attacks on the network. +Some concepts are important to consensus that are not explicitly defined in code, such as the additional security offered by potential out-of-band social coordination as a last line of defense against attacks on the network. These components together form the consensus mechanism. @@ -37,7 +37,7 @@ Like Bitcoin, Ethereum once used a **proof-of-work (PoW)** based consensus proto #### Block creation {#pow-block-creation} -Proof-of-work is done by [miners](/developers/docs/consensus-mechanisms/pow/mining/), who compete to create new blocks full of processed transactions. The winner shares the new block with the rest of the network and earns some freshly minted ETH. The race is won by the computer which is able to solve a math puzzle fastest—this produces the cryptographic link between the current block and the block that went before. Solving this puzzle is the work in "proof-of-work". The true head of the chain is then determined by a fork-choice rule that selects the set of blocks that have had the most work done to mine them. +Blocks are created by validators. Each slot, one validator is randomly selected to be the block proposer. Their consensus client requests a bundle of transactions in the form of an 'execution payload' from their paired execution client. They wrap this in consensus data to form a block, which they send to other nodes on the Ethereum network. This block production is rewarded in ETH. In rare cases when multiple possible blocks exist for a single slot, or nodes hear about blocks at different times, the fork choice algorithm picks the block that forms the chain with the greatest weight of attestations (where weight is the number of validators attesting scaled by their ETH balance). #### Security {#pow-security} @@ -55,7 +55,7 @@ Proof-of-stake is done by validators who have staked ETH to participate in the s #### Security {#pos-security} -A proof-of-stake system is kept secure crypto-economically because a huge amount of ether must be destroyed by an attacker attempting to take control of the chain. A system of rewards incentivizes individual stakers to behave honestly, and penalties disincentivize stakers from acting maliciously. +A proof-of-stake system is secure crypto-economically because an attacker attempting to take control of the chain must destroy a massive amount of ETH. A system of rewards incentivizes individual stakers to behave honestly, and penalties disincentivize stakers from acting maliciously. More on [proof-of-stake](/developers/docs/consensus-mechanisms/pos/) @@ -67,13 +67,13 @@ Watch more on the different types of consensus mechanisms used on Ethereum: ### Sybil resistance & chain selection {#sybil-chain} -As mentioned earlier, proof-of-work and proof-of-stake are not consensus protocols by themselves, but they are often referred to as such for simplicity. They are actually Sybil resistance mechanisms and block author selectors; they are a way to decide who is the author of the latest block. Another important component is the chain selection (aka fork choice) algorithm that enables nodes to pick one single correct block at the head of the chain in scenarios where multiple blocks exist in the same position. +Proof-of-work and proof-of-stake alone are not consensus protocols, but they are often referred to as such for simplicity. They are actually Sybil resistance mechanisms and block author selectors; they are a way to decide who is the author of the latest block. Another important component is the chain selection (aka fork choice) algorithm that enables nodes to pick one single correct block at the head of the chain in scenarios where multiple blocks exist in the same position. **Sybil resistance** measures how a protocol fares against a [Sybil attack](https://wikipedia.org/wiki/Sybil_attack). Sybil attacks are when one user or group pretends to be many users. Resistance to this type of attack is essential for a decentralized blockchain and enables miners and validators to be rewarded equally based on resources put in. Proof-of-work and proof-of-stake protect against this by making users expend a lot of energy or put up a lot of collateral. These protections are an economic deterrent to Sybil attacks. A **chain selection rule** is used to decide which chain is the "correct" chain. Bitcoin uses the "longest chain" rule, which means that whichever blockchain is the longest will be the one the rest of the nodes accept as valid and work with. For proof-of-work chains, the longest chain is determined by the chain's total cumulative proof-of-work difficulty. Ethereum used to use the longest chain rule too; however, now that Etheruem runs on proof-of-stake it adopted an updated fork-choice algorithm that measures the 'weight' of the chain. The weight is the accumulated sum of validator votes, weighted by validator staked-ether balances. -Ethereum uses a consensus mechanism known as [Gasper](/developers/docs/consensus-mechanisms/pos/gasper/) that combines [Casper FFG](https://arxiv.org/abs/1710.09437) proof-of-stake with the [GHOST](https://arxiv.org/abs/2003.03052) fork-choice rule. +Ethereum uses a consensus mechanism known as [Gasper](/developers/docs/consensus-mechanisms/pos/gasper/) that combines [Casper FFG proof-of-stake](https://arxiv.org/abs/1710.09437) with the [GHOST fork-choice rule](https://arxiv.org/abs/2003.03052). ## Further reading {#further-reading} From 84782bc00de703eb71b63e0c5f9c5423d226d6f7 Mon Sep 17 00:00:00 2001 From: Ori Pomerantz Date: Wed, 27 Jul 2022 12:31:08 -0500 Subject: [PATCH 061/286] Update index.md --- .../erc20-with-safety-rails/index.md | 43 ++++++++++++++++--- 1 file changed, 38 insertions(+), 5 deletions(-) diff --git a/src/content/developers/tutorials/erc20-with-safety-rails/index.md b/src/content/developers/tutorials/erc20-with-safety-rails/index.md index 59216ea8c37..425f05c2910 100644 --- a/src/content/developers/tutorials/erc20-with-safety-rails/index.md +++ b/src/content/developers/tutorials/erc20-with-safety-rails/index.md @@ -38,7 +38,7 @@ Before we can add the safety rail functionality we need an ERC-20 contract. In t ## Common mistakes {#commom-mistakes} -### What are they? {#what-are-they} +### The mistakes {#the-mistakes} Users sometimes send tokens to the wrong address. While we cannot read their minds to know what they meant to do, there are two error types that happen a lot and are easy to detect: @@ -47,9 +47,11 @@ Users sometimes send tokens to the wrong address. While we cannot read their min 2. Sending the tokens to an empty address, one that doesn't correspond to an [externally owned account](/developers/docs/accounts/#externally-owned-accounts-and-key-pairs) or a [smart contract](/developers/docs/smart-contracts). While I don't have statistics on how often this happens, [one incident could have cost 20,000,000 tokens](https://gov.optimism.io/t/message-to-optimism-community-from-wintermute/2595). -### How do we prevent them? {#how-do-we-prevent-them} +### Preventing transfers {#preventing-transfers} -The OpenZeppelin ERC-20 contract includes [a hook, `_beforeTokenTransfer`](https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC20/ERC20.sol#L364-L368), that is called before a token is transferred. By default this hook does not do anything, but we can hang our own functionality on it. So we can add this function after the constructor: +The OpenZeppelin ERC-20 contract includes [a hook, `_beforeTokenTransfer`](https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC20/ERC20.sol#L364-L368), that is called before a token is transferred. By default this hook does not do anything, but we can hang our own functionality on it, such as checks that revert if there's a problem. + +To use the hook, add this function after the constructor: ```solidity function _beforeTokenTransfer(address from, address to, uint256 amount) @@ -74,6 +76,8 @@ We have to specify explicitly that we're [overriding](https://docs.soliditylang. This line calls the `_beforeTokenTransfer` function of the contract or contracts from which we inherited which have it. In this case, that is only `ERC20`, `Ownable` does not have this hook. Even though currently `ERC20._beforeTokenTransfer` doesn't do anything, we call it in case functionality is added in the future (and we then decide to redeploy the contract, because contracts don't change after deployment). +### Coding the requireemnts {#coding-the-requirements} + We want to add these requirements to the function: - The `to` address cannot equal `address(this)`, the address of the ERC-20 contract itself. @@ -96,7 +100,7 @@ This is the first requirement, check that `to` and `this(address)` are not the s } ``` -This is how we check if an address is a contract. We cannot receive output directly from Yul, so instead we define a variable to hold the result (`isToContract` in this case). The way Yul works every opcode is considered a function. So first we call [`EXTCODESIZE`](https://www.evm.codes/#3b) to get the contract size, and then use [`GT`](https://www.evm.codes/#11) to check it is not zero (we are dealing with unsigned integers, so of course it can't be negative). We then write the result to `isToContract`. +This is how we check if an address is a contract. We cannot receive output directly from Yul, so instead we define a variable to hold the result (`isToContract` in this case). The way Yul works is that every opcode is considered a function. So first we call [`EXTCODESIZE`](https://www.evm.codes/#3b) to get the contract size, and then use [`GT`](https://www.evm.codes/#11) to check it is not zero (we are dealing with unsigned integers, so of course it can't be negative). We then write the result to `isToContract`. ```solidity require(to.balance != 0 || isToContract, "Can't send tokens to an empty address"); @@ -105,7 +109,36 @@ This is how we check if an address is a contract. We cannot receive output direc And finally, we have the actual check for empty addresses. -## Administrative access +### The complete function {#the-complete-function} + +This is the complete function to check for common mistakes: + +```solidity + + function _beforeTokenTransfer(address from, address to, uint256 amount) + internal + override(ERC20) + { + super._beforeTokenTransfer(from, to, amount); + + bool isToContract; + require(to != address(this), "Can't send tokens to the contract address"); + assembly { + isToContract := gt(extcodesize(to), 0) + } + + require(to.balance != 0 || isToContract, "Can't send tokens to an empty address"); + } // _beforeTokenTransfer + +``` + + + +## Administrative access {#admin-access} + +Sometimes it is + +## Reversible transactions {#reversible-transactions} It is sometimes useful to have account administrators that can modify or undo certain actions. From 29401d5124c26c52e1dfc1a15734494d817a4e63 Mon Sep 17 00:00:00 2001 From: Ori Pomerantz Date: Wed, 27 Jul 2022 13:16:42 -0500 Subject: [PATCH 062/286] Update index.md --- .../tutorials/erc20-with-safety-rails/index.md | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/src/content/developers/tutorials/erc20-with-safety-rails/index.md b/src/content/developers/tutorials/erc20-with-safety-rails/index.md index 425f05c2910..e4709afece4 100644 --- a/src/content/developers/tutorials/erc20-with-safety-rails/index.md +++ b/src/content/developers/tutorials/erc20-with-safety-rails/index.md @@ -109,7 +109,7 @@ This is how we check if an address is a contract. We cannot receive output direc And finally, we have the actual check for empty addresses. -### The complete function {#the-complete-function} +### The common mistakes function {#the-common-mistakes-function} This is the complete function to check for common mistakes: @@ -136,7 +136,19 @@ This is the complete function to check for common mistakes: ## Administrative access {#admin-access} -Sometimes it is +Sometimes it is useful to have an administrator that can undo mistakes. To reduce the potential for abuse, this administrator can be a [multisig](https://blog.logrocket.com/security-choices-multi-signature-wallets/) so multiple people have to agree on an action. In this article we'll have two administrative features: + +1. Freezing and unfreezing accounts. This can be useful, for example, when an account might be compromised. +2. Asset cleanup. + + Sometimes frauds send fraudulant tokens to the real token's contract to gain legitimacy. For example, [see here](https://optimistic.etherscan.io/token/0x2348b1a1228ddcd2db668c3d30207c3e1852fbbe?a=0x4200000000000000000000000000000000000042). The legitimate ERC-20 contract is [0x4200....0042](https://optimistic.etherscan.io/address/0x4200000000000000000000000000000000000042). The scam that pretends to be it is [0x234....bbe](https://optimistic.etherscan.io/address/0x2348b1a1228ddcd2db668c3d30207c3e1852fbbe). + + It is also possible that people send legitimate ERC-20 tokens to our contract by mistake, which is anotehr reason to want to have a way to get them out. + +OpenZeppelin provides two mechanisms to enable administrative access: + +- [`Ownable`](https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/access/Ownable.sol) contracts + ## Reversible transactions {#reversible-transactions} From 20308212a61c9de254c58c51efaa6518252f2d8e Mon Sep 17 00:00:00 2001 From: Joseph Cook <33655003+jmcook1186@users.noreply.github.com> Date: Thu, 28 Jul 2022 11:32:13 +0100 Subject: [PATCH 063/286] Apply suggestions from code review Co-authored-by: Joshua <62268199+minimalsm@users.noreply.github.com> --- src/content/developers/docs/networks/index.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/content/developers/docs/networks/index.md b/src/content/developers/docs/networks/index.md index f0fdd45de60..dccb089d57d 100644 --- a/src/content/developers/docs/networks/index.md +++ b/src/content/developers/docs/networks/index.md @@ -36,7 +36,7 @@ ETH on testnets has no real value; therefore, there are no markets for testnet E #### Sepolia {#sepolia} -Originally a proof-of-work testnet, now proof-of-stake. Sepolia is still running but it might not be maintained long term. +Sepolia is a proof-of-stake testnet. Although Sepolia is still running, it is not currently planned to be maintained long-term. Before undergoing The Merge in June 2022, Sepolia was a proof-of-work testnet. - [Website](https://sepolia.dev/) - [GitHub](https://github.com/goerli/sepolia) @@ -50,7 +50,7 @@ Originally a proof-of-work testnet, now proof-of-stake. Sepolia is still running #### Goerli {#goerli} -Originally a proof-of-authority testnet, now proof-of-stake. Goerli is expected to be maintained long term as a stable testnet for application developers. +Goerli is a proof-of-stake testnet. It is expected to be maintained long-term as a stable testnet for application developers. Before its testnet merge, Goerli was a proof-of-authority testnet. - [Website](https://goerli.net/) - [GitHub](https://github.com/goerli/testnet) @@ -66,7 +66,7 @@ Originally a proof-of-authority testnet, now proof-of-stake. Goerli is expected _Note, [the Ropsten testnet is deprecated](https://github.com/ethereum/pm/issues/460) and will no longer receive protocol upgrades. Please consider migrating your applications to Sepolia or Goerli._ -Ropsten was a proof-of-work testnet that went through The Merge to proof-of-stake in May 2022. It is likely to deprecated soon. +Ropsten is a proof-of-stake testnet. Ropsten will be deprecated in late 2022. Before undergoing The Merge in May 2022, Ropsten was a proof-of-work testnet. ##### Ropsten faucets From abc3a734287cab834937477d9e4e6edbd1019883 Mon Sep 17 00:00:00 2001 From: Joseph Cook <33655003+jmcook1186@users.noreply.github.com> Date: Thu, 28 Jul 2022 11:33:50 +0100 Subject: [PATCH 064/286] re-order testnets --- src/content/developers/docs/networks/index.md | 27 ++++++++++--------- 1 file changed, 14 insertions(+), 13 deletions(-) diff --git a/src/content/developers/docs/networks/index.md b/src/content/developers/docs/networks/index.md index dccb089d57d..a909353079e 100644 --- a/src/content/developers/docs/networks/index.md +++ b/src/content/developers/docs/networks/index.md @@ -34,6 +34,20 @@ Most testnets started by using a proof-of-authority consensus mechanism. This me ETH on testnets has no real value; therefore, there are no markets for testnet ETH. Since you need ETH to actually interact with Ethereum, most people get testnet ETH from faucets. Most faucets are webapps where you can input an address which you request ETH to be sent to. +#### Goerli {#goerli} + +Goerli is a proof-of-stake testnet. It is expected to be maintained long-term as a stable testnet for application developers. Before its testnet merge, Goerli was a proof-of-authority testnet. + +- [Website](https://goerli.net/) +- [GitHub](https://github.com/goerli/testnet) +- [Etherscan](https://goerli.etherscan.io) + +##### Goerli faucets + +- [Goerli faucet](https://faucet.goerli.mudit.blog/) +- [Chainlink faucet](https://faucets.chain.link/) +- [Alchemy Goerli Faucet](https://goerlifaucet.com/) + #### Sepolia {#sepolia} Sepolia is a proof-of-stake testnet. Although Sepolia is still running, it is not currently planned to be maintained long-term. Before undergoing The Merge in June 2022, Sepolia was a proof-of-work testnet. @@ -48,19 +62,6 @@ Sepolia is a proof-of-stake testnet. Although Sepolia is still running, it is no - [Sepolia faucet](https://faucet.sepolia.dev/) - [FaucETH](https://fauceth.komputing.org) -#### Goerli {#goerli} - -Goerli is a proof-of-stake testnet. It is expected to be maintained long-term as a stable testnet for application developers. Before its testnet merge, Goerli was a proof-of-authority testnet. - -- [Website](https://goerli.net/) -- [GitHub](https://github.com/goerli/testnet) -- [Etherscan](https://goerli.etherscan.io) - -##### Goerli faucets - -- [Goerli faucet](https://faucet.goerli.mudit.blog/) -- [Chainlink faucet](https://faucets.chain.link/) -- [Alchemy Goerli Faucet](https://goerlifaucet.com/) #### Ropsten _(deprecated)_ {#ropsten} From 148d4e0cb0c8116d765f009fc64bc2817e6b2aaf Mon Sep 17 00:00:00 2001 From: Ori Pomerantz Date: Thu, 28 Jul 2022 21:24:30 -0500 Subject: [PATCH 065/286] Update index.md --- .../tutorials/erc20-with-safety-rails/index.md | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/src/content/developers/tutorials/erc20-with-safety-rails/index.md b/src/content/developers/tutorials/erc20-with-safety-rails/index.md index e4709afece4..c232c2bf2f1 100644 --- a/src/content/developers/tutorials/erc20-with-safety-rails/index.md +++ b/src/content/developers/tutorials/erc20-with-safety-rails/index.md @@ -147,8 +147,23 @@ Sometimes it is useful to have an administrator that can undo mistakes. To reduc OpenZeppelin provides two mechanisms to enable administrative access: -- [`Ownable`](https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/access/Ownable.sol) contracts +- [`Ownable`](https://docs.openzeppelin.com/contracts/4.x/access-control#ownership-and-ownable) contracts have a single owner. Functions that have the `onlyOwner` [modifier](https://www.tutorialspoint.com/solidity/solidity_function_modifiers.htm) can only be called by that owner. Owners can transfer ownership to somebody else or renounce it completely. The rights of all other accounts are typically identical. +- [`AccessControl`](https://docs.openzeppelin.com/contracts/4.x/access-control#role-based-access-control) contracts have [role based access control (RBAC)](https://en.wikipedia.org/wiki/Role-based_access_control). +For the sake of simplicity, in this article we use `Ownable`. + + +### Freezing and thawing contracts {#freezing-and-thawing-contracts} + +Freezing and thawing contracts requires several changes: + +- A [mapping](https://www.tutorialspoint.com/solidity/solidity_mappings.htm) from addresses to [booleans](https://en.wikipedia.org/wiki/Boolean_data_type) to keep track of which addresses are frozen. All values are initially zero, which for boolean values is interpreted as false. This is what we want because by default accounts are not frozen. + + ```solidity + mapping(address => bool) public frozenAccounts; + ``` + +- [Events](https://www.tutorialspoint.com/solidity/solidity_events.htm) to inform anybody interested when an account is frozen or thawed. ## Reversible transactions {#reversible-transactions} From 4269571efc54151fb590ab78bb5726ba4f9264d7 Mon Sep 17 00:00:00 2001 From: Joshua <62268199+minimalsm@users.noreply.github.com> Date: Fri, 29 Jul 2022 12:46:58 +0100 Subject: [PATCH 066/286] Fix line lengths --- .../developers/docs/consensus-mechanisms/pos/keys/index.md | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/src/content/developers/docs/consensus-mechanisms/pos/keys/index.md b/src/content/developers/docs/consensus-mechanisms/pos/keys/index.md index bb0109d8c73..83714cd2408 100644 --- a/src/content/developers/docs/consensus-mechanisms/pos/keys/index.md +++ b/src/content/developers/docs/consensus-mechanisms/pos/keys/index.md @@ -5,10 +5,7 @@ lang: en sidebar: true --- -Ethereum secures user's assets using public-private key cryptography. The public key is used as the basis for an -Ethereum address - that is, it is visible to the general public and used as a unique identifier. The private (or 'secret') -key should only ever be accessible to an account owner. The private key is used to 'sign' transactions and data so -that it can be cryptographically proven that some actionw as approved by the holder of a specific private key. +Ethereum secures user's assets using public-private key cryptography. The public key is used as the basis for an Ethereum address - that is, it is visible to the general public and used as a unique identifier. The private (or 'secret') key should only ever be accessible to an account owner. The private key is used to 'sign' transactions and data so that it can be cryptographically proven that some actionw as approved by the holder of a specific private key. Ethereum's keys are generated using [elliptic-curve cryptography](https://en.wikipedia.org/wiki/Elliptic-curve_cryptography). From 387b7d7abb6e34751415cc6351476187c31ba366 Mon Sep 17 00:00:00 2001 From: Joe Date: Fri, 29 Jul 2022 13:47:19 +0100 Subject: [PATCH 067/286] update storage page --- src/content/developers/docs/storage/index.md | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/content/developers/docs/storage/index.md b/src/content/developers/docs/storage/index.md index bd03af39154..6a27b5a2bb7 100644 --- a/src/content/developers/docs/storage/index.md +++ b/src/content/developers/docs/storage/index.md @@ -28,7 +28,7 @@ This is known as **blockchain-based** persistence. The issue with blockchain-based persistence is that the chain could get far too big to upkeep and store all the data feasibly (e.g. [many sources](https://healthit.com.au/how-big-is-the-internet-and-how-do-we-measure-it/) estimate the Internet to require over 40 Zetabytes of storage capacity). -The blockchain must also have some type of incentive structure. For blockchain-based persistence, there is a payment made to the miner. When the data is added to the chain, the nodes are paid to add the data on. +The blockchain must also have some type of incentive structure. For blockchain-based persistence, there is a payment made to the validator. When the data is added to the chain, the validators are paid to add the data on. Platforms with blockchain-based persistence: @@ -93,11 +93,10 @@ PoW based: - Skynet - Arweave -- Ethereum PoS based: -- [The Beacon Chain](/upgrades/beacon-chain/) +- Ethereum - Filecoin - 0Chain From b8b1c0e724ecb42baf9e00e0b99c4c17bd975ef4 Mon Sep 17 00:00:00 2001 From: Joshua <62268199+minimalsm@users.noreply.github.com> Date: Fri, 29 Jul 2022 14:36:45 +0100 Subject: [PATCH 068/286] Update src/content/developers/docs/storage/index.md --- src/content/developers/docs/storage/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/content/developers/docs/storage/index.md b/src/content/developers/docs/storage/index.md index 6a27b5a2bb7..120fdc47826 100644 --- a/src/content/developers/docs/storage/index.md +++ b/src/content/developers/docs/storage/index.md @@ -94,7 +94,7 @@ PoW based: - Skynet - Arweave -PoS based: +Proof-of-stake based: - Ethereum - Filecoin From 38971232aabcfab1e3986059c66cd5c610ed8cca Mon Sep 17 00:00:00 2001 From: Joshua <62268199+minimalsm@users.noreply.github.com> Date: Fri, 29 Jul 2022 14:37:09 +0100 Subject: [PATCH 069/286] Update pow to proof-of-work --- src/content/developers/docs/storage/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/content/developers/docs/storage/index.md b/src/content/developers/docs/storage/index.md index 120fdc47826..5429b93dac9 100644 --- a/src/content/developers/docs/storage/index.md +++ b/src/content/developers/docs/storage/index.md @@ -89,7 +89,7 @@ Decentralized tools without KYC: Most of these tools have their own version of a [consensus mechanism](/developers/docs/consensus-mechanisms/) but generally they are based on either [**proof-of-work (PoW)**](/developers/docs/consensus-mechanisms/pow/) or [**proof-of-stake (PoS)**](/developers/docs/consensus-mechanisms/pos/). -PoW based: +Proof-of-work based: - Skynet - Arweave From d27d0b6b9caab81bef84c172e871007339c79ce2 Mon Sep 17 00:00:00 2001 From: Joe Date: Fri, 29 Jul 2022 14:45:31 +0100 Subject: [PATCH 070/286] update block page --- src/content/developers/docs/blocks/index.md | 62 +++++++++++++-------- 1 file changed, 38 insertions(+), 24 deletions(-) diff --git a/src/content/developers/docs/blocks/index.md b/src/content/developers/docs/blocks/index.md index 473138a3eed..d82b16353ce 100644 --- a/src/content/developers/docs/blocks/index.md +++ b/src/content/developers/docs/blocks/index.md @@ -19,47 +19,61 @@ To ensure that all participants on the Ethereum network maintain a synchronized ![A diagram showing transaction in a block causing state changes](./tx-block.png) _Diagram adapted from [Ethereum EVM illustrated](https://takenobu-hs.github.io/downloads/ethereum_evm_illustrated.pdf)_ -By spacing out commits, we give all network participants enough time to come to consensus: even though transaction requests occur dozens of times per second, blocks on Ethereum are committed approximately once every fifteen seconds. +By spacing out commits, we give all network participants enough time to come to consensus: even though transaction requests occur dozens of times per second, blocks are only created and committed on Ethereum once every six seconds. ## How blocks work {#how-blocks-work} To preserve the transaction history, blocks are strictly ordered (every new block created contains a reference to its parent block), and transactions within blocks are strictly ordered as well. Except in rare cases, at any given time, all participants on the network are in agreement on the exact number and history of blocks, and are working to batch the current live transaction requests into the next block. -Once a block is put together (mined) by some miner on the network, it is propagated to the rest of the network; all nodes add this block to the end of their blockchain, and mining continues. The exact block-assembly (mining) process and commitment/consensus process is currently specified by Ethereum’s “proof-of-work” protocol. +Once a block is put together by some validator on the network, it is propagated to the rest of the network; all nodes add this block to the end of their blockchain, and a new validator is selected to create the next block. The exact block-assembly process and commitment/consensus process is currently specified by Ethereum’s “proof-of-stake” protocol. -### A visual demo {#a-visual-demo} +## Proof-of-stake protocol {#proof-of-work-protocol} - +Proof-of-stake means the following: -## Proof-of-work protocol {#proof-of-work-protocol} +- Validating nodes have to stake at least 32 ETH into a deposit contract as collateral against bad behaviour. This helps protect the network because provably dishonet activity leads to some or all of that stake being destroyed. +- In every slot (spaced 6 seconds apart) a validator is randomly selected to be the block proposer. They bundle transactions together, execute them and determine a new 'state'. They wrap this information int a block and pass it around to other validators. +- Other validators who hear about a new block re-execute the transactions to ensure they agree with the proposed change to the global state. Assuming the block is valid they add it to their own database. +- If a validator hears about two conflicting blocks for the same slot they use their fork-choice algorithm to pick the one supported by the most staked ETH. -Proof-of-work means the following: - -- Mining nodes have to spend a variable but substantial amount of energy, time, and computational power to produce a “certificate of legitimacy” for a block they propose to the network. This helps protect the network from spam/denial-of-service attacks, among other things, since certificates are expensive to produce. -- Other miners who hear about a new block with a valid certificate of legitimacy must accept the new block as the canonical next block on the blockchain. -- The exact amount of time needed for any given miner to produce this certificate is a random variable with high variance. This ensures that it is unlikely that two miners produce validations for a proposed next block simultaneously; when a miner produces and propagates a certified new block, they can be almost certain that the block will be accepted by the network as the canonical next block on the blockchain, without conflict (though there is a protocol for dealing with conflicts as well in the case that two chains of certified blocks are produced almost simultaneously). - -[More on mining](/developers/docs/consensus-mechanisms/pow/mining/) +[More on proof-of-stake](/developers/docs/consensus-mechanisms/pos) ## What's in a block? {#block-anatomy} -- `timestamp` – the time when the block was mined. -- `blockNumber` – the length of the blockchain in blocks. -- `baseFeePerGas` - the minimum fee per gas required for a transaction to be included in the block. -- `difficulty` – the effort required to mine the block. -- `mixHash` – a unique identifier for that block. -- `parentHash` – the unique identifier for the block that came before (this is how blocks are linked in a chain). -- `transactions` – the transactions included in the block. -- `stateRoot` – the entire state of the system: account balances, contract storage, contract code and account nonces are inside. -- `nonce` – a hash that, when combined with the mixHash, proves that the block has gone through [proof-of-work](/developers/docs/consensus-mechanisms/pow/). +There is a lot of information contained within a block. At the highest level a block contains the following fields: + +``` +slot: the slot the block belongs to +proposer_index: the ID of the validator proposing the block +parent_root: the hash of the preceding block +state_root: the root hash of the state object +body: an object containing several fields, as defined below +``` + +The block `body` contains several fields of its own: + +``` +randao_reveal: a value used to select the next blockl proposer +eth1_data: information about the deposit contract +graffiti: arbitrary data used to tag blocks +proposer_slashings: list of validators to be slashed +attester_slashings: list of validators to be slashed +attestations: list of attestations in favour of the current block +deposits: list of new deposits to the deposit contract +voluntary_exits: list of validators exiting the network +sync_aggregate: subset of validators used to serve light clients +execution_payload: transactions passed from the execution client +``` + +Executing the transactions in the `execution_payload` updates the global state. All clients re-execute the transactions in the `execution_payload` to ensure the new state matches that in the new block `state_root` field. This is how clients can tell that a new block is valid and safe to add to their blockchain. ## Block time {#block-time} -Block time refers to the time it takes to mine a new block. In Ethereum, the average block time is between 12 to 14 seconds and is evaluated after each block. The expected block time is set as a constant at the protocol level and is used to protect the network's security when the miners add more computational power. The average block time gets compared with the expected block time, and if the average block time is higher, then the difficulty is decreased in the block header. If the average block time is smaller, then the difficulty in the block header will be increased. +Block time refers to the time separating blocks. In Ethereum, time is divided up into 6 second units called 'slots'. In each slot a single validator is selected to propose a block. Assuming all validators are online and fully functional there will be a block in every slot, meanign the block time is 6s. However, occasionally validators might be offline when called to propose a block, meaning slots can sometimes go empty. This is different to proof-of-work based systems where block times are probabilistic and tuned by the mining difficulty. ## Block size {#block-size} -A final important note is that blocks themselves are bounded in size. Each block has a target size of 15 million gas but the size of blocks will increase or decrease in accordance with network demands, up until the block limit of 30 million gas (2x target block size). The total amount of gas expended by all transactions in the block must be less than the block gas limit. This is important because it ensures that blocks can’t be arbitrarily large. If blocks could be arbitrarily large, then less performant full nodes would gradually stop being able to keep up with the network due to space and speed requirements. +A final important note is that blocks themselves are bounded in size. Each block has a target size of 15 million gas but the size of blocks will increase or decrease in accordance with network demands, up until the block limit of 30 million gas (2x target block size). The total amount of gas expended by all transactions in the block must be less than the block gas limit. This is important because it ensures that blocks can’t be arbitrarily large. If blocks could be arbitrarily large, then less performant full nodes would gradually stop being able to keep up with the network due to space and speed requirements. The larger the block, the greater the computing power required to process them in time for the next slot. This is a centralizing force, which is resisted by capping block sizes. ## Further reading {#further-reading} @@ -67,6 +81,6 @@ _Know of a community resource that helped you? Edit this page and add it!_ ## Related topics {#related-topics} -- [Mining](/developers/docs/consensus-mechanisms/pow/mining/) - [Transactions](/developers/docs/transactions/) - [Gas](/developers/docs/gas/) +- [proof-of-stake](/developers/docs/consensus-mechanisms/pos) From 37f47cf9ef869818d46a3d61ec4dfb9954bb1cf2 Mon Sep 17 00:00:00 2001 From: Joshua <62268199+minimalsm@users.noreply.github.com> Date: Fri, 29 Jul 2022 14:48:21 +0100 Subject: [PATCH 071/286] Use markdown within InfoBanner --- .../consensus-mechanisms/pow/mining-algorithms/index.md | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/content/developers/docs/consensus-mechanisms/pow/mining-algorithms/index.md b/src/content/developers/docs/consensus-mechanisms/pow/mining-algorithms/index.md index 4b8bea458a5..b5dbd3016da 100644 --- a/src/content/developers/docs/consensus-mechanisms/pow/mining-algorithms/index.md +++ b/src/content/developers/docs/consensus-mechanisms/pow/mining-algorithms/index.md @@ -6,8 +6,10 @@ sidebar: true preMergeBanner: true --- - - Proof-of-work is no longer underlying Ethereum's consensus mechanism, meaning mining has been switched off. Instead, Ethereum is secured by validators who stake ETH. You can start staking your ETH today. Read more on The Merge, proof-of-stake and staking. This page is for historical interest! + + +Proof-of-work is no longer underlying Ethereum's consensus mechanism, meaning mining has been switched off. Instead, Ethereum is secured by validators who stake ETH. You can start staking your ETH today. Read more on [The Merge](/upgrades/merge/), [proof-of-stake](/developers/docs/consensus-mechanisms/pos/), and [staking](/staking/). This page is for historical interest only. + From dca0c036f33104fa58fc66492a7a37647ecd3787 Mon Sep 17 00:00:00 2001 From: Joe Date: Fri, 29 Jul 2022 15:48:03 +0100 Subject: [PATCH 072/286] update accounts page --- src/content/developers/docs/accounts/index.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/content/developers/docs/accounts/index.md b/src/content/developers/docs/accounts/index.md index 11af93f62b5..a9115f9edf3 100644 --- a/src/content/developers/docs/accounts/index.md +++ b/src/content/developers/docs/accounts/index.md @@ -97,6 +97,12 @@ Example: The contract address is usually given when a contract is deployed to the Ethereum Blockchain. The address comes from the creator's address and the number of transactions sent from that address (the “nonce”). +## Validator keys + +There is also another type of key in Ethereum, introduced when Ethereum switched from proof-of-work to proof-of-stake based consensus. These are 'BLS' keys and they are used to identify validators. These keys can be efficiently aggregated to reduce the bandwidth required for the network to come to consensus. Without this key aggregation the minimum stake for a validator would be much higher. + +Read more about [validator keys](/developers/docs/consensus-mechanisms/pos/keys). + ## A note on wallets {#a-note-on-wallets} An account is not a wallet. An account is the keypair for a user-owned Ethereum account. A wallet is an interface or application that lets you interact with your Ethereum account. From ee44914f5d4e5f3f24d9553042f32c9b21569d69 Mon Sep 17 00:00:00 2001 From: Ori Pomerantz Date: Fri, 29 Jul 2022 16:57:12 -0500 Subject: [PATCH 073/286] Update index.md --- .../erc20-with-safety-rails/index.md | 33 ++++++++++++++++++- 1 file changed, 32 insertions(+), 1 deletion(-) diff --git a/src/content/developers/tutorials/erc20-with-safety-rails/index.md b/src/content/developers/tutorials/erc20-with-safety-rails/index.md index c232c2bf2f1..23ecf553067 100644 --- a/src/content/developers/tutorials/erc20-with-safety-rails/index.md +++ b/src/content/developers/tutorials/erc20-with-safety-rails/index.md @@ -163,7 +163,38 @@ Freezing and thawing contracts requires several changes: mapping(address => bool) public frozenAccounts; ``` -- [Events](https://www.tutorialspoint.com/solidity/solidity_events.htm) to inform anybody interested when an account is frozen or thawed. +- [Events](https://www.tutorialspoint.com/solidity/solidity_events.htm) to inform anybody interested when an account is frozen or thawed. Technically speaking events are not required for these actions, but it helps off chain code to be able to listen to these events and know what is happening. It's considered good manners for a smart contract to emit them when something that miught be relevant to somebody else happens. + + The events are indexed so will be possible to search for all the times an account has been frozen or thawed. + + ```solidity + // When accounts are frozen or unfrozen + event AccountFrozen(address indexed _addr); + event AccountThawed(address indexed _addr); + ``` + +- Functions for freezing and thawing accounts: + + ```solidity + function freezeAccount(address addr) + public + onlyOwner + { + require(frozenAccounts[addr], "Account already frozen"); + frozenAccounts[addr] = true; + emit AccountFrozen(addr); + } // freezeAccount + + + function thawAccount(address addr) + public + onlyOwner + { + require(!frozenAccounts[addr], "Account not frozen"); + frozenAccounts[addr] = false; + emit AccountThawed(addr); + } // thawAccount + ``` ## Reversible transactions {#reversible-transactions} From 9f6f3d0a2f1c29800d91012e1145364aab749fc3 Mon Sep 17 00:00:00 2001 From: Ori Pomerantz Date: Fri, 29 Jul 2022 17:28:07 -0500 Subject: [PATCH 074/286] Update index.md --- .../erc20-with-safety-rails/index.md | 53 ++++++------------- 1 file changed, 16 insertions(+), 37 deletions(-) diff --git a/src/content/developers/tutorials/erc20-with-safety-rails/index.md b/src/content/developers/tutorials/erc20-with-safety-rails/index.md index 23ecf553067..7c59f3afea7 100644 --- a/src/content/developers/tutorials/erc20-with-safety-rails/index.md +++ b/src/content/developers/tutorials/erc20-with-safety-rails/index.md @@ -109,30 +109,6 @@ This is how we check if an address is a contract. We cannot receive output direc And finally, we have the actual check for empty addresses. -### The common mistakes function {#the-common-mistakes-function} - -This is the complete function to check for common mistakes: - -```solidity - - function _beforeTokenTransfer(address from, address to, uint256 amount) - internal - override(ERC20) - { - super._beforeTokenTransfer(from, to, amount); - - bool isToContract; - require(to != address(this), "Can't send tokens to the contract address"); - assembly { - isToContract := gt(extcodesize(to), 0) - } - - require(to.balance != 0 || isToContract, "Can't send tokens to an empty address"); - } // _beforeTokenTransfer - -``` - - ## Administrative access {#admin-access} @@ -173,28 +149,31 @@ Freezing and thawing contracts requires several changes: event AccountThawed(address indexed _addr); ``` -- Functions for freezing and thawing accounts: +- Functions for freezing and thawing accounts. These two functions are nearly identical, so we'll only go over the freeze function. ```solidity function freezeAccount(address addr) public onlyOwner + ``` + + Functions marked [`public`](https://www.tutorialspoint.com/solidity/solidity_contracts.htm) can be called from other smart contracts or directly by a transaction. + + ```solidity { - require(frozenAccounts[addr], "Account already frozen"); - frozenAccounts[addr] = true; - emit AccountFrozen(addr); + require(frozenAccounts[addr], "Account already frozen"); + frozenAccounts[addr] = true; + emit AccountFrozen(addr); } // freezeAccount + ``` + If the account is already frozen, revert. Otherwise, freeze it and `emit` an event. - function thawAccount(address addr) - public - onlyOwner - { - require(!frozenAccounts[addr], "Account not frozen"); - frozenAccounts[addr] = false; - emit AccountThawed(addr); - } // thawAccount - ``` +- Change `_beforeTokenTransfer` to prevent money being moved from a frozen account. Note that money can still be transferred into the frozen account. + + ```solidity + require(!frozenAccounts[from], "The account is frozen") + ``` ## Reversible transactions {#reversible-transactions} From 93237578541794981cd451d9f337ae53cb5c46bb Mon Sep 17 00:00:00 2001 From: Ori Pomerantz Date: Fri, 29 Jul 2022 17:40:39 -0500 Subject: [PATCH 075/286] Update index.md --- .../tutorials/erc20-with-safety-rails/index.md | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/src/content/developers/tutorials/erc20-with-safety-rails/index.md b/src/content/developers/tutorials/erc20-with-safety-rails/index.md index 7c59f3afea7..2f3df71de26 100644 --- a/src/content/developers/tutorials/erc20-with-safety-rails/index.md +++ b/src/content/developers/tutorials/erc20-with-safety-rails/index.md @@ -161,7 +161,7 @@ Freezing and thawing contracts requires several changes: ```solidity { - require(frozenAccounts[addr], "Account already frozen"); + require(!frozenAccounts[addr], "Account already frozen"); frozenAccounts[addr] = true; emit AccountFrozen(addr); } // freezeAccount @@ -172,10 +172,17 @@ Freezing and thawing contracts requires several changes: - Change `_beforeTokenTransfer` to prevent money being moved from a frozen account. Note that money can still be transferred into the frozen account. ```solidity - require(!frozenAccounts[from], "The account is frozen") + require(!frozenAccounts[from], "The account is frozen"); ``` + + +### Asset cleanup {#asset-cleanup} + + + + -## Reversible transactions {#reversible-transactions} +## Delayed transactions {#delayed-transactions} It is sometimes useful to have account administrators that can modify or undo certain actions. From f7e0dd31fb602968d1d68cfc7e41e6a64d4b5ba7 Mon Sep 17 00:00:00 2001 From: Ori Pomerantz Date: Fri, 29 Jul 2022 20:16:28 -0500 Subject: [PATCH 076/286] Update index.md --- .../erc20-with-safety-rails/index.md | 20 +++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/src/content/developers/tutorials/erc20-with-safety-rails/index.md b/src/content/developers/tutorials/erc20-with-safety-rails/index.md index 2f3df71de26..6ff4c3793e8 100644 --- a/src/content/developers/tutorials/erc20-with-safety-rails/index.md +++ b/src/content/developers/tutorials/erc20-with-safety-rails/index.md @@ -178,6 +178,26 @@ Freezing and thawing contracts requires several changes: ### Asset cleanup {#asset-cleanup} +To release ERC-20 tokens held by this contract we need to call a function on the token contract to which they belong, either [`transfer`](https://github.com/ethereum/EIPs/blob/master/EIPS/eip-20.md#transfer) or [`approve`](https://github.com/ethereum/EIPs/blob/master/EIPS/eip-20.md#approve). There's no point wasting gas in this case on allowances, we might as well transfer directly. + +```solidity + function cleanupERC20( + address erc20, + address dest + ) + public + onlyOwner + { + IERC20 token = IERC20(erc20); +``` + +This is the syntax to create an object for a contract when we receive the address. We can do this because we have the definition for ERC20 tokens as part of the source code (see line 4), and that file includes [the definition for IERC20](https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC20/IERC20.sol), the interface for an OpenZeppelin ERC-20 contract. + +```solidity + uint balance = token.balanceOf(address(this)); + token.transfer(dest, balance); + } +``` From e8919b56fbcb6ca4d8982befeeb14dff5590740b Mon Sep 17 00:00:00 2001 From: Ori Pomerantz Date: Fri, 29 Jul 2022 20:21:33 -0500 Subject: [PATCH 077/286] Update index.md --- .../developers/tutorials/erc20-with-safety-rails/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/content/developers/tutorials/erc20-with-safety-rails/index.md b/src/content/developers/tutorials/erc20-with-safety-rails/index.md index 6ff4c3793e8..2bcd56c80d7 100644 --- a/src/content/developers/tutorials/erc20-with-safety-rails/index.md +++ b/src/content/developers/tutorials/erc20-with-safety-rails/index.md @@ -199,7 +199,7 @@ This is the syntax to create an object for a contract when we receive the addres } ``` - +This is a cleanup function, so presumably we don't want to leave any tokens. Instead of getting the balance from the user manually, we might as well automate the process. ## Delayed transactions {#delayed-transactions} From 58f48b7e07897524505a222513b6beedc6edca39 Mon Sep 17 00:00:00 2001 From: Ori Pomerantz Date: Sat, 30 Jul 2022 19:17:41 -0500 Subject: [PATCH 078/286] Update index.md --- .../erc20-with-safety-rails/index.md | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/src/content/developers/tutorials/erc20-with-safety-rails/index.md b/src/content/developers/tutorials/erc20-with-safety-rails/index.md index 2bcd56c80d7..457a5eaaf63 100644 --- a/src/content/developers/tutorials/erc20-with-safety-rails/index.md +++ b/src/content/developers/tutorials/erc20-with-safety-rails/index.md @@ -6,12 +6,12 @@ lang: en sidebar: true tags: ["erc-20"] skill: beginner -published: 2022-09-01 +published: 2022-08-15 --- ## Introduction {#introduction} -One of the great things about Ethereum is that there is no central authority that can modify or undo your transactions. One of the great problems with Ethereum is that ther is no central authority with the power to undo user mistakes or illicit transactions. In this article you learn about some of the common mistakes that users commit with [ERC-20](/developers/docs/standards/tokens/erc-20/) tokens, as well as how to create ERC-20 contracts that help users to avoid those mistakes, or that give a central authority some limited power to undo them. +One of the great things about Ethereum is that there is no central authority that can modify or undo your transactions. One of the great problems with Ethereum is that ther is no central authority with the power to undo user mistakes or illicit transactions. In this article you learn about some of the common mistakes that users commit with [ERC-20](/developers/docs/standards/tokens/erc-20/) tokens, as well as how to create ERC-20 contracts that help users to avoid those mistakes, or that give a central authority some power (for example to freeze accounts). Note that while we will use the [OpenZeppelin ERC-20 token contract](https://github.com/OpenZeppelin/openzeppelin-contracts/tree/master/contracts/token/ERC20), this article does not explain it in great details. You can find this information [here](/developers/tutorials/erc20-annotated-code). @@ -55,7 +55,7 @@ To use the hook, add this function after the constructor: ```solidity function _beforeTokenTransfer(address from, address to, uint256 amount) - internal + internal virtual override(ERC20) { super._beforeTokenTransfer(from, to, amount); @@ -64,6 +64,12 @@ To use the hook, add this function after the constructor: Some parts of this function may be new if you aren't very familiar with Solidity: +```solidity + internal virtual +``` + +The `virtual` keyword means that just as we inherited functionality from `ERC20` and overrode this function, other contracts can inherit from us and override this function. + ```solidity override(ERC20) ``` @@ -202,11 +208,6 @@ This is the syntax to create an object for a contract when we receive the addres This is a cleanup function, so presumably we don't want to leave any tokens. Instead of getting the balance from the user manually, we might as well automate the process. -## Delayed transactions {#delayed-transactions} - -It is sometimes useful to have account administrators that can modify or undo certain actions. - - ## Conclusion -Add extendability. +This is not a perfect solution, there is no perfect solution to the "user made a mistake" problem. However, using this kind of check can at least prevent some mistakes. The ability to freeze accounts, while dangerous, can be used to limit the damage of certain hacks by denying the hacker the stolen funds. From 361df9b5489daecda043946fe752c3a8959d756b Mon Sep 17 00:00:00 2001 From: Ori Pomerantz Date: Sat, 30 Jul 2022 19:21:45 -0500 Subject: [PATCH 079/286] The source code. --- .../ERC20-safety-rails-Remix.zip | Bin 0 -> 11989822 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 src/content/developers/tutorials/erc20-with-safety-rails/ERC20-safety-rails-Remix.zip diff --git a/src/content/developers/tutorials/erc20-with-safety-rails/ERC20-safety-rails-Remix.zip b/src/content/developers/tutorials/erc20-with-safety-rails/ERC20-safety-rails-Remix.zip new file mode 100644 index 0000000000000000000000000000000000000000..4ffdd5ca01c8712a823e0eea66b896567b4be189 GIT binary patch literal 11989822 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⪻VVa zL0iecwGlrT>DmhBE(02)qFKp*=5q$we@5D2tHNX!(Zdgxd@_`dD5?9d5Cwsf|_w3 zBkKUh%D7NQA8ARmMcVt6@?K&qhoMLY&aGUeJwWJ^p>#U%9Xc;i)4MJH&(t@CVb^RPb$^a z5QcxvQ@*kcrh)et*1ZkL!9_OzBzlOloQ!6TX=WW>H*IJ+X&luX*8DsP>kwJmM=(IH zXcGw=tNgp=uc$MohMjoF(?zz@)Yk6BjW|xSYUoTnkmI~cOE^b~$dYxnh%BQ&-l!6! z29T!fBBxE(CM8d`MlV&?QWkJkTY*|>j#Z__6mugdb`Av$R7)6|j9r{wHkD1O8!C`w z;As+Y?KS49mMx9)Vt>6lo?Dr4(_LPFRx!6~c+DA@76F%K^E|SsD;f=Si{0Fgv8!FE z)bQKX?=WERxGvX>Cdy)M`Pq8~wJXhf2{V^9+lH*E#;(e-a9=BXLB`jtH<;YQNXIM_ z)x0Nr&(YYR>7KaHIrBxN6I=3kH))FDO~o&oFIS*0;6Y7~Gqkp~5T+CiBb}Co zUrMv8Ehqzs3s*MwH`$@6BhbqiqjfAEG}?69?>$M z0j-JZ$eGe5CGr$R2gUP{W3hg(=WGnTuMmUH7Gx? zkhcMgNy-zi^3Yyf+kyTXt5h=`Zq4lxp0|A%)C@-)bCcDTOd&p1L*oe*0vQRIYZ|QYBdjw_11^Y z^Q4DVu;ZdN>LCN5bsnty>mM}1+Tzqi^<4QYP9;%#?BE*pG3r8J z92Nam(&EKgt2b(K-od(#W_;29P+RvTPlIts50vlB|5j=y%DIb2LUEc``m%fZ!Tl>C zEAg0%D<9QjWUtf_=bqH|#AjT%WTYM$&A_hyYsqoaIW5VM(RjV}5`R5v9Vmlx(2~11 zt^N_wkd}g2IclY6*~el$T5s(i6{r9%tl8-hWvQqrKr1g$5-T6I@RP(3eNeq* zS(L1WWAnK+K&3Y{`*o%RMBK>Z(uoe17~WN>zpGMzSEas{9Ve)bRi|%xhn;noto%M( zgKeQE0Q9*~9i-z&_~Q>&PhVQXcFgUlc~SeB>e|NP3^wdgXc|h%X<3zCdKv87VLut; zVBC7^O1PS12UYTLVf;oIUi8LCAd);0u^b-CCa~5wmd&ztD#AaTW6C-Kh0$4-p+;JH zcC76&DRG$OVe$J}5B1XoA?3=Nsz^iW1MTdn$RDsWFVu4b>p?5&=i)UdL06kvv}fba z29xDQ*`Cqhq+m+{CxL$U%1Z%SA$U^sA#vqk*pj4y!FizmOioVW(WI9xcnTyEXivY$ zCMCx$ltL_Mv$j?=dFPes%=UCPO(F2q$LZh#G6zQsogJvX!Gl&p6NHN7^h(I!ffe;Q zU@JQ&qSFvT;T|DQ1B18JBVS3TbraZ&~iFfZ|%z3{^U zmZ*KOq}RuKh`jDK@`Z@u0u@$b;1bGGwerD9f>)#BG#Mr+VsgK>e@2~mJeX&*Q4+Z< zEMSn+i=$q4B$PSC@pv$Tq7)(`{~$>wYQUe9by}uIfV}_2a6EPV0Z$)&7#bD>lun(6b}dmA$(xD znC#3e6cIsA5v-;pZCV`m`hEIRE!WDy@$uk-9tcX$p;|F_dMsKBY>9OZX`A9g&jHDO ziDK&yoeug?4n}0gevx=#03`xW6Eg@xB*20`puJcIOhJ*$^BORUVv;^JMnhtpv(2be z9&^)ytyRHY5&Y>Q_;vIYp_|2Xa_ek3g#9A9!OSOfs3nT57YnpC`B2;A94%m*Yr8!= zJsn_@=vW4qW1s17u??cErB;suA7o!q+jN+qV2`%2(!UW4RtlBEe3rdF8PChsfqwct zhnc1_@1*(=GJ#ukih9g6C6C7A(-CS47roQbI@0g4{5?Ba9}EvSP)=}<9zS%W@V|}* z7Y{YK(Zgg|JnZE(+_G2X@9-%UyQrY|D{0N+A{mmegJnvRVneBg=G6BHBf&Zvt$9`{ zXH6S4Ix+$q52Xve2RI`dADjx`X*rJ5I!x+Kyb6}iv0QItEo#f-!d!S;42veR|`T(`+ zMko+ z)r|WeU!$5SbRL#d6Kx0SZ z^iEDt-yd$<%yHb(AfcmnMp&GI+C-lI+3_(Gx=l-)>~hoawenU*1)sBC6@|e#Abzi1 zN!}9*rHz8_g_kCw#h2N^k9HWL-mu@ba)R{reoI9#+J1^6-$7|r+0lR+gcsUWp}6Db zzJ>LYQGqtf8%Lhku`!sp;%ygc>`jCWdX2(!Y z4?p%%y)?DTdbOoZw#-o*HB`OOO?+0^lf{epathLDxVk{zn!z_vD3s(S5bNFb&foDK zA;k3p^`}w)7}Zv(fa!74KRiRRQt{p1;JAk%4obt~jXZ55ucJU+8vJ;NP7<7OxjY%1 z(ajIC5)E#_=;QtpaTNqUz&*E^GWN|E!Z}lUTA~}Zktup1nG+9LUMBDG)*n|d@qRV2 zM<#&LVFdw91V(9qe=f%I#`%TxP(hzMdZ;UD^uY9|VrUI$ts1=hwF+G&C{?LuecKeg z;?5*^xtmpmZhhJmI&U>rao2HXh#cfp)5d(=6u#QQtb*4^!>iEsw@ra-!3B<5%EfwH z#D%KR^~cwO&NWM}30o4fN)_v5UllrkJY#yw2t~EYS28<)wHd?ugoEWP!B~{_AeCrR z+=P14v)IM}`v2OqU5k+oc(G<}sHX_JyokZbvkV?osinTVmMF`*8Pjl)9H#Vo1LeoE zX;T9NIa0ShO=u3lt%$@MFoZV0sz}(vYYbndVZ|L5t<}j@FrRGblsweoS?!g-5Eu#< z#?+&b<`esF)h4{|(&VZb=?RIvmf+ODT1HGNwBtoW6SCDJt+r;Ww9sG9q@OvsTW$Hx zP*Kj|#jH55j;}gbCz=bJ=gW(J^pqb~0qAekbZ-J;!f+c9wW1(afTGg{(@1mKp6_?^ zAS*lyEx~HUCQx&Q$aB-Iq`yh7SZ=OOhlVckgnTQRyP5+$0ZY4>Hd+nc(K=9*GuQIr zXuEdSJg!Va75=y~qZd0L)LpGbOD-v9R>g8DbzJLase=Pmu=>k-C04IkOgefMnEtxz zPH+_H%A}mvOC15}@O`z-QqK8T1=#7dvv>+&WF~_t5xLrC=DeuLpcE%a@B%la&d65#<1c2S zcug79G_a@J;;CC1Eq~7O-dkhOS2T8xU4JWM|4-08Ja=r-wj7%|6HS`~DcVv8ESSsJ zm`Qae`Q}!c;{1{!BuWBejUgXdNRKb(Fp`b)u|g1s(8*RwtOzCX=gkcusU!4ljwodKE3+#$deeF9lOA`f~-8 z1L1rGR^vl&5RHmwI}GmSGAW@d<0VKzVgHNU%SC$3e|G7<3Vpl54vd+ZH!)MS@R z7qjlI7!(ySmYLYTSEH_!9RSr$3Yk7G{vVf)CMn8+SSBf(vl{Zj^3h53Z#?r%4x2-$ zT4GhSpk~;7z#p6NbnM>BwgZq#;t}%B56n93KsgL{SdXc^q~JbVX+D{x047`*G`Y~ zF3oE?%}bI_M4skMs_SHQsUBwKa80v`b^BfN)}i6jUG^pCRf?L3-Sv- z`94kfnFIb-GqAvB3PtD;=OdT?B=VxvlpMbfQ_$0faSC~FF517Z-Z?C#YJuB3-Pl|& zECDQVAg2LHzUs!hTJ;hx;WSVxt0h6&?%cfZcp}X3#hNso;Tg?qT5B(-8xVURB6qgz z9m-MF8H?#=h6)o3YwoAhdS&|aDTL}~=b~nl(oKJliZLky6_l09Dx!$helmn?O0oaf z0QCVrtNH*NoKrmdSFj$gI~y`JmI^v-=ydt@5uNsc$m=JPj!0Nk3R}EAMpCgl_Iun* zhY2be2uuhw&ZChi(4v|W2x$c(n)Xghd`ce*=+gluJJn@))+eZ*d9Vm-e=M>r`6y09W9-hSAn`knS9oCa%7s7ag@Y< ziC&W;bC7z3&hm>QeY8Qu-T3#(FTIZ!>3;b1^QUK<9e3x`=1zZv5-QuzzTZA{kMhCm z7axE7&i%QcZ|`D@O^|Xv_0Gn<AGc9 zmSqx_oggVQzXZ5$(DgGf@f~ohh=at*^V~~9*A4QH?-p4AshgtV>3Hn+Pu>nT!@a}b zF8X_iKmC6AbU$ z`kf92){P))shg)>h`$S`Q+7L@G7P%0+fCeVn3l^4Vp_P73;8WQh!zAqK~7-edU@(5 zUHtB(83fKvLA|W&gn8FX+#qn0s2gA!bi3s=5npw-{HK|=-m;c@g_rCAF+RTwA_v@4$=cGRzX&elZSN9^h#1R8z=yA3zzrZ7eL{uKK zNMhoYT=|SMq}eU7L6CDmNq?lPxx;&;#*PNLNRigr(-Zp{7La?WkPCZ&61D&&3kE)t zs-Dvgty?dUq&z|6bqov#uE^ib2Aq7M0U0gbLo3rvGGiY z5J_}$h7*Ew5x(ckR+5>8IfaR*W zFa8nfzETae=NmiAFDgEbVZveUMjKC66|61PU?R_JPgG_h^QW zoj|71ZBHVTdrIIjGI0)T`YO^H=&b0b#>Uw2xs%HHnNud4y7HRIquZ{KS!&y|(jTLv z(_JcW85?f7LS)n#oJx0$jEInl{h7*Z#)g~T5;mOOeOtIl)>nFC!dM4xEAN>ys;MCi z|I!|>Q59PG${3}Ar}f2OPxm$;2cO{jljtE**BQ+k4aYj%Xl}z%xJb9B`FRr7A+ofO zV1Q^(M~uC(sud^V49n1%r;Iv#TY1ORMYht^*6ziXP4hgW$jthgc+l;uE5u}u5}}O- zlq57XHy*+=`h(V`bh^d>YOFYnr&^@UiYkL#9xWsM#C-|o>hPk1YlVM*HLQuvSz{v(cRE>x`P4FGMxbR?ai1#d)r_6d=Zbk& zoYCQ`A|^FG&hS~S)jw^L8?m&s)U?)~qf6BpcLV6_mG4tomBd1oo%W@?Y$nEBeKv26 zt%_$DJS^ICJKae`+dR({S^34aeR5mVC;zIkoxGc9Abq_IU&We=Nimn(Ou;%w;D%Nc zEGTtdE+=3-!Ww4tChs+v{f%6e%0!sU<~xgZL)VhC#i{>zxK_%6vNO_==_%I~c2QR>Vl_>A_T-D;x8Q^ck?0 zd{!PZ14&l8^Y{B|SaNIgO~{vZLzguiaTY;V{;M6CYN}~j7bjrZoGJ@wAlh=OVa@a7 zzL8L!HRqTLd$2Tw(wJdHEhv0_9uWtM%N5WvcG!0n$YARYXYrtAW;09W{ z>Lm5HsUUOF4ZeRxGStv?_U6{G$co;%PK8oDVkuHZ9C1R3RRfoDq*G}-oRUIS0<0>I zSk|>hA}8fR%WqL`EwWa`UEXvPu*_LmZ++N2PkP6cXp4{OD);kX-CzHpc_Rw?Q8y?g zX&x?}3uj&UO1BYP7im{czkR8_BAmDCxyFa8fM(GH0zbP4ZayD)^HONb_A4OI@7x?h zsE&~fo-Ny@fmh$}GF8u-_N`#ncgS0k3lbbHCL%gObuGT}+F;uG`Jy#8-6u++k6g1_ zIq>(JQkntOliJ=pVRFx{4z@(MI{EVp)itq;pyX5s1s-gEmdQKF2@PT()kAsxVylJw zg^~52w+_^)kpo-?K1?njhz}0rv5x99eeyy**5y^KNWe4n(vr7_`d;hesFxj~K+32% zE(ss%TW9jO2qUg`Yk@$qlpzqkuPU{$7moYNQHrgPQY&Uy<#2FPE&f7l7w#70N5vQJ z;g46G^(GT9zO+Q1#d_=cSiq&f2sl-0ID<5_di_?CpHuaPN_`iD&j>{ZQ(Q5MkJno- zAwfVT84G-}BgE65=bAz?V-W^GiI%u{9r?%=3=L$ARA3?MMXa~BU?_^;&v426vEt8& zO1SCo*F=Ry@eK7OaJe)ri|ATBvPgTsbnd-aJbkn8j>ZZI1 zQn5+q5)ZPv?Cjb4nj%}!hpq7t$}SP5R-o!yd>#(Q1S%Gy1Y4C1(;hw>Ubdu>g|X>V zJyA&e1qzKy1t#?!*%_rM0SvZsM6%8mfm#CyCIpmfxRHpmj#RewLF>5pu^^cJmMr}X z^ial(uIwU%4saHF!p!yh=Yx;R$|-OH1)e)J0<3~4ryf5)BFUZxxx;9TTNfyeI)X{! zS))*q;-Ts!y0 zGH>ympIG#WR`ru^Dq3XSjn2!zy5){69P@Chd3`T4Dn3|~dIDqBU9pCNri8<+Mc0>iZSV>4p-m{q{o+d z);3WF3bN9o!TR!En-$A;k)9oH)7AmPBD%|aD5cXUm$bU3SdYo%pjTU#E#SSlRU z_R}mYgVH{j!+=aEriy?S+G%%EKkK-;Z(+S;gr@C9VdQxo8-sZmzcOK!va z)?RUViQH&WCKJGD<5d6?u_hYepNp})t#%{#0Eh+!XfY4bmzK zDY~2lPTw{KuUI(=UdA)4(5+9KLYJY*N#LfYP_+Z|byN6a8+#JGj=NT&>u;L^ua$CW zpW#^4{Ha3MA72YP*YLR}Y)MD~M2n*p_p3tZkE?e9>gg$?zttvR$?W{qRzHmJ&Zi=y zc=Spz7G-WoKTaq>J&SD&U?Z+Q+qD?kfER1lhI)#iqdu+;TN%nKwbXal5@lIOW*V-r z8%-gzY}y#h{OKxS{;n#+g@u{A3 z)sFQiE5Ew2vXE$kEz`@UYZY1kVkWLjT$5c#uWJeV#B5wvtSh|cbxsqq)goP`oBm`b z;mnD>YD*3bXxm-!$!dmt1rJQ>i5ghTYlX!?&a2~7TvAhiqPd?JT(;4zcBMc04-*7d95!W|t8AW)ChG8Qu|qiqlP+mPZ+&7? zC=r?j*337bfF&l+B&3F(avi8iQ)juCbf%#?7tGA9Ogj}Lx-|}~^J`VymQuU5exFK( zuY%QI)+;Nm9qegh92(@(e4EY$Zm~*bh5dM*;3Tg!>|Y4)VZAyLQP*A)&fpc zgpZ?zO^A1UcbwO`N_RSC&~L0$?4WKF*4D~oRmSxvGcEZNzHmhbNY-$xp z{$eJIf6mmcjFx9Qhr(}-Jzvq-IjsLRj=h#ydSBsd#JEmd>e*@=1{S@Bv1$HXY?WMj z;C3>!0HT*68pkD^1I}{3J|sJRc@{L11+md$D#(hs{57Z2e}XAvRcyI$Ah_gUfd*yPiS7m|rR+pIYVwqP3 zV>nqG$Pvq|Dl&Awy9z^nR24X}4J*F0Jds&C;O3--^=?BoEfmxw)^#>vUN&fzUR7EV zy%8CkId85hK7tiN6#)@gmWi8HT=?TEz6cPx|wHm9%*-DMS zSOssYSemndO=zj7#AY11*)P`PE)}WeTNYK;Q+p2S%!sWP;{6Il1 zeTgo*77tWfAiBl0scfp$U9>!L!nE@J7j<_r$20jDk2<_1d$3120gT&C!fAf2t8o`9 zy^ppXa0EpiA2adSD&~CZt1)x~h=;Pw$*_gpC}0emBVv;$itbMXf^Yv9$j_5p<5-sF zmGU=ghCLx?+>!}shfkP@bI-(06Lz`>eah}G>+W zLvEB1C%Gv>Hab_kP_rsnOwox0x6{q<(%eQ=x&etso+DWL<-TI{yi>^2bbNi6(IyhN zzk-Z5IjO{gW6u1X@JPhxJZq*F(0ovQn(q?K>^wDzj6O*|3jnA3K2%>aCg*11S*HtU z=3RYz*=LGSm3*^lYRw$*x0+~%Vbc;zhd~~>^e5dXt=GMJMM_Vnm!u1pH}b-EQ1U(B z*lzAumo%@n5!21AJFabBsq_cQs>ZE2A);BcNea>5qhd^JHJs(5b-B!v5JemIlOaeV zAFuWbY`}a!Y^j~^L^X-R3>F7iu@!9T;z$lk(;34Q=SB|(}{yP5B*LaIB^>I zLAQufFYr%zzczGCQg*+CES`tW$miZmK&-Vqf&W6V{qIaOn=g$v^$;G3Mjc(Zu zkj~?F;y91WAd1sY=z1k`UIMIZ-8d_q2>mBPmLO*g-FmK5Bzcdp6$FLt+o-yNL2da)A>I>n%Tvh{iY(BFOWdi3J+`?jED zW8ytuOuZoSJC0X)VHl;E6S$s}_@VD2eJymdG%WHoi^>oQSYhY{sS^}o+)ZOQ4pXNH zgO01jsu}fyH1fkd@PZ^t%M@8osgngR=#~~`7{ytd`C+FUbU;_f$&t=h#!(XcC3*!> z9b^?jv?|p5rT6h7-4CCB{`73KdAAP+{1`vrd>I6mLd0E^k3NP|X2Lml4KgtWYD5A^-$&1J>{BG(-9nVGLUhE@L ztt{PgDXMm&IP7>n5-vM#(9QC)OtWqbE@qzJ&3$mtFa0F$bkp2R{m_M|cEcp_x^W8P zcKvCpzJ2C>7k@sDo{qjBz489Nf7r;krR?Or^7TXx*;R{t!2^7!@1W+SSe zjeEzVjm7!xPUX~3!cOjV!ypB>vLY(dvW$Hwl5Ubnd^X0 zanMC#U@X;bg>0|C_uhtYv*_{no$=G}KOT+_`+oA>&cC1b!UP2;_FnyRz88hB-gJLH zg{(H1!&2JzMCqwH(&l@a=XjVD-8c^O+=DLigHGDXq9E!dQSO6QStrQ4N$wYUmZp*G zWO?j4VeCd(5H3ZwE=&frTLfF+#zn`;qttg3D1toeW?=^T%0Rg&ilK@Fr-a2q@-1vl z7CD_D_nqlU`qPuNcb*J)25I{H(Vlxah=Rdj{O0Ug`DSqR7|Y4w+spXL{!Z@x1fn-4 z+dgWI4CheIi!mpY$csaydB$D8Kq6_>@gqOZFkQPYW=s%tF)P7tOrgxniXe^SjvM-z zx~|+(Y$|MixAZB2JHkB2WDQbK(ScRM)Xak{#vJXUi`Yl@dR&$T^aA9Z^kM9}UHsoP z)w0J=_mZst#{F*lbLV3(8$Id$w*B_;r%&P5$&0<;e%$-+&5PeJ`<>6v{HIG$EgN2* zjt7UsO7kcL1#hN3Tp^3_-{u?1Xuk!{!AU#G~tg zm_>=n=cdRg?{wg$EvNU8>ka*tc1qXxvph*aJl9LY47LE;0Cu+HyD`kT>x8-MJ6RV# z3nq0?bW7;jRGxIG5c17Q8NGP3TR!RSd_4dD?TgQQ=YIP1+2_lXou6WVGyC!E$?)Zm z`CI?x7!GM;LSmO5)!j}}Yy%5`4H*)cO~c%EVo<7ZTqp0wWe$x8^M{Q21nyY@IgKMX z?!rpKUvZsR{O+U~oMn_(05)C7V%JOD zAaIhX8^DFfgqhZfuR2@)*0cO=d^UU%$fkrFCJ${Kfmn8CqKWAp1pYW=JPP__}=g3kNL|o z-XY@AQrHf&aFGTaX&ekuE8#_Qi6b&r%@%%vNAI}Ow65oJ59NKvC~E(x75H2q=H5NT zA)o|M&y0#UG+r$>TJJpKCFPbXbG#?YAoD12%`vJzq{T7y{DC%p>^Fn5M7#vA91GXc z@j&2dm9)60uRy1$VXdXeV`W-ewRA6Oo z{6QVwc_4^%mW|h5aovi+u(%(%OtkyWsOGwE^!3tB?20rNCac=ZlC-0K?t>I{)Kk;% zSEiB>(`tRC@dtIj0a9*Brl`=1a2QPsBz7O8c&0rTJ!QBt_kignYis^cK1Og(RLb(4 z8h*CNAH@9ySL$`*=7Z@j-TEGlC@Q=miUez-;-Wox)x;kB$3oO5GnBIiuL;9lsg7Fz z_-9M@WPLnEDZ8Z7y|y^CN(@k>Vr9xDZ$Rtu2kvK?*)@~q^9HLXuT6-l!K!a)uuy}T z;Vss_>y@c)18GhK338UwSj6#}%BN-m{RsrBnkP*zf!s>SH8sq7f=!sOnUoMmXl=x_ zFh~gYt2!3f3bW#{C<*gYl<2*WIHSXM;c6;M0&S@{fd$(}@dPCYW$8KXv)r>U#W8-1 z=SH!a!+)~xQt@6;6)#7%KU-1beVxh1<2o+}k14H2svMdxQJ{t7-aUO;h;{#Mjkbpl zo5$OV9xx{VTCA;AGFRiSZ+WF4$Diqop?f{2&SB*Ds9KUWD!jicZx_uoW+0euiMnwQ z&^5d9zU6{_Wdz&lTNMz=(O*C=+keH^W-6?bT$ZQ*6_HCF{aub;w$ECjmvGOPkfFd@ zUVTMG!Ho~1n%;~#=UP+4=+nkT(e%;YIfg!EDdVV-Hk~%^GY$7VZ(f;7)~9oP5{o9- zlW%G}5p47-RQp==tDRnI4GkPwpfl_sKxGcFyR6x~Se1f0!B+giZWI~Ub5N73Y(Sg+@OOF|~!aedT`9c3!vEa216n%jc@2a~1~rwl{jEq0ZCQ|%xS5c*=+PmcH1s&je&8)+X6*1}-zSZq%ex8JNh%D_R7$8@)LxhcWWsGHmR5FxdC*JXNk*zef zwR>@8(>#wTvUvDRJW%ONTkKV4zxLXd(qQRG^BH2Hw@E!1T8F z{BCx6GE4PTMQJtqg-2JzYc5h^5pY>H&r?1Iti@+;z-XDRMGL_iMw?<;2J9WXTjB~K z6XBV?x@sy~=Z3r!TwA^uR&7SyjV?4%C405VEsS)SwpxJ!ugTy6w=-Xxp6o+x#td@{ z(-Z%)|uNvtZEbnFuM9AXz+3D$^x?8Rlg;c3b z!=|%kjxAe}U&8`ssyrESxRWv!AvDpOy7{xJxX-kr!~~oXz*tdmr`n~^Ofx!MRm7yG z#~D7Wwfd(_Ya^DHmRd@es^bO*(AO*9s@R@|Dlg)e^0KwMnP_*!`87#HTB5Y;?xQA z$}JXzT322)Lb$YGv(~J`*?_fVn;RJ7@UQvey^5HK)dMer#J?K(rH4PqiLM>}6$3)I zHn*8Onj+vFlWOT$bPZ!CVQ~>cL#(A)Fb`z|b_Ejnmt_K1Uo_PEYcrun4X|wMf|LI# zwBR{9*Ri{^`2Rn9Z{8h6&h&}?&9}%?bMGB^2khJz<~(y=FJ*9J({9@sXy8CDO1p4v z)M8_L`0n>7DWz0aWtKCI%h+x|GjCJQR7#;xL?{%BWl1~!g6%`u@N-&Jq*$Guq$q9G zD}@J(IFAZiw0T_XfswoZBj_eHo%Yuryx zLslW0i3qvKv~)D+X<@&R=3Zl>>ZvvuY2yy!L$xz|#Sx8=PL0W*pS;zI_Id3L5YW`a zd24Isvs_deV*}vxhh-r)1)r?PGYLzSiLPnNQAiu4+T?_2sFX79P$0f!+szk^Ut4Mj z?bH4dH_tyYkA!`29$wIY$Cw@s9nr!O(PElFi6l?89trys%utKy!~S^MBZ(GWXm7U1 z^y&CyaE|9AEZ2m6uF+h~XvcbId*^UO&;bBLdev!nGG5UR@dp=0S_ciaH~Tx!SQ-{| zJtp6#_)X|+kbC7B16>=2oe{=62`3r}ArWJb9`a_+tyhV=O$4FkYws6rgLJzV=1L;I30(`7jy84E!%_6|(sc z`rQlK)BIuqh;vL~tnqIdv?UW)JBtRB6V@4>W(HM_j$i+I*nX}qBci7%fg~(JH=_@V z4T;o~$z(W2f@%;x=?;cuw9*^==ybc`%3yT7O8U><9IPUh`*`&&iB{M4wpT$B2P7QD zCn#hR_QoH+%slw=N&6!_3lHK^XE@Q~ZivLaLR2VM3bHDfsBw^05mV#_c1MMwW(poi zURl_A{nBDh$IU8?Et*;GKvJBes5jPh$h^OwrIXHX^J|s3sylYpXZe8QhEYy0)8eY7 z;y#&7N02~}@u0$y_9eUR{Gy>RjjkzV4(C+xo-l82Ctpe@tX>9P>#Ws|AL@HO)b~Q@ zBesr*`d*jU_bQWz^iZ`xQ<@R%v~{_-5#m7Hz6r5YEpBGIp6y`qFyemc%EO2b77ruu zZWf@Ze$B8JRp5B`5~`+gt#Jg!tuulK2Zd%ZO0bGl-Qv4Sa6Wocx_*m_f>o*n54FMg@#YrP1}hVJ}8G7g03p9gmQ+cEWdU4>W!76 zlp&!!Ax0f6+|?pvIW988;ZI?4EJ^5*y=tM@l|s+Rqc=wStS-wan_GbB4FWA}rL=t1 z5)Q|kB$^&?(t9!3y5x|LTF0bMRYj5<@XA$qt;RVbHRS0&HBC@k3d`T3d^?D~!d!zd zS`rB4z8X>(nEgz7I%d7^hC|kRZsrLYb_W+ESzp2wI=$X>Lak|)^SGf&9*5)h7zM_F zZHk`$wA+x})=URn!=|sH*(i~&k5Lv!S1$Kags&T32z-h) zd&+K8`J_!0H8E55lQ|`%Wf2=iK!~frzeurY0g-8p+967NX5#0(m&SVR*seOHsz9_* z)*`V{dQSOzRwZazfrT0lk&+Ov#oH)5W($=hOveZs|DE#<< zK|=UHT=WK0T2+wed_slA{%|^>4`_odwNv4B9#(|MD9H(fKRAz#Ldl&y6r{S%E2L15 zfMVmHp8%9>z9-5AWa*k%XYwN!^iL=Fdm*O7*T6?+sw~4tR;5%IomzINhSt_5P2 zK!=Ke838D{Se0nhJ_chK9$lT=B^jw5UoKf|$|>4AFGnZIBHKobU}x=qiIn-x`+UD_ z->BQOpiLDUJTkl3v1nJM;iD|6OtGy>y!pmgprsj&oqeCV3u8;;o8$~dFzI5U)|?7z zabVemLCKVyJo5|NDyaif@f&eGlmcCB)CG78Cx<%F3Vc-qD_T^-N`sMV!pb($8GQW` zp_la4gscm=6X&TqXe$M}hy>ZB5^=fzY4OX-rM_+G~Fvw>Xq+@-HI*=!}GB_1k*7`AlDo@@IRhsVSFrHM`X*>g7v>)fRc7g6%S+(2cEd=7m^< zt&!L*)%!BHlVZ2BWx24D(m|yXCEBLgnQYBuiPYVMMeN29*g!v7_NFEAt0M4{l_8QB6vPtCvH_(L(G|0&b zBVVF!l!j69%=U%#4@*?3jLR_}V z{2QdD;C7W66$Na8XpkEiXGVU4zeM_!@_um)*`!kbEbr9YRBPhbR(Fh?8Mt!s_;I4R z1X3Ytpm4I2M6sKEB}!MwyR3M`Nh49ErneKfLXJ7q-zlt(YUy9a~G}bBV`fG&~bAb zb79wFm%Mf0n~5zgBB+R!oUy8?wZR${pp`egw@m{qLYaHR)xoS3AnN8+#Heg?9aLWe zE5CxjJ;0VpxKdk077Uq*10MT`ivciL=5fbv32s-|BSZ5kF0vVHfSEnWq8&N#h3kpO zPv&Rz5a0L^-$SV=~drH>2D_-zA`tzdES|EY!(LepDV?F>N^0|9wLicERK^K z?u(EM|G?V4=N*ZuH1Q$4beOC&(YLS$N}#h{zeHGFJ?xNUO0`f4zqo~dhL_Go?eQVP z@FBwRA;M6`rXgM*q4u353q}jO8h%6hPrIEMDGE48(lctAS~4SAX)_@%FXGKJhI zkry+)%zioBqp%P*?@@d?+oLq$mCdn!G~maN*A)+lo<3)&&&*H@JT%?j>`J-so8)j?#pJOeWcDfT9 z4L|OOL*z-CAn{Io681aep7xkY*lkJTV)UO+viR$X14OX&_b|A|uhT&1+E zY&u7D?XN_5OTEu#*O&f1CKDQ7OT$fI*g{Op5XrP?E~&$C1pM&F|BVb8{U2mFBnbXn z71rAEeER>R zqC4m(^e15Jc94i^)FBKw3ap6G;ZRWnIgOrt$vm9Ud1siSDQ!s8Vf8vcMDPyj(}+fD z6B98uqiLV^YU(;|J|ewvILy%S;S<9P5Aft8)tax8-ZGe7X*o$+HMeej$x*VSF&-UHi9_SU5p>v zafkpv3~L%X_$)%8qZ8RAW*sNzBznF|al86gFWMMwMsEzK9i``cN3Yh;cQ?Q74yJoM zZF}I6LAtf^OF$(YsHvqQ_%O=3EZ8^yY9n0jbAmVsD9M~@?i zBvI_9P8`IJquY^g6DRPazzCd3CywnI8CliCo*lWClh~#mx=|V-el5~t+W_7ok~(e> zN3rF2zU=|8x}G5RFb&)=uu_Z)r0R$W18Eho_jl*?JUVn<{P_NI%`@8H*V_H@{)V~v z^3~?Cagq%7cTT_lVZ7@no4dG$YKFZ_Sg(W>{nYS5fNo+T=FfL@(})oxX+#zrw}?ZC z?pRjfyP#AMVq%$oVEbu=NIlE*W6w()A(OaXN;|gAG&TZ6CVC_>fyUTMeBX%D(DRJQ z0D=3CO$-AOb-M2+u^zct*T~Z6k-4{)_~Q$A;%uB+=NsPJiy!Tc=;+1!z4XX^`?@n7 z+iwOh&C!q8yBIb_=5&IjhO0c&X*D&bjs@ayfT{q1+M#cQdmJy;9Vd)~M7Q14_kqEf zP=fIYINtRQ1L2cy=;4z_2!yam5q+E_v1P>uVwDjT9Gj3AL1g#{I|bSTLR>TPBSa*c zKy~1lCLTptuh8e=fdy)e+=DIi-HtguID6@yI)5B|oqV_74Zi)bjkS%_lVt5=61_Fv zpIG~y_q7nnv9^{Z$T=uPehJ-~fILV{%dkTHUt$|ThT-T=YDP{NrAh3XMqor>J_^(}QrdewMy9c9Ivv z(b-W0v~3I!*7SW+O>M*^mgNx_LCgV3-N^NIqI;I*$970{ob=Xdfw?KN0ErT=ZVW$V3s~T%& z0G!SKk1~*fzwDf#n7Z#b!+GCqP^s#iNViWN*aiEoeZc>TAS_)7)(ZCI(gRK-ownR z5$U?VpN5G8MGjgOq#6|DGz=Wjnn@hbNgQl>pc9aXuLGGR1@jq^jjh9jcH2zuK@)=f zioDdoE}MiQkY|{o6JsxcH1HG4vy1>ahz;FI3`>uF=z3skn?RZJ^oYA&6%cvUOWmEL z-E^zdK0SN&e&@%*nH9Zw`QxJ3ej8Y8@tf(^==GcAz4dwmMZPv7;WjiHuoS#FIIVKC zPc;q`Ll1x{q8obR2WbL{hwTqJBtodQ1aum>M&M(Yj19+dq2@tMMwl_gmkH?~H6q3| zf=uueD3HF9f-ck0Nj*DEV=F~>zU^DF8Cp6tbQ0Jhwi#$Ej$znf0qnyzPgqdE;orl_ z#OU|l57wN6Pf# zff>F{)0-fzMPNpj=V4;dlc@rmM5cqku`#DURAk5YAtFP=ccQe};UgkY&2eVIE=wF7 zYC`1u2n`dY9s2m~MKKN;$RPq~e9)qAhK6nHq3hc?`ha2BiWQK!=WSRUFO&DdbhKqB z?cFFi?~RAX`R@0ZTWn@80^-LuDg0fr9AZ6xEU9xk&AR7P`h2jg#P2; zP!mM4hcjT35(m9Q1F+&C2z)P0pb|n5n*nGQJmKnTwo(P;{k^dpem!~NZB6#yzur7w zk5Asc_JiKLefQR{chTb<(Bd ze5Utq>YG8D!iI!bx&qm_J7Afvl%y?r1)IrdeuspA7%oIU7A1vr+01>V|KBomaaX9; z*laDFzLJkdoqlF)dOZ1@`QANcD4E8S$9p0V%V0#F*oHvSlN?7GafqD!ykC}UOpr}$ z@|l$>$%zXK$TGb{Q>JT(IQwp)42rV8>`MjHJmKh{={k&UEKQk_gCd(@#H-Ay62Po8 zmCTSKo`Nn>roNNJDS*h(s{QBx(2V!Mt0oA0rGQ|ylevki>8KvHm~%FVfOlE7RORTI zq4>&~GpAn_EIBvcgZiorVnG8+-Z@EI>)kl((&Bfbr`=aF`ca;{1Uc$uZ60I%9@@#= z5u0I0NybNUnPZ1-sSW7ERy3*Kh62$~9ublC$cuiln0OHzw?$W-h$0gt0m%&(hlV1g6;X=Qx$C>N>OZri6`O7-v zegoN^|8;aF909Jv;5K@OPXX*?)PfUq5dCH64tmy{)Vc7_}Qn(2Gt2 z#fGvGw$rGCzl2^XciKFqCf@Svej#n>!3UW&m9GlQsK_lj_Z`@SMd|g!?qR0d%}bHI zcBMEc;=rDBd%huvPX$zh$sZ{yp)7GPHN81;EH@aIK}`^uT*SMKj~r`q7HkO;?90>$ zQe4%N)ycvI3g~Bc3y3$qI*P1RH*4`>zBbnd%ZE>;&}6BI3h#vGkO6})uMwP#`YOQT z$&5;&$v?bCX!xPF0+>88X(>SR+iQe}9ltBUk?EOAp%GtRBQQcx;iWJDutKyn*6Z?4uBgXQXq5U93M^S*K+b}ACqx|oN@828giBF&d1B#8INym}evmE8!J}kG!%8TTdN%eX|GCZ(fW*{lwy7DUQvl>_PQG{sA$vu~a za;D*fm`@hs$l9e^k17^whZBz z1H6d37VKr$q}K>ZoG0>lpt3okm0R5MWy{(8x@>jxWCks{!sv8O2D##pOfpprcwJVm zk`XI(R>fjNBl&W&RQB{nvNXHB%{vkaeQT@Oi=<87tpcC;KuGwyI!BgwEbnuP3Wqo? zmyvdssyl~6nVa}7pIhF;BAF&|lDE!TNy!pgI;QwGA5;7)**nF3WZu*5UGVETQwdbu zw$p?ll(GeHMqpxwC5tUCc7I{9XIva}s?7UT$iL{lAui_CySkFI#EmWU!;XdAY~3!+ zdb>ai$6hB$s_ywk>^Nn_eC<0Hi26j_^yWl(d!^WQ*hETrn^}k?!W&P2ffAh~RpIO_ z8ia0)x5XwXF#_0y5v}o=N6>!>+C^U?dsdFD#!IjW{abJ$nP8Dx{jlRNX~$o%eJC4#PK$~ZtFx07CAWH|@L=P++{SmU2gYyA z_b^|{f1QNo2-qb3L9f#!V57J|0Ews{3=mmSklhC6P1{h)+MHc zyL=6~03U3o<@gX^EwpDXs_2q;tI%iRp;$mlE9xzy7<%!N+}L4*(U%${lG8uCU*%Dqp7`i^$sf;6LE}~*2R#dpe z3NDmk3r-mMY#SacmP99I^Uo^}<7I?T-4)1+LLkVS7 zUsqR{=H_QTxS_B^<)i4_A8IW<)LMF|wWP(} z5E(;-^ib~TVCx%CD0hnl`dQ^AMU-H#P#B7*!52d0nfUzY!p`fLV`@5XR+VYd%yN&c z;v7Ydrlv#Y{Z&jF*|}L#9K^ol0=bCA?S5y{3A@OkE#zp0^gJbfBwe2jR4IChbnH^j zcE%dbQrAg4Tm*kXt`i=3qpfO5Zh`u;qOD)xK^jhxznzL^<)wyRkP`T*HXaCgX8R4b zAsHdB^W-_Cd_D%myrHAS%m|yn5Shg(tfGsEARiK5|G#wKnV*6>KC&Tb5z*o)QdZHt z;)xbrXf*BlsFTo6{+Y9=mE%5hO%jpw3kywEF3t>zXML6rDBL9^X=R6xCzZWly`WYZ zk*hb`*E(yp)8$#4R0Z%uDV^Q+Euoc9D`(`u;qq`hKo|MdBHlCfT<_~ zE7~U4P?#RURFY_l5;NfiRSz88(nDpVrWI%?&JNKjJ5L< zf+G%H_hVTp2Iq1TPZ54iRlD(^2i*$!@9E)O8=&Qg*6;!)$Zu%F$(VH0r&_mjN@$;b zZHhzsF$E9F%xP}Jr}zNfDc~`!tlDR69Lb8j8J$i6LhYrS>t-esi zj7T!=Ct-h5N>9u{b2;P92ygaPIg!lW3y5lCl@!AJt}Z%O#*L-c-pi-40fIONHPHpg zXnM$a^RP%=nlaxxlB zk59_!WCiVClXFG(^s=wVJ^J~Gk`4NYK`A2?RdSS}A~Pv3kOVV}mwiyaeB4%6np8?T zAm5`(ZKWtJ)NQLI+)6Cm)$(mQE;2*;PjOFClFlo8)k5hl1w%+sIYz$LE=#nVn>Xpr zA}zC}w0zVOGIopCkvojuu|yuq$l%C_~ae-A5S$>})Yh zE3AGyh`y4TrH__CAT{NX!oV^RD^JI)_uX)a{#ybC5)9adhTXvhN!FJzg-)+GolsM8 zk=J;oLYY*X~~r`@hVbgN5_!}ww?U)RE0Zn)ltl$ucc%&3?ya3*5`6H>rv zh$LmTmb? z;HrUiE!7Yr#<&^Py`G$hIADVLRAtj;sS~E2+@jlBSje-Pnm>h zFV0tm_GaQ*DJoW#v@f2tT9E_7K#_yFmUWLeEiXZl3xk+S4_tXDK!kE+C^n-jPCuY;Gtj{%2LhsCp8Y#>7kWXju1wKGZ{7S>w@LDgegs9BNNsK=*tI;)wqtiVEnhDb>$ z+~RGNJeDn#i7*`_w4_|;+lLVEvKl0%L6jNewJSx*#|$J?L`2oa6@SJ1Uw98CaRn9T zQ2&sYyrDH3x=<>osK>zC9SpiK=T1=l0&loiF0cQHRFkx{A_fWJVsOzLOlhe_QA?8N zeaRYh`YcOf;dLGhi^r&`3SS;p5E7$Mu44}c$87WRC)8o7*!brswfUZ?6OiSFWFX6r zn6gVJ_!v2Hf2+*-}i@4#on_}?jqK*&S~4a-DgWV+dYrk zF7~c8t=l^{)690Br$sCdkhiYeKl2%z?Ouk{6?>O$>vmpB53Vq29Ia`m74<&7b* zfqt^=JzwHiMc^eXQIPqD!YuPswllY5<|m8_-G zQE_!;lgb5dpbHmhkdqTezC_(9+f$1$iWZe1{vr)Z9H?lzTwO2BRx}qE6*sm#w`lI- z(&aYJy>zkUtlBn)?ZvB$#Uw3dBxkNQYVaAgjCI=G1nDvFa0JkjZ3JbOhYIlU9`9kz9>SO=OUOz zOBo%Pu1yhC*th218kYRF11}{k^Px)n5-kAwx5a0b=DfUy};kWh> zSqOe{oc!)bID&GAWZ@57yZ5{!Ih8!Ve!iE7!1`if|5XC(`ARl%&7NO}8FI`z6H6%U z_L4R-?XhG}5b=U=MPUJBU$XmwFB&?b0dNxp6H%`n4Y6}y@^j0VjPO-kaxM4mOXs5Y z_z)TY5E=gv8DBRto(mRg>nPLyW<&;UCgg=+YjNu!;>+0{ zrLnzij`gG1KYqNfICk{(ITMB)8?}NvE)|1WUt;>))VTnSLXa!*rOSv<=QK8Fcr9Cu z5{T4*(z>DO>WI>Cdf9l*qt5v-i-KI{mu#Or1enu6@mmmJ&X{JQgQs>8-PFr`+o1;E|)2ys4Z8B0}#HksQjYbo&01E{j_@A;1_Bc7ik{(W*z zkWYb%KCvOu^aC-EUSJ6o={u&zV$DaB@rrgxQ!QlbJ8~sb_dA+p5s~j*5}qLg0+KSY z6pl!1Fk8o% z$74dYf3_uwi_w2R$&X7%I7}r%3_LBK%oK1+=ECPy;E?$bDCVBwVj=AuSJT;LpUtil z{d-I%6X1n<*28$pqZLD%QspolVV?Z)e-DPF|AP#N1kvNG;(lZN-}Z{LqOa!pQ&y1* z6^Tml^>|faiy~(H7t4RKm8Cgd8B?b+#2hYY!)J+907u|cbjaFwkt>h>1l-+DguE^t z!T_fefzdSN*M)Q<^ty?L=D%bfnHZ`wOwp7!91I}@kS!0CNL!LV4VR||SP?lnn)Ye0 zrmoZGNXrophZ%}Kd}27`*#r3ZwQ(aRo6R0WpOQEZPgz(9jR*anhNBE}8Z z2uVzm&<=Dju!F?0yu{Xn$hK^sxRGg_kr{e+WQS(rxG~`&7+tVUf6O^&cl(ebYdY%E z8GQg=e*Abg3eTUfuKKBOBWBm|f*^5I+YKVmG0YTEs5YqA2;x+CF@9*rA)?1ItZC@r zr6@^kC$b4x8^}q{N%VY`;&%0~UbHdVjNTYdJ4(;@j$W;w?{0qE9ZdIj+V;RBgLG@- z$KkQHyR$#u`SG#EFj*UUlKHB!XNQ)jo5XY+H;Q%JF!j)KECYe;jvhx2Nut7P8{1aGP0_NJv(wOC$UXCbfYvvD08I8wgJ3hvvAxXj$+I4eA@$F zbv;2~dm6Z5V5JxpNYxSNJBz))JE!N-q4VO$_m^v)(f+>H?vIf~c=P3}&12&v8SL+z ze*MFE*H1Qgai`l1dsS>%jZ8l^d=Q|USP1|29o;lyL|7Y<1w#^X2+^pmyIkqLhZMM+OMocWh!Hzg4LF zZW8N}i*=1GeIA*6Yl%O;a3{{jsdc{Ly}kI+-iVG~yx&WY+_$eg)3N<#@X{Rph`o#9 zbs@7<#+7h6W<@XymvXk@m=Sn6P3_1rV$fzxEGNRh#PlMAgn>Z!~yGgX&9IwR@aHe(G9Vd)~M7Q14_d%R7p}go32vgTL3?wOVLl2)cqD{!*6j?)( zB(|*BK#mb4^N3A|;vh17q>BJW286g~;ztPKH$laLW14srffYjEokw8g9&DNKcFgI) z*-Q7-`Qza00ftZkg0Bx@&==&kYo#MWyQ-2i;=`=Js0Tx8XzI}0n4=wMh-T@n+Q zL}?mW*xURh4o%y3T-!?ALSqqC!0bjQ)Qfdp?5kJV@+Cb2A!xJW({kkpM_ zUnja}S$=E>7Kum*lwsFo+p=jJhUvRL2otoTV;`a!9U$rJqRmZGJxNkXTN0#>Z$j=R zX&CxWjL|`1x=vE;`=RcHR*I))6dO9$3DOr*G2j|N0d4!Q%=gaw*j<0+Ofjsf41tp*Cbmb*_98EK zZPyF2uK-uEXUBe+SR{#~$Tjph2~6Dy3^%r&MriY)#bCpAp`I84@$|%vEF&}sI`(5H z27SfAoa+YA4s1Pz5{1k#P=8`q_w1x>19`g@b7du7jnVpU{*T<7Ii2}V9msi1MsMiAp#4j zm4Y-SkPD!5&ke9bP!5a|9*x&u9E5TI$oOOPhj-eE$6KARoA1}Ze|I)|I|pCi9Q<*# z^X;PV{dj4;Xn?hNbTOO^jz{6}=P%R<$+}(x*_nA&61IED)i8e%fSj3K^ENPn(<)n(^2f=uwCTk5`%f-ch#nxh@2v6Z4b-}bH8 z3@sgp9}?Ihwi#$Ej$znf0qnyz*DDJ+{ChZ=82#S+!J2b${PnzlaQyb$@tcFq?FYSg`|it~y`vwaz_ZM6>6_$r8nh|$ zsC7oQM2c)*a0DNWkWgzUyny>CQgg|QKiLaB`XKT^ig%A5A@}5DJHb2K63GkkP}sj{ zhOgQNjH)B}{HgJ|Fcg(o&cu8k0Sr_GB3%l@XL{+Yz8Rz`%zAjGD^QQS1D3r~$$<8V zr3av0Og?j`Sp38AB$AscHBZX0;w$~%I;;r${J1u1l*Df;YBKxZf)We@)x#n%gAiocmx3jhJsN^+N@t9#R$4$m?G6O3k$6~tA$!Au| zF=tp1KC-h8Xnhk(xJYBuEtHB>_=0_@;J43`x&N82!#2!Pwi-DovKd(6D(hVdVAh$6 zyHmn)*-CO!-$|wxKx9bM{_}ru&olzfX+k`#6o^mlWNxBrYR*S3UbI$l{Q@#BN6(C; zsGK>A_)x);bK^azugV}6;#g!>#L7#)Tc?TDL6}I+|HOm_C>ReUp~$JagpwgPJDe$f zt04A}gqSCzl^ew)wXR~mS(t_!NP41@`gVxM!j^%Ixe4xa)NKRr%Qg-?F55crn1+Y( z&4UuDYfEx@l-GHEB$*o@G+pHaf#=fomlnB{d#<+5mZB73cDHYpakEGc=*74)KLC2w zRpxB+SmBQ%?+J#*@+;(@^CN~9`jq7=Ep997+I=NsGUek-5T~jSXq~gibs|ntxiH4< zqq)pyxf$kEg`t2swuLvKD_hZcZzX!*ni9jeqzXMofh~mGt&JXusfAKEaHXWq85Mi0 z(9f>4hl-E$3Dg(&+4gbeak2F*8a6MjE{gPK|BBfQZxv-@ku_DREfbc4r^J%H-amlVNWiY~vpPowR9bKwmymZ#sqoB%X-Y=K* zqBy~n0mr*ia&_lh&-^-+_LcFEpbMzV-1!7>8T=im9QI${s=fta_Ht8Bww0A?m-OF4 zW^cR|dZwI4p645HxwneoczO^*eoW=7f^v%2ECD#)v&63AGf*gt*zSkj!%UmYT$d!x z(~XZA7(m0BTO3Ms=KPj#bmB|dxy0i#V4B_AQmc@$5*GAOXWwN3K2r2CDu?9@4S>C<){{4iYeu1#gfTo z0!Qgdg#S}Xr+fe(+zH8Z3R4jCj03rNkTfWAA1>gb--wYMt3~1~u7M!hyme0WnEWr3 zdi~K*&b~9c$k7a95T_pjWWL-vxR*^%slB6+S6<_uZcXYqxuRFizr{&08&$zNmZPwI zlM`Pwosak~pM5@(YN5_&B)-T;62BC>pV^rS3oFhS;!bi)7OR@iLRsc3Ne>0TDnbN0 zRV!X2b?E94mWV5w=q2w^()INVD#4Lul&EAB%VAN_FTRzi6DKOg&L`Cv9BB4n@HwPq z*bk;dRG7^BY`hL)<^^O4@v)3`X9`I^+QW)3 zRGONtxZuB%oj{lo?i1$ubj4(G3_U|^5p+C3?jq?ARr@wjPzy;7*s+!-B4g2B|G>$_ z)EPzoe5%pE;7la`4Esq|-uEB==vfvMBCG!*uh{Uq|SxbkA<~`*A=GajN^DPMa5qln3PqW?TlowT4_06 z0Rx*^c07=PWI|O&Pt^p32Tk$%%czz~3(N{dJp&Cjg2&S?YTqKDN&<_D%(5LKuJ~<` ztfQ?!pHcTuA=jia4hx?nyv!CSzz{R6E+#JUGUiph^MEjvR8CmQW$laTjeJpn6F||0 z;?@VA9Y!qb3{JBIE}1g-H2b$9T(r1WGnmGgV?Yh$7E?i_90Gr5vW1)sfRj=T%aY{48fast8%RRXLdj`>g~sS%MY51fnz)4RRode(%AWP*2?|{QdDwo=<3HI2 zHw_h~ACIR!_AzRL=N+HX!}3$`RVO~74PmC$`Utifj}cRrRl-(26zEAfv8-r}n>eyg zXjm!zKBB>@dCL$XqbPuiVTZVZqadiWeacEdqX$;l8E{@`=YwfCVLj0gI&o*n0#Ipr za0>3C1z_Na6~COD)g=f~HV_g8;4z%=IjIDYXbo0D9H*7@7mDsq3h>n<4H4>pDSTrE zF>``r-hP|0??aJc>cD!%I?4CG$gtpI!BUiDTX2*N;Qy=^85ZrXxC69e>g?>8ic6l{ zR0;yT<@g>VKn&FmwpjMI;2~`V#8;usz9=xGDlA%v&T*-utK4I0#q4?JZ3Q8MPYDX( z3V!4Niv3!K;!><30PePxKy6goE?eTkhYZC%#QE`<=ThWMO%rGzc*{E;z3S$Y~ z=T{O{oqvM6EIk6UDQ#xzOr|6jzfnuaHK;b*2pxi(iX&HHT10EB_g8ElnF7Xok&~Ob z1Sk$6znEFfW<%sg{i@ze(aqTLQk-*RG>zeA;T1n*8! zI6(_+Tl@V4k)3*r_|L^cDH$W(0SG~%G;B zhXY~86aSW^S8Qm<<9TYtaH@hJ$IN(Fs_z`aLhkc|?Ql6JI{^9<>m~C$l_oG3yNQ6k z1V3V`HH~o`Kce5O9KPn!RSH76-K{u$eo&k5R5i2+aOW*7NLa>AY`o)nVJ?koi$_rH zOSwTOH+nU&rEXt>mCVO|Co73a^&2nTwo=W#RfB%5A5HS=w_D2gc+(<@UFNVuHm}4L}2+Z>0L;sZEMVFN?c?~6ja@=Ey6$zbGnBAt^Swx z@e)tzIpjb97=iuVM?yDE}wiL`geeQevik~=(GMrJo=Lb zK`RgS?|Q^uPLb(`emC)g9utT5pXdpFtOh0>yk8NTjcYue~Wmo$jn^oSYP5adOT;bhHMiV)bX`?NJ=lL8Q z+48f_^zVEEz=D}K^yyCpG3?cdOs1p$$3CVs{7C<$cz&+Y%&NTzmu3IZkNE$Vxz2P1 z@=fm2xM~}A2NyJGGb4(}PuR?8JBca;1OZh(M-_b|7LxwPMA@p*-yDr}di1Yw`kj&$ zBIv(|CNdTUNaln*Jjls`ydib)J4MY7^F36ZqIa?#ecY$RRNecjV_3-t8!V?UQcl+-9qDlGq~C0P54 zH#Z3RJl#hgnh`={Sq$_)lDQGy7JY>b!Eh~CcU=4*GC}AOa^v9tA=#gf6eR!_>4}j3 z%CKGCMv6n^F!@E&rhPgl{V)E{roT+|t?Ow*Q~Qax9x~uL79cTFD@76?G^q7I3wd^2 zAQ;eQqxk4KMP8npT2;BAK=6>RC*7M`dv6Y28lW!6)#OiI{#@5K-|Sh+e>VQyY;XLz z_ntm7wB4OQ*EVHiU0Z*D*p`2Kme&4D{$*R*A8&T|w%G&A#E5nqqG&+$}izdKZy(9+g-{@i%=a_!(HZM}(kFqG)u*XfsQ zTO1b_ey_tcz_8mdwqN7-25r5uh5u}>Nsu9Cw%iRW zW;CqT9>ofU@PPe?KG;~>*=g@<3XzUka@*Z-NXe9Kz`AQZcb`9duK(}L{wFU4rEbB6 zG)dN%Ak41q8v1^SlLx|II^oaL_i;FG!^;QRnD};@-H0PHn`Wtpi-o#-(|GNKY!X!e z=}a~TW46~C9wM(hNi8&}AUi z>#8A)!X#KZ=S#75X%7t{IzW_DC%!s7mwaCnn$CCwNmFSqcR@pyh@j4tg(ZeF+y!-_ zy>xYPsOh8^bgKKzmGm)91yCdqo<^pW;v`38KO|?gsLN)2v6h`(RQ71CWZL!z@pU0E zBqGNh%FWmk#qLJqk1#q}yTy^_6JxzK>I{uA?u66+DlnOcJjN) z2~q)8F`g>#WJ)pV6Ie(BB;quvz`PRe(i3h47)!x((`kFwa%4pNubZB=_5sGjM%z`M zMekbo8)mk+>DgC|S4!%?YDifQ#WbbdB{3|w;8dXVR>%L zyy*fgi4M3$?kX;)fzj^rL`RFDmKDz-F#+HA+gEgrDXqnsGHtNAoI%$VzOaCWpCR*Kmbm%Aes#b>-G(7Z-b+4 znRnes;dOXV{Agm>}y5Za^>8%q5)=-i^mAS)Vj_5&e^P@RWXf zp`m!WNF)-WAC#2EWhaI~Y4a(vogfEKX9Pb#trzyu{nIR+(fJ9>UJ}AX5Jl2)Gmm@K zN%%|wmZwt@DTwI!v?&Duce?Z^aHQq9=!F+qS`;>GOn6Fjz2GxsvUwbik-&HaA5wIn zp}sbXoN@Fb84Hry$7Iwe39`Bzp700kx|wEb8T5gU5&1U7Boa0xb9LyEqyry}r@~SA zS+{eF70T|Zkt0N?WXtw;&IkI9{+kkrg3qDywBY0=4AEkTrk>^0wf2^KZ7I`H94nQl zmrQcTb%%xvNFtf@5-7aonWyfOn)4vZ?u{h7!|JE9N3-az?C*P}eir9gqJI9%>Pi1g z)X#&w9=6mrTiHYTprQK7Ki39BD1lU4yg@C7#=z8$V~Y4=1L@)*oWFq|d2{%KH5=TgzEhr{Bky`6KhRyU5JjDdW zrr%!EH`d(sEyG{m^7T#2ZA$^M)z!*@ z&U61E_KHfLCZU`+Ef#)P?A0A4;CXA)j3Guk3*XKds>$Fb`OZ}#nU@C|erbqON!v>U zUnYY^or_zz`Mb9{lU0t#c}E2K4mW?&A=@s5qi`1ls>uth7`@9@9S{}-wy0G~e@9?T zy}{=tG?j{vE{fSvKj}( z(-SwcjL;zH*pHpqOZ6CTGOimC(?M=yTMq(a`L-P+Ik25rI_o$&C(-lO&M+OX{?&WC z6?M+SQF{Zd+JVc^A5srb(l*l%T2niIsrN2is-Xft@YQu}M!04l8$3!&p zCd?5+oe5nZ&V;t&Ovqn9_!8c6U&6+#e49K8V+Z-sO($?t!*f!IWz&mIKehZ2>C)ZM z@g2ApQnGb|AVTKy1a;{B$aDQDhz&^V2T#J==t;PgRh2Tf5Q#-K_XkhHd*(^Fq3t1| zI=$VaZiJ3@@OEv_WeL`qOCS=)>)*G`4G4=3)8DfEHGSQ8*Ql^q-^zr=I)ugM*4l=@ z4q<`j>jD0=VMv!kCOKF_ckT6?-E|~xzgkvz?5c+ES9c(7sU7wKu%1i_WkgWBVdkegu9=(Oxr zcuX{Q=p>`c#PDVPzyWC4i+}3cKRGHSyP7b=|_%x42ZX zui~m3C^r4y;i}tsDwVFfcWoy5*+4Z@m(QYst8Np7R^P-1f_yJ^)qNN*zrI}Ts=G9t z7H(YfOUmVpx4>0*IRnn#b14%nmt8{fE8K9Ex|uhj-D+3e+cE7X4k=CMUA&4`kiQfO zK^J?Gt8Te?Y~ZTfWaMj%i z4P14bfN}fr-^5k7$;@vF1I+tFESmu;U3G6Mm!<-*7;zaMfMT{1&=tXzZRd?CL7tcpGIr8iVP#9Y|8soW)V{M*;zUgvY1*+z* zx=o>)-=zxJ5)59`Rk!KrSHX#LI9LwfEOOOdHq*?jrj^T)FU>u5)vfKYcZWTA>D38$ zb7Yx6`Jea7f44Bh68Bvc>JE(1H3LTvy}-AKZicRBxfXoFLeDo6gV?t328OTGY;&<0 z6FUk5&v2~3hzz@t`>q9VG%vDZ*Ee0qOY8{lyn5siWU))^IIwN%b`l3x2vE|LB({|% zy5|OP6*heQ|9SV_c>Tpe8268iKQ@1Or=57b)%m*le*OD*XQQ`s@b%5XA4faiF8bb& zm)47ak^62ux)@Fd$D?p~a9U0-LG#mV6pz#XZNX{Nk zkQ5%i0AqS_dybUsV+?>c(FM!gelqCNlp56r;Ivz0PLKKK{kasT39S@2urYHSc+_pLlTk~k50a5a{m#`^6^TDqK7%`YBW4@pbmH>+#> zkilGX?^V)Lqpi`i8~u-siEirJ!S;*S?RSUm*PHmey+t3I%mLZpe#ilBOFfD=X@kuz zZFBob@k-t_?aj8kvC%fyo%KzmH*K$P*zExB$W)TFH=Xsia6M*U(NS#+tmW$-cR}7* z+u4CTvOKk;M^#jv>Zs-p#$4y<1Z(3aZK9}QrL)gLtMc(SR?pBi1&y$nU;JiH= z4MvYif7;Xd(Pp2-0~{OJ^Gg3o6qlln9@F|qW6ONX{=Lk{xb!3Ov1QgCY>HS%pAT8% z>&c)!IibfXlI-&H&&zOp!Xdv5;zi#s0C+Muycm*X6ZN|CvFd<2y2!BK46&1n@2)mv z4fG0g-4fhhv5P2H?d*brp5D}_>h;8e47G-?ek9G~xw?3@UxM)q7TYq{v*vTD^n1N? zQ^~ai)#zI>jryLijZg}G$f|-vknm-$uMY#VG%$kW7CXNh`m)ek;r+U#0T;NxE@{Ns z%cJ~ivw~%mnu6BUEEfa6x=+S8A#VcMF|4X51y5Ng^U@Mlrz7uSt z$uDq%y)Em0V{WjG5O-VncK+)7Mku&ycP-bumZvy1f}_4GY$H;*3royDv*u!ojM-gL6rQ#*tm&6}zM{f5++Z zX0f`+F;+#YP=K%3Gj`b~Z`d8`d&U-bJABGLV`mIccrFgYR1DQhVyhssU@$5i*3hwV zjcp7`i4aD2(lvJJ;};K3H#+p}UQirdQ9|)Tn*SPm$2MM(D}mM6J+?7e^E*}%UxLl+ z`NuXM{z_O;%pA+%9!U9uZRti)GOw;y51+5jJ#~@2i=J?I*ju;Kd+KA0T?F1M$K8j- zyT!!2Pd~Q)8#U+qKge)MkbG)29`q-pFrJM6+g@>2^wsI4(;cr?(nyK#vlZ)JYFotB z2@(ZIR%AGyXEu~^dk-r&;{wf| zUDXHrWHK3!k&v2nhT|17IUyr5?X3(($Ez6YfIfbP5kKG$4gY@9I>>OWA+1?I2}g;R z4o2DuuJma>WSaPxdN$MF)R~!H!=ok5s|H_cBt^!R{0eoN)<{1dB(&LhNa9Y~!OKpc z`9jlSFaq2gF0^CPC!L@C;Rm|Dgi&XO0YJX68Gkt?aU7nSj{AjT zO$A>9LFYxZY;7>BUWft5WEhS@%e6sbFXLb84V2>kEygrsRF?tnb#AH%_zQG#}U(&-XRq0{YZ!x2RA zsC%JJhoDQkBDDMXgwCSFRvIlP1StW-V?4t|Mr4Sj-dZ@Bgz+g{^Wl=;*9ctmCsQB> zjBqLt!+KfKUjKR6e!h6+KhIA1e#+g>us_ zKHkO0pH{TbYiD7n8-kUveEpbcXV!|n@>yE_FHLSPl;;-MkBfuBD3?|^@U#+)hAj^d zTigB4q!V^KKfs`+3r?jBrEg3RK@)KZG97b@>5)*#o-fo=kg-vQV@wNy7plAw*jg<4 z{zpPU`T%Ose>O;;aRQVqCgtLD?U}|$ea_$pZ;e1QVZsnc!4cGvtwKi1Pc?A;3j0KD zw7E6}pN-gaN{CbltP@2CYa8vZxg*FTpsV+x{`A zi+qpCkaF&5Fg>PH_xp&X&$}cX^`AeV4iSt)h4-^@4|3y~kg4O95M=j(J(SW8+(lcH zPb>2JY2Ixq0~@Pva8eO>>Me5CQwXIMj>n`IbuTEL{t!rRAfR2+G+c(e#-5 zg3-64Ur-#|M-XO{91NzTm{8LDpjg<%tSvc7~Vbb7t%gc4unJZ@-`Gme@4X}2qkL#??)jfJ;ds%MQ<=_rLJI*O{yk=)OAQ1o=U$ z3%Z{oIE%FtiUdUF zlqsf$JSbC3Q>H#LbqfEzjS3Z$H>aI`!XybK412(3AT1xngqu{L=4H===ES7Pz0;hq zMg7EN(k9R>;E>3IG*1>2-|NbvCXkG<_CEQkG8FpRYPs7APX(STs zrtc=GCKm<{(q5Rv@tnj-{0J#4kg3AgVI4*obYvKjZKs~+hJ+hyYZtYPP_!uF;)E!4XA>WVp7bbWqN`BU?x>f#J4d_e zR;PV>_Uir4kApKSdhzndMX&ufu-4)?)2-3#H_3bJ_2lqhlobO(Sfc?oW>B-lYI}df zaGe>WFndN1O#IZ@!s!KneaOzBGGeCH>EnRI&cE5Kf^P&~!^{H9A2krsLo5q6v-2Y^ z&eFmwgEd7ZF0!2z-c!9^`BV-gECG*{gSY5wJRJ@Pqse%i4o~~cdu;JDSp$$!uP^^x z0l4r`LP=XMgb~K?3E8EG>rNL2XF9dB4mrGa5$uK9KXa?_lXeS>TYSna|Mb*`yd=yx1{B-GRj%Tm@6NmjHi7^=v3 zR7L5M=h~MqU$6ymyS+e`Xq>M-56H9g{%XD&b>6)Q&3#d`g%aH>KTPSoBRCdgB1^k$4oW|0~EDhKUnd?_+l-$ z&R%ZC69Tq1M`RhZvw&pXNYgk7J&AMvnLz!`+y0Ie2mzB@9_l`|OAW9U}K zo+*NYy`Z~8q4Cd8(EnufIgGH6vQ4jYT*$fNs53*c_iUh$)@E}BRlxj`CY&W{qmJx7$sfy0{jq3&X$|$m6 zz9q-f#LxpAK8bGVi65j13ak4`><~YMxF_&s3S1*VYAz=>98~o6QSCR5aEL^ebkp(8 zh!I-dV`&;8au|9d!@82#S+!J2b${PnzlaQyb$@tcFq1fMN+PhJ3-Wv~%^WE<+x7_~8ntAb8+c|jE*;`94 z{DrdCPi{^4{_6DZ(}BTnS>JSenD__PZ(RGi4saz;G@j+b+~ z7pHgO79x)5nP(llp<=ElxpQ2N+hy2+=*?Z?p`Ey zb2yQ~&4*9&i+sAB!1s=-A=J_l58!Mw9uE4TI?zlP80*su_E5||CJd@-Dg;J1>w1PV1B>jg_oZwfy(YEI}P z*%H3PdRV%KL^~RsFdh!?4~KUo3Hh1W3uBh1TaGw2rk5A{t8J8T-A5ND1*pO8=-w7`u!WE4Zrvz4p9glLi zVRpz6`|FIQnmXpdT}SOgsKE49sSYg6+z6lMVFLJCcu2GE+3|(9s%2j2g_D!jgD@o< z;doNKE*4L70L6u|I2vUp;JiUW>3)j>4Y(#lSOj2|u{i$|F(y!c-@RL9|Amr@;0qcZ zgr+n=Wvrc}xB|UGgyK!VOuNu`+5IAX`Zo~+A--T&m9#H}!_dy~4-PGIpgf>wgoq3p z&4QSktiMcCrUx2&=Z26EXz|l7B4GO3v`=G4XmAql-MRx*f8gObBV5QG<1EAj9&kt@ zT?#V|nL)4zx_~SC6fXVjx>XD`)<$6m$~SILF|`%#i$LlZIwGdaLK<+}3izk&&XmS+ zaDbWTC-s3HAr=myfHWxNoJGvAxF^hpp^U|fWb?uZZ&)Z1JK%IX(I`aF6b)5D)PXov zPWud-6uqJYM8|YHJsNqGT}0wALeCXl%!z)M%^cUq6RaQ28{0#m61_Y_pqK;2bys zsEDTlj0h^D#~SoSSM*Cp09jxMCjKORu zI1n3-Z+g#Bp2o{7WC*%>D3Wo1M~RFlaGDc zO4E8wwme40c>O8z#{0T_L(wN%CDWlHesh`gvCsbwr{8G+#dCZcny&2zp6;S>63p!I z-ZFKVz+oGABKT(|CLFaQKZx8&Cytqh2pvv|hp=MLbYO$FtRTUCErI8lo}xg8o7#r{ zP$DDGbbOmiWGrJ zJD`OwXa-YO0HjbRV~v)=Fnx`duE4K#pBKz9IdkJ6ZOsg}+E}DqhTzTS25(Hs zrtR@B=_7CuB_%WHzUu~o{@k!1N@h^D zu#la>Ma2ftq?i0y*^>)}3`wF>6Uu*$+ut^YO`)(r{zLyIZ|jr z#f)1r@djC-8wrbI;@72<7~8r&Al>?>M$2BmVn(CMFRGYvOV<5YEf34#m)pX(^Vx83 zgn}Ejo_$XF{2R=-GwD+P%)#?+;0mT%%>n;IvZ41%qZ7&mngv( zRLoe85HCsAzI1%w7E-$l?7l2r3Fn-u+78PhG>+`5iW$op^LHHPZWgNxD`qH26^FV{ z@+8t)$uh*{CY+XDuqL8hMRpB}$F1LC@rLzi-sDu!H!96eRfZ=#S4~g#DrV$}td;Y> zxbN10q(lhgtGr^yvd1qToNjdJ*}b4RxTIDVup-TWjVop}UXd$-)wp6tW3c9TtRlVy zn*&{netxYSqw49!!7CO^IWsH=DoFW)ZK(*=l2J0Ru2v79gYrrKl;Kw5hg>%r$&Uoa zcPZ89gU93G{K4b#7I{2g8rVRikl{N@6OO~}@HS-;Ec285*b;7#_sS8!Y^o&=_=vEM z!!Uv`USjEHn0O>|g4nd|&`uC@9S1HV<0Be(?dd@TzdT2W-$vxQffJd2+$?Qd8o6c| z#e}$q85^DhAHN`qJ-GP6`@=!+mhD+_5Cp!5T;480DG@V3Bt0VbT|Ld>$cypu8@u7x zlNa9BWdHr^&GYs6%+UQkc*zMA}AIN4`gq&%K9joTK3YuiUCS}<1i7I_5tJQw~uG|710tqipWOfuVl)}7q%^NEJ&%^x5A*C_nqOZNIFSy0Wqzl;c$p}=l zf)N7I_W~bsj*sN3vL&d!I)eK0j%HU!36P;)76O;z!+dS>E`AM`55;RPvAz?Q9k<9{ zGr-`>YXm2wz6x;I8L=Fi{KIR62JDQGj0#|AwTX}x`Y8uUetV7Zuw+{m;Lvz@YV;|G zMtpgVzz9K+lVDE85S^pRdUp_?<`O}nWAW(?K?5hH8-;~0ePQN;p%8r)k2*u@AXs=W zm@4};M~wKT>`S6ADSUZ?guFi~FYcf0t$~g<^T52Dd(ohq{52hnroGn)wqp^4`Ktat z{^^tRt3kD3wPreeLyJ=Vwl$-fQ&cfFt4@i1S8XG>@C^EA9?rVt-C79FGC&&Zb$KUO z)Ey`^#XBE?lq`u&CGq-8&>0GY2|&(C=lEn&cqK%wz@;Ek)u?(!ge(yJkkR97kookq zLxY*~8Pyi{dEV=iy<{CBD}Nq-K77B|ez~T)x;0NejnYnIt9Vf+RwIX65oSy^!3X&| zh+hhvC1vur)NWNlAriiCswNNC_=R56J;x9u;-t7$D5r`wi7}i%{=7C$5seBb> z|AM{jn)Dh$U~iEgWq(FhdZ4nbo=A2KsW1Rtm#wb2^clxijCoB4x#Ez*R#he>uFJ|* zGGc|!s#t7ZqHuGml$w{?B~nVrQXV0CCv=YLyN>HuI2N6;!#EyH`^uq5*&)Pt0^@b} z=0#gkL@k#v!9*1&d+}{Prue1oN@BfHUT)@&>h=n>>o`*hR9snYzBWTfk;w(2l!=vQ z1SV!!ve>BYP8VCf2y1$xU>TdsfGih1%gpaApeQ>!3nVOD=7$}tbq{td5cP?;Y{-f5 z_DZqqu!)rLHWTQAC6MojRm!ekm2H6%og-D**sf?0x|2x!eN`kO59rMf7)G!* zclu2R74ucNqr_r;9sDOodeAbnO0*S*nB{1h3se@xERxGVg*EDEFGA{bUcM6>`z^YK zxmF{^H|BMcujKvS$rQOIXpkddlk^8HQ#5>*r6~WG;-bU_>3(CP$zGFFhoZf53w+^~ za5fRfCppG7XbL=HQj)16e6OmPFgtbue!(6roVaW#{z*P9@vDTzMx+~F8^osIY9N<@gX-T&VVt{rjvln+P{m?opNa{U9vekpb5+;!5mh>seJ#@N?}!0cSzv*MnShzb zGp`eslOt9USo7jhU|NB)L^9kM848K2ia>$2Ww^&qnLq4|lWdMUb!8S~==x-*GLD#e z7F<~lmsr7tGHk&KBkxrqlsd6{Vax|FSvprVrMLNSV24tmc~9&7fPsdQ;s(Slp+W18zZ-@-% zso^|URz8l*zemGWZypA2i;`LxXl-;fNc%oN+@?ar3`4=dtw!SUlUlC%H;zWbZr z@N7}vP(%0i;y;?oDGXNH?W#|Y)$H5<(4|f8XPjkgK33zNXi~1ohJ6bt3q7+J6FKy3 z;j8^!eZ3)k=wY5}t}rr#tHdi74PP~byyTK-s2Ao>@v_vIFnTFJM3I^Si}m9ko`LY! zSLU{^zA*M*3w1vXlau#q`Z4|147a+yM-2nb3#-;2=xQ&9RMkjK>#@KL3hTMMU%tQE ztMRHzZLWgT>@%F3=+VA6+r5LKee;?|Yyk^3o(yBRaJ9O| zROXxgb+bQr6{eB#^A~Ckm->vyeksuEBSG3n=wE>WTkon5dM)bj#3~!R6q>yC9`n+! zZm;Ww!5av#R=X__=Re)l`(L-aUoaKyN1C{dyWHEw`x@iSG!;O-?QTtDzG(axO$87j zEtdOVuU7Tq0x*ee3LgXWk@`q467Lb1Z;8G)Z}khs@@UH#X!T)>l`)O*Gc3yH`f9b8 zqmiv5C$Db2WuT}1;%*?C16!k2Mr)Jy3x>g%BgvD&m=_F#;p4sm61@`AW=!bfw>xYE z2Fr1{dbxP>^H)D&vk||e!i>ZdE)-_d?ZDz{HXrXIWNuNZzbZCb(rmgKpBSF_`Kvcx zn`|hk4s{L_=ILq$kpwKTDsiDX)KiebHK@JwvrL1>pi)25NH(wZZ$>9eJFpo%sTK>; z--DXw^e(0?)|(1a4r$#kFfR!z4&%q)SD#1)lCs)eVM^nTm%RFQoFE;E1l+nEG?+mK zyRWZ!>VfNj?X1mD0+mHG1UHU>b_@Ci><0=_prV{{i`Z{d#;K>NgAgz;)oyu(sf-w{ zsO=)`!wn6x1cPEgV`BrfiXzj{=r+8J%mJ|{X92e0CGZqYWhbsOY7J8m$s9gjTwncC z>!FYLYOW*D!@M`Dy(Alq*9r8LWxBfgfR-NGFg34JC>VC9t)%&l*ggD+<{y~vxLdq1 zXzUliR=|<=pkZ`IiE)OX04IB2{Zcvlk#3@wkAe*zT0i@ z-(u9Nk58W9`S0pqNdapSgi+VuHlsPQ$9R8rZ5Tyr4qp(|WI_fsL2L7xFZc)S)1GYx`eocyq*^EF54%HP;B#sW6L_{zi5O-X_eJ@nRYW^Xi5k zy}KhyZWq_J@|Pf-3$jQwz*niw<^3mm1v%BX+h6P5W8(TX8o|6p3L0YWxQ)$&c*58( zkhg*DC8LN=MoVH0g^P=LVRg4{-bCulI5Us=r)T68U{SA04I(}; zPy9rlOzT%I$-mn*V}Aeop8O@(s=(u@VYy8BDL+tMfK5dKC@3jN>r?{BZ@6EjBCJZr{>swXe$ ziQDZh{qz2MTdma~QZ<4U(a;6Oly_Hup^ynTq3O5R_)Y!UyiWds-h$5)`j;MFZErs{ zpGERtgiZ7-%{--lHQ_uD-2GbVv8RNqdINpJKd5!mpJMthE%@jC*Iz@2{ES=^zMvM@ z%=hi5ewGE7Sr#o8Y0zwB@G({}4u3Vo#zpw5-lgX2pn&}P@MK|aw8`*)ZMcpak5P-i zA^{_p7{N%4%zU9eP{d~MxA1BxaC!4+@#5vHJd7^XZ;uzOzaPmN#I5Z$`)4*`XipTO z!AF(cBfD#u6RGymzG9u1NuF);EKBn!tML;i%Z>k^A56ohqXsq)k+lF>iy~cU;@M4W z2JDU)2R-=q9B(hPh24b)06M*O1-_&Od=Fn>oVgT8`QDyLUUU z^c7P2hGhUF2CwhFUhO{J?ze9-ivHcFuh+Y3v;U1|>qZ`;Gzu=GG=@AhX;PJPs@LC9 z_C%{-qw7YIcr4g72iPps{9@TfDVn8KYCrW;EUwGo7UlOO#jwoFHJJMyA_8QK~FIgM`yF@4ysv}W3@AIjXEQOTk8GzdD zv)&yBz%S9QHC|=qa#?KZc%6n(y;>!!O^z0_tGtZja+5E^yj-GrYlSwmWtFGvG>VpS znFPURZedqMQuvxJWFpDkvr9PVj^!ozsR*EX=={S`{qSdI7qvVu8gOr@k+7#vk3PWKR#7Z!B>u5reDia& z)5bd?*E1X+{*1KjWs(BH6moA+u?BX2U?~C15Fq%JOgcBGlo{-KS-^Mb5#RYCs_iC) z;oa_rv~D;N#^d9Ov70&{*BQ^ZFBl1(T)-^R2x2@VGmU^h|Nf68;jdr3diulDAHV+r zg6^g7G2#S&;B#q(I0%zV{0E+jI=|5B60rrHc+V~bWk|3}uw+BcAHRM18We2cT@VUJ z#{?fYBmYNeB0Wt11RqxpB~N@wrd|Tspm#o?6^nx;0)>#H@~FV^nTv6viJ=8$159;M zR8}6F(Nex-)^+B`5W@WX5N16M1Hv(1$RwBRWu3v~HZL7y{wnbl!T6cIM*peIJ+ zZOZ=!!yNXYTuvXYquN9}BmanFGIsLN^lG&E85uYwI4q3wP)dM52VnB$$_mEg_2Wo9 zQXCS+SpYmt*8XfK8gZ5&PmrZ3gJ{KvU{6&FGD?<4E-XV{HCE*s6o!0D_Y>GPogY|6 zz;dXHMva{tUQWAKBF6V+h|iO$j`ILzDwj{ytMvu--q`pCAT6%rNzrBpUamGq3Yn9Ny^bSlgA4R&2bTsD z_Y@~Ott#v!qy`CO{M5b!o9Kx0vD0@lQI%aV?_E~2Ud8$I0#T|EA(rwW@=xD%Hgfp*<&WW4bT^GiUh4X*_Emo;E(koYlR>v*|#VXFr>g0IDZ#R*I zR@$zKc@!clJYu!1K2rP0I?ogdqjtiBsxe>m2AwNzY&U*aua-sBs5hrqoR{=jNl_~u z#+jT(cf4N1v!^EIkCXB|qB^D+Zp0g{dpOHyG*44b9vpFUd@^Th@(?xy1k)cYsz-L8wSd_MN9#&`@Mb(&&Qd$!yJQN2Ne3X|Gbb&Bi$ zd9lvon#$<$m!yiK6!m|b6osx~QAf!#K~zYgZJW+3wcdKrwq0-EDjRoR(xr&cbUeT= z`~ykuxg!x?25-nQiN;gaXo$4qWtdRe8V6XNpr9uW&)N6Jc((HHC3NecH0`EvH7vh%BuFiB8Yp&&PT3X1@nwudliXX2m3dG{~wT#Pg- zloPQ$bfr?etTV}{r9UXG%eh3QF4afM3bWjEkfGnk`)NFMo8Ys_Df-)ERI4?|zT!Kf zs_o~K9i3$4zpt-8G#D%U&^$(eHY-s7DlFBhJ7KB9G=mKmsaM2~6g{HO2jc>%RQ*+l zF2P5Q)b-vFMORz!yA9zu4~Q-~$kT2%DmB}b=HVeFXy)Mt_wBA(&_S$lQL=f|tX1s@ zlPZwEc9)4y)c0%{t(L0tH@p&}q@t{OTD_ef#I>y!boE?2G*^$RzwkTFtC%|G1MAB& zSd%dk8>?Q%41jHv%jC~_6O*vnL{t(syQ#A*je6m4G`}l^6=4_&enkDv?{&a8BXYD~ zN@%F-xyl&o?>A_mxVs^sT7V&fmw<{Fn1F(H6*0{3jHe}JgHMY}mN=;)j+WJ7^f}u9 z|0s)#{&r73-P4_2x|oU68)ZP$5}hoJ~GNR zb+=v>e9NM^V`$~4Mp0%gcFstS|LF)-b}^m3*&UEq3)*;tD`LtwHBUFkR(-EV`F3PC_f8vx zo`;L#GNJRQ=FP6!P1Odmg!^9+gFTV}u5R-R#e7N~sh`xccr%$%5~XJRZ^Q*5fs}g7 z(5@y45TNRg1_7gZ{4You?HId)^)4 z-7#W#`|cr3!UC9B%p2?Df3u$a^ zr5RG(G|NguTg62Az&cgu31I@%7i2|bOC&Q~N6e_PiQPJ7_54)yyOpF7}!=kALIGNA_Nkvjp{+) zi;!Qv;YwdW|COlnaaJ}?zoEL7d_cMc*{n}dd_Z4>VS=1WNR?TmWY-TN=R-Y5gX0vu ze~EA>u@}}CCb!3_t8DKbJVQL6J9{y-cOk&z{gyih4HGtP%kv}pt38Vt}eqGmO?`^7t`zA{7^TqUJ%SS}e>SD_z*UtwXBhH%XhN8n(K zaUE7!2p|-uMsLeLP<{z)lkYUO1^Pq&)NN-a6+}_ElLHGwbA?Mtk!8+d%@x86!Si&k z#)?Sa?e19?Ts=HL+Qfz_0%pA5GQ}|Srzk~s9v{d2VVXk&XNlb(#d`zJA|3{zvP3R? zFsRLN`i|$V&o-=qA;nk;%1xQD!wb*gyy83dalC#=U3wRs`J>K!kYlKjIm{zt8nyAt zhm2Q_vo(Cf65Hf^dU%Ga*zvs4B)0Eb-}7{T4~L3lNrzZ5%teF+(#d+Jw*K}mxQ}#0 z#u0`9dn{cU#dSllivYxy4w|W->?1`9zE({{tW_Ma`)IWSah49_FxTY;m^x>-NbStv z&ifYJN4lYW66_l`t>E~h;kqG?FA5@dVg1GfX1V~|>)vVONLRou1x8lDhe=n!Lqud| z(E-;D=^OuodjxjSUnv7@TG>ix>8tlWTvU<=Qs&mTGFSEco=+iw==Hz?ctF>cD0IjB ztu7rV9d*bEOW`i#^#eJB(7WK&e|!NSWWYMM%&B&g)QiZ@sO@W z!nrI`5$NUAk7NY5`4a!J)E_qC5w1Gp`O;EHXF;4eo9f z!c}q}A7{cN(C8BXaRh20c8#JKU27t0v1jFb_<4H2$ZQQ~2_yJfQ6$XbfnC6k(esu{ z!!i>^A$BdIj+qVm!&HrsCI|M`h8~KVfj{;E#WoCpIIkF@5Snt)H!Mn6!qD?x2$?^j zSq!p#1TWOVbsW#YGj?Qaa?lec>cSm+ZAw@NQ?ZoLM5D*i!kSWw9f>5~m0rH-gMU5tY7h9_uWphE|?vLu~fia_N6PnQUu(HhKdiw_^+50|F1)&* z+i@IA;vsMyw>fPhPBzlm5IRccgB!IgLn=2$%^JQSa?8VViYNhhX%S2Fu0T!)9HBTw zEa*Hxk}|D@%s?4xO@@wG4dO%@WN`=f6j$AF7%r^r0m`7(8_x?KP#^}hKOUwkf${w6 zh0t>rh-3euwGqEcT*vN;OT_8B5);2B>}x2J4Q0~fnD{jw&#!TT=MyJZ8QFABw%~2$ z$>JF2BC#4yVO^vF>x1VZHHnO9bT>PHk|D+gYxnVy+tZ@v^zBIyc*ZH0rqK3aB?F9= z(AD=u9EKkdnv|?a$|otxVH#2=36-K2q7qD+bdBRp^Po1)|pOXA)MJ#WoxQ+e9Mk`&cAkB=lg^~u&s>y?I5xmfa(t_C(d zM;I07n73*Cm*8VQq*E|k1J4VOdDsKSJpsBIA6wL#GTfe(qg{jhIBlSG|9ZZMCLQ=5 zQ$VkOh|wv}j_aXv-Gjw%sE)w%bZgdb$NPBET}<_O!y;bR3}Bg%ujBZG_c(T>C8en zYzM3xoy!0_8;~3dI+2qEgi_=gk?`XxDJr6X+m7In{-QILw~4TTRM)+gv3Onc&p z^FT5S&!>1^)Hn~*2(u2<`>i;eJK11@g_?TPa=wxfM=vi~m>+ za{wg_lc47f0A)%Cj6{MgAw6%2dTPHe%Nrd&*aAsiBXck1|_LDae(dBU)Bl?Cm~UAOyqSdKnE-yo{#ByyB)*iN^mh9i?_RR zkX*QgjBkia6p%|1=j0X-18Ev?F~keWc;3$8Jb#i>k#;IVz60DvW!HG#ZpSdWQZyFD z;*TI#OM2N%vVk5v^@QAmo%2}cQsE>Ih+{?@DyulODIcf^fUsjnRW~r}R1Me>u#5*p zshE;iW!;XUGkAy%KxcxPhCMD4GeXs}!;r_7WW)@)kZeVZkc%4!JaT*uT0s`u9Iyk> zlXzaJL9Ap*55VW3_ZzKF?N!ilZa=iM?rNH~4DmvXc@FX37kMiaXD~z)bD_P^opH^t zmHrhig>b_#!zD`dhgI+hm%HruYWI6Io5uM&b+uO?bYDg7r1i_pd`rNh3!Cd|UwyyX z+|~OFoPoay9_f#0TxRoudZS?+OryPed-L-B`}=*hysj^P{tBA24C*+jgQ|d~Dbrw$ z!kKil&a*tOm#BKfh)`7Mrd3o#t2G8hC7Wf5(NI|()afSMR6l=p5JX(zcrH$ZO^{VV zvOzgYK&1$)Wf?6K^p{v}imX_oI2_h1U**9D&ll?rfFN^Ql=TP@o1oal#VU$6Wrd;S z6`Tj0wH9@`285vAY{FGq1a+OP({dfc$&I7cCQa%B3tgeR#Rw3qD8MYNyk6#M7}r&@ zj!`JEL0r3DS26w%$%z1DL10vd6-r^t1SMkVv4lkwSV}npM3f};GFZkqyIv((h41GW zum!pYRk_Xqr>r-@3Z&fNoymGtR%L-TB^7E#gXIdXUJvd?w2X>PnFq@h6p!+%$dfwC zSAet(*A=?37gdT)U#*tWIxJV%x4I6{f&+68;K*k22oOnHZkALP6jgD)Tn8JxZwZQex%vHtrmkS!S z{CS7T$X6vX|7(3i7q&dkLd_}!PL0Y+P;=={z zl^c8%Et)EV!B=dkT~4NF)Y6(;uV_jzhhMP@R&W}boUKoEa}ys}0s_-tWFaM@Pi;4w5Y->SU9YH4Aj>70gb~EBxy;8QV5z zg7>kXRS)xz+0P)VQ0Q6lqb`zTwiDT&7!ugCO#g1Wgu)xv>pJMcfnV&<$$bM-ix{Sx z_v{vvXXp)RCAZ0ReBM=N%&X2DynAKx4h?H)18AKea*-NyNMI%nA&){Ts8ppUqC+{o z7Wo-FjBW-v=;sYM$SA+5Kh~>z8h!a_@r{279f3P;CJ}vukJ{*$iBwV8QiY+!RyWO} zx0B-(Ggr+74aZvytw|6uEatzNVD+wy7?SUzGI(<#i$0ixvJb@vRuxUg8)+x-FZRf^ z=jFZf@UiJU$prLEzsXq8V^SN*6qRB%Q`JciD*At+@tzJ>2}>1PuxTB$P+r@~BTjHT z0XJ6?r24o^-`)M~?RK}ndwH|3cNpni>v8UhZgx%|yj%~D&$)Q{;)iEpmOftSe;+kN zXE0A^x!qoic7A5r)}x?s^#jf2GA@AJWP2*jU-WwwV~D4?#AJXu|7c#U8;8+v6j=L^ zF@ZJN7V~$$Z=#r!{Z3BY>!W4%K?sF}f8#<1g34tn^ox3q-{#dfP1i4en$5cZX&WY) ztRxbNW)%t?ulWF4j;qm8gQ#vcZ}k9@d+UPH{jF&=4k2{v$Gq{NVCN`JF6exUnft?b ze|7WrRlU2~u5I_p+xuPZ8UEC5Kgs0fRUOH%30pwgmn*Z9vHXfOyZK5}?93Rkxl_C6 zD9`S$mQL-By_R^bkvU>@&~yutYp z1afzS$znWV?B@E@?|Ej0oW821+?@YoZrpK-Fy(DIiLvN3);nibgu2s~5qXB{ z$iHGa)=XZOL$Qz%5%u)2e!`6<^RzX@gu^tKEx}1Y<*^0x&@dsZaZVgNXQbV#fn(WZ zn*QNFSzR`9^iMjhe^6&)sP0htJgT` z`==u`1?S7WngSP*3|by8{JhMO2AD#SMj?tTm^p5D+uQA3b^ZFLy1jdc#OX+iFt>AEo>#2q;r9LzJ41tkoUSZ0H)~J)d3{}dvS#sUN8IZ7BiU77P9+_3lE1`l zvO0z^XEmudZ&)*;ir;X3-|jQBP22qkh{H}bgt#I{jh8}Pz!vY;Bx+gjEYZe9n`*v4sMyLn}PE-Qk$5-4DA*i%k!)SPvd#3 z{aSjwx#Vh6tj)bu6CrjKBOX7*MX;5I&xX1CKo-;99sL4*VjzcJht$1X=BiBe=FxwT z)kL)dgXh&bvv3G@`+FRf(CNtTYF%4jpg&uMJDP^VN3v093!hHnBYdAhcNmEk#+kJz z+P0hJ4>K4pYM2MT>Ig65)sX%R16F`N&s+KR=r8>W)_}vf9f$|1fsVo51M2gtO6u>A zZoC05UJ7MtnEzj{_V0eEtGn$@H-BN%okuh7GzA#qj;o<(n{jP{<+&L*WY=(*Igk}H z$od&kgvW~OLblI6&mY#>A&c)YZig6G*tjo_ana>Gp?MxM)3F!O*FP_beebuR4<4^)Q;LkK}@Q7)ZUsbR?OW zbi)lpCbS3C11niiE7~&GkkJ99*IZN`WTcst9Ay8b3TaM;YL~%bkDgfk-TnJ|SLyQW z+xzA9)e7}I^{-siGcd21*~l8*quFSp4n!b5v>Q$PVMZ}YpC8}h2EaSaqwk57N3e=e#YeM>V^EGax8g2V zn^o-PO~oqiMa-`0iU;k9eg%7W(^!Q&?R&XWYFHP}F(sy_9vG#VKZJpWG!3!CD$na` zeSLK^Zr+$?&@~b@bR55x;Gc9Y( zp63V6pMC{v*#oGtm(T;sdXrzAio{ty%@=7U5qGNCqn-X1&dJfN%GQQRbONhdE7M_B zR;A}=ReRH5m>)uWQ^3y<&De2vITBW|{^w)slgwEA8t2G}P&YK8@^C=-&YW|1QXyzS zYDDbV{WtRzPb}gIo7vz*vG)EatQgL||07iuT5L3J75v+YhNI>IrDxo$23-?9d^JPA zVkT9ET1JD~=T}vp=+b-AjpPXCgUUmYXW#$%yB}YE_xm@0{Qmh1>)@%PH7@Y)WUue` zI~<}f-q-K9yHB114-qjP&HoeiA1<<*ed+K&>p#T_hx~Okyfkm}?67{t$duoq!w_** z!2{~^`g=GO!bCD09W55iPdNTX*W4yxL}?@{g>LqX-#-1rAHM(b&5!^3>czKDUw^y! zX7LNUCRM+nD-qf*{T8=Ayp_F=$=9=oCTNAj_g#s)BFHVp;DxMFb)?Kbiqp%b&;qR=al?fECoat!T>n>VOw@P`y}9rZ~=C zw&-Cbt3y4Eq+h{~*f4H~l&rW%;Q@7So-J`}2MKxU*Xi^apYaazr)833`O|fLj`#9W zqGNPHn?EzwNayCy(RWrDBR{)|ODmeU4(K`P8MAl~&*)dM{7+<0yTu+*^RVaWM2yGF zQ)dXxsX;<5G^soPOZBO-(pRPf;$px3rM_`ZtQGX5IhfVpX&RPCRCVJNv=3~e0=1X+ zvPcj6SncN7BmIhzej3L28qj`N;*Nv|)&uiHD~B6m<`$|}Fw99-t;qfqaJS6WU0rMXE| z@Xh*G-7J`kxuaN*NkwPu{ioad;-%3AkDe$Y*DXyP*vn0nq2Dc1S*QKaD8|X;K}dw5 zslZ%fiWX4g7IK47a(q*$_B^RaW)(AbiHg;ND61kDWOW*>0;jqDuOr@kt(6oR(eBqJ z;{m?-KmUhnE^FLB?{xSPn;{jjw9(o(;PBgVWaiV&G$9x&j#hRgt{Ok~hNm)5g0wX7 zco;@iYo>ndJ!=-aNiUN<_NmJ}ncQsNsGB}nwub&3ZA`|DG{w1DykYA3kVbe51P(K77@S~J0%m(i&jhP?X{;<9 zlO^t(PemZZ9ma;X@9*Beu5Z?L)3KEok5fZS>+!C+k>&Y3@lYchz`=PVk+s-qPGI{o z4{>O&r-dhIp`o$Dp9xz3>Ux;LmfX&Rff6)HUpN70V20Tui!j4rJxmlsmYlJ}2@$$w8RFVukUQ)oI~3zGWl^Aq+E>oFC@)E)Wem zH6wBs-m!oBZ%z!WcPzPqGEL?OmIF?6`vvp7r)BzDb${T;@ z!<+h7Z6&!tT52~^BXNc51+GZuc99ZVMsmXg5Kpy9@DooUr3uAH1P_4M>6_Z4 zHtosJd9i*6uEQMJJW$;_50*Cp$(FT(nLRPV2;A3AxdU_N^EVf4M%C~zp?MceB*eY znC)raC4mGV!)Cm;I`lD**jb!z<8#M|@a%Kc!rx!}zA7x8$2vKSkjheg%}%)l5EPE? zxcjwS1-*$gxekuKFeE(p#d7Te6MTU|IIz3hWX-J1nT*>e+n7WG>GmQId)jfxZ^_Ly z^S&GJ$oAZDyd$_mqBDVf7k;*Gid?dv3*_T2d7bU)p|$f2A*ctDm2q=Qph;<6A3)>1 z5nJZG#^D5+^>ER%^>OsfV>D!M<{?trQM^N=U_)h~V7J|&kNATNO1w=uh%CXaCGh7x z)Bf>{o zLx)>Lccl5O`7u3xMP<%Jq7?xKHx~g-Pal;{Jk?hz(B#$zBw2x-N?-L@|-MVDy?A zX(B?Y_V;&Uhoyfpb$cUpX29rM0M*?;trqMmo0H@E_9mhFhk#;}EI6?~Y5C__Uj*?~ z>l08&PHg|odEgwPV-Ne!7S}dBL}++<=$pY^J{Mz0Ic#lILS;EfJ$Ze;+3&UvuPB_4}xgs*>PciPJhc)W?Fl_Ezy zg>kIsAxDnHVn?IMb@~i@*w*J?xxQmLH7dyh|REv)eI_$rCr3g#g3JSo@+=nAzZsw}*Z(dY@;SqrgbY+dZoh>kKw*WmnI$xcAW&mgC{?qYt?fy^ zI&63JwixWkJ0uHbK0^e6TtyvaAj; zK&}pwb+n91du}+HA#isOs1IlY4iqMXI+jWvW2EgFO9^eS^9$Pmdhoz4>qv~4@PGna z^V?iFJ^jS4w{Q6ilW9fCE_7CcoSI32mXjWvB=jjsab(bpa7;xq4Unfw!-vRIrD(BR zU`k$3{+->l$xFgz5Wqnxf-nC*9~g|mDpI3orQ0le6@#wDESXHrTNPH(Z_6c*f z%UPVH5#ik|TM#LWdjJ*C^+_<4gDBkfT$19>Z52 z<)#e02Nh2_I_oXm%d;I@Kkx?h&{S_|cvQaV07vz|^c*DCEWsLhVCzpU4?Ja#b3U8z zin&HO_DAo{U@TjlyiWA@#3fox07Eqk8PK22bHlwlJDjax2b#p(Wd(QfKwXc3kE;u!QQ7x~Y)Hkc` zy1r=jHhnBS&Br|N?NP^zw}Voqq8vaPb^BF|-)T)%sr)-cDl1IZd9qH+WxfvUGFavD zW)(&CCSI3ixLyZUo-KnULy!M;vMz#ZSw`!qO3_HG;LP^aRbdaPt1M=d^!x7iq;EPj zY6XUE*F9Knx4V6dui0On3@X5QSptQH9m_@nC&(b$97VVqAe>h2UZgxHJ1~coGN%ma z7j`)57r)8Wuiyt+cRHSr=wmO?Fph@wm!ZNj2v@%p`t;p&!5ezU2=1bGpr}SKqQ}Ex?bArn>6Yyru1of=iwTDsX zyX203uxNRJ|H3kT5VXPu&lRfR?HM(mMfw6o8E1o0sC5)rN9$03zIA9Tj&Pu5#l@O5 zkIj{b8SOaq@QEz|na=FWV^SWB>oI*Z=+QX(Km;z6@uBJ#7}S(bB+R%@aVm==H1g-z zX`x03-G&BHG*|i&sGuP&{!2r2O_bZdQ^O@)(^pRudjSlb=+pNx_O~fgXSba=klbaGXY)`6>Co!fA*>=!^1(*zV>ut7M)lo?nweS z?J^08dmNxbreuzKGBmWTPeQuSX`nsBHG34dZ+F$(nhk`2F4fIs=p}Xv1>N#|N`Ruw z`b@4j)<~d2a=eYzb52ZLuye(oSX@S62f}HVpm~TnYK8r#p~w0--qF$DmJB<0OqGPh z!D?fNIT+or4sE=%N}!(1~T94kczj`Z5wN4n!ss z7z1tc@w2#6bBAF!a7&aNRoVLEiMQ6jE%7i>I^_hYZ zASHA8NeN~PH((nV-WX2&FF(&`QkxaApF_LNL0naL# zaY|cHg~zUJJR9DYsr()zjiteQCDQ}_b4liLTc;#b%wnEOrv$aVNfL_su)CY;76Y&4 z5rK3pCIiGE<3tVWF%tT^0mugBpIPgXp8n(T&8XBq+Pg3fp zp)V$4_NHmLak;p^`Q>K&>kTv9;%eS@QeJN&QpA)i|H2(T@^@vKaG zT#nfrbJcTlVf+#Nqt|M?5KNVl6qVIUO3sLyZ206xjouWpuRoYe_u)PUz^V3{U86du z^lL!0E|$iB{-$q@woBn;a$?Rvl99LVD1sK~j!w|K$_bfSwLpf(M@beTM0MTGSLoeN zLz}Jkom0)HB{o_?^?I9K;3Rc?DkChK|3{+G>=9vl%H}m&H=B2mVZ2I`(X-qGakF<-Nt6D69%Xu~@kX8lh?mF)0HdQ+qDsMV{9 zIczf680iuP*1NeL=qK;(R8&7hZ5PcbHDM^NoAoyR!WK%HN>;EFYT7(Ash(}`Z}vzP zy}o*XdtEm}eZnB33tJeZX^Y)(vEV1v6t6E#U}>GT$9#*dTCM1Pj~2K0%j>Jv;=@(_ zEB>?F-&fZQy79HUTGveh@nzbwK9a zkdcThOZSnmW1cvczmLQtBX7{bL*DuqF2 zCr(g&$zn&C;etb}WE;#JMfJA2y1CnXydzF7osFFmv}X)a0c^3^YLO!p9*~`bor7j{n==eC~=Z^v--tJ+&58t-NR20Zh5KH zC{(3JhTT7l^eZgrUWCNr$p{-F0u#q^JKLtG$Q*`QAPRH41bYBArLdseT@JxKW)2#P zvr-REtPB?_a3c%J8i}URpU@K=W1elxG!}FQBe8hWZ;5&T9-Lq)bp*+1uw&!F^8p@l znIjOk$&vb#+4|PUa*?uJofHkns=~WH_H*&ov+dthCs_OVys6F-9feE3FguEs&EfK! zB40CpJwvuE$|;k`o;}j6cbFZD4ua#du+A`aPdXOu!Z=lZ?B=x5#ee{yOK1HKR3XZ9 zj$qGY3`ftYVM!wfKYtbe{FMN9pjueAM-VbBKX%i7G8m8=^JqUN_!y%T+?4;Byh%T3 z!I=*GiqEHR_nEmZrB=J-I zOiBghpk`M=5)t`X6pc^zay_#7k)5M5eSb=Y5EW2ZGz33D2cLXq)e)}*b)Q&$fE)*T zY^|1J>~~CF6iw3t9J(y&ZGJRY74;1JdC-h|8}W@c132|3UJA# zZ4<3$1(m`6>15u@3X+42#w_>PT%{aR=JDAeI-W;M8O`bG99|)_t>fvS|G{kDRpOf&s~&r|;QxHj;Ww{){f;+$Y>gkyw{YKJM5h zF}*~Lx$G&K^7wd8fB`71_8dg)ErkAD4ZVrenDh(Fi-T}4KndK1(z68f`lh(1UAbHgbL4bS_^vLpKW$ zJ%=xcF@--Nn{;=9T;7vAl|p^&-qZfgBJBE=b0vW?999Aox=Uvf5F0=?uini^|A>|i zo|fZ|%Z_Mc&-$RGf%OYFhPD2M$frbtTq!DcfI$Fz7mbTk~dzo-D6>()d z%S(hyyZS%xuXe5pY9=|QeBeTq5HKE_5~?Ns8gi|^W?g|dAolnxXTfM$*V#wS5}faIj_Pj6&&hL)4+LBNdKD}^J?bbquX_f2G?T8*16)bZ1LE@@i_K)1D7g)!7#z-!&Mi}zZJVpnwrAEA z3QpLSU3(%suMSl3h>~3?9iZ)u>H^IYkd_@(7i~mN))?%TeDNBC-RKiEhD~goC7{b@ zOBm#+1-Qh2kT8&~uV;+k(AtpXwzRfaI1@9*5E>2&eL8Y<9=SE}K)IIO{>gC{SPKt%zJjs?|o6LHoRmH~l9qQNZC z$y-4m&E_E~VvbuOz;X`CJy-8ZDmXH5^tUBJ=T1-H5E>k;mOaeD;u>n-ygO%=^TpD6 zgu8&KK@w+YPpC8q1F&}cCs%iWzPYRSP7Yj!3HfZiui^I(cVb?cDr6dvoTp+JDy*>N z2T@ru4|KXgXk^VoH)IxA98k?YlF(m)?QoBj5xHD^&M~Z5x_rcWk8`uv`3t^+>sH3r z*B@`qkIqw~Ua8x^#(YB*#?1GSq=2hqgk*^yHP6q?ibu$t-<0RG-6Mn+fIAfxU{B*t z^|R^4BiFGqPcEu!6sD{{E$WX~cl$e!hm|vXedz&D&X&*NSj`6qQY87AQzZF(DUt}q zD0v*h@t_kd^h4nRAT~~r;y+aj#%P&=8dRj~VPnuG@p*k+eY$w`WWW8hg6}aj93#&I zJ4Hz3z!pkZ?=FYBGXVr~1;7?KD-kn68(3bC60za=JSb3ORIy;OyREfHIR{)bK_16f zJ#?5ajS!UyN~#s#t9o~}MVX}}h=r`o%xt%r za}At&&bYwa!dI~KHI=*#L`c1a*n*eLrrbv?utx;ubCjALhF+CR7CYQp{fxG)0X>qr zdMGhl5kZbI!QgdD8hLz089`3vG7X4?iUAolI!3-62Y!kkwch;X6_Hv}YND-{zBzV{ z=hB>*0u2;%XigK=i8KW=LC>4{YCN~IQ^H(ubTpM*NseFv6PW}9SS30qr|Ct@a9l_; z0L`}|MP0f`+oi4mDNU2e!%U{9f=)HmUFaxL=e-q}Xj8=@n8S7RpmQRt5hi}2wn-x6 z{)h}xk9M5x0sv-bL4H!1%~bO9;$|%=%+tlX(lcB1nW8@pFoDJLI6pG~HF+Ot$r#sS z*-9|btkR=s8?;lXpsfH%nMdCE_1gS6%OX?R*w44G0*|vw&go1xuiVU+I>0>W%RHyj z#8*vC^E2cUX*`B(ZGdz6kNLVtstmp7sybMg#X63oa=FfzNw!=jb+OJiWwBbvX_Z&& zWsUxy+eCNy=iiq9~myD3&~YVM>_wcdc4hhQv% zG=a7(#l6;}l{hEoh!MFgME$K~b)tV|)8pq^oVRQ6&5Joh<2mkgd@Uf$ug1?D$-8G) z@+o;jc(@sWe5dd@`_B_4C=bm_78!?T_!j>`BFG>$6>Zoqn^(#&yX*G8N?$!@s!6}V zA#LB#dI_#U%dn2KCg)|G!_wcdQ8)i#^2EtJ4^o&)nz_k!h(bBj#xQ$K6>ppf0u


&u))&YCO`f`G@tiVlvh>^cz!z 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̭>N6R&$JSl%!NHh=yK`EUWZ@IRm3NEbj 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

C2}`HBYe#TEDF}KsA}1gY;@vO~Twr&^PI8 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