From b6f45ddbf55b8ca6311a2871e9fb5228588bd0f3 Mon Sep 17 00:00:00 2001 From: Ian Traas <108365619+itraas@users.noreply.github.com> Date: Mon, 5 Sep 2022 11:44:39 -0500 Subject: [PATCH 01/69] Update overview.md Updated copy for clarity and style. --- src/development/overview.md | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/src/development/overview.md b/src/development/overview.md index 7380516..f016abe 100644 --- a/src/development/overview.md +++ b/src/development/overview.md @@ -1,23 +1,24 @@ # Wormhole Development Overview -The general flow for a cross-chain message goes from an application deployed to chain A, to the Wormhole contract on chain A, to the Guardian network, then submitted to chain B. +Cross-chain messages typically flow from an application deployed to a blockchain to the Wormhole contract on that same chain, then to the Guardian network, and finally submitted to a host chain. -To get started and simulate this flow locally, you'll need a local environment to test your xdapp code. To test, we need to be able to deploy some chains, deploy the Wormhole contracts to these chains, and then run at least one Wormhole validator to pick up messages. +To simulate this process, you'll need a local environment to test your xDapp code. That local environment needs to be able to deploy some chains, deploy Wormhole contracts to the chains and run at least one Wormhole validator to pick up messages. -Later, we can introduce a relayer to automatically submit messages, though that's currently supported for Mainnet Token Bridge native and stable coin transfers only. Developers currently have to use either a manual relayer method or an app-sepecific relayer (more on that in the Relayer section). +Later, we can introduce a relayer to automatically submit messages, though this is currently supported for Mainnet Token Bridge native and stable coin transfers only. Currently, developers need to use either a manual relayer method or an app-sepecific relayer (more on that in the Relayer section). -Before we setup an xdapp project, we'll need to choose a local environment to run the Wormhole Guardian Network. We can use either Wormhole Local Validator or Tilt. +Before we setup an xDapp project, we'll need to choose a local environment to run the Wormhole Guardian Network. We can use either Wormhole Local Validator or Tilt. + +- [Wormhole Local Validator](./wormhole-local-validator.md): This is the simplest custom environment. It's BYOB (Bring your own Blockchain) with the ability to run your own local validator nodes and connect them to a single Guardian running on docker. Initial setup can take upwards of 500 seconds, but after the image is built, bringing it up and down should take less than a minute. This environment requires installing the software for the validator nodes locally. -- [Wormhole Local Validator](./wormhole-local-validator.md): This is the simplest custom environment. It's BYOB (Bring your own Blockchain), where you can run your own local validator nodes and connect them to a single Guardian running on docker. Initial setup can take upwards of 500 seconds, but after the image is built, bringing it up and down is usually <1 minute. This environment requires installing the software for the validator nodes locally on your computer or somewhere to run them. - [Tilt](./tilt/overview.md): A full-fledged Kubernetes deployment of *every* chain connected to Wormhole, along with a Guardian node. Usually takes 30 min to spin up fully, but comes with all chains running out of the box. ### Testnet -If you want to test on the various test and devnets of existing connected chains, there's a single Guardian node watching for transactions on various test networks. You can find the contracts [here](../reference/contracts.md) and the rpc node [here](../reference/rpcnodes.md). +If you want to test on the various test and devnets of existing connected chains, there's a single Guardian node watching for transactions on various test networks. You can find the contracts at [../reference/contracts.md] and the rpc node at [../reference/rpcnodes.md]. Because testnet only has a single Guardian, there's a small chance that your VAAs will not be processed. This rate is *not* indiciative of performance on mainnet, where there are 19 Guardians watching for transactions. ### Mainnet -When you're ready to deploy to mainnet, you can find the mainnet contracts [here](../reference/contracts.md) and the mainnet rpc nodes [here](../reference/rpcnodes.md). +When you're ready to deploy to mainnet, you can find the mainnet contracts at [../reference/contracts.md] and the mainnet rpc nodes [../reference/rpcnodes.md]. ## Next Steps To get started, first clone the a local host environment (WLV or Tilt), then proceed to the first project, the [evm-messenger](../projects/evm-messenger/overview.md). From 84a58a55d6aacfae97da6ddaae6457c3002087b0 Mon Sep 17 00:00:00 2001 From: Ian Traas <108365619+itraas@users.noreply.github.com> Date: Mon, 5 Sep 2022 15:04:48 -0500 Subject: [PATCH 02/69] Update overview.md Updated for clarity. --- src/development/overview.md | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/src/development/overview.md b/src/development/overview.md index f016abe..f23372b 100644 --- a/src/development/overview.md +++ b/src/development/overview.md @@ -1,24 +1,24 @@ # Wormhole Development Overview -Cross-chain messages typically flow from an application deployed to a blockchain to the Wormhole contract on that same chain, then to the Guardian network, and finally submitted to a host chain. +Cross-chain messages typically flow from an application deployed to a blockchain to the Wormhole contract on that same chain, then to the Guardian network before finally being submitted to a host chain. -To simulate this process, you'll need a local environment to test your xDapp code. That local environment needs to be able to deploy some chains, deploy Wormhole contracts to the chains and run at least one Wormhole validator to pick up messages. +To test your xDapp code, you'll need a local environment to simulate this process. Your local environment needs to be able to deploy multiple chains, deploy Wormhole contracts to those chains and run at least one Wormhole validator to pick up messages. -Later, we can introduce a relayer to automatically submit messages, though this is currently supported for Mainnet Token Bridge native and stable coin transfers only. Currently, developers need to use either a manual relayer method or an app-sepecific relayer (more on that in the Relayer section). +Later, we can introduce a relayer to automatically submit messages, though this is currently supported for Mainnet Token Bridge native and stable coin transfers only. Currently, developers need to use either a manual relayer method or an app-sepecific relayer. You can find more details on relayers in the Relayers section of this guide. -Before we setup an xDapp project, we'll need to choose a local environment to run the Wormhole Guardian Network. We can use either Wormhole Local Validator or Tilt. +Before we set up an xDapp project, we'll need to choose a local environment to run the Wormhole Guardian Network. Our best options are either Wormhole Local Validator or Tilt. - [Wormhole Local Validator](./wormhole-local-validator.md): This is the simplest custom environment. It's BYOB (Bring your own Blockchain) with the ability to run your own local validator nodes and connect them to a single Guardian running on docker. Initial setup can take upwards of 500 seconds, but after the image is built, bringing it up and down should take less than a minute. This environment requires installing the software for the validator nodes locally. -- [Tilt](./tilt/overview.md): A full-fledged Kubernetes deployment of *every* chain connected to Wormhole, along with a Guardian node. Usually takes 30 min to spin up fully, but comes with all chains running out of the box. +- [Tilt](./tilt/overview.md): A full-fledged Kubernetes deployment of every chain connected to Wormhole, along with a Guardian node. Usually takes 30 min to spin up fully, but comes with all chains running out of the box. + +### First Steps +To get started, first clone the a local host environment (WLV or Tilt), then proceed to the first project, the [evm-messenger](../projects/evm-messenger/overview.md). ### Testnet If you want to test on the various test and devnets of existing connected chains, there's a single Guardian node watching for transactions on various test networks. You can find the contracts at [../reference/contracts.md] and the rpc node at [../reference/rpcnodes.md]. -Because testnet only has a single Guardian, there's a small chance that your VAAs will not be processed. This rate is *not* indiciative of performance on mainnet, where there are 19 Guardians watching for transactions. +Because testnet only has a single Guardian, there's a small chance that your VAAs will not be processed. This rate is not indiciative of performance on mainnet, where there are 19 Guardians watching for transactions. ### Mainnet -When you're ready to deploy to mainnet, you can find the mainnet contracts at [../reference/contracts.md] and the mainnet rpc nodes [../reference/rpcnodes.md]. - -## Next Steps -To get started, first clone the a local host environment (WLV or Tilt), then proceed to the first project, the [evm-messenger](../projects/evm-messenger/overview.md). +When you're ready to deploy to mainnet, you can find the mainnet contracts at [../reference/contracts.md] and the mainnet rpc nodes at [../reference/rpcnodes.md]. From be4d0c70e20e40d94455a01245b386bde24db01e Mon Sep 17 00:00:00 2001 From: Ian Traas <108365619+itraas@users.noreply.github.com> Date: Mon, 5 Sep 2022 15:08:28 -0500 Subject: [PATCH 03/69] Update wormhole-local-validator.md Updated for link consistency --- src/development/wormhole-local-validator.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/development/wormhole-local-validator.md b/src/development/wormhole-local-validator.md index 61db8d6..a07a96d 100644 --- a/src/development/wormhole-local-validator.md +++ b/src/development/wormhole-local-validator.md @@ -1,5 +1,5 @@ # Wormhole Local Validator -The Wormhole Local Validator is available [here](https://github.com/certusone/xdapp-book/tree/main/projects/wormhole-local-validator). Along with the Wormhole Local Validator, this also contains code to spin up EVM and Solana local validators, as well as deployment code to add Wormhole contracts to those new chains. +[The Wormhole Local Validator is available here](https://github.com/certusone/xdapp-book/tree/main/projects/wormhole-local-validator). Along with the Wormhole Local Validator, this link also contains code to spin up EVM and Solana local validators along with deployment code to add Wormhole contracts to those new chains. ## Dependencies You will need Docker; if you're developing on your computer you should get [Docker Desktop](https://docs.docker.com/get-docker/), but if you're in a headless VM, install [Docker Engine](https://docs.docker.com/engine/). Make sure to have Docker running before you run any of the following commands. @@ -23,4 +23,4 @@ Simply run `npm run wormhole`, which will pull and run the Wormhole Guardian doc ### FAQ & Common Problems - Anvil isn't working -While we recommend Foundry's Forge tool for compiling and deploying code elsewhere in these docs, we *do not* at this time recommend using anvil for guardiand; this is because guardiand is spec'd against go-ethereum, and anvil is out of spec for how it reports block headers (non left padding to normalize length), which means go-ethereum reacts abnormally and can't read anvil headers. +While we recommend Foundry's Forge tool for compiling and deploying code elsewhere in these docs, we do not at this time recommend using anvil for guardiand; this is because guardiand is spec'd against go-ethereum, and anvil is out of spec for how it reports block headers (non left padding to normalize length), which means go-ethereum reacts abnormally and can't read anvil headers. From 924afce5621ca6dac9abe0f0ec7362965c35996c Mon Sep 17 00:00:00 2001 From: Ian Traas <108365619+itraas@users.noreply.github.com> Date: Mon, 5 Sep 2022 15:09:39 -0500 Subject: [PATCH 04/69] Update overview.md Updated for link consistency. --- src/development/overview.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/development/overview.md b/src/development/overview.md index f23372b..a66bdc2 100644 --- a/src/development/overview.md +++ b/src/development/overview.md @@ -16,7 +16,7 @@ Before we set up an xDapp project, we'll need to choose a local environment to r To get started, first clone the a local host environment (WLV or Tilt), then proceed to the first project, the [evm-messenger](../projects/evm-messenger/overview.md). ### Testnet -If you want to test on the various test and devnets of existing connected chains, there's a single Guardian node watching for transactions on various test networks. You can find the contracts at [../reference/contracts.md] and the rpc node at [../reference/rpcnodes.md]. +If you want to test on the various test and devnets of existing connected chains, there's a single Guardian node watching for transactions on various test networks. You can find the contracts at [../reference/contracts.md](../reference/contracts.md) and the rpc node at [../reference/rpcnodes.md](../reference/rpcnodes.md). Because testnet only has a single Guardian, there's a small chance that your VAAs will not be processed. This rate is not indiciative of performance on mainnet, where there are 19 Guardians watching for transactions. From 48b4646cd7906041eb96eeff73f05597e570d8cd Mon Sep 17 00:00:00 2001 From: Ian Traas <108365619+itraas@users.noreply.github.com> Date: Mon, 5 Sep 2022 15:10:32 -0500 Subject: [PATCH 05/69] Update overview.md --- src/development/overview.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/development/overview.md b/src/development/overview.md index a66bdc2..bd663b6 100644 --- a/src/development/overview.md +++ b/src/development/overview.md @@ -21,4 +21,4 @@ If you want to test on the various test and devnets of existing connected chains Because testnet only has a single Guardian, there's a small chance that your VAAs will not be processed. This rate is not indiciative of performance on mainnet, where there are 19 Guardians watching for transactions. ### Mainnet -When you're ready to deploy to mainnet, you can find the mainnet contracts at [../reference/contracts.md] and the mainnet rpc nodes at [../reference/rpcnodes.md]. +When you're ready to deploy to mainnet, you can find the mainnet contracts at [../reference/contracts.md](../reference/contracts.md) and the mainnet rpc nodes at [../reference/rpcnodes.md](../reference/rpcnodes.md). From 65f7799e21461a09bcbea61cd1f8565b721c9fa3 Mon Sep 17 00:00:00 2001 From: Ian Traas <108365619+itraas@users.noreply.github.com> Date: Mon, 5 Sep 2022 18:44:57 -0500 Subject: [PATCH 06/69] Update 4_topology.md Updated copy and formatting for clarity, grammar and style. --- src/dapps/architecture/4_topology.md | 54 ++++++++++++++-------------- 1 file changed, 27 insertions(+), 27 deletions(-) diff --git a/src/dapps/architecture/4_topology.md b/src/dapps/architecture/4_topology.md index d344f12..b1a1512 100644 --- a/src/dapps/architecture/4_topology.md +++ b/src/dapps/architecture/4_topology.md @@ -1,73 +1,73 @@ # Topology -Topology describes how data flows through your application, and the responsibilities of each component. The primary decision to be made with regard to topology is mainly where your smart contracts will live, and what responsibilities each contract holds. +Topology describes how data flows through your application and defines the responsibilities of each component. In terms of overall xDapp topology, the primary decision is determining where your smart contracts will live and the responsibilities each contract will hold. ## Ultra-light Clients ![Ultra-light client](../../diagrams/images/ultralight.png "Ultra Light Clients") -Ultra-light Clients are often the best option when designing an MVP for your xDapp. The defining feature of an Ultra-light Client is that you are able to support users from every chain in the Wormhole ecosystem while **only having smart contracts on a single chain (!!!)**. +Ultra-light clients are often the best option when designing an MVP for your xDapp. The defining feature of an ultra-light client is the ability to support users from every chain in the Wormhole ecosystem while only having smart contracts on a single chain. -This works by deploying a single _hub_ contract (or just using an existing Dapp) onto the hub chain. You then add an entrypoint which supports _contract controlled transfers_ from the xAsset contracts on the hub chain. This allows your hub contract to receive both tokens **and instructions for what to do with them** from other chains in the Wormhole ecosystem. +This works by deploying a single _hub_ contract (or just using an existing Dapp) onto the hub chain. From there, add an entrypoint which supports _contract controlled transfers_ from the xAsset contracts on the hub chain. This allows your hub contract to receive tokens--and instructions for what to do with them--from other chains in the Wormhole ecosystem. -From there, the hub contract performs any necessary operations, and bridges any resultant tokens back to the wallet which iniated the contract controlled transfer. The only on-chain components are hub contract, and a relatively lightweight wrapper which allows the hub contract to send and receive tokens using the xAsset contracts. All other aspects of this topology are off-chain and untrusted. This pushes most of the development work out of smart contracts and into client-side typescript. This dramatically decreases smart contract risk, without altering the trust assumptions of your application. +Once that's done, the hub contract performs any necessary operations and bridges any resultant tokens back to the wallet which initiated the transfer. The only on-chain components are the hub contract and a lightweight wrapper that allows the hub contract to send and receive tokens using the xAsset contracts. All other elements of this topology are off-chain and untrusted. This pushes most of the development work out of smart contracts and into client-side typescript, dramatically decreasing smart contract risk without altering the trust assumptions of your application. **_Advantages:_** -- Very little added smart contract risk. -- Simple to develop. -- Easiest way to get heterogenous ecosystem support. +- Risk: Very little added smart contract risk. +- Ease: Simple to develop. +- Community: Easiest way to get heterogenous ecosystem support. **_Disadvantages:_** - Latency: Because all transactions have to bridge in and out of the hub chain, each transaction incurs the finality latency of both the remote and hub chain. -- Transaction Fees: There are always a grand total of three transactions. Two on the remote chain, and one on the hub chain. +- Transaction fees: There are always a grand total of three transactions. Two on the remote chain, and one on the hub chain. - Use cases: There is no place to perform trusted computation on the remote chain, so some use cases are more difficult to implement (or potentially not possible). -## Hub and Spoke +## Hub-and-Spoke -Hub and Spoke models are somewhat of a natural evolution of the ultra-light client. There is still a hub contract which handles all transactions, but there is now also a contract deployed to all the remote chains. +Hub-and-spoke models are a natural evolution of the ultra-light client. A hub contract still handles all transactions, but there is now also a contract deployed to all the remote chains. -Advantages: +**_Advantages:_** -- Remote contracts are lightweight and don't carry large amounts of risk. -- Can perform trusted checks on the remote chain. (Such as validating wallet balance, or any other piece of blockchain state) +- Risk: Remote contracts are lightweight and don't carry large amounts of risk. +- Flexibility: Can perform trusted checks on the remote chain (such as validating wallet balance, or any other piece of blockchain state). -Disadvantages: +**_Disadvantages:_** -- Latency (same as ultra-light clients) -- Transaction Fees -- Managing multiple contracts +- Latency: Same as ultra-light clients, where each transaction incurs the finality latency of both the remote and hub chain. +- Transaction fees: There are always a grand total of three transactions, in the same fashion as ultra-light clients. +- Complexity: Requires managing multiple contracts. ## Mesh -A Mesh topology is one where each chain implements the full logic for a process, such that each contract is a peer of other contracts in the trusted network and can act autonomously. +A mesh topology is one where each chain implements the full logic for a process, such that each contract is a peer of other contracts in the trusted network and can act autonomously. -Advantages: +**_Advantages:_** - Latency: Users can often perform their operation without waiting for other chains. - Transaction Fees: Does not stack the transaction fees of multiple chains. -Disadvantages: +**_Disadvantages:_** -- Complexity: there are now quite a few contracts to manage, especially if they are implemented multiple times across different VMs. -- Data desync: because each blockchain acts independently, each chain will have independent state. This can open up unwanted arbitrage opportunities and other discrepancies. +- Complexity: There are now quite a few contracts to manage, especially if they are implemented multiple times across different VMs. +- Data desync: Because each blockchain acts independently, each chain will have independent state. This can open up unwanted arbitrage opportunities and other discrepancies. - Race conditions: In cases where an event is supposed to propagate through the entire system at a fixed time (for example, when closing a governance vote), it can be difficult to synchronize all the blockchains. ## Distributed A distributed topology is one where different blockchains have different responsibilities. -Advantages: +**_Advantages:_** -- Power: utilize each blockchain for whatever is most optimal. +- Power: Utilizes each blockchain for their individual strengths. -Disadvantages: +**_Disadvantages:_** -- Complexity: requires multiple specialized smart contracts, and potentially additional on-chain processes. +- Complexity: Requires multiple specialized smart contracts and additional on-chain processes. ## Mix & Match -Different use cases have different optimal topologies, and it's possible to use different topologies for different workflows in your application. This means you should not feel 'locked in' to a single topology, and should instead consider designing each workflow independently. For example, governance workflows are generally best implemented using a Hub and Spoke topology, even if the rest of the application uses a Mesh architecture. As such, your contracts will likely evolve over time as your xDapp evolves and adds additional workflows. +Different use cases have different optimal topologies, and it's possible to use different topologies for different workflows. You should not feel 'locked in' to a single topology, so consider designing each workflow independently. For example, governance workflows are generally best implemented using a hub-and-spoke topology, even if the rest of the application uses a mesh architecture. As such, your contracts will likely evolve as your xDapp evolves. You can also progress through different topologies. A common strategy is to start off with an ultra-light client, move to a hub and spoke configuration, and then add optimizations and specialties to contracts as the need arises. From a48ba1e591d59079dea00871ca802f15f45e1214 Mon Sep 17 00:00:00 2001 From: Ian Traas <108365619+itraas@users.noreply.github.com> Date: Mon, 5 Sep 2022 19:10:47 -0500 Subject: [PATCH 07/69] Update 5_relayers.md Updated copy and formatting for style and clarity. --- src/dapps/architecture/5_relayers.md | 58 ++++++++++++++-------------- 1 file changed, 29 insertions(+), 29 deletions(-) diff --git a/src/dapps/architecture/5_relayers.md b/src/dapps/architecture/5_relayers.md index 10b06aa..5f1356c 100644 --- a/src/dapps/architecture/5_relayers.md +++ b/src/dapps/architecture/5_relayers.md @@ -1,30 +1,30 @@ # Relayers -In Chapter 2, we discussed the [general concepts associated with relayers in the Wormhole ecosystem](../../wormhole/6_relayers.md). In this section, we'll elaborate on what considerations need to be taken into account when using relayers for your xDapp. +In Chapter 2, we discussed the [general concepts associated with relayers in the Wormhole ecosystem](../../wormhole/6_relayers.md). In this section, we'll elaborate on the considerations that should be accounted for when using relayers in your xDapp. ## Fundamentals -The most important thing to remember about relayers is that they are _untrusted_. This means you don't have to trust them, but it also means you can't trust them. This is true of both generic and specialized relayers. +It's important to remember that relayers are untrusted. This means you don't have to trust them--but it also means you can't trust them. This is true of both generic and specialized relayers. -Let's dive into a little more detail about _why_ relayers are untrusted, and what this means for you when designing a protocol. +Let's dive into a little more detail about why relayers are untrusted and what this means for you. -A few key properties of VAAs are that they: +A few key properties of VAAs: -- are publicly emitted from the Guardian Network +- They are publicly emitted from the Guardian Network. -- need to be signed by the Guardian Network to be considered authentic +- They need to be signed by the Guardian Network to be considered authentic. -- can be verified as authentic by _any_ Wormhole Core Contract they are brought to _by anyone_. +- They can be verified as authentic by anyone and any Wormhole Core Contract. -Relayers are untrusted as an inherent consequence of these properties. Anyone can pick up a VAA and deliver it anywhere they feel like, however, no one can alter the content of the VAA without invalidating the signatures. +Relayers are untrusted as an inherent consequence of these properties. Anyone can pick up a VAA and deliver it anywhere, but no one can alter the content of the VAA without invalidating the signatures. -So, when writing your contracts, it's incredibly important to only trust information which is either **inside your contract** or **inside a VAA**. If you trust information provided by a relayer, you are opening yourself up to untrusted input attacks. +So, when writing your contracts, it's incredibly important to only trust information which is either inside your contract or inside a VAA. If you trust information provided by a relayer, you are opening yourself up to untrusted input attacks. -The easiest and most secure way to interact with relayers then is to _only accept the VAA as input_. If the relayer can't provide any additional args, then there's no way for them to provide untrusted input. +The easiest and most secure way to interact with relayers then is to only accept the VAA as input. If the relayer can't provide any additional args, then there's no way for them to provide untrusted input. -There are more advanced strategies whereby the relayer performs **untrusted** off-chain computation which is passed into the destination contract. These strategies can optimize gas costs, but must be used carefully, as they can create attack vectors if not used correctly. +More advanced strategies involve having the relayer perform untrusted off-chain computation which is passed into the destination contract. These strategies can optimize gas costs, but can also create attack vectors if not used correctly. -With this in mind, relayer design is mostly a matter of structuring the messages in your protocol in a manner such that there is a single, deterministic way that they can be processed. In a well designed protocol, relayers have a 'correct' implementation. +With this in mind, relayer design becomes a matter of structuring the messages in your protocol such that there is a single, deterministic way that they can be processed. In a well designed protocol, relayers have a 'correct' implementation. Relayers are conceptually quite similar to "crank turner" processes used elsewhere in blockchain, in that there is only a single action which can be taken (pulling the crank), and their sole responsibility is to initiate this action and pay for the costs. @@ -32,42 +32,42 @@ Relayers are conceptually quite similar to "crank turner" processes used elsewhe ## Generic Relayers -Generic Relayers are a decentralized relayer network which can deliver arbitrary VAAs, so long as the recipient contract is conformant with the generic relayer API. +Generic relayers are a decentralized relayer network which can deliver arbitrary VAAs as long as the recipient contract conforms with the generic relayer API. -### Advantages: +**_Advantages:_** -- Purely done on-chain. No need to develop, host, or maintain relayers +- Generic relayers are done purely on-chain, so there's no need to develop, host or maintain relayers. -### Disadvantages: +**_Disadvantages:_** -- Less room for optimization via features like conditional delivery, batching, off-chain calculations, etc. +- There's less room for optimization via features like conditional delivery, batching, off-chain calculations, etc. --- ## Specialized Relayers -Specialized Relayers are relayers which are purpose-built to relay messages for a certain application. +Specialized Relayers are relayers that are purpose-built to relay messages for a certain application. In the future, there may be ways to customize generic relayers such that they will gain the advantages of today's specialized relayers. -### Advantages: +**_Advantages:_** -- Can perform off-chain untrusted computation -- Highly customizeable. Can perform batching, conditional delivery, multi-chain deliveries, etc. -- Can home-roll an incentive structure +- Specialized relayers can perform off-chain untrusted computation. +- They are highly customizeable and can perform batching, conditional delivery, multi-chain deliveries, etc. +- Can home-roll an incentive structure. -### Disadvantages +**_Disadvantages_** -- Requires development work, and requires relayer hosting +- Requires development work and relayer hosting. -In the future, there may be ways to customize generic relayers such that they will gain the advantages of today's specialized relayers. +--- ### Relayer Incentives Relayers have to cover the costs of executing the downstream transactions resulting from the original 'source' transaction. Unless the relayers are running at a loss, there must be a mechanism for reimbursing the relayer in exchange for message delivery. -There are tons of strategies here, and the 'best' strategy for an application is often dependent on the specifics of that application. However, a few of the most common strategies are: +There are many strategies for reimbursement, and the 'best' strategy for an application is often dependent on the specifics of that application. However, a few of the most common strategies are: -- pay the relayer with a potion of the tokens being sent cross-chain -- collect a safe amount of gas money from the end user prior to performing any actions -- 'lazy' relaying, where relaying might only become profitable in certain, potentially rare, market conditions +- Pay the relayer with a potion of the tokens being sent cross-chain. +- Collect a safe amount of gas money from the end user prior to performing any actions. +- 'Lazy' relaying, where relaying might only be profitable in certain, potentially rare, market conditions. Generic relayers have an incentive model built in to the network, so you do not need to design an incentive structure when using them. From 7ec7eadb1ade16634b25dcebe85dec322df961e7 Mon Sep 17 00:00:00 2001 From: Ian Traas <108365619+itraas@users.noreply.github.com> Date: Mon, 5 Sep 2022 19:17:20 -0500 Subject: [PATCH 08/69] Update overview.md Updated copy and formatting for style and clarity. --- src/development/tilt/overview.md | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/src/development/tilt/overview.md b/src/development/tilt/overview.md index 1c9afa9..ef6d2db 100644 --- a/src/development/tilt/overview.md +++ b/src/development/tilt/overview.md @@ -1,18 +1,18 @@ # Tilt Development Environment -For a quicker development cycle, specially when developing your own blockchain programs that interact with Wormhole or Portal contracts, consider setting up the Tilt Devnet Environment. +For a faster development cycle, especially when developing blockchain programs that interact with Wormhole or Portal contracts, consider setting up the Tilt Devnet Environment. -Tilt is a kubernetes and docker orchestration tool that will spin up all the Wormhole supported chains in containers, alongside a Guardian node that will observe and store VAAs. +Tilt is a Kubernetes and Docker orchestration tool that will spin up all the Wormhole supported chains in containers, alongside a Guardian node that will observe and store VAAs. This devnet environment can be set up on your computer or in a Linux VM that has at least 4 CPU cores and 16GB of RAM. -If you do decide to host the devnet in a remote VM, remember to pass in the host and webHost flags during the tilt up step and allow incoming traffic on your VM to be able to access the various RPC endpoints on the Pods. +If you do decide to host the devnet in a remote VM, remember to pass in the host and webHost flags during the tilt up step and allow incoming traffic on your VM to be able to access the various RPC endpoints on the pods. ```sh tilt up --host=0.0.0.0 -- --webHost=0.0.0.0 ``` -While the exact commands for each environment might differ, the basic setup process for tilt is the following: +While the exact commands for each environment might differ, the basic setup process for Tilt is the following: 1. Install Go 2. Install Docker Desktop (Or Docker CE) @@ -22,15 +22,15 @@ While the exact commands for each environment might differ, the basic setup proc ## FAQ -### Where are Fantom/Celo/Polygon/...(insert other EVM chains) -For all chains that support EVM the smart contract development environment is effectively the same. For changes in gas costs and transaction times, consider testing contract logic on devnet and then using testnet environments to get chain specific answers. +### Where are Fantom/Celo/Polygon/other EVM chains? +For all chains that support EVM, the smart contract development environment is effectively the same. For changes in gas costs and transaction times, consider testing contract logic on devnet and then using testnet environments to get chain-specific answers. -### Solana is taking forever! -Unfortunately, due to Solana's architecture, it often takes 25-40min to build the Solana pod. Consider increasing CPU cores assigned to devnet for a faster build. +### Solana is taking forever +Due to Solana's architecture, it often takes 25-40min to build the Solana pod. Consider increasing CPU cores assigned to devnet for a faster build. -### Solana program deploy doesn't work -Kubernetes doesn't currently allow port forwarding for UDP ports, which is what Solana uses for `solana program deploy`. Instead, we recommend using [Solana Deployer](https://github.com/acheroncrypto/solana-deployer). Not only does this deploy programs over regular RPC thus bypassing UDP port requirements, it's also much faster than `solana program deploy`. +### Solana program deploy doesn't work +Kubernetes doesn't currently allow port forwarding for UDP ports, which is what Solana uses for `solana program deploy`. Instead, we recommend using [Solana Deployer](https://github.com/acheroncrypto/solana-deployer). Not only does this deploy programs over regular RPC (thus bypassing UDP port requirements), it's also much faster than `solana program deploy`. ### Reset state for a pod -If you want to quickly iterate and don't want to bring tilt down and back up, you can reset state for a pod by clicking the 🔄 button next to the pod name in Tilt UI. +If you want to quickly iterate and don't want to bring Tilt down and back up, you can reset state for a pod by clicking the 🔄 button next to the pod name in Tilt UI. From a6701ed3c46a02031e146a87562a05021ffd1f34 Mon Sep 17 00:00:00 2001 From: Ian Traas <108365619+itraas@users.noreply.github.com> Date: Mon, 5 Sep 2022 19:18:56 -0500 Subject: [PATCH 09/69] Update mac.md Updated formatting for clarity. --- src/development/tilt/mac.md | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/development/tilt/mac.md b/src/development/tilt/mac.md index 908b697..03c2a75 100644 --- a/src/development/tilt/mac.md +++ b/src/development/tilt/mac.md @@ -5,8 +5,8 @@ You'll need to have `homebrew` on your system if you don't already. You can grab ```sh /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)" ``` -## Install Go +## Install Go ```sh brew install go ``` @@ -24,7 +24,6 @@ brew install tilt ``` ## Clone Wormhole Repo and Start Tilt - ```sh git clone --branch dev.v2 https://github.com/certusone/wormhole.git ``` From 684c010ddd0dcf6d3ff5d18958435a9afa5f3055 Mon Sep 17 00:00:00 2001 From: Ian Traas <108365619+itraas@users.noreply.github.com> Date: Mon, 5 Sep 2022 19:23:10 -0500 Subject: [PATCH 10/69] Update linux.md Updated copy and formatting for clarity. --- src/development/tilt/linux.md | 21 ++++++++++++++------- 1 file changed, 14 insertions(+), 7 deletions(-) diff --git a/src/development/tilt/linux.md b/src/development/tilt/linux.md index 6f40fc4..dd38bbf 100644 --- a/src/development/tilt/linux.md +++ b/src/development/tilt/linux.md @@ -1,7 +1,7 @@ # Linux Devnet Setup ### Experimental Setup Script -There's an experimental one command setup script that should install dependencies for you on Linux and configure everything properly. This is only recommended if you're running headless Linux and unable to use Docker Desktop, as with Docker Desktop you don't need `minikube` and can just enable Kubernetes from Docker. +There's an experimental single command setup script that should install dependencies for you on Linux and configure everything properly. This is only recommended if you're running headless Linux and unable to use Docker Desktop, as you can enable Kubernetes from Docker. ```sh curl $URL | sh install_linux.sh @@ -12,25 +12,30 @@ cd wormhole/ ## Regular Setup ### 1. Install Go + ```sh wget https://go.dev/dl/go1.18.1.linux-amd64.tar.gz rm -rf /usr/local/go && tar -C /usr/local -xzf go1.18.1.linux-amd64.tar.gz ``` ### 2. Install Docker + If you're using Linux with a window manager, consider getting Docker Desktop instead of the following command. It comes with Kubernetes built in and you won't need to download `minikube`. It's recommended to have at least 4 CPUs and 16GB RAM dedicated to Docker. -Also make sure that you set up docker as a NON ROOT USER! +Also, make absolutely sure that you set up Docker as a non-root user. [https://docs.docker.com/engine/install/ubuntu/#installation-methods](https://docs.docker.com/engine/install/ubuntu/#installation-methods) ### 3. (Docker Desktop Install) + Enable Kubernetes by going into Settings > Kubernetes ### 3. (Non Docker Desktop) -Install [`minikube`](https://minikube.sigs.k8s.io/docs/start/) -Configure minikube +Install [`minikube`](https://minikube.sigs.k8s.io/docs/start/). + +Configure minikube: + ``` minikube start --driver=docker --kubernetes-version=v1.23.3 --cpus=4 --memory=14G --disk-size=10G --namespace=wormhole ``` @@ -39,7 +44,8 @@ If you reboot your VM you'll need to run the `minikube start` command again befo ### 4. Install Tilt -Install tilt by copy pasting this into the Terminal +Install Tilt by copy pasting this into the Terminal: + ```sh curl -fsSL https://raw.githubusercontent.com/tilt-dev/tilt/master/scripts/install.sh | bash ``` @@ -50,13 +56,14 @@ curl -fsSL https://raw.githubusercontent.com/tilt-dev/tilt/master/scripts/instal git clone --branch dev.v2 https://github.com/certusone/wormhole.git ``` -If you're running tilt on your machine +If you're running Tilt on your machine: + ```sh cd wormhole/ tilt up ``` -If you're running tilt in a VM, we need to pass in some extra flags to enable Tilt to listen to incoming traffic from external addresses. +If you're running Tilt in a VM, you'll need to pass in some extra flags to enable Tilt to listen to incoming traffic from external addresses: ```sh cd wormhole From 334e641143941102624eb6a6bc2f8e3a245464d5 Mon Sep 17 00:00:00 2001 From: Ian Traas <108365619+itraas@users.noreply.github.com> Date: Mon, 5 Sep 2022 19:25:09 -0500 Subject: [PATCH 11/69] Update constants.md Updated copy for clarity. --- src/development/tilt/constants.md | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/src/development/tilt/constants.md b/src/development/tilt/constants.md index ab2e39e..2e10c3b 100644 --- a/src/development/tilt/constants.md +++ b/src/development/tilt/constants.md @@ -1,7 +1,5 @@ # Contracts and Accounts -The devnet environment deploys the Wormhole and Portal contracts to each of the chains at the same addresses every time. - -It also funds specific wallets with funds. +The devnet environment deploys the Wormhole and Portal contracts to each of the chains at the same addresses every time. It also provides specific wallets with funds. ## Tilt ## Guardian @@ -16,4 +14,4 @@ It also funds specific wallets with funds. ## Algorand - RPC Port: ## Terra -- RPC Port: \ No newline at end of file +- RPC Port: From 2717de2e13148f74e7aa07d5304397ac8c788274 Mon Sep 17 00:00:00 2001 From: Ian Traas <108365619+itraas@users.noreply.github.com> Date: Mon, 5 Sep 2022 19:31:24 -0500 Subject: [PATCH 12/69] Update overview.md Updated copy for style and clarity. --- src/development/scaffold/overview.md | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/src/development/scaffold/overview.md b/src/development/scaffold/overview.md index 932d85b..8bb1c90 100644 --- a/src/development/scaffold/overview.md +++ b/src/development/scaffold/overview.md @@ -1,21 +1,19 @@ # xDapp Scaffold -To help you get started with cross chain development, we've provided a template project in `projects/xdapp-starter`. All the sample projects will be made using this template, so check them out if you want to get a feel for how the various modules interact with each other. +To help you get started with cross-chain development, we've provided a template project in `projects/xdapp-starter`. All sample projects will be made using this template, so check them out if you want to get a feel for how various modules interact with each other. -The template uses npm workspaces to setup a main project with subdirectories for each chain you want to interact with. This allows you to initialize each subdirectory using whatever scaffolding tool you want for each individual chain, and orchestration code in a common directory. +The template uses npm workspaces to setup a main project with subdirectories for each supported chain. This allows you to initialize each subdirectory using any scaffolding tool for each individual chain along with orchestration code in a common directory. Let's break down what's in the `xdapp-starter` project: ### chains/ -- This folder contains the subdirectories for chain specific code. For example, I might use the `anchor` tool to `anchor init solana-project` within the chains/ directory. +This folder contains the subdirectories for chain-specific code. For example, you might use the `anchor` tool to `anchor init solana-project` within the chains/ directory. ### handlers/ -The handlers folder contains the js client code to deal with each chain's specific needs. They expose a common API that we can consume in `starter.js` for code cleanliness. - -They all take in a context object that's made up of the +The handlers/ folder contains the js client code to deal with each chain's specific needs. They expose a common API that we can consume in `starter.js` for code cleanliness. ### orchestrator.js This file parses command line args and filters calls to chain management handlers. ### xdapp.config.json -The config file contains all the information about the network rpc nodes, accounts, and other constants used to communicate with contracts deployed to the selected chains. \ No newline at end of file +The config file contains all the information about the network rpc nodes, accounts, and other constants used to communicate with contracts deployed to the selected chains. From 53dcdb9dcfee946a65d6c62804e4d37c35bed7db Mon Sep 17 00:00:00 2001 From: Ian Traas <108365619+itraas@users.noreply.github.com> Date: Mon, 5 Sep 2022 19:47:43 -0500 Subject: [PATCH 13/69] Update overview.md --- src/development/scaffold/overview.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/development/scaffold/overview.md b/src/development/scaffold/overview.md index 8bb1c90..0c50cce 100644 --- a/src/development/scaffold/overview.md +++ b/src/development/scaffold/overview.md @@ -4,7 +4,7 @@ To help you get started with cross-chain development, we've provided a template The template uses npm workspaces to setup a main project with subdirectories for each supported chain. This allows you to initialize each subdirectory using any scaffolding tool for each individual chain along with orchestration code in a common directory. -Let's break down what's in the `xdapp-starter` project: +What's in the `xdapp-starter` project: ### chains/ This folder contains the subdirectories for chain-specific code. For example, you might use the `anchor` tool to `anchor init solana-project` within the chains/ directory. From 6d19030c7805b55fc4ff3042fba0d72749863cc2 Mon Sep 17 00:00:00 2001 From: Ian Traas <108365619+itraas@users.noreply.github.com> Date: Mon, 5 Sep 2022 19:52:30 -0500 Subject: [PATCH 14/69] Update overview.md Updated copy and formatting for grammar, spelling and clarity. --- src/development/messages/relaying/overview.md | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/development/messages/relaying/overview.md b/src/development/messages/relaying/overview.md index ce3b5eb..867cd15 100644 --- a/src/development/messages/relaying/overview.md +++ b/src/development/messages/relaying/overview.md @@ -2,14 +2,14 @@ Relaying Messages can be done one of three ways: -1. Manual Relaying +**_Manual Relaying_** - Manual Relaying is usally done on the front end. Manual relyaing requires the front end to fetch the VAA it just created and then submit on the target chain. This means the user ends up paying for the gas fee and has to go through the additional step to submit the tx on the target chain. +Manual relaying is usally done on the front end. Manual relaying requires the front end to fetch the VAA it just created and then submit on the target chain. This means the user ends up paying for the gas fee and has to go through the additional step to submit the tx on the target chain. -2. Protocol Specific Relayers +**_Protocol-Specific Relayers_** - Protocols and Apps can run their own relayers, listening to messages as they are created by the Core Bridge and submitting them to their application on the target chain. This is the ideal user experience but requires more work from the developer. +Protocols and apps can run their own relayers that listen to messages as they are created by the Core Bridge and submit them to their application on the target chain. This offers the ideal user experience, but requires more work from the developer. -3. Generic Relayers +**_Generic Relayers_** - Generic Relayers can pick up any app or protocol's messages and submit them to the target chain for a fee. This is the ideal developer and user experience, but is still being developed. +Generic relayers can pick up any app or protocol's messages and submit them to the target chain for a fee. This is the ideal developer and user experience, but is still evolving. From c70dd07c39001be41a4ea541f7c366c05789b80e Mon Sep 17 00:00:00 2001 From: Ian Traas <108365619+itraas@users.noreply.github.com> Date: Mon, 5 Sep 2022 19:55:08 -0500 Subject: [PATCH 15/69] Update summary.md Updated link to reflect style and drive consistency. --- src/projects/summary.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/projects/summary.md b/src/projects/summary.md index bb0d43e..7c60899 100644 --- a/src/projects/summary.md +++ b/src/projects/summary.md @@ -1,2 +1,2 @@ # Projects -The projects for this repository are located [here](https://github.com/certusone/xdapp-book/tree/main/projects). \ No newline at end of file +The projects for this repository are located at [https://github.com/certusone/xdapp-book/tree/main/projects](https://github.com/certusone/xdapp-book/tree/main/projects). From 55065e020afe50d88d64cb8d06490b4e00e5b24a Mon Sep 17 00:00:00 2001 From: Ian Traas <108365619+itraas@users.noreply.github.com> Date: Mon, 5 Sep 2022 20:02:15 -0500 Subject: [PATCH 16/69] Update overview.md Updated formatting for link style and consistency. --- src/projects/evm-messenger/overview.md | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/projects/evm-messenger/overview.md b/src/projects/evm-messenger/overview.md index be335d1..f7cc758 100644 --- a/src/projects/evm-messenger/overview.md +++ b/src/projects/evm-messenger/overview.md @@ -7,19 +7,23 @@ Before you get started with this project, make sure you have a local Wormhole Gu Let's break down the files you're going to find in the [evm-messenger](https://github.com/certusone/xdapp-book/tree/main/projects/evm-messenger) folder. ### Chains + The `chains/` folder contains the source code that's actually being deployed to the EVM chain. The `evm/` folder found inside was generated using [`forge init`](https://getfoundry.sh). There are two files of note in this folder, `src/Wormhole/IWormhole.sol` and `src/Messenger.sol`. The IWormhole file is the Wormhole Core Bridge interface, and is required if your app wants to talk to the Wormhole Core Bridge. It outlines the functions and return values you can expect from the Wormhole contract. -The second file, Messenger, is covered in our breakdown of the EVM code [here](./messenger.md). +The second file, Messenger, is covered in our breakdown of the EVM code at [./messenger.md](./messenger.md). ### Tests + We have a very simple test script written in bash, but it's less of a test script and more of a happy path walkthrough. It makes uses of Orchestrator.js (see below) to call the functions on our EVM contract in order. To start, deploy the code, register the applications on each chain and then send a message. ### Orchestrator -Orchestrator is a js client that takes arguments from the command line to call various functions on our contract. We'll break down everything orchestator does [here](./client.md). + +Orchestrator is a js client that takes arguments from the command line to call various functions on our contract. We'll break down everything Orchestator does at [./client.md](./client.md). ### xdapp.config.json + This maintains some constants about the chains RPC endpoints, private keys used to deploy code, etc. It also includes the Wormhole RPC endpoint. From 443fa522ccbdf05d354d2523fdf47e84f61167f3 Mon Sep 17 00:00:00 2001 From: Ian Traas <108365619+itraas@users.noreply.github.com> Date: Mon, 5 Sep 2022 20:05:41 -0500 Subject: [PATCH 17/69] Update messenger.md Updated formatting to reflect style and drive consistency. --- src/projects/evm-messenger/messenger.md | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/src/projects/evm-messenger/messenger.md b/src/projects/evm-messenger/messenger.md index fa67340..9745309 100644 --- a/src/projects/evm-messenger/messenger.md +++ b/src/projects/evm-messenger/messenger.md @@ -1,7 +1,7 @@ # Messenger.sol -Messenger.sol is an application contract on EVM capable of communicating with the Wormhole core bridge. +Messenger.sol is an application contract on EVM capable of communicating with the Wormhole Core Bridge. -Start by hard coding the Wormhole core bridge address, and creating a interfaced link to it. +Start by hard coding the Wormhole core bridge address and creating an interfaced link to it. ```solidity //SPDX-License-Identifier: Unlicense @@ -26,7 +26,7 @@ contract Messenger { ``` ## Constructor -This sets the owner of the contract to the deployer. The owner is used later to register sibling contracts on foreign chains. +This sets the owner of the contract to the deployer. The owner is used later to register sibling contracts on other chains. ```solidity @@ -39,10 +39,10 @@ constructor(){ ## SendMsg This takes in a bytes payload and calls the Wormhole Core Bridge to publish the bytes as a message. -The `publishMessage()` function of the core_bridge take three arguements: -- Nonce: a number to uniquely identify this message, used to make sure that the target chain doesn't double process the same message -- Payload: the bytes payload -- Confirmations: the number of blocks the guardians should wait before signing this VAA. For low security applications, this number can be low, but if you're on a chain that often reorgs a high number of blocks (like Polygon) you might want to set this number high enough to ensure your transaction from the source chain doesn't get lost after the guardians sign it. +The `publishMessage()` function of the core_bridge takes three arguments: +- Nonce: A number to uniquely identify this message, used to make sure that the target chain doesn't double process the same message +- Payload: The bytes payload +- Confirmations: The number of blocks the Guardians should wait before signing this VAA. For low security applications, this number can be low, but if you're on a chain that often reorgs a high number of blocks (like Polygon) you might want to set this number high enough to ensure your transaction from the source chain doesn't get lost after the Guardians sign it. ```solidity function sendMsg(bytes memory str) public returns (uint64 sequence) { @@ -52,7 +52,7 @@ function sendMsg(bytes memory str) public returns (uint64 sequence) { ``` ## ReceiveEncodedMsg -The receive encoded message takes in a VAA as bytes. Then it calls the Core Bridge to verify the signatures match those of the gaurdians, check that it's from a contract on a foreign chain that we actually want to listen to and that the message hasn't been processed already. If all those checks pass, we can decode the payload (in this case we know it's a string) and set the current_msg for the contract to that payload. +The receive encoded message takes in a VAA as bytes. Then it calls the Core Bridge to verify the signatures match those of the Guardians, check that it's from a contract on a foreign chain that we actually want to listen to and that the message hasn't been processed already. If all those checks pass, we can decode the payload (in this case we know it's a string) and set the current_msg for the contract to that payload. ```solidity From 26680108b59268f87e63e8225c1827ec0cde1c37 Mon Sep 17 00:00:00 2001 From: Ian Traas <108365619+itraas@users.noreply.github.com> Date: Mon, 5 Sep 2022 20:20:40 -0500 Subject: [PATCH 18/69] Update overview.md Updated for clarity. --- src/development/portal/overview.md | 20 +++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) diff --git a/src/development/portal/overview.md b/src/development/portal/overview.md index 86e64ba..fd1653b 100644 --- a/src/development/portal/overview.md +++ b/src/development/portal/overview.md @@ -1,22 +1,24 @@ -# Portal Token Bridge Transfers +# Portal Token Bridge Portal Token Bridge is one of the biggest applications built on Wormhole. It uses structured payloads to transfer tokens and NFTs from one wallet to another. ## Attesting a Token -Before a token can be transferred, the token need to be *attested* to another chain. To attest a token, you first create a AssetMeta VAA by calling the `attest()` function on Token Bridge. Then you take the VAA over to the receipient chain, where you call `createWrapped()` which deploys a wrapped version of the Token. +Before a token can be transferred, the token need to be attested to another chain. To attest a token, you first create a AssetMeta VAA by calling the `attest()` function on Token Bridge. Then, take the VAA over to the receipient chain where you'll call `createWrapped()` which deploys a wrapped version of the token. -This only needs to happen *once* per payload, and trying to attest a token a second time will simply result in the address of the already-created Wrapped Token Address. +This only needs to happen once per payload, and trying to attest a token a second time will simply result in the address of the already-created Wrapped Token Address. ## Transfering Tokens -To transfer tokens, the payer of tokens first authorizes the Token Bridge contract to move the tokens on their behalf, then locks them up with the Token Bridge, which then emits a VAA. This VAA can then be submitted on target chain's Token Bridge's `completeTransfer()` to mint the wrapped version of the Token. +To transfer tokens, the payer of tokens first authorizes the Token Bridge contract to move the tokens on their behalf, then locks them up with the Token Bridge, which emits a VAA. This VAA can then be submitted on target chain Token Bridge's `completeTransfer()` to mint the wrapped version of the token. -When transfering tokens from Chain A to B and beyond, the token is only "wrapped" once, as every time it's attested, it's always from the chain the token is natively located on. If the token being transferred is native to the chain it's being transfered to, you'll receive the original token back instread of a wrapped version. +When transfering tokens from Chain A to B and beyond, the token is only "wrapped" once, as every time it's attested, it's always from the chain where the token is natively located. If the token being transferred is native to the chain it's being transfered to, you'll receive the original token back instread of a wrapped version. -There are typically two functions for transfer: `transfer()` and `transferNative()`. This is because native currencies of most blockchains (ETH on Ethereum, SOL on Solana, etc) don't follow the Token spec of that chain, so to transfer native currencies, we wrap them first into a tokenized version and then transfer. +There are typically two functions for transfer: `transfer()` and `transferNative()`. This is because native currencies of most blockchains (ETH on Ethereum, SOL on Solana, etc) don't follow the token spec of that chain, so to transfer native currencies, we wrap them first into a tokenized version and then transfer. -For transfers, there's also an arbiterFee you can set. If this fee is set, when `completeTransfer()` is called, that amount of tokens are withheld from the release of tokens on the target chain and instead given to the submitter of the message (for example, a relayer). This allows third party to submit transactions on your behalf, for a fee. +For transfers, there's also an arbiterFee you can set. If this fee is set, when `completeTransfer()` is called, that amount of tokens are withheld from the release of tokens on the target chain and instead given to the submitter of the message (for example, a relayer). This allows a third party to submit transactions on your behalf, for a fee. ## Transfering with a Payload -Transfering with a Payload is much like transfering normal tokens, with two major differences. +Transfering with a Payload is much like transfering normal tokens, with two major differences: -First, as the name implies, you can attach a bytes payload to the transfer message. Secondly, the `completeTransfer()` function for Transfer with Payload can *only* be called by the receipient of that VAA. This means the flow is slightly different; instead of the user calling the `completeTransfer()` function on the Token Bridge, they call a function on the application they are interacting with which will check the payload, do any state changes it needs to make and then call `completeTransfer()` on Token Bridge to mint tokens to itself. +First, as the name implies, you can attach a bytes payload to the transfer message. + +Secondly, the `completeTransfer()` function for Transfer with Payload can *only* be called by the receipient of that VAA. This means the flow is slightly different--instead of the user calling the `completeTransfer()` function on the Token Bridge, they call a function on the application they are interacting with which will check the payload, finalize any state changes and then call `completeTransfer()` on Token Bridge to mint tokens to itself. From 52aaa795bdec80aded7a4aea0ff28efbdfc1e587 Mon Sep 17 00:00:00 2001 From: Ian Traas <108365619+itraas@users.noreply.github.com> Date: Mon, 5 Sep 2022 20:24:02 -0500 Subject: [PATCH 19/69] Update SUMMARY.md Updated formatting and some titling to reflect linked content. --- src/SUMMARY.md | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/src/SUMMARY.md b/src/SUMMARY.md index 88ada1e..4f8a266 100644 --- a/src/SUMMARY.md +++ b/src/SUMMARY.md @@ -37,23 +37,31 @@ # xDapp Development -- [Before You Start](./development/overview.md) +- [xDapp Development Overview](./development/overview.md) + - [Wormhole Local Validator](./development/wormhole-local-validator.md) + - [Tilt Installation](./development/tilt/overview.md) - [MacOS](./development/tilt/mac.md) - [Linux](./development/tilt/linux.md) - [Constants](./development/tilt/constants.md) + - [Project Scaffold](./development/scaffold/overview.md) + - [Sending Messages](./development/messages/sending/overview.md) - [EVM](./development/messages/sending/evm.md) + - [Registering xDapps](./development/messages/registration/overview.md) - [EVM](./development/messages/registration/evm.md) + - [Relaying Messages](./development/messages/relaying/overview.md) - [Manual Relays]() - [REST & Spy Relayer]() - [Generic Relayers]() + - [Receving Messages](./development/messages/receiving/overview.md) - [EVM](./development/messages/receiving/evm.md) + - [Projects](./projects/summary.md) - [EVM Messenger](./projects/evm-messenger/overview.md) - [Solidity](./projects/evm-messenger/messenger.md) @@ -73,6 +81,7 @@ - [Portal JS SDK](./development/portal/sdkjs/overview.md) - [EVM to Solana Transfer](./development/portal/sdkjs/evm-solana-transfer.md) - [Polygon to Oasis with Relayers](./development/portal/sdkjs/polygon-oasis-relayer.md) + - [Portal Payloads]() --- From 6f9fe868717e6fd91f5ae4776596b955f431bc48 Mon Sep 17 00:00:00 2001 From: Ian Traas <108365619+itraas@users.noreply.github.com> Date: Mon, 5 Sep 2022 20:24:51 -0500 Subject: [PATCH 20/69] Update SUMMARY.md --- src/SUMMARY.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/SUMMARY.md b/src/SUMMARY.md index 4f8a266..af544d6 100644 --- a/src/SUMMARY.md +++ b/src/SUMMARY.md @@ -1,6 +1,6 @@ # Summary -[Introduction](./introduction/introduction.md) +- [Introduction](./introduction/introduction.md) --- @@ -89,6 +89,7 @@ # Other Resources - [Reference]() + - [Tools](./reference/tools.md) - [Github & Useful Links](./reference/github.md) - [Deployed Contracts](./reference/contracts.md) From 51f24ca0cf143583dbd64978c0b8a95bd2aa5927 Mon Sep 17 00:00:00 2001 From: Ian Traas <108365619+itraas@users.noreply.github.com> Date: Mon, 5 Sep 2022 20:29:04 -0500 Subject: [PATCH 21/69] Update tools.md Updated copy for formatting and clarity. --- src/reference/tools.md | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/src/reference/tools.md b/src/reference/tools.md index 6788c2b..27bac40 100644 --- a/src/reference/tools.md +++ b/src/reference/tools.md @@ -1,17 +1,17 @@ # Tools -There are various tools in the Wormhole ecosystem that can help you in developing xDapps. Here are a few of the most notable: +There are a variety of tools in the Wormhole ecosystem that can help you develop xDapps. Here are a few of the most notable: -# Testnet -Wormhole has deployed Core Bridge, Token Bridge and NFT Bridge contracts on various testnets of the chains connected by Wormhole. You can see the deployed addresses [here](./contracts.md). There's only a single Guardian that oversees the testnets, so you might get a higher rate of missed VAAs than you would on mainnet. +### Testnet +Wormhole has deployed Core Bridge, Token Bridge and NFT Bridge contracts on various testnets of the chains connected by Wormhole. You can see the deployed addresses at [./contracts.md](./contracts.md). There's only a single Guardian that oversees the testnets, so you might get a higher rate of missed VAAs than you would on mainnet. -# Wormhole Explorer -Wormhole Explorer is a tool that will help you parse VAAs after they've been picked up the Guardian network. It's available [here](https://wormholenetwork.com/en/explorer). +### Wormhole Explorer +Wormhole Explorer is a tool that will help you parse VAAs after they've been picked up the Guardian network. It's available at [https://wormholenetwork.com/en/explorer](https://wormholenetwork.com/en/explorer). -# Testnet Bridge UI -If you'd like to try out Portal Bridge on Testnet, there's a UI you can use to attest and transfer tokens for testnet, hosted [here](https://certusone.github.io/wormhole). +### Testnet Bridge UI +If you'd like to try out Portal Bridge on testnet, there's a UI you can use to attest and transfer tokens for testnet, hosted at [https://certusone.github.io/wormhole](https://certusone.github.io/wormhole). -# Tilt -Tilt is a Kubernetes based tool that runs a copy of every chain along side a guardian node to create a simulated testing environment. To set it up and test against it, start [here](../development/tilt/overview.md). +### Tilt +Tilt is a Kubernetes-based tool that runs a copy of every chain along side a Guardian node to create a simulated testing environment. To set it up and test against it, start at [../development/tilt/overview.md](../development/tilt/overview.md). -# Wormhole SDK -The SDK is a set of Javascript tools to help you do Token Bridge transfers, plus fetch and submit VAAs from one chain to another. You can install it via NPM [here](https://www.npmjs.com/package/@certusone/wormhole-sdk). +### Wormhole SDK +The SDK is a set of Javascript tools to help you do Token Bridge transfers, plus fetch and submit VAAs from one chain to another. You can install it via NPM at [https://www.npmjs.com/package/@certusone/wormhole-sdk](https://www.npmjs.com/package/@certusone/wormhole-sdk). From 6503e8867b38fba4816c213bb3434e202113de8f Mon Sep 17 00:00:00 2001 From: Ian Traas <108365619+itraas@users.noreply.github.com> Date: Mon, 5 Sep 2022 20:30:43 -0500 Subject: [PATCH 22/69] Update github.md Updated copy and formatting for style and clarity. --- src/reference/github.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/reference/github.md b/src/reference/github.md index a2108cd..d89238d 100644 --- a/src/reference/github.md +++ b/src/reference/github.md @@ -1,8 +1,8 @@ # Repository -The Wormhole core repository can be found [here](https://github.com/certusone/wormhole). +The Wormhole core repository can be found at [https://github.com/certusone/wormhole](https://github.com/certusone/wormhole). # Design Documents -Wormhole's component design specifications can be found [here](https://github.com/certusone/wormhole/tree/dev.v2/whitepapers). These outline the reasoning behind design decisions with added technical depth. +Wormhole's component design specifications can be found at [https://github.com/certusone/wormhole/tree/dev.v2/whitepapers](https://github.com/certusone/wormhole/tree/dev.v2/whitepapers). These outline the reasoning behind design decisions with added technical depth. From 5da910c45555fc47684f731a1912b34c98523d95 Mon Sep 17 00:00:00 2001 From: Ian Traas <108365619+itraas@users.noreply.github.com> Date: Mon, 5 Sep 2022 20:31:55 -0500 Subject: [PATCH 23/69] Update contracts.md Updated for style. --- src/reference/contracts.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/reference/contracts.md b/src/reference/contracts.md index f972986..497e96b 100644 --- a/src/reference/contracts.md +++ b/src/reference/contracts.md @@ -1,6 +1,6 @@ # Contracts -Here you can find the addresses for the deployed contracts on all the chains that Wormhole supports, including Testnet. +Here you can find the addresses for the deployed contracts on all the chains that Wormhole supports, including testnet. The SDK makes these addresses available in the `CONTRACTS` constant. ## Mainnet From afb35eab5c91f51f7a456a80068e3030361032ed Mon Sep 17 00:00:00 2001 From: chase-45 Date: Tue, 13 Sep 2022 17:53:33 -0400 Subject: [PATCH 24/69] new outline for development section --- src/SUMMARY.md | 54 +++++++++--------------- src/technical/environments.md | 1 + src/technical/evm/coreLayer.md | 1 + src/technical/evm/nftLayer.md | 1 + src/technical/evm/xassetLayer.md | 1 + src/technical/overview.md | 1 + src/technical/relayer/guardianNetwork.md | 1 + src/technical/testnet.md | 1 + src/technical/tilt.md | 1 + src/technical/wlv.md | 1 + 10 files changed, 28 insertions(+), 35 deletions(-) create mode 100644 src/technical/environments.md create mode 100644 src/technical/evm/coreLayer.md create mode 100644 src/technical/evm/nftLayer.md create mode 100644 src/technical/evm/xassetLayer.md create mode 100644 src/technical/overview.md create mode 100644 src/technical/relayer/guardianNetwork.md create mode 100644 src/technical/testnet.md create mode 100644 src/technical/tilt.md create mode 100644 src/technical/wlv.md diff --git a/src/SUMMARY.md b/src/SUMMARY.md index af544d6..d40bc10 100644 --- a/src/SUMMARY.md +++ b/src/SUMMARY.md @@ -35,54 +35,38 @@ --- -# xDapp Development +# Developing xDapps -- [xDapp Development Overview](./development/overview.md) +- [Environment Setup](./technical/environments.md) -- [Wormhole Local Validator](./development/wormhole-local-validator.md) - -- [Tilt Installation](./development/tilt/overview.md) - - [MacOS](./development/tilt/mac.md) - - [Linux](./development/tilt/linux.md) - - [Constants](./development/tilt/constants.md) - -- [Project Scaffold](./development/scaffold/overview.md) - -- [Sending Messages](./development/messages/sending/overview.md) - - [EVM](./development/messages/sending/evm.md) - -- [Registering xDapps](./development/messages/registration/overview.md) - - [EVM](./development/messages/registration/evm.md) + - [Tilt](./technical/tilt.md) + - [Wormhole Local Validator](./technical/wlv.md) + - [Testnet](./technical/testnet.md) -- [Relaying Messages](./development/messages/relaying/overview.md) - - [Manual Relays]() - - [REST & Spy Relayer]() - - [Generic Relayers]() - -- [Receving Messages](./development/messages/receiving/overview.md) - - [EVM](./development/messages/receiving/evm.md) +- [Contract Development]() -- [Projects](./projects/summary.md) - - [EVM Messenger](./projects/evm-messenger/overview.md) - - [Solidity](./projects/evm-messenger/messenger.md) - - [JS Client](./projects/evm-messenger/client.md) - - [Messenger](./projects/messenger/introduction.md) - - [Prerequistes]() - - [EVM]() + - [EVM]() + - [Core Layer](./technical/evm/coreLayer.md) + - [xAsset Layer](./technical/evm/xassetLayer.md) + - [NFT Layer](./technical/evm/nftLayer.md) + - [Solana]() + - [Cosmos]() + - [Algorand]() + - [Near]() + - [Aptos]() ---- +- [Relayers]() -# Portal Token Bridge + - [Plugin Relayer]() + - [Guardian Network](./technical/relayer/guardianNetwork.md) -- [Portal](./development/portal/overview.md) +- [Wormhole Typescript SDK](./development/portal/overview.md) - [EVM]() - [Attesting](./development/portal/evm/attestingToken.md) - [Transfer Tokens](./development/portal/evm/tokenTransfer.md) - [Portal JS SDK](./development/portal/sdkjs/overview.md) - [EVM to Solana Transfer](./development/portal/sdkjs/evm-solana-transfer.md) - [Polygon to Oasis with Relayers](./development/portal/sdkjs/polygon-oasis-relayer.md) - -- [Portal Payloads]() --- diff --git a/src/technical/environments.md b/src/technical/environments.md new file mode 100644 index 0000000..6d36fb7 --- /dev/null +++ b/src/technical/environments.md @@ -0,0 +1 @@ +# Choosing an Environment diff --git a/src/technical/evm/coreLayer.md b/src/technical/evm/coreLayer.md new file mode 100644 index 0000000..e73c910 --- /dev/null +++ b/src/technical/evm/coreLayer.md @@ -0,0 +1 @@ +# Core Layer diff --git a/src/technical/evm/nftLayer.md b/src/technical/evm/nftLayer.md new file mode 100644 index 0000000..a5a8aef --- /dev/null +++ b/src/technical/evm/nftLayer.md @@ -0,0 +1 @@ +# NFT Layer diff --git a/src/technical/evm/xassetLayer.md b/src/technical/evm/xassetLayer.md new file mode 100644 index 0000000..6735f27 --- /dev/null +++ b/src/technical/evm/xassetLayer.md @@ -0,0 +1 @@ +# xAsset Layer diff --git a/src/technical/overview.md b/src/technical/overview.md new file mode 100644 index 0000000..e10b99d --- /dev/null +++ b/src/technical/overview.md @@ -0,0 +1 @@ +# Introduction diff --git a/src/technical/relayer/guardianNetwork.md b/src/technical/relayer/guardianNetwork.md new file mode 100644 index 0000000..6f91a05 --- /dev/null +++ b/src/technical/relayer/guardianNetwork.md @@ -0,0 +1 @@ +# Guardian Network diff --git a/src/technical/testnet.md b/src/technical/testnet.md new file mode 100644 index 0000000..27ed5e1 --- /dev/null +++ b/src/technical/testnet.md @@ -0,0 +1 @@ +# Testnet diff --git a/src/technical/tilt.md b/src/technical/tilt.md new file mode 100644 index 0000000..6bda0ba --- /dev/null +++ b/src/technical/tilt.md @@ -0,0 +1 @@ +# Tilt diff --git a/src/technical/wlv.md b/src/technical/wlv.md new file mode 100644 index 0000000..913c7a1 --- /dev/null +++ b/src/technical/wlv.md @@ -0,0 +1 @@ +# Wormhole Local Validator From 966123223e64e84ec5fee22a66a4f2d3d1a75b48 Mon Sep 17 00:00:00 2001 From: Eric Wong Date: Wed, 14 Sep 2022 11:16:13 -0500 Subject: [PATCH 25/69] evm: interfaces --- src/technical/evm/coreLayer.md | 47 ++++++++++++ src/technical/evm/nftLayer.md | 26 +++++++ src/technical/evm/xassetLayer.md | 126 +++++++++++++++++++++++++++++++ 3 files changed, 199 insertions(+) diff --git a/src/technical/evm/coreLayer.md b/src/technical/evm/coreLayer.md index e73c910..ab52bbc 100644 --- a/src/technical/evm/coreLayer.md +++ b/src/technical/evm/coreLayer.md @@ -1 +1,48 @@ # Core Layer + +This is the interface for applications to interact with Wormhole's Core Contract to publish messages or verify and parse a received message. + +``` +// contracts/Messages.sol +// SPDX-License-Identifier: Apache 2 + +pragma solidity ^0.8.0; + +import "../Structs.sol"; + +interface IWormhole is Structs { + event LogMessagePublished(address indexed sender, uint64 sequence, uint32 nonce, bytes payload, uint8 consistencyLevel); + + function publishMessage( + uint32 nonce, + bytes memory payload, + uint8 consistencyLevel + ) external payable returns (uint64 sequence); + + function parseAndVerifyVM(bytes calldata encodedVM) external view returns (Structs.VM memory vm, bool valid, string memory reason); + + function verifyVM(Structs.VM memory vm) external view returns (bool valid, string memory reason); + + function verifySignatures(bytes32 hash, Structs.Signature[] memory signatures, Structs.GuardianSet memory guardianSet) external pure returns (bool valid, string memory reason) ; + + function parseVM(bytes memory encodedVM) external pure returns (Structs.VM memory vm); + + function getGuardianSet(uint32 index) external view returns (Structs.GuardianSet memory) ; + + function getCurrentGuardianSetIndex() external view returns (uint32) ; + + function getGuardianSetExpiry() external view returns (uint32) ; + + function governanceActionIsConsumed(bytes32 hash) external view returns (bool) ; + + function isInitialized(address impl) external view returns (bool) ; + + function chainId() external view returns (uint16) ; + + function governanceChainId() external view returns (uint16); + + function governanceContract() external view returns (bytes32); + + function messageFee() external view returns (uint256) ; +} +``` \ No newline at end of file diff --git a/src/technical/evm/nftLayer.md b/src/technical/evm/nftLayer.md index a5a8aef..bc374e4 100644 --- a/src/technical/evm/nftLayer.md +++ b/src/technical/evm/nftLayer.md @@ -1 +1,27 @@ # NFT Layer + +This is the interface for applications to interact with Wormhole's NFT Bridge Contract to publish messages or verify and parse a received message. + +``` +// contracts/NFTBridge.sol +// SPDX-License-Identifier: Apache 2 + +pragma solidity ^0.8.0; + +import "./NFTBridgeGetters.sol"; + +interface INFTBridge is NFTGetters { + + function transferNFT(address token, uint256 tokenID, uint16 recipientChain, bytes32 recipient, uint32 nonce) external payable returns (uint64 sequence); + + function completeTransfer(bytes memory encodeVm) external ; + + function encodeTransfer(NFTBridgeStructs.Transfer memory transfer) external pure returns (bytes memory encoded); + + function parseTransfer(bytes memory encoded) external pure returns (NFTBridgeStructs.Transfer memory transfer); + + function onERC721Received(address operator, address, uint256, bytes calldata) external view returns (bytes4); + +} + +``` \ No newline at end of file diff --git a/src/technical/evm/xassetLayer.md b/src/technical/evm/xassetLayer.md index 6735f27..746580a 100644 --- a/src/technical/evm/xassetLayer.md +++ b/src/technical/evm/xassetLayer.md @@ -1 +1,127 @@ # xAsset Layer + +This is the interface for applications to interact with Wormhole's Token Bridge Contract to publish messages or verify and parse a received message. + +``` +// contracts/Bridge.sol +// SPDX-License-Identifier: Apache 2 + +pragma solidity ^0.8.0; + +import "./BridgeGetters.sol"; + +interface ITokenBridge is BridgeGetters { + /* + * @dev Produce a AssetMeta message for a given token + */ + function attestToken(address tokenAddress, uint32 nonce) external payable returns (uint64 sequence); + + /* + * @notice Send eth through portal by first wrapping it to WETH. + */ + function wrapAndTransferETH( + uint16 recipientChain, + bytes32 recipient, + uint256 arbiterFee, + uint32 nonce + ) external payable returns (uint64 sequence); + + /* + * @notice Send eth through portal by first wrapping it. + * + * @dev This type of transfer is called a "contract-controlled transfer". + * There are three differences from a regular token transfer: + * 1) Additional arbitrary payload can be attached to the message + * 2) Only the recipient (typically a contract) can redeem the transaction + * 3) The sender's address (msg.sender) is also included in the transaction payload + * + * With these three additional components, xDapps can implement cross-chain + * composable interactions. + */ + function wrapAndTransferETHWithPayload( + uint16 recipientChain, + bytes32 recipient, + uint32 nonce, + bytes memory payload + ) external payable returns (uint64 sequence); + + /* + * @notice Send ERC20 token through portal. + */ + function transferTokens( + address token, + uint256 amount, + uint16 recipientChain, + bytes32 recipient, + uint256 arbiterFee, + uint32 nonce + ) external payable returns (uint64 sequence); + + /* + * @notice Send ERC20 token through portal. + * + * @dev This type of transfer is called a "contract-controlled transfer". + * There are three differences from a regular token transfer: + * 1) Additional arbitrary payload can be attached to the message + * 2) Only the recipient (typically a contract) can redeem the transaction + * 3) The sender's address (msg.sender) is also included in the transaction payload + * + * With these three additional components, xDapps can implement cross-chain + * composable interactions. + */ + function transferTokensWithPayload( + address token, + uint256 amount, + uint16 recipientChain, + bytes32 recipient, + uint32 nonce, + bytes memory payload + ) external payable returns (uint64 sequence); + + function updateWrapped(bytes memory encodedVm) external returns (address token); + + function createWrapped(bytes memory encodedVm) external returns (address token); + + /* + * @notice Complete a contract-controlled transfer of an ERC20 token. + * + * @dev The transaction can only be redeemed by the recipient, typically a + * contract. + * + * @param encodedVm A byte array containing a VAA signed by the guardians. + * + * @return The byte array representing a BridgeStructs.TransferWithPayload. + */ + function completeTransferWithPayload(bytes memory encodedVm) external returns (bytes memory); + + /* + * @notice Complete a contract-controlled transfer of WETH, and unwrap to ETH. + * + * @dev The transaction can only be redeemed by the recipient, typically a + * contract. + * + * @param encodedVm A byte array containing a VAA signed by the guardians. + * + * @return The byte array representing a BridgeStructs.TransferWithPayload. + */ + function completeTransferAndUnwrapETHWithPayload(bytes memory encodedVm) external returns (bytes memory); + + /* + * @notice Complete a transfer of an ERC20 token. + * + * @dev The msg.sender gets paid the associated fee. + * + * @param encodedVm A byte array containing a VAA signed by the guardians. + */ + function completeTransfer(bytes memory encodedVm) external ; + + /* + * @notice Complete a transfer of WETH and unwrap to eth. + * + * @dev The msg.sender gets paid the associated fee. + * + * @param encodedVm A byte array containing a VAA signed by the guardians. + */ + function completeTransferAndUnwrapETH(bytes memory encodedVm) external ; +} +``` \ No newline at end of file From 0edfae54a64ab6632d3d4a3f62e6c5e8bf0a94a8 Mon Sep 17 00:00:00 2001 From: chase-45 Date: Wed, 14 Sep 2022 13:03:57 -0400 Subject: [PATCH 26/69] Adding info to the EVM pages --- src/technical/evm/coreLayer.md | 30 ++++++++++++++++++++++- src/technical/evm/nftLayer.md | 20 +++++++++++++-- src/technical/evm/xassetLayer.md | 42 +++++++++++++++++++++++++++++--- 3 files changed, 86 insertions(+), 6 deletions(-) diff --git a/src/technical/evm/coreLayer.md b/src/technical/evm/coreLayer.md index ab52bbc..a0392d2 100644 --- a/src/technical/evm/coreLayer.md +++ b/src/technical/evm/coreLayer.md @@ -1,7 +1,16 @@ # Core Layer +This section will explain how to properly interact with the Wormhome Core Layer in an EVM ecosystem. + +# Configuring the Interface + +- Get the interface from the repo +- Instantiate it with the core layer contract address for your blockchain. This is dependent on your development ecosystem and blockchain. This value is usually stored in your contract state. + This is the interface for applications to interact with Wormhole's Core Contract to publish messages or verify and parse a received message. +//TODO just link to the github repo, in order to avoid stale information + ``` // contracts/Messages.sol // SPDX-License-Identifier: Apache 2 @@ -45,4 +54,23 @@ interface IWormhole is Structs { function messageFee() external view returns (uint256) ; } -``` \ No newline at end of file +``` + +//TODO example line of code for instantiating the interface for mainnet Ethereum + +## Primary functions + +The Wormhole Core Layer effectively only has two important interactions. The ability to emit messages, and the ability to verify messages which originated from other chains. + +### Emitting a Message + +- Always uses publish message +- explain every argument +- be sure to mention batch VAAs + +### Verifying a Message + +- Explain how a message should be taken in as a byte array +- Be cognizant of Batch VAAs vs Single VAAs +- entrypoint code vs module code. If using single VAAs, these are the same, but batch VAAs are more complicated to verify +- remember to collect your gas after all the VAAs have been verified diff --git a/src/technical/evm/nftLayer.md b/src/technical/evm/nftLayer.md index bc374e4..257efde 100644 --- a/src/technical/evm/nftLayer.md +++ b/src/technical/evm/nftLayer.md @@ -1,6 +1,6 @@ # NFT Layer -This is the interface for applications to interact with Wormhole's NFT Bridge Contract to publish messages or verify and parse a received message. +This section will explain how to properly interact with the NFT Layer in an EVM ecosystem. ``` // contracts/NFTBridge.sol @@ -9,6 +9,7 @@ This is the interface for applications to interact with Wormhole's NFT Bridge Co pragma solidity ^0.8.0; import "./NFTBridgeGetters.sol"; +import "./NFTBridgeStructs.sol"; interface INFTBridge is NFTGetters { @@ -24,4 +25,19 @@ interface INFTBridge is NFTGetters { } -``` \ No newline at end of file +``` + +## Overview + +Only ERC-721 supported, creates a wrapped NFT with identical metadata. Implementation varies by ecosystem + +## Sending an NFT + +- Unlike xAssets, there is no registration process +- Code example to send + +## Receiving an NFT + +- completeTransfer code examples + +//TODO NFT verification and perhaps some other common usecases diff --git a/src/technical/evm/xassetLayer.md b/src/technical/evm/xassetLayer.md index 746580a..825c85d 100644 --- a/src/technical/evm/xassetLayer.md +++ b/src/technical/evm/xassetLayer.md @@ -1,6 +1,10 @@ # xAsset Layer -This is the interface for applications to interact with Wormhole's Token Bridge Contract to publish messages or verify and parse a received message. +This is the interface for applications to interact with the xAsset layer in Wormhole + +# Instantiating the interface + +- Same as instantiating any other EVM interface / Core Layer / NFT Layer, ``` // contracts/Bridge.sol @@ -10,6 +14,7 @@ pragma solidity ^0.8.0; import "./BridgeGetters.sol"; +//TODO link to file in github so doesn't become stale interface ITokenBridge is BridgeGetters { /* * @dev Produce a AssetMeta message for a given token @@ -76,7 +81,7 @@ interface ITokenBridge is BridgeGetters { bytes32 recipient, uint32 nonce, bytes memory payload - ) external payable returns (uint64 sequence); + ) external payable returns (uint64 sequence); function updateWrapped(bytes memory encodedVm) external returns (address token); @@ -124,4 +129,35 @@ interface ITokenBridge is BridgeGetters { */ function completeTransferAndUnwrapETH(bytes memory encodedVm) external ; } -``` \ No newline at end of file +``` + +## Registering New Tokens + +- Only needs to be done once globally ever +- Reattesting will update metadata, can be done over and over +- Generally not done by the xDapp contract, but instead by an off-chain process or by hand +- Probably don't need code examples, as it's not advised to do this on chain for most usecases + +## Basic Transfer + +- Code example for transferring an ERC-20, explain all the args, WORMHOLE ADDRESSES +- Transferring native currency is a special case. Use transferETH for the native currency regardless of which EVM you are on. +- Use this only if you are transferring to an end user wallet. If you're transferring to a smart contract (which you control), use transferWithPayload instead. Explain why +- Mention public relayers, unwrapping conventions, fee schedule. + +## Contract Controlled Transfer + +- Differences when compared to a basic transfer: has a payload, can only be redeemed if msg.sender == the recipient, doesn't have a relayer fee field because of the redemption restriction. +- Always use this when the destination is a contract + +## Redemption + +### Basic Token Redemption + +- completeTransfer for everything +- completeTransfer and unwrap Eth only for the case where unwrapping ETH is desired + +### Contract Controlled Transfer redemption + +- completeTransferWithPayload for everything, +- completeTransferAndUnwrapETH as a QoL function. Unwraps the ETH before giving it to the contract. From 8c7bb3d50a82de17d639019edd6910e2318220c4 Mon Sep 17 00:00:00 2001 From: chase-45 Date: Wed, 14 Sep 2022 15:54:25 -0400 Subject: [PATCH 27/69] more outlining --- src/SUMMARY.md | 7 ++++--- src/technical/evm/relayer.md | 1 + src/technical/relayer/guardianNetwork.md | 8 ++++++++ src/technical/relayer/pluginRelayers.md | 15 +++++++++++++++ 4 files changed, 28 insertions(+), 3 deletions(-) create mode 100644 src/technical/evm/relayer.md create mode 100644 src/technical/relayer/pluginRelayers.md diff --git a/src/SUMMARY.md b/src/SUMMARY.md index d40bc10..26d43f6 100644 --- a/src/SUMMARY.md +++ b/src/SUMMARY.md @@ -47,8 +47,9 @@ - [EVM]() - [Core Layer](./technical/evm/coreLayer.md) - - [xAsset Layer](./technical/evm/xassetLayer.md) - - [NFT Layer](./technical/evm/nftLayer.md) + - [xAsset Module](./technical/evm/xassetLayer.md) + - [NFT Module](./technical/evm/nftLayer.md) + - [Relayer Module](./technical/evm/relayer.md) - [Solana]() - [Cosmos]() - [Algorand]() @@ -57,7 +58,7 @@ - [Relayers]() - - [Plugin Relayer]() + - [Plugin Relayer](./technical/relayer/pluginRelayers.md) - [Guardian Network](./technical/relayer/guardianNetwork.md) - [Wormhole Typescript SDK](./development/portal/overview.md) diff --git a/src/technical/evm/relayer.md b/src/technical/evm/relayer.md new file mode 100644 index 0000000..9d30da0 --- /dev/null +++ b/src/technical/evm/relayer.md @@ -0,0 +1 @@ +# Relayer Module diff --git a/src/technical/relayer/guardianNetwork.md b/src/technical/relayer/guardianNetwork.md index 6f91a05..f3fbe46 100644 --- a/src/technical/relayer/guardianNetwork.md +++ b/src/technical/relayer/guardianNetwork.md @@ -1 +1,9 @@ # Guardian Network + +If you're totally homerolling a relayer solution, you'll need to interact with the guardian network directly. + +link to spydk. Use this to tie directly into the guardian network and receive events. If you're particularly ambitious, you can even join the guardian network as a 'spy' which is the term for a non-validating guardian. + +VAAs can also be pulled directly from any public node on the guardian network using REST endpoints. This is a really simple way to grab known VAAs. + +- provide the REST endpoints for this diff --git a/src/technical/relayer/pluginRelayers.md b/src/technical/relayer/pluginRelayers.md new file mode 100644 index 0000000..d4eaf05 --- /dev/null +++ b/src/technical/relayer/pluginRelayers.md @@ -0,0 +1,15 @@ +- Link to Plugin relayer codebase + +- Recommend plugin relayers as the starting point for anyone developing specialized relayers +- plugin relayers provide a kernel for relayer development. Handles management of all the necessary hotwallets, provides the necessary typescript interfaces for dealing with each ecosystems, and provides an easy integration point to connect to the guardian network + +- Follow the instructions provided in the codebase in order to get it running +- to develop a plugin, simply implement the interface provided at [here] +- diagram explaining the flow +- Listener component listens to either incoming REST calls or the guardian network for relevant VAAs, +- When a relevant VAA is detected, your listener code is responsible for producing an action. +- This action is stored in a redis instance +- The executor portion of the interface is responsible for consuming interactions which are provided by the listener. +- The executor is handed an action and is responsible for consuming that action and (optionally) queuing up more actions + +- additional configuration info can be found in the README of the codebase. From e09fad02b336eed8b402e160c90d12120301134b Mon Sep 17 00:00:00 2001 From: Eric Wong Date: Wed, 14 Sep 2022 17:04:31 -0500 Subject: [PATCH 28/69] evm: coreLayer --- src/technical/evm/coreLayer.md | 80 +++++++++++++--------------------- 1 file changed, 31 insertions(+), 49 deletions(-) diff --git a/src/technical/evm/coreLayer.md b/src/technical/evm/coreLayer.md index a0392d2..e929e10 100644 --- a/src/technical/evm/coreLayer.md +++ b/src/technical/evm/coreLayer.md @@ -2,65 +2,24 @@ This section will explain how to properly interact with the Wormhome Core Layer in an EVM ecosystem. -# Configuring the Interface +## Configuring the Interface - Get the interface from the repo - Instantiate it with the core layer contract address for your blockchain. This is dependent on your development ecosystem and blockchain. This value is usually stored in your contract state. -This is the interface for applications to interact with Wormhole's Core Contract to publish messages or verify and parse a received message. +[Here](https://github.com/wormhole-foundation/wormhole/blob/dev.v2/ethereum/contracts/interfaces/IWormhole.sol) is the interface for applications to interact with Wormhole's Core Contract to publish messages or verify and parse a received message. -//TODO just link to the github repo, in order to avoid stale information +Instantiating the interface will depend on your development ecosystem and blockchain. The Wormhole Core Layer contract address is usually stored in your contract address. +Below is an example line of code to instantiate the interface for mainnet Ethereum: ``` -// contracts/Messages.sol -// SPDX-License-Identifier: Apache 2 - -pragma solidity ^0.8.0; - -import "../Structs.sol"; - -interface IWormhole is Structs { - event LogMessagePublished(address indexed sender, uint64 sequence, uint32 nonce, bytes payload, uint8 consistencyLevel); - - function publishMessage( - uint32 nonce, - bytes memory payload, - uint8 consistencyLevel - ) external payable returns (uint64 sequence); - - function parseAndVerifyVM(bytes calldata encodedVM) external view returns (Structs.VM memory vm, bool valid, string memory reason); - - function verifyVM(Structs.VM memory vm) external view returns (bool valid, string memory reason); - - function verifySignatures(bytes32 hash, Structs.Signature[] memory signatures, Structs.GuardianSet memory guardianSet) external pure returns (bool valid, string memory reason) ; - - function parseVM(bytes memory encodedVM) external pure returns (Structs.VM memory vm); - - function getGuardianSet(uint32 index) external view returns (Structs.GuardianSet memory) ; - - function getCurrentGuardianSetIndex() external view returns (uint32) ; - - function getGuardianSetExpiry() external view returns (uint32) ; - - function governanceActionIsConsumed(bytes32 hash) external view returns (bool) ; - - function isInitialized(address impl) external view returns (bool) ; - - function chainId() external view returns (uint16) ; - - function governanceChainId() external view returns (uint16); - - function governanceContract() external view returns (bytes32); - - function messageFee() external view returns (uint256) ; -} +address private wormhole_core_bridge_address = address(0x98f3c9e6E3fAce36bAAd05FE09d375Ef1464288B); +IWormhole core_bridge = IWormhole(wormhole_core_bridge_address); ``` -//TODO example line of code for instantiating the interface for mainnet Ethereum - ## Primary functions -The Wormhole Core Layer effectively only has two important interactions. The ability to emit messages, and the ability to verify messages which originated from other chains. +The Wormhole Core Layer effectively only has two important interactions - (1) the ability to emit messages, and (2) the ability to parse and verify messages which originated from other chains. ### Emitting a Message @@ -68,9 +27,32 @@ The Wormhole Core Layer effectively only has two important interactions. The abi - explain every argument - be sure to mention batch VAAs -### Verifying a Message +To emit a message, always use `publishMessage` which takes in the following arguments: + +1. `nonce` (uint32): a number assigned to each message + - The `nonce` gives the receving contract a mechanism by which to make sure it does not double process messages + - Batch VAAs allow for easier compsability and better gas efficiency of multiple messages. To do this, messages emitted within the same transaction with the same nonce are bundled together into one aggregate message. Messages with a nonce of `0` will not be included in a Batch VAA and emitted individually. +2. `Consistency` (uint8): the number of blocks that Guardians will wait before signing a message. + - Each blockchain has different finality periods. In general, higher consistencies mean more security against blockchain reorgs. + - [Here]() are the consistency levels by blockchain that are used by the xAsset layer to have a high level of guarantee against reorgs. +3. `Payload` (bytes[]): raw bytes to emit. + - It is up to the receiving contract to properly parse this arbitrary set of bytes. + +`publishMessage` will output a `sequence` (uint64) that is used in conjunction with `emitterChainID` and `emitterAddress` to retrive the generated VAA from the Guardian Network. + +### Parsing and Verifying a Message - Explain how a message should be taken in as a byte array - Be cognizant of Batch VAAs vs Single VAAs - entrypoint code vs module code. If using single VAAs, these are the same, but batch VAAs are more complicated to verify - remember to collect your gas after all the VAAs have been verified + +Parsing and Verifying a message will depend on the type of VAA that your application expects: a Single VAA or a Batch VAA. + +**Single VAA** + +The properly parse and verify a single VAA, always use `parseAndVerifyVM` which takes in one argument: `encodedVM`. This function will return three arguments: + +1. `vm` (VM): Structured data that reflects the content of the VAA. A breakdown of this message format is described in the [VAA](../../wormhole/4_vaa.md) section. +2. `valid` (bool): Boolean that reflects whether or not the VAA was properly signed by the Guardian Network +3. `reason` (string): Explanatory error message if a VAA is invalid, or an empty string if it is valid. \ No newline at end of file From 41f9084bacf2dff15610aeb20fd654a954b7334a Mon Sep 17 00:00:00 2001 From: Eric Wong Date: Thu, 15 Sep 2022 10:37:48 -0500 Subject: [PATCH 29/69] evm: interacting with core layer --- src/technical/evm/coreLayer.md | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/src/technical/evm/coreLayer.md b/src/technical/evm/coreLayer.md index e929e10..cd4fa0b 100644 --- a/src/technical/evm/coreLayer.md +++ b/src/technical/evm/coreLayer.md @@ -36,7 +36,7 @@ To emit a message, always use `publishMessage` which takes in the following argu - Each blockchain has different finality periods. In general, higher consistencies mean more security against blockchain reorgs. - [Here]() are the consistency levels by blockchain that are used by the xAsset layer to have a high level of guarantee against reorgs. 3. `Payload` (bytes[]): raw bytes to emit. - - It is up to the receiving contract to properly parse this arbitrary set of bytes. + - It is up to the emitting contract to properly define this arbitrary set of bytes. `publishMessage` will output a `sequence` (uint64) that is used in conjunction with `emitterChainID` and `emitterAddress` to retrive the generated VAA from the Guardian Network. @@ -49,10 +49,18 @@ To emit a message, always use `publishMessage` which takes in the following argu Parsing and Verifying a message will depend on the type of VAA that your application expects: a Single VAA or a Batch VAA. +For either message type, remember to collect gas fees associated with submitting them on-chain after all VAAs have been verified. + **Single VAA** -The properly parse and verify a single VAA, always use `parseAndVerifyVM` which takes in one argument: `encodedVM`. This function will return three arguments: +To properly parse and verify a single VAA, always use `parseAndVerifyVM` which takes in one argument: `encodedVM` (bytes). This function will return three arguments: -1. `vm` (VM): Structured data that reflects the content of the VAA. A breakdown of this message format is described in the [VAA](../../wormhole/4_vaa.md) section. +1. `vm` (VM): Structured data that reflects the content of the VAA. A breakdown of this message format is described in the [VAA](../../wormhole/4_vaa.md) section. It is up to the receving contracting to properly parse this data structure for the necessary information. 2. `valid` (bool): Boolean that reflects whether or not the VAA was properly signed by the Guardian Network -3. `reason` (string): Explanatory error message if a VAA is invalid, or an empty string if it is valid. \ No newline at end of file +3. `reason` (string): Explanatory error message if a VAA is invalid, or an empty string if it is valid. + +**Batch VAA** + +To properly parse and verify a batch VAA, always use `parseAndVerifyBatchVM` which takes in two arguments: `encodedVM` (bytes) and `cache` (bool). + +Batch VAAs are designed so that relayers can choose to submit any subset of the observations batched together. It is the receiving contract's responsiblity to verify that all VAAs contained in a batch are submitted. \ No newline at end of file From 8df36fd45def6905fd56aa660f92edcb4377f802 Mon Sep 17 00:00:00 2001 From: chase-45 Date: Thu, 15 Sep 2022 11:47:19 -0400 Subject: [PATCH 30/69] continuing to add info into the tech pages --- src/technical/evm/coreLayer.md | 23 ++++++++++++++--------- 1 file changed, 14 insertions(+), 9 deletions(-) diff --git a/src/technical/evm/coreLayer.md b/src/technical/evm/coreLayer.md index cd4fa0b..3fbf098 100644 --- a/src/technical/evm/coreLayer.md +++ b/src/technical/evm/coreLayer.md @@ -9,9 +9,10 @@ This section will explain how to properly interact with the Wormhome Core Layer [Here](https://github.com/wormhole-foundation/wormhole/blob/dev.v2/ethereum/contracts/interfaces/IWormhole.sol) is the interface for applications to interact with Wormhole's Core Contract to publish messages or verify and parse a received message. -Instantiating the interface will depend on your development ecosystem and blockchain. The Wormhole Core Layer contract address is usually stored in your contract address. +Instantiating the interface will depend on your development ecosystem and blockchain. The Wormhole Core Layer contract address is usually stored in your contract address. Below is an example line of code to instantiate the interface for mainnet Ethereum: + ``` address private wormhole_core_bridge_address = address(0x98f3c9e6E3fAce36bAAd05FE09d375Ef1464288B); IWormhole core_bridge = IWormhole(wormhole_core_bridge_address); @@ -31,11 +32,11 @@ To emit a message, always use `publishMessage` which takes in the following argu 1. `nonce` (uint32): a number assigned to each message - The `nonce` gives the receving contract a mechanism by which to make sure it does not double process messages - - Batch VAAs allow for easier compsability and better gas efficiency of multiple messages. To do this, messages emitted within the same transaction with the same nonce are bundled together into one aggregate message. Messages with a nonce of `0` will not be included in a Batch VAA and emitted individually. -2. `Consistency` (uint8): the number of blocks that Guardians will wait before signing a message. + - Batch VAAs allow for easier compsability and better gas efficiency of multiple messages. To do this, messages emitted within the same transaction with the same nonce are bundled together into one aggregate message. Messages with a nonce of `0` will not be included in a Batch VAA and emitted individually. +2. `Consistency` (uint8): the number of blocks that Guardians will wait before signing a message. - Each blockchain has different finality periods. In general, higher consistencies mean more security against blockchain reorgs. - [Here]() are the consistency levels by blockchain that are used by the xAsset layer to have a high level of guarantee against reorgs. -3. `Payload` (bytes[]): raw bytes to emit. +3. `Payload` (bytes[]): raw bytes to emit. - It is up to the emitting contract to properly define this arbitrary set of bytes. `publishMessage` will output a `sequence` (uint64) that is used in conjunction with `emitterChainID` and `emitterAddress` to retrive the generated VAA from the Guardian Network. @@ -55,12 +56,16 @@ For either message type, remember to collect gas fees associated with submitting To properly parse and verify a single VAA, always use `parseAndVerifyVM` which takes in one argument: `encodedVM` (bytes). This function will return three arguments: -1. `vm` (VM): Structured data that reflects the content of the VAA. A breakdown of this message format is described in the [VAA](../../wormhole/4_vaa.md) section. It is up to the receving contracting to properly parse this data structure for the necessary information. -2. `valid` (bool): Boolean that reflects whether or not the VAA was properly signed by the Guardian Network -3. `reason` (string): Explanatory error message if a VAA is invalid, or an empty string if it is valid. +1. `vm` (VM): Structured data that reflects the content of the VAA. A breakdown of this message format is described in the [VAA](../../wormhole/4_vaa.md) section. It is up to the receving contracting to properly parse this data structure for the necessary information. +2. `valid` (bool): Boolean that reflects whether or not the VAA was properly signed by the Guardian Network +3. `reason` (string): Explanatory error message if a VAA is invalid, or an empty string if it is valid. **Batch VAA** -To properly parse and verify a batch VAA, always use `parseAndVerifyBatchVM` which takes in two arguments: `encodedVM` (bytes) and `cache` (bool). +To properly parse and verify a batch VAA, always use `parseAndVerifyBatchVM` which takes in two arguments: `encodedVM` (bytes) and `cache` (bool). -Batch VAAs are designed so that relayers can choose to submit any subset of the observations batched together. It is the receiving contract's responsiblity to verify that all VAAs contained in a batch are submitted. \ No newline at end of file +Batch VAAs are designed so that relayers can choose to submit any subset of the observations batched together. It is the receiving contract's responsiblity to verify that all VAAs contained in a batch are submitted. + +--- + +Code recommendation, write the code which expects to receive a VAA to utilize parseAndVerifyVM(? unsure if this is the correct call). That way, your code will be able to handle either type 1 VAAs (single VAAs), or type 3 VAAs (headless VAAs). This allows it to utilize both single & batch VAAs and dramatically increases composeability. \*this only requires like two or three lines of code, so this would be a good candidate for a code example which shows how to properly use batch vaas without breaking composeability. Should note that the module code still ALWAYS needs to verify, but should do so with the 'single' message verifying and then expose that function publicly in order to enable composeability. From 7d292527eb9cef943e0cdad26c35f5ab30fdef43 Mon Sep 17 00:00:00 2001 From: chase-45 Date: Thu, 15 Sep 2022 11:47:50 -0400 Subject: [PATCH 31/69] env info added to technical --- src/technical/{ => env}/environments.md | 0 src/technical/{ => env}/overview.md | 0 src/technical/env/testnet.md | 12 ++++++++++++ src/technical/env/tilt.md | 22 ++++++++++++++++++++++ src/technical/env/wlv.md | 15 +++++++++++++++ src/technical/testnet.md | 1 - src/technical/tilt.md | 1 - src/technical/wlv.md | 1 - 8 files changed, 49 insertions(+), 3 deletions(-) rename src/technical/{ => env}/environments.md (100%) rename src/technical/{ => env}/overview.md (100%) create mode 100644 src/technical/env/testnet.md create mode 100644 src/technical/env/tilt.md create mode 100644 src/technical/env/wlv.md delete mode 100644 src/technical/testnet.md delete mode 100644 src/technical/tilt.md delete mode 100644 src/technical/wlv.md diff --git a/src/technical/environments.md b/src/technical/env/environments.md similarity index 100% rename from src/technical/environments.md rename to src/technical/env/environments.md diff --git a/src/technical/overview.md b/src/technical/env/overview.md similarity index 100% rename from src/technical/overview.md rename to src/technical/env/overview.md diff --git a/src/technical/env/testnet.md b/src/technical/env/testnet.md new file mode 100644 index 0000000..ee6ee4c --- /dev/null +++ b/src/technical/env/testnet.md @@ -0,0 +1,12 @@ +# Testnet + +Wormhole testnet functions much like mainnet, is spread across many of the most popular testnet platforms + +- check reference section for testnet contracts + +Pros: + +Cons: + +- Many testnet blockchains are somewhat unstable and unreliable +- Getting testnet tokens is a nuisance diff --git a/src/technical/env/tilt.md b/src/technical/env/tilt.md new file mode 100644 index 0000000..073f8d5 --- /dev/null +++ b/src/technical/env/tilt.md @@ -0,0 +1,22 @@ +# Tilt + +- tilt is a unique environment specifically set up to deal with the challenges of cross-chain development +- used by the Wormhole core repository +- Uses tilt to configure and manage a kubernetes environment. +- has docker containers for every ecosystem supported by wormhole, along with containers for things like the guardian, spy, generic relayers, etc +- Big bad development ecosystem with all the tools, used by core contributors + +Pros + +- Out of the box support for the many components needed to develop across the heterogenous blockchain space +- Consistent development environment, where contracts deploy deterministically & everything is already linked up +- Ability to easily turn containers on and off as needed + +Cons + +- Relatively high system requirements. Specifically is RAM intensive +- Iteration requires docker container rebuilds, which can be slow +- Most blockchains are 'fresh', and thus may require you to deploy your own contract dependencies. + +show basic setup for each ecosystem, list installed dependencies +explain the tiltfile, show how to enable/disable components, give command for starting with just two evm chains diff --git a/src/technical/env/wlv.md b/src/technical/env/wlv.md new file mode 100644 index 0000000..5ae10b7 --- /dev/null +++ b/src/technical/env/wlv.md @@ -0,0 +1,15 @@ +# Wormhole Local Validator + +- windows local validator is a development build of the guardian software +- easy to run, easy to configure. Connect it to whatever blockchain you feel like using, and use some provided scripts to deploy the necessary wormhole contracts +- Newer, still has features being added + +Pros: + +- Lightweight, low system resource demand +- Good iteration times +- Can be added into an existing blockchain development setup + +Cons: + +- You may end up reinventing the tilt/testnet environment as you add more components diff --git a/src/technical/testnet.md b/src/technical/testnet.md deleted file mode 100644 index 27ed5e1..0000000 --- a/src/technical/testnet.md +++ /dev/null @@ -1 +0,0 @@ -# Testnet diff --git a/src/technical/tilt.md b/src/technical/tilt.md deleted file mode 100644 index 6bda0ba..0000000 --- a/src/technical/tilt.md +++ /dev/null @@ -1 +0,0 @@ -# Tilt diff --git a/src/technical/wlv.md b/src/technical/wlv.md deleted file mode 100644 index 913c7a1..0000000 --- a/src/technical/wlv.md +++ /dev/null @@ -1 +0,0 @@ -# Wormhole Local Validator From dfd3fbb1fcae6657e836cc9907abe5986d6c7190 Mon Sep 17 00:00:00 2001 From: chase-45 Date: Thu, 15 Sep 2022 11:57:56 -0400 Subject: [PATCH 32/69] added a tooling page --- src/SUMMARY.md | 9 +++++---- src/technical/env/tooling.md | 11 +++++++++++ 2 files changed, 16 insertions(+), 4 deletions(-) create mode 100644 src/technical/env/tooling.md diff --git a/src/SUMMARY.md b/src/SUMMARY.md index 26d43f6..e49e8c2 100644 --- a/src/SUMMARY.md +++ b/src/SUMMARY.md @@ -37,11 +37,12 @@ # Developing xDapps -- [Environment Setup](./technical/environments.md) +- [Environment Setup](./technical/env/environments.md) - - [Tilt](./technical/tilt.md) - - [Wormhole Local Validator](./technical/wlv.md) - - [Testnet](./technical/testnet.md) + - [Tooling](./technical/env/tooling.md) + - [Tilt](./technical/env/tilt.md) + - [Wormhole Local Validator](./technical/env/wlv.md) + - [Testnet](./technical/env/testnet.md) - [Contract Development]() diff --git a/src/technical/env/tooling.md b/src/technical/env/tooling.md new file mode 100644 index 0000000..1573f30 --- /dev/null +++ b/src/technical/env/tooling.md @@ -0,0 +1,11 @@ +#Tooling + +regardless of what env you use, there are some wormhole-specific tools you should know about. Most developers find it useful to clone the Wormhole core repository, as it has quite a few useful tools. + +worm CLI tool (link to code) - great cli tool for getting odds and ends done surround wormhole contracts, VAAs and more +orchestrator - WIP tool which is connected to the WLV environment. Can be useful for managing deployment of your xDapp contracts +reference bridge UI - a GUI which can be used to perform token transfers around the ecosystem +Wormhole Typescript SDK - typescript SDK designed to aid in interacting directly with the Wormhole contracts. +Explorer - mainnet link, and link to local code. Can be a good resource for looking at individual transfers +Wormhole Rust SDKs - useful when working in the various Rust environments, WIP, link to source +Spydk - useful for listening to the guardian network (link to source code and official release) From 272d3baebdba24570a0bcde5eeb88e341c476ca6 Mon Sep 17 00:00:00 2001 From: chase-45 Date: Thu, 15 Sep 2022 12:02:28 -0400 Subject: [PATCH 33/69] evm overview page --- src/SUMMARY.md | 2 +- src/technical/evm/overview.md | 9 +++++++++ 2 files changed, 10 insertions(+), 1 deletion(-) create mode 100644 src/technical/evm/overview.md diff --git a/src/SUMMARY.md b/src/SUMMARY.md index e49e8c2..b6550dd 100644 --- a/src/SUMMARY.md +++ b/src/SUMMARY.md @@ -46,7 +46,7 @@ - [Contract Development]() - - [EVM]() + - [EVM](./technical/evm//overview.md) - [Core Layer](./technical/evm/coreLayer.md) - [xAsset Module](./technical/evm/xassetLayer.md) - [NFT Module](./technical/evm/nftLayer.md) diff --git a/src/technical/evm/overview.md b/src/technical/evm/overview.md new file mode 100644 index 0000000..faaa23d --- /dev/null +++ b/src/technical/evm/overview.md @@ -0,0 +1,9 @@ +# EVM + +explain that this is not a beginners guide to using EVM ecosystems, but rather a guide for how to use wormhole for experienced EVM developers. + +For our purposes, EVM refers to any blockchain in the Wormhole ecosystem utilizing the EVM contracts of Wormhole. This includes not only Ethereum, but also blockchains like Polygon and Avax, as well as EVM+ environments like Acala. + +Link to some recommended tooling +ethers library, +foundry is preferred and increasingly used by the core repository, truffle and hardhat also options From 060202e3df79324743858ad3b0bc9832f1fe9024 Mon Sep 17 00:00:00 2001 From: chase-45 Date: Thu, 15 Sep 2022 12:07:27 -0400 Subject: [PATCH 34/69] relayer overview page --- src/SUMMARY.md | 3 ++- src/technical/relayer/overview.md | 4 ++++ 2 files changed, 6 insertions(+), 1 deletion(-) create mode 100644 src/technical/relayer/overview.md diff --git a/src/SUMMARY.md b/src/SUMMARY.md index b6550dd..0e05459 100644 --- a/src/SUMMARY.md +++ b/src/SUMMARY.md @@ -56,8 +56,9 @@ - [Algorand]() - [Near]() - [Aptos]() + - [Sui]() -- [Relayers]() +- [Relayers](./technical/relayer/overview.md) - [Plugin Relayer](./technical/relayer/pluginRelayers.md) - [Guardian Network](./technical/relayer/guardianNetwork.md) diff --git a/src/technical/relayer/overview.md b/src/technical/relayer/overview.md new file mode 100644 index 0000000..b51c251 --- /dev/null +++ b/src/technical/relayer/overview.md @@ -0,0 +1,4 @@ +# Relayer Development + +This section will help you get started with specialized relayer development +generic relayers only require on-chain components. If you're using those, everything you need should be encompassed by referencing the relevant 'Relayer Module' sections above. From 46a97dcb1ab908e194ff3a43d7a15dc115a807ac Mon Sep 17 00:00:00 2001 From: chase-45 Date: Thu, 15 Sep 2022 12:13:22 -0400 Subject: [PATCH 35/69] added glossary page --- src/SUMMARY.md | 11 +++++------ src/reference/glossary.md | 1 + 2 files changed, 6 insertions(+), 6 deletions(-) create mode 100644 src/reference/glossary.md diff --git a/src/SUMMARY.md b/src/SUMMARY.md index 0e05459..8775927 100644 --- a/src/SUMMARY.md +++ b/src/SUMMARY.md @@ -75,9 +75,8 @@ # Other Resources -- [Reference]() - - - [Tools](./reference/tools.md) - - [Github & Useful Links](./reference/github.md) - - [Deployed Contracts](./reference/contracts.md) - - [RPC Nodes](./reference/rpcnodes.md) +- [Glossary](./reference/glossary.md) +- [Tools](./reference/tools.md) +- [Github & Useful Links](./reference/github.md) +- [Deployed Contracts](./reference/contracts.md) +- [RPC Nodes](./reference/rpcnodes.md) diff --git a/src/reference/glossary.md b/src/reference/glossary.md new file mode 100644 index 0000000..ca3c827 --- /dev/null +++ b/src/reference/glossary.md @@ -0,0 +1 @@ +# Glossary From e71de095ee3eba99f187b148e7e612c27015ec58 Mon Sep 17 00:00:00 2001 From: chase-45 Date: Fri, 16 Sep 2022 11:41:02 -0400 Subject: [PATCH 36/69] stubbing solana files --- src/technical/solana/core.md | 0 src/technical/solana/nft.md | 0 src/technical/solana/xasset.md | 0 3 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 src/technical/solana/core.md create mode 100644 src/technical/solana/nft.md create mode 100644 src/technical/solana/xasset.md diff --git a/src/technical/solana/core.md b/src/technical/solana/core.md new file mode 100644 index 0000000..e69de29 diff --git a/src/technical/solana/nft.md b/src/technical/solana/nft.md new file mode 100644 index 0000000..e69de29 diff --git a/src/technical/solana/xasset.md b/src/technical/solana/xasset.md new file mode 100644 index 0000000..e69de29 From 4492706bf85caaefe391bfd3fbb9737506ce9dd4 Mon Sep 17 00:00:00 2001 From: Eric Wong Date: Fri, 16 Sep 2022 10:45:16 -0500 Subject: [PATCH 37/69] evm: xasset layer --- src/technical/env/wlv.md | 2 +- src/technical/evm/xassetLayer.md | 232 +++++++++++++++---------------- 2 files changed, 112 insertions(+), 122 deletions(-) diff --git a/src/technical/env/wlv.md b/src/technical/env/wlv.md index 5ae10b7..0af2bd9 100644 --- a/src/technical/env/wlv.md +++ b/src/technical/env/wlv.md @@ -1,6 +1,6 @@ # Wormhole Local Validator -- windows local validator is a development build of the guardian software +- wormhole local validator is a development build of the guardian software - easy to run, easy to configure. Connect it to whatever blockchain you feel like using, and use some provided scripts to deploy the necessary wormhole contracts - Newer, still has features being added diff --git a/src/technical/evm/xassetLayer.md b/src/technical/evm/xassetLayer.md index 825c85d..04dcb89 100644 --- a/src/technical/evm/xassetLayer.md +++ b/src/technical/evm/xassetLayer.md @@ -1,134 +1,21 @@ # xAsset Layer -This is the interface for applications to interact with the xAsset layer in Wormhole +This section will explain how to properly interact with the Wormhome Core Layer in an EVM ecosystem. -# Instantiating the interface +# Configuring the interface - Same as instantiating any other EVM interface / Core Layer / NFT Layer, -``` -// contracts/Bridge.sol -// SPDX-License-Identifier: Apache 2 - -pragma solidity ^0.8.0; - -import "./BridgeGetters.sol"; - +[Here]() is the interface for applications to interact with Wormhole's xAsset layer. //TODO link to file in github so doesn't become stale -interface ITokenBridge is BridgeGetters { - /* - * @dev Produce a AssetMeta message for a given token - */ - function attestToken(address tokenAddress, uint32 nonce) external payable returns (uint64 sequence); - /* - * @notice Send eth through portal by first wrapping it to WETH. - */ - function wrapAndTransferETH( - uint16 recipientChain, - bytes32 recipient, - uint256 arbiterFee, - uint32 nonce - ) external payable returns (uint64 sequence); +Instantiating the interface will depend on your development ecosystem and blockchain. The Wormhole Core Layer contract address is usually stored in your contract address. - /* - * @notice Send eth through portal by first wrapping it. - * - * @dev This type of transfer is called a "contract-controlled transfer". - * There are three differences from a regular token transfer: - * 1) Additional arbitrary payload can be attached to the message - * 2) Only the recipient (typically a contract) can redeem the transaction - * 3) The sender's address (msg.sender) is also included in the transaction payload - * - * With these three additional components, xDapps can implement cross-chain - * composable interactions. - */ - function wrapAndTransferETHWithPayload( - uint16 recipientChain, - bytes32 recipient, - uint32 nonce, - bytes memory payload - ) external payable returns (uint64 sequence); +Below is an example line of code to instantiate the interface for mainnet Ethereum: - /* - * @notice Send ERC20 token through portal. - */ - function transferTokens( - address token, - uint256 amount, - uint16 recipientChain, - bytes32 recipient, - uint256 arbiterFee, - uint32 nonce - ) external payable returns (uint64 sequence); - - /* - * @notice Send ERC20 token through portal. - * - * @dev This type of transfer is called a "contract-controlled transfer". - * There are three differences from a regular token transfer: - * 1) Additional arbitrary payload can be attached to the message - * 2) Only the recipient (typically a contract) can redeem the transaction - * 3) The sender's address (msg.sender) is also included in the transaction payload - * - * With these three additional components, xDapps can implement cross-chain - * composable interactions. - */ - function transferTokensWithPayload( - address token, - uint256 amount, - uint16 recipientChain, - bytes32 recipient, - uint32 nonce, - bytes memory payload - ) external payable returns (uint64 sequence); - - function updateWrapped(bytes memory encodedVm) external returns (address token); - - function createWrapped(bytes memory encodedVm) external returns (address token); - - /* - * @notice Complete a contract-controlled transfer of an ERC20 token. - * - * @dev The transaction can only be redeemed by the recipient, typically a - * contract. - * - * @param encodedVm A byte array containing a VAA signed by the guardians. - * - * @return The byte array representing a BridgeStructs.TransferWithPayload. - */ - function completeTransferWithPayload(bytes memory encodedVm) external returns (bytes memory); - - /* - * @notice Complete a contract-controlled transfer of WETH, and unwrap to ETH. - * - * @dev The transaction can only be redeemed by the recipient, typically a - * contract. - * - * @param encodedVm A byte array containing a VAA signed by the guardians. - * - * @return The byte array representing a BridgeStructs.TransferWithPayload. - */ - function completeTransferAndUnwrapETHWithPayload(bytes memory encodedVm) external returns (bytes memory); - - /* - * @notice Complete a transfer of an ERC20 token. - * - * @dev The msg.sender gets paid the associated fee. - * - * @param encodedVm A byte array containing a VAA signed by the guardians. - */ - function completeTransfer(bytes memory encodedVm) external ; - - /* - * @notice Complete a transfer of WETH and unwrap to eth. - * - * @dev The msg.sender gets paid the associated fee. - * - * @param encodedVm A byte array containing a VAA signed by the guardians. - */ - function completeTransferAndUnwrapETH(bytes memory encodedVm) external ; -} +``` +address private wormhole_token_bridge_address = address(0x3ee18B2214AFF97000D974cf647E7C347E8fa585); +ITokenBridge token_bridge = ITokenBridge(wormhole_token_bridge_address); ``` ## Registering New Tokens @@ -138,6 +25,14 @@ interface ITokenBridge is BridgeGetters { - Generally not done by the xDapp contract, but instead by an off-chain process or by hand - Probably don't need code examples, as it's not advised to do this on chain for most usecases +Attesting a token from EVM needs to happen once per token. If a token is not attested, it will not be claimable until so. However, there are no restrictions to reattesting a token; doing so will update the metadata. + +It is not advised to attest tokens on-chain for most usecases. + +To attest a token by an off-chain process, you can either do it by hand through one of the Token Bridge UIs (for example [Portal](https://www.portalbridge.com/#/transfer)) or using the JS SDK. + +// If we want to show how to attest with JS SDK, have the example [here](https://book.wormhole.com/development/portal/evm/attestingToken.html) + ## Basic Transfer - Code example for transferring an ERC-20, explain all the args, WORMHOLE ADDRESSES @@ -145,11 +40,104 @@ interface ITokenBridge is BridgeGetters { - Use this only if you are transferring to an end user wallet. If you're transferring to a smart contract (which you control), use transferWithPayload instead. Explain why - Mention public relayers, unwrapping conventions, fee schedule. +Basic transfer should only be used if you are transferring messages to an end user wallet. If the end destination is a contract, you should only use Contract Controlled Transfers (described below). + +It is important to note the transferring native currency is a special case of the Basic Transfer. As such, a different function call is provided as a QoL improvement when initiating and completing the transfer messaging when unwrapping the ETH is desired. + +To transfer a token, there are four steps: +1. Approve the Token Bridge to spend that token on our behalf. + - _Note: Tokens in EVM usually denote up to 18 decimals places. However. Wormhole normalizes this to **8** decimals._ +``` +contractAddress.approve(token_bridge_address, amt); +``` +2. Transfer the token to create the transfer VAA. + - This function call will return a `sequence` (uint64) that is used in the VAA retrieval step. + - _Note: Wormhole addresses are 32 bytes for standardization across the different blockchains within the Wormhole ecosystem._ +``` +// To initiate transfer of normal ERC-20s +token_bridge.transferTokens(tokenAddress, amount, recipientChain, recipient, arbiterFee, nonce); + +// To initiate transfer of native currency +token_bridge.wrapAndTransferETH(recipientChain, recipient, arbiterFee, nonce); +``` +3. Retrieve the emitted VAA. + - _Note: Basic Transfer VAAs are retrieved from the Guardian Network by the `emitterChainID`, `emitterAddress`, and `sequence`_ +``` +const emitterAddr = getEmitterAddressEth(network.tokenBridgeAddress); +const seq = parseSequenceFromLogEth(tx, network.bridgeAddress); +const vaaURL = `${config.wormhole.restAddress}/v1/signed_vaa/${network.wormholeChainId}/${emitterAddr}/${seq}`; +let vaaBytes = await (await fetch(vaaURL)).json(); +while (!vaaBytes.vaaBytes) { + console.log("VAA not found, retrying in 5s!"); + await new Promise((r) => setTimeout(r, 5000)); //Timeout to let Guardiand pick up log and have VAA ready + vaaBytes = await (await fetch(vaaURL)).json(); +} +``` + +4. Complete the transfer using the VAA. + - _Note: VAAs are retrieved from the +``` +// To complete transfer of normal ERC-20s +token_bridge.completeTransfer(VAA); + +// To complete transfer of native currency +completeTransferAndUnwrapETH(VAA); +``` + ## Contract Controlled Transfer - Differences when compared to a basic transfer: has a payload, can only be redeemed if msg.sender == the recipient, doesn't have a relayer fee field because of the redemption restriction. - Always use this when the destination is a contract +For any message transfers where the destination is a contract, you should always used Contract Controlled Transfers. + +There are a few main differences between Contract Controlled Transfers and Basic Transfers: +- message contains both tokens and an arbitrary payload +- can only be redeemed by a specified contract address +- does not have a relayer fee field because of the redemption restriction above. + +As was the case with Basic Transfers, transferring native currency is a special case for Contract Controlled Transfers as well. As such, a different function call is provided as a QoL improvement when initiating and completing the transfer messaging when unwrapping the ETH is desired. + +The process of sending a Contract Controlled Transfer is very similar to that of a Basic Transfer: +1. Approve the Token Bridge to spend that token on our behalf. + - _Note: Tokens in EVM usually denote up to 18 decimals places. However. Wormhole normalizes this to **8** decimals._ +``` +contractAddress.approve(token_bridge_address, amt); +``` +2. Transfer the token to create the transfer VAA. + - This function call will return a `sequence` (uint64) that is used in the VAA retrieval step. + - _Note: Wormhole addresses are 32 bytes for standardization across the different blockchains within the Wormhole ecosystem._ +``` +// To initiate transfer of normal ERC-20s +token_bridge.transferTokesWithPayload(tokenAddress, amount, recipientChain, recipient, nonce, payload); + +// To initiate transfer of native currency +token_bridge.wrapAndTransferETHWithPayload(recipientChain, recipient, nonce, payload); +``` +3. Retrieve the emitted VAA. + - _Note: Basic Transfer VAAs are retrieved from the Guardian Network by the `emitterChainID`, `emitterAddress`, and `sequence`_ +``` +const emitterAddr = getEmitterAddressEth(network.tokenBridgeAddress); +const seq = parseSequenceFromLogEth(tx, network.bridgeAddress); +const vaaURL = `${config.wormhole.restAddress}/v1/signed_vaa/${network.wormholeChainId}/${emitterAddr}/${seq}`; +let vaaBytes = await (await fetch(vaaURL)).json(); +while (!vaaBytes.vaaBytes) { + console.log("VAA not found, retrying in 5s!"); + await new Promise((r) => setTimeout(r, 5000)); //Timeout to let Guardiand pick up log and have VAA ready + vaaBytes = await (await fetch(vaaURL)).json(); +} +``` + +4. Complete the transfer using the VAA. + - _Note: VAAs are retrieved from the +``` +// To complete transfer of normal ERC-20s +token_bridge.completeTransferWithPayload(VAA); + +// To complete transfer of native currency +completeTransferAndUnwrapETHWithPayload(VAA); +``` + ## Redemption ### Basic Token Redemption @@ -161,3 +149,5 @@ interface ITokenBridge is BridgeGetters { - completeTransferWithPayload for everything, - completeTransferAndUnwrapETH as a QoL function. Unwraps the ETH before giving it to the contract. + +LUMPED THIS INTO PREVIOUS SECTIONS From 5c28ddaa0355c2152fc4e74dd14272945250c894 Mon Sep 17 00:00:00 2001 From: Eric Wong Date: Fri, 16 Sep 2022 11:54:55 -0500 Subject: [PATCH 38/69] env: tooling --- src/technical/env/tooling.md | 34 ++++++++++++++++++++++++++-------- 1 file changed, 26 insertions(+), 8 deletions(-) diff --git a/src/technical/env/tooling.md b/src/technical/env/tooling.md index 1573f30..e5a0ef6 100644 --- a/src/technical/env/tooling.md +++ b/src/technical/env/tooling.md @@ -1,11 +1,29 @@ #Tooling -regardless of what env you use, there are some wormhole-specific tools you should know about. Most developers find it useful to clone the Wormhole core repository, as it has quite a few useful tools. +Regardless of the developer environment that you use, there are a few wormhole-specific tools you should know about. -worm CLI tool (link to code) - great cli tool for getting odds and ends done surround wormhole contracts, VAAs and more -orchestrator - WIP tool which is connected to the WLV environment. Can be useful for managing deployment of your xDapp contracts -reference bridge UI - a GUI which can be used to perform token transfers around the ecosystem -Wormhole Typescript SDK - typescript SDK designed to aid in interacting directly with the Wormhole contracts. -Explorer - mainnet link, and link to local code. Can be a good resource for looking at individual transfers -Wormhole Rust SDKs - useful when working in the various Rust environments, WIP, link to source -Spydk - useful for listening to the guardian network (link to source code and official release) +Below is a list of those tools with specific links but some developers also find it useful to clone the Wormhole core repository. + +### [Worm CLI tool](https://github.com/wormhole-foundation/wormhole/tree/dev.v2/clients/js) + +- Great CLI tool for getting odds and ends done surround wormhole contracts, VAAs and more. + +### Orchestrator + +- WIP tool which is connected to the WLV environment to help with managing deployment of your xDapp contracts. + +### [Wormhole SDK](https://github.com/wormhole-foundation/wormhole/tree/dev.v2/sdk) + +- Libraries in various languages to help with interacting with Wormhole contracts. + +### Wormhole Spy Service + +- Wormhole Spy listens to all of the activity on the Guardian Network. [Here](https://github.com/wormhole-foundation/wormhole/tree/dev.v2/relayer/spy_relayer) is a reference for running your own spy and [here](https://github.com/wormhole-foundation/wormhole/tree/dev.v2/spydk/js) is an SDK to interact with the spy. + +### [Reference Bridge UI](https://github.com/wormhole-foundation/example-token-bridge-ui) + +- An example GUI which can be used to perform token transfers around the ecosystem. + +### [Explorer](https://wormhole.com/explorer/) + +- Resource for looking at individual transfers statuses on mainnet and testnet. From 9384de036350275f00d1587999a3849ef5aff241 Mon Sep 17 00:00:00 2001 From: Eric Wong Date: Fri, 16 Sep 2022 12:31:41 -0500 Subject: [PATCH 39/69] technical: environments --- src/SUMMARY.md | 2 +- src/technical/env/environments.md | 36 +++++++++++++++++++++++++++++++ 2 files changed, 37 insertions(+), 1 deletion(-) diff --git a/src/SUMMARY.md b/src/SUMMARY.md index 8775927..dfb96a8 100644 --- a/src/SUMMARY.md +++ b/src/SUMMARY.md @@ -39,10 +39,10 @@ - [Environment Setup](./technical/env/environments.md) - - [Tooling](./technical/env/tooling.md) - [Tilt](./technical/env/tilt.md) - [Wormhole Local Validator](./technical/env/wlv.md) - [Testnet](./technical/env/testnet.md) + - [Tooling](./technical/env/tooling.md) - [Contract Development]() diff --git a/src/technical/env/environments.md b/src/technical/env/environments.md index 6d36fb7..749c33c 100644 --- a/src/technical/env/environments.md +++ b/src/technical/env/environments.md @@ -1 +1,37 @@ # Choosing an Environment + +Sending a cross-chain message through Wormhole involves initiating a message on chain A, the Wormhole contract on chain A, the Guardian network, receiving a message on chain B, and the Wormhole contract on chain B. + +### Devnet + +Wormhole provides two different local development environments to simulate these different elements. Below are those two options and the high level pros and cons of each. + +1. [Wormhole Local Validator](./wlv.md) + - Pros + - Lightweight, low system resource demand + - Good iteration times + - Can be added into an existing blockchain development setup + + - Cons + - You may end up reinventing the tilt/testnet environment as you add more components + +2. [Tilt](./tilt.md) + - Pros + - Out of the box support for the many components needed to develop across the heterogenous blockchain space + - Consistent development environment, where contracts deploy deterministically & everything is already linked up + - Ability to easily turn containers on and off as needed + + - Cons + - Relatively high system requirements. Specifically is RAM intensive + - Iteration requires docker container rebuilds, which can be slow + - Most blockchains are 'fresh', and thus may require you to deploy your own contract dependencies. + +### Testnet + +To test your application on the various testnets, there are Wormhole contracts and one Guardian node deployed. You can find the contracts [here](../../reference/contracts.md) and the rpc node [here](../../reference/rpcnodes.md). + +Note that because there is only one Guardian node deployed for testnet, there is a small chance that your VAA will not be processed. This rate is _not_ indicative of performance on mainnet where there are 19 Guardian nodes watching for transactions. + +### Mainnet + +To deploy to mainnet, you can find the contracts [here](../../reference/contracts.md) and the rpc node [here](../../reference/rpcnodes.md). \ No newline at end of file From e11957b64d5e737a07c382403e86c7e879f8bc74 Mon Sep 17 00:00:00 2001 From: chase-45 Date: Fri, 16 Sep 2022 13:43:06 -0400 Subject: [PATCH 40/69] tilt additions --- src/technical/env/tilt.md | 36 +++++++++++++++++++++++++----------- src/technical/env/tooling.md | 16 ++++++++++++++-- 2 files changed, 39 insertions(+), 13 deletions(-) diff --git a/src/technical/env/tilt.md b/src/technical/env/tilt.md index 073f8d5..db1fc1d 100644 --- a/src/technical/env/tilt.md +++ b/src/technical/env/tilt.md @@ -1,22 +1,36 @@ # Tilt -- tilt is a unique environment specifically set up to deal with the challenges of cross-chain development -- used by the Wormhole core repository -- Uses tilt to configure and manage a kubernetes environment. -- has docker containers for every ecosystem supported by wormhole, along with containers for things like the guardian, spy, generic relayers, etc -- Big bad development ecosystem with all the tools, used by core contributors +### What is Tilt? + +[Tilt](https://tilt.dev/) is part of the Docker ecosystem. It allows developers to easily configure a Kubernetes environment for development. + +In the context of Wormhole, the 'Tilt' environment is the development environment used by the [Wormhole Core Repository](https://github.com/wormhole-foundation/wormhole). It utilizes Tilt to set up a development environment with all the tools necessary to build across multiple blockchains. It has docker images for all the common items encountered during cross-chain developing, including: + +- All the supported blockchains / ecosystems of Wormhole +- A Guardian Node +- Relayers +- Databases, Redis +- Utility frontends + +The Tilt environment is meant to be an entire cross-chain ecosystem right out of the box. + +## Is Tilt Right for You? + +Tilt is a generally a good starting point for most developers. Here's a succinct list of the pros and cons of the environment, so you can decide if it's the right fit for you. Pros -- Out of the box support for the many components needed to develop across the heterogenous blockchain space -- Consistent development environment, where contracts deploy deterministically & everything is already linked up -- Ability to easily turn containers on and off as needed +- Out-of-the-box support for the many components needed to develop across the heterogenous blockchain space. +- Consistent development environment, where contracts deploy deterministically & everything is already linked up. +- Ability to easily enable/disable contracts as needed. Cons -- Relatively high system requirements. Specifically is RAM intensive -- Iteration requires docker container rebuilds, which can be slow -- Most blockchains are 'fresh', and thus may require you to deploy your own contract dependencies. +- Relatively high system requirements. This can be mitigated by disabling components. +- Most blockchains are 'fresh' and have no contracts by default. Thus, you may have to deploy your own dependencies, or alter the default tilt configuration. +- Spin-up and rebuild times can be slow. This can result in a slow workflow if you rely on docker rebuilds. + +## Setting up Tilt show basic setup for each ecosystem, list installed dependencies explain the tiltfile, show how to enable/disable components, give command for starting with just two evm chains diff --git a/src/technical/env/tooling.md b/src/technical/env/tooling.md index e5a0ef6..bbe1905 100644 --- a/src/technical/env/tooling.md +++ b/src/technical/env/tooling.md @@ -1,6 +1,6 @@ #Tooling -Regardless of the developer environment that you use, there are a few wormhole-specific tools you should know about. +Regardless of the developer environment that you use, there are a few wormhole-specific tools you should know about. Below is a list of those tools with specific links but some developers also find it useful to clone the Wormhole core repository. @@ -14,7 +14,7 @@ Below is a list of those tools with specific links but some developers also find ### [Wormhole SDK](https://github.com/wormhole-foundation/wormhole/tree/dev.v2/sdk) -- Libraries in various languages to help with interacting with Wormhole contracts. +- Libraries in various languages to help with interacting with Wormhole contracts. ### Wormhole Spy Service @@ -27,3 +27,15 @@ Below is a list of those tools with specific links but some developers also find ### [Explorer](https://wormhole.com/explorer/) - Resource for looking at individual transfers statuses on mainnet and testnet. + +regardless of what env you use, there are some wormhole-specific tools you should know about. Most developers find it useful to clone the Wormhole core repository, as it has quite a few useful tools. + +worm CLI tool (link to code) - great cli tool for getting odds and ends done surround wormhole contracts, VAAs and more +orchestrator - WIP tool which is connected to the WLV environment. Can be useful for managing deployment of your xDapp contracts +reference bridge UI - a GUI which can be used to perform token transfers around the ecosystem +Wormhole Typescript SDK - typescript SDK designed to aid in interacting directly with the Wormhole contracts. +Explorer - mainnet link, and link to local code. Can be a good resource for looking at individual transfers +Wormhole Rust SDKs - useful when working in the various Rust environments, WIP, link to source +Spydk - useful for listening to the guardian network (link to source code and official release) + +Link to as many example projects as possible here as well, ICCO, xDapp book examples From 4728114a97fbc347e2b468e5223313a64e8e936d Mon Sep 17 00:00:00 2001 From: Eric Wong Date: Fri, 16 Sep 2022 13:43:09 -0500 Subject: [PATCH 41/69] env: wlv --- src/technical/env/environments.md | 6 ++- src/technical/env/tooling.md | 12 +----- src/technical/env/wlv.md | 68 +++++++++++++++++++++++++++---- 3 files changed, 67 insertions(+), 19 deletions(-) diff --git a/src/technical/env/environments.md b/src/technical/env/environments.md index 749c33c..3d7d78b 100644 --- a/src/technical/env/environments.md +++ b/src/technical/env/environments.md @@ -30,7 +30,11 @@ Wormhole provides two different local development environments to simulate these To test your application on the various testnets, there are Wormhole contracts and one Guardian node deployed. You can find the contracts [here](../../reference/contracts.md) and the rpc node [here](../../reference/rpcnodes.md). -Note that because there is only one Guardian node deployed for testnet, there is a small chance that your VAA will not be processed. This rate is _not_ indicative of performance on mainnet where there are 19 Guardian nodes watching for transactions. +There are two main obstacles with testing in testnet: +- Many testnet blockchains are somewhat unstable and unreliable +- Getting testnet tokens is a nuisance + +**Note:** There is only one Guardian node deployed for testnet, there is a small chance that your VAA will not be processed. This rate is _not_ indicative of performance on mainnet where there are 19 Guardian nodes watching for transactions. ### Mainnet diff --git a/src/technical/env/tooling.md b/src/technical/env/tooling.md index bbe1905..b51ae42 100644 --- a/src/technical/env/tooling.md +++ b/src/technical/env/tooling.md @@ -1,4 +1,4 @@ -#Tooling +# Tooling Regardless of the developer environment that you use, there are a few wormhole-specific tools you should know about. @@ -28,14 +28,4 @@ Below is a list of those tools with specific links but some developers also find - Resource for looking at individual transfers statuses on mainnet and testnet. -regardless of what env you use, there are some wormhole-specific tools you should know about. Most developers find it useful to clone the Wormhole core repository, as it has quite a few useful tools. - -worm CLI tool (link to code) - great cli tool for getting odds and ends done surround wormhole contracts, VAAs and more -orchestrator - WIP tool which is connected to the WLV environment. Can be useful for managing deployment of your xDapp contracts -reference bridge UI - a GUI which can be used to perform token transfers around the ecosystem -Wormhole Typescript SDK - typescript SDK designed to aid in interacting directly with the Wormhole contracts. -Explorer - mainnet link, and link to local code. Can be a good resource for looking at individual transfers -Wormhole Rust SDKs - useful when working in the various Rust environments, WIP, link to source -Spydk - useful for listening to the guardian network (link to source code and official release) - Link to as many example projects as possible here as well, ICCO, xDapp book examples diff --git a/src/technical/env/wlv.md b/src/technical/env/wlv.md index 0af2bd9..200ea82 100644 --- a/src/technical/env/wlv.md +++ b/src/technical/env/wlv.md @@ -1,15 +1,69 @@ -# Wormhole Local Validator +# Wormhole Local Validator - wormhole local validator is a development build of the guardian software - easy to run, easy to configure. Connect it to whatever blockchain you feel like using, and use some provided scripts to deploy the necessary wormhole contracts - Newer, still has features being added -Pros: +## What is Wormhole Local Validator (WLV)? -- Lightweight, low system resource demand -- Good iteration times -- Can be added into an existing blockchain development setup +[Wormhole Local Validator](https://github.com/wormhole-foundation/xdapp-book/tree/main/projects/wormhole-local-validator) is a development build of the Guardian software and designed to be the simplest custom environment - there is a single Guardian running on docker and otherwise a BYOB (Bring Your Own Blockchain) setup. -Cons: +## Is WLV Right for You? -- You may end up reinventing the tilt/testnet environment as you add more components +Here's a succinct list of the pros and cons of the environment, so you can decide if it's the right fit for you. + +- Pros + - Lightweight, low system resource demand + - Good iteration times + - Can be added into an existing blockchain development setup + +- Cons + - You may end up reinventing the tilt/testnet environment as you add more components + +## Setting up Wormhole Local Validator + +You will **need** Docker running in order to set up WLV. If you're developing on your computer, you should get [Docker Desktop](https://docs.docker.com/get-docker/); if you're in a headless VM, you should install [Docker Engine](https://docs.docker.com/engine/). + +To simulate the blockchains that are of interest, you are required to install the software for the validator nodes locally on your comupter or somewhere else to run them. Code to spin up EVM and Solana local validators, as well as scripts to deploy the necessary Wormhole contracts to these local instances, are provided in the repo. + +--- + +Below are instructions to set up a local EVM and Solana environment: + +**EVM Chains** + +`npm run evm` will set up: +- (2) EVM chains + - Wormhole Chain ID 2 (like ETH) + - Wormhole Chain ID 4 (like BSC) +- (3) Wormhole contracts + - Core Bridge at `0xC89Ce4735882C9F0f0FE26686c53074E09B0D550` + - Token Bridge at `0x0290FB167208Af455bB137780163b7B7a9a10C16` + - NFT Bridge at `0x26b4afb60d6c903165150c6f0aa14f8016be4aec` +- (3) utility contracts + - Test Token (TKN) at `0x2D8BE6BF0baA74e0A907016679CaE9190e80dD0A` + - test NFT at `0x5b9b42d6e4B2e4Bf8d42Eba32D46918e10899B66` + - WETH Contract at `0xDDb64fE46a91D46ee29420539FC25FD07c5FEa3E` + +These contracts will use the standard Wormhole test mnemoic (`myth like bonus scare over problem client lizard pioneer submit female collect`) and use the first key for deployment and payment (Public Key: `0x90F8bf6A479f320ead074411a4B0e7944Ea8c9C1`, Private Key: `0x4f3edf983ac636a65a842ce7c78d9aa706d3b113bce9c46f30d7d21715b23b1d`) + +**Solana Chains** + +`npm run solana` will set up: +- (1) Solana chain +- (2) Wormhole contracts + - Core bridge at `Bridge1p5gheXUvJ6jGWGeCsgPKgnE3YgdGKRVCMY9o` + - Token bridge at `B6RHG3mfcckmrYN1UhmJzyS1XX3fZKbkeUcpJe9Sy3FE` + +--- + +Once you have the dependencies for each blockchain installed and have the chains running, you can run Wormhole. + +`npm run wormhole` will pull and run the Wormhole Guardian docker image. + +The initial setup for Wormhole Local Validator can take upwards of 500 seconds but after the image is built, bringing it up and down usually takes less than 60 seconds. + +## FAQ & Common Questions + +- Q: Anvil isn't working + - While we recommend Foundry's Forge tool for compiling and deploying code elsewhere in these docs, we do not at this time recommend using anvil for guardiand; this is because guardiand is spec'd against go-ethereum, and anvil is out of spec for how it reports block headers (non left padding to normalize length), which means go-ethereum reacts abnormally and can't read anvil headers. \ No newline at end of file From 6a521a4709d6f4b41f1d7f4fd3453910d1286ba1 Mon Sep 17 00:00:00 2001 From: chase-45 Date: Fri, 16 Sep 2022 22:21:22 -0400 Subject: [PATCH 42/69] tilt additions --- src/technical/env/tilt.md | 43 +++++++++++++++++++++++++++++++++------ 1 file changed, 37 insertions(+), 6 deletions(-) diff --git a/src/technical/env/tilt.md b/src/technical/env/tilt.md index db1fc1d..30fca99 100644 --- a/src/technical/env/tilt.md +++ b/src/technical/env/tilt.md @@ -14,23 +14,54 @@ In the context of Wormhole, the 'Tilt' environment is the development environmen The Tilt environment is meant to be an entire cross-chain ecosystem right out of the box. -## Is Tilt Right for You? +### Is Tilt Right for You? Tilt is a generally a good starting point for most developers. Here's a succinct list of the pros and cons of the environment, so you can decide if it's the right fit for you. -Pros +### Pros - Out-of-the-box support for the many components needed to develop across the heterogenous blockchain space. - Consistent development environment, where contracts deploy deterministically & everything is already linked up. - Ability to easily enable/disable contracts as needed. -Cons +### Cons - Relatively high system requirements. This can be mitigated by disabling components. - Most blockchains are 'fresh' and have no contracts by default. Thus, you may have to deploy your own dependencies, or alter the default tilt configuration. - Spin-up and rebuild times can be slow. This can result in a slow workflow if you rely on docker rebuilds. -## Setting up Tilt +# Setting up Tilt -show basic setup for each ecosystem, list installed dependencies -explain the tiltfile, show how to enable/disable components, give command for starting with just two evm chains +The Tilt environment functions best in a UNIX-style environment. For Windows users, using a WSL environment is recommended. + +In order to run the Tilt environment, you'll first need to make sure you have [Tilt](https://docs.tilt.dev/install.html) and [Go](https://go.dev/doc/install) installed. + +Once you've installed these two dependencies, just clone the Wormhole Core Repository and start Tilt. + +``` +git clone --branch dev.v2 https://github.com/wormhole-foundation/wormhole.git + +cd wormhole + +tilt up +``` + +Be sure to check out the **Tiltfile**, which has much of the configuration and arguments for the development environment. It's relatively straightforward to enable and disable components. For example, you can disable blockchains by setting them to false at startup + +``` +tilt up -- --algorand=false --near=false --solana=false terra_classic=false terra2=false +``` + +# Using Tilt + +Tilt can pretty much be treated as though it's an external environment that you can easily spin up and tear down. + +If you've followed the standard setup, all your resources will be bound to various ports on localhost. To see all the endpoints which are being hosted in your Tilt environment, you should check the Tilt dashboard, located at http://localhost:10350/overview. + +Tilt is actually referred to as 'Devnet' in the Wormhole ecosystem, so anywhere you see information labeled as 'Devnet', you can apply it to Tilt. + +For example, you can find all the deployed contract addresses in the 'Devnet' [constants](https://github.com/wormhole-foundation/wormhole/blob/dev.v2/sdk/js/src/utils/consts.ts) of the Wormhole Typescript SDK. + +Useful information pertaining to funded wallets & useful private keys can also be found in the [devnet.md](https://github.com/wormhole-foundation/wormhole/blob/dev.v2/docs/devnet.md) file of the docs. + +From here, Tilt is quite similar to using Testnet, and you should look at the [Tooling](./tooling.md) page for additional resources. From 52fde8dee3226650c1e2d3176cac75526fd86983 Mon Sep 17 00:00:00 2001 From: chase-45 Date: Mon, 19 Sep 2022 11:29:26 -0400 Subject: [PATCH 43/69] tilt & testnet additions --- src/SUMMARY.md | 1 + src/technical/env/environments.md | 47 +++++++---- src/technical/env/testnet.md | 18 +++- src/technical/env/tilt.md | 13 +-- src/technical/env/troubleshooting.md | 120 +++++++++++++++++++++++++++ 5 files changed, 174 insertions(+), 25 deletions(-) create mode 100644 src/technical/env/troubleshooting.md diff --git a/src/SUMMARY.md b/src/SUMMARY.md index dfb96a8..19c925b 100644 --- a/src/SUMMARY.md +++ b/src/SUMMARY.md @@ -40,6 +40,7 @@ - [Environment Setup](./technical/env/environments.md) - [Tilt](./technical/env/tilt.md) + - [Troubleshooting](./technical/env/troubleshooting.md) - [Wormhole Local Validator](./technical/env/wlv.md) - [Testnet](./technical/env/testnet.md) - [Tooling](./technical/env/tooling.md) diff --git a/src/technical/env/environments.md b/src/technical/env/environments.md index 3d7d78b..f461b73 100644 --- a/src/technical/env/environments.md +++ b/src/technical/env/environments.md @@ -7,30 +7,35 @@ Sending a cross-chain message through Wormhole involves initiating a message on Wormhole provides two different local development environments to simulate these different elements. Below are those two options and the high level pros and cons of each. 1. [Wormhole Local Validator](./wlv.md) - - Pros - - Lightweight, low system resource demand - - Good iteration times - - Can be added into an existing blockchain development setup - - Cons - - You may end up reinventing the tilt/testnet environment as you add more components + - Pros + + - Lightweight, low system resource demand + - Good iteration times + - Can be added into an existing blockchain development setup + + - Cons + - You may end up reinventing the tilt/testnet environment as you add more components 2. [Tilt](./tilt.md) - - Pros - - Out of the box support for the many components needed to develop across the heterogenous blockchain space - - Consistent development environment, where contracts deploy deterministically & everything is already linked up - - Ability to easily turn containers on and off as needed - - Cons - - Relatively high system requirements. Specifically is RAM intensive - - Iteration requires docker container rebuilds, which can be slow - - Most blockchains are 'fresh', and thus may require you to deploy your own contract dependencies. + - Pros + + - Out of the box support for the many components needed to develop across the heterogenous blockchain space + - Consistent development environment, where contracts deploy deterministically & everything is already linked up + - Ability to easily turn containers on and off as needed + + - Cons + - Relatively high system requirements. Specifically is RAM intensive + - Iteration requires docker container rebuilds, which can be slow + - Most blockchains are 'fresh', and thus may require you to deploy your own contract dependencies. ### Testnet To test your application on the various testnets, there are Wormhole contracts and one Guardian node deployed. You can find the contracts [here](../../reference/contracts.md) and the rpc node [here](../../reference/rpcnodes.md). There are two main obstacles with testing in testnet: + - Many testnet blockchains are somewhat unstable and unreliable - Getting testnet tokens is a nuisance @@ -38,4 +43,16 @@ There are two main obstacles with testing in testnet: ### Mainnet -To deploy to mainnet, you can find the contracts [here](../../reference/contracts.md) and the rpc node [here](../../reference/rpcnodes.md). \ No newline at end of file +To deploy to mainnet, you can find the contracts [here](../../reference/contracts.md) and the rpc node [here](../../reference/rpcnodes.md). + +--- + +Express what a normal development stack looks like in Wormhole + +- Minimum components +- additional components +- contract dependency hell + +## Basics + +Cross-chain development environments are inherently more complex than diff --git a/src/technical/env/testnet.md b/src/technical/env/testnet.md index ee6ee4c..1fbddbc 100644 --- a/src/technical/env/testnet.md +++ b/src/technical/env/testnet.md @@ -1,12 +1,22 @@ # Testnet -Wormhole testnet functions much like mainnet, is spread across many of the most popular testnet platforms +Wormhole testnet is spread across many of the most popular testnet blockchains. -- check reference section for testnet contracts +The primary reason to use Wormhole testnet is in order to simplify the management of your dependent contracts. This will vary from blockchain to blockchain. + +For example, some blockchain ecosystems have the standard that their contracts are closed-source, and there are no tools to fork mainnet. Other ecosystems, such as EVM, have tools like [foundry](https://github.com/foundry-rs/foundry), which allow you to hardfork the mainnet ecosystem into a local development node. + +In short, testnet tends to be the correct choice only when you have contract dependencies, and those dependencies are difficult to get working in a local environment. In most other cases, testnet tends to be more work than it's worth. + +If you elect to use testnet, the Wormhole contracts addresses can be found in the [Reference](../../reference/contracts.md) section. Pros: +- Many other projects deploy their contracts to testnet. +- In ecosystems without extensive local tooling, this may be the preferred development environment. + Cons: -- Many testnet blockchains are somewhat unstable and unreliable -- Getting testnet tokens is a nuisance +- Many testnets are somewhat unstable and have outages or partitioning events. +- Wormhole Testnet sometimes misses VAAs due to testnet instabilities. +- Testnet tokens are often difficult to acquire. diff --git a/src/technical/env/tilt.md b/src/technical/env/tilt.md index 30fca99..4987dc0 100644 --- a/src/technical/env/tilt.md +++ b/src/technical/env/tilt.md @@ -2,9 +2,9 @@ ### What is Tilt? -[Tilt](https://tilt.dev/) is part of the Docker ecosystem. It allows developers to easily configure a Kubernetes environment for development. +[Tilt](https://tilt.dev/) is part of the official Docker ecosystem. It's a tool which allows developers to easily configure a Kubernetes environment for development. -In the context of Wormhole, the 'Tilt' environment is the development environment used by the [Wormhole Core Repository](https://github.com/wormhole-foundation/wormhole). It utilizes Tilt to set up a development environment with all the tools necessary to build across multiple blockchains. It has docker images for all the common items encountered during cross-chain developing, including: +In the context of Wormhole, the 'Tilt' environment is the development environment used by the [Wormhole Core Repository](https://github.com/wormhole-foundation/wormhole). It utilizes Tilt to deploy an environment with all the tools necessary to build across multiple blockchains. It has docker images for all the common items encountered during cross-chain developing, including: - All the supported blockchains / ecosystems of Wormhole - A Guardian Node @@ -12,7 +12,7 @@ In the context of Wormhole, the 'Tilt' environment is the development environmen - Databases, Redis - Utility frontends -The Tilt environment is meant to be an entire cross-chain ecosystem right out of the box. +The Tilt environment is meant to be an entire cross-chain development stack right out of the box. ### Is Tilt Right for You? @@ -21,8 +21,9 @@ Tilt is a generally a good starting point for most developers. Here's a succinct ### Pros - Out-of-the-box support for the many components needed to develop across the heterogenous blockchain space. -- Consistent development environment, where contracts deploy deterministically & everything is already linked up. -- Ability to easily enable/disable contracts as needed. +- Consistent development environment, where contracts deploy deterministically and everything is already linked up. +- Ability to easily enable/disable components as needed. +- Regularly updated as new components join the Wormhole ecosystem. ### Cons @@ -56,7 +57,7 @@ tilt up -- --algorand=false --near=false --solana=false terra_classic=false terr Tilt can pretty much be treated as though it's an external environment that you can easily spin up and tear down. -If you've followed the standard setup, all your resources will be bound to various ports on localhost. To see all the endpoints which are being hosted in your Tilt environment, you should check the Tilt dashboard, located at http://localhost:10350/overview. +If you've followed the standard setup, all your resources will be bound to various ports on localhost. To see all the endpoints which are being hosted in your Tilt environment, you should check the Tilt dashboard, located at [http://localhost:10350/overview](http://localhost:10350/overview). Tilt is actually referred to as 'Devnet' in the Wormhole ecosystem, so anywhere you see information labeled as 'Devnet', you can apply it to Tilt. diff --git a/src/technical/env/troubleshooting.md b/src/technical/env/troubleshooting.md new file mode 100644 index 0000000..248ff28 --- /dev/null +++ b/src/technical/env/troubleshooting.md @@ -0,0 +1,120 @@ +# Troubleshooting + +Tilt, Kubernetes, and Docker may be new tools for developers entering the Wormhole ecosystem. This section is meant to provide some additional support when setting up the Wormhole Tilt environment. + +## macOS Install + +## Prerequisites + +Having `homebrew` on your system makes the installation really straightforward. You can grab it with: + +```sh +/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)" +``` + +From there, all the other installs are one-liners. + +## Install Go + +```sh +brew install go +``` + +## Install Docker + +```sh +brew install docker +``` + +After installation, go into Docker settings and switch ON `kubernetes`. Also configure Docker to have 4 CPUs and ~16GB of RAM. + +## Install Tilt + +```sh +brew install tilt +``` + +## Clone Wormhole Repo and Start Tilt + +```sh +git clone --branch dev.v2 https://github.com/certusone/wormhole.git +``` + +```sh +cd wormhole/ +tilt up +``` + +You'll be able to access the Tilt UI at +`localhost:10350` + +## Linux & WSL Install + +### Setup Script + +If you're using a Debian distro, you should run the [dev-setup.sh](https://github.com/wormhole-foundation/wormhole/blob/dev.v2/scripts/dev-setup.sh) script. Even if you're not using Debian, this script still contains the main steps for setup. + +## Regular Setup + +### 1. Install Go + +```sh +wget https://go.dev/dl/go1.18.1.linux-amd64.tar.gz +rm -rf /usr/local/go && tar -C /usr/local -xzf go1.18.1.linux-amd64.tar.gz +``` + +### 2. Install Docker + +If you're using Linux with a window manager, consider getting Docker Desktop instead of the following command. It comes with Kubernetes built in and you won't need to download `minikube`. It's recommended to have at least 4 CPUs and 16GB RAM dedicated to Docker. + +Also, make absolutely sure that you set up Docker as a non-root user. + +[https://docs.docker.com/engine/install/ubuntu/#installation-methods](https://docs.docker.com/engine/install/ubuntu/#installation-methods) + +### 3. (Docker Desktop Install) + +Enable Kubernetes by going into Settings > Kubernetes + +### 3. (Non Docker Desktop) + +Install [`minikube`](https://minikube.sigs.k8s.io/docs/start/). + +Configure minikube: + +``` +minikube start --driver=docker --kubernetes-version=v1.23.3 --cpus=4 --memory=14G --disk-size=10G --namespace=wormhole +``` + +Minikube needs to be running for tilt to work, so always make sure to run `minikube start` before you bring up tilt. + +### 4. Install Tilt + +Install Tilt by copy pasting this into the Terminal: + +```sh +curl -fsSL https://raw.githubusercontent.com/tilt-dev/tilt/master/scripts/install.sh | bash +``` + +### 5. Clone the Wormhole Repo and start Tilt + +```sh +git clone --branch dev.v2 https://github.com/wormhole-foundation/wormhole.git +``` + +If you're running Tilt on your machine: + +```sh +cd wormhole/ +tilt up +``` + +If you're running Tilt in a VM, you'll need to pass in some extra flags to enable Tilt to listen to incoming traffic from external addresses: + +```sh +cd wormhole +tilt up --host=0.0.0.0 -- --webHost=0.0.0.0 +``` + +You can now access the Tilt UI at either `localhost:10350` or `vm_external_ip:10350`. + +If the VM's external IP doesn't work, check firewall and port settings to make sure your VM allows incoming traffic. From caa844bec82ada9d05d860ed1a92e1e45a59e3cf Mon Sep 17 00:00:00 2001 From: chase-45 Date: Mon, 19 Sep 2022 12:23:47 -0400 Subject: [PATCH 44/69] environment additions --- src/technical/env/environments.md | 16 +++++++- src/technical/env/wlv.md | 63 +++++++------------------------ 2 files changed, 27 insertions(+), 52 deletions(-) diff --git a/src/technical/env/environments.md b/src/technical/env/environments.md index f461b73..0ffee93 100644 --- a/src/technical/env/environments.md +++ b/src/technical/env/environments.md @@ -53,6 +53,18 @@ Express what a normal development stack looks like in Wormhole - additional components - contract dependency hell -## Basics +# Environment Setup -Cross-chain development environments are inherently more complex than +The bare minimum Wormhole environment is just a blockchain linked up to a Guardian node. There are quite a few ways of accomplishing this, and if you're just looking to get your feet wet, you should try whichever sounds easiest. + +However, as you get deeper into cross-chain development you'll likely find you have a growing number of components, dependencies, and teammates in the picture making your development environment more complex. Here are some of the considerations you should have in mind when choosing a development environment, to make sure it will continue to work for you in the future. + +### What components do I need now? What components will I need in the future? + +- You may be able to get a lot done with just an EVM chain and a Guardian. However, as your application gets more sophisticated, components like relayers, frontends, automated tests, databases, explorers, and other blockchains are likely to get added in to the environment. + +### What are my dependencies? + +- If your smart contracts have no dependencies, it may be possible for you to develop in a vacuum. However, if you're working on a fledgling blockchain and trying to integrate with other applications being developed on that chain, you may have no choice but to work in testnet alongside other development teams. + +- Just because you have dependencies doesn't mean you automatically have to develop in testnet or mainnet. Often times it's relatively trivial to redeploy your dependencies in Tilt, or to use something like [Foundry](https://github.com/foundry-rs/foundry) to create a development version of an existing testnet or mainnet. diff --git a/src/technical/env/wlv.md b/src/technical/env/wlv.md index 200ea82..d40eaad 100644 --- a/src/technical/env/wlv.md +++ b/src/technical/env/wlv.md @@ -1,69 +1,32 @@ -# Wormhole Local Validator - -- wormhole local validator is a development build of the guardian software -- easy to run, easy to configure. Connect it to whatever blockchain you feel like using, and use some provided scripts to deploy the necessary wormhole contracts -- Newer, still has features being added +# Wormhole Local Validator ## What is Wormhole Local Validator (WLV)? -[Wormhole Local Validator](https://github.com/wormhole-foundation/xdapp-book/tree/main/projects/wormhole-local-validator) is a development build of the Guardian software and designed to be the simplest custom environment - there is a single Guardian running on docker and otherwise a BYOB (Bring Your Own Blockchain) setup. +[Wormhole Local Validator](https://github.com/wormhole-foundation/xdapp-book/tree/main/projects/wormhole-local-validator) is meant to be the simplest custom environment. It consists only of a dockerized Guardian image, and some utility tooling to aid with contract management. This allows you to set it up with any blockchain you'd like. ## Is WLV Right for You? Here's a succinct list of the pros and cons of the environment, so you can decide if it's the right fit for you. - Pros - - Lightweight, low system resource demand - - Good iteration times - - Can be added into an existing blockchain development setup + + - Lightweight, low system resource demand. + - Fast iteration times. + - Can be added into an existing blockchain development setup. - Cons - - You may end up reinventing the tilt/testnet environment as you add more components + - You may end up reinventing the tilt/testnet environment as you add more components. ## Setting up Wormhole Local Validator -You will **need** Docker running in order to set up WLV. If you're developing on your computer, you should get [Docker Desktop](https://docs.docker.com/get-docker/); if you're in a headless VM, you should install [Docker Engine](https://docs.docker.com/engine/). +You will need Docker running in order to set up WLV. If you're on desktop, [Docker Desktop](https://docs.docker.com/get-docker/) is generally the best choice, though [Docker Engine](https://docs.docker.com/engine/) works fine too. -To simulate the blockchains that are of interest, you are required to install the software for the validator nodes locally on your comupter or somewhere else to run them. Code to spin up EVM and Solana local validators, as well as scripts to deploy the necessary Wormhole contracts to these local instances, are provided in the repo. +From there, you just need nodes for the blockchains you're interested in developing on. There is code to spin up EVM and Solana local validators included in the WLV project repo, as well as scripts to deploy the necessary Wormhole contracts to your local instances. ---- +Further information can be found in the project's [README](https://github.com/wormhole-foundation/xdapp-book/blob/main/projects/wormhole-local-validator/README.md). -Below are instructions to set up a local EVM and Solana environment: +## Troubleshooting -**EVM Chains** +Q: Anvil isn't working -`npm run evm` will set up: -- (2) EVM chains - - Wormhole Chain ID 2 (like ETH) - - Wormhole Chain ID 4 (like BSC) -- (3) Wormhole contracts - - Core Bridge at `0xC89Ce4735882C9F0f0FE26686c53074E09B0D550` - - Token Bridge at `0x0290FB167208Af455bB137780163b7B7a9a10C16` - - NFT Bridge at `0x26b4afb60d6c903165150c6f0aa14f8016be4aec` -- (3) utility contracts - - Test Token (TKN) at `0x2D8BE6BF0baA74e0A907016679CaE9190e80dD0A` - - test NFT at `0x5b9b42d6e4B2e4Bf8d42Eba32D46918e10899B66` - - WETH Contract at `0xDDb64fE46a91D46ee29420539FC25FD07c5FEa3E` - -These contracts will use the standard Wormhole test mnemoic (`myth like bonus scare over problem client lizard pioneer submit female collect`) and use the first key for deployment and payment (Public Key: `0x90F8bf6A479f320ead074411a4B0e7944Ea8c9C1`, Private Key: `0x4f3edf983ac636a65a842ce7c78d9aa706d3b113bce9c46f30d7d21715b23b1d`) - -**Solana Chains** - -`npm run solana` will set up: -- (1) Solana chain -- (2) Wormhole contracts - - Core bridge at `Bridge1p5gheXUvJ6jGWGeCsgPKgnE3YgdGKRVCMY9o` - - Token bridge at `B6RHG3mfcckmrYN1UhmJzyS1XX3fZKbkeUcpJe9Sy3FE` - ---- - -Once you have the dependencies for each blockchain installed and have the chains running, you can run Wormhole. - -`npm run wormhole` will pull and run the Wormhole Guardian docker image. - -The initial setup for Wormhole Local Validator can take upwards of 500 seconds but after the image is built, bringing it up and down usually takes less than 60 seconds. - -## FAQ & Common Questions - -- Q: Anvil isn't working - - While we recommend Foundry's Forge tool for compiling and deploying code elsewhere in these docs, we do not at this time recommend using anvil for guardiand; this is because guardiand is spec'd against go-ethereum, and anvil is out of spec for how it reports block headers (non left padding to normalize length), which means go-ethereum reacts abnormally and can't read anvil headers. \ No newline at end of file +- While Foundry's 'forge' tool is the generally recommended tool for EVM contract compilation, anvil isn't currently compatible with guardiand. Anvil reports block headers in a way which is non-compliant with go-ethereum, which means the guardian node can't correctly read anvil headers. From 5e5e40cb311c1865e67162592cad6c3168e21dd0 Mon Sep 17 00:00:00 2001 From: chase-45 Date: Mon, 19 Sep 2022 12:42:45 -0400 Subject: [PATCH 45/69] line edits --- src/SUMMARY.md | 2 +- src/technical/env/environments.md | 63 +++---------------------------- src/technical/env/tilt.md | 20 ++++++---- 3 files changed, 20 insertions(+), 65 deletions(-) diff --git a/src/SUMMARY.md b/src/SUMMARY.md index 19c925b..ea263bf 100644 --- a/src/SUMMARY.md +++ b/src/SUMMARY.md @@ -39,7 +39,7 @@ - [Environment Setup](./technical/env/environments.md) - - [Tilt](./technical/env/tilt.md) + - [Tilt (Devnet)](./technical/env/tilt.md) - [Troubleshooting](./technical/env/troubleshooting.md) - [Wormhole Local Validator](./technical/env/wlv.md) - [Testnet](./technical/env/testnet.md) diff --git a/src/technical/env/environments.md b/src/technical/env/environments.md index 0ffee93..192d46b 100644 --- a/src/technical/env/environments.md +++ b/src/technical/env/environments.md @@ -1,63 +1,8 @@ -# Choosing an Environment - -Sending a cross-chain message through Wormhole involves initiating a message on chain A, the Wormhole contract on chain A, the Guardian network, receiving a message on chain B, and the Wormhole contract on chain B. - -### Devnet - -Wormhole provides two different local development environments to simulate these different elements. Below are those two options and the high level pros and cons of each. - -1. [Wormhole Local Validator](./wlv.md) - - - Pros - - - Lightweight, low system resource demand - - Good iteration times - - Can be added into an existing blockchain development setup - - - Cons - - You may end up reinventing the tilt/testnet environment as you add more components - -2. [Tilt](./tilt.md) - - - Pros - - - Out of the box support for the many components needed to develop across the heterogenous blockchain space - - Consistent development environment, where contracts deploy deterministically & everything is already linked up - - Ability to easily turn containers on and off as needed - - - Cons - - Relatively high system requirements. Specifically is RAM intensive - - Iteration requires docker container rebuilds, which can be slow - - Most blockchains are 'fresh', and thus may require you to deploy your own contract dependencies. - -### Testnet - -To test your application on the various testnets, there are Wormhole contracts and one Guardian node deployed. You can find the contracts [here](../../reference/contracts.md) and the rpc node [here](../../reference/rpcnodes.md). - -There are two main obstacles with testing in testnet: - -- Many testnet blockchains are somewhat unstable and unreliable -- Getting testnet tokens is a nuisance - -**Note:** There is only one Guardian node deployed for testnet, there is a small chance that your VAA will not be processed. This rate is _not_ indicative of performance on mainnet where there are 19 Guardian nodes watching for transactions. - -### Mainnet - -To deploy to mainnet, you can find the contracts [here](../../reference/contracts.md) and the rpc node [here](../../reference/rpcnodes.md). - ---- - -Express what a normal development stack looks like in Wormhole - -- Minimum components -- additional components -- contract dependency hell - # Environment Setup The bare minimum Wormhole environment is just a blockchain linked up to a Guardian node. There are quite a few ways of accomplishing this, and if you're just looking to get your feet wet, you should try whichever sounds easiest. -However, as you get deeper into cross-chain development you'll likely find you have a growing number of components, dependencies, and teammates in the picture making your development environment more complex. Here are some of the considerations you should have in mind when choosing a development environment, to make sure it will continue to work for you in the future. +However, as you get deeper into cross-chain development you'll likely find you have a growing number of components, dependencies, and teammates in the picture making your development environment more complex. Here are some of the considerations you should have in mind when choosing a development environment which will be well suited for your xDapp. ### What components do I need now? What components will I need in the future? @@ -65,6 +10,10 @@ However, as you get deeper into cross-chain development you'll likely find you h ### What are my dependencies? -- If your smart contracts have no dependencies, it may be possible for you to develop in a vacuum. However, if you're working on a fledgling blockchain and trying to integrate with other applications being developed on that chain, you may have no choice but to work in testnet alongside other development teams. +- If your smart contracts have no dependencies, it may be possible for you to develop in a vacuum. However, if you're working on a fledgling blockchain and trying to integrate with other applications which are also in development, you may have no choice but to work in testnet alongside other development teams. - Just because you have dependencies doesn't mean you automatically have to develop in testnet or mainnet. Often times it's relatively trivial to redeploy your dependencies in Tilt, or to use something like [Foundry](https://github.com/foundry-rs/foundry) to create a development version of an existing testnet or mainnet. + +### How am I going to collaborate? + +- You should consider how your teammates or collaborators are going to work in this environment from the start. There are some basic considerations like "how will they access it", but also some subtler points such as ensuring that contracts will deploy deterministically and that automated tests can be trusted to run reliably. The two paths to accomplish this are to use a public environment (testnet), or to ensure the local environment is well controlled (like tilt). diff --git a/src/technical/env/tilt.md b/src/technical/env/tilt.md index 4987dc0..6afe77b 100644 --- a/src/technical/env/tilt.md +++ b/src/technical/env/tilt.md @@ -1,10 +1,10 @@ -# Tilt +# Tilt (Devnet) ### What is Tilt? [Tilt](https://tilt.dev/) is part of the official Docker ecosystem. It's a tool which allows developers to easily configure a Kubernetes environment for development. -In the context of Wormhole, the 'Tilt' environment is the development environment used by the [Wormhole Core Repository](https://github.com/wormhole-foundation/wormhole). It utilizes Tilt to deploy an environment with all the tools necessary to build across multiple blockchains. It has docker images for all the common items encountered during cross-chain developing, including: +However, in the context of Wormhole, the 'Tilt' usually refers to the development environment used by the [Wormhole Core Repository](https://github.com/wormhole-foundation/wormhole). This environment uses Tilt to stand up all the tools necessary to build across multiple blockchains. It has docker images for all the common items encountered during cross-chain developing, including: - All the supported blockchains / ecosystems of Wormhole - A Guardian Node @@ -12,11 +12,11 @@ In the context of Wormhole, the 'Tilt' environment is the development environmen - Databases, Redis - Utility frontends -The Tilt environment is meant to be an entire cross-chain development stack right out of the box. +The 'Tilt' environment (also referred to as Wormhole 'Devnet') is meant to provide an entire cross-chain development stack right out of the box. ### Is Tilt Right for You? -Tilt is a generally a good starting point for most developers. Here's a succinct list of the pros and cons of the environment, so you can decide if it's the right fit for you. +Tilt is generally a good starting point for most developers. Here's a succinct list of the pros and cons of the environment, so you can decide if it's the right fit for you. ### Pros @@ -33,7 +33,7 @@ Tilt is a generally a good starting point for most developers. Here's a succinct # Setting up Tilt -The Tilt environment functions best in a UNIX-style environment. For Windows users, using a WSL environment is recommended. +Tilt functions best in a UNIX-style environment. For Windows users, using a WSL environment is recommended. In order to run the Tilt environment, you'll first need to make sure you have [Tilt](https://docs.tilt.dev/install.html) and [Go](https://go.dev/doc/install) installed. @@ -47,7 +47,7 @@ cd wormhole tilt up ``` -Be sure to check out the **Tiltfile**, which has much of the configuration and arguments for the development environment. It's relatively straightforward to enable and disable components. For example, you can disable blockchains by setting them to false at startup +Be sure to check out the [**Tiltfile**](https://github.com/wormhole-foundation/wormhole/blob/dev.v2/Tiltfile), which has much of the configuration and arguments for the development environment. It's relatively straightforward to enable and disable components. For example, you can disable blockchains by setting them to false at startup ``` tilt up -- --algorand=false --near=false --solana=false terra_classic=false terra2=false @@ -59,10 +59,16 @@ Tilt can pretty much be treated as though it's an external environment that you If you've followed the standard setup, all your resources will be bound to various ports on localhost. To see all the endpoints which are being hosted in your Tilt environment, you should check the Tilt dashboard, located at [http://localhost:10350/overview](http://localhost:10350/overview). -Tilt is actually referred to as 'Devnet' in the Wormhole ecosystem, so anywhere you see information labeled as 'Devnet', you can apply it to Tilt. +Tilt is alos referred to as 'Devnet' in the Wormhole ecosystem, so anywhere you see information labeled as 'Devnet', you can apply it to Tilt. For example, you can find all the deployed contract addresses in the 'Devnet' [constants](https://github.com/wormhole-foundation/wormhole/blob/dev.v2/sdk/js/src/utils/consts.ts) of the Wormhole Typescript SDK. Useful information pertaining to funded wallets & useful private keys can also be found in the [devnet.md](https://github.com/wormhole-foundation/wormhole/blob/dev.v2/docs/devnet.md) file of the docs. From here, Tilt is quite similar to using Testnet, and you should look at the [Tooling](./tooling.md) page for additional resources. + +In order to shut down Tilt, simply run + +``` +tilt down +``` From 9c494949b8fe76d29c9fe31ad290986994be5423 Mon Sep 17 00:00:00 2001 From: Eric Wong Date: Mon, 19 Sep 2022 14:04:04 -0500 Subject: [PATCH 46/69] xDapps overview: line edits --- src/dapps/1_defiBasics.md | 2 ++ src/dapps/2_crossChainInteroperability.md | 16 +++++++++++----- src/dapps/3_xdataxassets.md | 10 ++++++++-- src/dapps/4_whatIsanXdapp.md | 12 ++++++++---- src/dapps/5_advantages.md | 2 +- 5 files changed, 30 insertions(+), 12 deletions(-) diff --git a/src/dapps/1_defiBasics.md b/src/dapps/1_defiBasics.md index bbe154b..fd7ce0a 100644 --- a/src/dapps/1_defiBasics.md +++ b/src/dapps/1_defiBasics.md @@ -20,4 +20,6 @@ Two notable limitations are that blockchains have no access to off-chain data an Blockchain developers are now aiming to solve these interoperability problems to create a unified ecosystem. In this new cross-chain ecosystem, people can move beyond being users of individual blockchains and take advantage of Web3 on a broader scale. +--- + In the next section, we'll discuss the history and challenges of cross-chain interoperability, as well as introduce the role Wormhole plays in the future of this space. diff --git a/src/dapps/2_crossChainInteroperability.md b/src/dapps/2_crossChainInteroperability.md index 91be339..afe4973 100644 --- a/src/dapps/2_crossChainInteroperability.md +++ b/src/dapps/2_crossChainInteroperability.md @@ -2,9 +2,7 @@ Because blockchains are siloed by nature, individual cryptocurrencies being bound to their own chains has been a longtime limitation of blockchain technology. The first attempt at solving this problem was the creation of cryptocurrency exchanges like Coinbase and Binance. Today these are refered to as centralized exchanges (CEXs). -Centralized exchanges play an important role in cryptocurrency, but they are not a complete solution for cross-chain interoperability for two primary reasons: they're centralized, which is counterproductive to creating a decentralized platform, and they deal only with tokens. - -As blockchains move toward being general-purpose computing platforms, interoperability will require data structures that are more complex than tokens and operations that are more sophisticated than transfers. +Centralized exchanges play an important role in cryptocurrency, but they are not a complete solution for cross-chain interoperability for two primary reasons: (1) they're centralized, which is counterproductive to creating a decentralized platform, and (2) they deal only with tokens. To solve the centralization problems with CEXs, decentralized exchanges (DEXs) were created. A DEX operates inside a smart contract runtime and can be as decentralized as the blockchain it runs on. Unfortunately, a DEX is only able to utilize the tokens on its native blockchain. In order to obtain a token which is not native to that chain, the DEX must be used in combination with a **bridge**. @@ -17,16 +15,24 @@ There are some other essential things you should know about bridges before going - Bridges are all mutually incompatible with eachother. Using multiple bridges just makes 'double wrapped' tokens. - If tokens have become double wrapped after traversing multiple bridges or blockchains, there can be a complex unwrapping process to get back to the original token. -This explains how the ecosystem arrived at its current state--CEXs are a solution to siloed blockchains, DEXs are a simple response to CEXs, and DEXs have created a demand for bridges. Each solution in this timeline is an ad-hoc patch to the previous problem, and the current landscape of fractured liquidity, double wrapped tokens, isolated userbases and wallet incompatibilities is the result. +This explains how the ecosystem arrived at its current state -- CEXs are a solution to siloed blockchains, DEXs are a simple response to CEXs, and DEXs have created a demand for bridges. Each solution in this timeline is an ad-hoc patch to the previous problem, and the current landscape of fractured liquidity, double wrapped tokens, isolated userbases and wallet incompatibilities is the result. + +Adding to this complexity are blockchains moving toward being general-purpose computing platforms. As such, interoperability will require data structures that are more complex than tokens and operations that are more sophisticated than transfers. More ad-hoc solutions would only be short-term fixes for long-term problems, so it's critical to design new primatives and core infrastructure that will allow the next generation of decentralized applications to move beyond these lingering limitations. This is why Wormhole exists. Wormhole proposes a new way of developing applications which leverages the strengths of each blockchain while mitigating the problems of the current ecosystem. +--- + +Rethinking the next generation of decentralized applications means dethroning the token as the fundamental atomic unit of blockchains. We'll expand on this change in the next section. + +--- + ## Branded Terms In some instances, Wormhole uses general terms for decentralized, cross-chain elements as branded verbiage. In most cases, the definition of the general term does not greatly differ from Wormhole definition, though Wormhole's definitions may be more narrow than general interpretations. **xChain** - Across the Wormhole ecosystem, the full range of cross-blockchain interoperability is referred to under the term "xChain." "xChain" is the concept that houses other branded terms, like the Wormhole definitions of xAssets, xData and xApps. -Rethinking the next generation of decentralized applications means dethroning the token as the fundamental atomic unit of blockchains. We'll expand on this change in the next section. + diff --git a/src/dapps/3_xdataxassets.md b/src/dapps/3_xdataxassets.md index 350e7cd..6674782 100644 --- a/src/dapps/3_xdataxassets.md +++ b/src/dapps/3_xdataxassets.md @@ -2,7 +2,7 @@ High on the wishlist of blockchain features is the ability to detach tokens from their native chains. It is a tremendous limitation that ETH only exists on Ethereum, MATIC only exists on Polygon and SOL only exists on Solana. It would be far more useful if those assets were able to move freely, independent of their native blockchains. -That thought underpins the idea of an **xAsset**, which could be considered a next-generation _wrapped token_. In a sense, xAssets exist on a layer _outside_ of the blockchain ecosystem, and so are able to transact on a variety of blockchains. An xAsset is chain- and path-agnostic, so it retains fungibility regardless of where it travels. xAssets can also move fluidly around the blockchain ecosystem without ever becoming double-wrapped. +That thought underpins the idea of an **xAsset**, which could be considered a next-generation _wrapped token_. In a sense, xAssets exist on a layer _outside_ of the blockchain ecosystem, and so are able to transact on a variety of blockchains. An xAsset is chain- and path- agnostic, so it retains fungibility regardless of where it travels. xAssets can also move fluidly around the blockchain ecosystem without ever becoming double-wrapped. Now that we've established the idea of an xAsset, you might think they're an excellent atomic unit for solving interoperability challenges. However, xAssets are just one step short of the real solution. Let's take a step back: blockchains now process arbitrary data, and some of that data just happens to represent assets. The full solution then, is to create **xData**. @@ -10,6 +10,12 @@ xData is akin to an xAsset in that it exists in its own layer independent of any Cross-chain interoperability then becomes a matter of creating, consuming and managing xData. Once blockchains have the ability to read and write data into a shared, global reservior, application design can take on innovative new dimensions. +--- + +Later in this document, we'll delve deeper into how Wormhole implements this [xData layer](../wormhole/3_coreLayerContracts.md) (also referred to as the 'Core' layer of Wormhole), but for now let's talk about how xData can be used to create xDapps. + +--- + ## Branded Terms In some instances, Wormhole uses general terms for decentralized, cross-chain elements as branded verbiage. In most cases, the definition of the general term does not greatly differ from Wormhole definition, though Wormhole's definitions may be more narrow than general interpretations. @@ -18,4 +24,4 @@ In some instances, Wormhole uses general terms for decentralized, cross-chain el **xAssets** - Wormhole defines xAssets as a "chain-and-path agnostic token that exists on a layer outside the blockchain ecosystem, which can be used to conduct transactions on any blockchain." The Wormhole definition of xAssets presents itself as an element of xChain. -Later in this document, we'll delve deeper into how Wormhole implements this xData layer (also referred to as the 'Core' layer of Wormhole), but for now let's talk about how xData can be used to create xDapps. + diff --git a/src/dapps/4_whatIsanXdapp.md b/src/dapps/4_whatIsanXdapp.md index 01ef37c..e5ee549 100644 --- a/src/dapps/4_whatIsanXdapp.md +++ b/src/dapps/4_whatIsanXdapp.md @@ -4,16 +4,20 @@ The term **xDapp** is short for "Cross-Chain Decentralized Application". At firs xDapps have the capacity to perform all the operations of traditional Dapps, but they are also able to utilize xData. xData allows xDapp developers to build from a top-down, message-passing approach, rather than the bottom-up world of Dapp development. The Wormhole Core Layer implements xData, which acts as a shared repository of data across the entire Wormhole ecosystem. -Something we'll explore further in the upcoming xDapp Architecture chapter is the philosophy of **Protocol-First Design**. Protocol First Design is an approach to building decentralized applications where the first order of business is to lay out your application into a series of data structures, APIs and message payloads. Once you've laid out your application into a high-level protocol, the protocol acts as an agreement to which all components must adhere. From there, the smart contracts underlying the protocol can be considered an implementation detail. +Something we'll explore further in the upcoming xDapp Architecture chapter is the philosophy of [**Protocol-First Design**](./architecture/3_protocolDesign.md). Protocol First Design is an approach to building decentralized applications where the first order of business is to lay out your application into a series of data structures, APIs and message payloads. Once you've laid out your application into a high-level protocol, the protocol acts as an agreement to which all components must adhere. From there, the smart contracts underlying the protocol can be considered an implementation detail. If you're familiar with web2 development, you might notice that this philosophy is analogous to microservice architecture. This is no coincidence, as similar problems should expect to be solved by similar solutions, and the Wormhole Core Layer has a number of parallels to the OSI Network Model. Thus, a more fitting depiction of xDapps might be to see them as **Distributed Decentralized Applications** with multiple, specialized components working in unison to deliver a smooth, unified user experience across a variety of layer 1 ecosystems. +--- + +In the next section, we'll summarize the concrete advantages which xDapps built on Wormhole have over traditional Dapps today. + +--- + ## Branded Terms In some instances, Wormhole uses general terms for decentralized, cross-chain elements as branded verbiage. In most cases, the definition of the general term does not greatly differ from Wormhole definition, though Wormhole's definitions may be more narrow than general interpretations. -**xApp** - In the Wormhole xChain ecosystem, the term "xDapp" has been shortened to "xApp." These cross-chain applications are largely still decentralized, but for branding and simplicity purposes, the term "xApp" will be prioritized over "xDapp" when talking about Wormhole's xChain ecosystem. - -In the next section, we'll summarize the concrete advantages which xDapps built on Wormhole have over traditional Dapps today. +**xDapp** - Wormhole defines xDapps as a "decentralized application that enables users to create and/or use xData." The Wormhole definition of xDapp presents it as a branded element of xChain. diff --git a/src/dapps/5_advantages.md b/src/dapps/5_advantages.md index 7863290..174bd4e 100644 --- a/src/dapps/5_advantages.md +++ b/src/dapps/5_advantages.md @@ -8,7 +8,7 @@ Here are a few xDapp features that are making an impact across blockchain techno - **Decentralization** - Cross-chain solutions today usually involve centralized exchanges or bridges. However, Wormhole has been designed to be decentralized from day one, and eventually totally trustless. -- **Increased Performance** - xDapps are able to utilize the strengths of each blockchain. With xDapps, expensive computations can be offloaded onto high-performance platforms, final settlement can take place on a preferred chain and data can be stored wherever is cheapest. +- **Increased Performance** - xDapps are able to utilize the strengths of each blockchain. With xDapps, expensive computations can be offloaded onto high-performance platforms, final settlement can take place on a preferred chain, and data can be stored wherever is cheapest. - **Broader Market Reach** - Because xAssets move freely through the ecosystem, they can be listed on a variety of exchanges and custodied on any blockchain. From c30195e7f9ab4856d906f1ddf33566177ecb4d0d Mon Sep 17 00:00:00 2001 From: Eric Wong Date: Mon, 19 Sep 2022 14:49:51 -0500 Subject: [PATCH 47/69] Wormhole: line edits --- .../images/architecture-2022-01-02-1935.png | Bin 103658 -> 0 bytes src/diagrams/images/architecture.PNG | Bin 0 -> 107115 bytes src/wormhole/1_whatIsWormhole.md | 4 ++- src/wormhole/2_architectureOverview.md | 24 +++++++++++------- src/wormhole/3_coreLayerContracts.md | 20 ++++++++------- src/wormhole/4_vaa.md | 2 +- src/wormhole/5_guardianNetwork.md | 2 ++ src/wormhole/6_relayers.md | 22 ++++++++-------- ..._portalTokenBridge.md => 7_TokenBridge.md} | 14 ++++++---- src/wormhole/8_wormchain.md | 2 ++ 10 files changed, 55 insertions(+), 35 deletions(-) delete mode 100644 src/diagrams/images/architecture-2022-01-02-1935.png create mode 100644 src/diagrams/images/architecture.PNG rename src/wormhole/{7_portalTokenBridge.md => 7_TokenBridge.md} (70%) diff --git a/src/diagrams/images/architecture-2022-01-02-1935.png b/src/diagrams/images/architecture-2022-01-02-1935.png deleted file mode 100644 index c0a92f0a62bfd43fdbcc0f6a4d48b1bad2a8ac99..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 103658 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�G5S;5%$XpW7hB?smQp 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 YBz>^oB5_Ot9{i&yuO^o-YaaCf0RP_*wg3PC diff --git a/src/diagrams/images/architecture.PNG b/src/diagrams/images/architecture.PNG new file mode 100644 index 0000000000000000000000000000000000000000..ced114f659d0d9bd185ba8c2dbc664f012907547 GIT binary patch literal 107115 zcmdSBcR1Gl|30oLWRJLPE;6!7*|JF}4P<0XWXmRXSy^4lsEn-Con&QXl#7r}B9guL z-sAgtalb#G_whT9-~ZpQv~SSja&*0(Vk!fnE=;7hv zPs9JOiB7|JgnPbyhCfcY>8UH><+d`zPw)tA6}1)d@bY6w_RLSgzlohS4BhbXxTcW* zPdv6f#f*n{n5C(rc+<;tZr}4Y?f2cU6oWCtmaW93VHP-n^e~i&h0Z(PbkyZ**RLyz za=v-|Jd*vi2>NvM3Aa|M$tBdxLGrr%Qz!9mp~AUlowkMTdT)W|o1Xgmn>T;We#!kZ zbGR7@|0${*e=)|OO^*MT$;I2Ldi>WbkN+R}rc!9cTAaSAR8HkapLwkIMPeg|eAVAx zqfs@l>~miV@}rNw^z3in^3Z(`D0&PfiC{`R|4Z zmh_9=IY+ttA*bMqf&ItN77e=>|2WWW^x1!M#u4+>o=!g@webj_oM`rAiRp&)@fxG! zC_ChwhrUg5eBGXST?3oK5G_6PE)P~Q^g+qri)y|!)!I@Ob4-q<=El)cCHv2m$%!rN zqoaJ>2P(XWYiV>N883Mz`&_$$Z6$Lo`TJ1R?@`_fM~BV7o)k|$Tl8c(xR9Yym>-~+Is@(-937cF8ts#Sjo=g0ZWn*UofyO)$MFinG{l{GT9a?+f!o)lV|GRo6T**FL?};JF>R zG1ogh9Lh#c$l`uY`}x=5m)Y3-$7Yr6q$!7!jZcrRrqOe1-)nn3Av8vQhd0T!kxxSF zK&@yqV0WHgVtRjbkgd4y{s)J$JJ)HjRS-WRE~9n9su6VGF-{+HzuYhGf2uV4*7+25 z$FOx<9L-TIU~>si?uT(k6Q%mCXkNW$YTpv3pWLuKnc^$No$z5Y+G?I|x^{Q;;BKk2 zx#ViIct#wDes1NEBAcj%%2nR_SC5Suj$>;24*Q#u0iW5WkqF^BiK%th84DswSiOu@ zl&*j7Rl$2D8jF9+J&i-kyq8$NJP!Z_Xy=r zrj-TO_fPdm&*l{3NQ5ie-x5qeNHakvf9%jhNzb;sS>Gq7!&*j5are8_v$#Cj{+}CR z98w+ho=mQhS*)PpEJt3~Gux4&?sc#|Il3`iCN`f1SJ@xeP*w2XSu6cyoO|_SFRWn3 zCI7B>*LxR_OIfDNurmAUYe4Z; zUjuV&^!iZgXmkYeDAa%$hnGH=pD_DOrMZ+}lHD#7I}Xv#ZA05+51i+qKRuEbbDQgr zvwna2df+n!@wu_Pk%vS3w@CCvvOd^QU3{1Kn83HIB}q!06eYsGTlw#;I64nG=6|Of zZc{jnByMrDo>5&HN_Fql>|Oj*b0)&Qf2a0f(08$th4o>y2G2pN|B~xq#BsPyp2k8- zl!q!DY-I?UPkzLz>}*e_rtVkC6=`MO^%@Soo;iA}E$%)2Q}=(Pi42{b)f2WBJ&<1h z0?lIHdf@EvwfG13YpbR%5|y1C!$OOZFa4YUK3kb$rqkzNw?+H?Uq2}R5&xcEGn0Zr zjBD55_n!WUAA0m2j&NR+rwQqbXx-MQg{&|XoZ*(zj7blNayG350(2He?mP6ym?4jq%Rn~?S2+J|DFDBPSb{cyAYPVbURxo znGq?}d5~k)O zi>}l^ez|I0B-p;L&T^Iv59w;5=kO_yA8sP(Tu0B{K>y~A0O)7dO*uqf?Vf#h*@+_i zL4>Sfrn|;Rb&nhx&ux^Xvzc+KJUkjzHT+pc}7uF2~iKM>CMDrpoKjYTpuY0L& zp%iSa;>-Dzf$P8Y+fx30y39M2vtA8`MyDk^WFK9nBiqixo1(Z z((&4Tp&Prb{A6R{uZ$yy4yy#NS5vG6`lofww1)J}%;VS%(`fp?2;COsK!Z2mU+cn@?r<>DAgRS!XSS|CTJY|=x zs5Xp>69*uv@M{hF7bD-!+H~yv-8bhraXzyj>5=a0@RbKCpDYpR%2P{RPQ|@8=1_{r zcjpRqB}c+IaR7!3W9QKGR2iFtfq_W>FFcubNB&@IbP0NJ2$ZRkpR3TsgDK><*#D5P zhfEfkRX?6{dl7BEJo3HQ_6AAgmdws*jDkg_>$+fp^DxfAS5Zq1v)U>nObUI95&tw9 zBkj)SBHKe)h4xBc&+p~X7c>YnG=wjEZEpN=V%vaXC}~~^0f~d&mtOxOTsWm~>^lwB zG^rVL?a=bU?qcZOfbDaB5S_zW38qg6O?;-ah5-&l)m_<9uUSFzZ6*f2e`txY6#Ubq zL;%ekOQBiRq^m}ty;5>3RvJ+|QMTcl_ZPgVur|TgvgM0azNm{128q%h_epmTr!r!2 z(E6FH4i9$opa|c~k%c9)SXcJ;|q>lXdm@{DV`Yd@OccoFbz`bP=zpbUb4mBq07zB!9H#)3UcS4vP zQ2?L&mRe;NYaLq47ruNTey*Z&{k10aFw^R&gvCL6=T z8V)mfyKI{isaPR55*>c_vmi0`IZNy58gQDr@QJhf#^xuvsIcc1-yucb99Tz3L%6z$ z6N2zH9!x(+@2~yTrGOYRLtVIcZNry}>W4B;TkNaCde;rn(OuDc=2*d_K;>6Upqci1 zjGzr?01LqnihH?@)KpaN*g&@w&92W*4Pb1Q9E~hZw$4pDTF_)6o=&7BO`ZBO^q9n0 ziw|9J5_lp{uI3?xbj|O4%Xuv%Lhft8l`*A-DJ$Yxz`q_K4EPw0XU@AzVRh6zH?}>T z+^MidGWAM3Gwd7+^IJ5WQ&<~LMTg+|Y-{O=Fg_Ey`@ z!lnNE`(L3W;9vzm!6)1C9D!HtPJ5Qh4nhI}JATkuteu0#Hw-1|4CIbqvs`<*=VBh@ zu}#y{hNl_-xns4=Pe?_E+Vpfyrxl6b1PMO?cf+ZH2gF|wcI=T#i2K2l%6zf!UdEhg zaxzkCpYQ5esa`+oFkPWSoSm0?tzt!NTa%WMVnj^C&D$v>>eagZ=C13HbHno`gV7-j z1iP@ttgZ69b9vDCY-8*%B2-Vry77gGeRobCFbkU|2L$B5eeL+v;(nXlW^+81A=Q7@ zuqkZqLYg1sUrnN@rBV#5T)}weDk5w+FMp>G1;{Jh@3-0_N^nrm7DyVSaNs35msf*h zw9moH#Y2)RT`yrW`iNAVV)?NhYmk|eu;`C z0WTTGsQAo|d$mHTuLw2e5+7{BeLNNNQMh^{gUFJXcsOj!N zVE!I?wK}F52n;=eYFdE!H}sd9XB^5FOjw7Qz)#TA4yDuu4SnZ7D-TxrTk3rUVkxdB z2^8xxwgsftk z-BwcaH{OkS(2|&{cG3$Q-0Xz(oqNCI-pDWNRCUqzqk4G5k zFk};{I;*!;&d)sansnR!gu4OZ_Uktu%RN+>>MfiMY{f1_eV!MfH-!9JYo(833iFlS zMO8}*hwt)!g_7`n_YcCQ#}n?d0`d5`1W6-YDKsfF8YzDJ9a&~R7uFH2b5w~ttyOlY z)S0Ph9P%&fV+Z_(?5tU&W*eyzi99eDo?V`Q%AXs?F*oS9s@*)&cH2Q_zUT&RffSZJ z%%`HEO?I_eZ1!^xbR)8;;}s#u=}85L6MM!w(^a! zjP0X03s7l&XnUAzT(OYcvVMpAn;o&bN@{&1qd#6dRWVfUtu*m=iH7(C!yE=#g`&{5 zja*l5{bt1=0u|)>Rb=M7J3X@Yj-la?7k(hZ~vJ5;qhJCDo-x(UZdVW|BJ%w1x zYJ#Z`pWjBW?XtL7V)nCzu?LQtnWG%?drLJL?^JS}s*0`OvmHF6OVU8*#d|_NAQ%@wZ5se>{XnbAxI~9hc=4K zFC^_G{)sy3=RM|>98zqPS@Yc>I`CFeIfC?X+wXLn{H_D-Mn6BR2PxOn)d{u#)YnK2 z+eL?3DGLqkKoa{5<*P9|je#N1CZuKI$vQZVU(!ARUQZ0H*@*UKJ+s@@+mY0DQNLBK zMq1RuMovx0RTF)axbgg=(x?KwA(5AaqjA}5kZK8vmoZROg>-|-zv)6KyrsRiR0V~n z{sh~LUk|I+m?4W7I`e#0WH?rGdUJCu$z`X#>J5ATKIcik=BXk(B9-h5szLwcC3i+&o7e+${QOsyM1X56&tOZ+86n#?Uj9r_{%#*D#=B`jre(z$#!Is12Z-qK3p2FT8H@xI} z%sxtnoW^}yF3sNgeEOu{MDxoIN#_QR(7nk6Lj_&ei?W+2;+^%`l1S9s0TlxF()Tit zSu9UY;*6qCoG@?Oey@#4gPBV`f7^hqn#=1!iBrL?cLu=d9A+J7ew)jdhg(Qx;93DxNs^%RLe z_=Mz0+=#6MPzfz?lB6epXhmO}82o{! z=v~o^nWW)+bg%AO^)}I;?2np`p^Eq?+8B4C2uL2JTHer*t1rGC*yw6<@K)NHte||f zMR&bfRYpVV-%d)X`sKo@Fr|tPE?Z@lLb`njp&0vQO}ctFRc6iu$~>Z5N;qPv`WsrV zlF^ph?pIFNe_b}^yhs_N*)^JV2pG=t-UjrTv#RSL+NURK&yH*}Q#BpT<_IF3bhOV& zMQFgb*sG>VcjW>OM^)nW&kq}&Qkh9E2R3}X9%Tnh$p!|dJLurX!tU1>*^5#(-Z*-d zi=u`;>zrhvyir8>Ajky|+cMc7c%`Vm(imWV{y`B_x@`EYiZomO4X1?&OS`5u6Drwl z0X{PpSysQ+`biYuQf;>Ni5#a-vbP(g>lTBCpKfKo;1&v z?J|LmlEX9}u5!7VM*9&qNSdQlb4%^Y1^_L{Dm=;d(V-Dou@?LP`k;%1{X>S9fe>!a0E77g4|q6KX% zd9J1`@+$Yn=Ux|Nem!Hzx3YPWy#q2NT8utrNZrY$qvr=DeWzFQl`` zJ77?en?tC^JKm_dec2h^OcnhrtdvX7h~}Tqk3Gg!u>*Sh|MZG|%t-TpI#Q)Kl&ulG zyZBXM4+x@G2F=s!XS~L!X1(S=*e$vr#OLz0Jo$H{-5Id0bOspi(QVG~gxD+ZPkDv* z>X41<+M`)MU9c}`;_CcxYHZ3}2ct5WhYOO^{r}UNsHZVs3R{0` zW_3M%AxY*W-oc1@JlU8Z#WYgJ*DYYKpBm!c{tpU=X3!#FdbPk$=KYI1O1v^?|6yFP3z=u` z)iV)1<+5obAI}-k*q#1gKtPyw~!Td&m`E5VBcV{BntK+XYe$E1P9$oU>D(35C6(L6Y zPi}tnUuRFdhtD-i6cC;7y&!N4HXwMzP{>JYLMhr1j`Rzw@@4=1F^khfSKj>^VBV3g zs&igdrB8ElpmH?cZzCH)bwCEg*Ivj**P39Mk0|3x^^{cL!CvXQ*#fXVDk?)!xFN#l z_1Y=2QV8-wh6q;M2$Xd(YC^>8V<|odWulWgs+ubA@ADfZw?a_aHD;d?EdTQ%_Y9&? z^nYg82RaBmH4=E=Isn|F7zAho3+8W56ys#MNboQHyK)GH zJ?etti05FDNfK^fs(3O!-FA%WuU_->%t>IAZDn4XK zdA?+7gbvq)h9ZO_2}qNupE$A>2W%(_CxE#k<~U3qOtfs85Y(@+J5_-8j}R;-LI@~y zUt7|_TICn~z_JguzIY=o8KE@H&fiWPuUBWlmmG~y&S*(=$b;w8{%}JcS{JFXXKouk z`21UedO}AihKf@SgU}MA+sF>|=_b%kUzI1MU}c_YOJyrO%Lap)Gzdf!y_~`xmlDUn zw^7A~e-NfXE;HBe`0%esPbtMJ@D3wSa_Olz&Ry5lgMpOkNE3C7O{S=RL^#x_%nRR= zf2={Nh+K4EFmZ}n?>72$V~uSs3Sg2U5)zhdnqj*}PL*eov28n`&N)#e0QH!@6loB0 zXCOen6iPNOR#%<@kx85pX&5N?_w@w3^eRyDglVV;Z(rB)+6S7JaF#$Sk(mM}LHtUt zMfwiW%u-^JOqX(7jDc2m)SOn~>UaOC&0mX%sKxh+>mkf$M@%=|CR;y}5JlVld>hQ< zR3U0QnHI`=Mpt$j<4y^)I(-M&2Y5MA`3w*n+pX(5wpccc* zQd91>=&zLoTVvkvjH7qZK#Q_NdCP0T(*z^P3E!P`2)s^U$uRrfZT}j!D;pd8L|~p- z{i`?(g1so#f@MDeDCYKCswV7s_G3F@KO5Qgt`s5RP8y6`G$g%%ajA&xX209=;>VH! z#$e7^Cnecs-mGvBBUM2f<62Ffn`2%8-fNzp)55`1+jz$n&P2+!J~8x!BHEj%81!^IcCT`8x-#3F{2}Blj6kSj z{U_rIPo@qEeEr^EKFEk@171KRWS3aI(M66f4{iiFN;Hv%ng z)BJA6GhwGlyiHb|@tkC|ZKO8CE zYEWnY8=J>=0A)IL{mKO;sK$3ZlPR?LLaXyo9J&y|YENaOZ_xyba4J#&C(Z8mWl5OVL0Y=RXUD_Xx##OzgA6OPyCv%Oe%~)|37AwS0O;H`Enq| zdKWY8^A2`q>vNXM7Lm1Ak;Vsje1>vrZoHYbwQMnKRT(Y*{9Vf{3I2ti7Wt_^4u#sy z@+th#J)nw40u5z zX%<);Kt9?h(8+Q=$kg?S?-sVn%NXfM3u|V6g~H{+wgN;4p@$SMcNc3Y6l8smMsga3 zX&MP{*~8Zm(z-C+n$n91E5j@(kn^@CUOSD*PiVyp5Q9u|Ywf5t{`cE1V}%gQ2};(> zc?+Z@9JF3$xhXckB}Gt#)JT18omTr@kf%boV9+M7PO5&%0cF{|{f*)gjPrDEtMTN?Q|zCZ)Y&+q19#}kl&h2&Df){H6(j-soFjS z6e;~(KbH;3<3&({MSu-5gKNeNtd_Y=)_EcmTXP6^QS6Y3=ijrH^JSw)d-CcOg6yBV z8^UN0*Pf=FLAZ}d<>8|ZEAscd-idh3bS*WDx0RlKjg*NCa>x$C-9Y)=>IcnxaS5tY zoyW9gT_mwOi^ol`@i=|3rhp#sLhh*8XBr|r?~O(RGQ_NaDmn})85KzE&C~1;9g!Fr zr-BLQ_S!#_(MMB5J38cHX;pWiVSLh9w8(+dISh9|3eur(KhJ(OAzS3JD*W1^K(ln> zl|2sX0(DRJWc1Ob_W1q0o#hvEB)&qIz=2xGP*@Ir92sO@f=sQ+5W|M#*fZskZU?Wf zOa0C@b5h5PapGt()^bT0{y<_aLXBj@fSfLR#)V+F!h7{dY;2l?sn0OTj*;d|`@5Tm zZU4Uacp>4vDa#~6rR<3CA^HS1YmoKG%mNbRkx@qs=|`YaGmUIGRPe-29!+5X=ca`a zO#iYU8S{z&q~4lCdLwEf0GVlvA(K+c>C9M*?oAjXY$*JH-ph?xe5gGHyDzUvfdDNxjjSznlsBJY7!d0jRSk|qon<-kz0%S5AZ`R_gA=P^O0|+Y& zXN;^EqJ4_S?&5+;GCY$pF7M~!jT{+*WoJ7H$(c)=z5hFo)^gQX(qljGgI6p1PhS3p z-`wx~;c%XmFyb+C$)QJCW_0@i_8-KG}y$SbDY@ktMf!LAzsa zRXE&Rn)&c41koR%i+kF67kq;ZJ{X4FjU0?(m6JZRxpw5n&=7|(dus+AgFHL=;VX1y z#AP+l+ATzMsvLo$>bU0z-UA{|wMe4WfE_zzW_4Kjw+}D|rSiZcDAI|O+&)s+49?dZ{453uNza06o zpz-|SHqw15kVM=9V*(BoV1~Ck$zRrFRQm6K_(-Q}xQw#XLDX`@wx;UjGwxZzluRRXh>u?`ROj4tm3&@wN-}Putp&)YUd-$LC5lW91vQDV9#Y470Evj5dE&>hR!ttPtS70ylX%l46ry9rck6G^$3T1g6r$`#b9q zO{^*Y8@;6ga>r~S^Jw+hf6%9_AzdFCW@{c9 zl1qy!+)a_hLP=GdP92dpr07!F-KL$^J5S_hOY#vUo%09|)GG8*rncota#rfU6R}9S zfM}&K1iEw(t8!JE2jyfCa{$Un{rcoF13e(t0*TP(fv9X*|4?#!8Z#%LCeP&rpvM@!go4@~}1WS!V9^=E&H^r;w!#_7QaoI@)zxXlYsai@dW< zfe?#J0NO$%x(zr3qBU$uE)qy_EX&O0DI?$v2Q`%*nZzC@sY~-9GCU$lBJAU^@K)+^ z1Z8L>=sl-y@P~4$wTaxuuh-3snDW9)(!17$7hei2#!WtJCH|B97a;R6#MlpnKmr74 z1_E#JdoqweiMKM8~*F9MR^-r zkVi4ZxQk%(_t~0#|H279Z!W4a1m?0&I!*kO3%yazG}|vVrPAhKR^p5JWXE_-^2kIy3;ICcrid z7(mCh^L?)Mnvpq`QEE3G0RcyIH2W^M@hmsxky044VGzLU z0Cn%bKa9f2Q5&d?AA;o}V4{@vA)zmJl|?)jNd>Ew7fj1CPVoF!UQTmVycAf#R2;6h zDGb9{;SA!!Db8^Z@Y$GSaD)oH1ct0olZUmy_LhG#6Lhz{7$#vd^X%k|BwLRjyVHfye_vD~$>L7D{WTIIE!9iV<R!8>#_=>pw?AGFB%P@b#;w5^dp{&C=5JXU`?rwyPJS+4y8vx?wz>tDC@TdHKx zQO9!ybQYmv@RVub{<`w!!rvP1*ACRhF#XR16L0W*@gE_fpgsVU31Vj79+i?b02)*+ zAZ3+|OLZaW_l`hjaJ%)$>w?_@9~wEhjI z&l*HMJMtzVq5+ij(3j%2A;Bc{A%IUr9hfpBpv{OYtG|-HHE?+Wfi>t z;^64h_JN1PTYxy$6((E$)*v1L&&Pc7J(mXk++I$$9eR6qZqBh5f-$85afpK(feP`J z>BuhE=D}d5cI-34Nnn;|I|Zq`R>wb(#d@s$Wu~z=Qppjm$oubLGNPr=KV3E~v>xU-wqDXrF05;wV4@P6RY95kSe#(^&~2AjYVZON~9tgA7-vybaL1J1{qb zM?Q|P^K0PYRIu*kc~>AgYMdu}?1>`@RYems&fzOY1FevSw38c#g*7;jw*QW(1V>T@ z6fi++#I+7?pxzb!lWn0p3gAQO-Q|CtVwc;3*e{$xnAy*+gc`Bq475RTHOVU!aWq+{ z@TV+~tPVnB${>{U*VXHD--F5W=QTq;Hd48+AX^u}utx${l1m-K^@`CT^-?FmuN||| zY45#Qu*K;b2@hj&ZRdNoUr;@ddQjA%mVd*M;Cs8Q9Rs%=0(OhZ{*a`+>@V-QZCuZd zE*N3A=mrXs2m7clyq#aq$`m{dvw0S|5mm)#b>`ua1e%U$FWr-oqpv?JIR3cYPK~iC zT)%fc>>^2aiqHL=z=f*we52yu!-|kl^gm7HRV$O?l`a%EQ3}h6*!?qHLU)I@#U|T- z3h@KTI8eS)q(@t1KuD!qCUKWm1ba=%%{)V}#v>{yo=Ce^MCmT_rWcrDQF?n{b z0|3&g$pt(@eD|Xh=BhALymW zaowYO393@m$vK3!(LIoU)3}rw-|c%#*+{ACjuB5c^;JBBPdCd#-rs?gEV=jVlQGjR zvZAwe-B+e6h%;V+jVb#?hVp{xpOb0M6%<~2u5Ibmjmv%zW>AmsS`GHrB1mWe!eg%d zD_D!YjVY}FIC7`8~V#s8c8j8K-FUsf>fDuHcR=|Njh;+@_ra<`fqs& z>qA2!cwmAjR@7rTElL8ELTdNOO`8zMy&`qTb=rQrWctS}TIO0DT7n-p{|PC^_5r{_9STH!VUVAwPsuHpeqx=6>DIc$U;*; zu1!SM<<-a^qn+kt%=7VX4c?P#4!J*821>PuaJ*#sl3F73ZBGK($#0iK(jr9yXVRVN zu{NRJgjA|tI4WM0ndV+_Ju_A(Rd=N%R!5r8hjD&0Q#^<>a_`J!D){xF-;Ms(buFhi z_2P&GeNCu`T{L~b<3}18VKVc?q#q$iF?^OaPCsV1ZJ{3t%7m!^MiRY|)5wZvTGr3PUvb^9~biwv!R*UC_F z->m35$W;nOs#&0iPW>ry+B1ojdI(IVDMeo;6DvZ_2Tmi(V+S(o)Cofg3=myf=Z(E?reCE$($wTj) zqX=&0E>qjdC$^_RO+ZYTk>OKBROfEeR_maZf)%$?M%%4JkUC;) zwY|i|01|wE2i_A|th-7jD{y#GvG3k~Ju27%t4xmx2UR6WhCe={lp`LTMPLRZ|7j%D z`Quw(>qAwQT9L3(b6d(o2px-eNQUir;)Yq;RWms?2HbYoF;e@~TC+s3~P~=NP6-LXH`~KN?-yC7^mwB1wA055ce_yq*$E6d~8Pe89&G_C9=a zNp@~`8^3x~+jDI76T*6zzvmoH2vvP(9!c`hhNw90-9yx|$_cbdQc;MUchB;>!WO2$ zeB9^{G;NAJu6YTq$3LZ;7~8(tJ~<@EbJ&6$rYd>X%)*I&@MI9xQQ+{WuKVL%zh%|E zLtxL09*PU7X=C0_EmHedh9%0$xu4nwyP$lH)EZN~4C7kLE%ZnKu$|)h{WJBW$x==# z1fr-@u!V_AABh`|)>D zFWTvSEi-|VyVH&&7S1tY0FKxCpFKN??quZKCbdW=cs}?2sjXbN2Y1gLf%#)87^yWY z{66#iujK&%M&K3^(YC^1guIV$xrs@5(dFx; zBHr4>F+1=yi5lgYdQcg%YQBl3jdnI74G{Pw$`h?o|CqgAGUW0h(1y`LFe2Ax8$(R=o<68ikLjZ8rUGu7#K@2hmAg8blsd5z{hqsUk z4B`#u4zFpLq_anlvjHrbE-#og>{F+_3?1^h;UOX^y0@dIM(*Ahiile1&N%? zu7C?1jd1U}!x0I)aC&TFEgjFv-8YB8-H@|`+~G8Q43Ry^fr|e0sM2Qx10(CWTLtyu8j~SX zKag{TZu;Q)@77h@34cLDU7OBFIUVMaJ_g!VULInrZ_-+Qqp^5dgR;I)H{dFA{sipI z*WN^ED4UD$u+;&&Z1H$K8XX3 zE=5ia>=t8L-!$qO-8YmJ;7A);@>#o+I#S~=Bp=dj7l2S9@^J2V9!N7bO;_CDj`5yf zuKyxo-AG%aPlN3Y+H`<}dL7Ri24*m=9DTd%v$j*^8uX7a#fXUF1+$nMgyY86N!@)< z(M-}~qJ=w&t0Ux{1}YHG;E}}?VTrx2dQ6nlIopFU z)dd;j#_zJ=JkR3W=djGuRzQw6*t9r~~96q~uFmy@*XdsLHPh zx#t}UyU$imdC^V(5z)z$N4#Lm2gGD`mwQ1A``z|SIghgwajBLPR^l{gPArOaROD#u z{xDmAdx`$(8l#eWgorJ*3`|54Ka1<@NYi1YG(RC@OQb|NFi_bs2rR)ISH(C17~z`a z(&pme;Eybg*h28&fA^1r)gPSlu(U|!?_uDmuY)s~HLyo?$SJ#0wWR&w-hk*pnp=+) zpI=N%zW-~`g>@q@0MvYoD)jF4_w>lYfD0Pa!;-0_KGZ{F|J5{`=1SITm=&h$YQ5$V?Bljoexurz-( zR$gpyGFF2}c^%G-Sx)(a6TgV`tGetojFY0JF6FhR!r&{UGU5Us(XGe_UNH#c7n1Pg zC=))pk0^N~<$Am{#F{!B8!x$OS@RFzgH(07Rx2%f5#ur<^p{NE%G8oGw>#D0q_T~e zYDEcEbCZx8BQtv=von=3O7ZBk$%0^C0IHTK-ybTDmP0P1NKk!PhkSfO5;-(5K4V=TE z+=BU-8shrV`js3LvF6H$L!$Nn=%V_-bx+w7n(r9-tYR(UMD+Z*&R6+JKmD@|BE|bC8*550Z9EY4v4>`1WV^)7gMcNI& zIHQSSAGA!?p1DJqv58h2`?`{!!?vy)(hug?V_rIm>T?#n$$F?|)&RNap$r3!QQ4PL zOifv|5$mD0wYwLg?nqK_2Qe?YLBS$X^^r*{wEjrl%~#WJPr}j!zK^ru$4xyt?glPr z!I0mb9Tht>ACS{YVKkA5`@rW$T8Y7)j3SJnyJ!(7j5`nl2A_a~nenDo}O&+&JW`2fpboO$xcDOc+*4GMlP_`0X zspV;!`{FT6C$|Xa^Detn<^?2=E5uD&MXFc0$)aCqoN6_a+W4tI(&Y_9wTz&`+vwz3 zc0VawA+blZ&bnQEJ$E^aUVd1ElWX0nt3_R(+)`Cglz%l2b;md#+^o2pt8T@IOY&x( zk2FufcnjozYuA#|Pcgbr(H6c*j|~9O_Fn%L0W8WJPVlNc8R1%o17EPIIwBfo<2=hu zO=qUI@*AmVblwRno#==zNmfjF)^D-(Ksu$BxJ_~Vk)duPk#h^+lV9h4&~4)OmluBB ze{+|W^nkQokZhoHyBejoMu`>3xsJ%gHBcshnJ>NxE21DBBH~s#Ph~T|OnQkk4$Xqq zl$04>6foi9-vF7Fwccq0B}q&fKUUlemFJ+amM|!y)SAS!F)xH=@ja(Devu$^Fj9+eidlMmv9{b7}sX{vAWsJ-a zCEwU5&U~Rv##t@FDVK0MpXWcvDzr?_2JCW8actAZ-r`Bu<2KN5d7cl#p8zu)p@P(T zc?BD7i(Q{k?fBsd*KniFAkvR~PSoBgMR1a3SZB+p@wBd<(b!pvmwdW(9MIto`X@t8(trbsAsy!YVb}6gQsXeJH@Zf6Eimmzehs!%A;9x zUUq2!P*qQ#d8Evmzqo7wN42fq+osraR%}O0>^DC^#*0K!7|LM;#rb9HRpIxoKq(JX z3-9V~?gcl^?(HaYJ)^LT<18bdZKWm@_1G>t)txg+lc6Hu#JMgxU-WbC-V6~AW zEm~k0C6eo1Pon*Tt%to|vPCYDUI30DNYlMjpJCdHSS56lU1cG~k1VvB;BJ!rgL64Z zO2a!%ilRIv=dE;Jyxq-lMp=g~lCW8QDO2n%=WoF=R@+KGWziHT|pq!ad-$ za&gFyxcBFB)NKkL6P~q~p+TKqGd7&wTM~jHdrfU-4!_S&!@w(3yfpp+6j!^K#YD@v z2~V?TZ8-LF>1m1Npm!*B;c)JZp5b4be(~Xc%}h%x{O+t#yV@tMPA|_z{TS`<^fvez zlV{sYfwhTjx*R5*HbB$|r%Hv$gzG-EuE=5dCv_%AP%2_|Cn}}{CbgOxr<4=jT$87N zW(#vJ&{)maxuq^-Z?W{e1T~O$**Ia8PZ@m;xA!tbB+$aK>GM_--D^H-JeSt>FrwNg z(Iw2Img7kwVo9&%rXX47rm&N*Fy%klEX>Rz@4c7H3ZPtRrN%F2vFhhORD$M92yu8h zJCnY0)GW`eh1vY3SC*T7+Vs-&BLkk`bp{frJC+F;fhVf!o>!*(1b-#_tR5_FKh2@A z82WA>nw=t{#$x{HO)Kg$CHGZXgU|$ieZejUic@Vdd1l-fiBkLB;$4F}CP2!Kth)k- z6}-PZzLfkq4O7y2SlAyf_m*nn>OEqQbBCuwzDIA#JuN!ROhP1FOM?^8e_L4d9C7@C z%!uVw7fP=0@EkU;9a76Yv3k1pyrrr2*Sf{m%Lxz1He;N>^S9U%SyTT#070;$uvzLx z;J43IS6*n3GEdgAe=}$;td2FAQ;-Z?frGu+}slDHYyxKA89*^M(-^LNPdGiSHf zsQgEn^*J#A{255YSAWMZJ@XyOps1(jbpjO2avcrFO@@E&5__=!gO?$XjVz+^coPuj z(bpwkV9C)TF?u$dr6((a4VLl^eWj(QQbN!)%&H@BFQQpc1X~K4&M1xiN29~mWVdGg z^7_Phi^d*I$iC=xZ4w+^wOShTGk9V&`%N-hF{C=ya*0=;d`uN<+J6vbd80BvUVMo| zXIqw~$s2`Y(0ETjNOR|Q4$UNIB>DCB=O;3*Ukg-W9(i3|u`;kUk>{8o;xCIg=4tj^ znTx=FcP2mN?tO~1l&j}|oKl>cLw*TMAYoZS3+Y$6g}C)Z%vLP(Q+Z+vDw?}!;>6!* zpTxvYwxWwcXYFVs88GIfe09HH@&D{KH};3$fs-+%+JDKHYt}`>H5==W-q^iLSmhYkt(Dk5>ok-dr}Ir$c@_in_T5iXLBp&R!tem@wn& zb+eQB=W#DrEl?UX9t3C1&ENZ7&$KlARvsf_ZDz60G!hanZ(nV&8K3iuv>nrt3|8k3 zMqLK#Pn79ls`6ytNCyPxPw292DR{JyJ@Tvbres6mQ8uBNL~a*J$R^mkIH@Y1!e50M z0&@+YomR!z3;ezpi(a=$`>qNQm09Xt?$#%ue4=?@o$r!Y)N&@xm3mCfXQyQI&hG>v z0U?7Nu?9OtJE(xgFlLo2<+PABr^MWI`FMG&Ge+f>c7-ssi*Vu|mtgIdiVgwn77%HsG)_g{ z4nEF%KtzgR&vweX*-6gZ;jRoz)yphh9%L7ws;)G zq%^M4-=8;&CM8sp#xUCZpoSPS87?q5qn1z&u{@%`SWY}uePt!6nP^cxA^b!L{V3>l zHS^Y`C+8-WDcRfKQ}kRe63253n0c-ut%i4yIuk~9f|$ z{GIO_97w63zl(V|RCO=*W(YBP9X~g#7j=G@+g})7OUX0!@d_&9k@EY6&_DTs&q^k+ zXYfbUqE=j`LEqG})oFn!IscsnFK#*~7K`chf=&a~VE8$Vve>4ZbE#f~x(HLzg z3h5}RzB&>Aj(r970mbBMEiHpeXNYB}F``M@t770`$k0d+*}O#TQ^#K`x*_p`2W)4*7 zbm~ir>+w5pMcmW3|Cz6Uu2IiqbirV3C}|B#R5RlDxGmPewpDeXDBsDhmE-fNdSY^_ z0Xx#mWny~dw9^kTt&GCbvF%CYx9;mwe<89vO<2n^B1LR@TJtpfLDZ0{2(5BYB8I&v zHuzN=>P_A=x9Fm}h@e;1PglasPFo7J8TjN&a$Z@M6%SJ96}MBzSY*{vUtJMst-r{{ zXXKa_6y$40X=7&fNTq?UvYXV@coG0t^d!!;Rps#)Y9Dp~DdV3zZl@(SJXJHrmz7X1 z+O18#jS^B61M>2djHLgN&V*5_NDO;>ogunqL#h5k7M#2;`vIaV!qpN#H;k@wb=ro} zbxWHY{|0YcMm5G($^ZW__U7SGzJLF}EoQRKAjZxZTgVKu4p{~xvbCU)Es?ylW~i)# zu^VJ5OO{ISB&4E{eP1G}kbPHK3q}3TOLgC$`+MBKOB&tMFOAgWM3DGPeri}WQXmr8gG-%2(x#Je+BHSzwz(vu38TI$P-~*3}0wZS~)Nwrl?bk1v42|?@kfsD5N?DTn@j6Ir;a+143VvLjh1eE!)Tv1)Y zt{S>xwaMq<`OGT_55>TwF8riZBavWo7kl6Aj=bm(g%$Z%?B6*PDh7BbY9+h*r{xUp z+h�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⪻ISp^B$yi1|TYx%7>W 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 Date: Mon, 19 Sep 2022 15:11:40 -0500 Subject: [PATCH 48/69] xDapp design: line edits --- src/dapps/architecture/4_topology.md | 74 +++++++++++++++++--------- src/dapps/architecture/5_relayers.md | 2 - src/diagrams/images/distributed.PNG | Bin 0 -> 63623 bytes src/diagrams/images/hub_and_spoke.PNG | Bin 0 -> 74396 bytes src/diagrams/images/mesh.PNG | Bin 0 -> 75802 bytes src/diagrams/images/ultralight_2.png | Bin 0 -> 52268 bytes 6 files changed, 50 insertions(+), 26 deletions(-) create mode 100644 src/diagrams/images/distributed.PNG create mode 100644 src/diagrams/images/hub_and_spoke.PNG create mode 100644 src/diagrams/images/mesh.PNG create mode 100644 src/diagrams/images/ultralight_2.png diff --git a/src/dapps/architecture/4_topology.md b/src/dapps/architecture/4_topology.md index b1a1512..e5711de 100644 --- a/src/dapps/architecture/4_topology.md +++ b/src/dapps/architecture/4_topology.md @@ -4,44 +4,68 @@ Topology describes how data flows through your application and defines the respo ## Ultra-light Clients -![Ultra-light client](../../diagrams/images/ultralight.png "Ultra Light Clients") +![Ultra-light client](../../diagrams/images/ultralight_2.png "Ultra Light Clients") -Ultra-light clients are often the best option when designing an MVP for your xDapp. The defining feature of an ultra-light client is the ability to support users from every chain in the Wormhole ecosystem while only having smart contracts on a single chain. +Ultra-light Clients are often the best option when designing an MVP for your xDapp. The defining feature of an Ultra-light Client is that you are able to support users from every chain in the Wormhole ecosystem while **only having smart contracts on a single chain (!!!)**. -This works by deploying a single _hub_ contract (or just using an existing Dapp) onto the hub chain. From there, add an entrypoint which supports _contract controlled transfers_ from the xAsset contracts on the hub chain. This allows your hub contract to receive tokens--and instructions for what to do with them--from other chains in the Wormhole ecosystem. +xDapps with this structure works by having a hub chain that all application contract logic is deployed on and entrypoints to receive and send Wormhole messages to remote chains. All of the Wormhole contracts deployed on other chains in the Wormhole ecosystem provide the rest of the heavy lifting to send messages across chains. -Once that's done, the hub contract performs any necessary operations and bridges any resultant tokens back to the wallet which initiated the transfer. The only on-chain components are the hub contract and a lightweight wrapper that allows the hub contract to send and receive tokens using the xAsset contracts. All other elements of this topology are off-chain and untrusted. This pushes most of the development work out of smart contracts and into client-side typescript, dramatically decreasing smart contract risk without altering the trust assumptions of your application. +You can think of the data flow across a xDapp with a Ultra-light Client as follows: + +1. End User Wallet interacts with Wormhole contracts on remote chain. +2. Wormhole contracts on remote chain generates VAA that is received by xDapp contract on hub chain. +3. xDapp contract on hub chain performs all necessary operations. +4. xDapp contract interacts with Wormhole contracts on hub chain. +5. Wormhole contracts on hub chain generates VAA that is received by End User Wallet on remote chain. **_Advantages:_** -- Risk: Very little added smart contract risk. -- Ease: Simple to develop. -- Community: Easiest way to get heterogenous ecosystem support. +- Very little added smart contract risk. +- Simple to develop. +- Easiest way to get heterogenous ecosystem support. **_Disadvantages:_** -- Latency: Because all transactions have to bridge in and out of the hub chain, each transaction incurs the finality latency of both the remote and hub chain. -- Transaction fees: There are always a grand total of three transactions. Two on the remote chain, and one on the hub chain. +- Latency: Transactions incur latencies associated with bridging into and out of both the remote and hub chain. +- Transaction Fees: There are always a grand total of three transactions. Two on the remote chain, and one on the hub chain. - Use cases: There is no place to perform trusted computation on the remote chain, so some use cases are more difficult to implement (or potentially not possible). ## Hub-and-Spoke -Hub-and-spoke models are a natural evolution of the ultra-light client. A hub contract still handles all transactions, but there is now also a contract deployed to all the remote chains. +![Hub and Spoke](../../diagrams/images/hub_and_spoke.PNG "Hub and Spoke") + +Hub and Spoke models can somewhat be thought of as the natural evolution of the ultra-light client. There is still a hub contract which handles all transactions, but there is now also a contract deployed to all the remote chains that is capable of performing some trusted computation. + +You can think of the data flow across a xDapp with a Ultra-light Client as follows: + +1. End User Wallet interacts with xDapp contracts on remote chain. +2. xDapp contracts on remote chain performs trusted computation. +3. xDapp contract on remote chain interacts with Wormhole contracts on remote chain. +4. Wormhole contract on remote chain generatesVAA that is received by xDapp contract on hub chain. +5. xDapp contract on hub chain performs all necessary operations. +6. xDapp contract interacts with Wormhole contracts on hub chain. +7. Wormhole contracts on hub chain generates VAA that is received by xDapp contract on remote chain. +8. xDapp contract on remote chain performs trusted computation. +9. xDapp contract on remote chain interacts with End User Wallet. **_Advantages:_** -- Risk: Remote contracts are lightweight and don't carry large amounts of risk. -- Flexibility: Can perform trusted checks on the remote chain (such as validating wallet balance, or any other piece of blockchain state). +- Remote contracts are lightweight and don't carry large amounts of risk. +- Can perform trusted checks on the remote chain. (Such as validating wallet balance, or any other piece of blockchain state) **_Disadvantages:_** -- Latency: Same as ultra-light clients, where each transaction incurs the finality latency of both the remote and hub chain. -- Transaction fees: There are always a grand total of three transactions, in the same fashion as ultra-light clients. -- Complexity: Requires managing multiple contracts. +- Latency (same as ultra-light clients) +- Transaction Fees +- Managing multiple contracts ## Mesh -A mesh topology is one where each chain implements the full logic for a process, such that each contract is a peer of other contracts in the trusted network and can act autonomously. +![Mesh](../../diagrams/images/mesh.PNG "Mesh") + +Mesh topologies can somewhat be thought of as the next evolution of the Hub and Spoke model. There are now contracts capable of handling all transactions for an application are deployed on all supported chains. Each contract can be thought of as a peer of other contracts in the trusted network and can act autonomously. + +This approach of deploying significant application contracts on each supported chain is how many projects such as 0x has gone multi-chain. **_Advantages:_** @@ -50,24 +74,26 @@ A mesh topology is one where each chain implements the full logic for a process, **_Disadvantages:_** -- Complexity: There are now quite a few contracts to manage, especially if they are implemented multiple times across different VMs. -- Data desync: Because each blockchain acts independently, each chain will have independent state. This can open up unwanted arbitrage opportunities and other discrepancies. +- Complexity: there are now quite a few contracts to manage, especially if they are implemented multiple times across different VMs. +- Data desync: because each blockchain acts independently, each chain will have independent state. This can open up unwanted arbitrage opportunities and other discrepancies. - Race conditions: In cases where an event is supposed to propagate through the entire system at a fixed time (for example, when closing a governance vote), it can be difficult to synchronize all the blockchains. ## Distributed -A distributed topology is one where different blockchains have different responsibilities. +![Distributed](../../diagrams/images/distributed.PNG "Distributed") -**_Advantages:_** +Distributed topologies can somewhat be thought of as the next evolution of the Mesh model. Instead of contracts that are capable of handling all transactions for an application on all supported chain, applications are broken up into separate responsibilities (i.e. data storage, user interaction, asset custody, governance) and deployed to different blockchains. -- Power: Utilizes each blockchain for their individual strengths. +Advantages: -**_Disadvantages:_** +- Power: utilize each blockchain for whatever is most optimal. -- Complexity: Requires multiple specialized smart contracts and additional on-chain processes. +Disadvantages: + +- Complexity: requires multiple specialized smart contracts, and potentially additional on-chain processes. ## Mix & Match -Different use cases have different optimal topologies, and it's possible to use different topologies for different workflows. You should not feel 'locked in' to a single topology, so consider designing each workflow independently. For example, governance workflows are generally best implemented using a hub-and-spoke topology, even if the rest of the application uses a mesh architecture. As such, your contracts will likely evolve as your xDapp evolves. +Different use cases have different optimal topologies, and it's possible to use different topologies for different workflows in your application. This means you should not feel 'locked in' to a single topology, and should instead consider designing each workflow independently. For example, governance workflows are generally best implemented using a Hub and Spoke topology, even if the rest of the application uses a Mesh architecture. As such, your contracts will likely evolve over time as your xDapp evolves and adds additional workflows. You can also progress through different topologies. A common strategy is to start off with an ultra-light client, move to a hub and spoke configuration, and then add optimizations and specialties to contracts as the need arises. diff --git a/src/dapps/architecture/5_relayers.md b/src/dapps/architecture/5_relayers.md index 5f1356c..6e82f18 100644 --- a/src/dapps/architecture/5_relayers.md +++ b/src/dapps/architecture/5_relayers.md @@ -11,9 +11,7 @@ Let's dive into a little more detail about why relayers are untrusted and what t A few key properties of VAAs: - They are publicly emitted from the Guardian Network. - - They need to be signed by the Guardian Network to be considered authentic. - - They can be verified as authentic by anyone and any Wormhole Core Contract. Relayers are untrusted as an inherent consequence of these properties. Anyone can pick up a VAA and deliver it anywhere, but no one can alter the content of the VAA without invalidating the signatures. diff --git a/src/diagrams/images/distributed.PNG b/src/diagrams/images/distributed.PNG new file mode 100644 index 0000000000000000000000000000000000000000..5c13cc38ede90a56f2c15471eae8320d067b73cc GIT binary patch literal 63623 zcmeFZ2T+t-*ENWMk~3(NMUo;pBS}C(L_iS~L}E)20YOPhQfNSlN)jarB1u$|h^Qc` zkqjb1a#BIEAVJdX(|GTH?>99yRr7ss%|BIB<@MUo{q%XxbI#stueJ8MdssMDpcby3!Cq5u_!XO|N zbJXy|tptXe(f~$7dJ^*VI|nQC_EQpv-eJAo^6W~>v)SBdQ(H9O{Vskls$DL&v$VaL zne}Y__sH7OtY^=j<-V=D(Yc=VdwXkWd);3xnok@47?|y``}41W%7=s>MaNpY2%z6Z z^YLSncK)GF@xR~OVnyWptU@@|-+Ihc4SLUU?xE$tEcaclXe+?hjTi6SRIc;e*|IAW z?N79t?k*4cZ@1-~%^G)mo>Lnj6;L?f(I>)jy-C6fAI@qu)B9>9?z}n0)$%o4ukXp8 zRi;&xKWpt0nZQ-(-Pd5BD)X`I%R2vxoh@a!;Ww}v`m6};fG5c zzZAM`t$nYfcS`kLrbt%wjI2MBpo?^xJ~JMgwH!mIakR#0u&zK{nNehN)V z3Q`_Zr+g!K)`k#!t&v@_`?+bSQlGV-d%hnVD08Rs{k=qym2%U;xY+(o-YH)DDfs@M z*Dn|pk=o_$KkQRYBj-r-zK5Lih}#Lh)GDQ(qwjD23T6L!S1^SdMP+-su$J|dUc^b=+bf0T^c0keNRmLaB{!&+d zns1u7@WD#c`PJ6`=YN;6rTn>)$~8`P$+8QQ=3nXsQ#qD+*TsBy>vj zgT5;Rg~4|GWOf<;D}&xwSI1-YtMaX?N4K*wuLz%9nkc^k6Bqoz{N^DQD;}BTKNCP= zCPvX*zVWlsn7K1afkA)p-B_gJs0L|698(-~Qh`L~sfUc^zkfV)`FuvJHtvLOx1otl zA2v#P@9f*Ta?J-zJEO}{`WPfyHjzF*^Li-wKChOnw_dDK(S4=?|Lski`n!)fk{BG$ z2&}Ygan}lRNw45P&MRcxxzhcDM#{G7gdQ*9A{kv8eo|iZ!}AMu+;tn7Pp=)QDuUY! z4&l0a@S?{ToBGR-&c*~vot$wlU;8#c97u=XHDu5s{UF(+_mE2T((~7Yq59`e=>Byv zHIE{%h0%QHfwH}=cgZL96laR(x7O!EU`+^ST^7})Y&k)r6~V>=>$XVTZ)0^_y7{hj z0gTBCmifZn#GK1JGi2yTYC=6yd)gc=iEEF(;R6rJT^-~QeK%h&ww)P{+gGb6_I}AALDAD0 zy+yCMRb{8DG|A+6dZ~Lg$zv-xV_-b#;eF@#+q5Y#QTT#_wwhSo|5njdrJ> zb=>~cTHL;FaD}SX^`&4A3F~7&e|>A47!LP)MzV+c4*R8w&1D_E4g-%qr`M|=+lyLN z6xYgjW}+d4_?e3DZ=8kS8vk^~_E!Dn3zTur`brDO5~MF1pvzc}2mBUSY2k6us&33tjTBsrAV!U_LY$xu0)zEYM$P-c%T6B%@p?dxYd^;aHSh+r#m8w2e?iS@}QtiI>u9DC^F#Vp`b z{HG`J9nwQyV-c&Lai67k1}*e5*>g}qX=A>61md`U`5&;lpbr)@Gm4IT>89W+ z?f&j4^r4jzM*AV2=eW}FEfVWcFNlErS@-{}z57h=Q(YqOel{E~XcLmry*|1~KB2NY z94LNsX#$o#tYOydBX1$9W4%fsbfE3=#jahsxIaoZj&O-jC1>1aZ5m?dd#}6TO} zfOnV#_2DDf$5tJ3EG7C3?n%m){Po$lArGbOf?p5b zJbWreNkKvPEPVr~?^1ig;fZFsAr84y4o7xo*=SFSOTD}uvs$wM)*4Ll0jjU&ersRz z-6lV^L8cscYkodH9G;sGTMb7g_D&qK4!`il()@8jr^5R;CWt7$LK3v@H2M2_wAT)( zi>McUPxV(3zEGSE@0)$M*y6fT43jGsY^!uM~d zh#ZSvc>Q_lSACh^AnZU_E{Kof(lLaG(D0C!^GJ=L`HPEhB$XCwn5-aMM6}$^mSk7B zcFDNF`gjsqwO5>!v-W@1 zPF4yf0E@f&=O0T(&@BIW_7d;+66ff6hk;kKMo7w__VdQhzKf+BKZZgdM&88|g}bHz z%IoRVhmwL67|bLm?|MN3t_hXOZMtw+&|!I4xH_0ec^Y5|=7^iU{IAbvt3T(Qtp@DF z`l4d%x690{ZhQ!3+xNKqJpb)2SB>f74!!!dodm zurhf%eoSO<5{vbi_^_&(m^Q14tGdj|>4TL;Wq%f+M_Ysxox&ND0I5IMxk}x#6CyK6 z1ONJ2xY0#{a*%oQnAF zvvV+jPpPa3{Tkgz`I4GjMJd>Jduyelx>a?X!*6vYWPWpHDCBCzrmWA;dO?%}ty+>4 zM(%0QQXtHEO$AnjB)XB@BY-Wb0?FuTvywe7B*pfun0<@y`&)t!=Pa$>!mdW$LG?cNh@X&Musp6bX$DAMSDVHVTT6~O7y z!{f|ETnuXh2eBj=z+rGpvSQuLrq%Y&)I$q^p*8gz z;0(iO=z$uDp0UzAU(;>wEwb@@>g7n3>K6I-TC0D0s^9NJ!AA$)dJY{?wqjs0k{j~5 zUb;FOhIKKNulS~Uy8Er?oJ+TvXOOh*`HdEu{G>d=b0 z@^xq5i0#bL>CW>OG=Y0)dVjCPYu?g)wQqIqv$V+V)+f=^zq&1=`h+@--0C)~p1RDn|J zC5m(Jq~0yy*$b}NjjUf_@3cfoD?!rcWM1}RYLdiIr%H^S+vWE&C4HkM!`CMsz4@Nv zjd%KxU`u+%P0$xMRQ3Ewb>i0|2ynT#2@j7(Jr%8OvGUae=aQe6aWVd$U*U~Xk_KEg&g2|gH6hutr6Dx zdJy~7cM`&;CBlB9`u#}~Sj|<4u-5xJniJ*foS){b$Z76P@|~|FD<96Fo z2l&Hf>M9rtbs?>8MM!i^G?>Wa_swN_PoPTBV!OLyi)Cve%D-kdrB!+5q8EU@v9m`g zx(ZjA58T0Soi}su?7H>*{7ZAwx8aPlHZ0e^#Hc|<-jZY@xO62{SRU(bqtBtc_FZ+G zwJzvzUJDAJgh{(Eyn1tca|Qbv|5>{4({t0;tE75^`o_nzk9VI)`LH(Uzpc3EJPzw- z!RK~By6?)%_oGaQRM*C1@?FR9F0kOQK4;`z8ofIAe#KlKc5#dvmwxuea-SPs3$^<+ zD*QG_hYCfX_-{^GjGdLc5wRu)ds5gqf4?Z)ML!dOrG>0D8BHq}O?Oso`I(%$v&Sd# zCyh_MVx7``%1*auc!V;C5a$jM;vBo7AA_*(@)tXa`B93*oXHewz@g5N9f_4%F*T_`u$9S(Ryqe*6jIcQU+OZs)!hF$Z z*LW|oi(4Kwe(h{VJ>?~q#!4r>KjR72AuEo>uZyAIyD`FJXS6t3zSkZ>Fa-B93t5N1Ez>70 zd_J+K${#{YHHz+JHQX`|hDmbRB&VKyo^w8^#!u5vRT+Vp7+J~0;^4N~^sV!$&V!!K zpDRQDQ7oq6-X4{^_iY?%YOFf)t-g>cNy3jcRYR_Ru3}roLzQ0|YexQjubBD8EXB)b z3xo}8ZKjS~8~>=PTm6$hbKxj)l~Ta5_#%luBZ%!6c4GVfCMzHDGL+kTf-EOSVaEmAw8=-@DLb^UKUqN~!+zfBGa4*2olv%&E$CgfM z{wT*-MC-4~M-b!*;V^{!CV34i=6fQde@Li512``58=mp#_F3iHo=c=A?*!RR!%x1H zxzbfrvCl)B55w!oE9^b_^ug$=r4r^=mc69cR=0&e=Xc%n`ds8k?eQdgvRe*NH|Boy z^6!d>?M93eY}_&rgWH-PS3dGa)ik^rB_nEk|1-auHcX9U;268qAZF_05e7a+YL&$% zse+pkWHj^JO03e)UNpu>xPB4POTs++YAl!XLi_xus+j}-D-|F zgvIu33yQBdT5K^^7drM!@L?`ge0$93$3Ka(&c(E%#foPKPcObIJCnI-ZogjvJJ zom|IokpaVS@l12AvDxD=zRC+$;&Uz4fzQ%%HLzDYe>o?(&7wW^q*cmu^heI(aW9HDdnW zyrXIMXI^_i`-;_I|K4(dF+(SSpgW~{35%OX=0n|MIx?)oVLDP1$ z`pdVsytRL=!p5lr;8*0Hx;9@;SAAArnPnExflH^+`P$7!OWkNb6xm`)I2Appp%|n= zAhD;=Mu!@&vb8!k54!`0$}%d^(*5D=a-!B{JQ~3`D5FpI1|xhARPfaS&lbo}`M`FS zS}+`g8ut50?LG_Y#(0sim!3a9A9~||GCJdj4a6pc-A@XqA^p&yv`pR5_1tt{rf%Y1 z#K>6io(9Hepb9n!n+HHfcfx1YPwQ&F&i5Sh zl@qooSEA;S7eDtFlb{_JxOsmwdZB%<=tay*_u&_%2ew3H-UGIlLn&N{$jAm~6GE&53rebpbZsLD~8_?%woLhdv!t3~s2DplQzF7^~d%J?Xk0b>)}TvmGa* zGd3g$!wKh5AkYLOc=oH|SpKJ(_haeY`ubrQ1il_ESQi3I1n6oFB`$-*mKTct8yeCESg|LM9ffhw~AwMkrI2)77BxV6xfEt@Fsny%j(n@hgFs4bYx%mrw}<=aC$ z0mM12S)r>vbf5gh-;}H@>g!yc+L$|}az}y_cE*HGDxh`n&z)(4unw9bG z6}?myWkiqW`k<&6N1@-55%$f@bAW}g$fcumwIFO%R|QdFz2Xs>`R6;wKakK-1H#uL zu(|M^Po4TotYABh+}Gk-u-XrWRxFxp8%e-JE&x}9DVPNK;A_n=-;qdQ1!%=}TOUn~ zP~y%T0iC+QuExRhm0c^#_#x%+IlD)B9mk}1qFnUvw_U@t+TqB!eZ&zRir!XDLL4t_ z!iduS_!LC)Lc-h$0Ie3P|9KkF4Vn?Vw#RB#Yd^nQeQSD%$Wa3uDYV2+wJ3b&2$agf zqfH-sb!P@DSqBx?j$Y;Vqu40sL^a)JEl9o{PEw=>IG zll)GpXfD@m3F~qE=|VqLkcim`@f^G%xUoL8O+_p+B_ z$&ds$@B(3?3idnOcIvNH;6JhZS`gbaQXNwFSVV>{r;Csjcb1fzIeV*; z@U7u#P>*Ox$Y{fNeL+b`qZmq!U|_G5-hq0BpzhB@NzL}KX2LstKng6;acuc7S3#uJ zRQJm$7Q4;gzxsZA5=(bY0vZY%kadN^Cj`odt{W9>SCPI5m$~RQdRMRtNo#K#Gc&6} zCt^ZknCP4F=vCj0%**6e3gvHs49Dj$-6EmAqi-Nne3(GY{CPmd=f)m3@T=derc+gN zLsSP1c~zO)BqL&zG^4mUw-YPcX%+!#Mpc?X{WtY4 zJ`rqB`|g$Xxe7W|D5DTX{oSB1Vuc~o+^zli2&CWePS@HFX~6*HF4rHQa}W`|z_Yiu zBY#k7EpE;ifXB#7|II7LP+9v7mH0hq3Y+oi(3PvDY=H32)0CpDh~y*wZCkYdcT#P` z<5z60I4*>KsMRv{Q@J!AR&`UTdIfwNtqsE_EFxVI#jSIX7TD5Sq*|3?s9Wv@*%>Cj z2Uf=Q$e^hbXByc^6Od4&F$$BT+AhcBD<${pTVwFan^5bU$0f+C?rVN>r}TG{MKh)&%@_x1mg-F9j~h& z4qz`?LmEt^!nXv>Mt+lEvYUbAQhm88amlk6WkS;c?iS`8r_Mal41#>&ys4xzWwHJH zeE)J#1<5y^*L@(x)OK$#rfxgNiEs~Xv)Uywyd6Wb(8%Yr`UAgxKSexfwJZmj_A-2= zk-RH)rAP^w#LKIFLtA@Mo|UioyiD8|f3ggokSYg|d<%>CNKW?GJVS^2f>zEZKX`8k zgxlSU^C}^ijr~d%#VR%!Q=k|%u6@uONg57xq0Ppol*n9TSMrclUsmjV6WZB6gpf{s z;n_m}6RoIxmys$A@jE~m1*3Q7Z|%P|Y}1uzLQq^lrPJ_9cHk0vMb1YVSOis)5Qj&P zReh_aIgXBMuP`}c=BTSFs}HH)1MOe#oaQECMYB@zdHUi^#}wRd5Fs0rHb{eiBHhBJccq zTJh^5Is4jkN#&_z_p4uDZ*`eot(90cwu?_~wNbTvPpKO6LpnZcE@*ff%FhTj&b|%c zccav}`);{zQVw-vP&)m(lib@bMA%h{RZ$Dsk#kOXXv;8W?>!*S`_VF7Se;xwJWnV~ zT>il#a8-d`it~ENbw0)-$-`gRVUAF_i`Goxtj)b8}LDoKv)s<0b*Dp>4ec? zn@U=iW26E&cAPgXbBjEm1O1N`xp=5Lbt00>R~JjN#1qm#g&v&@J^bR%NDJ`ldr5?< zBr~np>DXn35w1I@;tSLnfp3oUCbe+1%gsngvEe(F(a4{+*I)41*!rlaM)#MhufuQ4 zKo=PE7A+kPz)Xv)mhmwjT=?9963CwOK6@jN{K&=#zXyd9sbNta++M@CUDpbo42#f^{VOUdYWY9 ztw<+hixqQVP)XKiz(gV(Y@5flZNQ255cC<7tFtTMdKa%e8R!0WrDiVNIRj^hyJOOJ zZk07pk>#=>b>Y^=EQP3vn9$@zdHuD0q88YHU>vn8vMCh05$RPt2z-K+L8tN4#I17Ivf>3q#|vU-X@NIR)?b zP-Eyx7y<;<83Hf?0`Yx*Qm;LloZR%^0ra)(J(n!P8?K83Nw#npWs}CLr z&)<0*Omx4M*WTJ>;#0lX_1eCBPHLw$_8-gFYWw&u!E@PiPm28`-PGMGq?SJZU*s=t z;K{uwerpGH{^)#$wXgB8c}O0cEsR~u!C)1@guGzuf&f27F%pr^nSOf*Sw5`g}h*#q5Q`~u||A0 zW?et1=(9ia6kC#K4SD8urS);Jm;|wy;|?31WT?qk0#(C?BP(q9P-5`cbgBbp zzY~HR_U~yH^crzjXCUUsSElRmR&uFXXk=wo*_%$8hqnbi4yIHf76oKX-Ecbj_)$%n z-iEltSkIH?*W-iKmWpf+X|7iHU`b;gwMyvvqMUK021pCr5Ux5ApZGYeE#z?s==aYrpMM=R!`)~6tep~0qJSmHG ziSP|yv0dDink-_sm-^@az(%nOB|kC4_XR43hYFvQFBaxU4#(xbH+^K1s;#TjXzg5^z`ij<`@__Q=!4k1F?!E{Ig)L35*xjxs*>xlg#(VIBSX0TCeUr`c5GY|95*x6kN-e4PCO?xy%PVbT zjx%)o@|5bTET@s1qg=UGR~+RlM>C2KF=KirD`VnK_5h9*i#L;TV z?b*(1r!>){A@{*43SkAH-U-XPTTDic*&`_=AMe`oTc_h2YJ zJ)^N2P2*;PnWleC-%DRg|BjxSfoS1K<5Brz#?|t+G|4Hm84(o6jRkX`W~-;Chg0$g zaF;!lR1MHj-@m0dU*&P&-~n;0SreLP%Nyp{Y`ylEGgFG%E;O$n^XjfHMMd)P<{pS^$qMWqOpDjxk zy-<8`OS7nTR1up(YGIe0I#*gj^)M?7&1?dPshdWzhVsg_q=I*&osh z@2s>ZM+q7*4(|7U#5X5+$J){-_Zhik;ZgpnNbS;N=hXrf1L(IB=W%V}LcCQ9RgzW8 z#PaGKd!hv2?eF37Njn*?Hkxy~@!RhBKzCjjYhQ{Mwj;h)^Pf+X9&*&kolD?0qsbZN z&EU-=3H(;1Z0w)eiWhp)$YaJy(VJa^RsNDG%$-Izcj$%7fp;VAT- zGK=@%=v!Mqx4;Z4=j98&lz~#jct^|a&&7_1OIREAUZ077w(6d{ZY+p5;^o6mOA>2V zsg$r(u&bZjvz#h!rQWadG51G8WP?5O+j+;)zo4$wOq@BT95K!mv9v)lt5yh}VB=|Ar}hZvGbtSVNLTG8D$vARd164H7p zNh*LTfP1jDgPxTr)wR8Fg}z2Sm}TqdWO#2xw+Kgp)%8681 z2{mG>g?}B5*Db^{4wg3U$56iKgm3 z8uu)T#qJKBKAT5Ui5ViJJ2brh?RCRkd@EnxSGh)?wPdCShMu2q$K}+r>sKD^E^j6j z$$y}9!+@6n#`>M0P!f5wf&O(q$H$`~yVi63)Kc zAB6kLeNr90iDk;YOXw<+tA2=yi%j9=uNtcVWVcf3TUUa-UbrS9(ibvxM2*AjVvZwU z@e|2=^A8*}{Md!}RdNl;P)Mvj7~vL0yu~{)k(oK9y+u8QXd3E7im8GvBeK|`^cD(S2Of>R#`~;pehP}q58J%uAWbY&c0-b8s+oj2JM_uV@R=%Ep?-72yaLV}ZKNzo zx@+b%|0rB#*jj05goTWJ)r@`F6n(EBn0WGx5BuQEQ>|A94rTFp&t^NRHdQQ6VvvpH zyvcc^vJZ?z62Tmu_KroLeR3&yIM#QmvEIHgvh`tTvPAnU=U5R#v`t^wi()0_K=>>C zmcyIOX`O#$Zp*PZ3*<7{%;}-ec+`xsSy%PkWHJ(Y^ml&+*Ue|Quj-w98*AnwLp9VT zbK584byhUv#a`ZaxQ#w5d1#k%7n}Ta z@LBJ8xtO-WAC5{kB{4Wx6#wHUkTFnd-(5RGB%b5?R>-^}U!#gN{P_@2poCq0@PcP{5Lr3`#J zo&BJ`WfEew5fcM?C-!mtqjRqsAvph4mOCn)7YtCqEAxu?K^5k6?dev{zkaLps{a3f z{r7AkbG!@aaD86!4j_vljSk%5kN!z81BZ#MQ8dVd4h6lw9&gU?rI|iC@M|8t=vvG2 zUuf z!LN8o?c@f%u<~>77NfxqozXzxWFLmJN(tm$cqO!zcoQgd1sFTlQpLHy^q+LR7KiJx zQZTeugR~Ey%~ctzi;AM#tpM(vn15Uf$y$iF7%7{2p;IoJQ-*BVrxImF@=RZg0_&kt z51#hF$oplueS$kOx9ATk{i6Wg0x$dx zm}8@ms)godz>uH@@a6m@@Y9+|3N5m2ri@bgojoA)R0zN2i(GQY!}cnaBQ0U)Ix}Dv zup0k(zu@gRFnl5*=r!_NN7{jR4qsZ4m5G!n)cW(klqipp-anerOXQ73{Bfdl*`Z*2 zcTD~J5;i9kW2yrL<5$QlX`-OR6(s_K$;_$|HcC9n32!4 zLJpExZWQKUMI(!55>R#{;HRQRvM9lVc|PMlD*n4TE&7}_43fpZxT|o$SwTQnv zSBwnLI-+m*g6&WX4Y;o3BFKouUwlE9Mi6e8kkuYp`3?~Te-IwO_S&WTRsp|SjeI99 zs@pz?TQfM)J~{pzueSmc*R{V2te1kwDYu3^VFrh>?}`xNeKHPiowo_39JjeaWrgP% z4V4MDsCU6@u~`mD;u;S`%{aPYR6@)^@{(!p0rd9jj= zn;L9z*78$%MM&wewTF-FXsYUM6V4zy%m2uJQuX`S6v2k%Tsjg=u;DL7H-r^5AxF;Y z_^GmUz)M!U`n#WkNzZ+NbP|@}tcCX7;XkBO+E&2tfkPfX@V)jgv}T-Z0|nishCvJ0 z=loWLU>pa-tLw!g=oVR9It5oqB3$9%GnJ{{S649L1)OGF22s7HAQo(ydtqVF|6ZQC za!=qDQ9$8s60%^_CxMjZchD*`0xziOl$TETb1Q;-bVdKI?a64vO%xDvEv1_#x$uw2 z43l(|kI3X17aWishmMOrf>I6~CR*h|V9C_lchN-+Wm$}@V?u@#M){^2a!{7cDuTDb zH&5V6;?j8wUzU|3M2VexD9Imr8845Uj>_=`x0I0}T6))R5ji0>gvEBI?=>B2j$)Aj zU5^qGz{Z7_v^n-UfiyaTL{>V?DzwJ%cLrL9XY~|Tat+__l|!03LB7he|JY#`?rej*Y*^hEL@m8K`R!1S9}tY+yL^K;LpJYh-mToC zY2efTPxzj}z_w$y&S0E@aAyUrFEq;D%cqdonc+ilDhn~BeF2iP3YaU?I|?C-b^@khIX8_in=BML)*Cht$m7}7w8MoA(%Rux4eZT=ra75)g8 z7{B#!nizcV{jWjpp)em|y)+qvRCVn&wB@4>2_DFd9|SMyfAU2-39bBo zwDZ8rz?lZ={NKX|=Z^fh1Z)-9DNv^T zu!Rx|UtBh@BUWH7Lp_;kfO`KmKsIUn)5aBkzCER`*a?u^|24lTVnpZ0?5v3Y;0t79 z6ZhZR$hU7#Zv!3nAB!!6@s(4bEOHB+OL>Z#*$h+&y8~|QzuiP@m<|{NhuT)5tBQxv zW%hH&Pj<|Ex==c#h1wsh1ro9=v~y{ss`&nE zu6OotGGXzZ{13j6w)}7_A8cduV3G?V^uzu0xk2CZdE~Z7)}INm0R3y1fQy<5h08LJ z83M%L0V`;W|F;{y4eokC^Kcs&%?W)F|LbXGFfu&Sg{+I(iP7Ty*D8Y&fD&v5bfErH zLyMm_>TmsPvhNc%v-?hd`VYQnzqN~`3KXAea365|1+f24aL~G8j_gKOAnK-p>+oM8 z$pN)_1Bjad@$c9I0E?DM;1oFmZuYR}|FK5@N2U%g zVn8_40Kfr&G1M(9Ze4Q+nce>t0RI9Nd1h~A3Gn=%8|iuS^$wX@L*UedU{nVEV`rh9^WSZzgM4cUvH ziCr=ato;Z78W#fj;CRQ;u*>40rd23KwL4N&PqEJD?Q($9~)Bgp8B66v)g+6I0EEP@IH znJ>t_0{6GiW5B(;4VgVaNUw!j^4WHp+OHZWeH^?NL47ZT;~|py4ynqMwSXNAxRH-z zV0JWMk&r+8gds8l9H#xy@;5RP!X4?^4Q8YIeCUl8hfv-IjQo)fD3S-$EGqo0UJrOY zTU?1(e_WTm9Y}j5+cEXaX}3lWC~CamjE8Fft;JMv@8xMiw{0=pkv$ZBO5Lto+V4fR z4H{5`V;F<|>o(C7ud*DH`%XLuN+Lr2byb*X*+FDK8$rGvsHC;1Z_Pu+99-0LWJ=$v z6I!muI9E|q6&P$q-OaC1NMA&o7nxyP8V+UExYihSyxJ3QgBl&7QI--};1Xn=E=&NS zaP0zGZk>0naR}2PQUrjJ=2X{nD$fD;^Bh!fTrQ{|xVaj8SbWr0btb-=R#Etz;p?u1 zrid?^20D`RX9F4TNC4h|Ab;Cq6z2K6g5?w4^=aIG2{2Wqgj#`zIakK{ojY$()4N$!xctb;>Y{jdPzBkKu`b8%8Oc|~fB4?6V~Y%0Dc-Xb2&P;s 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 literal 0 HcmV?d00001 diff --git a/src/diagrams/images/hub_and_spoke.PNG b/src/diagrams/images/hub_and_spoke.PNG new file mode 100644 index 0000000000000000000000000000000000000000..4243e8a1750a20fe303aa638d196634a925edc72 GIT binary patch literal 74396 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 N%5v+*5~>^h-vIUKEJgqT literal 0 HcmV?d00001 diff --git a/src/diagrams/images/mesh.PNG b/src/diagrams/images/mesh.PNG new file mode 100644 index 0000000000000000000000000000000000000000..f46126f17098c43504ec6363eab864eb4b7ff9f9 GIT binary patch literal 75802 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 literal 0 HcmV?d00001 diff --git a/src/diagrams/images/ultralight_2.png b/src/diagrams/images/ultralight_2.png new file mode 100644 index 0000000000000000000000000000000000000000..0334778f63150d104da1256536f48125b867d555 GIT binary patch literal 52268 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ð1M*! zr@g%x`rUjGD|sq2&$eP?ArOp&n@98+zkYcWL(YRPR@ObEND0qR{Tsx=%Vpq@a>v1< zE+OSYSR}9+HEJrr8oiqVpN=H1e@i;vo_Jm^lCLez7JgbpHXYV+`5h1gV3DCXsPZ6+ zq{$22Z;grFv72X}FzuM49$j`c?UNaUScnVA$OOR3i(Bn zI4DeNDBJ^A{oZly_{51tLA4!#x$Nq2RHzPE+-#o$1_7NCo*fwH>*T)!Dx}{aLh!{q z>6+CBe}@c1AI#ziSa;l&G>8O4-f$D+&JpHoAP7A_7zEi%rh*KwBc#Lud_B+XwKflw z-zXAhzNRMrc=6JgTp*-yLJnGw=8Y|}uZo3VJYi=v*?s0@JHGQn_E%q#B1 zQLsy&wO*kj`IF7v>!qFoq-T@t!AS|}6gH*~6`y93qni7=j$|Kl9?E3G=;UJYQ zH4W7iG+5ue5kRS3)2stPh2wT8WN$`*PzdEYMt+SmVl3%bjdx*5s=83`-HwGwbI?`@ zHguyNDL--_s|?BA3(~YmG(~ zhXdPlt`2ErlmUui71Ra6 zMu1!*(E)~m%-iENt6n64O;t!w-dK)@5mhV3ZUI06tijT6+ZqsNT@gN}0URN6(>LLI z{T2y^+vUU`Y$mymPvYAP3R(Y#+Hi`7Qo9DU>`$Ot`i1~DAV~{nX3hV2Pk>bbCfNfR zOiuN1L1l@+$=EkWf`{9V7iQ3RSETlVem*zkr{Joej`l2^iJ@y_=;92VC~zXAsb;|< zd^Wm-c&4sG_>}|(30HW8k^a|Td9<#f{&X2|D?v+(ZmSF!q>eiN@h*q5&$q;WQ}Af_ zkAcx8xjz50kD3Z~@TtnQh7(4AePwn}1P)-GQRo=n4(nhhKR&Oc=6-$p9V?b)Cpxjd z{L0%S!&REn+@V|C-5E@Dd>zUPRMI+A)r9OQNGg9Fl?xrvfJoqvi4*cK4QCf^H zbe}HRGYToJ^AKV|EQDI=LiFzb*KjThirPl4B7{~Pk5UJCOFQVP4R#8v!U1`kU4OTk zd@rPAIZwojh=S}pJ%V=tOHAhp7kWY*sOx{cV!ivJUyDa8-~?`fg-Gu=6~77o3}P{(ypykjfo=oF^Bs038ZT;)79$CL z^WbU|Nx`JZPfevA%|P;j-yp&3`*(kSp~YCO#uIFzw2R>8a3Zn2LyGkgxMUM$v4M8T zH^U?$S`C_{;2GfcC|QFedQ5Y$9B(NE5eG~YFeA9ZJpSAQ!O6&TYt}*3%1v52@B;ft z?Q>DJS&#R!CA85+O5T4g-G!10A)7J+Jpcz2T^B(EmC0+P&>#rzZBWBz*JFnrBMgnq z;qM>7&T!#&eP*7~`cZWTm8g)SJgojQGKfgH%U>#&Kdhl)mYC1)f)t^Dahm z@J9wZP>q5GB*>HjssI9Eg-Fl{zOa(~wHHwF?5J<{>fMj7Qhum|1|e)offf_EJbkDC z5l^{UFmR8C2X_d%dXdgw9XK2==Cr>Foke@us&`QpIRu5k)NJGA|We~d!Y!5^gjCTu`@ zxM-igbmP!=LLMQIh8HPxYl>ZY!y)E9h`O(Nz964s zDm`BJ6^BCsKQ&7vJ>cxxlncaA(DSKC(-1o$mXebh;l2VSKaoo@>ia;}34p@gN{RCy3RVs35Ne$~tCG5jTjb)27PbvjQrf_3&6c)Zy88?K6sv zUx!`_3d%ZRwNogg3@vnTK+b80>wZ!Fawud$@r(i;q(ICB8z*ac1|^vhbTj|F z>uxWM0w;hKkHj40^Auhb3S9Tvf}0Maxxg&dwKU?8uYEm4=1h-;^~&7~XZBN8tn@Xw z@u|}?tFPLkRHDJBQ8y!Io3&5`J5Bi8c zs6FxA?PbVva=;~vHG-V2{%w-rh)+05i}`%-a*Y3hIu=?13V1W*z!Sn_Lf9MD>R#k4 zoKQ(1UYEW4(PBP|ygaLMKmeAv6VPUtJ1&I*l8EfcD3@_HP?k^`pMD(3T7(&#@I)ma-S<%2Yw-8|={{3Jk?b6Ca=w6pYV&8uLwnshKKO+IU z|3JXX$&eC51_dGS?axR@pTTDpc=nEO?IHzx2;Aw8Jw^8)1VkGcPM&i{`A0CqJi-w8 z^0N}6wnP&g`Sx>B&_{ai1v>>WqgY>{hNq)Fw-vhk7(}9BoIHTEEyZFPcFX2sY3J_# zhPq0IFN)04QN1vy{qXD*B2_|V#MX>Zf9_#COurhbvnHZxK#^3OiV9_+#aI-9bTqt9 z`Db&ZDkUqn^wcKU99xhr#E9pi6rSLBfb&pja8<7+2E%CwGW~Fw`QS(c{^WiDgd7kc zaG68m;C$8KCY(06;84ZEsSt&LgaG;b2Qo@ESS(!jUtlqFr!O52?_>g_C)Fpxv4NKe zC6R*A_G408Yy+b)|B#_{phVM5{a%NK2ABDNVRf zK+J(lBJU$Z9Hi@ZJIc4J0C)h-8r~xc+MEAVVn4KP=(2x2&l3o$h!qugA&w*KbU^*> zk%ju}F?a9h=dAd4@A~kw2sli)Q&#zCQ4Rv?@Uwp)65jThMw~53nhQZd;?6)>v5VY! zCt#w)4kB(P%I&I?f-*MJ43Q#4==mCh@*X@sZJH?DsswYaM^PfeRFL$n2?VGo*+Hu+ zBEZJuo!LgS(CzjUW_xF%&>9k(?A+!MGXNu=jjm=Anm9+Hx-XJ#mJvnGqG2@!b>seQ zrz~WLN`1w&hoE8F95msDuh=(tHx!t{!~d(iFAs-$WN2xVx z&jl#*wA$Va6_-ULZn5FWm$Aab#qxOw>Lb z+bY!Iz8}_(5Bk*Ph8ma*1A(A&3%UC~TOKY3EG&zQ7aEMioQDd)D4zSjprLq^gqlYd zK;{AYg8C<_ofkoeBq})4fYQ@rpT6{$hip;vDF{N`N>gEdwgpsa7{soY?g+p{nDV;- zq_2W?UH~=!@L2-9JObGJMNoj)%2E6{@>nk!e0W2{bd#|`@Jz_$`i3C1{9)V$kIu{;8YrE1-$X1Q-!|08 zq%>FlqEmj$jc3mQtah)~?t*^5Khze4$h@Ls-3eX(U>0V*XGfMBRWrwVfIkq_NU4V- z;)GD+4a%C+cHWd^UAnm9bs7AKzDZug` zUSkgFS`Wf|x9JWel00M{p@Aq4yKGbBHP(RSzC65~lKdg-v(d5;vbC9kZk(-s8xK~) zT|$I`nTeU@=LLRf;jIV*TZK{#sGGnCXnlMTyY8p=@G2oqc+7rU>@a#&=)OXSpqeRPh zCLC$R&9?U-Y#Gp=3-kJGUgQci%K6bS-5(d)P)2hzW85Z!1}pM{mD(qU+NBfLFT)@x z%zzo++rCx^_E2e%!J-CtSC*jHv~Vat^ten^3-Y%Z{Rr4g&j#9$LcmGV55U$Qw0iMy zBKd!gs5H2u-b-m8L~Qk}&vWF9L8%Es4l-6jM_z4mC91mC3c&6g@3c;H>RfZ}7r1q7 z8?{k<*JEh13VS4EmlvYU`DG6z-r5EerWV=b4FRTiEdnsPYP9~5zy(-$py0$cAD~0O zR@W5mDBiZ`pKB5p);y(OxgtPpNX<@A-I>>h3%|}mkG<$a-SA2Qq+#fclJ-jEJMB6= z#xAHT0mFh$#o?=hni*EYX8Xfq2=1z*7rB?ITh?bG>azGo4LU~ecMGp$ z9nCu50pu-h>s*cml}uLStS z#J|M6&<&z8A7)6!c2Jcnr1Oo4MM7bQRS4YluYdJl+sp=?Jt|ai2Z_mmf6iZ62A}nA z)MlEIjfVr?%A#Ie2WqEzKo<=KBf}FdcW+R=RH3H{HjKPZ|M#7n$jgBE-aC-g--f;8 z)xt7TzaYyt;&K(=rmrhq`%6NjhZi2!fO?Yhz>0*_wu-Y~cWD8j4c?ldjC7k{9dA&d zyd&r2gv6E+Dv8Q#_%Hm-shRJ9T224+N~*-dpd-5kvO4FqnyQspPG@ssX^i$T-{n6y z7eYlOq4)|bJD536K*D*kL&63O*z9tSM7Ht`N^)uY`@3Vmt4x4I)e4G|qXT$3A;Dtx1{`A>UVwB;le<;3Mw+$sRYyHBtsBvoH;um_gS5B3Zy`9wESw?$%X}QR*y)ocF*?NG58E?U@dM7nyELTYw054fGa_j!{C@@}Jc(lv zC31!{M`y1qO+xoXWT`;Xfsq{C8SPghe+I|*`JUfd^T(G;>l+Wk$aCyoKt0+JNBOxl z-XkPXjSQnV!hzE^M8#7SUW2;68qv5B09-1o5$#aP5-1AeN%{121ZYWWFRWz%TdH7@ z?D|ZjzeE064d7^kkd~Hc$ zxVYp~xGR@xUNeO4ezoJVI@1a5yIKZcyt&Kx_Ss#d3AvQw7)C=I27<$5AI^UfOGBdF z;Yf)O%qR|`LU92K6!W*IsB2OfY$TUmY5malC5~n=^9N*;^PQCe8 zb29yccw45<*hMmq7r#2%(tRa^e&#xqEvl~GVVZ*%-%U?P&)h@+Dw;gi7(~o(07&`O?ktuD zpV~F_iAOiC?0987a-~Vi>)bWm+?PVf?R6!D`}OErh9kbq-KFEpDkB3w-3xtYZDx1H z%=LoA-&ljn0GSIBt;|DitSLCR7+nnm{TEDL|C!-mQ-W@5bZHq>d<@`qTKE|QCQXG= z(>tMz>JL7H8+ZQzW6ZM|`MNzv&A9mb<$p4BJ9R*vb4jJrF9^K1SdZ-z)=3}MA*l}2 zXw^^XZbEkY!vmM*+j-&AEzl{~)`-k^;%d8jct_;BlO)PN?EfRb3gquN5^yc^k5|km zA=LK|gq{(Ak(PL0Vv1H;;w=#@T{}xkZ`GqyOcmtyq2DnfC;c*f{>upHr|%kxB(he# zW~jV{lr+%}PXCx_q=THQ@ayohxLCR;@imhsa~Yi`Yjo`AWSDK$(@1M=L*&napsfDUaUWuF z^48Uvfsm=gjjEwrJMQ!z`uff6g;3kItO)t9+(rar$pL9*1?~}smxnrjICavRT}|Kf zhU@7?vH0itUw1yLX*fs6bH3y8^KU1=#PSFqN?bl(B06}TXy!;PVT|SQ&n# z=U5u>zO-vVE{VLRHfhq!BMY7 zT*Iq~jH))zH{hDcBHOt1f}5wuM8jyYG#Jd5mVtCA$ZqSh+#(mVl<^)y@0XKo-Q24$ zCEG`H-6xzBskU~=lrzFNGPO0N^-MKg%oJ-n67>63tm)ReI*nFj>(udE*P@d=gpaN! z?G7pJS%2Der7&T~=u=9Uxqy1@KPGWqiIu8(J>qUgE{=?9r(7ks>HLhl&U^8_S!YvJ zA%jPTj$W6RvT$3FCrkl_k=z!W$SE$L2~M4737U#>OQ!s?BzG^BAflzi*8IBu_+r6L z9ooe8dgSSGOouYJ}`g6D@ju`ieEHF|MclJyMad#DZMmR5$f|Q>)jX+ zIxAW~`XQ>M%$wn?1>dtEHF2k12d-GhwFr@AztgeUdL`Vm7>^Ya8q^m(C25-!$cFv0 zwUY~j;Rp+(k^cvajU3DWnpt$VR>R?|{t*+rzVFe*BWv|8!K^L$HC>TSQT6salY;aUpj&eU3nbd0QuZ}-+3m5rvv-@+lEQ%Dw@(rRi0^a{H^?{5>2#XbJCcg}x))hLwQpBYOc=>Lh! zp5HgR;Try!o?(Kq-tVfEs#ACvzwcPX6H8xh+RT&~`n{&ULRf=M{QTqD6_?JibP6Sg z<;2{+(SQkmq{DtnGFU4;-@?ei@~+L(h>s3a@n;toTOwu0;&~QU!)3>D6}d9;1;Z5k zFQpMo;``*B1(J@D&ia37Er+<_vk!%B+%H{!5vTov=Q zAFPV`^y0cz=!% z!*2i)zjK9&|1tVA2;fMwaG+_ZRH4k-oD^Zj!iq*V%GabH`2&uJ6z_kxzbJp|YA*?Q z=VrwAt7k|fhOfzQ?MhoROMMW5{6f=57mYcDU05w zk0XY9vyXZvH4_i+a$P#9dAn&K(@yyPy7=SvRXk;*WOLWZ zjPmAKhZxMgG9_i6t3@e>ur7ktW1Y5WlUX5*El)pX0a<|=(Cn9r(+>%7i?18CWF`w$ z2NxXls2gdMiN)-<+&jTrw?Yhv&spgom5W+>>=#>@o}uM7L6UO1&yu@R3pV?EWp37&Z!Ts#d{Y~29Ag#l&b7k2%_m&mXtdt++QprJ zQ=5{CixXC@JtGz;LonC)&D~lsg^!LnoMfr*iMKnjP&Y~Z&Sq#b-WHxhuD8|6CyP!h z9=KAc#u=G^pSNJdORdc_w&IYp!hySW{@YiS>Sz;oY27U;U&*?HpOCC~J}dU{7^mSV zSvEf9kxyXd-K_I*wJ-bZeyrg=SD;s?=SR7W~&aL>|Ji3ORe586cg>%`4g*o;{6|`<9i?J-S-x{ zB5*&8FZOqMlRr6cu1aw8BVohFVFjmj%3;#TY3X^(xg0!)(4iTrEq$lfcO#>V1^DoF z_3ZsvEh2UkKSM4Vb3Aw}kT3B-Q{788@rCyNu^$fzh!NJX-~77^T+Q1L#!5!tb2fuJ zW7Xw&*m%0FG>-Vtr}<9Q-h*MZ7z{lF-5~}mZc1a5lfxxvJDzjm7VZ067-?6cN*3DA zG_P(abnLIT)OOepLl%&ehF2gEQK;3#eA87j^;SjunTcLH!x43F)tu+7~;ov9^*rA2sf9~&*a@*9|1E;Rfbf@#M-F1V8@Y3vt_|D^d~Z~o@yLZ{256 zxVz8&lQw2YO+Kc(43?D=7OsMXqf-WhVN-_@Hv8=3s^l|eLICMdvig9t9manGSSl$5 zoZ`B|kC(4B|L53ZU_=_Aj)Ex=ImQE9n@g8!F$--FVq5M5fPU^tcHm18TxKdWVnT;S z#dr*6f|ouwf zH9(2c29<%?=wFJVR&_H-tnwJjY-D7aQPJdRD6=vfGX|uN6zDbHM?(?Nl~gaNhIQ)XNqYe zKy&%=wY0Q1p%vgX4Q}J^rR}<%o$mToijcY6I_)X*B#dp?ENP**W zm9#buxrdOgqs^OhRFa9n{!a2B26Kp$t4SE%4#~-`Z1>HgJ=_?hCl#J(l7rG>45q<3 z0w{}~4oZB=fsvBLemU|;eF1i*-tiq907(^RnHLgWggi7?ND)XA&QHh|qW7xdbNwmuwWFufyG&gVsb>@7TY z@g1a(;)0uh?tEw5i3#mGD3v%*HqZO|C*cfm<66MR)QcwGmr@M1rm`?r4ZIpBl z3lFw_8k^L>Pc}x=CGe+~;9PCL5u(J5#`l>`uN6XIz2>UA3 zd6JuxFMVgChPm;Lg6rUgl|ZcJ%9kC%2Ep*&D)?$Ug@+$8iKmtL&SbsT+x7NT+XPqn z+R}{F$jC@0l!~fq9@~{PF?FjceshHsA{nyMXs!1X6eLd3$&|^iM|uxtf@T70O9!~j znYQyQ{{A$&1`xOa55&iZtykL;8jz#M-g;}b>)jeZJ-q5}X@jGrKZRwB@4bN66IcpP z&Eo1LEIM&h?oam>CV*E?0YCGmuB^bd?;E|(8f9ALH%`_x*ufc}_Y?*H*|<4p_YmmH zNqLw-PlpuS^D08*a~c>-g)uYh?UTPl(khUs)9rV3Y^CTa9oAcQU00Pp>=tsJ?TZ#L zW>N3$X>E_AJ-p@*wNZHq4r`z;ti8oT5U@WQ`&zfiAb?ov0RqunsDV8aIljxUG;H-s zhQWtvT5w%G}r(c=9+oFc@gL7PkL!i;zT;sG`m@=_8OxUblGX zE0twcT8v7OcJ?e9bvBx=Gqg*_8i2)buj^W|DzHCWGcM!jLOI`e98SO% z*<-e)XKoNnxd(-d=D-;K7^-L`kb)_BW0o`imrV1WT3O5`a*x`{D#X;=<;6@nbC}7( z7j2&RSZ(Q@G58Z-Sn_hJpOCk{PF9!VQ*aSOE2ewk2;Vz9{R4l$BC*y~=1jfEVs@>K zzNPdbSh*$P?R7GY1*R_xshyPF4(G;9p(Aloy^8PyiIP=@TNG8X?h-$oA7Jo}0fTD; zvQS_BSE5l|kUhS~H~KtegcwY_y~(e^vcHBOKPYFL+;;*Ao;zhSMW|=vf2Y6*hpoCM z!eM`PQ8@EE83OZUQg-yjttpk-x*V^jULH8+XM*j!kTq_uz|DEQ6w<0F!A|n7FF^e7 zA+R_9=a3U%I<>Ej7O)5TS?6@=V<^C)?{vrVFh(o%aL3Ukm6h{T+)hu zVmIFXX&OFnajr7iq8t>v0rzt$8rZ-0&Wz~G(UyJN;p0+;s6}_{urSb76hy_uTq;~_ zNAU$<@kZa#ef;}#0N9^E6!ot7J$@gQkDhzr9{8e|9S-n!<(V8Tqi3+Qv$KcQtkZQP zABY++u%%uqgn6cs&2G2RmykXLTcCGOp}X~UbM>)A>*dNlZ~Nfe>0P&THmA=RcvSDc z^cYC|S8#r>CIs#OZzl&Kk`M0PZO{(<_nQOfoF04*RRb^m*PFi!whM*#9POS`_532W z4KmJsaB1n*x8HA0n;RfU_}u5gjSpy9DlSd%isF~3&2oiZB{X<%!D^v97HcL1;ywfL z(Ois|vbGXv-v-km&Wv%%Moy`*9U;qF)Ym!JzVYq<@=8pdJ_9#|Nr|+59g=xa>@HMye}O~^ z_AV}2h{0_BwA;MEMO<*LySAb7*0y&s_h6-nYPOr}o)TGWP;-uf0Sir%?VB9Dx{cM$ zZ+OO!6wm;)O9Nov)<_mK2iryQRPQG!Alv6^zp=XbATV{t-n{0D%f3goX+OV0PE;Y3 z_|K_LOXKhk~8@vFWy;c#k{Ge$Q_CEl<8{@D5 literal 0 HcmV?d00001 From 38663bfbf927012d3ff0987cd86c8b7cf19d49aa Mon Sep 17 00:00:00 2001 From: Eric Wong Date: Mon, 19 Sep 2022 15:13:20 -0500 Subject: [PATCH 49/69] line edit --- src/SUMMARY.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/SUMMARY.md b/src/SUMMARY.md index ea263bf..eee31b6 100644 --- a/src/SUMMARY.md +++ b/src/SUMMARY.md @@ -22,7 +22,7 @@ - [VAA: Verified Action Approval](./wormhole/4_vaa.md) - [Guardian Network](./wormhole/5_guardianNetwork.md) - [Relayers](./wormhole/6_relayers.md) - - [Portal xAsset Bridge](./wormhole/7_portalTokenBridge.md) + - [xAsset Bridge](./wormhole/7_TokenBridge.md) - [Wormchain](./wormhole/8_wormchain.md) - [xDapp Design](./dapps/architecture/0_dappDesign.md) From 61b36535335006c93ab004cf0ef741c0353f6991 Mon Sep 17 00:00:00 2001 From: Eric Wong Date: Mon, 19 Sep 2022 15:17:57 -0500 Subject: [PATCH 50/69] line edit --- src/technical/env/troubleshooting.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/technical/env/troubleshooting.md b/src/technical/env/troubleshooting.md index 248ff28..529aa19 100644 --- a/src/technical/env/troubleshooting.md +++ b/src/technical/env/troubleshooting.md @@ -37,7 +37,7 @@ brew install tilt ## Clone Wormhole Repo and Start Tilt ```sh -git clone --branch dev.v2 https://github.com/certusone/wormhole.git +git clone --branch dev.v2 https://github.com/wormhole-foundation/wormhole.git ``` ```sh From ca412a48b9234d1df322abe6fab55b4ad4d746fb Mon Sep 17 00:00:00 2001 From: Eric Wong Date: Mon, 19 Sep 2022 15:47:58 -0500 Subject: [PATCH 51/69] wormhole: line edit --- src/wormhole/6_relayers.md | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/src/wormhole/6_relayers.md b/src/wormhole/6_relayers.md index 3433c34..cbc17bc 100644 --- a/src/wormhole/6_relayers.md +++ b/src/wormhole/6_relayers.md @@ -44,7 +44,7 @@ Specialized relayers solve the UX problems of client-side relayers by adding a b In this model, relayers either listen directly to the Guardian Network via a spy (called **Spy Relaying**), or will simply provide a REST endpoint to accept a VAA which should be relayed (called **REST Relaying**). Once a relayer has the VAA, it simply performs any necessary off-chain calculations and submits the VAA to the required destination. -An important consideration when developing a specialized relayer is that the relayer is still considered untrusted. VAAs are public and can be submitted by anyone, so the off-chain relayer should not do any computation which is considered "trusted." However, doing things like deterministic data transforms, waiting for gas prices to drop, or various forms of 'batching' can be very useful cost-reduction strategies that do not impact security. +An important consideration when developing a specialized relayer is that the relayer is still considered untrusted. VAAs are public and can be submitted by anyone, so developers should not rely on off-chain relayers to perform any computation which is considered "trusted." However, things that do not impact security like deterministic data transforms, waiting for gas prices to drop, or various forms of 'batching' can be very useful cost-reduction strategies. Specialized Relayers have the following advantages: @@ -57,11 +57,13 @@ However, they also have a couple notable downsides - They add a backend relaying component which is responsible for liveness - They can complicate fee-modeling, as relayers are responsible for paying target chain fees. -Because relayers are responsible for liveness, they become another dependency component for the xDapp. If the relayers are all down, your application has an outage. This is similar to how dependencies like the frontend, blockchain nodes, blockchains, third party APIs, etc, can also cause outages. +Due to specialized relayers being such a common solution, here is a reference implementation provided in the main Wormhole repository which stands up the infrastructure needed to provide a Spy interface, a REST interface and the ability to interact with each blockchain in the ecosystem. If you plan to develop a specialized relayer, consider starting from the reference implementation and add modifications as needed. -To mitigate this, multiple relayers can be run in order to provide redundancy. It's also possible to design specialized relaying solutions which are entirely decentralized, such that there are a network of relayers which run based off economic incentives. However, creating a robust model for decentralized relaying is generally application-specific and complex. +Because relayers are responsible for liveness, they become another dependency component (similar to the frontend, blockchain nodes, blockchains, third party APIs, etc.) for the xDapp. If the relayers are all down, your application has an outage. -Due to specialized relayers being such a common solution, there is a reference implementation provided in the main Wormhole repository which stands up the infrastructure needed to provide a Spy interface, a REST interface and the ability to interact with each blockchain in the ecosystem. If you plan to develop a specialized relayer, consider starting from the reference implementation and add modifications as needed. +To mitigate this, multiple relayers can be run in order to provide redundancy either by (1) the xDapp team or (2) a decentralized network based off economic incentives. _However, creating a robust model for decentralized relaying is generally application-specific and complex._ + +Overall, Specialized Relayers add a backend component that is responsible for liveness, but can simplify the user experience. It's generally recommend if your goal is a highly-polished user experience and you want to have better control over message delivery. # Generic Relayers @@ -82,6 +84,8 @@ And potential downsides: - They have less gas efficiency - They may not be supported on all chains +Overall, Generic Relayers simply both the developer and user experience. It's generally recommend if your goal is a highly-polished user experience and increase decentralization of the xDapp. + --- In the next section, we'll discuss the Portal Ecosystem contracts that allow xAssets to be created and moved freely around the ecosystem. From e28ee15ac0898fbfa54c5141d756b2243376e5f5 Mon Sep 17 00:00:00 2001 From: Eric Wong Date: Mon, 19 Sep 2022 17:29:57 -0500 Subject: [PATCH 52/69] evm: line edits --- src/technical/evm/coreLayer.md | 21 +++++-------------- src/technical/evm/overview.md | 15 +++++++++----- src/technical/evm/xassetLayer.md | 35 ++------------------------------ 3 files changed, 17 insertions(+), 54 deletions(-) diff --git a/src/technical/evm/coreLayer.md b/src/technical/evm/coreLayer.md index 3fbf098..d4defcb 100644 --- a/src/technical/evm/coreLayer.md +++ b/src/technical/evm/coreLayer.md @@ -4,9 +4,6 @@ This section will explain how to properly interact with the Wormhome Core Layer ## Configuring the Interface -- Get the interface from the repo -- Instantiate it with the core layer contract address for your blockchain. This is dependent on your development ecosystem and blockchain. This value is usually stored in your contract state. - [Here](https://github.com/wormhole-foundation/wormhole/blob/dev.v2/ethereum/contracts/interfaces/IWormhole.sol) is the interface for applications to interact with Wormhole's Core Contract to publish messages or verify and parse a received message. Instantiating the interface will depend on your development ecosystem and blockchain. The Wormhole Core Layer contract address is usually stored in your contract address. @@ -20,34 +17,25 @@ IWormhole core_bridge = IWormhole(wormhole_core_bridge_address); ## Primary functions -The Wormhole Core Layer effectively only has two important interactions - (1) the ability to emit messages, and (2) the ability to parse and verify messages which originated from other chains. +The Wormhole Core Layer effectively only has two important interactions -- (1) emit messages, and (2) parse and verify messages that originated from other chains. ### Emitting a Message -- Always uses publish message -- explain every argument -- be sure to mention batch VAAs - To emit a message, always use `publishMessage` which takes in the following arguments: 1. `nonce` (uint32): a number assigned to each message - The `nonce` gives the receving contract a mechanism by which to make sure it does not double process messages - Batch VAAs allow for easier compsability and better gas efficiency of multiple messages. To do this, messages emitted within the same transaction with the same nonce are bundled together into one aggregate message. Messages with a nonce of `0` will not be included in a Batch VAA and emitted individually. -2. `Consistency` (uint8): the number of blocks that Guardians will wait before signing a message. +2. `Consistency` (uint8): the number of blocks that Guardians will wait before signing a message - Each blockchain has different finality periods. In general, higher consistencies mean more security against blockchain reorgs. - [Here]() are the consistency levels by blockchain that are used by the xAsset layer to have a high level of guarantee against reorgs. -3. `Payload` (bytes[]): raw bytes to emit. +3. `Payload` (bytes[]): raw bytes to emit - It is up to the emitting contract to properly define this arbitrary set of bytes. `publishMessage` will output a `sequence` (uint64) that is used in conjunction with `emitterChainID` and `emitterAddress` to retrive the generated VAA from the Guardian Network. ### Parsing and Verifying a Message -- Explain how a message should be taken in as a byte array -- Be cognizant of Batch VAAs vs Single VAAs -- entrypoint code vs module code. If using single VAAs, these are the same, but batch VAAs are more complicated to verify -- remember to collect your gas after all the VAAs have been verified - Parsing and Verifying a message will depend on the type of VAA that your application expects: a Single VAA or a Batch VAA. For either message type, remember to collect gas fees associated with submitting them on-chain after all VAAs have been verified. @@ -56,7 +44,8 @@ For either message type, remember to collect gas fees associated with submitting To properly parse and verify a single VAA, always use `parseAndVerifyVM` which takes in one argument: `encodedVM` (bytes). This function will return three arguments: -1. `vm` (VM): Structured data that reflects the content of the VAA. A breakdown of this message format is described in the [VAA](../../wormhole/4_vaa.md) section. It is up to the receving contracting to properly parse this data structure for the necessary information. +1. `vm` (VM): Structured data that reflects the content of the VAA. + - A breakdown of this message format is described in the [VAA](../../wormhole/4_vaa.md) section. It is up to the receving contracting to properly parse this data structure for the necessary information. 2. `valid` (bool): Boolean that reflects whether or not the VAA was properly signed by the Guardian Network 3. `reason` (string): Explanatory error message if a VAA is invalid, or an empty string if it is valid. diff --git a/src/technical/evm/overview.md b/src/technical/evm/overview.md index faaa23d..f5b735b 100644 --- a/src/technical/evm/overview.md +++ b/src/technical/evm/overview.md @@ -1,9 +1,14 @@ # EVM -explain that this is not a beginners guide to using EVM ecosystems, but rather a guide for how to use wormhole for experienced EVM developers. +**Disclaimer**: This section is written as a guide for how to use Wormhole for experienced EVM developers. If you are new to using the EVM ecosystem, it's recommended for you to get started with a tutorial like [this](). -For our purposes, EVM refers to any blockchain in the Wormhole ecosystem utilizing the EVM contracts of Wormhole. This includes not only Ethereum, but also blockchains like Polygon and Avax, as well as EVM+ environments like Acala. +For our purposes, EVM refers to any blockchain in the Wormhole ecosystem that utilizes EVM contracts of Wormhole -- this includes blockchains beyond Ethereum such as Polygon or Avalanche, as well as EVM+ evnrionments such as Acala. -Link to some recommended tooling -ethers library, -foundry is preferred and increasingly used by the core repository, truffle and hardhat also options +### Recommended Tooling for EVM + +**Development** +- [Ethers](https://docs.ethers.io/v5/) library + +**Testing** +- [Foundry](https://github.com/foundry-rs/foundry) is preferred and increasingly used by the core repository +- [Truffle](https://trufflesuite.com/) and [Hardhat](https://hardhat.org/) are also options diff --git a/src/technical/evm/xassetLayer.md b/src/technical/evm/xassetLayer.md index 04dcb89..c66e9b0 100644 --- a/src/technical/evm/xassetLayer.md +++ b/src/technical/evm/xassetLayer.md @@ -4,12 +4,10 @@ This section will explain how to properly interact with the Wormhome Core Layer # Configuring the interface -- Same as instantiating any other EVM interface / Core Layer / NFT Layer, - [Here]() is the interface for applications to interact with Wormhole's xAsset layer. //TODO link to file in github so doesn't become stale -Instantiating the interface will depend on your development ecosystem and blockchain. The Wormhole Core Layer contract address is usually stored in your contract address. +Instantiating the interface will depend on your development ecosystem and blockchain. The Wormhole xAsset contract address is usually stored in your contract address. Below is an example line of code to instantiate the interface for mainnet Ethereum: @@ -20,26 +18,14 @@ ITokenBridge token_bridge = ITokenBridge(wormhole_token_bridge_address); ## Registering New Tokens -- Only needs to be done once globally ever -- Reattesting will update metadata, can be done over and over -- Generally not done by the xDapp contract, but instead by an off-chain process or by hand -- Probably don't need code examples, as it's not advised to do this on chain for most usecases - Attesting a token from EVM needs to happen once per token. If a token is not attested, it will not be claimable until so. However, there are no restrictions to reattesting a token; doing so will update the metadata. -It is not advised to attest tokens on-chain for most usecases. - -To attest a token by an off-chain process, you can either do it by hand through one of the Token Bridge UIs (for example [Portal](https://www.portalbridge.com/#/transfer)) or using the JS SDK. +It is not advised to attest tokens on-chain for most usecases. To attest a token by an off-chain process, you can either do it by hand through one of the Token Bridge UIs (for example [Portal](https://www.portalbridge.com/#/transfer)) or using the [JS SDK](https://www.npmjs.com/package/@certusone/wormhole-sdk). // If we want to show how to attest with JS SDK, have the example [here](https://book.wormhole.com/development/portal/evm/attestingToken.html) ## Basic Transfer -- Code example for transferring an ERC-20, explain all the args, WORMHOLE ADDRESSES -- Transferring native currency is a special case. Use transferETH for the native currency regardless of which EVM you are on. -- Use this only if you are transferring to an end user wallet. If you're transferring to a smart contract (which you control), use transferWithPayload instead. Explain why -- Mention public relayers, unwrapping conventions, fee schedule. - Basic transfer should only be used if you are transferring messages to an end user wallet. If the end destination is a contract, you should only use Contract Controlled Transfers (described below). It is important to note the transferring native currency is a special case of the Basic Transfer. As such, a different function call is provided as a QoL improvement when initiating and completing the transfer messaging when unwrapping the ETH is desired. @@ -86,9 +72,6 @@ completeTransferAndUnwrapETH(VAA); ## Contract Controlled Transfer -- Differences when compared to a basic transfer: has a payload, can only be redeemed if msg.sender == the recipient, doesn't have a relayer fee field because of the redemption restriction. -- Always use this when the destination is a contract - For any message transfers where the destination is a contract, you should always used Contract Controlled Transfers. There are a few main differences between Contract Controlled Transfers and Basic Transfers: @@ -137,17 +120,3 @@ token_bridge.completeTransferWithPayload(VAA); // To complete transfer of native currency completeTransferAndUnwrapETHWithPayload(VAA); ``` - -## Redemption - -### Basic Token Redemption - -- completeTransfer for everything -- completeTransfer and unwrap Eth only for the case where unwrapping ETH is desired - -### Contract Controlled Transfer redemption - -- completeTransferWithPayload for everything, -- completeTransferAndUnwrapETH as a QoL function. Unwraps the ETH before giving it to the contract. - -LUMPED THIS INTO PREVIOUS SECTIONS From f8cc94e6c80553e791e309dbfcfbd84df7a79c86 Mon Sep 17 00:00:00 2001 From: Eric Wong Date: Mon, 19 Sep 2022 18:00:10 -0500 Subject: [PATCH 53/69] evm: line edits --- src/technical/evm/nftLayer.md | 61 +++++++++++++++++++------------- src/technical/evm/xassetLayer.md | 2 +- 2 files changed, 38 insertions(+), 25 deletions(-) diff --git a/src/technical/evm/nftLayer.md b/src/technical/evm/nftLayer.md index 257efde..53b7e6c 100644 --- a/src/technical/evm/nftLayer.md +++ b/src/technical/evm/nftLayer.md @@ -2,42 +2,55 @@ This section will explain how to properly interact with the NFT Layer in an EVM ecosystem. +## Configuring the interface + +[Here]() is the interface for applications to interact with Wormhole's NFT layer. +//TODO link to file in github so doesn't become stale + +Instantiating the interface will depend on your development ecosystem and blockchain. The Wormhole xAsset contract address is usually stored in your contract address. + +Below is an example line of code to instantiate the interface for mainnet Ethereum: + +``` +address private wormhole_NFT_bridge_address = address(0x6FFd7EdE62328b3Af38FCD61461Bbfc52F5651fE); +INFTBridge NFT_bridge = INFTBridge(wormhole_nft_bridge_address); ``` -// contracts/NFTBridge.sol -// SPDX-License-Identifier: Apache 2 -pragma solidity ^0.8.0; +## Transferring a NFT -import "./NFTBridgeGetters.sol"; -import "./NFTBridgeStructs.sol"; +The Wormhole NFT Bridge only supports tokens that support the ERC-721 interface and will create a wrapped NFT with identical metadata. How this is implemented varies by ecosystem. -interface INFTBridge is NFTGetters { +**Note**: Unlike xAssets, there is no attestation required for bridging NFTs. - function transferNFT(address token, uint256 tokenID, uint16 recipientChain, bytes32 recipient, uint32 nonce) external payable returns (uint64 sequence); +To transfer a NFT, there are three steps: - function completeTransfer(bytes memory encodeVm) external ; +1. Initiate the NFT transfer + - This function call will return a `sequence` (uint64) that is used in the VAA retrieval step - function encodeTransfer(NFTBridgeStructs.Transfer memory transfer) external pure returns (bytes memory encoded); - - function parseTransfer(bytes memory encoded) external pure returns (NFTBridgeStructs.Transfer memory transfer); - - function onERC721Received(address operator, address, uint256, bytes calldata) external view returns (bytes4); +``` +transferNFT(tokenAddress, tokenID, recipientChain, recipient, nonce); +``` +2. Retrieve the emitted VAA. + - _Note: NFT Transfer VAAs are retrieved from the Guardian Network by the `emitterChainID`, `emitterAddress`, and `sequence`_ +``` +const emitterAddr = getEmitterAddressEth(network.NFTBridgeAddress); +const seq = parseSequenceFromLogEth(tx, network.bridgeAddress); +const vaaURL = `${config.wormhole.restAddress}/v1/signed_vaa/${network.wormholeChainId}/${emitterAddr}/${seq}`; +let vaaBytes = await (await fetch(vaaURL)).json(); +while (!vaaBytes.vaaBytes) { + console.log("VAA not found, retrying in 5s!"); + await new Promise((r) => setTimeout(r, 5000)); //Timeout to let Guardiand pick up log and have VAA ready + vaaBytes = await (await fetch(vaaURL)).json(); } - ``` -## Overview +3. Complete the NFT transfer -Only ERC-721 supported, creates a wrapped NFT with identical metadata. Implementation varies by ecosystem +``` +completeTransfer(VAA); +``` -## Sending an NFT - -- Unlike xAssets, there is no registration process -- Code example to send - -## Receiving an NFT - -- completeTransfer code examples +## Additional utility //TODO NFT verification and perhaps some other common usecases diff --git a/src/technical/evm/xassetLayer.md b/src/technical/evm/xassetLayer.md index c66e9b0..71d32f3 100644 --- a/src/technical/evm/xassetLayer.md +++ b/src/technical/evm/xassetLayer.md @@ -2,7 +2,7 @@ This section will explain how to properly interact with the Wormhome Core Layer in an EVM ecosystem. -# Configuring the interface +## Configuring the interface [Here]() is the interface for applications to interact with Wormhole's xAsset layer. //TODO link to file in github so doesn't become stale From 9b8cc2b3cf2c2bf31ee17f5ce908d131ac38cdd7 Mon Sep 17 00:00:00 2001 From: chase-45 Date: Mon, 19 Sep 2022 21:04:13 -0400 Subject: [PATCH 54/69] more line edits, additions, etc --- src/SUMMARY.md | 4 +- src/technical/env/wlv.md | 13 +++--- src/technical/evm/coreLayer.md | 10 ++++- src/technical/evm/nftLayer.md | 27 ++++++----- src/technical/evm/overview.md | 14 +++--- src/technical/evm/xassetLayer.md | 47 ++++++++++++++------ src/technical/relayer/genericRelayer.md | 0 src/technical/relayer/guardianNetwork.md | 9 ---- src/technical/relayer/pluginRelayers.md | 16 +------ src/technical/relayer/specializedRelayers.md | 25 +++++++++++ 10 files changed, 101 insertions(+), 64 deletions(-) create mode 100644 src/technical/relayer/genericRelayer.md delete mode 100644 src/technical/relayer/guardianNetwork.md create mode 100644 src/technical/relayer/specializedRelayers.md diff --git a/src/SUMMARY.md b/src/SUMMARY.md index eee31b6..b22a71b 100644 --- a/src/SUMMARY.md +++ b/src/SUMMARY.md @@ -61,8 +61,8 @@ - [Relayers](./technical/relayer/overview.md) - - [Plugin Relayer](./technical/relayer/pluginRelayers.md) - - [Guardian Network](./technical/relayer/guardianNetwork.md) + - [Generic Relayers](./technical/relayer/genericRelayer.md) + - [Specialized Relayers](./technical/relayer/pluginRelayers.md) - [Wormhole Typescript SDK](./development/portal/overview.md) - [EVM]() diff --git a/src/technical/env/wlv.md b/src/technical/env/wlv.md index d40eaad..3a1529c 100644 --- a/src/technical/env/wlv.md +++ b/src/technical/env/wlv.md @@ -8,14 +8,15 @@ Here's a succinct list of the pros and cons of the environment, so you can decide if it's the right fit for you. -- Pros +### Pros - - Lightweight, low system resource demand. - - Fast iteration times. - - Can be added into an existing blockchain development setup. +- Lightweight, low system resource demand. +- Fast iteration times. +- Can be added into an existing blockchain development setup. -- Cons - - You may end up reinventing the tilt/testnet environment as you add more components. +### Cons + +- You may end up reinventing the tilt/testnet environment as you add more components. ## Setting up Wormhole Local Validator diff --git a/src/technical/evm/coreLayer.md b/src/technical/evm/coreLayer.md index d4defcb..5d3d176 100644 --- a/src/technical/evm/coreLayer.md +++ b/src/technical/evm/coreLayer.md @@ -6,7 +6,7 @@ This section will explain how to properly interact with the Wormhome Core Layer [Here](https://github.com/wormhole-foundation/wormhole/blob/dev.v2/ethereum/contracts/interfaces/IWormhole.sol) is the interface for applications to interact with Wormhole's Core Contract to publish messages or verify and parse a received message. -Instantiating the interface will depend on your development ecosystem and blockchain. The Wormhole Core Layer contract address is usually stored in your contract address. +Instantiating the interface will depend on the contract address of your development ecosystem and blockchain. Below is an example line of code to instantiate the interface for mainnet Ethereum: @@ -45,12 +45,16 @@ For either message type, remember to collect gas fees associated with submitting To properly parse and verify a single VAA, always use `parseAndVerifyVM` which takes in one argument: `encodedVM` (bytes). This function will return three arguments: 1. `vm` (VM): Structured data that reflects the content of the VAA. - - A breakdown of this message format is described in the [VAA](../../wormhole/4_vaa.md) section. It is up to the receving contracting to properly parse this data structure for the necessary information. + - A breakdown of this message format is described in the [VAA](../../wormhole/4_vaa.md) section. Aside from the header information, which can be considered 'trusted', it is up to the recipient contract to properly parse the remaining payload, as this contains the verbatim message sent from the emitting contract. 2. `valid` (bool): Boolean that reflects whether or not the VAA was properly signed by the Guardian Network 3. `reason` (string): Explanatory error message if a VAA is invalid, or an empty string if it is valid. + diff --git a/src/technical/evm/nftLayer.md b/src/technical/evm/nftLayer.md index 53b7e6c..5be528d 100644 --- a/src/technical/evm/nftLayer.md +++ b/src/technical/evm/nftLayer.md @@ -4,10 +4,14 @@ This section will explain how to properly interact with the NFT Layer in an EVM ## Configuring the interface -[Here]() is the interface for applications to interact with Wormhole's NFT layer. -//TODO link to file in github so doesn't become stale +[Here](https://github.com/wormhole-foundation/wormhole/tree/dev.v2/ethereum/contracts/interfaces) is the interface for applications to interact with Wormhole's NFT layer. -Instantiating the interface will depend on your development ecosystem and blockchain. The Wormhole xAsset contract address is usually stored in your contract address. + + +Instantiating the interface will depend on the contract address of your development ecosystem and blockchain. Below is an example line of code to instantiate the interface for mainnet Ethereum: @@ -18,21 +22,22 @@ INFTBridge NFT_bridge = INFTBridge(wormhole_nft_bridge_address); ## Transferring a NFT -The Wormhole NFT Bridge only supports tokens that support the ERC-721 interface and will create a wrapped NFT with identical metadata. How this is implemented varies by ecosystem. +The Wormhole NFT Bridge only supports tokens compliant with the ERC-721 interface, and functions by creating a 'wrapped NFT' with identical metadata. How this is implemented varies by ecosystem. **Note**: Unlike xAssets, there is no attestation required for bridging NFTs. To transfer a NFT, there are three steps: 1. Initiate the NFT transfer - - This function call will return a `sequence` (uint64) that is used in the VAA retrieval step + - This function call will return a `sequence` (uint64) that is used in the VAA retrieval step ``` transferNFT(tokenAddress, tokenID, recipientChain, recipient, nonce); ``` -2. Retrieve the emitted VAA. - - _Note: NFT Transfer VAAs are retrieved from the Guardian Network by the `emitterChainID`, `emitterAddress`, and `sequence`_ +2. Retrieve the emitted VAA from the Guardian Network. (Usually done by a relayer) + - _Note: NFT Transfer VAAs are retrieved from the Guardian Network by the `emitterChainID`, `emitterAddress`, and `sequence`_ + ``` const emitterAddr = getEmitterAddressEth(network.NFTBridgeAddress); const seq = parseSequenceFromLogEth(tx, network.bridgeAddress); @@ -45,12 +50,14 @@ while (!vaaBytes.vaaBytes) { } ``` -3. Complete the NFT transfer +3. Complete the NFT transfer by submitting the resultant VAA to the target chain. ``` completeTransfer(VAA); ``` -## Additional utility + diff --git a/src/technical/evm/overview.md b/src/technical/evm/overview.md index f5b735b..e1b540b 100644 --- a/src/technical/evm/overview.md +++ b/src/technical/evm/overview.md @@ -2,13 +2,15 @@ **Disclaimer**: This section is written as a guide for how to use Wormhole for experienced EVM developers. If you are new to using the EVM ecosystem, it's recommended for you to get started with a tutorial like [this](). -For our purposes, EVM refers to any blockchain in the Wormhole ecosystem that utilizes EVM contracts of Wormhole -- this includes blockchains beyond Ethereum such as Polygon or Avalanche, as well as EVM+ evnrionments such as Acala. +For our purposes, EVM refers to any blockchain in the Wormhole ecosystem that utilizes EVM contracts of Wormhole -- this includes blockchains beyond Ethereum such as Polygon or Avalanche, as well as EVM+ environments such as Acala. ### Recommended Tooling for EVM -**Development** -- [Ethers](https://docs.ethers.io/v5/) library +**Frontend Development** -**Testing** -- [Foundry](https://github.com/foundry-rs/foundry) is preferred and increasingly used by the core repository -- [Truffle](https://trufflesuite.com/) and [Hardhat](https://hardhat.org/) are also options +- [Ethers](https://docs.ethers.io/v5/) an excellent, widely used library for using web-based wallets to interact with EVM blockchains. + +**Contract Development and Testing** + +- [Foundry](https://github.com/foundry-rs/foundry) is the preferred library for the Core Repository. It has tooling for development, testing, compilation, and even the ability to duplicate mainnet environments for development. +- [Truffle](https://trufflesuite.com/) and [Hardhat](https://hardhat.org/) are also viable alternatives. diff --git a/src/technical/evm/xassetLayer.md b/src/technical/evm/xassetLayer.md index 71d32f3..9e8fe45 100644 --- a/src/technical/evm/xassetLayer.md +++ b/src/technical/evm/xassetLayer.md @@ -20,34 +20,44 @@ ITokenBridge token_bridge = ITokenBridge(wormhole_token_bridge_address); Attesting a token from EVM needs to happen once per token. If a token is not attested, it will not be claimable until so. However, there are no restrictions to reattesting a token; doing so will update the metadata. -It is not advised to attest tokens on-chain for most usecases. To attest a token by an off-chain process, you can either do it by hand through one of the Token Bridge UIs (for example [Portal](https://www.portalbridge.com/#/transfer)) or using the [JS SDK](https://www.npmjs.com/package/@certusone/wormhole-sdk). +It is not advised to attest tokens on-chain for most usecases. To attest a token by an off-chain process, you can either do it by hand through one of the Token Bridge UIs (for example [Portal](https://www.portalbridge.com/#/register)) or using the [JS SDK](https://www.npmjs.com/package/@certusone/wormhole-sdk). + + ## Basic Transfer -Basic transfer should only be used if you are transferring messages to an end user wallet. If the end destination is a contract, you should only use Contract Controlled Transfers (described below). +Basic transfer should only be used if you are transferring messages to an end user wallet. If the end destination is a contract, you should only use Contract Controlled Transfers (described below). It is important to note the transferring native currency is a special case of the Basic Transfer. As such, a different function call is provided as a QoL improvement when initiating and completing the transfer messaging when unwrapping the ETH is desired. To transfer a token, there are four steps: + 1. Approve the Token Bridge to spend that token on our behalf. - - _Note: Tokens in EVM usually denote up to 18 decimals places. However. Wormhole normalizes this to **8** decimals._ + - _Note: Tokens in EVM usually denote up to 18 decimals places. However. Wormhole normalizes this to **8** decimals._ + ``` contractAddress.approve(token_bridge_address, amt); ``` + 2. Transfer the token to create the transfer VAA. - - This function call will return a `sequence` (uint64) that is used in the VAA retrieval step. - - _Note: Wormhole addresses are 32 bytes for standardization across the different blockchains within the Wormhole ecosystem._ + - This function call will return a `sequence` (uint64) that is used in the VAA retrieval step. + - _Note: Wormhole addresses are 32 bytes for standardization across the different blockchains within the Wormhole ecosystem._ + ``` // To initiate transfer of normal ERC-20s token_bridge.transferTokens(tokenAddress, amount, recipientChain, recipient, arbiterFee, nonce); // To initiate transfer of native currency -token_bridge.wrapAndTransferETH(recipientChain, recipient, arbiterFee, nonce); +token_bridge.wrapAndTransferETH(recipientChain, recipient, arbiterFee, nonce); ``` + 3. Retrieve the emitted VAA. - - _Note: Basic Transfer VAAs are retrieved from the Guardian Network by the `emitterChainID`, `emitterAddress`, and `sequence`_ + - _Note: Basic Transfer VAAs are retrieved from the Guardian Network by the `emitterChainID`, `emitterAddress`, and `sequence`_ + ``` const emitterAddr = getEmitterAddressEth(network.tokenBridgeAddress); const seq = parseSequenceFromLogEth(tx, network.bridgeAddress); @@ -61,7 +71,8 @@ while (!vaaBytes.vaaBytes) { ``` 4. Complete the transfer using the VAA. - - _Note: VAAs are retrieved from the + - \_Note: VAAs are retrieved from the + ``` // To complete transfer of normal ERC-20s token_bridge.completeTransfer(VAA); @@ -75,6 +86,7 @@ completeTransferAndUnwrapETH(VAA); For any message transfers where the destination is a contract, you should always used Contract Controlled Transfers. There are a few main differences between Contract Controlled Transfers and Basic Transfers: + - message contains both tokens and an arbitrary payload - can only be redeemed by a specified contract address - does not have a relayer fee field because of the redemption restriction above. @@ -82,23 +94,29 @@ There are a few main differences between Contract Controlled Transfers and Basic As was the case with Basic Transfers, transferring native currency is a special case for Contract Controlled Transfers as well. As such, a different function call is provided as a QoL improvement when initiating and completing the transfer messaging when unwrapping the ETH is desired. The process of sending a Contract Controlled Transfer is very similar to that of a Basic Transfer: + 1. Approve the Token Bridge to spend that token on our behalf. - - _Note: Tokens in EVM usually denote up to 18 decimals places. However. Wormhole normalizes this to **8** decimals._ + - _Note: Tokens in EVM usually denote up to 18 decimals places. However. Wormhole normalizes this to **8** decimals._ + ``` contractAddress.approve(token_bridge_address, amt); ``` + 2. Transfer the token to create the transfer VAA. - - This function call will return a `sequence` (uint64) that is used in the VAA retrieval step. - - _Note: Wormhole addresses are 32 bytes for standardization across the different blockchains within the Wormhole ecosystem._ + - This function call will return a `sequence` (uint64) that is used in the VAA retrieval step. + - _Note: Wormhole addresses are 32 bytes for standardization across the different blockchains within the Wormhole ecosystem._ + ``` // To initiate transfer of normal ERC-20s token_bridge.transferTokesWithPayload(tokenAddress, amount, recipientChain, recipient, nonce, payload); // To initiate transfer of native currency -token_bridge.wrapAndTransferETHWithPayload(recipientChain, recipient, nonce, payload); +token_bridge.wrapAndTransferETHWithPayload(recipientChain, recipient, nonce, payload); ``` + 3. Retrieve the emitted VAA. - - _Note: Basic Transfer VAAs are retrieved from the Guardian Network by the `emitterChainID`, `emitterAddress`, and `sequence`_ + - _Note: Basic Transfer VAAs are retrieved from the Guardian Network by the `emitterChainID`, `emitterAddress`, and `sequence`_ + ``` const emitterAddr = getEmitterAddressEth(network.tokenBridgeAddress); const seq = parseSequenceFromLogEth(tx, network.bridgeAddress); @@ -112,7 +130,8 @@ while (!vaaBytes.vaaBytes) { ``` 4. Complete the transfer using the VAA. - - _Note: VAAs are retrieved from the + - \_Note: VAAs are retrieved from the + ``` // To complete transfer of normal ERC-20s token_bridge.completeTransferWithPayload(VAA); diff --git a/src/technical/relayer/genericRelayer.md b/src/technical/relayer/genericRelayer.md new file mode 100644 index 0000000..e69de29 diff --git a/src/technical/relayer/guardianNetwork.md b/src/technical/relayer/guardianNetwork.md deleted file mode 100644 index f3fbe46..0000000 --- a/src/technical/relayer/guardianNetwork.md +++ /dev/null @@ -1,9 +0,0 @@ -# Guardian Network - -If you're totally homerolling a relayer solution, you'll need to interact with the guardian network directly. - -link to spydk. Use this to tie directly into the guardian network and receive events. If you're particularly ambitious, you can even join the guardian network as a 'spy' which is the term for a non-validating guardian. - -VAAs can also be pulled directly from any public node on the guardian network using REST endpoints. This is a really simple way to grab known VAAs. - -- provide the REST endpoints for this diff --git a/src/technical/relayer/pluginRelayers.md b/src/technical/relayer/pluginRelayers.md index d4eaf05..5b0034a 100644 --- a/src/technical/relayer/pluginRelayers.md +++ b/src/technical/relayer/pluginRelayers.md @@ -1,15 +1 @@ -- Link to Plugin relayer codebase - -- Recommend plugin relayers as the starting point for anyone developing specialized relayers -- plugin relayers provide a kernel for relayer development. Handles management of all the necessary hotwallets, provides the necessary typescript interfaces for dealing with each ecosystems, and provides an easy integration point to connect to the guardian network - -- Follow the instructions provided in the codebase in order to get it running -- to develop a plugin, simply implement the interface provided at [here] -- diagram explaining the flow -- Listener component listens to either incoming REST calls or the guardian network for relevant VAAs, -- When a relevant VAA is detected, your listener code is responsible for producing an action. -- This action is stored in a redis instance -- The executor portion of the interface is responsible for consuming interactions which are provided by the listener. -- The executor is handed an action and is responsible for consuming that action and (optionally) queuing up more actions - -- additional configuration info can be found in the README of the codebase. +# Specialized Relayers diff --git a/src/technical/relayer/specializedRelayers.md b/src/technical/relayer/specializedRelayers.md new file mode 100644 index 0000000..c082a34 --- /dev/null +++ b/src/technical/relayer/specializedRelayers.md @@ -0,0 +1,25 @@ +- Link to Plugin relayer codebase + +- Recommend plugin relayers as the starting point for anyone developing specialized relayers +- plugin relayers provide a kernel for relayer development. Handles management of all the necessary hotwallets, provides the necessary typescript interfaces for dealing with each ecosystems, and provides an easy integration point to connect to the guardian network + +- Follow the instructions provided in the codebase in order to get it running +- to develop a plugin, simply implement the interface provided at [here] +- diagram explaining the flow +- Listener component listens to either incoming REST calls or the guardian network for relevant VAAs, +- When a relevant VAA is detected, your listener code is responsible for producing an action. +- This action is stored in a redis instance +- The executor portion of the interface is responsible for consuming interactions which are provided by the listener. +- The executor is handed an action and is responsible for consuming that action and (optionally) queuing up more actions + +- additional configuration info can be found in the README of the codebase. + +# Homerolling a Relayer + +If you're totally homerolling a relayer solution, you'll need to interact with the guardian network directly. + +link to spydk. Use this to tie directly into the guardian network and receive events. If you're particularly ambitious, you can even join the guardian network as a 'spy' which is the term for a non-validating guardian. + +VAAs can also be pulled directly from any public node on the guardian network using REST endpoints. This is a really simple way to grab known VAAs. + +- provide the REST endpoints for this From 4e64b3528cfcf641066beba35638e15ba820f042 Mon Sep 17 00:00:00 2001 From: chase-45 Date: Mon, 19 Sep 2022 21:29:20 -0400 Subject: [PATCH 55/69] more line edits --- src/wormhole/6_relayers.md | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/src/wormhole/6_relayers.md b/src/wormhole/6_relayers.md index cbc17bc..1cd334e 100644 --- a/src/wormhole/6_relayers.md +++ b/src/wormhole/6_relayers.md @@ -57,7 +57,13 @@ However, they also have a couple notable downsides - They add a backend relaying component which is responsible for liveness - They can complicate fee-modeling, as relayers are responsible for paying target chain fees. -Due to specialized relayers being such a common solution, here is a reference implementation provided in the main Wormhole repository which stands up the infrastructure needed to provide a Spy interface, a REST interface and the ability to interact with each blockchain in the ecosystem. If you plan to develop a specialized relayer, consider starting from the reference implementation and add modifications as needed. +Due to specialized relayers being such a common solution, an extensible relayer (called the plugin relayer) has been provided in the main Wormhole repository. The plugin relayer stands up most of the requisite infrastructure for relaying, so that you only need to implement the logic which is specific to your application. + +If you plan to develop a specialized relayer, consider starting from the plugin relayer [found here](https://github.com/wormhole-foundation/wormhole/tree/dev.v2/relayer). + + Because relayers are responsible for liveness, they become another dependency component (similar to the frontend, blockchain nodes, blockchains, third party APIs, etc.) for the xDapp. If the relayers are all down, your application has an outage. @@ -81,11 +87,11 @@ Generic relayers have the following benefits: And potential downsides: - They require all calculations to be done on-chain - - They have less gas efficiency + - They sometimes have less gas efficiency - They may not be supported on all chains -Overall, Generic Relayers simply both the developer and user experience. It's generally recommend if your goal is a highly-polished user experience and increase decentralization of the xDapp. +Overall, Generic Relayers simplify both the developer and user experience. They're a great choice if they cover all your usecases. --- -In the next section, we'll discuss the Portal Ecosystem contracts that allow xAssets to be created and moved freely around the ecosystem. +In the next section, we'll discuss the xAsset module, which allows xAssets to be created and moved freely around the ecosystem. From b0dfa25fe747f107531bafed1211c72b7602e511 Mon Sep 17 00:00:00 2001 From: chase-45 Date: Tue, 20 Sep 2022 10:19:57 -0400 Subject: [PATCH 56/69] topology edits --- src/dapps/architecture/4_topology.md | 31 +++++++++++++--------------- 1 file changed, 14 insertions(+), 17 deletions(-) diff --git a/src/dapps/architecture/4_topology.md b/src/dapps/architecture/4_topology.md index e5711de..3e7c14e 100644 --- a/src/dapps/architecture/4_topology.md +++ b/src/dapps/architecture/4_topology.md @@ -8,15 +8,15 @@ Topology describes how data flows through your application and defines the respo Ultra-light Clients are often the best option when designing an MVP for your xDapp. The defining feature of an Ultra-light Client is that you are able to support users from every chain in the Wormhole ecosystem while **only having smart contracts on a single chain (!!!)**. -xDapps with this structure works by having a hub chain that all application contract logic is deployed on and entrypoints to receive and send Wormhole messages to remote chains. All of the Wormhole contracts deployed on other chains in the Wormhole ecosystem provide the rest of the heavy lifting to send messages across chains. +xDapps with this structure work by having a hub chain that all application contract logic is deployed to and entrypoints which receive and send Wormhole messages to remote chains. The network of Wormhole contracts deployed on other chains across the ecosystem provide the rest of the heavy lifting to send messages across chains. You can think of the data flow across a xDapp with a Ultra-light Client as follows: -1. End User Wallet interacts with Wormhole contracts on remote chain. -2. Wormhole contracts on remote chain generates VAA that is received by xDapp contract on hub chain. -3. xDapp contract on hub chain performs all necessary operations. -4. xDapp contract interacts with Wormhole contracts on hub chain. -5. Wormhole contracts on hub chain generates VAA that is received by End User Wallet on remote chain. +1. The end user's wallet interacts with Wormhole contracts on remote chain. +2. The Wormhole contracts on remote chain generate a VAA which is received by your xDapp contract on the hub chain. +3. Your xDapp contract on the hub chain performs all necessary operations. +4. Your xDapp contract interacts with Wormhole contracts on the hub chain. +5. The Wormhole contracts on hub chain generate a VAA which is sent back to the end user's wallet on the remote chain. **_Advantages:_** @@ -36,17 +36,14 @@ You can think of the data flow across a xDapp with a Ultra-light Client as follo Hub and Spoke models can somewhat be thought of as the natural evolution of the ultra-light client. There is still a hub contract which handles all transactions, but there is now also a contract deployed to all the remote chains that is capable of performing some trusted computation. -You can think of the data flow across a xDapp with a Ultra-light Client as follows: +You can think of the data flow across a Hub-and-Spoke system as follows: -1. End User Wallet interacts with xDapp contracts on remote chain. -2. xDapp contracts on remote chain performs trusted computation. -3. xDapp contract on remote chain interacts with Wormhole contracts on remote chain. -4. Wormhole contract on remote chain generatesVAA that is received by xDapp contract on hub chain. -5. xDapp contract on hub chain performs all necessary operations. -6. xDapp contract interacts with Wormhole contracts on hub chain. -7. Wormhole contracts on hub chain generates VAA that is received by xDapp contract on remote chain. -8. xDapp contract on remote chain performs trusted computation. -9. xDapp contract on remote chain interacts with End User Wallet. +1. The end user's wallet interacts with your (lightweight) remote contracts on remote chain. +2. The remote contracts perform any necessary trusted computation. +3. The remote contracts use Wormhole to generate a VAA, which is consumed by the hub contract. +4. The hub contract performs all necessary operations. +5. The hub contract uses Wormhole to send a message back to the original remote contract. +6. The remote contract takes whatever action is needed to finish the process. **_Advantages:_** @@ -65,7 +62,7 @@ You can think of the data flow across a xDapp with a Ultra-light Client as follo Mesh topologies can somewhat be thought of as the next evolution of the Hub and Spoke model. There are now contracts capable of handling all transactions for an application are deployed on all supported chains. Each contract can be thought of as a peer of other contracts in the trusted network and can act autonomously. -This approach of deploying significant application contracts on each supported chain is how many projects such as 0x has gone multi-chain. +This is historically the most popular methodology for going cross-chain. It's very attractive in ecosystems like EVM or Cosmos, where a single smart contract can simply be deployed across many different blockchains. **_Advantages:_** From 8d5fc871ff1533b90c78055569480b0d37884873 Mon Sep 17 00:00:00 2001 From: chase-45 Date: Tue, 20 Sep 2022 10:21:40 -0400 Subject: [PATCH 57/69] fix --- src/dapps/architecture/4_topology.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/dapps/architecture/4_topology.md b/src/dapps/architecture/4_topology.md index 3e7c14e..af8dfa2 100644 --- a/src/dapps/architecture/4_topology.md +++ b/src/dapps/architecture/4_topology.md @@ -38,7 +38,7 @@ Hub and Spoke models can somewhat be thought of as the natural evolution of the You can think of the data flow across a Hub-and-Spoke system as follows: -1. The end user's wallet interacts with your (lightweight) remote contracts on remote chain. +1. The end user's wallet interacts with your (lightweight) remote contracts. 2. The remote contracts perform any necessary trusted computation. 3. The remote contracts use Wormhole to generate a VAA, which is consumed by the hub contract. 4. The hub contract performs all necessary operations. From 7dd8c5aa8c5f480699c0c603f3349857d1e94e09 Mon Sep 17 00:00:00 2001 From: Eric Wong Date: Tue, 20 Sep 2022 13:11:38 -0500 Subject: [PATCH 58/69] xDapp: small edit --- src/diagrams/images/hub_and_spoke.PNG | Bin 74396 -> 63160 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/src/diagrams/images/hub_and_spoke.PNG b/src/diagrams/images/hub_and_spoke.PNG index 4243e8a1750a20fe303aa638d196634a925edc72..2ebb74e56b412244f8b6bf1b9efd451ad83e9a9c 100644 GIT binary patch literal 63160 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 IIVCg!0F)pe3;+NC literal 74396 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 N%5v+*5~>^h-vIUKEJgqT From 779e7f0d5b761ebcf1d0eb9a7f838d43d1ced337 Mon Sep 17 00:00:00 2001 From: Eric Wong Date: Tue, 20 Sep 2022 13:12:31 -0500 Subject: [PATCH 59/69] env: line edits --- src/technical/env/environments.md | 6 +++--- src/technical/env/testnet.md | 2 +- src/technical/env/tilt.md | 4 ++-- src/technical/env/troubleshooting.md | 18 +++++++++--------- 4 files changed, 15 insertions(+), 15 deletions(-) diff --git a/src/technical/env/environments.md b/src/technical/env/environments.md index 192d46b..c537087 100644 --- a/src/technical/env/environments.md +++ b/src/technical/env/environments.md @@ -2,7 +2,7 @@ The bare minimum Wormhole environment is just a blockchain linked up to a Guardian node. There are quite a few ways of accomplishing this, and if you're just looking to get your feet wet, you should try whichever sounds easiest. -However, as you get deeper into cross-chain development you'll likely find you have a growing number of components, dependencies, and teammates in the picture making your development environment more complex. Here are some of the considerations you should have in mind when choosing a development environment which will be well suited for your xDapp. +However, as you get deeper into cross-chain development, you'll likely find yourself with a growing number of components, dependencies, and teammates in the picture making your development environment more complex. Here are some of the considerations you should have in mind when choosing a development environment which will be well suited for your xDapp. ### What components do I need now? What components will I need in the future? @@ -10,9 +10,9 @@ However, as you get deeper into cross-chain development you'll likely find you h ### What are my dependencies? -- If your smart contracts have no dependencies, it may be possible for you to develop in a vacuum. However, if you're working on a fledgling blockchain and trying to integrate with other applications which are also in development, you may have no choice but to work in testnet alongside other development teams. +- If your smart contracts have no dependencies, it may be possible for you to develop in a vacuum. -- Just because you have dependencies doesn't mean you automatically have to develop in testnet or mainnet. Often times it's relatively trivial to redeploy your dependencies in Tilt, or to use something like [Foundry](https://github.com/foundry-rs/foundry) to create a development version of an existing testnet or mainnet. +- If your smart contracts does have dependencies, there are several options that range from deploying your dependencies in Tilt or use something like [Foundry](https://github.com/foundry-rs/foundry) to simulate an existing testnet or mainnet in your local devnet to working to working directly in testnet alongside other teams. ### How am I going to collaborate? diff --git a/src/technical/env/testnet.md b/src/technical/env/testnet.md index 1fbddbc..2e64931 100644 --- a/src/technical/env/testnet.md +++ b/src/technical/env/testnet.md @@ -2,7 +2,7 @@ Wormhole testnet is spread across many of the most popular testnet blockchains. -The primary reason to use Wormhole testnet is in order to simplify the management of your dependent contracts. This will vary from blockchain to blockchain. +The primary reason to use Wormhole testnet is to simplify the management of your dependent contracts. This will vary from blockchain to blockchain. For example, some blockchain ecosystems have the standard that their contracts are closed-source, and there are no tools to fork mainnet. Other ecosystems, such as EVM, have tools like [foundry](https://github.com/foundry-rs/foundry), which allow you to hardfork the mainnet ecosystem into a local development node. diff --git a/src/technical/env/tilt.md b/src/technical/env/tilt.md index 6afe77b..ed896c3 100644 --- a/src/technical/env/tilt.md +++ b/src/technical/env/tilt.md @@ -4,9 +4,9 @@ [Tilt](https://tilt.dev/) is part of the official Docker ecosystem. It's a tool which allows developers to easily configure a Kubernetes environment for development. -However, in the context of Wormhole, the 'Tilt' usually refers to the development environment used by the [Wormhole Core Repository](https://github.com/wormhole-foundation/wormhole). This environment uses Tilt to stand up all the tools necessary to build across multiple blockchains. It has docker images for all the common items encountered during cross-chain developing, including: +However, in the context of Wormhole, 'Tilt' usually refers to the development environment used by the [Wormhole Core Repository](https://github.com/wormhole-foundation/wormhole). This environment uses Tilt to stand up docker images for all the tools necessary to build across multiple blockchains, including: -- All the supported blockchains / ecosystems of Wormhole +- All the Wormhole supported blockchains / ecosystems - A Guardian Node - Relayers - Databases, Redis diff --git a/src/technical/env/troubleshooting.md b/src/technical/env/troubleshooting.md index 529aa19..2953f66 100644 --- a/src/technical/env/troubleshooting.md +++ b/src/technical/env/troubleshooting.md @@ -2,7 +2,7 @@ Tilt, Kubernetes, and Docker may be new tools for developers entering the Wormhole ecosystem. This section is meant to provide some additional support when setting up the Wormhole Tilt environment. -## macOS Install +# macOS Install ## Prerequisites @@ -14,13 +14,13 @@ Having `homebrew` on your system makes the installation really straightforward. From there, all the other installs are one-liners. -## Install Go +### 1. Install Go ```sh brew install go ``` -## Install Docker +### 2. Install Docker ```sh brew install docker @@ -28,13 +28,13 @@ brew install docker After installation, go into Docker settings and switch ON `kubernetes`. Also configure Docker to have 4 CPUs and ~16GB of RAM. -## Install Tilt +### 3. Install Tilt ```sh brew install tilt ``` -## Clone Wormhole Repo and Start Tilt +### 4. Clone Wormhole Repo and Start Tilt ```sh git clone --branch dev.v2 https://github.com/wormhole-foundation/wormhole.git @@ -48,9 +48,9 @@ tilt up You'll be able to access the Tilt UI at `localhost:10350` -## Linux & WSL Install +# Linux & WSL Install -### Setup Script +## Script Setup If you're using a Debian distro, you should run the [dev-setup.sh](https://github.com/wormhole-foundation/wormhole/blob/dev.v2/scripts/dev-setup.sh) script. Even if you're not using Debian, this script still contains the main steps for setup. @@ -71,11 +71,11 @@ Also, make absolutely sure that you set up Docker as a non-root user. [https://docs.docker.com/engine/install/ubuntu/#installation-methods](https://docs.docker.com/engine/install/ubuntu/#installation-methods) -### 3. (Docker Desktop Install) +### 3a. (Docker Desktop Install) Enable Kubernetes by going into Settings > Kubernetes -### 3. (Non Docker Desktop) +### 3b. (Non Docker Desktop) Install [`minikube`](https://minikube.sigs.k8s.io/docs/start/). From bed0891d1c4614ef4b8577a77e69d64ab55dad23 Mon Sep 17 00:00:00 2001 From: chase-45 Date: Tue, 20 Sep 2022 22:41:14 -0400 Subject: [PATCH 60/69] tooling, other env changes, added near contracts --- src/reference/contracts.md | 207 ++++++++++++++++++----------------- src/technical/env/tooling.md | 47 ++++++-- 2 files changed, 143 insertions(+), 111 deletions(-) diff --git a/src/reference/contracts.md b/src/reference/contracts.md index 497e96b..7b62d18 100644 --- a/src/reference/contracts.md +++ b/src/reference/contracts.md @@ -1,126 +1,129 @@ # Contracts -Here you can find the addresses for the deployed contracts on all the chains that Wormhole supports, including testnet. -The SDK makes these addresses available in the `CONTRACTS` constant. +Here you can find the addresses for the deployed contracts on all the chains that Wormhole supports, including testnet. + +The [constants](https://github.com/wormhole-foundation/wormhole/blob/dev.v2/sdk/js/src/utils/consts.ts) of the Wormhole SDK always has the most up-to-date contract addresses, along with additional useful constants. Check there if something you're looking for isn't found here. ## Mainnet ### Core Bridge -| Chain Name | Wormhole Chain ID | Network ID | Address | -| :-------------------- | :---------------- | :----------- | :------ | -| Solana | 1 | mainnet-beta | worm2ZoG2kUd4vFXhvjh93UUH596ayRfgQ2MgjNMTth | -| Ethereum | 2 | 1 | 0x98f3c9e6E3fAce36bAAd05FE09d375Ef1464288B | -| Terra Classic | 3 | columbus-5 | terra1dq03ugtd40zu9hcgdzrsq6z2z4hwhc9tqk2uy5 | -| Binance Smart Chain | 4 | 56 | 0x98f3c9e6E3fAce36bAAd05FE09d375Ef1464288B | -| Polygon | 5 | 137 | 0x7A4B5a56256163F07b2C80A7cA55aBE66c4ec4d7 | -| Avalanche (C-Chain) | 6 | 43114 | 0x54a8e5f9c4CbA08F9943965859F6c34eAF03E26c | -| Oasis (Emerald) | 7 | 4262 | 0xfE8cD454b4A1CA468B57D79c0cc77Ef5B6f64585 | -| Aurora | 9 | 1313161554 | 0xa321448d90d4e5b0A732867c18eA198e75CAC48E | -| Fantom | 10 | 250 | 0x126783A6Cb203a3E35344528B26ca3a0489a1485 | -| Karura | 11 | 686 | 0xa321448d90d4e5b0A732867c18eA198e75CAC48E | -| Acala | 12 | 787 | 0xa321448d90d4e5b0A732867c18eA198e75CAC48E | -| Klaytn | 13 | 8217 | 0x0C21603c4f3a6387e241c0091A7EA39E43E90bb7 | -| Celo | 14 | 42220 | 0xa321448d90d4e5b0A732867c18eA198e75CAC48E | -| Terra | 18 | phoenix-1 | terra12mrnzvhx3rpej6843uge2yyfppfyd3u9c3uq223q8sl48huz9juqffcnh | +| Chain Name | Wormhole Chain ID | Network ID | Address | +| :------------------ | :---------------- | :----------- | :-------------------------------------------------------------- | +| Solana | 1 | mainnet-beta | worm2ZoG2kUd4vFXhvjh93UUH596ayRfgQ2MgjNMTth | +| Ethereum | 2 | 1 | 0x98f3c9e6E3fAce36bAAd05FE09d375Ef1464288B | +| Terra Classic | 3 | columbus-5 | terra1dq03ugtd40zu9hcgdzrsq6z2z4hwhc9tqk2uy5 | +| Binance Smart Chain | 4 | 56 | 0x98f3c9e6E3fAce36bAAd05FE09d375Ef1464288B | +| Polygon | 5 | 137 | 0x7A4B5a56256163F07b2C80A7cA55aBE66c4ec4d7 | +| Avalanche (C-Chain) | 6 | 43114 | 0x54a8e5f9c4CbA08F9943965859F6c34eAF03E26c | +| Oasis (Emerald) | 7 | 4262 | 0xfE8cD454b4A1CA468B57D79c0cc77Ef5B6f64585 | +| Aurora | 9 | 1313161554 | 0xa321448d90d4e5b0A732867c18eA198e75CAC48E | +| Fantom | 10 | 250 | 0x126783A6Cb203a3E35344528B26ca3a0489a1485 | +| Karura | 11 | 686 | 0xa321448d90d4e5b0A732867c18eA198e75CAC48E | +| Acala | 12 | 787 | 0xa321448d90d4e5b0A732867c18eA198e75CAC48E | +| Klaytn | 13 | 8217 | 0x0C21603c4f3a6387e241c0091A7EA39E43E90bb7 | +| Celo | 14 | 42220 | 0xa321448d90d4e5b0A732867c18eA198e75CAC48E | +| NEAR | 15 | | contract.wormhole_crypto.near | +| Terra | 18 | phoenix-1 | terra12mrnzvhx3rpej6843uge2yyfppfyd3u9c3uq223q8sl48huz9juqffcnh | ### Token Bridge -| Chain Name | Wormhole Chain ID | Network ID | Address | -| :-------------------- | :---------------- | :----------- | :------ | -| Solana | 1 | mainnet-beta | wormDTUJ6AWPNvk59vGQbDvGJmqbDTdgWgAqcLBCgUb | -| Ethereum | 2 | 1 | 0x3ee18B2214AFF97000D974cf647E7C347E8fa585 | -| Terra | 3 | columbus-5 | terra10nmmwe8r3g99a9newtqa7a75xfgs2e8z87r2sf | -| Binance Smart Chain | 4 | 56 | 0xB6F6D86a8f9879A9c87f643768d9efc38c1Da6E7 | -| Polygon | 5 | 137 | 0x5a58505a96D1dbf8dF91cB21B54419FC36e93fdE | -| Avalanche (C-Chain) | 6 | 43114 | 0x0e082F06FF657D94310cB8cE8B0D9a04541d8052 | -| Oasis (Emerald) | 7 | 4262 | 0xfE8cD454b4A1CA468B57D79c0cc77Ef5B6f64585 | -| Aurora | 9 | 1313161554 | 0x51b5123a7b0F9b2bA265f9c4C8de7D78D52f510F | -| Fantom | 10 | 250 | 0x7C9Fc5741288cDFdD83CeB07f3ea7e22618D79D2 | -| Karura | 11 | 686 | 0xae9d7fe007b3327AA64A32824Aaac52C42a6E624 | -| Acala | 12 | 787 | 0xae9d7fe007b3327AA64A32824Aaac52C42a6E624 | -| Klaytn | 13 | 8217 | 0x5b08ac39EAED75c0439FC750d9FE7E1F9dD0193F | -| Celo | 14 | 42220 | 0x796Dff6D74F3E27060B71255Fe517BFb23C93eed | -| Terra | 18 | phoenix-1 | terra153366q50k7t8nn7gec00hg66crnhkdggpgdtaxltaq6xrutkkz3s992fw9 | - +| Chain Name | Wormhole Chain ID | Network ID | Address | +| :------------------ | :---------------- | :----------- | :--------------------------------------------------------------- | +| Solana | 1 | mainnet-beta | wormDTUJ6AWPNvk59vGQbDvGJmqbDTdgWgAqcLBCgUb | +| Ethereum | 2 | 1 | 0x3ee18B2214AFF97000D974cf647E7C347E8fa585 | +| Terra | 3 | columbus-5 | terra10nmmwe8r3g99a9newtqa7a75xfgs2e8z87r2sf | +| Binance Smart Chain | 4 | 56 | 0xB6F6D86a8f9879A9c87f643768d9efc38c1Da6E7 | +| Polygon | 5 | 137 | 0x5a58505a96D1dbf8dF91cB21B54419FC36e93fdE | +| Avalanche (C-Chain) | 6 | 43114 | 0x0e082F06FF657D94310cB8cE8B0D9a04541d8052 | +| Oasis (Emerald) | 7 | 4262 | 0xfE8cD454b4A1CA468B57D79c0cc77Ef5B6f64585 | +| Aurora | 9 | 1313161554 | 0x51b5123a7b0F9b2bA265f9c4C8de7D78D52f510F | +| Fantom | 10 | 250 | 0x7C9Fc5741288cDFdD83CeB07f3ea7e22618D79D2 | +| Karura | 11 | 686 | 0xae9d7fe007b3327AA64A32824Aaac52C42a6E624 | +| Acala | 12 | 787 | 0xae9d7fe007b3327AA64A32824Aaac52C42a6E624 | +| Klaytn | 13 | 8217 | 0x5b08ac39EAED75c0439FC750d9FE7E1F9dD0193F | +| Celo | 14 | 42220 | 0x796Dff6D74F3E27060B71255Fe517BFb23C93eed | +| NEAR | 15 | | contract.portalbridge.near | +| Terra | 18 | phoenix-1 | terra153366q50k7t8nn7gec00hg66crnhkdggpgdtaxltaq6xrutkkz3s992fw9 | ### NFT Bridge -| Chain Name | Wormhole Chain ID | Network ID | Address | -| :-------------------- | :---------------- | :----------- | :------ | -| Solana | 1 | mainnet-beta | WnFt12ZrnzZrFZkt2xsNsaNWoQribnuQ5B5FrDbwDhD | -| Ethereum | 2 | 1 | 0x6FFd7EdE62328b3Af38FCD61461Bbfc52F5651fE | -| Binance Smart Chain | 4 | 56 | 0x5a58505a96D1dbf8dF91cB21B54419FC36e93fdE | -| Polygon | 5 | 137 | 0x90BBd86a6Fe93D3bc3ed6335935447E75fAb7fCf | -| Avalanche (C-Chain) | 6 | 43114 | 0xf7B6737Ca9c4e08aE573F75A97B73D7a813f5De5 | -| Oasis (Emerald) | 7 | 4262 | 0x04952D522Ff217f40B5Ef3cbF659EcA7b952a6c1 | -| Aurora | 9 | 1313161554 | 0x6dcC0484472523ed9Cdc017F711Bcbf909789284 | -| Fantom | 10 | 250 | 0xA9c7119aBDa80d4a4E0C06C8F4d8cF5893234535 | -| Karura | 11 | 686 | 0xb91e3638F82A1fACb28690b37e3aAE45d2c33808 | -| Acala | 12 | 787 | 0xb91e3638F82A1fACb28690b37e3aAE45d2c33808 | -| Klaytn | 13 | 8217 | 0x3c3c561757BAa0b78c5C025CdEAa4ee24C1dFfEf | -| Celo | 14 | 42220 | 0xA6A377d75ca5c9052c9a77ED1e865Cc25Bd97bf3 | +| Chain Name | Wormhole Chain ID | Network ID | Address | +| :------------------ | :---------------- | :----------- | :------------------------------------------ | +| Solana | 1 | mainnet-beta | WnFt12ZrnzZrFZkt2xsNsaNWoQribnuQ5B5FrDbwDhD | +| Ethereum | 2 | 1 | 0x6FFd7EdE62328b3Af38FCD61461Bbfc52F5651fE | +| Binance Smart Chain | 4 | 56 | 0x5a58505a96D1dbf8dF91cB21B54419FC36e93fdE | +| Polygon | 5 | 137 | 0x90BBd86a6Fe93D3bc3ed6335935447E75fAb7fCf | +| Avalanche (C-Chain) | 6 | 43114 | 0xf7B6737Ca9c4e08aE573F75A97B73D7a813f5De5 | +| Oasis (Emerald) | 7 | 4262 | 0x04952D522Ff217f40B5Ef3cbF659EcA7b952a6c1 | +| Aurora | 9 | 1313161554 | 0x6dcC0484472523ed9Cdc017F711Bcbf909789284 | +| Fantom | 10 | 250 | 0xA9c7119aBDa80d4a4E0C06C8F4d8cF5893234535 | +| Karura | 11 | 686 | 0xb91e3638F82A1fACb28690b37e3aAE45d2c33808 | +| Acala | 12 | 787 | 0xb91e3638F82A1fACb28690b37e3aAE45d2c33808 | +| Klaytn | 13 | 8217 | 0x3c3c561757BAa0b78c5C025CdEAa4ee24C1dFfEf | +| Celo | 14 | 42220 | 0xA6A377d75ca5c9052c9a77ED1e865Cc25Bd97bf3 | ## Testnet ### Core Bridge -| Chain Name | Wormhole Chain ID | Network ID | Address | -| :--------------------- | :---------------- | :----------- | :------ | -| Solana | 1 | devnet | 3u8hJUVTA4jH1wYAyUur7FFZVQ8H635K3tSHHF4ssjQ5 | -| Ethereum (Goerli) | 2 | 5 | 0x706abc4E45D419950511e474C7B9Ed348A4a716c | -| Ethereum (Ropsten) | 10001 | 3 | 0x210c5F5e2AF958B4defFe715Dc621b7a3BA888c5 | -| Terra | 3 | bombay-12 | terra1pd65m0q9tl3v8znnz5f5ltsfegyzah7g42cx5v | -| Binance Smart Chain | 4 | 97 | 0x68605AD7b15c732a30b1BbC62BE8F2A509D74b4D | -| Polygon (Mumbai) | 5 | 80001 | 0x0CBE91CF822c73C2315FB05100C2F714765d5c20 | -| Avalanche (Fuji) | 6 | 43113 | 0x7bbcE28e64B3F8b84d876Ab298393c38ad7aac4C | -| Oasis (Emerald Testnet)| 7 | 42261 | 0xc1C338397ffA53a2Eb12A7038b4eeb34791F8aCb | -| Algorand (Testnet) | 8 | | 86525623 | -| Aurora | 9 | 1313161555 | 0xBd07292de7b505a4E803CEe286184f7Acf908F5e | -| Fantom | 10 | 4002 | 0x1BB3B4119b7BA9dfad76B0545fb3F531383c3bB7 | -| Karura | 11 | 686 | 0xE4eacc10990ba3308DdCC72d985f2a27D20c7d03 | -| Acala | 12 | 787 | 0x4377B49d559c0a9466477195C6AdC3D433e265c0 | -| Klaytn | 13 | 1001 | 0x1830CC6eE66c84D2F177B94D544967c774E624cA | -| Celo | 14 | 44787 | 0x88505117CA88e7dd2eC6EA1E13f0948db2D50D56 | -| Terra | 18 | pisco-1 | terra19nv3xr5lrmmr7egvrk2kqgw4kcn43xrtd5g0mpgwwvhetusk4k7s66jyv0 | -| Injective | 19 | testnet | inj1xx3aupmgv3ce537c0yce8zzd3sz567syuyedpg | +| Chain Name | Wormhole Chain ID | Network ID | Address | +| :---------------------- | :---------------- | :--------- | :--------------------------------------------------------------- | +| Solana | 1 | devnet | 3u8hJUVTA4jH1wYAyUur7FFZVQ8H635K3tSHHF4ssjQ5 | +| Ethereum (Goerli) | 2 | 5 | 0x706abc4E45D419950511e474C7B9Ed348A4a716c | +| Ethereum (Ropsten) | 10001 | 3 | 0x210c5F5e2AF958B4defFe715Dc621b7a3BA888c5 | +| Terra | 3 | bombay-12 | terra1pd65m0q9tl3v8znnz5f5ltsfegyzah7g42cx5v | +| Binance Smart Chain | 4 | 97 | 0x68605AD7b15c732a30b1BbC62BE8F2A509D74b4D | +| Polygon (Mumbai) | 5 | 80001 | 0x0CBE91CF822c73C2315FB05100C2F714765d5c20 | +| Avalanche (Fuji) | 6 | 43113 | 0x7bbcE28e64B3F8b84d876Ab298393c38ad7aac4C | +| Oasis (Emerald Testnet) | 7 | 42261 | 0xc1C338397ffA53a2Eb12A7038b4eeb34791F8aCb | +| Algorand (Testnet) | 8 | | 86525623 | +| Aurora | 9 | 1313161555 | 0xBd07292de7b505a4E803CEe286184f7Acf908F5e | +| Fantom | 10 | 4002 | 0x1BB3B4119b7BA9dfad76B0545fb3F531383c3bB7 | +| Karura | 11 | 686 | 0xE4eacc10990ba3308DdCC72d985f2a27D20c7d03 | +| Acala | 12 | 787 | 0x4377B49d559c0a9466477195C6AdC3D433e265c0 | +| Klaytn | 13 | 1001 | 0x1830CC6eE66c84D2F177B94D544967c774E624cA | +| Celo | 14 | 44787 | 0x88505117CA88e7dd2eC6EA1E13f0948db2D50D56 | +| NEAR | 15 | | wormhole.wormhole.testnet | +| Terra | 18 | pisco-1 | terra19nv3xr5lrmmr7egvrk2kqgw4kcn43xrtd5g0mpgwwvhetusk4k7s66jyv0 | +| Injective | 19 | testnet | inj1xx3aupmgv3ce537c0yce8zzd3sz567syuyedpg | ### Token Bridge -| Chain Name | Wormhole Chain ID | Network ID | Address | -| :--------------------- | :---------------- | :----------- | :------ | -| Solana | 1 | devnet | DZnkkTmCiFWfYTfT41X3Rd1kDgozqzxWaHqsw6W4x2oe | -| Ethereum (Goerli) | 2 | 5 | 0xF890982f9310df57d00f659cf4fd87e65adEd8d7 | -| Ethereum (Ropsten) | 10001 | 3 | 0xF174F9A837536C449321df1Ca093Bb96948D5386 | -| Terra | 3 | bombay-12 | terra1pseddrv0yfsn76u4zxrjmtf45kdlmalswdv39a | -| Binance Smart Chain | 4 | 97 | 0x9dcF9D205C9De35334D646BeE44b2D2859712A09 | -| Polygon (Mumbai) | 5 | 80001 | 0x377D55a7928c046E18eEbb61977e714d2a76472a | -| Avalanche (Fuji) | 6 | 43113 | 0x61E44E506Ca5659E6c0bba9b678586fA2d729756 | -| Oasis (Emerald Testnet)| 7 | 42261 | 0x88d8004A9BdbfD9D28090A02010C19897a29605c | -| Algorand (Testnet) | 8 | | 86525641 | -| Aurora | 9 | 1313161555 | 0xD05eD3ad637b890D68a854d607eEAF11aF456fba | -| Fantom | 10 | 4002 | 0x599CEa2204B4FaECd584Ab1F2b6aCA137a0afbE8 | -| Karura | 11 | 686 | 0xd11De1f930eA1F7Dd0290Fe3a2e35b9C91AEFb37 | -| Acala | 12 | 787 | 0xebA00cbe08992EdD08ed7793E07ad6063c807004 | -| Klaytn | 13 | 1001 | 0xC7A13BE098720840dEa132D860fDfa030884b09A | -| Celo | 14 | 44787 | 0x05ca6037eC51F8b712eD2E6Fa72219FEaE74E153 | -| Injective | 19 | testnet | inj1q0e70vhrv063eah90mu97sazhywmeegp7myvnh | - +| Chain Name | Wormhole Chain ID | Network ID | Address | +| :---------------------- | :---------------- | :--------- | :------------------------------------------- | +| Solana | 1 | devnet | DZnkkTmCiFWfYTfT41X3Rd1kDgozqzxWaHqsw6W4x2oe | +| Ethereum (Goerli) | 2 | 5 | 0xF890982f9310df57d00f659cf4fd87e65adEd8d7 | +| Ethereum (Ropsten) | 10001 | 3 | 0xF174F9A837536C449321df1Ca093Bb96948D5386 | +| Terra | 3 | bombay-12 | terra1pseddrv0yfsn76u4zxrjmtf45kdlmalswdv39a | +| Binance Smart Chain | 4 | 97 | 0x9dcF9D205C9De35334D646BeE44b2D2859712A09 | +| Polygon (Mumbai) | 5 | 80001 | 0x377D55a7928c046E18eEbb61977e714d2a76472a | +| Avalanche (Fuji) | 6 | 43113 | 0x61E44E506Ca5659E6c0bba9b678586fA2d729756 | +| Oasis (Emerald Testnet) | 7 | 42261 | 0x88d8004A9BdbfD9D28090A02010C19897a29605c | +| Algorand (Testnet) | 8 | | 86525641 | +| Aurora | 9 | 1313161555 | 0xD05eD3ad637b890D68a854d607eEAF11aF456fba | +| Fantom | 10 | 4002 | 0x599CEa2204B4FaECd584Ab1F2b6aCA137a0afbE8 | +| Karura | 11 | 686 | 0xd11De1f930eA1F7Dd0290Fe3a2e35b9C91AEFb37 | +| Acala | 12 | 787 | 0xebA00cbe08992EdD08ed7793E07ad6063c807004 | +| Klaytn | 13 | 1001 | 0xC7A13BE098720840dEa132D860fDfa030884b09A | +| Celo | 14 | 44787 | 0x05ca6037eC51F8b712eD2E6Fa72219FEaE74E153 | +| Celo | 15 | | token.wormhole.testnet | +| Injective | 19 | testnet | inj1q0e70vhrv063eah90mu97sazhywmeegp7myvnh | ### NFT Bridge -| Chain Name | Wormhole Chain ID | Network ID | Address | -| :--------------------- | :---------------- | :----------- | :------ | -| Solana | 1 | devnet | 2rHhojZ7hpu1zA91nvZmT8TqWWvMcKmmNBCr2mKTtMq4 | -| Ethereum (Goerli) | 2 | 5 | 0xD8E4C2DbDd2e2bd8F1336EA691dBFF6952B1a6eB | -| Ethereum (Ropsten) | 10001 | 3 | 0x2b048Da40f69c8dc386a56705915f8E966fe1eba | -| Binance Smart Chain | 4 | 97 | 0xcD16E5613EF35599dc82B24Cb45B5A93D779f1EE | -| Polygon (Mumbai) | 5 | 80001 | 0x51a02d0dcb5e52F5b92bdAA38FA013C91c7309A9 | -| Avalanche (Fuji) | 6 | 43113 | 0xD601BAf2EEE3C028344471684F6b27E789D9075D | -| Oasis (Emerald Testnet)| 7 | 42261 | 0xC5c25B41AB0b797571620F5204Afa116A44c0ebA | -| Aurora | 9 | 1313161555 | 0x8F399607E9BA2405D87F5f3e1B78D950b44b2e24 | -| Fantom | 10 | 4002 | 0x63eD9318628D26BdCB15df58B53BB27231D1B227 | -| Karura | 11 | 686 | 0x0A693c2D594292B6Eb89Cb50EFe4B0b63Dd2760D | -| Acala | 12 | 787 | 0x96f1335e0AcAB3cfd9899B30b2374e25a2148a6E | -| Klaytn | 13 | 1001 | 0x94c994fC51c13101062958b567e743f1a04432dE | -| Celo | 14 | 44787 | 0xaCD8190F647a31E56A656748bC30F69259f245Db | +| Chain Name | Wormhole Chain ID | Network ID | Address | +| :---------------------- | :---------------- | :--------- | :------------------------------------------- | +| Solana | 1 | devnet | 2rHhojZ7hpu1zA91nvZmT8TqWWvMcKmmNBCr2mKTtMq4 | +| Ethereum (Goerli) | 2 | 5 | 0xD8E4C2DbDd2e2bd8F1336EA691dBFF6952B1a6eB | +| Ethereum (Ropsten) | 10001 | 3 | 0x2b048Da40f69c8dc386a56705915f8E966fe1eba | +| Binance Smart Chain | 4 | 97 | 0xcD16E5613EF35599dc82B24Cb45B5A93D779f1EE | +| Polygon (Mumbai) | 5 | 80001 | 0x51a02d0dcb5e52F5b92bdAA38FA013C91c7309A9 | +| Avalanche (Fuji) | 6 | 43113 | 0xD601BAf2EEE3C028344471684F6b27E789D9075D | +| Oasis (Emerald Testnet) | 7 | 42261 | 0xC5c25B41AB0b797571620F5204Afa116A44c0ebA | +| Aurora | 9 | 1313161555 | 0x8F399607E9BA2405D87F5f3e1B78D950b44b2e24 | +| Fantom | 10 | 4002 | 0x63eD9318628D26BdCB15df58B53BB27231D1B227 | +| Karura | 11 | 686 | 0x0A693c2D594292B6Eb89Cb50EFe4B0b63Dd2760D | +| Acala | 12 | 787 | 0x96f1335e0AcAB3cfd9899B30b2374e25a2148a6E | +| Klaytn | 13 | 1001 | 0x94c994fC51c13101062958b567e743f1a04432dE | +| Celo | 14 | 44787 | 0xaCD8190F647a31E56A656748bC30F69259f245Db | diff --git a/src/technical/env/tooling.md b/src/technical/env/tooling.md index b51ae42..2269179 100644 --- a/src/technical/env/tooling.md +++ b/src/technical/env/tooling.md @@ -1,24 +1,30 @@ # Tooling -Regardless of the developer environment that you use, there are a few wormhole-specific tools you should know about. +Regardless of the development environment that you use, there are a few wormhole-specific tools you should know about. -Below is a list of those tools with specific links but some developers also find it useful to clone the Wormhole core repository. +### [Wormhole Core Repository](https://github.com/wormhole-foundation/wormhole/tree/dev.v2/) + +- Most developers find it useful to clone the Wormhole Core repository. This repository provides the Devnet Tilt environment, plenty of useful code examples and tests, along with some utilities which do not have an official release package. ### [Worm CLI tool](https://github.com/wormhole-foundation/wormhole/tree/dev.v2/clients/js) -- Great CLI tool for getting odds and ends done surround wormhole contracts, VAAs and more. +- Swiss-Army Knife Utility CLI tool. Excellent for creating one-off VAAs, parsing VAAs, reading Wormhole contract configurations, and more. -### Orchestrator +### [Orchestrator](https://github.com/wormhole-foundation/xdapp-book/blob/main/projects/evm-messenger/orchestrator.js) -- WIP tool which is connected to the WLV environment to help with managing deployment of your xDapp contracts. +- Small WIP tool which comes as part of the [Wormhole Local Validator](./wlv.md) environment. Used to quickly deploy and redeploy multiple smart contracts. Will eventually become part of a larger deployment management tool. -### [Wormhole SDK](https://github.com/wormhole-foundation/wormhole/tree/dev.v2/sdk) +### [Wormhole SDKs](https://github.com/wormhole-foundation/wormhole/tree/dev.v2/sdk) - Libraries in various languages to help with interacting with Wormhole contracts. -### Wormhole Spy Service +### [Wormhole Typescript SDK](https://www.npmjs.com/package/@certusone/wormhole-sdk) -- Wormhole Spy listens to all of the activity on the Guardian Network. [Here](https://github.com/wormhole-foundation/wormhole/tree/dev.v2/relayer/spy_relayer) is a reference for running your own spy and [here](https://github.com/wormhole-foundation/wormhole/tree/dev.v2/spydk/js) is an SDK to interact with the spy. +- Typescript SDK destributed on npm. Can greatly aid in writing frontend code for xDapps and utilizing the Wormhole Token Bridge directly. + +### [Wormhole Spy SDK](https://github.com/wormhole-foundation/wormhole/tree/dev.v2/spydk/js) + +- The Wormhole Spy SDK allows you to listen to all of the activity on the Guardian Network. ### [Reference Bridge UI](https://github.com/wormhole-foundation/example-token-bridge-ui) @@ -27,5 +33,28 @@ Below is a list of those tools with specific links but some developers also find ### [Explorer](https://wormhole.com/explorer/) - Resource for looking at individual transfers statuses on mainnet and testnet. + -Link to as many example projects as possible here as well, ICCO, xDapp book examples + + +## Example Projects + +### [Basic Examples](https://github.com/wormhole-foundation/xdapp-book/tree/main/projects) + +- Several example projects are bundled here. They show minimum-code examples for how to send messages, tokens, and other common functions. + +### [ICCO](https://github.com/certusone/wormhole-icco) + +- Productionized, audited xDapp which does cross-chain token launches. Great example of what a robust xDapp, written across multiple ecosystems looks like. + +### [Native Swap](https://github.com/certusone/wormhole-nativeswap-example) + +- Example cross-chain dex, utilizing the stablecoin highway model. + +### [Wormhole Examples](https://github.com/certusone/wormhole-examples) + +- More example components. Has a mix of relayers, xDapps, NFT projects, and more. From 592b9fd1f68b4bbb1a022bc1ecd839180a360c23 Mon Sep 17 00:00:00 2001 From: Eric Wong Date: Wed, 21 Sep 2022 12:13:51 -0500 Subject: [PATCH 61/69] evm: line edits --- src/technical/evm/coreLayer.md | 4 ++-- src/technical/evm/nftLayer.md | 6 +++--- src/technical/evm/xassetLayer.md | 16 +++++----------- 3 files changed, 10 insertions(+), 16 deletions(-) diff --git a/src/technical/evm/coreLayer.md b/src/technical/evm/coreLayer.md index 5d3d176..75820f9 100644 --- a/src/technical/evm/coreLayer.md +++ b/src/technical/evm/coreLayer.md @@ -1,6 +1,6 @@ -# Core Layer +# Core Message Layer -This section will explain how to properly interact with the Wormhome Core Layer in an EVM ecosystem. +This section will explain how to properly interact with the Wormhome Core Message Layer in an EVM ecosystem. ## Configuring the Interface diff --git a/src/technical/evm/nftLayer.md b/src/technical/evm/nftLayer.md index 5be528d..ef92a4f 100644 --- a/src/technical/evm/nftLayer.md +++ b/src/technical/evm/nftLayer.md @@ -1,10 +1,10 @@ -# NFT Layer +# NFT Bridge -This section will explain how to properly interact with the NFT Layer in an EVM ecosystem. +This section will explain how to properly interact with the NFT Bridge in an EVM ecosystem. ## Configuring the interface -[Here](https://github.com/wormhole-foundation/wormhole/tree/dev.v2/ethereum/contracts/interfaces) is the interface for applications to interact with Wormhole's NFT layer. +[Here](https://github.com/wormhole-foundation/wormhole/tree/dev.v2/ethereum/contracts/interfaces) is the interface for applications to interact with Wormhole's NFT Bridge. +_[Here](../../development/portal/evm/attestingToken.md) is an example of how to attest a token using the JS SDK._ ## Basic Transfer @@ -71,7 +67,6 @@ while (!vaaBytes.vaaBytes) { ``` 4. Complete the transfer using the VAA. - - \_Note: VAAs are retrieved from the ``` // To complete transfer of normal ERC-20s @@ -130,7 +125,6 @@ while (!vaaBytes.vaaBytes) { ``` 4. Complete the transfer using the VAA. - - \_Note: VAAs are retrieved from the ``` // To complete transfer of normal ERC-20s From 99ae35f8a27343ca60a89db44ca9ac2b634c58d5 Mon Sep 17 00:00:00 2001 From: Eric Wong Date: Wed, 21 Sep 2022 12:14:28 -0500 Subject: [PATCH 62/69] line edits --- src/technical/evm/coreLayer.md | 24 +++++++++++++++++------- src/technical/evm/nftLayer.md | 2 +- 2 files changed, 18 insertions(+), 8 deletions(-) diff --git a/src/technical/evm/coreLayer.md b/src/technical/evm/coreLayer.md index 75820f9..fd9282d 100644 --- a/src/technical/evm/coreLayer.md +++ b/src/technical/evm/coreLayer.md @@ -2,9 +2,11 @@ This section will explain how to properly interact with the Wormhome Core Message Layer in an EVM ecosystem. +Messages in Wormhole take the form of a Verified Action Approval (VAA) and both terms can be used interchangably. The rest of this section will only use the term VAA. + ## Configuring the Interface -[Here](https://github.com/wormhole-foundation/wormhole/blob/dev.v2/ethereum/contracts/interfaces/IWormhole.sol) is the interface for applications to interact with Wormhole's Core Contract to publish messages or verify and parse a received message. +[Here](https://github.com/wormhole-foundation/wormhole/blob/dev.v2/ethereum/contracts/interfaces/IWormhole.sol) is the interface for applications to interact with Wormhole's Core Contract to publish VAAs or verify and parse a received VAAs. Instantiating the interface will depend on the contract address of your development ecosystem and blockchain. @@ -17,14 +19,22 @@ IWormhole core_bridge = IWormhole(wormhole_core_bridge_address); ## Primary functions -The Wormhole Core Layer effectively only has two important interactions -- (1) emit messages, and (2) parse and verify messages that originated from other chains. +The Wormhole Core Layer effectively only has two important interactions -- (1) emit VAAs, and (2) parse and verify VAAs that originated from other chains. -### Emitting a Message +### Emitting a VAA -To emit a message, always use `publishMessage` which takes in the following arguments: +There are two forms that VAAs can be emitted within Wormhole: +- Single VAA: this format should only be used for very simple transactions (i.e. sending tokens to a user's wallet) +- Batch VAA: this format should be used for most transactions. Batch VAAs allow for easier compsability and better gas efficiency for transactions that contain multiple messages. + +To emit a VAA, always use `publishMessage` which takes in the following arguments: 1. `nonce` (uint32): a number assigned to each message - The `nonce` gives the receving contract a mechanism by which to make sure it does not double process messages + + - To emit - Batch VAAs allow for easier compsability and better gas efficiency of multiple messages. To do this, messages emitted within the same transaction with the same nonce are bundled together into one aggregate message. Messages with a nonce of `0` will not be included in a Batch VAA and emitted individually. 2. `Consistency` (uint8): the number of blocks that Guardians will wait before signing a message - Each blockchain has different finality periods. In general, higher consistencies mean more security against blockchain reorgs. @@ -34,11 +44,11 @@ To emit a message, always use `publishMessage` which takes in the following argu `publishMessage` will output a `sequence` (uint64) that is used in conjunction with `emitterChainID` and `emitterAddress` to retrive the generated VAA from the Guardian Network. -### Parsing and Verifying a Message +### Parsing and Verifying a VAA -Parsing and Verifying a message will depend on the type of VAA that your application expects: a Single VAA or a Batch VAA. +Parsing and Verifying a VAA will depend on the type of VAA that your application expects: a Single VAA or a Batch VAA. -For either message type, remember to collect gas fees associated with submitting them on-chain after all VAAs have been verified. +For either VAA type, remember to collect gas fees associated with submitting them on-chain after all VAAs have been verified. **Single VAA** diff --git a/src/technical/evm/nftLayer.md b/src/technical/evm/nftLayer.md index ef92a4f..9bb088d 100644 --- a/src/technical/evm/nftLayer.md +++ b/src/technical/evm/nftLayer.md @@ -1,6 +1,6 @@ # NFT Bridge -This section will explain how to properly interact with the NFT Bridge in an EVM ecosystem. +This section will explain how to properly interact with the NFT Bridge Module in an EVM ecosystem. ## Configuring the interface From e192f5e5843940a5d432a470a2380c78c8f5ab0b Mon Sep 17 00:00:00 2001 From: Eric Wong Date: Wed, 21 Sep 2022 14:30:32 -0500 Subject: [PATCH 63/69] glossary + line edits --- src/dapps/2_crossChainInteroperability.md | 10 ---------- src/dapps/3_xdataxassets.md | 12 ------------ src/dapps/4_whatIsanXdapp.md | 8 -------- src/reference/glossary.md | 21 +++++++++++++++++++++ src/wormhole/3_coreLayerContracts.md | 2 +- 5 files changed, 22 insertions(+), 31 deletions(-) diff --git a/src/dapps/2_crossChainInteroperability.md b/src/dapps/2_crossChainInteroperability.md index afe4973..fb07cc0 100644 --- a/src/dapps/2_crossChainInteroperability.md +++ b/src/dapps/2_crossChainInteroperability.md @@ -26,13 +26,3 @@ This is why Wormhole exists. Wormhole proposes a new way of developing applicati --- Rethinking the next generation of decentralized applications means dethroning the token as the fundamental atomic unit of blockchains. We'll expand on this change in the next section. - ---- - -## Branded Terms - -In some instances, Wormhole uses general terms for decentralized, cross-chain elements as branded verbiage. In most cases, the definition of the general term does not greatly differ from Wormhole definition, though Wormhole's definitions may be more narrow than general interpretations. - -**xChain** - Across the Wormhole ecosystem, the full range of cross-blockchain interoperability is referred to under the term "xChain." "xChain" is the concept that houses other branded terms, like the Wormhole definitions of xAssets, xData and xApps. - - diff --git a/src/dapps/3_xdataxassets.md b/src/dapps/3_xdataxassets.md index 6674782..1bd17ff 100644 --- a/src/dapps/3_xdataxassets.md +++ b/src/dapps/3_xdataxassets.md @@ -13,15 +13,3 @@ Cross-chain interoperability then becomes a matter of creating, consuming and ma --- Later in this document, we'll delve deeper into how Wormhole implements this [xData layer](../wormhole/3_coreLayerContracts.md) (also referred to as the 'Core' layer of Wormhole), but for now let's talk about how xData can be used to create xDapps. - ---- - -## Branded Terms - -In some instances, Wormhole uses general terms for decentralized, cross-chain elements as branded verbiage. In most cases, the definition of the general term does not greatly differ from Wormhole definition, though Wormhole's definitions may be more narrow than general interpretations. - -**xData** - Wormhole defines xData as "data that exists in a layer outside of Layer 1 blockchains, which is accessible by all chains." The Wormhole definition of xData presents it as a branded element of xChain. - -**xAssets** - Wormhole defines xAssets as a "chain-and-path agnostic token that exists on a layer outside the blockchain ecosystem, which can be used to conduct transactions on any blockchain." The Wormhole definition of xAssets presents itself as an element of xChain. - - diff --git a/src/dapps/4_whatIsanXdapp.md b/src/dapps/4_whatIsanXdapp.md index e5ee549..6d13671 100644 --- a/src/dapps/4_whatIsanXdapp.md +++ b/src/dapps/4_whatIsanXdapp.md @@ -13,11 +13,3 @@ Thus, a more fitting depiction of xDapps might be to see them as **Distributed D --- In the next section, we'll summarize the concrete advantages which xDapps built on Wormhole have over traditional Dapps today. - ---- - -## Branded Terms - -In some instances, Wormhole uses general terms for decentralized, cross-chain elements as branded verbiage. In most cases, the definition of the general term does not greatly differ from Wormhole definition, though Wormhole's definitions may be more narrow than general interpretations. - -**xDapp** - Wormhole defines xDapps as a "decentralized application that enables users to create and/or use xData." The Wormhole definition of xDapp presents it as a branded element of xChain. diff --git a/src/reference/glossary.md b/src/reference/glossary.md index ca3c827..a9e63ee 100644 --- a/src/reference/glossary.md +++ b/src/reference/glossary.md @@ -1 +1,22 @@ # Glossary + + +In some instances, Wormhole uses general terms fo decentralized, cross-chain elements as branded verbiage. In most casese, the definition of the general term does not differ from Wormhole's definition though Wormhole's definitions may be more narrow than general interpretations. + +**xChain** - Term that referrs to the full range of cross-blockchain interoperability. + +[**xData**](../dapps/3_xdataxassets.md) - Data that exists in a layer outside of Layer 1 blockchains, which is accessible by all chains. + +[**xAssets**](../dapps/3_xdataxassets.md) - Chain-and-path agnostic token that exists on a layer outside the blockchain ecosystem, which can be used to conduct transactions on any blockchain. There are currently two implemented modules: (1) [Token Bridge Module](../technical/evm/xassetLayer.md) and (2) [NFT Bridge Module](../technical/evm/nftLayer.md) + +[**xDapp**](../dapps/4_whatIsanXdapp.md) - Decentralized application that enables users to create and/or use xData. + +[**Guardian Network**](../wormhole/5_guardianNetwork.md) - Validators that exist in their own p2p network that serve as Wormhole's oracle by observing activity on-chain and generating signed messages attesting to that activity. + +[**Relayer**](../wormhole/6_relayers.md) - Any process which delivers VAAs to a destination. + +**Guardian** - One of the 19 validators in the Guardian Network that Contributes to the VAA multisig. + +[**VAA**](../wormhole/4_vaa.md) - Verifiable Action Approvals (VAAs) are the key piece of data in the Wormhole ecosystem, containing the messages emitted by xDapps along with information such as what contract emitted the message. The VAAs are signed by the Guardians and need 13/19 signatures to be considered authentic. + +[**Wormchain**](../wormhole/8_wormchain.md) - A purpose-built cosmos blockchain which aids the Guardian Network and allows for formal interaction with the Guardians. \ No newline at end of file diff --git a/src/wormhole/3_coreLayerContracts.md b/src/wormhole/3_coreLayerContracts.md index 81377d9..42153eb 100644 --- a/src/wormhole/3_coreLayerContracts.md +++ b/src/wormhole/3_coreLayerContracts.md @@ -22,7 +22,7 @@ Below is the mechanism by which Wormhole messages (aka Verified ACtion Approval, - **consistencyLevel** - The number of blocks which the Guardians should wait prior to emitting a VAA for this message. This number is usually either 1 or equal to the chain's finality period. This is a defense against transactions being orphaned. -- **nonce** - If multiple messages in the same transaction have the same nonce, a batch VAA will be produced alongside the individual VAAs on chains that allow them. This reduces gas costs and simplifies composability. +- **nonce** - An index number for the message that is used to produce Batch VAAs. How this is generated is elaborated in the [CoreLayer](../technical/evm/coreLayer.md) section. - **sequenceNumber** - A unique index number for the message. When combined with the emitter contract address and emitter chain ID, the corresponding VAA can be retrieved from a guardian network node. From 0f437c77638f512ad2ae9cdc6f14fe966b5c40d4 Mon Sep 17 00:00:00 2001 From: chase-45 Date: Wed, 21 Sep 2022 16:31:52 -0400 Subject: [PATCH 64/69] adding evm best practices page --- src/SUMMARY.md | 1 + src/technical/evm/bestPractices.md | 136 +++++++++++++++++++++++++++++ 2 files changed, 137 insertions(+) create mode 100644 src/technical/evm/bestPractices.md diff --git a/src/SUMMARY.md b/src/SUMMARY.md index b22a71b..cf079af 100644 --- a/src/SUMMARY.md +++ b/src/SUMMARY.md @@ -52,6 +52,7 @@ - [xAsset Module](./technical/evm/xassetLayer.md) - [NFT Module](./technical/evm/nftLayer.md) - [Relayer Module](./technical/evm/relayer.md) + - [Best Practices](./technical/evm/bestPractices.md) - [Solana]() - [Cosmos]() - [Algorand]() diff --git a/src/technical/evm/bestPractices.md b/src/technical/evm/bestPractices.md new file mode 100644 index 0000000..2125ba7 --- /dev/null +++ b/src/technical/evm/bestPractices.md @@ -0,0 +1,136 @@ +# Best Practices + +The Wormhole contracts were designed in a manner such that composeability is the default, but maximizing composeability requires that xDapp developers follow certain conventions around the sending and receiving of messages. + +# Sending Messages + +When sending messages, you should follow the same paradigm as is used by the Wormhole modules, namely + +- Don't couple the message emission to the message delivery +- Pass through all the optional arguments (like nonce) +- Always return the sequence + +### Good Example + +```solidity +// This function defines a super simple Wormhole 'module'. +// A module is just a piece of code which knows how to emit a composeable message +// which can be utilized by other contracts. +function emitMyMessage(address intendedRecipient, uint32 nonce) + public returns (uint64 sequence) { + + // Nonce is passed though to the core bridge. + // This allows other contracts to utilize it for batching or processing. + + // intendedRecipient is key for composeability! + // This field will allow the destination contract to enforce + // that the correct contract is submitting this VAA. + + // 1 is the consistency level, + // this message will be emitted after only 1 confirmation + sequence = core_bridge.publishMessage(nonce, "My Message to " + intendedRecipient, 1); + + // The sequence is passed back to the caller, which can be useful relay information. + // Relaying is not done here, because it would 'lock' others into the same relay mechanism. +} + +// This portion of the code which deals with composition and delivery. +// Its job is to string together multiple modules, and ensure they get relayed +// This code can be private or public, because it's tightly coupled to application. +// Do whatever you need to here. +function sendMyMessage() private { + + // First, emit a message intended for MY_OTHER_CONTRACT with nonce zero. + // Because processMyMessage enforces that msg.sender must equal the intendedRecipient, + // no one but MY_OTHER_CONTRACT will be able to call processMyMessage + // with the message emitted from this transaction. + + // However, another contract could call emitMyMessage in a different transaction + // using their own address as the recipient. + + // This allows for composeability of the module logic while still being secure! + + emitMyMessage(MY_OTHER_CONTRACT, 0); + + // Suppose I also want to send tokens to my contract on the OTHER_CHAIN + // Because transferTokensWithPayload is a composeable message, I can include it. + // Because the nonce of both these messages is 0, they will be combined into a batch VAA. + // NOTE: transferTokens (the basic transfer) is NOT considered a composeable message + + token_bridge.transferTokensWithPayload(SOME_TOKEN, SOME_AMOUNT, OTHER_CHAIN, MY_OTHER_CONTRACT, + 0, null); + + // Lastly, I request that the batch for nonce 0 be delivered to MY_OTHER_CONTRACT + relayer_contract.requestDelivery(OTHER_CHAIN, MY_OTHER_CONTRACT, 0, getRelayerFeeAmount()); +} +``` + +# Receiving Messages + +The best practices for receiving messages employ similar concepts. You should keep in mind that other contracts might want to integrate with your specific logic. As such, don't tie your verification logic into the delivery of the VAA. + +### **_Critical!_** + +- Always verify that the emitterAddress of the VAA comes from a contract you trust + +- If the message should not be allowed to be 'replayed', immediately mark its hash as processed. +- If your VAAs aren't replayable, you almost always want to include and enforce an intended recipient! Otherwise anyone can call your verify function directly with the single VAA, which will make life much harder for you and your integrators who want to process multiple VAAs at once. + +### Composeability + +- When processing a VAA, always treat the messages as single VAAs. Destructuring batch VAAs is the responsibility of the integrator. +- Once you have the function written to verify your message, pretend you are an external integrator. + +### Good Example + +``` +// Verification accepts a single VAA, and is publicly callable. +function processMyMessage(bytes32 memory VAA) public { + + (IWormhole.VM memory vm, bool valid, string memory reason) = + core_bridge.parseAndVerifyVM(VAA); + + // Ensure core contract verification succeeded. + require(valid, reason); + + // Ensure the emitterAddress of this VAA is a trusted address + require(myTrustedContracts[vm.emitterChainId] == + vm.emitterAddress, "Invalid Emitter Address!"); + + // Check that the VAA hasn't already been processed (replay protection) + require(!processedMessages[vm.hash], "Message already processed"); + + // Check that the contract which is processing this VAA is the intendedRecipient + // If the two aren't equal, this VAA may have bypassed its intended entrypoint. + // This exploit is referred to as 'scooping'. + require(parseIntendedRecipient(vm.payload) == msg.sender); + + // Add the VAA to processed messages so it can't be replayed + processedMessages[vm.hash] = true + + // The message content can now be trusted. + doBusinessLogic(vm.payload) +} + +//This is the function which would receive the the VAA from the relayer +function receiveVAA(bytes32 memory batchVAA) public { + // First, call the core bridge to verify the batchVAA + // All the individual VAAs inside the batchVAA will be cached, + // and you will receive headless VAAs inside the VM2 object. + // Headless VAAs are verifiable by parseAndVerifyVM. + + (IWormhole.VM2 memory vm2, bool valid, string memory reason) = + core_bridge.parseAndVerifyBatchVM(batchVAA, true) + + // I know from sendMyMessage that the first VAA is a token bridge VAA, + // so let's hand that off to the token bridge module. + bytes vaaData = token_bridge.completeTransferWithPayload(vm2.payloads[0]) + + // The second VAA is my message, let's hand that off to my module. + processMyMessage(vm2.payloads[1]) +} +``` + + - - To emit - - Batch VAAs allow for easier compsability and better gas efficiency of multiple messages. To do this, messages emitted within the same transaction with the same nonce are bundled together into one aggregate message. Messages with a nonce of `0` will not be included in a Batch VAA and emitted individually. + - The `nonce` provides a mechanism by which to group messages together within a Batch VAA. + - How Batch VAAs are generated based on a message's `nonce` is described below. 2. `Consistency` (uint8): the number of blocks that Guardians will wait before signing a message - Each blockchain has different finality periods. In general, higher consistencies mean more security against blockchain reorgs. - [Here]() are the consistency levels by blockchain that are used by the xAsset layer to have a high level of guarantee against reorgs. @@ -44,6 +40,32 @@ TODO confirm how we want to describe how Batch VAAs are created - MVP or full fu `publishMessage` will output a `sequence` (uint64) that is used in conjunction with `emitterChainID` and `emitterAddress` to retrive the generated VAA from the Guardian Network. +> How Batch VAAs are generated +> +> There are two mechanisms that allow messages to be Batched together that represent a base and more advanced level of compsability. +> +> 1. All messages originating from the same transaction will be batched together. +> 2. Messages that originate from the same transaction and are assigned the same nonce are additionally batched together. +> +> _Note: Single VAAs will always be emitted for each message within a transaction, regardless of if a message is included in a batch or not._ +> +> Here is an example of how messages generated from the same transaction may be batched together: +> +> A transaction X that generates 6 messages [A, B, C, D, E, F] that are assigned `nonce` [1, 2, 2, 3, 3, 4] respectively will generate the following VAAs: +> - (1) full transaction batch VAA +> - [A, B, C, D, E, F] +> - (2) smaller batch VAA +> - [B, C] +> - [D, E] +> - (6) single VAA +> - [A] +> - [B] +> - [C] +> - [D] +> - [E] +> - [F] + + ### Parsing and Verifying a VAA Parsing and Verifying a VAA will depend on the type of VAA that your application expects: a Single VAA or a Batch VAA. @@ -71,6 +93,6 @@ Batch VAAs are designed so that relayers can choose to submit any subset of the --- -Code recommendation, write the code which expects to receive a VAA to utilize parseAndVerifyVM(? unsure if this is the correct call). That way, your code will be able to handle either type 1 VAAs (single VAAs), or type 3 VAAs (headless VAAs). This allows it to utilize both single & batch VAAs and dramatically increases composeability. \*this only requires like two or three lines of code, so this would be a good candidate for a code example which shows how to properly use batch vaas without breaking composeability. Should note that the module code still ALWAYS needs to verify, but should do so with the 'single' message verifying and then expose that function publicly in order to enable composeability. +Code recommendation, write the code which expects to receive a VAA to utilize parseAndVerifyVM(? unsure if this is the correct call). That way, your code will be able to handle either type 1 VAAs (single VAAs), or type 3 VAAs (headless VAAs). This allows it to utilize both single & batch VAAs and dramatically increases composability. \*this only requires like two or three lines of code, so this would be a good candidate for a code example which shows how to properly use batch vaas without breaking composability. Should note that the module code still ALWAYS needs to verify, but should do so with the 'single' message verifying and then expose that function publicly in order to enable composability. --> diff --git a/src/wormhole/4_vaa.md b/src/wormhole/4_vaa.md index 957248b..dbc47cd 100644 --- a/src/wormhole/4_vaa.md +++ b/src/wormhole/4_vaa.md @@ -31,9 +31,27 @@ Because baseline VAAs have no destination, they are effectively multicast. They ## Batch VAAs -Certain blockchains support version 2 VAAs, also referred to as **Batch VAAs**. When multiple messages with the same nonce are emitted in the same transaction, a batch VAA will be created in addition to the individual VAAs. The Batch VAA contains the body of each individual VAA, but only has a single header. This reduces the gas cost of verifying the VAA, and simplifies the process of relaying and consuming multiple VAAs. +Certain blockchains support version 2 VAAs, also referred to as **Batch VAAs** which are designed to provide an easier paradigm for composability and better gas efficiency when multiple cross-chain actions are involved in a single transaction. -Batch VAAs are not currently live on mainnet, but will have initial support on all EVM chains when they launch. +Batch VAAs are designed to be automatically generated for all messages that come from a single transaction. + +In an extreme composability scenario or advanced integration, there may be some messages in a transaction that may not be relevant to one another. To control the create of additional batches, some messages can be created with the same `nonce` to _additionally_ group them. + +It is of note that Single VAAs will always be emitted for each message generated, regardless of it they are contained in a Batch VAA or not. + +Go [here](../technical/evm/coreLayer.md) for a more detailed description of how Batch VAAs are generated. + +_Note: Batch VAAs are not currently live on mainnet, but will have initial support on all EVM chains when they launch._ + +> How to leverage Batch VAAs +> +> Imagine a transaction generates three messages (A, B, C) that a consuming contract needs to know about. +> +> If each message is independent of each other, the consuming contract can handle and validate each of these VAAs individually like [A], [B], [C]. +> +> If all of the messages are related to each other, the consuming contract can handle and validate the Batch VAA of the entire transaction that is automatically generated like [A, B, C]. +> +> If only two of the messages are related to each other, say A and C, the same `nonce` can be used for those two messages to generate an additional Batch VAA and the consuming contract can then handle and validate two sets of VAAs like [A, C] and [B]. --- From bf8b10f11bd45a2702cfce08c986787f00d47a61 Mon Sep 17 00:00:00 2001 From: Eric Wong Date: Wed, 21 Sep 2022 17:11:15 -0500 Subject: [PATCH 69/69] xAssets --- src/wormhole/7_TokenBridge.md | 44 ++++++++++++++++++++++++++--------- 1 file changed, 33 insertions(+), 11 deletions(-) diff --git a/src/wormhole/7_TokenBridge.md b/src/wormhole/7_TokenBridge.md index 260b0ad..2005ed8 100644 --- a/src/wormhole/7_TokenBridge.md +++ b/src/wormhole/7_TokenBridge.md @@ -1,16 +1,20 @@ -# xAsset Bridge +# xAsset Layer -There is a set of ecosystem contracts that provision Wormhole's xAsset layer which allow tokens to be bridged around the Wormhole Ecosystem in a **path-independent** fashion, and are easily composeable with other functions in the Wormhole ecosystem. +There is a set of ecosystem contracts that provision Wormhole's xAsset layer which allow tokens to be bridged around the Wormhole Ecosystem in a **path-independent** fashion, and are easily composable with other functions in the Wormhole ecosystem. -This section provides a high-level overview of how to interact with the xAsset contracts. +This section provides a high-level overview of how to interact with two smart contract modules that implement xAssets: (1) Token Bridge module and (2) NFT Bridge Module. If you're looking to interact with the Token Bridge directly from a typescript client or backend, you should start with the [Wormhole Typescript SDK](https://www.npmjs.com/package/@certusone/wormhole-sdk). ## Creating xAssets -xAssets always have an **origin chain**. This is where the token is initially minted via the standard of that chain (ERC-20, SPL, etc). +xAssets always have an **origin chain**. This is where the token is initially minted via the standard of that chain (ERC-20, SPL, etc for tokens; ERC-721, Metaplex, etc for NFTs). -To convert this asset into an xAsset, an **attestation** must first be created. To create an attestation, simply call the **attest** function on the Portal contract of the origin chain. +xAssets are all **fungible** with each other. This means the Wormhole-wrapped asset can be exchanged for the original asset or a wrapped asset from other chains. + +**Tokens** + +To convert tokens into an xAsset, an **attestation** must first be created. To create an attestation, simply call the **attest** function on the Portal contract of the origin chain. function attestToken( address tokenAddress, @@ -27,10 +31,19 @@ The attestation VAA must then be submitted to the **createWrapped** function of Calling this function will deploy a new contract for the token on the foreign chain, creating a **Wormhole-Wrapped Token**. The wrapped token will use the same symbol as the origin asset, and will append (Wormhole) to the end of the name. -These assets are all **fungible** with each other. This means the Wormhole-wrapped token can be exchanged for the original token or wrapped tokens from other chains. +**NFTs** -## Transferring Assets +NFTs do not need need to be attested before they can be created into a xAsset. +## Transferring xAssets + +Initiating xAsset transfers is a straightforward affair. Once the transfer is initiated, the Guardians will produce a transfer VAA when finality has been reached on the **source chain**. The VAA must then be relayed to the **target chain**. + +All tokens managed by the Token Bridge are backed by the origin asset, allowing assets to be transferred in a path-independent fashion. Regardless of what chain the assets are passed to, a 'double-wrapped' asset will never be created for a single backing asset. Additionally, there are no liquidity limitations. + +**Tokens** + +``` function transferTokens( address token, uint256 amount, @@ -38,16 +51,25 @@ These assets are all **fungible** with each other. This means the Wormhole-wrapp bytes32 recipient, uint256 arbiterFee, uint32 nonce) returns (uint64 sequence) +``` -Initiating token transfers is a straightforward affair. Once the transfer is initiated, the Guardians will produce a transfer VAA when finality has been reached on the **source chain**. The VAA must then be relayed to the **target chain**. +**NFTs** +``` +function transferNFT( + address token, + uint256 tokenID, + uint16 recipientChain, + bytes32 recipient, + uint32 nonce) returns (uint64 sequence) +) +``` -All tokens managed by the Token Bridge are backed by the origin asset, allowing tokens to be transferred in a path-independent fashion. Regardless of what chain the tokens are passed to, a 'double-wrapped' asset will never be created for a single backing asset. Additionally, there are no liquidity limitations. ## Contract-Controlled Transfers -Basic transfers are intended to transfer tokens from one wallet to another, whereas Contract Controlled Transfers (CCTs) are meant to transfer tokens from one smart contract to another. If you're writing an xDapp, CCTs will likely be a large component. +Basic transfers are intended to transfer xAssets from one wallet to another, whereas Contract Controlled Transfers (CCTs) are meant to transfer xAssets from one smart contract to another. If you're writing an xDapp, CCTs will likely be a large component. -CCTs allow xDapp contracts to easily perform simple Token Bridge transfers, but have two additional features: +CCTs allow xDapp contracts to easily perform simple xAsset transfers, but have two additional features: - An arbitrary byte array can be appended to the transfer and can be used to easily pass additional information to the recipient contract. - The CCT VAA redeem can only be performed by the recipient contract, as opposed to basic transfers, which can be performed by any caller. This ensures that any additional operations which the contract wants to perform as part of the redeem transaction must be executed.