tig-monorepo/scripts/verify_benchmark.sh
2024-08-16 22:34:55 +08:00

83 lines
2.7 KiB
Bash

#!/bin/bash
set -e
REPO_DIR=$(dirname $(dirname "$(realpath "$0")"))
TIG_WORKER_PATH="$REPO_DIR/target/release/tig-worker"
if [ ! -f $TIG_WORKER_PATH ]; then
echo "Error: tig-worker binary not found at ./target/release/tig-worker"
echo "Run: cd $REPO_DIR && cargo build -p tig-worker --release"
exit 1
fi
read -p "Enter benchmark_id: " benchmark_id
echo "Fetching benchmark data"
response=$(curl -s "https://mainnet-api.tig.foundation/get-benchmark-data?benchmark_id=$benchmark_id")
# parse data from resp
proof=$(echo "$response" | python3 -c "
import sys, json
data = json.load(sys.stdin)
for item in data['proof']['solutions_data']:
item['nonce'] = str(item['nonce'])
print(json.dumps(data))
" | jq '.proof')
if [ "$proof" == "null" ]; then
echo "No proofs found"
exit 0
fi
solutions_count=$(echo "$proof" | jq -r '.solutions_data | length')
settings=$(echo "$response" | jq -r '.benchmark.settings')
algorithm_id=$(echo "$settings" | jq -r '.algorithm_id')
echo "Found $solutions_count solutions to verify"
# Fetch block id
echo "Fetching block data"
block_response=$(curl -s "https://mainnet-api.tig.foundation/get-block")
block_id=$(echo "$block_response" | jq -r '.block.id')
# Fetch algorithms for the block
echo "Fetching algorithms data"
algorithms_response=$(curl -s "https://mainnet-api.tig.foundation/get-algorithms?block_id=$block_id")
wasms=$(echo "$algorithms_response" | jq -c '.wasms[]')
wasm=$(echo "$wasms" | jq -c "select(.algorithm_id == \"$algorithm_id\")")
if [ -z "$wasm" ]; then
echo "No matching WASM found for $algorithm_id"
exit 0
fi
compile_success=$(echo "$wasm" | jq -r '.details.compile_success')
if [ "$compile_success" == "false" ]; then
echo "WASM was not successful compiled"
exit 0
fi
download_url=$(echo "$wasm" | jq -r '.details.download_url')
echo "Downloading WASM from $download_url"
curl -s -o "$algorithm_id.wasm" "$download_url"
# verify solutions
for i in $(seq 0 $(($solutions_count - 1))); do
solution_data=$(echo "$proof" | jq -c -S ".solutions_data[$i]")
echo Verifying $solution_data
nonce=$(echo "$solution_data" | jq -r '.nonce')
solution=$(echo "$solution_data" | jq -r '.solution')
echo Verifying solution is valid
./target/release/tig-worker verify_solution "$settings" $nonce "$solution"
echo Verifying runtime_signature and fuel_consumed
compute_output=$(./target/release/tig-worker compute_solution "$settings" $nonce ./$algorithm_id.wasm | python3 -c "
import sys, json
data = json.load(sys.stdin)
data['nonce'] = str(data['nonce'])
print(json.dumps(data))
" | jq -c -S)
if [[ "$compute_output" == "$solution_data" ]]; then
echo "Ok"
else
echo "Mismatch. Actual: $compute_output"
fi
done
rm $algorithm_id.wasm