Skip to content

Commit

Permalink
Merge pull request #1459 from input-output-hk/jpraynaud/enhance-end-t…
Browse files Browse the repository at this point in the history
…o-end-hard-forks

Enhance end to end test for Cardano hard forks
  • Loading branch information
jpraynaud committed Jan 26, 2024
2 parents 06714b2 + 26841c3 commit 4153c47
Show file tree
Hide file tree
Showing 4 changed files with 108 additions and 28 deletions.
40 changes: 29 additions & 11 deletions .github/workflows/ci.yml
Expand Up @@ -262,22 +262,33 @@ jobs:
base-ref: ${{ github.event.pull_request.base.sha || 'main' }}
head-ref: ${{ github.event.pull_request.head.sha || github.ref }}

run-test-lab:
e2e:
runs-on: ubuntu-22.04
needs: [ build-ubuntu-X64 ]
strategy:
fail-fast: false
matrix:
mode: ["std"]
era: ${{ fromJSON(needs.build-ubuntu-X64.outputs.eras) }}
run_id: [1,2,3]
# Deactivate Conway era which is not currently working with the Pallas Chain Observer yet, value should be 5-10
hard_fork_latest_era_at_epoch: [1000]
cardano_node_version: ["8.7.3"]
hard_fork_latest_era_at_epoch: [0,10,100]
run_id: ["#1","#2"]
extra_args: [""]

include:
- era: ${{ fromJSON(needs.build-ubuntu-X64.outputs.eras)[0] }}
run_id: 3
hard_fork_latest_era_at_epoch: 1000
# Include a hard fork test for `8.1.2` which is not concerned
- mode: "std"
era: ${{ fromJSON(needs.build-ubuntu-X64.outputs.eras)[0] }}
cardano_node_version: "8.1.2"
hard_fork_latest_era_at_epoch: 100
run_id: "#1"
extra_args: ""
# Include a test for the P2P mode
- mode: "p2p"
era: ${{ fromJSON(needs.build-ubuntu-X64.outputs.eras)[0] }}
cardano_node_version: "8.7.3"
hard_fork_latest_era_at_epoch: 100
run_id: "#1"
extra_args: "--use-p2p-network"
steps:
- name: Checkout sources
Expand All @@ -304,7 +315,14 @@ jobs:
mkdir artifacts
- name: Test
run: ./mithril-end-to-end -vvv --bin-directory ./bin --work-directory=./artifacts --devnet-scripts-directory=./mithril-test-lab/mithril-devnet --mithril-era=${{ matrix.era }} ${{ matrix.extra_args }} --cardano-hard-fork-latest-era-at-epoch ${{ matrix.hard_fork_latest_era_at_epoch }}
run: |
./mithril-end-to-end -vvv \
--bin-directory ./bin \
--work-directory=./artifacts \
--devnet-scripts-directory=./mithril-test-lab/mithril-devnet \
--mithril-era=${{ matrix.era }} \
--cardano-node-version ${{ matrix.cardano_node_version }} \
--cardano-hard-fork-latest-era-at-epoch ${{ matrix.hard_fork_latest_era_at_epoch }} ${{ matrix.extra_args }}
- name: Upload E2E Tests Artifacts
if: ${{ failure() }}
Expand Down Expand Up @@ -356,7 +374,7 @@ jobs:
- build
- check
- test
- run-test-lab
- e2e
strategy:
fail-fast: false
matrix:
Expand Down Expand Up @@ -422,7 +440,7 @@ jobs:
needs:
- build
- test
- run-test-lab
- e2e
- check
steps:
- name: Checkout sources
Expand Down Expand Up @@ -481,7 +499,7 @@ jobs:
- build
- build-test-wasm
- test
- run-test-lab
- e2e
- check
steps:
- name: Checkout sources
Expand Down
2 changes: 1 addition & 1 deletion mithril-test-lab/mithril-devnet/VERSION
@@ -1 +1 @@
0.2.4
0.2.5
73 changes: 61 additions & 12 deletions mithril-test-lab/mithril-devnet/mkfiles/mkfiles-mithril.sh
Expand Up @@ -20,17 +20,65 @@ cat >> era-mithril.sh <<EOF
#!/usr/bin/env bash
set -e
# Wait for a number of blocks has elapsed
function wait_for_elapsed_blocks {
CARDANO_BLOCK_OFFSET=\$1
CARDANO_NEXT_BLOCK_WAIT_ROUNDS_MAX=30
CARDANO_NEXT_BLOCK_WAIT_ROUNDS=1
CARDANO_NEXT_BLOCK_WAIT_ROUND_DELAY=2
CURRENT_CARDANO_BLOCK=\$(CARDANO_NODE_SOCKET_PATH=node-pool${N}/ipc/node.sock ./cardano-cli query tip \\
--testnet-magic ${NETWORK_MAGIC} \\
| jq -r '.block')
while true
do
CARDANO_BLOCK_TARGET=\$(( \${CURRENT_CARDANO_BLOCK} + \${CARDANO_BLOCK_OFFSET} ))
CARDANO_BLOCK=\$(CARDANO_NODE_SOCKET_PATH=node-pool${N}/ipc/node.sock ./cardano-cli query tip \\
--testnet-magic ${NETWORK_MAGIC} \\
| jq -r '.block')
if [ \$CARDANO_BLOCK -lt \$CARDANO_BLOCK_TARGET ] ; then
echo ">>>> Cardano target block not reached yet... [current: \$CARDANO_BLOCK, target: \$CARDANO_BLOCK_TARGET] [attempt \$CARDANO_NEXT_BLOCK_WAIT_ROUNDS]"
sleep \$CARDANO_NEXT_BLOCK_WAIT_ROUND_DELAY
else
echo ">>>> Cardano target block is reached [current: \$CARDANO_BLOCK, target: \$CARDANO_BLOCK_TARGET] [attempt \$CARDANO_NEXT_BLOCK_WAIT_ROUNDS]"
sleep \$CARDANO_NEXT_BLOCK_WAIT_ROUND_DELAY
break
fi
CARDANO_NEXT_BLOCK_WAIT_ROUNDS=\$(( \$CARDANO_NEXT_BLOCK_WAIT_ROUNDS + 1 ))
if [ "\$CARDANO_NEXT_BLOCK_WAIT_ROUNDS" -gt "\$CARDANO_NEXT_BLOCK_WAIT_ROUNDS_MAX" ] ; then
echo ">>>> Timeout: Cardano target block was not reached within \$CARDANO_NEXT_BLOCK_WAIT_ROUNDS_MAX attempts"
exit 1
fi
done
}
EOF

