Pay for queries from watcher to indexer mode Ponder apps in payments stack #573
@ -1,15 +1,16 @@
|
|||||||
version: '3.7'
|
version: '3.7'
|
||||||
|
|
||||||
services:
|
services:
|
||||||
ponder-app:
|
ponder-app-indexer:
|
||||||
|
hostname: ponder-app-indexer
|
||||||
restart: unless-stopped
|
restart: unless-stopped
|
||||||
image: cerc/ponder:local
|
image: cerc/ponder:local
|
||||||
working_dir: /app/examples/token-erc20
|
working_dir: /app/examples/token-erc20
|
||||||
environment:
|
environment:
|
||||||
CERC_PONDER_CHAIN_ID: ${PONDER_CHAIN_ID:-99}
|
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_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_PK: ${CERC_PONDER_INDEXER_NITRO_PK:-58368d20ff12f17669c06158c21d885897aa56f9be430edc789614bf9851d53f}
|
||||||
CERC_PONDER_NITRO_CHAIN_PK: ${CERC_PONDER_NITRO_CHAIN_PK:-fb1e9af328c283ca3e2486e7c24d13582b7912057d8b9542ff41503c85bc05c0}
|
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_PONDER_NITRO_CHAIN_URL: ${CERC_PONDER_NITRO_CHAIN_URL:-http://fixturenet-eth-geth-1:8546}
|
||||||
CERC_RELAY_MULTIADDR: ${CERC_RELAY_MULTIADDR}
|
CERC_RELAY_MULTIADDR: ${CERC_RELAY_MULTIADDR}
|
||||||
CERC_UPSTREAM_NITRO_ADDRESS: ${CERC_UPSTREAM_NITRO_ADDRESS:-0xAAA6628Ec44A8a742987EF3A114dDFE2D4F7aDCE}
|
CERC_UPSTREAM_NITRO_ADDRESS: ${CERC_UPSTREAM_NITRO_ADDRESS:-0xAAA6628Ec44A8a742987EF3A114dDFE2D4F7aDCE}
|
||||||
@ -18,14 +19,45 @@ services:
|
|||||||
command: ["bash", "./ponder-start.sh"]
|
command: ["bash", "./ponder-start.sh"]
|
||||||
volumes:
|
volumes:
|
||||||
- ../config/ponder/ponder-start.sh:/app/examples/token-erc20/ponder-start.sh
|
- ../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
|
- peers_ids:/peers
|
||||||
- nitro_deployment:/nitro
|
- 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:
|
extra_hosts:
|
||||||
- "host.docker.internal:host-gateway"
|
- "host.docker.internal:host-gateway"
|
||||||
|
|
||||||
volumes:
|
volumes:
|
||||||
peers_ids:
|
peers_ids:
|
||||||
nitro_deployment:
|
nitro_deployment:
|
||||||
ponder_nitro_data:
|
ponder_indexer_nitro_data:
|
||||||
|
ponder_watcher_nitro_data:
|
||||||
|
@ -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_ADDRESS=\"$CERC_UPSTREAM_NITRO_ADDRESS\"" >> "$env_file"
|
||||||
echo "UPSTREAM_NITRO_MULTIADDR=\"$CERC_UPSTREAM_NITRO_MULTIADDR\"" >> "$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 "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"
|
cat "$env_file"
|
||||||
|
|
||||||
|
@ -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 = {
|
export const config: Config = {
|
||||||
networks: [
|
networks: [
|
||||||
@ -39,6 +39,9 @@ export const config: Config = {
|
|||||||
maxBlockRange: 100,
|
maxBlockRange: 100,
|
||||||
},
|
},
|
||||||
],
|
],
|
||||||
|
options: {
|
||||||
|
mode: AppMode.Indexer,
|
||||||
|
},
|
||||||
nitro: {
|
nitro: {
|
||||||
privateKey: process.env.PONDER_NITRO_PK!,
|
privateKey: process.env.PONDER_NITRO_PK!,
|
||||||
chainPrivateKey: process.env.PONDER_NITRO_CHAIN_PK!,
|
chainPrivateKey: process.env.PONDER_NITRO_CHAIN_PK!,
|
46
app/data/config/ponder/ponder.watcher.config.ts
Normal file
46
app/data/config/ponder/ponder.watcher.config.ts
Normal file
@ -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",
|
||||||
|
}
|
||||||
|
};
|
@ -204,12 +204,15 @@ Stack components:
|
|||||||
|
|
||||||
### ERC20 Ponder App
|
### ERC20 Ponder App
|
||||||
|
|
||||||
* Run the ponder app in it's container:
|
* Run the ponder app in indexer mode:
|
||||||
|
|
||||||
```bash
|
```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:
|
# 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: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
|
# 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
|
# 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=<PAYMENT_CHANNEL_ID>
|
||||||
|
```
|
||||||
|
|
||||||
|
* 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`)
|
* 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=<PAYMENT_CHANNEL_ID>
|
|
||||||
```
|
|
||||||
|
|
||||||
* Check the ponder - ipld-eth-server payment channel status:
|
* Check the ponder - ipld-eth-server payment channel status:
|
||||||
|
|
||||||
```bash
|
```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
|
## Clean Up
|
||||||
|
|
||||||
* In the MobyMask app, perform `VIRTUAL DEFUND` and `DIRECT DEFUND` (in order) for closing the payment channel created with watcher
|
* 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()
|
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
|
* On a fresh restart, clear activity tab data in MetaMask for concerned accounts
|
||||||
|
@ -18,7 +18,7 @@ repos:
|
|||||||
- github.com/cerc-io/mobymask-snap
|
- github.com/cerc-io/mobymask-snap
|
||||||
- github.com/cerc-io/mobymask-ui@v0.2.1
|
- github.com/cerc-io/mobymask-ui@v0.2.1
|
||||||
# ponder repo
|
# ponder repo
|
||||||
- github.com/cerc-io/ponder@laconic
|
- github.com/cerc-io/ponder@laconic-esm
|
||||||
containers:
|
containers:
|
||||||
# fixturenet images
|
# fixturenet images
|
||||||
- cerc/go-ethereum
|
- cerc/go-ethereum
|
||||||
|
Loading…
Reference in New Issue
Block a user