From 7f73d24609a570ba4fbb7561d6d4a32212ade309 Mon Sep 17 00:00:00 2001 From: ramtinms Date: Mon, 27 Nov 2023 14:07:09 -0800 Subject: [PATCH 01/58] evm support flip --- protocol/20231116-evm-support.md | 269 +++++++++++++++++++++++++++++++ 1 file changed, 269 insertions(+) create mode 100644 protocol/20231116-evm-support.md diff --git a/protocol/20231116-evm-support.md b/protocol/20231116-evm-support.md new file mode 100644 index 00000000..542bc34a --- /dev/null +++ b/protocol/20231116-evm-support.md @@ -0,0 +1,269 @@ +--- +status: draft +flip: NNN (set to the issue number) +authors: Ramtin Seraj (ramtin.seraj@flowfoundation.org), ... +sponsor: To be added +updated: 2023-11-16 +--- + +# FLIP NNN: EVM integration interface + +## Objective + +- Defining a Cadence interface for the EVM integrated into the FVM. +- Facilitates seamless interaction between Cadence and EVM enviornments. + +## Motivation + +This work would makes it easier for EVM-centeric Dapps and Platforms to adopt Flow. +Please see [this forum discussion](https://forum.flow.com/t/evm-on-flow-beyond-solidity/5260) for motivations. + +## Design Proposal + +#### EVM as a standard smart contract + +An easy way to understand the approach proposed in this Flip is to consider Flow EVM as a virtual blockchain deployed to Flow blockchain at specific address (e.g. service account). While it behaves as if someone has implemented a complete EVM runtime in Cadence, we utilize the extensibility property of the Cadence runtime and use the same EVM go implementation that Ethereum uses. Cadence runtime is designed to be extensible with standard cadence smart contracts implemented in native languages as long is its resource meter-able, resource-bounded and deterministic. + +Every Flow transaction has access to this environment similar to the way it has access to other standard contracts. + +```jsx +import EVM from +``` + +Every mutable interaction with this smart contract, results in a new block being formed and stored on-chain and emits several FLOW event types ("evm.BlockExecuted”, "evm.TransactionExecuted”) that could be consumed to follow the chain (see here for more details). + +Because we use the Flow transactions to interact for the Flow EVM environment, there is no need for complex block formation logs (e.g. miner/block proposer, uncle chains, …). It is executed and verified on Flow similar to the way all other transactions and smart contracts are executed. Its also protected from MEV malicious behaviours using same mechanism that all other Flow transactions are protected. + +On EVM environment, resource consumptions are metered as `gas usage`, when interacting with EVM environment, the total gas usage is translated back into computation usage and would be paid as part of FLOW transaction fees (weigh-adjusted conversion). + +#### EVM Addresses + +On EVM there is no notion of accounts (or minimum balance) and any arbitrary sequence of bytes of length 20 is a valid address. + +Every EVM address has a balance of native token (e.g. ETH on Ethereum), a nonce (for deduplication) and root hash of the state (if smart contract). +In this design we use FLOW token for this native token. The balance of an EVM address is stored as a denomination of FLOW (atto-FLOW) similar to the way Wei is stored for Ethereum accounts. + +```jsx +access(all) contract EVM { + + /// EVMAddress is an EVM-compatible address + access(all) struct EVMAddress { + + /// Bytes of the address + access(all) let bytes: [UInt8; 20] + + /// Constructs a new EVM address from the given byte representation + init(bytes: [UInt8; 20]) + + /// Returns the balance of this address + access(all) fun balance(): @Balance + + /// Deposits the given vault into the EVM account with the given address + access(all) fun deposit(from: @FlowToken.Vault) + } +} +``` + +A FLOW is equivalent of 10^18 atto-FLOW. Because EVM environments uses different way of storage of value for the native token than FLOW protocol (FLOW protocol uses a fixed point representation), to remove any room for mistakes, EVM environment has structure called `Balance` that could be used. + +Note that no new Flow token is minted and every balance on EVM addresses has to be deposited by bridging FLOW tokens into addresses using `deposit` method. + +```jsx +access(all)contract EVM { + + access(all) struct Balance { + /// The balance in FLOW + access(all) let flow: UFix64 + + /// Constructs a new balance, given the balance in FLOW + init(flow: UFix64) + + /// Returns the balance in terms of atto-FLOW. + /// Atto-FLOW is the smallest denomination of FLOW inside EVM + access(all) fun toAttoFlow(): UInt64 + } +} +``` + +Every account on FLOW evm could be queried by constructing an EVM structure. Here is an example: + +```jsx +// Example of balance query +import EVM from + + access(all) + fun main(bytes: [UInt8; 20]) { + let addr = EVM.EVMAddress(bytes: bytes) + let bal = addr.balance() + } +``` + +#### EVM-style transaction wrapping + +One of the design goals for this work is to facilitate interaction with this environment for tools that are not FLOW-compatible. For this goal, the EVM smart contract accepts RLP encoded transactions to be executed. Any transaction could be wrapped and submitted by any one through Flow transactions. As mentioned earlier, the resource usage during EVM interaction is translated back into Flow transaction fees and has to be paid by the account that wrapped the original transaction. + +To facilitate the wrapping operation and refunding, the run interface also allows a coinbase address to be passed. This coinbase address is an EVM address that would receive the gas usage * gas price (set in transaction). Basically, the transaction wrapper behaves similar to a miner, receives the gas usage fees on an EVM address and pays for the transaction fees. + +Any failure during the execution would revert the whole Flow transaction. + +```jsx +// Example of tx wrapping +import EVM from + + access(all) + fun main(rlpEncodedTransaction: [UInt8], coinbaseBytes: [UInt8; 20]) { + let coinbase = EVM.EVMAddress(bytes: coinbaseBytes) + EVM.run(tx: rlpEncodedTransaction, coinbase: coinbase) + } +``` + +For example, a user might use meta-mask to sign transaction for FLOW EVM and broadcast it to services that checks the gas fee on the tx and wraps the transaction to be executed. + +Note that account nonce would protect double execution of a transaction, similar to how other non-virtual blockchains prevent the minor to include a transaction multiple times. + +#### Bridged accounts + +Another major goal for this work is seamless composability across environments. For this goal we have introduced a new type of addresses to the EVM environment (besides EOA and Smart Contract accounts). This new address type are similar to EOA’s except instead of being tied to a public/private key it would be controlled by Cadence resources. Any bridged account has a corresponding `BridgedAccount resource` and any Flow account or Cadence smart contract that holds this resource could interact with the EVM environment on behalf of address that stored in the resource. + +```jsx +access(all)contract EVM { + + access(all) resource BridgedAccount { + + access(self) + let addressBytes: [UInt8; 20] + + /// constructs a new bridged account for the address + init(addressBytes: [UInt8; 20]) + + /// The EVM address of the bridged account + access(all) + fun address(): EVMAddress + + /// Withdraws the balance from the bridged account's balance + access(all) + fun withdraw(balance: Balance): @FlowToken.Vault + + /// Deploys a contract to the EVM environment. + /// Returns the address of the newly deployed contract + access(all) + fun deploy(code: [UInt8], gasLimit: UInt64, value: Balance): EVMAddress + + /// Calls a function with the given data. + /// The execution is limited by the given amount of gas + access(all) + fun call(to: EVMAddress, data: [UInt8], gasLimit: UInt64, value: Balance): [UInt8] + } + + /// Creates a new bridged account + access(all) + fun createBridgedAccount(): @BridgedAccount { + return <-create BridgedAccount( + addressBytes: InternalEVM.createBridgedAccount() + ) + } +} +``` + +Bridge account addresses are allocated by the FVM and stored inside the resource. Calls through the bridged accounts forms a new type of transactions for the EVM that doesn’t requires signatures and doesn’t need nonce checking. Bridged accounts could deploy smart contract or make calls to the ones that are already deployed on Flow EVM. + +Also these bridged accounts facilitates withdrawal of Flow tokens back from EVM balance environment into the Cadence environment through `withdraw`. + +**What about other fungible and non-tokens?** + +The main reason we call these account bridged accounts is their design makes it easy to build bridges. An Cadence smart contract can controls a bridged account which means it could facilitate transactional operation across two environments. For example this smart contract can accept an Fungible on the cadence side and remit the equivalence on the EVM side to a target address in a single Flow transaction. More about this would come in follow up Flips. + +#### Safety and Reproducibility of the EVM state + +EVM state is not accessible by Cadence outside of the defined interfaces above, and Cadence state is also protected against raw access from the E +At the start the EVM state is empty (empty root hash) and all the state is stored under a FLOW account that is not controlled by anyone (network owned). The minimum storage balance is always maintained (through fees). +Any interaction with this environment emits an transactionExecuted event (direct calls for bridged accounts uses `255` as tx type). + +So anyone following these events could reconstruct the whole EVM state by re-executing these transactions. + + +### Drawbacks + +[WIP] + +### Alternatives Considered + +[WIP] + +### Performance Implications + +[WIP] + +* Do you expect any (speed / memory)? How will you confirm? +* There should be microbenchmarks. Are there? +* There should be end-to-end tests and benchmarks. If there are not +(since this is still a design), how will you track that these will be created? + +### Dependencies + +* Dependencies: does this proposal add any new dependencies to Flow? +* Dependent projects: are there other areas of Flow or things that use Flow +(Access API, Wallets, SDKs, etc.) that this affects? +How have you identified these dependencies and are you sure they are complete? +If there are dependencies, how are you managing those changes? + +### Engineering Impact + +* Do you expect changes to binary size / build time / test times? +* Who will maintain this code? Is this code in its own buildable unit? +Can this code be tested in its own? +Is visibility suitably restricted to only a small API surface for others to use? + +### Best Practices + +* Does this proposal change best practices for some aspect of using/developing Flow? +How will these changes be communicated/enforced? + +### Tutorials and Examples + +* If design changes existing API or creates new ones, the design owner should create +end-to-end examples (ideally, a tutorial) which reflects how new feature will be used. +Some things to consider related to the tutorial: + - It should show the usage of the new feature in an end to end example + (i.e. from the browser to the execution node). + Many new features have unexpected effects in parts far away from the place of + change that can be found by running through an end-to-end example. + - This should be written as if it is documentation of the new feature, + i.e., consumable by a user, not a Flow contributor. + - The code does not need to work (since the feature is not implemented yet) + but the expectation is that the code does work before the feature can be merged. + +### Compatibility + +* Does the design conform to the backwards & forwards compatibility [requirements](../docs/compatibility.md)? +* How will this proposal interact with other parts of the Flow Ecosystem? + - How will it work with FCL? + - How will it work with the Emulator? + - How will it work with existing Flow SDKs? + +### User Impact + +* What are the user-facing changes? How will this feature be rolled out? + +## Related Issues + +What related issues do you consider out of scope for this proposal, +but could be addressed independently in the future? + +## Prior Art + +Does the proposed idea/feature exist in other systems and +what experience has their community had? + +This section is intended to encourage you as an author to think about the +lessons learned from other projects and provide readers of the proposal +with a fuller picture. + +It's fine if there is no prior art; your ideas are interesting regardless of +whether or not they are based on existing work. + +## Questions and Discussion + +State where you would want the community discussion to take place (choosing between the PR itself, or forum post) +Seed with open questions you require feedback on from the FLIP process. +What parts of the design still need to be defined? \ No newline at end of file From 1a8a6ec2173a2471fc57cbf6033efa2b03f8d454 Mon Sep 17 00:00:00 2001 From: ramtinms Date: Mon, 27 Nov 2023 19:17:49 -0800 Subject: [PATCH 02/58] fix typos --- protocol/20231116-evm-support.md | 49 ++++++++++++++++---------------- 1 file changed, 24 insertions(+), 25 deletions(-) diff --git a/protocol/20231116-evm-support.md b/protocol/20231116-evm-support.md index 542bc34a..f032926d 100644 --- a/protocol/20231116-evm-support.md +++ b/protocol/20231116-evm-support.md @@ -22,28 +22,28 @@ Please see [this forum discussion](https://forum.flow.com/t/evm-on-flow-beyond-s #### EVM as a standard smart contract -An easy way to understand the approach proposed in this Flip is to consider Flow EVM as a virtual blockchain deployed to Flow blockchain at specific address (e.g. service account). While it behaves as if someone has implemented a complete EVM runtime in Cadence, we utilize the extensibility property of the Cadence runtime and use the same EVM go implementation that Ethereum uses. Cadence runtime is designed to be extensible with standard cadence smart contracts implemented in native languages as long is its resource meter-able, resource-bounded and deterministic. +An easy way to understand the approach proposed in this Flip is to consider Flow EVM as a virtual blockchain deployed to the Flow blockchain at a specific address (e.g., a service account). It behaves as if a complete EVM runtime has been implemented in Cadence. However, we leverage the extensibility property of the Cadence runtime and utilize the same EVM Go implementation that Ethereum uses. The Cadence runtime is designed to be extensible with standard Cadence smart contracts implemented in native languages, as long as the resource is meter-able, resource-bounded, and deterministic. -Every Flow transaction has access to this environment similar to the way it has access to other standard contracts. +Every Flow transaction has access to this environment similar to the way it has access to other standard contracts like RLP encoding etc. -```jsx +``` import EVM from ``` -Every mutable interaction with this smart contract, results in a new block being formed and stored on-chain and emits several FLOW event types ("evm.BlockExecuted”, "evm.TransactionExecuted”) that could be consumed to follow the chain (see here for more details). +Every interaction with this smart contract that changes the state results in the formation of a new block (specific chain IDs), which is then stored on-chain. It also emits several FLOW event types (`evm.BlockExecuted`, `evm.TransactionExecuted`) that can be consumed to track the chain progress. For more details, refer to the documentation [here](https://github.com/onflow/flow-go/blob/master/fvm/evm/types/events.go). -Because we use the Flow transactions to interact for the Flow EVM environment, there is no need for complex block formation logs (e.g. miner/block proposer, uncle chains, …). It is executed and verified on Flow similar to the way all other transactions and smart contracts are executed. Its also protected from MEV malicious behaviours using same mechanism that all other Flow transactions are protected. +Since we use Flow transactions to interact with the Flow EVM environment, there is no need for complex block formation logic, such as handling uncle chains and reorgs. These transactions are executed and verified on Flow just like all other transactions and smart contracts. They are also protected from malicious MEV behaviours using the same mechanism that safeguards all other Flow transactions. On EVM environment, resource consumptions are metered as `gas usage`, when interacting with EVM environment, the total gas usage is translated back into computation usage and would be paid as part of FLOW transaction fees (weigh-adjusted conversion). #### EVM Addresses -On EVM there is no notion of accounts (or minimum balance) and any arbitrary sequence of bytes of length 20 is a valid address. +In the EVM world, there is no concept of accounts or a minimum balance requirement. Any sequence of bytes with a length of 20 is considered a valid address. -Every EVM address has a balance of native token (e.g. ETH on Ethereum), a nonce (for deduplication) and root hash of the state (if smart contract). -In this design we use FLOW token for this native token. The balance of an EVM address is stored as a denomination of FLOW (atto-FLOW) similar to the way Wei is stored for Ethereum accounts. +Every EVM address has a balance of native tokens (e.g. ETH on Ethereum), a nonce (for deduplication) and a root hash of the state (if smart contract). +In this design, we use the FLOW token for this native token. The balance of an EVM address is stored as a smaller denomination of FLOW called `Atto-FLOW`, it works similarly to the way Wei is used to store ETH values on Ethereum. -```jsx +``` access(all) contract EVM { /// EVMAddress is an EVM-compatible address @@ -68,7 +68,7 @@ A FLOW is equivalent of 10^18 atto-FLOW. Because EVM environments uses different Note that no new Flow token is minted and every balance on EVM addresses has to be deposited by bridging FLOW tokens into addresses using `deposit` method. -```jsx +``` access(all)contract EVM { access(all) struct Balance { @@ -87,7 +87,7 @@ access(all)contract EVM { Every account on FLOW evm could be queried by constructing an EVM structure. Here is an example: -```jsx +``` // Example of balance query import EVM from @@ -100,13 +100,13 @@ import EVM from #### EVM-style transaction wrapping -One of the design goals for this work is to facilitate interaction with this environment for tools that are not FLOW-compatible. For this goal, the EVM smart contract accepts RLP encoded transactions to be executed. Any transaction could be wrapped and submitted by any one through Flow transactions. As mentioned earlier, the resource usage during EVM interaction is translated back into Flow transaction fees and has to be paid by the account that wrapped the original transaction. +One of the design goals of this work is to enable interaction with this environment for tools that are only EVM-compatible. To achieve this, the EVM smart contract accepts RLP-encoded transactions for execution. Any transaction can be wrapped and submitted by any user through Flow transactions. As mentioned earlier, the resource usage during EVM interaction is translated into Flow transaction fees, which must be paid by the account that wrapped the original transaction. -To facilitate the wrapping operation and refunding, the run interface also allows a coinbase address to be passed. This coinbase address is an EVM address that would receive the gas usage * gas price (set in transaction). Basically, the transaction wrapper behaves similar to a miner, receives the gas usage fees on an EVM address and pays for the transaction fees. +To facilitate the wrapping operation and refunding, the run interface also allows a coinbase address to be passed. This coinbase address is an EVM address that would receive the gas usage * gas price (set in transaction). Basically, the transaction wrapper behaves similarly to a miner, receives the gas usage fees on an EVM address and pays for the transaction fees. Any failure during the execution would revert the whole Flow transaction. -```jsx +``` // Example of tx wrapping import EVM from @@ -117,15 +117,15 @@ import EVM from } ``` -For example, a user might use meta-mask to sign transaction for FLOW EVM and broadcast it to services that checks the gas fee on the tx and wraps the transaction to be executed. +For example, a user might use meta-mask to sign a transaction for FLOW EVM and broadcast it to services that check the gas fee on the transaction and wrap the transaction to be executed. -Note that account nonce would protect double execution of a transaction, similar to how other non-virtual blockchains prevent the minor to include a transaction multiple times. +Note that account nonce would protect against double execution of a transaction, similar to how other non-virtual blockchains prevent the minor from including a transaction multiple times. #### Bridged accounts -Another major goal for this work is seamless composability across environments. For this goal we have introduced a new type of addresses to the EVM environment (besides EOA and Smart Contract accounts). This new address type are similar to EOA’s except instead of being tied to a public/private key it would be controlled by Cadence resources. Any bridged account has a corresponding `BridgedAccount resource` and any Flow account or Cadence smart contract that holds this resource could interact with the EVM environment on behalf of address that stored in the resource. +Another major goal for this work is seamless composability across environments. For this goal, we have introduced a new type of address to the EVM environment (besides EOA and Smart Contract accounts). This new address type is similar to EOA’s except instead of being tied to a public/private key it would be controlled by Cadence resources. Any bridged account has a corresponding BridgedAccount resource and any Flow account or Cadence smart contract that holds this resource could interact with the EVM environment on behalf of the address that is stored in the resource. -```jsx +``` access(all)contract EVM { access(all) resource BridgedAccount { @@ -165,22 +165,21 @@ access(all)contract EVM { } ``` -Bridge account addresses are allocated by the FVM and stored inside the resource. Calls through the bridged accounts forms a new type of transactions for the EVM that doesn’t requires signatures and doesn’t need nonce checking. Bridged accounts could deploy smart contract or make calls to the ones that are already deployed on Flow EVM. +Bridge account addresses are allocated by the FVM and stored inside the resource. Calls through the bridged accounts form a new type of transaction for the EVM that doesn’t require signatures and doesn’t need nonce checking. Bridged accounts could deploy smart contracts or make calls to the ones that are already deployed on Flow EVM. -Also these bridged accounts facilitates withdrawal of Flow tokens back from EVM balance environment into the Cadence environment through `withdraw`. +Also, these bridged accounts facilitate the withdrawal of Flow tokens back from the EVM balance environment into the Cadence environment through `withdraw`. **What about other fungible and non-tokens?** -The main reason we call these account bridged accounts is their design makes it easy to build bridges. An Cadence smart contract can controls a bridged account which means it could facilitate transactional operation across two environments. For example this smart contract can accept an Fungible on the cadence side and remit the equivalence on the EVM side to a target address in a single Flow transaction. More about this would come in follow up Flips. +The main reason we call these account bridged accounts is their design makes it easy to build bridges. A Cadence smart contract can control a bridged account which means it could facilitate transactional operation across two environments. For example, this smart contract can accept a Fungible on the cadence side and remit the equivalence on the EVM side to a target address in a single Flow transaction. More about this would come in follow-up Flips. #### Safety and Reproducibility of the EVM state -EVM state is not accessible by Cadence outside of the defined interfaces above, and Cadence state is also protected against raw access from the E -At the start the EVM state is empty (empty root hash) and all the state is stored under a FLOW account that is not controlled by anyone (network owned). The minimum storage balance is always maintained (through fees). -Any interaction with this environment emits an transactionExecuted event (direct calls for bridged accounts uses `255` as tx type). +EVM state is not accessible by Cadence outside of the defined interfaces above, and Cadence state is also protected against raw access from the EVM. -So anyone following these events could reconstruct the whole EVM state by re-executing these transactions. +At the start, the EVM state is empty (empty root hash), and all the state is stored under a FLOW account that is not controlled by anyone (network-owned). Any interaction with this environment emits a transactionExecuted event (direct calls for bridged accounts use `255` as transaction type). +So anyone following these events could reconstruct the whole EVM state by re-executing these transactions. ### Drawbacks From 0c99501bec8aaf6a6b57315dcf3e5c9dfdf7dd45 Mon Sep 17 00:00:00 2001 From: "Ramtin M. Seraj" Date: Fri, 1 Dec 2023 11:54:37 -0800 Subject: [PATCH 03/58] Apply suggestions from code review Co-authored-by: j pimmel --- protocol/20231116-evm-support.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/protocol/20231116-evm-support.md b/protocol/20231116-evm-support.md index f032926d..8c5474a8 100644 --- a/protocol/20231116-evm-support.md +++ b/protocol/20231116-evm-support.md @@ -15,7 +15,7 @@ updated: 2023-11-16 ## Motivation -This work would makes it easier for EVM-centeric Dapps and Platforms to adopt Flow. +This work would makes it easier for EVM-centric Dapps and Platforms to adopt Flow. Please see [this forum discussion](https://forum.flow.com/t/evm-on-flow-beyond-solidity/5260) for motivations. ## Design Proposal @@ -66,7 +66,7 @@ access(all) contract EVM { A FLOW is equivalent of 10^18 atto-FLOW. Because EVM environments uses different way of storage of value for the native token than FLOW protocol (FLOW protocol uses a fixed point representation), to remove any room for mistakes, EVM environment has structure called `Balance` that could be used. -Note that no new Flow token is minted and every balance on EVM addresses has to be deposited by bridging FLOW tokens into addresses using `deposit` method. +Note that no new FLOW token is minted and every balance on EVM addresses has to be deposited by bridging FLOW tokens into addresses using `deposit` method. ``` access(all)contract EVM { @@ -85,7 +85,7 @@ access(all)contract EVM { } ``` -Every account on FLOW evm could be queried by constructing an EVM structure. Here is an example: +Every account on Flow EVM could be queried by constructing an EVM structure. Here is an example: ``` // Example of balance query @@ -100,7 +100,7 @@ import EVM from #### EVM-style transaction wrapping -One of the design goals of this work is to enable interaction with this environment for tools that are only EVM-compatible. To achieve this, the EVM smart contract accepts RLP-encoded transactions for execution. Any transaction can be wrapped and submitted by any user through Flow transactions. As mentioned earlier, the resource usage during EVM interaction is translated into Flow transaction fees, which must be paid by the account that wrapped the original transaction. +One of the design goals of this work is to ensure that existing EVM ecosystem tooling and products which builders use can integrate effortlessly. To achieve this, the EVM smart contract accepts RLP-encoded transactions for execution. Any transaction can be wrapped and submitted by any user through Flow transactions. As mentioned earlier, the resource usage during EVM interaction is translated into Flow transaction fees, which must be paid by the account that wrapped the original transaction. To facilitate the wrapping operation and refunding, the run interface also allows a coinbase address to be passed. This coinbase address is an EVM address that would receive the gas usage * gas price (set in transaction). Basically, the transaction wrapper behaves similarly to a miner, receives the gas usage fees on an EVM address and pays for the transaction fees. From 3a3a8054ce8fad6474dd03057642f6233173f2d5 Mon Sep 17 00:00:00 2001 From: "Ramtin M. Seraj" Date: Fri, 1 Dec 2023 11:55:09 -0800 Subject: [PATCH 04/58] Apply suggestions from code review Co-authored-by: j pimmel --- protocol/20231116-evm-support.md | 27 +++------------------------ 1 file changed, 3 insertions(+), 24 deletions(-) diff --git a/protocol/20231116-evm-support.md b/protocol/20231116-evm-support.md index 8c5474a8..7a0226d2 100644 --- a/protocol/20231116-evm-support.md +++ b/protocol/20231116-evm-support.md @@ -167,7 +167,7 @@ access(all)contract EVM { Bridge account addresses are allocated by the FVM and stored inside the resource. Calls through the bridged accounts form a new type of transaction for the EVM that doesn’t require signatures and doesn’t need nonce checking. Bridged accounts could deploy smart contracts or make calls to the ones that are already deployed on Flow EVM. -Also, these bridged accounts facilitate the withdrawal of Flow tokens back from the EVM balance environment into the Cadence environment through `withdraw`. +Bridged accounts also facilitate the withdrawal of Flow tokens back from the EVM balance environment into the Cadence environment through `withdraw`. **What about other fungible and non-tokens?** @@ -177,7 +177,7 @@ The main reason we call these account bridged accounts is their design makes it EVM state is not accessible by Cadence outside of the defined interfaces above, and Cadence state is also protected against raw access from the EVM. -At the start, the EVM state is empty (empty root hash), and all the state is stored under a FLOW account that is not controlled by anyone (network-owned). Any interaction with this environment emits a transactionExecuted event (direct calls for bridged accounts use `255` as transaction type). +At the start, the EVM state is empty (empty root hash), and all the state is stored under a Flow account that is not controlled by anyone (network-owned). Any interaction with this environment emits a transactionExecuted event (direct calls for bridged accounts use `255` as transaction type). So anyone following these events could reconstruct the whole EVM state by re-executing these transactions. @@ -200,11 +200,7 @@ So anyone following these events could reconstruct the whole EVM state by re-exe ### Dependencies -* Dependencies: does this proposal add any new dependencies to Flow? -* Dependent projects: are there other areas of Flow or things that use Flow -(Access API, Wallets, SDKs, etc.) that this affects? -How have you identified these dependencies and are you sure they are complete? -If there are dependencies, how are you managing those changes? +The project introduces no new dependencies from the Ethereum codebase since those required are already included in flow-go ### Engineering Impact @@ -213,11 +209,6 @@ If there are dependencies, how are you managing those changes? Can this code be tested in its own? Is visibility suitably restricted to only a small API surface for others to use? -### Best Practices - -* Does this proposal change best practices for some aspect of using/developing Flow? -How will these changes be communicated/enforced? - ### Tutorials and Examples * If design changes existing API or creates new ones, the design owner should create @@ -249,18 +240,6 @@ Some things to consider related to the tutorial: What related issues do you consider out of scope for this proposal, but could be addressed independently in the future? -## Prior Art - -Does the proposed idea/feature exist in other systems and -what experience has their community had? - -This section is intended to encourage you as an author to think about the -lessons learned from other projects and provide readers of the proposal -with a fuller picture. - -It's fine if there is no prior art; your ideas are interesting regardless of -whether or not they are based on existing work. - ## Questions and Discussion State where you would want the community discussion to take place (choosing between the PR itself, or forum post) From fbb565c74c80e4643d656effe5916b72be869903 Mon Sep 17 00:00:00 2001 From: "Ramtin M. Seraj" Date: Fri, 1 Dec 2023 11:55:45 -0800 Subject: [PATCH 05/58] Apply suggestions from code review Co-authored-by: j pimmel --- protocol/20231116-evm-support.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/protocol/20231116-evm-support.md b/protocol/20231116-evm-support.md index 7a0226d2..ff4f4524 100644 --- a/protocol/20231116-evm-support.md +++ b/protocol/20231116-evm-support.md @@ -102,7 +102,7 @@ import EVM from One of the design goals of this work is to ensure that existing EVM ecosystem tooling and products which builders use can integrate effortlessly. To achieve this, the EVM smart contract accepts RLP-encoded transactions for execution. Any transaction can be wrapped and submitted by any user through Flow transactions. As mentioned earlier, the resource usage during EVM interaction is translated into Flow transaction fees, which must be paid by the account that wrapped the original transaction. -To facilitate the wrapping operation and refunding, the run interface also allows a coinbase address to be passed. This coinbase address is an EVM address that would receive the gas usage * gas price (set in transaction). Basically, the transaction wrapper behaves similarly to a miner, receives the gas usage fees on an EVM address and pays for the transaction fees. +To facilitate the wrapping operation and refunding, the run interface also allows a `coinbase` address to be passed. The use of the `coinbase` address in this context indicates the EVM address which will receive the gas usage * gas price (set in transaction). Essentially, the transaction wrapper behaves similarly to a miner, receives the gas usage fees on an EVM address and pays for the transaction fees. Any failure during the execution would revert the whole Flow transaction. @@ -117,13 +117,13 @@ import EVM from } ``` -For example, a user might use meta-mask to sign a transaction for FLOW EVM and broadcast it to services that check the gas fee on the transaction and wrap the transaction to be executed. +For example, a user might use Metamask to sign a transaction for Flow EVM and broadcast it to services that check the gas fee on the transaction and wrap the transaction to be executed. Note that account nonce would protect against double execution of a transaction, similar to how other non-virtual blockchains prevent the minor from including a transaction multiple times. #### Bridged accounts -Another major goal for this work is seamless composability across environments. For this goal, we have introduced a new type of address to the EVM environment (besides EOA and Smart Contract accounts). This new address type is similar to EOA’s except instead of being tied to a public/private key it would be controlled by Cadence resources. Any bridged account has a corresponding BridgedAccount resource and any Flow account or Cadence smart contract that holds this resource could interact with the EVM environment on behalf of the address that is stored in the resource. +Another major goal for this work is seamless composability across environments. For this goal, we have introduced a new type of address a bridged account, to the EVM environment (besides EOA and Smart Contract accounts). This new address type is similar to EOA’s except instead of being tied to a public/private key it would be controlled by Cadence resources. Unlike EOAs which are created using the key presented by the wallet there is no corresponding EVM key present in a BridgedAccount. Any bridged account is interacted with through BridgedAccount resource and any Flow account or Cadence smart contract that holds this resource could interact with the EVM environment on behalf of the address that is stored in the resource. ``` access(all)contract EVM { @@ -165,7 +165,7 @@ access(all)contract EVM { } ``` -Bridge account addresses are allocated by the FVM and stored inside the resource. Calls through the bridged accounts form a new type of transaction for the EVM that doesn’t require signatures and doesn’t need nonce checking. Bridged accounts could deploy smart contracts or make calls to the ones that are already deployed on Flow EVM. +Bridged account addresses are allocated by the FVM and stored inside the resource. Calls through bridged accounts form a new type of transaction for the EVM that doesn’t require signatures and doesn’t need nonce checking. Bridged accounts could deploy smart contracts or make calls to the ones that are already deployed on Flow EVM. Bridged accounts also facilitate the withdrawal of Flow tokens back from the EVM balance environment into the Cadence environment through `withdraw`. From 4db769c34f63d53fdd0dada67d6115561ba37530 Mon Sep 17 00:00:00 2001 From: ramtinms Date: Mon, 4 Dec 2023 15:37:40 -0800 Subject: [PATCH 06/58] apply pr feedbacks --- protocol/20231116-evm-support.md | 78 ++++++-------------------------- 1 file changed, 14 insertions(+), 64 deletions(-) diff --git a/protocol/20231116-evm-support.md b/protocol/20231116-evm-support.md index ff4f4524..522fffab 100644 --- a/protocol/20231116-evm-support.md +++ b/protocol/20231116-evm-support.md @@ -1,9 +1,9 @@ --- status: draft flip: NNN (set to the issue number) -authors: Ramtin Seraj (ramtin.seraj@flowfoundation.org), ... -sponsor: To be added -updated: 2023-11-16 +authors: Ramtin Seraj (ramtin.seraj@flowfoundation.org), Bastian Müller (bastian@dapperlabs.com) +sponsor: Dieter Shirley (dete@dapperlabs.com) +updated: 2023-12-04 --- # FLIP NNN: EVM integration interface @@ -22,17 +22,22 @@ Please see [this forum discussion](https://forum.flow.com/t/evm-on-flow-beyond-s #### EVM as a standard smart contract -An easy way to understand the approach proposed in this Flip is to consider Flow EVM as a virtual blockchain deployed to the Flow blockchain at a specific address (e.g., a service account). It behaves as if a complete EVM runtime has been implemented in Cadence. However, we leverage the extensibility property of the Cadence runtime and utilize the same EVM Go implementation that Ethereum uses. The Cadence runtime is designed to be extensible with standard Cadence smart contracts implemented in native languages, as long as the resource is meter-able, resource-bounded, and deterministic. +An easy way to understand the approach proposed in this Flip is to consider Flow EVM as a virtual blockchain deployed to the Flow blockchain at a specific address (e.g., a service account). It behaves as if a complete EVM runtime has been implemented in Cadence. However, we leverage the extensibility property of the Cadence runtime and utilize the reference Geth implementation used by many Ethereum nodes. The Cadence runtime is designed to be extensible with standard Cadence smart contracts implemented in native languages, as long as the resource consumption is meter-able and bounded, and operations are deterministic. -Every Flow transaction has access to this environment similar to the way it has access to other standard contracts like RLP encoding etc. +In other words, EVM on Flow is a smart contract that emulates EVM (dedicated chain-ID); signed transactions goes in and a chain of blocks come out. Similar to other built-in standard contracts (e.g. RLP encoding), this EVM environment can be imported inside any Flow transaction or script. ``` import EVM from ``` -Every interaction with this smart contract that changes the state results in the formation of a new block (specific chain IDs), which is then stored on-chain. It also emits several FLOW event types (`evm.BlockExecuted`, `evm.TransactionExecuted`) that can be consumed to track the chain progress. For more details, refer to the documentation [here](https://github.com/onflow/flow-go/blob/master/fvm/evm/types/events.go). +Within the flow transaction, if EVM interaction is successful -Since we use Flow transactions to interact with the Flow EVM environment, there is no need for complex block formation logic, such as handling uncle chains and reorgs. These transactions are executed and verified on Flow just like all other transactions and smart contracts. They are also protected from malicious MEV behaviours using the same mechanism that safeguards all other Flow transactions. +- it makes changes to the on-chain data +- forms a new block if successful, +- emits several FLOW event types (see [here](https://github.com/onflow/flow-go/blob/master/fvm/evm/types/events.go) ) that can be consumed to track the chain progress. +And if unsuccessful, it reverts the transaction. + +As EVM interactions are encapsulated within Flow transactions, they leverage the security measures provided by Flow. These transactions undergo the same process of collection, execution, and verification as other Flow transactions, without any EVM intervention. Consequently, there is no requirement for intricate block formation logic (such as handling forks and reorganizations), mempools, or additional safeguards against malicious MEV (Miner Extractable Value) behaviours. On EVM environment, resource consumptions are metered as `gas usage`, when interacting with EVM environment, the total gas usage is translated back into computation usage and would be paid as part of FLOW transaction fees (weigh-adjusted conversion). @@ -171,7 +176,7 @@ Bridged accounts also facilitate the withdrawal of Flow tokens back from the EVM **What about other fungible and non-tokens?** -The main reason we call these account bridged accounts is their design makes it easy to build bridges. A Cadence smart contract can control a bridged account which means it could facilitate transactional operation across two environments. For example, this smart contract can accept a Fungible on the cadence side and remit the equivalence on the EVM side to a target address in a single Flow transaction. More about this would come in follow-up Flips. +The term "bridged accounts" is used because their design facilitates the building of bridges. A Cadence smart contract can control a bridged account, enabling transactional operations between two environments. For instance, this smart contract can receive a Fungible on the Cadence side and send the equivalent on the EVM side to a specified address, all in a single Flow transaction. More details on this will be provided in subsequent updates. #### Safety and Reproducibility of the EVM state @@ -181,67 +186,12 @@ At the start, the EVM state is empty (empty root hash), and all the state is sto So anyone following these events could reconstruct the whole EVM state by re-executing these transactions. -### Drawbacks - -[WIP] - -### Alternatives Considered - -[WIP] - -### Performance Implications - -[WIP] - -* Do you expect any (speed / memory)? How will you confirm? -* There should be microbenchmarks. Are there? -* There should be end-to-end tests and benchmarks. If there are not -(since this is still a design), how will you track that these will be created? - ### Dependencies The project introduces no new dependencies from the Ethereum codebase since those required are already included in flow-go -### Engineering Impact - -* Do you expect changes to binary size / build time / test times? -* Who will maintain this code? Is this code in its own buildable unit? -Can this code be tested in its own? -Is visibility suitably restricted to only a small API surface for others to use? - ### Tutorials and Examples -* If design changes existing API or creates new ones, the design owner should create -end-to-end examples (ideally, a tutorial) which reflects how new feature will be used. -Some things to consider related to the tutorial: - - It should show the usage of the new feature in an end to end example - (i.e. from the browser to the execution node). - Many new features have unexpected effects in parts far away from the place of - change that can be found by running through an end-to-end example. - - This should be written as if it is documentation of the new feature, - i.e., consumable by a user, not a Flow contributor. - - The code does not need to work (since the feature is not implemented yet) - but the expectation is that the code does work before the feature can be merged. - -### Compatibility - -* Does the design conform to the backwards & forwards compatibility [requirements](../docs/compatibility.md)? -* How will this proposal interact with other parts of the Flow Ecosystem? - - How will it work with FCL? - - How will it work with the Emulator? - - How will it work with existing Flow SDKs? - -### User Impact - -* What are the user-facing changes? How will this feature be rolled out? - -## Related Issues - -What related issues do you consider out of scope for this proposal, -but could be addressed independently in the future? - -## Questions and Discussion +A proof of concept implementation of this proposal is available [here](https://github.com/onflow/flow-emulator/releases/tag/v0.57.4-evm-poc). -State where you would want the community discussion to take place (choosing between the PR itself, or forum post) -Seed with open questions you require feedback on from the FLIP process. What parts of the design still need to be defined? \ No newline at end of file From b8b037815fd21748cbf7d1ab5fcdeb39ca54a1b8 Mon Sep 17 00:00:00 2001 From: ramtinms Date: Mon, 4 Dec 2023 15:56:21 -0800 Subject: [PATCH 07/58] set issue number --- protocol/20231116-evm-support.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/protocol/20231116-evm-support.md b/protocol/20231116-evm-support.md index 522fffab..68fccc41 100644 --- a/protocol/20231116-evm-support.md +++ b/protocol/20231116-evm-support.md @@ -1,12 +1,12 @@ --- status: draft -flip: NNN (set to the issue number) +flip: 223 (set to the issue number) authors: Ramtin Seraj (ramtin.seraj@flowfoundation.org), Bastian Müller (bastian@dapperlabs.com) sponsor: Dieter Shirley (dete@dapperlabs.com) updated: 2023-12-04 --- -# FLIP NNN: EVM integration interface +# FLIP 223: EVM integration interface ## Objective From d82c91d5cedb5670b884ddbfb7de472cff9ad3d7 Mon Sep 17 00:00:00 2001 From: j pimmel Date: Mon, 11 Dec 2023 10:25:47 -0800 Subject: [PATCH 08/58] Apply @turbolent's suggestions from his review MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Bastian Müller Co-authored-by: Greg Santos --- protocol/20231116-evm-support.md | 40 ++++++++++++++------------------ 1 file changed, 18 insertions(+), 22 deletions(-) diff --git a/protocol/20231116-evm-support.md b/protocol/20231116-evm-support.md index 68fccc41..e01999f8 100644 --- a/protocol/20231116-evm-support.md +++ b/protocol/20231116-evm-support.md @@ -1,6 +1,6 @@ --- status: draft -flip: 223 (set to the issue number) +flip: 223 authors: Ramtin Seraj (ramtin.seraj@flowfoundation.org), Bastian Müller (bastian@dapperlabs.com) sponsor: Dieter Shirley (dete@dapperlabs.com) updated: 2023-12-04 @@ -11,11 +11,11 @@ updated: 2023-12-04 ## Objective - Defining a Cadence interface for the EVM integrated into the FVM. -- Facilitates seamless interaction between Cadence and EVM enviornments. +- Facilitates seamless interaction between Cadence and EVM environments. ## Motivation -This work would makes it easier for EVM-centric Dapps and Platforms to adopt Flow. +This work would make it easier for EVM-centric Dapps and Platforms to adopt Flow. Please see [this forum discussion](https://forum.flow.com/t/evm-on-flow-beyond-solidity/5260) for motivations. ## Design Proposal @@ -30,16 +30,16 @@ In other words, EVM on Flow is a smart contract that emulates EVM (dedicated cha import EVM from ``` -Within the flow transaction, if EVM interaction is successful +Within the Flow transaction, if EVM interaction is successful - it makes changes to the on-chain data - forms a new block if successful, -- emits several FLOW event types (see [here](https://github.com/onflow/flow-go/blob/master/fvm/evm/types/events.go) ) that can be consumed to track the chain progress. +- emits several Flow event types (see [here](https://github.com/onflow/flow-go/blob/master/fvm/evm/types/events.go)) that can be consumed to track the chain progress. And if unsuccessful, it reverts the transaction. As EVM interactions are encapsulated within Flow transactions, they leverage the security measures provided by Flow. These transactions undergo the same process of collection, execution, and verification as other Flow transactions, without any EVM intervention. Consequently, there is no requirement for intricate block formation logic (such as handling forks and reorganizations), mempools, or additional safeguards against malicious MEV (Miner Extractable Value) behaviours. -On EVM environment, resource consumptions are metered as `gas usage`, when interacting with EVM environment, the total gas usage is translated back into computation usage and would be paid as part of FLOW transaction fees (weigh-adjusted conversion). +In the EVM environment, resource consumption is metered as "gas usage". When interacting with the EVM environment, the total gas usage is translated back into Flow computation usage and is be paid as part of FLOW transaction fees (weigh-adjusted conversion). #### EVM Addresses @@ -61,7 +61,7 @@ access(all) contract EVM { init(bytes: [UInt8; 20]) /// Returns the balance of this address - access(all) fun balance(): @Balance + access(all) fun balance(): Balance /// Deposits the given vault into the EVM account with the given address access(all) fun deposit(from: @FlowToken.Vault) @@ -96,11 +96,11 @@ Every account on Flow EVM could be queried by constructing an EVM structure. He // Example of balance query import EVM from - access(all) - fun main(bytes: [UInt8; 20]) { - let addr = EVM.EVMAddress(bytes: bytes) - let bal = addr.balance() - } +access(all) +fun main(bytes: [UInt8; 20]) { + let addr = EVM.EVMAddress(bytes: bytes) + let bal = addr.balance() +} ``` #### EVM-style transaction wrapping @@ -115,11 +115,11 @@ Any failure during the execution would revert the whole Flow transaction. // Example of tx wrapping import EVM from - access(all) - fun main(rlpEncodedTransaction: [UInt8], coinbaseBytes: [UInt8; 20]) { - let coinbase = EVM.EVMAddress(bytes: coinbaseBytes) - EVM.run(tx: rlpEncodedTransaction, coinbase: coinbase) - } +access(all) +fun main(rlpEncodedTransaction: [UInt8], coinbaseBytes: [UInt8; 20]) { + let coinbase = EVM.EVMAddress(bytes: coinbaseBytes) + EVM.run(tx: rlpEncodedTransaction, coinbase: coinbase) +} ``` For example, a user might use Metamask to sign a transaction for Flow EVM and broadcast it to services that check the gas fee on the transaction and wrap the transaction to be executed. @@ -162,11 +162,7 @@ access(all)contract EVM { /// Creates a new bridged account access(all) - fun createBridgedAccount(): @BridgedAccount { - return <-create BridgedAccount( - addressBytes: InternalEVM.createBridgedAccount() - ) - } + fun createBridgedAccount(): @BridgedAccount } ``` From c0e3a0f25fafe4ec9e8fd1e33d4b5b71d4c8da1f Mon Sep 17 00:00:00 2001 From: ramtinms Date: Wed, 13 Dec 2023 10:30:16 -0800 Subject: [PATCH 09/58] apply PR feedback --- protocol/20231116-evm-support.md | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/protocol/20231116-evm-support.md b/protocol/20231116-evm-support.md index e01999f8..8779d7af 100644 --- a/protocol/20231116-evm-support.md +++ b/protocol/20231116-evm-support.md @@ -15,16 +15,15 @@ updated: 2023-12-04 ## Motivation -This work would make it easier for EVM-centric Dapps and Platforms to adopt Flow. -Please see [this forum discussion](https://forum.flow.com/t/evm-on-flow-beyond-solidity/5260) for motivations. +Following the discussion [here](https://forum.flow.com/t/evm-on-flow-beyond-solidity/5260), this proposal outlines a path to achieve full EVM equivalence on Flow, enabling developers to deploy any Ethereum decentralized application (dApp) on Flow without making any code changes. This allows developers to fully leverage the native functionality of Flow. Trusted tools and protocols such as Uniswap, Opensea, Metamask, Chainlink Oracle, Layerzero, AAVE, Curve, Remix, and Hardhat will be readily compatible with Flow. Additionally, developers will still have the ability to write Cadence smart contracts to extend and enhance the functionality of Solidity smart contracts, ensuring full composability. + +Support for EVM on Flow enables developers to leverage the network effects and tooling available in Solidity and EVM, while also benefiting from Flow's user-friendly features and mainstream focus for onboarding and user experience. Additionally, developers can take advantage of Cadence's unique capabilities. ## Design Proposal #### EVM as a standard smart contract -An easy way to understand the approach proposed in this Flip is to consider Flow EVM as a virtual blockchain deployed to the Flow blockchain at a specific address (e.g., a service account). It behaves as if a complete EVM runtime has been implemented in Cadence. However, we leverage the extensibility property of the Cadence runtime and utilize the reference Geth implementation used by many Ethereum nodes. The Cadence runtime is designed to be extensible with standard Cadence smart contracts implemented in native languages, as long as the resource consumption is meter-able and bounded, and operations are deterministic. - -In other words, EVM on Flow is a smart contract that emulates EVM (dedicated chain-ID); signed transactions goes in and a chain of blocks come out. Similar to other built-in standard contracts (e.g. RLP encoding), this EVM environment can be imported inside any Flow transaction or script. +To better understand the approach proposed in this Flip, consider Flow EVM as a virtual blockchain deployed to the Flow blockchain at a specific address (e.g., a service account). EVM on Flow functions as a smart contract that emulates the EVM with its own dedicated chain-ID. Signed transactions are inputted, and a chain of blocks is produced as output. Similar to other built-in standard contracts (e.g., RLP encoding), this EVM environment can be imported into any Flow transaction or script. ``` import EVM from From 5dad2cbc4490cf761a18331b6b9cc267ec06b962 Mon Sep 17 00:00:00 2001 From: j pimmel Date: Wed, 13 Dec 2023 12:36:59 -0800 Subject: [PATCH 10/58] Update protocol/20231116-evm-support.md --- protocol/20231116-evm-support.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/protocol/20231116-evm-support.md b/protocol/20231116-evm-support.md index 8779d7af..a1a8958e 100644 --- a/protocol/20231116-evm-support.md +++ b/protocol/20231116-evm-support.md @@ -23,7 +23,9 @@ Support for EVM on Flow enables developers to leverage the network effects and t #### EVM as a standard smart contract -To better understand the approach proposed in this Flip, consider Flow EVM as a virtual blockchain deployed to the Flow blockchain at a specific address (e.g., a service account). EVM on Flow functions as a smart contract that emulates the EVM with its own dedicated chain-ID. Signed transactions are inputted, and a chain of blocks is produced as output. Similar to other built-in standard contracts (e.g., RLP encoding), this EVM environment can be imported into any Flow transaction or script. +To better understand the approach proposed in this Flip, consider EVM on Flow as a virtual blockchain deployed to the Flow blockchain at a specific address (e.g., a service account). EVM on Flow functions as a smart contract that emulates the EVM with its own dedicated chain-ID. Signed transactions are inputted, and a chain of blocks is produced as output. Similar to other built-in standard contracts (e.g., RLP encoding), this EVM environment can be imported into any Flow transaction or script. + +This is made possible using selective integration of the core EVM runtime without the supporting software stack in which it currently exists on Ethereum. For equivalence we also provide an EVM compatible JSON-RPC API implementation to facilitate EVM on Flow interactions from existing EVM clients.``` ``` import EVM from From 8323c2bfdf2515e4abc7e4b00626b5e1f77810d5 Mon Sep 17 00:00:00 2001 From: j pimmel Date: Wed, 13 Dec 2023 12:37:17 -0800 Subject: [PATCH 11/58] Reference uniqueness of BridgedAccount --- protocol/20231116-evm-support.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/protocol/20231116-evm-support.md b/protocol/20231116-evm-support.md index a1a8958e..b6a3691d 100644 --- a/protocol/20231116-evm-support.md +++ b/protocol/20231116-evm-support.md @@ -167,7 +167,7 @@ access(all)contract EVM { } ``` -Bridged account addresses are allocated by the FVM and stored inside the resource. Calls through bridged accounts form a new type of transaction for the EVM that doesn’t require signatures and doesn’t need nonce checking. Bridged accounts could deploy smart contracts or make calls to the ones that are already deployed on Flow EVM. +Bridged account addresses are unique and allocated by the FVM and stored inside the resource. Calls through bridged accounts form a new type of transaction for the EVM that doesn’t require signatures and doesn’t need nonce checking. Bridged accounts could deploy smart contracts or make calls to the ones that are already deployed on Flow EVM. Bridged accounts also facilitate the withdrawal of Flow tokens back from the EVM balance environment into the Cadence environment through `withdraw`. From 5c3004e478fd95403748db537128800688be8072 Mon Sep 17 00:00:00 2001 From: j pimmel Date: Wed, 13 Dec 2023 12:37:38 -0800 Subject: [PATCH 12/58] Link to more tech information about Flow consensus --- protocol/20231116-evm-support.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/protocol/20231116-evm-support.md b/protocol/20231116-evm-support.md index b6a3691d..41608402 100644 --- a/protocol/20231116-evm-support.md +++ b/protocol/20231116-evm-support.md @@ -38,7 +38,7 @@ Within the Flow transaction, if EVM interaction is successful - emits several Flow event types (see [here](https://github.com/onflow/flow-go/blob/master/fvm/evm/types/events.go)) that can be consumed to track the chain progress. And if unsuccessful, it reverts the transaction. -As EVM interactions are encapsulated within Flow transactions, they leverage the security measures provided by Flow. These transactions undergo the same process of collection, execution, and verification as other Flow transactions, without any EVM intervention. Consequently, there is no requirement for intricate block formation logic (such as handling forks and reorganizations), mempools, or additional safeguards against malicious MEV (Miner Extractable Value) behaviours. +As EVM interactions are encapsulated within Flow transactions, they leverage the security measures provided by Flow. These transactions undergo the same process of collection, execution, and verification as other Flow transactions, without any EVM intervention. Consequently, there is no requirement for intricate block formation logic (such as handling forks and reorganizations), mempools, or additional safeguards against malicious MEV (Miner Extractable Value) behaviours. More information about Flow's consensus model is available [here](https://flow.com/core-protocol). In the EVM environment, resource consumption is metered as "gas usage". When interacting with the EVM environment, the total gas usage is translated back into Flow computation usage and is be paid as part of FLOW transaction fees (weigh-adjusted conversion). From f646491ec895442dcccdb24d80080bab1c56188e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bastian=20M=C3=BCller?= Date: Wed, 20 Dec 2023 09:48:03 -0800 Subject: [PATCH 13/58] Apply suggestions from code review --- protocol/20231116-evm-support.md | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/protocol/20231116-evm-support.md b/protocol/20231116-evm-support.md index 41608402..5b4beb7a 100644 --- a/protocol/20231116-evm-support.md +++ b/protocol/20231116-evm-support.md @@ -151,12 +151,14 @@ access(all)contract EVM { fun withdraw(balance: Balance): @FlowToken.Vault /// Deploys a contract to the EVM environment. - /// Returns the address of the newly deployed contract + /// Returns the address of the newly deployed contract. + /// The value (balance) is taken from the EVM account. access(all) fun deploy(code: [UInt8], gasLimit: UInt64, value: Balance): EVMAddress /// Calls a function with the given data. - /// The execution is limited by the given amount of gas + /// The execution is limited by the given amount of gas. + /// The value (balance) is taken from the EVM account. access(all) fun call(to: EVMAddress, data: [UInt8], gasLimit: UInt64, value: Balance): [UInt8] } From dac4fe413d959fbdc9a77233860bd5e18c4c7ca3 Mon Sep 17 00:00:00 2001 From: Jerome P Date: Thu, 21 Dec 2023 16:38:46 -0800 Subject: [PATCH 14/58] Added image directory and EVM diagrams --- .../flow-evm-account-model.png | Bin 0 -> 105470 bytes .../flow-evm-node-endpoints.png | Bin 0 -> 45090 bytes 2 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 protocol/20231116-evm-support/flow-evm-account-model.png create mode 100644 protocol/20231116-evm-support/flow-evm-node-endpoints.png diff --git a/protocol/20231116-evm-support/flow-evm-account-model.png b/protocol/20231116-evm-support/flow-evm-account-model.png new file mode 100644 index 0000000000000000000000000000000000000000..b87929097b71d91a4f6552e4877fbf9afd677406 GIT binary patch literal 105470 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 G-Twov;XmO3 literal 0 HcmV?d00001 diff --git a/protocol/20231116-evm-support/flow-evm-node-endpoints.png b/protocol/20231116-evm-support/flow-evm-node-endpoints.png new file mode 100644 index 0000000000000000000000000000000000000000..2c920d15a820decb0a503aa0a6e14a9745cfe87e GIT binary patch literal 45090 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

    61o8#V=F3$&_O_m##-8vjDsivdo`f+j` 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 t+z` Date: Thu, 21 Dec 2023 16:39:16 -0800 Subject: [PATCH 15/58] Updated FLIP to reflect new naming --- protocol/20231116-evm-support.md | 113 ++++++++++++++++++++++--------- 1 file changed, 82 insertions(+), 31 deletions(-) diff --git a/protocol/20231116-evm-support.md b/protocol/20231116-evm-support.md index 5b4beb7a..390bcf88 100644 --- a/protocol/20231116-evm-support.md +++ b/protocol/20231116-evm-support.md @@ -15,17 +15,30 @@ updated: 2023-12-04 ## Motivation -Following the discussion [here](https://forum.flow.com/t/evm-on-flow-beyond-solidity/5260), this proposal outlines a path to achieve full EVM equivalence on Flow, enabling developers to deploy any Ethereum decentralized application (dApp) on Flow without making any code changes. This allows developers to fully leverage the native functionality of Flow. Trusted tools and protocols such as Uniswap, Opensea, Metamask, Chainlink Oracle, Layerzero, AAVE, Curve, Remix, and Hardhat will be readily compatible with Flow. Additionally, developers will still have the ability to write Cadence smart contracts to extend and enhance the functionality of Solidity smart contracts, ensuring full composability. +Following the discussion [here](https://forum.flow.com/t/evm-on-flow-beyond-solidity/5260), this proposal outlines a +path to achieve full EVM equivalence on Flow, enabling developers to deploy any Ethereum decentralized application +(dapp) on Flow without making any code changes. This allows developers to fully leverage the native functionality of +Flow. Trusted tools and protocols such as Uniswap, Opensea, Metamask, Chainlink Oracle, Layerzero, AAVE, Curve, Remix, +and Hardhat will be readily compatible with Flow. Additionally, developers will still have the ability to write Cadence +smart contracts to extend and enhance the functionality of Solidity smart contracts, ensuring full composability. -Support for EVM on Flow enables developers to leverage the network effects and tooling available in Solidity and EVM, while also benefiting from Flow's user-friendly features and mainstream focus for onboarding and user experience. Additionally, developers can take advantage of Cadence's unique capabilities. +Support for EVM on Flow enables developers to leverage the network effects and tooling available in Solidity and EVM, +while also benefiting from Flow's user-friendly features and mainstream focus for onboarding and user experience. +Additionally, developers can take advantage of Cadence's unique capabilities. ## Design Proposal #### EVM as a standard smart contract -To better understand the approach proposed in this Flip, consider EVM on Flow as a virtual blockchain deployed to the Flow blockchain at a specific address (e.g., a service account). EVM on Flow functions as a smart contract that emulates the EVM with its own dedicated chain-ID. Signed transactions are inputted, and a chain of blocks is produced as output. Similar to other built-in standard contracts (e.g., RLP encoding), this EVM environment can be imported into any Flow transaction or script. +To better understand the approach proposed in this Flip, consider EVM on Flow as a virtual blockchain deployed to the +Flow blockchain at a specific address (e.g., a service account). EVM on Flow functions as a smart contract that +emulates the EVM with its own dedicated chain-ID. Signed transactions are inputted, and a chain of blocks is produced +as output. Similar to other built-in standard contracts (e.g., RLP encoding), this EVM environment can be imported into +any Flow transaction or script. -This is made possible using selective integration of the core EVM runtime without the supporting software stack in which it currently exists on Ethereum. For equivalence we also provide an EVM compatible JSON-RPC API implementation to facilitate EVM on Flow interactions from existing EVM clients.``` +This is made possible using selective integration of the core EVM runtime without the supporting software stack in +which it currently exists on Ethereum. For equivalence we also provide an EVM compatible JSON-RPC API implementation to +facilitate EVM on Flow interactions from existing EVM clients.``` ``` import EVM from @@ -35,19 +48,29 @@ Within the Flow transaction, if EVM interaction is successful - it makes changes to the on-chain data - forms a new block if successful, -- emits several Flow event types (see [here](https://github.com/onflow/flow-go/blob/master/fvm/evm/types/events.go)) that can be consumed to track the chain progress. +- emits several Flow event types (see [here](https://github.com/onflow/flow-go/blob/master/fvm/evm/types/events.go)) +- that can be consumed to track the chain progress. And if unsuccessful, it reverts the transaction. -As EVM interactions are encapsulated within Flow transactions, they leverage the security measures provided by Flow. These transactions undergo the same process of collection, execution, and verification as other Flow transactions, without any EVM intervention. Consequently, there is no requirement for intricate block formation logic (such as handling forks and reorganizations), mempools, or additional safeguards against malicious MEV (Miner Extractable Value) behaviours. More information about Flow's consensus model is available [here](https://flow.com/core-protocol). +As EVM interactions are encapsulated within Flow transactions, they leverage the security measures provided by Flow. +These transactions undergo the same process of collection, execution, and verification as other Flow transactions, +without any EVM intervention. Consequently, there is no requirement for intricate block formation logic (such as +handling forks and reorganizations), mempools, or additional safeguards against malicious MEV (Miner Extractable Value) +behaviours. More information about Flow's consensus model is available [here](https://flow.com/core-protocol). -In the EVM environment, resource consumption is metered as "gas usage". When interacting with the EVM environment, the total gas usage is translated back into Flow computation usage and is be paid as part of FLOW transaction fees (weigh-adjusted conversion). +In the EVM environment, resource consumption is metered as "gas usage". When interacting with the EVM environment, the +total gas usage is translated back into Flow computation usage and is be paid as part of FLOW transaction fees +(weigh-adjusted conversion). #### EVM Addresses -In the EVM world, there is no concept of accounts or a minimum balance requirement. Any sequence of bytes with a length of 20 is considered a valid address. +In the EVM world, there is no concept of accounts or a minimum balance requirement. Any sequence of bytes with a length +of 20 is considered a valid address. -Every EVM address has a balance of native tokens (e.g. ETH on Ethereum), a nonce (for deduplication) and a root hash of the state (if smart contract). -In this design, we use the FLOW token for this native token. The balance of an EVM address is stored as a smaller denomination of FLOW called `Atto-FLOW`, it works similarly to the way Wei is used to store ETH values on Ethereum. +Every EVM address has a balance of native tokens (e.g. ETH on Ethereum), a nonce (for deduplication) and a root hash of +the state (if smart contract). +In this design, we use the FLOW token for this native token. The balance of an EVM address is stored as a smaller +denomination of FLOW called `Atto-FLOW`, it works similarly to the way Wei is used to store ETH values on Ethereum. ``` access(all) contract EVM { @@ -70,9 +93,12 @@ access(all) contract EVM { } ``` -A FLOW is equivalent of 10^18 atto-FLOW. Because EVM environments uses different way of storage of value for the native token than FLOW protocol (FLOW protocol uses a fixed point representation), to remove any room for mistakes, EVM environment has structure called `Balance` that could be used. +A FLOW is equivalent of 10^18 atto-FLOW. Because EVM environments uses different way of storage of value for the native +token than FLOW protocol (FLOW protocol uses a fixed point representation), to remove any room for mistakes, EVM +environment has structure called `Balance` that could be used. -Note that no new FLOW token is minted and every balance on EVM addresses has to be deposited by bridging FLOW tokens into addresses using `deposit` method. +Note that no new FLOW token is minted and every balance on EVM addresses has to be deposited by bridging FLOW tokens +into addresses using `deposit` method. ``` access(all)contract EVM { @@ -106,9 +132,16 @@ fun main(bytes: [UInt8; 20]) { #### EVM-style transaction wrapping -One of the design goals of this work is to ensure that existing EVM ecosystem tooling and products which builders use can integrate effortlessly. To achieve this, the EVM smart contract accepts RLP-encoded transactions for execution. Any transaction can be wrapped and submitted by any user through Flow transactions. As mentioned earlier, the resource usage during EVM interaction is translated into Flow transaction fees, which must be paid by the account that wrapped the original transaction. +One of the design goals of this work is to ensure that existing EVM ecosystem tooling and products which builders use +can integrate effortlessly. To achieve this, the EVM smart contract accepts RLP-encoded transactions for execution. Any +transaction can be wrapped and submitted by any user through Flow transactions. As mentioned earlier, the resource +usage during EVM interaction is translated into Flow transaction fees, which must be paid by the account that wrapped +the original transaction. -To facilitate the wrapping operation and refunding, the run interface also allows a `coinbase` address to be passed. The use of the `coinbase` address in this context indicates the EVM address which will receive the gas usage * gas price (set in transaction). Essentially, the transaction wrapper behaves similarly to a miner, receives the gas usage fees on an EVM address and pays for the transaction fees. +To facilitate the wrapping operation and refunding, the run interface also allows a `coinbase` address to be passed. +The use of the `coinbase` address in this context indicates the EVM address which will receive the gas usage * gas +price (set in transaction). Essentially, the transaction wrapper behaves similarly to a miner, receives the gas usage +fees on an EVM address and pays for the transaction fees. Any failure during the execution would revert the whole Flow transaction. @@ -123,30 +156,38 @@ fun main(rlpEncodedTransaction: [UInt8], coinbaseBytes: [UInt8; 20]) { } ``` -For example, a user might use Metamask to sign a transaction for Flow EVM and broadcast it to services that check the gas fee on the transaction and wrap the transaction to be executed. +For example, a user might use Metamask to sign a transaction for Flow EVM and broadcast it to services that check the +gas fee on the transaction and wrap the transaction to be executed. -Note that account nonce would protect against double execution of a transaction, similar to how other non-virtual blockchains prevent the minor from including a transaction multiple times. +Note that account nonce would protect against double execution of a transaction, similar to how other non-virtual +blockchains prevent the minor from including a transaction multiple times. -#### Bridged accounts +#### Cadence Owned Accounts -Another major goal for this work is seamless composability across environments. For this goal, we have introduced a new type of address a bridged account, to the EVM environment (besides EOA and Smart Contract accounts). This new address type is similar to EOA’s except instead of being tied to a public/private key it would be controlled by Cadence resources. Unlike EOAs which are created using the key presented by the wallet there is no corresponding EVM key present in a BridgedAccount. Any bridged account is interacted with through BridgedAccount resource and any Flow account or Cadence smart contract that holds this resource could interact with the EVM environment on behalf of the address that is stored in the resource. +Another major goal for this work is seamless composability across environments. For this goal, we have introduced a new +type of address a Cadence Owned Account (COA), to the EVM environment (besides EOA and Smart Contract accounts). This new address +type is similar to EOA’s except instead of being tied to a public/private key it would be controlled by Cadence +resources. Unlike EOAs which are created using the key presented by the wallet there is no corresponding EVM key +present in a CadenceOwnedAccount. Any COA is interacted with through CadenceOwnedAccount Resource and any Flow +account or Cadence smart contract that holds this resource could interact with the EVM environment on behalf of the +address that is stored in the resource. ``` access(all)contract EVM { - access(all) resource BridgedAccount { + access(all) resource CadenceOwnedAccount { access(self) let addressBytes: [UInt8; 20] - /// constructs a new bridged account for the address + /// constructs a new Cadence owned account for the address init(addressBytes: [UInt8; 20]) - /// The EVM address of the bridged account + /// The EVM address of the Cadence owned account access(all) fun address(): EVMAddress - /// Withdraws the balance from the bridged account's balance + /// Withdraws the balance from the Cadence owned account's balance access(all) fun withdraw(balance: Balance): @FlowToken.Vault @@ -163,34 +204,44 @@ access(all)contract EVM { fun call(to: EVMAddress, data: [UInt8], gasLimit: UInt64, value: Balance): [UInt8] } - /// Creates a new bridged account + /// Creates a new Cadence owned account access(all) - fun createBridgedAccount(): @BridgedAccount + fun createCadenceOwnedAccount(): @CadenceOwnedAccount } ``` -Bridged account addresses are unique and allocated by the FVM and stored inside the resource. Calls through bridged accounts form a new type of transaction for the EVM that doesn’t require signatures and doesn’t need nonce checking. Bridged accounts could deploy smart contracts or make calls to the ones that are already deployed on Flow EVM. +COA addresses are unique and allocated by the FVM and stored inside the resource. Calls through COAs form a new type of +transaction for the EVM that doesn't require signatures and doesn't need nonce checking. +COAs can deploy smart contracts or make calls to already deployed contracts on Flow EVM. -Bridged accounts also facilitate the withdrawal of Flow tokens back from the EVM balance environment into the Cadence environment through `withdraw`. +COAs also facilitate the withdrawal of Flow tokens back from the EVM balance environment into the Cadence +environment through `withdraw`. **What about other fungible and non-tokens?** -The term "bridged accounts" is used because their design facilitates the building of bridges. A Cadence smart contract can control a bridged account, enabling transactional operations between two environments. For instance, this smart contract can receive a Fungible on the Cadence side and send the equivalent on the EVM side to a specified address, all in a single Flow transaction. More details on this will be provided in subsequent updates. +The term "Cadence Owned accounts" is used because their design facilitates the building of bridges. A Cadence smart +contract can control a COA, enabling transactional operations between two environments. For instance, this +smart contract can receive a Fungible on the Cadence side and send the equivalent on the EVM side to a specified address, +all in a single Flow transaction. More details on this will be provided in subsequent updates. #### Safety and Reproducibility of the EVM state -EVM state is not accessible by Cadence outside of the defined interfaces above, and Cadence state is also protected against raw access from the EVM. +EVM state is not accessible by Cadence outside the defined interfaces above, and Cadence state is also protected +against raw access from the EVM. -At the start, the EVM state is empty (empty root hash), and all the state is stored under a Flow account that is not controlled by anyone (network-owned). Any interaction with this environment emits a transactionExecuted event (direct calls for bridged accounts use `255` as transaction type). +At the start, the EVM state is empty (empty root hash), and all the state is stored under a Flow account that is not +controlled by anyone (network-owned). Any interaction with this environment emits a transactionExecuted event (direct +calls for COAs use `255` as transaction type). So anyone following these events could reconstruct the whole EVM state by re-executing these transactions. ### Dependencies -The project introduces no new dependencies from the Ethereum codebase since those required are already included in flow-go +The project introduces no new dependencies from the Ethereum codebase since those required are already included in +flow-go ### Tutorials and Examples A proof of concept implementation of this proposal is available [here](https://github.com/onflow/flow-emulator/releases/tag/v0.57.4-evm-poc). -What parts of the design still need to be defined? \ No newline at end of file +### What parts of the design still need to be defined? \ No newline at end of file From 900af71343b5167b5f122b74507626358e82480c Mon Sep 17 00:00:00 2001 From: Jerome P Date: Thu, 21 Dec 2023 16:53:11 -0800 Subject: [PATCH 16/58] Added Flow EVM account model diagram --- protocol/20231116-evm-support.md | 7 +++++-- .../flow-evm-account-model.png | Bin 105470 -> 130276 bytes 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/protocol/20231116-evm-support.md b/protocol/20231116-evm-support.md index 390bcf88..75b34db1 100644 --- a/protocol/20231116-evm-support.md +++ b/protocol/20231116-evm-support.md @@ -170,7 +170,7 @@ type is similar to EOA’s except instead of being tied to a public/private key resources. Unlike EOAs which are created using the key presented by the wallet there is no corresponding EVM key present in a CadenceOwnedAccount. Any COA is interacted with through CadenceOwnedAccount Resource and any Flow account or Cadence smart contract that holds this resource could interact with the EVM environment on behalf of the -address that is stored in the resource. +address that is stored in the resource. ``` access(all)contract EVM { @@ -212,7 +212,10 @@ access(all)contract EVM { COA addresses are unique and allocated by the FVM and stored inside the resource. Calls through COAs form a new type of transaction for the EVM that doesn't require signatures and doesn't need nonce checking. -COAs can deploy smart contracts or make calls to already deployed contracts on Flow EVM. +COAs can deploy smart contracts or make calls to already deployed contracts on Flow EVM. + +![Illustration of EVM integration design proposed to realize EVM on Flow](20231116-evm-support/flow-evm-account-model.png) + COAs also facilitate the withdrawal of Flow tokens back from the EVM balance environment into the Cadence environment through `withdraw`. diff --git a/protocol/20231116-evm-support/flow-evm-account-model.png b/protocol/20231116-evm-support/flow-evm-account-model.png index b87929097b71d91a4f6552e4877fbf9afd677406..e70013a9f3fd5d0efbe9303082ed6d59be080c8d 100644 GIT binary patch literal 130276 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