cat >> era-mithril.sh <<EOF
# Get current Cardano era
CURRENT_CARDANO_ERA=\$(CARDANO_NODE_SOCKET_PATH=node-pool${N}/ipc/node.sock ./cardano-cli query tip \\
--testnet-magic ${NETWORK_MAGIC} \\
| jq -r '.era |= ascii_downcase | .era')
echo ">>>> Current Cardano Era: \${CURRENT_CARDANO_ERA}"
# Fix: era related command is not (well) supported in Cardano node version '8.1.2'
if [ "${CARDANO_NODE_VERSION}" = "8.1.2" ]; then
CURRENT_CARDANO_ERA=""
fi
# Get current Cardano block
CURRENT_CARDANO_BLOCK=\$(CARDANO_NODE_SOCKET_PATH=node-pool${N}/ipc/node.sock ./cardano-cli query tip \\
--testnet-magic ${NETWORK_MAGIC} \\
| jq -r '.block')
echo ">>>> Current Cardano Block: \${CURRENT_CARDANO_BLOCK}"
# Send funds to Mithril era address
## Get the UTxO of utxo${N}
TX_IN=\$(CARDANO_NODE_SOCKET_PATH=node-pool${N}/ipc/node.sock ./cardano-cli query utxo \\
--testnet-magic ${NETWORK_MAGIC} --address \$(cat addresses/utxo${N}.addr) --out-file /dev/stdout \\
--testnet-magic ${NETWORK_MAGIC} --address \$(cat addresses/utxo${N}.addr) --out-file /dev/stdout \\
| jq -r 'to_entries | [last] | .[0].key')
## Build the transaction
CARDANO_NODE_SOCKET_PATH=node-pool${N}/ipc/node.sock ./cardano-cli transaction build \\
CARDANO_NODE_SOCKET_PATH=node-pool${N}/ipc/node.sock ./cardano-cli \${CURRENT_CARDANO_ERA} transaction build \\
--tx-in \${TX_IN} \\
--tx-out \$(cat addresses/${ADDR}.addr)+${AMOUNT_TRANSFERRED} \\
--change-address \$(cat addresses/utxo${N}.addr) \\
Expand All @@ -39,27 +87,27 @@ cat >> era-mithril.sh <<EOF
--out-file node-pool${N}/tx/tx${N}-era-funds.txbody
## Sign the transaction
CARDANO_NODE_SOCKET_PATH=node-pool${N}/ipc/node.sock ./cardano-cli transaction sign \\
CARDANO_NODE_SOCKET_PATH=node-pool${N}/ipc/node.sock ./cardano-cli \${CURRENT_CARDANO_ERA} transaction sign \\
--signing-key-file addresses/utxo${N}.skey \\
--testnet-magic ${NETWORK_MAGIC} \\
--tx-body-file node-pool${N}/tx/tx${N}-era-funds.txbody \\
--out-file node-pool${N}/tx/tx${N}-era-funds.tx
## Submit the transaction
CARDANO_NODE_SOCKET_PATH=node-pool${N}/ipc/node.sock ./cardano-cli transaction submit \\
CARDANO_NODE_SOCKET_PATH=node-pool${N}/ipc/node.sock ./cardano-cli \${CURRENT_CARDANO_ERA} transaction submit \\
--tx-file node-pool${N}/tx/tx${N}-era-funds.tx \\
--testnet-magic ${NETWORK_MAGIC}
## Wait for the transaction to be confirmed
sleep 1
## Wait at least for 2 blocks so that the transaction is confirmed
wait_for_elapsed_blocks 2
# Write the era datum on chain
TX_IN=\$(CARDANO_NODE_SOCKET_PATH=node-pool${N}/ipc/node.sock ./cardano-cli query utxo \\
--testnet-magic ${NETWORK_MAGIC} --address \$(cat addresses/${ADDR}.addr) --out-file /dev/stdout \\
--testnet-magic ${NETWORK_MAGIC} --address \$(cat addresses/${ADDR}.addr) --out-file /dev/stdout \\
| jq -r 'to_entries | [last] | .[0].key')
## Build the transaction
CARDANO_NODE_SOCKET_PATH=node-pool${N}/ipc/node.sock ./cardano-cli transaction build \\
CARDANO_NODE_SOCKET_PATH=node-pool${N}/ipc/node.sock ./cardano-cli \${CURRENT_CARDANO_ERA} transaction build \\
--tx-in \${TX_IN} \\
--tx-out \$(cat addresses/${ADDR}.addr)+${SCRIPT_TX_VALUE} \\
--tx-out-inline-datum-file \${DATUM_FILE} \\
Expand All @@ -69,19 +117,20 @@ cat >> era-mithril.sh <<EOF
--out-file node-pool${N}/tx/tx${N}-era-datum.txbody
## Sign the transaction
CARDANO_NODE_SOCKET_PATH=node-pool${N}/ipc/node.sock ./cardano-cli transaction sign \\
CARDANO_NODE_SOCKET_PATH=node-pool${N}/ipc/node.sock ./cardano-cli \${CURRENT_CARDANO_ERA} transaction sign \\
--signing-key-file addresses/${ADDR}.skey \\
--testnet-magic ${NETWORK_MAGIC} \\
--tx-body-file node-pool${N}/tx/tx${N}-era-datum.txbody \\
--out-file node-pool${N}/tx/tx${N}-era-datum.tx
## Submit the transaction
CARDANO_NODE_SOCKET_PATH=node-pool${N}/ipc/node.sock ./cardano-cli transaction submit \\
CARDANO_NODE_SOCKET_PATH=node-pool${N}/ipc/node.sock ./cardano-cli \${CURRENT_CARDANO_ERA} transaction submit \\
--tx-file node-pool${N}/tx/tx${N}-era-datum.tx \\
--testnet-magic ${NETWORK_MAGIC}
## Wait for the transaction to be confirmed
sleep 2
## Wait at least for 2 blocks so that the transaction is confirmed
wait_for_elapsed_blocks 2
EOF

