diff --git a/stack_orchestrator/data/stacks/mobymask-v3-demo/README.md b/stack_orchestrator/data/stacks/mobymask-v3-demo/README.md index d0fb4cf0..6fceaa95 100644 --- a/stack_orchestrator/data/stacks/mobymask-v3-demo/README.md +++ b/stack_orchestrator/data/stacks/mobymask-v3-demo/README.md @@ -4,8 +4,92 @@ Instructions to setup and deploy an end-to-end MobyMask v3 stack (fixturenet-opt ## Setup -TODO +* Clone required repositories: + + ```bash + laconic-so --stack mobymask-v3-demo setup-repositories --pull + ``` + +* Build the container images: + + ```bash + laconic-so --stack mobymask-v3-demo build-containers + ``` + +* Install MetaMask Flask extension in a chromium browser from chrome web store and follow the setup instructions ## Deploy -TODO +* Create a spec file for the deployment: + + ```bash + laconic-so --stack mobymask-v3-demo deploy init --output mobymask-v3-demo-spec.yml + ``` + +* Create a deployment from the generated spec file: + + ```bash + laconic-so --stack mobymask-v3-demo deploy create --spec-file mobymask-v3-demo-spec.yml --deployment-dir mobymask-v3-demo-deployment + ``` + +* Copy over the demo config to place it at the appropriate path: + + ```bash + cp mobymask-v3-demo-deployment/config/watcher-mobymask-v3-demo/local/config.env mobymask-v3-demo-deployment/ + ``` + +### Start the stack + +* Start the deployment: + + ```bash + laconic-so deployment --dir mobymask-v3-demo-deployment start + + # Useful ports exposed on host + # 3001: MobyMask v3 watcher 1 GQL endpoint + # 9090: MobyMask v3 watcher 1 relay node endpoint + # 9091: MobyMask v3 watcher 2 relay node endpoint + # 9092: MobyMask v3 watcher 3 relay node endpoint + # 8080: MobyMask snap + # 3004: MobyMask v3 app + ``` + + Note: This may take several minutes as it configures and runs the L1, L2 chains and the watchers; you can follow the progress from containers' logs + +* To list and monitor the running containers: + + ```bash + laconic-so deployment --dir mobymask-v3-demo-deployment ps + + # With status + docker ps + + # Check logs for a container + docker logs -f + ``` + +## Demo + +Follow [demo](./demo.md) to try out the MobyMask app + +## Clean up + +To stop all services running in the background, while preserving data: + + ```bash + laconic-so deployment --dir mobymask-v3-demo-deployment stop + ``` + +To stop all services and also delete data: + + ```bash + laconic-so deployment --dir mobymask-v3-demo-deployment stop --delete-volumes + + # Also remove the deployment directory + rm -rf mobymask-v3-demo-deployment + ``` + +## Known Issues + +* Resource requirements (memory + time) for building the `cerc/foundry` image are on the higher side + * `cerc/optimism-contracts` image is currently based on `cerc/foundry` (Optimism requires foundry installation) diff --git a/stack_orchestrator/data/stacks/mobymask-v3-demo/demo.md b/stack_orchestrator/data/stacks/mobymask-v3-demo/demo.md index 0805455a..7a448e88 100644 --- a/stack_orchestrator/data/stacks/mobymask-v3-demo/demo.md +++ b/stack_orchestrator/data/stacks/mobymask-v3-demo/demo.md @@ -1 +1,194 @@ # Demo + +## Setup + +* Follow logs and check that all 3 watchers are running in consensus: + + ```bash + # Follow the logs in three different terminals and keep them running + docker logs -f $(docker ps --filter "name=mobymask-watcher-1" -q) + docker logs -f $(docker ps --filter "name=mobymask-watcher-2" -q) + docker logs -f $(docker ps --filter "name=mobymask-watcher-3" -q) + + # Expected output when all three are running in consensus: + # ... + # 2024-02-21T10:42:23.932Z laconic:consensus State changed to 3 (FOLLOWER) with term 286 + # 2024-02-21T10:42:23.932Z laconic:consensus State changed to 2 (CANDIDATE) with term 287 + # 2024-02-21T10:42:24.406Z laconic:consensus State changed to 1 (LEADER) with term 287 + # ... + + # At any moment, only one of watchers is the 'LEADER' + ``` + +* In MetaMask, go to settings add a custom network with the following settings: + + ```bash + # Network name + Local Optimism + + # New RPC URL + http://127.0.0.1:8545 + + # Chain ID + 42069 + + # Currency symbol + ETH + ``` + + Switch to the newly added network + +* Import a account using private key pre-funded for Nitro client in the MobyMask app: + + ```bash + # PK: 689af8efa8c651a91ad287602527f3af2fe9f6501a7ac4b061667b5a93e037fd + # Address: 0xbDA5747bFD65F08deb54cb465eB87D40e51B197E + ``` + +## Run + +### Open MobyMask app + +* Copy the generated invite link from MobyMask deployment container logs: + + ```bash + docker logs -f $(docker ps -a --filter "name=mobymask-1" -q) + + # A SIGNED DELEGATION/INVITE LINK: + # ... + # http://127.0.0.1:3004/#/members?invitation= + ``` + +* Open the invite link in browser where MetaMask was setup + +* In the app’s debug panel (bottom-right), check from `PEERS` and `GRAPH` tabs that the peer gets connected to relay nodes and watcher peers + +* Perform phisher status checks from the app + * First 10 queries are served for free; repeat until the free quota is exhausted + * Same can be seen in the watcher-1's logs (the app makes all the GQL queries to watcher-1): + + ```bash + # ... + # 2024-02-21T11:01:20.084Z laconic:payments Query rate not configured for "latestBlock", serving free query + # 2024-02-21T11:01:20.084Z vulcanize:resolver latestBlock + # 2024-02-21T11:01:20.108Z laconic:payments Serving a free query to 0x3c9B491ACA5cf17B6C11E39bbFddCA603F387d41 + # 2024-02-21T11:01:20.109Z vulcanize:resolver isPhisher 0xf8995f83bbab2bc13fb9a43c6fea4a605616e6f59503f36cbe2ad3abffd0efd3 0xAFA36c47E130d89bcE4470a9030d99f3CEcaD146 TWT:dummyPhisher + # 2024-02-21T11:01:20.113Z vulcanize:indexer isPhisher: db miss, fetching from upstream server + # ... + + # After free quota has been exhausted: + # 2024-02-21T11:06:49.311Z laconic:payments Query rate not configured for "latestBlock", serving free query + # 2024-02-21T11:06:49.312Z vulcanize:resolver latestBlock + # 2024-02-21T11:06:49.337Z laconic:payments Rejecting query from 0x3c9B491ACA5cf17B6C11E39bbFddCA603F387d41: Free quota exhausted + ``` + +### Setup app's Nitro node + +* Open the `NITRO` tab in debug panel + +* Click on `Connect Wallet` button to connect to MetaMask (use the imported account with funds) + +* Click on `Connect Snap` to install / connect snap; the watcher Nitro clients should show up in the `NITRO` tab + +* Click on `DIRECT FUND` button against watcher-1's Nitro account (`0xAAA6628Ec44A8a742987EF3A114dDFE2D4F7aDCE`) to create a ledger channel with the pre-set amount + * Confirm the tx in MetaMask popup + * Wait some time for the tx to be confirmed + * The created ledger channel should now be visible in the `NITRO` tab; click on `REFRESH` button otherwise + +* Change amount to `10000` and click on `VIRTUAL FUND` button to create a virtual payment channel + * This results in a payment channel between the app and watcher-1 + * The payment channel's details should now be visible along with a `PAY` and `VIRTUAL DEFUND` buttons + +* Close the debug panel + +### Paid queries and mutations + +* Perform phisher status checks now that a payment channel has been created + * Amount set in the debug panel's `NITRO` tab is sent along with each request to the watcher + * Check the watcher-1 logs for the received payments: + + ```bash + # ... + # 2024-02-21T11:35:25.538Z ts-nitro:engine {"msg":"Received message","_msg":{"to":"0xAAA662","from":"0x5D12ac","payloadSummaries":[],"proposalSummaries":[],"payments":[{"amount":50,"channelId":"0x654a85725442828f89b497e3973640613c03b5f5ec47302bfa4402d42c07de30"}],"rejectedObjectives":[]}} + # 2024-02-21T11:35:25.552Z laconic:payments Query rate not configured for "latestBlock", serving free query + # 2024-02-21T11:35:25.553Z vulcanize:resolver latestBlock + # 2024-02-21T11:35:25.557Z laconic:payments Received a payment voucher of 50 from 0x5D12acfbBB1caD65fD61983003a50E0CB6900Fd3 + # 2024-02-21T11:35:25.570Z laconic:payments Serving a paid query for 0x5D12acfbBB1caD65fD61983003a50E0CB6900Fd3 + # 2024-02-21T11:35:25.570Z vulcanize:resolver isPhisher 0x6a1f0dce967aefd4adf7762c523cde358960236f05734f616ebe69c0abfcb0cc 0xAFA36c47E130d89bcE4470a9030d99f3CEcaD146 TWT:dummyPhisher + # 2024-02-21T11:35:25.580Z vulcanize:indexer isPhisher: db miss, fetching from upstream server + # ... + ``` + +* Rate for mutations is set to `100` in the watcher; go back to the `NITRO` tab in the debug panel and change amount value besides `PAY` button to >=100 + +* Perform a phisher report + * Among all three watchers running in consensus, whoever is the `LEADER` at time of reporting sends a tx to the chain + * Check all the watchers' logs: + + If the payment receiving watcher (1) is leader at that moment: + + ```bash + # On watcher-1 (payment received + tx sent) + # ... + # 2024-02-21T11:42:55.088Z vulcanize:libp2p-utils [11:42:55] Received a message on mobymask P2P network from peer: 12D3KooWGXxcwevUY7KCfw8fcGhxqxPaiFMGSU4tgJDjE54QGKzf + # 2024-02-21T11:42:55.102Z ts-nitro:engine {"msg":"Received message","_msg":{"to":"0xAAA662","from":"0x5D12ac","payloadSummaries":[],"proposalSummaries":[],"payments":[{"amount":150,"channelId":"0x654a85725442828f89b497e3973640613c03b5f5ec47302bfa4402d42c07de30"}],"rejectedObjectives":[]}} + # 2024-02-21T11:42:55.115Z laconic:payments Received a payment voucher of 100 from 0x5D12acfbBB1caD65fD61983003a50E0CB6900Fd3 + # 2024-02-21T11:42:55.115Z vulcanize:libp2p-utils Payment received for a mutation request from 0x5D12acfbBB1caD65fD61983003a50E0CB6900Fd3 + # 2024-02-21T11:42:59.115Z vulcanize:libp2p-utils Transaction receipt for invoke message { + # to: '0xAFA36c47E130d89bcE4470a9030d99f3CEcaD146', + # blockNumber: 4638, + # blockHash: '0x23a42bc2ae43771c62b0d59cc48b5858e6e2e488953527ba6a9f5119ae72b42a', + # transactionHash: '0xb61cfdfd0ffe937a191a230e1355b9bc5cdd32507f7b4f24a8e6356adf089b64', + # effectiveGasPrice: '1500000050', + # gasUsed: '136450' + # } + # ... + + # On other watchers (payment not received + tx not sent) + ... + # 2024-02-21T11:42:50.329Z laconic:consensus State changed to 3 (FOLLOWER) with term 478 + # 2024-02-21T11:42:55.089Z vulcanize:libp2p-utils [11:42:55] Received a message on mobymask P2P network from peer: 12D3KooWGXxcwevUY7KCfw8fcGhxqxPaiFMGSU4tgJDjE54QGKzf + # 2024-02-21T11:42:55.096Z vulcanize:libp2p-utils Not a leader, skipped sending L2 tx + # 2024-02-21T11:43:05.095Z vulcanize:libp2p-utils Payment not received + # ... + ``` + + If the payment receiving watcher (1) is NOT leader at that moment: + + ```bash + # On watcher 1 (payment received + tx not sent) + ... + 2024-02-21T11:46:52.049Z vulcanize:libp2p-utils [11:46:52] Received a message on mobymask P2P network from peer: 12D3KooWGXxcwevUY7KCfw8fcGhxqxPaiFMGSU4tgJDjE54QGKzf + 2024-02-21T11:46:52.051Z vulcanize:libp2p-utils Not a leader, skipped sending L2 tx + 2024-02-21T11:46:52.074Z ts-nitro:engine {"msg":"Received message","_msg":{"to":"0xAAA662","from":"0x5D12ac","payloadSummaries":[],"proposalSummaries":[],"payments":[{"amount":450,"channelId":"0x654a85725442828f89b497e3973640613c03b5f5ec47302bfa4402d42c07de30"}],"rejectedObjectives":[]}} + 2024-02-21T11:46:52.097Z laconic:payments Received a payment voucher of 100 from 0x5D12acfbBB1caD65fD61983003a50E0CB6900Fd3 + 2024-02-21T11:46:52.097Z vulcanize:libp2p-utils Payment received for a mutation request from 0x5D12acfbBB1caD65fD61983003a50E0CB6900Fd3 + ... + + # On the leader watcher (payment not received + tx sent) + ... + 2024-02-21T11:46:40.111Z vulcanize:libp2p-utils Payment not received + 2024-02-21T11:46:52.048Z vulcanize:libp2p-utils [11:46:52] Received a message on mobymask P2P network from peer: 12D3KooWGXxcwevUY7KCfw8fcGhxqxPaiFMGSU4tgJDjE54QGKzf + 2024-02-21T11:46:56.048Z vulcanize:libp2p-utils Transaction receipt for invoke message { + to: '0xAFA36c47E130d89bcE4470a9030d99f3CEcaD146', + blockNumber: 4757, + blockHash: '0x859aa54cb02e8a3f910a01b85c2a7bf9bff7540e83018e7e846f87ca1770e55e', + transactionHash: '0x92f087e4b6ac5604c9d4ecd823d526ca5f8f1bf5c2a92861d6b0f69bd899ba83', + effectiveGasPrice: '1500000050', + gasUsed: '136438' + } + ``` + +* Check the phisher status for the reported phishers to confirm state update + +## Clean up + +* From the `NITRO` tab in debug panel, perform `VIRTUAL DEFUND` and `DIRECT DEFUND` for any payment channels created + +* In the browser's console, delete all indexedDBs: + + ```bash + await clearNodeStorage() + ``` + +* Remove the snap from MetaMask flask extension