From 404af7ac3e27ebcb218c05f79d9a70ca966407c9 Mon Sep 17 00:00:00 2001 From: Noon van der Silk Date: Fri, 5 Nov 2021 14:33:02 +0000 Subject: [PATCH] public testnet instructions (#83) * public testnet instructions * wallet id * document pab-local-cluster * refine the note --- .gitignore | 4 +- plutus-pab/README.md | 46 +++++ plutus-pab/test-node/README.md | 172 ++++++++++++++++++ plutus-pab/test-node/faucet-example.png | Bin 0 -> 33131 bytes .../test-node/testnet/chain-index-config.json | 16 ++ plutus-pab/test-node/testnet/pab-config.yml | 52 ++++++ 6 files changed, 287 insertions(+), 3 deletions(-) create mode 100644 plutus-pab/test-node/README.md create mode 100644 plutus-pab/test-node/faucet-example.png create mode 100644 plutus-pab/test-node/testnet/chain-index-config.json create mode 100644 plutus-pab/test-node/testnet/pab-config.yml diff --git a/.gitignore b/.gitignore index 4153d6ae44..a85e80ee3c 100644 --- a/.gitignore +++ b/.gitignore @@ -109,10 +109,8 @@ node.sock secrets/*/.gpg-id ghcid.txt plutus-pab/test-node/testnet/db +plutus-pab/test-node/testnet/restore-wallet.json plutus-pab/test-node/alonzo-purple/db # profiling output files *.timelog *.stacks - -# testnet configs -testnet/ diff --git a/plutus-pab/README.md b/plutus-pab/README.md index 77fa15c4a4..3ace78b54f 100644 --- a/plutus-pab/README.md +++ b/plutus-pab/README.md @@ -28,6 +28,7 @@ $ nix-build ../default.nix -A plutus-apps.haskell.packages.plutus-pab ## PAB Components PAB contains several commands and services, which are outlined below. +- [pab-local-cluster](#pab-local-cluster) - [psgenerator](#psgenerator) - [migrate](#migrate) - [all-servers](#all-servers) @@ -38,6 +39,51 @@ PAB contains several commands and services, which are outlined below. - [chain-index](#chain-index) - [default-logging-config](#default-logging-config) + +### pab-local-cluster + +#### Description + +Can be used to run end-to-end tests using a private local testnet. + +#### Example + +1. Build necessary components: + +``` +> cabal build plutus-pab-local-cluster cardano-node cardano-wallet +``` + +2. Get config data: + + Clone to $DIR and set the + `SHELLEY_TEST_DATA` environment variable: + + ``` + export SHELLEY_TEST_DATA=$DIR/lib/shelley/test/data/cardano-node-shelley + ``` + +3. Run the local cluster: + +``` +> cabal exec plutus-pab-local-cluster +``` + +4. Wait until the message `Starting PAB backend server on port 9080` appears. + +5. Run the integration test: + +``` +curl -H "Content-Type: application/json" -v \ + -X POST \ + -d '{"caID":{"tag":"IntegrationTest"},"caWallet":{"getWalletId":"2d4cc31a4b3116ab86bfe529d30d9c362acd0b44"}}' \ + localhost:9080/api/contract/activate +``` + +A couple of log messages appear, the last one should say something like "Tx +confirmed. Integration test complete." + + ### psgenerator ``` diff --git a/plutus-pab/test-node/README.md b/plutus-pab/test-node/README.md new file mode 100644 index 0000000000..032acd2621 --- /dev/null +++ b/plutus-pab/test-node/README.md @@ -0,0 +1,172 @@ +## Instructions for running a public testnet end-to-end integration test + +What follows is a series of steps to demonstrate running an end-to-end +integration test of the PAB on the public testnet. + +#### Process + +Assumptions: + +- You have the `plutus-apps` repo checked out at `$PLUTUS` +- You have [jq](https://stedolan.github.io/jq/) +- You have a few hours to wait for everything to sync (the first time.) + +Steps: + +You will need ~6 terminals to run all the different components. + + +1. Build all the necessary components: + + ``` + > cd $PLUTUS + > cabal build plutus-pab-examples plutus-chain-index cardano-node cardano-wallet + ``` + +2. Start the testnet node locally: + + ``` + > cd $PLUTUS/plutus-pab/test-node/ + > ./start-testnet-node.sh + ``` + + Note: It's important that this is done from the specific directory, because + the config paths are relative. + +3. Run the cardano wallet backend: + + ``` + > cd $PLUTUS/plutus-pab/test-node/ + > cabal exec -- cardano-wallet serve \ + --testnet testnet/testnet-byron-genesis.json \ + --node-socket testnet/node.sock + ``` + +4. Create or restore a public testnet wallet: + + Here you have a few options. You can re-use an existing wallet, or create + one. + + **Create a new wallet** + + - Generate a recovery phrase: + + ``` + > cabal exec -- cardano-wallet recovery-phrase generate + ``` + + - Save this in a file named `restore-wallet.json` in the `testnet` folder: + + ``` + > cd $PLUTUS/plutus-pab/test-node/ + > cat testnet/restore-wallet.json + { "name": "PAB testing wallet" + , "mnemonic_sentence": ["word1", "word2", ...] + , "passphrase": "pab123456789" + } + ``` + + - Load the wallet: + + ``` + > cd $PLUTUS/plutus-pab/test-node/ + > curl -H "content-type: application/json" -XPOST \ + -d @testnet/restore-wallet.json \ + localhost:8090/v2/wallets + ``` + + Then, take note of the Wallet ID that is created, and save that: + + ``` + > export WALLET_ID=... + ``` + + - Put some tAda in it, by first obtaining an address: + + ``` + > curl -H "content-type: application/json" \ + -XGET localhost:8090/v2/wallets/$WALLET_ID/addresses | jq '.' + ``` + + (Any address will do.) + + - Then, navigate over to the [tesnet + faucet](https://testnets.cardano.org/en/testnets/cardano/tools/faucet/) and + send it some tAda. + + You can verify that the transfer has taken place by clicking the link the + faucet application gives you; you see a transaction like so: + + ![](faucet-example.png) + +5. Start the chain index: + + ``` + > cd $PLUTUS/plutus-pab/test-node/ + > cabal exec -- plutus-chain-index --config testnet/chain-index-config.json start-index + ``` + +6. Start the PAB: + + If it's the first time your running, you'll need to ask the PAB to make the + database: + + ``` + > cd $PLUTUS/plutus-pab/test-node/ + > cabal exec -- plutus-pab-examples \ + --config testnet/pab-config.yml migrate + ``` + + Then, run the PAB + + ``` + > cd $PLUTUS/plutus-pab/test-node/ + > cabal exec -- plutus-pab-examples \ + --config testnet/pab-config.yml webserver \ + --passphrase pab123456789 + ``` + +7. Wait for all chain clients (`cardano-node`, `cardano-wallet`, + `plutus-pab-examples`, `plutus-chain-index`) to fully synchronise with the testnet. + + On my computer, the wallet takes about 1 hour, and the chain index takes + about 3 hours. + + You can check what slot it needs to get up to by checking [the testnet + explorer](https://explorer.cardano-testnet.iohkdev.io/en); and you can query + the status of the chain index like so: + + ``` + > curl -s localhost:9083/tip | jq '.tipSlot.getSlot' + ``` + + When it's fully synced the slot should be the same slot that the + plutus-pab-examples process last printed to the console. Note that the PAB + process will be silent for a while, after the initial log messages, before + it starts printing log messages about its sync status. **You _must_ wait** + for the PAB to start printing messages like: + + ``` + ... + Current block: 327295. Current slot: 41749136. + Current block: 327295. Current slot: 41749150. + ``` + + before running the next step. (In fact, it's okay not to wait, and it will + complete eventually; but if you want to see it live, then wait.) + + +8. **Start the integration test** + + ``` + > curl -H "Content-Type: application/json" -v -X POST -d \ + "{\"caID\":{\"tag\":\"IntegrationTest\"},\"caWallet\":{\"getWalletId\":\"$WALLET_ID\"}}" \ + localhost:9080/api/contract/activate + ``` + +9. Wait for the integration test to finish. + + There will be a message like `"Tx confirmed. Integration test complete."` + printed from the console running the pab. + +That's it! diff --git a/plutus-pab/test-node/faucet-example.png b/plutus-pab/test-node/faucet-example.png new file mode 100644 index 0000000000000000000000000000000000000000..3e069281dfd7a723be9a960c422b762f1d0626ea GIT binary patch literal 33131 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