From 0bec51e96a2ed50ed754e8f17b429f59d531d40c Mon Sep 17 00:00:00 2001 From: Nabarun Gogoi Date: Thu, 12 Oct 2023 14:16:44 +0530 Subject: [PATCH] Pay for queries from watcher to indexer mode Ponder apps in payments stack (#573) * Use ponder in watcher mode and indexer mode separately in payments stack * Refactor config file and configure env variables for watcher mode * Update demo.md for payments stack * Handle review changes * Setup config to pay for watcher to indexer GQL queries * Fix config in stack for making payments in watcher ponder app * Update demo for payment from watcher to indexer mode Ponder apps * Use laconic-esm brannch for ponder --------- Co-authored-by: Shreerang Kale --- app/data/compose/docker-compose-ponder.yml | 44 ++++++++++++--- app/data/config/ponder/ponder-start.sh | 3 ++ ...der.config.ts => ponder.indexer.config.ts} | 7 ++- .../config/ponder/ponder.watcher.config.ts | 46 ++++++++++++++++ app/data/stacks/fixturenet-payments/demo.md | 53 +++++++++++++++---- app/data/stacks/fixturenet-payments/stack.yml | 2 +- 6 files changed, 137 insertions(+), 18 deletions(-) rename app/data/config/ponder/{ponder.config.ts => ponder.indexer.config.ts} (87%) create mode 100644 app/data/config/ponder/ponder.watcher.config.ts diff --git a/app/data/compose/docker-compose-ponder.yml b/app/data/compose/docker-compose-ponder.yml index d0ea29e6..ca054a7d 100644 --- a/app/data/compose/docker-compose-ponder.yml +++ b/app/data/compose/docker-compose-ponder.yml @@ -1,15 +1,16 @@ version: '3.7' services: - ponder-app: + ponder-app-indexer: + hostname: ponder-app-indexer restart: unless-stopped image: cerc/ponder:local working_dir: /app/examples/token-erc20 environment: CERC_PONDER_CHAIN_ID: ${PONDER_CHAIN_ID:-99} CERC_PONDER_RPC_URL_1: ${PONDER_RPC_URL_1:-http://nitro-reverse-payment-proxy:8081} - CERC_PONDER_NITRO_PK: ${CERC_PONDER_NITRO_PK:-58368d20ff12f17669c06158c21d885897aa56f9be430edc789614bf9851d53f} - CERC_PONDER_NITRO_CHAIN_PK: ${CERC_PONDER_NITRO_CHAIN_PK:-fb1e9af328c283ca3e2486e7c24d13582b7912057d8b9542ff41503c85bc05c0} + CERC_PONDER_NITRO_PK: ${CERC_PONDER_INDEXER_NITRO_PK:-58368d20ff12f17669c06158c21d885897aa56f9be430edc789614bf9851d53f} + CERC_PONDER_NITRO_CHAIN_PK: ${CERC_PONDER_INDEXER_NITRO_CHAIN_PK:-fb1e9af328c283ca3e2486e7c24d13582b7912057d8b9542ff41503c85bc05c0} CERC_PONDER_NITRO_CHAIN_URL: ${CERC_PONDER_NITRO_CHAIN_URL:-http://fixturenet-eth-geth-1:8546} CERC_RELAY_MULTIADDR: ${CERC_RELAY_MULTIADDR} CERC_UPSTREAM_NITRO_ADDRESS: ${CERC_UPSTREAM_NITRO_ADDRESS:-0xAAA6628Ec44A8a742987EF3A114dDFE2D4F7aDCE} @@ -18,14 +19,45 @@ services: command: ["bash", "./ponder-start.sh"] volumes: - ../config/ponder/ponder-start.sh:/app/examples/token-erc20/ponder-start.sh - - ../config/ponder/ponder.config.ts:/app/examples/token-erc20/ponder.config.ts + - ../config/ponder/ponder.indexer.config.ts:/app/examples/token-erc20/ponder.config.ts - peers_ids:/peers - nitro_deployment:/nitro - - ponder_nitro_data:/app/examples/token-erc20/.ponder/nitro-db + - ponder_indexer_nitro_data:/app/examples/token-erc20/.ponder/nitro-db + ports: + - "42070" + extra_hosts: + - "host.docker.internal:host-gateway" + + ponder-app-watcher: + hostname: ponder-app-watcher + depends_on: + - ponder-app-indexer + restart: unless-stopped + image: cerc/ponder:local + working_dir: /app/examples/token-erc20 + environment: + CERC_PONDER_CHAIN_ID: ${PONDER_CHAIN_ID:-99} + CERC_PONDER_NITRO_PK: ${CERC_PONDER_WATCHER_NITRO_PK:-febb3b74b0b52d0976f6571d555f4ac8b91c308dfa25c7b58d1e6a7c3f50c781} + CERC_PONDER_NITRO_CHAIN_PK: ${CERC_PONDER_WATCHER_NITRO_CHAIN_PK:-be4aa664815ea3bc3d63118649a733f6c96b243744310806ecb6d96359ab62cf} + CERC_PONDER_NITRO_CHAIN_URL: ${CERC_PONDER_NITRO_CHAIN_URL:-http://fixturenet-eth-geth-1:8546} + CERC_RELAY_MULTIADDR: ${CERC_RELAY_MULTIADDR} + CERC_INDEXER_GQL_ENDPOINT: ${CERC_INDEXER_GQL_ENDPOINT:-http://ponder-app-indexer:42070/graphql} + CERC_INDEXER_NITRO_ADDRESS: ${CERC_INDEXER_NITRO_ADDRESS:-0x67D5b55604d1aF90074FcB69b8C51838FFF84f8d} + CERC_INDEXER_NITRO_PAY_AMOUNT: ${CERC_INDEXER_NITRO_PAY_AMOUNT:-50} + command: ["bash", "./ponder-start.sh"] + volumes: + - ../config/ponder/ponder-start.sh:/app/examples/token-erc20/ponder-start.sh + - ../config/ponder/ponder.watcher.config.ts:/app/examples/token-erc20/ponder.config.ts + - peers_ids:/peers + - nitro_deployment:/nitro + - ponder_watcher_nitro_data:/app/examples/token-erc20/.ponder/nitro-db + ports: + - "42069" extra_hosts: - "host.docker.internal:host-gateway" volumes: peers_ids: nitro_deployment: - ponder_nitro_data: + ponder_indexer_nitro_data: + ponder_watcher_nitro_data: diff --git a/app/data/config/ponder/ponder-start.sh b/app/data/config/ponder/ponder-start.sh index 51d2447b..4fec4120 100755 --- a/app/data/config/ponder/ponder-start.sh +++ b/app/data/config/ponder/ponder-start.sh @@ -53,6 +53,9 @@ echo "RELAY_MULTIADDR=\"$CERC_RELAY_MULTIADDR\"" >> "$env_file" echo "UPSTREAM_NITRO_ADDRESS=\"$CERC_UPSTREAM_NITRO_ADDRESS\"" >> "$env_file" echo "UPSTREAM_NITRO_MULTIADDR=\"$CERC_UPSTREAM_NITRO_MULTIADDR\"" >> "$env_file" echo "UPSTREAM_NITRO_PAY_AMOUNT=\"$CERC_UPSTREAM_NITRO_PAY_AMOUNT\"" >> "$env_file" +echo "INDEXER_GQL_ENDPOINT=\"$CERC_INDEXER_GQL_ENDPOINT\"" >> "$env_file" +echo "INDEXER_NITRO_ADDRESS=\"$CERC_INDEXER_NITRO_ADDRESS\"" >> "$env_file" +echo "INDEXER_NITRO_PAY_AMOUNT=\"$CERC_INDEXER_NITRO_PAY_AMOUNT\"" >> "$env_file" cat "$env_file" diff --git a/app/data/config/ponder/ponder.config.ts b/app/data/config/ponder/ponder.indexer.config.ts similarity index 87% rename from app/data/config/ponder/ponder.config.ts rename to app/data/config/ponder/ponder.indexer.config.ts index be73af9a..ddce62d2 100644 --- a/app/data/config/ponder/ponder.config.ts +++ b/app/data/config/ponder/ponder.indexer.config.ts @@ -1,6 +1,6 @@ -import type { Config } from "@ponder/core"; +import { type Config, AppMode } from "@ponder/core"; -import contractAddresses from "./nitro-addresses.json"; +import contractAddresses from "./nitro-addresses.json" assert { type: "json" }; export const config: Config = { networks: [ @@ -39,6 +39,9 @@ export const config: Config = { maxBlockRange: 100, }, ], + options: { + mode: AppMode.Indexer, + }, nitro: { privateKey: process.env.PONDER_NITRO_PK!, chainPrivateKey: process.env.PONDER_NITRO_CHAIN_PK!, diff --git a/app/data/config/ponder/ponder.watcher.config.ts b/app/data/config/ponder/ponder.watcher.config.ts new file mode 100644 index 00000000..72c795cc --- /dev/null +++ b/app/data/config/ponder/ponder.watcher.config.ts @@ -0,0 +1,46 @@ +import { type Config, AppMode } from "@ponder/core"; + +import contractAddresses from "./nitro-addresses.json" assert { type: "json" }; + +export const config: Config = { + networks: [ + { + name: "fixturenet", + chainId: Number(process.env.PONDER_CHAIN_ID), + }, + ], + contracts: [ + { + name: "AdventureGold", + network: "fixturenet", + abi: "./abis/AdventureGold.json", + address: "0x32353A6C91143bfd6C7d363B546e62a9A2489A20", + startBlock: 5, + maxBlockRange: 100, + }, + ], + options: { + mode: AppMode.Watcher, + }, + indexer: { + gqlEndpoint: process.env.INDEXER_GQL_ENDPOINT, + payments: { + nitro: { + address: process.env.INDEXER_NITRO_ADDRESS, + fundingAmounts: { + directFund: "1000000000000", + virtualFund: "1000000000", + }, + }, + amount: process.env.INDEXER_NITRO_PAY_AMOUNT, + }, + }, + nitro: { + privateKey: process.env.PONDER_NITRO_PK!, + chainPrivateKey: process.env.PONDER_NITRO_CHAIN_PK!, + chainUrl: process.env.PONDER_NITRO_CHAIN_URL!, + contractAddresses, + relayMultiAddr: process.env.RELAY_MULTIADDR!, + store: "./.ponder/nitro-db", + } +}; diff --git a/app/data/stacks/fixturenet-payments/demo.md b/app/data/stacks/fixturenet-payments/demo.md index 579225da..fc01f3b1 100644 --- a/app/data/stacks/fixturenet-payments/demo.md +++ b/app/data/stacks/fixturenet-payments/demo.md @@ -204,12 +204,15 @@ Stack components: ### ERC20 Ponder App -* Run the ponder app in it's container: +* Run the ponder app in indexer mode: ```bash - docker exec -it payments-ponder-app-1 bash -c "pnpm start" + docker exec -it payments-ponder-app-indexer-1 bash -c "DEBUG=laconic:payments pnpm start" # Expected output: + # 08:00:28.701 INFO payment Nitro node setup with address 0x67D5b55604d1aF90074FcB69b8C51838FFF84f8d + # laconic:payments Starting voucher subscription... +0ms + # ... # 09:58:54.288 INFO payment Creating ledger channel with nitro node 0xAAA6628Ec44A8a742987EF3A114dDFE2D4F7aDCE # ... # 09:59:14.230 INFO payment Creating payment channel with nitro node 0xAAA6628Ec44A8a742987EF3A114dDFE2D4F7aDCE @@ -217,7 +220,13 @@ Stack components: # 09:59:14.329 INFO payment Using payment channel 0x10f049519bc3f862e2b26e974be8666886228f30ea54aab06e2f23718afffab0 ``` -* On starting the Ponder app, it creates a payment channel with the `ipld-eth-server`'s Nitro node and then starts the historical sync service +* Export the payment channel id to a variable: + + ```bash + export PONDER_UPSTREAM_PAYMENT_CHANNEL= + ``` + +* On starting the Ponder app in indexer mode, it creates a payment channel with the `ipld-eth-server`'s Nitro node and then starts the historical sync service * The sync service makes several ETH RPC requests to the `ipld-eth-server` to fetch required data; check the payment proxy server logs for charged RPC requests (`eth_getBlockByNumber`, `eth_getLogs`) @@ -237,12 +246,6 @@ Stack components: # ... ``` -* Export the payment channel id to a variable: - - ```bash - export PONDER_UPSTREAM_PAYMENT_CHANNEL= - ``` - * Check the ponder - ipld-eth-server payment channel status: ```bash @@ -262,6 +265,33 @@ Stack components: # } ``` +* In another terminal run the ponder app in watcher mode: + ```bash + docker exec -it payments-ponder-app-watcher-1 bash -c "DEBUG=laconic:payments pnpm start" + + # Expected output: + # 11:23:22.057 DEBUG app Started using config file: ponder.config.ts + # 08:02:12.548 INFO payment Nitro node setup with address 0x111A00868581f73AB42FEEF67D235Ca09ca1E8db + # laconic:payments Starting voucher subscription... +0ms + # 08:02:17.417 INFO payment Creating ledger channel with nitro node 0x67D5b55604d1aF90074FcB69b8C51838FFF84f8d ... + # 08:02:37.135 INFO payment Creating payment channel with nitro node 0x67D5b55604d1aF90074FcB69b8C51838FFF84f8d ... + # 08:02:37.313 INFO payment Using payment channel 0x4b8e67f6a6fcfe114fdd60b85f963344ece4c77d4eea3825688c74b45ff5509b + # ... + # 11:23:22.436 INFO server Started responding as healthy + ``` + +* Check the terminal in which indexer mode ponder is running. Logs of payment for `eth_getLogs` queries can be seen: + ```bash + # ... + # 08:02:37.763 DEBUG realtime Finished processing new head block 89 (network=fixturenet) + # laconic:payments Received a payment voucher of 50 from 0x111A00868581f73AB42FEEF67D235Ca09ca1E8db +444ms + # laconic:payments Serving a paid query for 0x111A00868581f73AB42FEEF67D235Ca09ca1E8db +1ms + # 08:02:37.804 DEBUG payment Verified payment for GQL queries getLogEvents + # laconic:payments Received a payment voucher of 50 from 0x111A00868581f73AB42FEEF67D235Ca09ca1E8db +45ms + # laconic:payments Serving a paid query for 0x111A00868581f73AB42FEEF67D235Ca09ca1E8db +0ms + # 08:02:37.849 DEBUG payment Verified payment for GQL queries getLogEvents + ``` + ## Clean Up * In the MobyMask app, perform `VIRTUAL DEFUND` and `DIRECT DEFUND` (in order) for closing the payment channel created with watcher @@ -272,4 +302,9 @@ Stack components: await clearNodeStorage() ``` +* Run the following in the browser console to clear data in local storage: + ```bash + localStorage.clear() + ``` + * On a fresh restart, clear activity tab data in MetaMask for concerned accounts diff --git a/app/data/stacks/fixturenet-payments/stack.yml b/app/data/stacks/fixturenet-payments/stack.yml index 6a06d77e..ec52b577 100644 --- a/app/data/stacks/fixturenet-payments/stack.yml +++ b/app/data/stacks/fixturenet-payments/stack.yml @@ -18,7 +18,7 @@ repos: - github.com/cerc-io/mobymask-snap - github.com/cerc-io/mobymask-ui@v0.2.1 # ponder repo - - github.com/cerc-io/ponder@laconic + - github.com/cerc-io/ponder@laconic-esm containers: # fixturenet images - cerc/go-ethereum