Expand Down
21 changes: 17 additions & 4 deletions mithril-test-lab/mithril-devnet/mkfiles/mkfiles-pools.sh
Expand Up @@ -33,10 +33,23 @@ cat >> delegate.sh <<EOF
#!/usr/bin/env bash
set -e
# Get current Cardano era
CURRENT_CARDANO_ERA=\$(CARDANO_NODE_SOCKET_PATH=node-pool${N}/ipc/node.sock ./cardano-cli query tip \\
--testnet-magic ${NETWORK_MAGIC} \\
| jq -r '.era |= ascii_downcase | .era')
echo ">>>> Current Cardano Era: \${CURRENT_CARDANO_ERA}"
# Fix: era related command is not (well) supported in Cardano node version '8.1.2'
if [ "${CARDANO_NODE_VERSION}" = "8.1.2" ]; then
CURRENT_CARDANO_ERA=""
fi
# Get the current epoch
CURRENT_EPOCH=\$(CARDANO_NODE_SOCKET_PATH=node-pool${N}/ipc/node.sock ./cardano-cli query tip \\
--cardano-mode \\
--testnet-magic ${NETWORK_MAGIC} | jq .epoch)
echo ">>>> Current Epoch: \${CURRENT_EPOCH}"
EOF

# Prepare transactions for delegating to stake pools
Expand All @@ -52,7 +65,7 @@ for N in ${POOL_NODES_N}; do
# Build the transaction
if [ "\$DELEGATION_ROUND" -eq 1 ]; then
# First delegation round, we need to include registration certificate and delegation certificate
CARDANO_NODE_SOCKET_PATH=node-pool${N}/ipc/node.sock ./cardano-cli transaction build \\
CARDANO_NODE_SOCKET_PATH=node-pool${N}/ipc/node.sock ./cardano-cli \${CURRENT_CARDANO_ERA} transaction build \\
--tx-in \${TX_IN} \\
--tx-out \$(cat addresses/user${N}.addr)+\${AMOUNT_STAKED} \\
--change-address \$(cat addresses/utxo${N}.addr) \\
Expand All @@ -64,7 +77,7 @@ for N in ${POOL_NODES_N}; do
--witness-override 2
else
# All other delegation rounds, we need to include only delegation certificate
CARDANO_NODE_SOCKET_PATH=node-pool${N}/ipc/node.sock ./cardano-cli transaction build \\
CARDANO_NODE_SOCKET_PATH=node-pool${N}/ipc/node.sock ./cardano-cli \${CURRENT_CARDANO_ERA} transaction build \\
--tx-in \${TX_IN} \\
--tx-out \$(cat addresses/user${N}.addr)+\${AMOUNT_STAKED} \\
--change-address \$(cat addresses/utxo${N}.addr) \\
Expand All @@ -76,15 +89,15 @@ for N in ${POOL_NODES_N}; do
fi
# Sign the transaction
CARDANO_NODE_SOCKET_PATH=node-pool${N}/ipc/node.sock ./cardano-cli transaction sign \\
CARDANO_NODE_SOCKET_PATH=node-pool${N}/ipc/node.sock ./cardano-cli \${CURRENT_CARDANO_ERA} transaction sign \\
--signing-key-file addresses/utxo${N}.skey \\
--signing-key-file addresses/user${N}-stake.skey \\
--testnet-magic ${NETWORK_MAGIC} \\
--tx-body-file node-pool${N}/tx/tx${N}-\${DELEGATION_ROUND}.txbody \\
--out-file node-pool${N}/tx/tx${N}-\${DELEGATION_ROUND}.tx
# Submit the transaction
CARDANO_NODE_SOCKET_PATH=node-pool${N}/ipc/node.sock ./cardano-cli transaction submit \\
CARDANO_NODE_SOCKET_PATH=node-pool${N}/ipc/node.sock ./cardano-cli \${CURRENT_CARDANO_ERA} transaction submit \\
--tx-file node-pool${N}/tx/tx${N}-\${DELEGATION_ROUND}.tx \\
--testnet-magic ${NETWORK_MAGIC}
Expand Down

0 comments on commit 4153c47

Please sign in to comment.