Skip to content

Commit

Permalink
Test errors in fact registry, fix hardcoded values, scripts properly …
Browse files Browse the repository at this point in the history
…parse arguments, and verbose options
  • Loading branch information
b-j-roberts committed Mar 18, 2024
1 parent f9e4632 commit afbea43
Show file tree
Hide file tree
Showing 6 changed files with 247 additions and 126 deletions.
138 changes: 89 additions & 49 deletions scripts/request-data-commitments.sh
Original file line number Diff line number Diff line change
Expand Up @@ -12,55 +12,87 @@ STATE_PROOF_NONCE_SLOT="0x000000000000000000000000000000000000000000000000000000
STATE_DATA_COMMITMENT_MAP_SLOT="0x00000000000000000000000000000000000000000000000000000000000000fe"

# Optional arguments
# TODO: To public api?
L1_RPC_URL="https://sepolia.infura.io/v3/bed8a8401c894421bd7cd31050e7ced6"
STARKNET_RPC_URL="https://starknet-sepolia.infura.io/v3/bed8a8401c894421bd7cd31050e7ced6"
BLOBSTREAMX_L1_ADDRESS="0x48B257EC1610d04191cC2c528d0c940AdbE1E439"
#TODO
#TODO : Change address to the Sepolia address once it is deployed
BLOBSTREAMX_STARKNET_ADDRESS="0x48B257EC1610d04191cC2c528d0c940AdbE1E439"

NO_SEND=false
VERBOSE=false
WAIT=true


SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null 2>&1 && pwd )"
WORK_DIR=$SCRIPT_DIR/..

#TODO: w/o webhook, verbose, w/o header access
#TODO: resume from id

display_help() {
echo "Usage: $0 [option...] {arguments...}"
echo

echo " -b, --blobstreamx-l1 ADDR BlobstreamX contract address on L1"
echo " (default: $BLOBSTREAMX_L1_ADDRESS (SEPOLIA))"
echo " -B, --blobstreamx-starknet ADDR BlobstreamX contract address on Starknet"
echo " (default: $BLOBSTREAMX_STARKNET_ADDRESS (SEPOLIA))"
echo " -r, --l1-rpc URL URL of the L1 RPC server"
echo " (default: $L1_RPC_URL)"
echo " -s, --starknet-rpc URL URL of the Starknet RPC server"
echo " (default: $STARKNET_RPC_URL)"

echo
echo " -h, --help display help"
echo " -r, --l1-rpc=URL URL of the L1 RPC server (default: $L1_RPC_URL)"
echo " -s, --starknet-rpc=URL URL of the Starknet RPC server (default: $STARKNET_RPC_URL)"
echo " -b, --blobstreamx-l1=ADDR BlobstreamX contract address on L1 (default: $BLOBSTREAMX_L1_ADDRESS)"
echo " -B, --blobstreamx-starknet=ADDR BlobstreamX contract address on Starknet (default: $BLOBSTREAMX_STARKNET_ADDRESS)"
echo " -n, --no-send Do not send the batch query to Herodotus, only print the query"
echo " -N, --no-wait Do not wait for the state proof nonce and data commitments to be relayed"
echo " -v, --verbose verbose output"

echo
echo "Example: $0"
}

#TODO: Add support for optional arguments
# Transform long options to short ones
for arg in "$@"; do
shift
case "$arg" in
"--blobstreamx-l1") set -- "$@" "-b" ;;
"--blobstreamx-starknet") set -- "$@" "-B" ;;
"--l1-rpc") set -- "$@" "-r" ;;
"--starknet-rpc") set -- "$@" "-s" ;;
"--help") set -- "$@" "-h" ;;
"--no-send") set -- "$@" "-n" ;;
"--no-wait") set -- "$@" "-N" ;;
"--verbose") set -- "$@" "-v" ;;
*) set -- "$@" "$arg"
esac
done

# Parse command line arguments
while getopts ":hr:-:" opt; do
while getopts ":hnvNb:B:r:s:-:" opt; do
case ${opt} in
- )
case "${OPTARG}" in
help )
display_help
exit 0
;;
* )
echo "Invalid option: --$OPTARG" 1>&2
display_help
exit 1
;;
esac
;;
h )
display_help
exit 0
;;
n )
NO_SEND=true
;;
v )
VERBOSE=true
;;
N )
WAIT=false
;;
b )
BLOBSTREAMX_L1_ADDRESS="$OPTARG"
;;
B )
BLOBSTREAMX_STARKNET_ADDRESS="$OPTARG"
;;
r )
L1_RPC_URL="$OPTARG"
;;
s )
STARKNET_RPC_URL="$OPTARG"
;;
\? )
echo "Invalid option: $OPTARG" 1>&2
display_help
Expand All @@ -74,7 +106,8 @@ while getopts ":hr:-:" opt; do
esac
done

if [ -z "$HERODOTUS_API_KEY" ]; then
# Check if HERODOTUS_API_KEY is set if not set and no-send is not set, exit
if [ -z "$HERODOTUS_API_KEY" ] && [ "$NO_SEND" = false ]; then
echo "HERODOTUS_API_KEY is not set. Get your API key from https://dashboard.herodotus.dev by signing up with your GitHub."
exit 1
fi
Expand All @@ -84,36 +117,30 @@ L1_BLOCK_NUM_RES=$(curl $L1_RPC_URL \
-H "Content-Type: application/json" \
-d '{"jsonrpc":"2.0","method":"eth_blockNumber","params":[],"id":1}' 2>/dev/null)
L1_BLOCK_NUM=$(echo $L1_BLOCK_NUM_RES | jq -r '.result')
echo "Latest L1 block number: $L1_BLOCK_NUM"

# echo
# echo "Getting current Starknet block number..."
# curl $STARKNET_RPC_URL \
# -X POST \
# -H "Content-Type: application/json" \
# -d '{"jsonrpc":"2.0","method":"starknet_blockNumber","params":[],"id":1}'

#TODO: latest -> block number
LATEST_PROOF_NONCE_RES=$(curl $L1_RPC_URL \
-X POST \
-H "Content-Type: application/json" \
-d '{"jsonrpc":"2.0","method":"eth_getStorageAt","params":["'"$BLOBSTREAMX_L1_ADDRESS"'","'"$STATE_PROOF_NONCE_SLOT"'","latest"],"id":1}' 2>/dev/null)
-d '{"jsonrpc":"2.0","method":"eth_getStorageAt","params":["'"$BLOBSTREAMX_L1_ADDRESS"'","'"$STATE_PROOF_NONCE_SLOT"'","'"$L1_BLOCK_NUM"'"],"id":1}' 2>/dev/null)
LATEST_PROOF_NONCE=$(echo $LATEST_PROOF_NONCE_RES | jq -r '.result')
echo "Latest L1 state_proofNonce: $LATEST_PROOF_NONCE"

# TODO : This or latest option for just one proofNonce
#TODO: Do a call to get_state_proof_nonce() once the function is deployed & replace hardcoded
#STARKNET_PROOF_NONCE_RES=$(curl $STARKNET_RPC_URL \
# -X POST \
# -H "Content-Type: application/json" \
# -d '{"jsonrpc":"2.0","method":"starknet_getState","params":["'"$BLOBSTREAMX_STARKNET_ADDRESS"'",'"$LATEST_PROOF_NONCE"'],"id":1}' 2>/dev/null)
STARKNET_PROOF_NONCE_RES=$(echo '{"jsonrpc":"2.0","id":1,"result":"0x00000000000000000000000000000000000000000000000000000000000006a4"}')
STARKNET_PROOF_NONCE_RES=$(echo '{"jsonrpc":"2.0","id":1,"result":"0x00000000000000000000000000000000000000000000000000000000000006cb"}')
STARKNET_PROOF_NONCE=$(echo $STARKNET_PROOF_NONCE_RES | jq -r '.result')
echo "Latest Starknet state_proofNonce: $STARKNET_PROOF_NONCE"

if [ "$VERBOSE" = true ]; then
echo "Latest L1 block number: $L1_BLOCK_NUM"
echo "Latest L1 state_proofNonce: $LATEST_PROOF_NONCE"
echo "Latest Starknet state_proofNonce: $STARKNET_PROOF_NONCE"
fi

DATA_COMMITMENT_SLOTS=''
# TODO: Think about edge cases
# Loop through each missing state_proofNonce to build the batch query slots
for ((i = STARKNET_PROOF_NONCE; i <= LATEST_PROOF_NONCE - 1; i++)); do
for ((i = $STARKNET_PROOF_NONCE; i <= LATEST_PROOF_NONCE - 1; i++)); do
# Data commitment slot for each proofNonce is located at
# keccak256(abi.encode(proofNonce, STATE_DATA_COMMITMENT_MAP_SLOT))
DATA_COMMITMENT_ENCODED_SLOT=$(printf "%064x%064x" $i $STATE_DATA_COMMITMENT_MAP_SLOT)
Expand Down Expand Up @@ -165,25 +192,38 @@ HERODOTUS_QUERY='{
HERODOTUS_QUERY=$(echo $HERODOTUS_QUERY | jq '.')
HERODOTUS_QUERY_URL=$(echo $HERODOTUS_API_URL | sed 's/\/$//')'/submit-batch-query?apiKey='$HERODOTUS_API_KEY

if [ "$VERBOSE" = true ] || [ "$NO_SEND" = true ]; then
echo
echo "Batch query to Herodotus API:"
echo "$HERODOTUS_QUERY"
fi

if [ "$NO_SEND" = true ]; then
exit 0
fi

echo
echo "Submitting batch query to Herodotus API..."
echo "Query: $HERODOTUS_QUERY"
curl -X 'POST' \
HERODOTUS_ID=$(curl -X 'POST' \
$HERODOTUS_QUERY_URL \
-H 'accept: application/json' \
-H 'Content-Type: application/json' \
-d "$HERODOTUS_QUERY"
-d "$HERODOTUS_QUERY" 2>/dev/null)
echo "Batch query submitted. Herodotus Internal ID: $HERODOTUS_ID"

if [ "$WAIT" = false ]; then
echo
echo "Query fulfillment can take some time, please wait for state proof nonce and data commitments to be relayed."
exit 0
fi

#TODO: Wait option
# Wait for state proof nonce slot to be relayed
echo
echo "Waiting for state proof nonce slot $STATE_PROOF_NONCE_SLOT to be relayed..."
$SCRIPT_DIR/wait-for-herodotus-fulfill.sh -b $L1_BLOCK_NUM_DEC -a $BLOBSTREAMX_L1_ADDRESS -S $STATE_PROOF_NONCE_SLOT
$SCRIPT_DIR/wait-for-herodotus-fulfill.sh -b $L1_BLOCK_NUM_DEC -a $BLOBSTREAMX_L1_ADDRESS -S $STATE_PROOF_NONCE_SLOT $([ "$VERBOSE" = true ] && echo "-v")
# Loop thru each data commitment slot to wait for the data to be relayed (comma separated)
for slot in $(echo $DATA_COMMITMENT_SLOTS | tr ',' '\n' | tr -d '"'); do
echo
echo "Waiting for data commitment at slot $slot to be relayed..."
$SCRIPT_DIR/wait-for-herodotus-fulfill.sh -b $L1_BLOCK_NUM_DEC -a $BLOBSTREAMX_L1_ADDRESS -S $slot
$SCRIPT_DIR/wait-for-herodotus-fulfill.sh -b $L1_BLOCK_NUM_DEC -a $BLOBSTREAMX_L1_ADDRESS -S $slot $([ "$VERBOSE" = true ] && echo "-v")
done

#TODO: do call to herodotus reg to update latest l1 block?, PR for verifying attestations, use herodotus to get data commitment and verify attestation from DC
104 changes: 52 additions & 52 deletions scripts/wait-for-herodotus-fulfill.sh
Original file line number Diff line number Diff line change
Expand Up @@ -4,72 +4,66 @@
# Monitors the Herodotus Fact registry on Starknet for the requested slot values.

# Constants
HERODOTUS_GET_SLOT_VALUE_SELECTOR="0x01d02b5043fe08831f4d75f1582080c274c6b4d5245fae933747a6990009adff"

# Optional arguments
STARKNET_RPC_URL="https://starknet-sepolia.infura.io/v3/bed8a8401c894421bd7cd31050e7ced6"
HERODOTUS_FACT_REGISTRY="0x07d3550237ecf2d6ddef9b78e59b38647ee511467fe000ce276f245a006b40bc"

VERBOSE=false

display_help() {
echo "Usage: $0 [option...] {arguments...}"
echo

echo " -h, --help display help"
echo " -s, --starknet-rpc=URL URL of the Starknet RPC server (default: $STARKNET_RPC_URL)"
echo " -F, --herodotus-fact-registry=ADDRESS Address of the Herodotus Fact registry on Starknet (default: $HERODOTUS_FACT_REGISTRY)"
echo " -s, --starknet-rpc URL URL of the Starknet RPC server"
echo " (default: $STARKNET_RPC_URL)"
echo " -F, --herodotus-fact-registry ADDRESS Address of the Herodotus Fact registry on Starknet"
echo " (default: $HERODOTUS_FACT_REGISTRY (SN_SEPOLIA))"
echo
echo " -b, --block-number=NUMBER Block number for the slot fact (required)"
echo " -a, --address=ADDRESS Address of the contract for the slot fact (required)"
echo " -S, --slot=NUMBER Slot number for the slot fact (required)"
echo " -b, --block-number NUMBER Block number for the slot fact (required)"
echo " -a, --address ADDRESS Address of the contract for the slot fact (required)"
echo " -S, --slot NUMBER Slot number for the slot fact - Hex (required)"

echo
echo " -h, --help display help"
echo " -v, --verbose display verbose output"

echo
echo "Example: $0"
}

#TODO: Add support for optional arguments
#TODO: Add support for required arguments
#TODO: parse arg formats
# Transform long options to short ones
for arg in "$@"; do
shift
case "$arg" in
"--starknet-rpc") set -- "$@" "-s" ;;
"--herodotus-fact-registry") set -- "$@" "-F" ;;
"--block-number") set -- "$@" "-b" ;;
"--address") set -- "$@" "-a" ;;
"--slot") set -- "$@" "-S" ;;
"--help") set -- "$@" "-h" ;;
"--verbose") set -- "$@" "-v" ;;
*) set -- "$@" "$arg"
esac
done

# Parse command line arguments
while getopts ":hb:a:S:-:" opt; do
while getopts ":hvs:F:b:a:S:" opt; do
case ${opt} in
- )
case "${OPTARG}" in
help )
display_help
exit 0
;;
block-number )
BLOCK_NUMBER="${!OPTIND}"
OPTIND=$((OPTIND + 1))
;;
block-number=* )
BLOCK_NUMBER="${OPTARG#*=}"
;;
address )
ADDRESS="${!OPTIND}"
OPTIND=$((OPTIND + 1))
;;
address=* )
ADDRESS="${OPTARG#*=}"
;;
slot )
SLOT="${!OPTIND}"
OPTIND=$((OPTIND + 1))
;;
slot=* )
SLOT="${OPTARG#*=}"
;;
* )
echo "Invalid option: --$OPTARG" 1>&2
display_help
exit 1
;;
esac
;;
h )
display_help
exit 0
;;
v )
VERBOSE=true
;;
s )
STARKNET_RPC_URL="${OPTARG}"
;;
F )
HERODOTUS_FACT_REGISTRY="${OPTARG}"
;;
b )
BLOCK_NUMBER="${OPTARG}"
;;
Expand All @@ -92,13 +86,18 @@ while getopts ":hb:a:S:-:" opt; do
esac
done

if [ -z $BLOCK_NUMBER ] || [ -z $ADDRESS ] || [ -z $SLOT ]; then
echo "Missing required arguments: block-number, address, slot" 1>&2
display_help
exit 1
fi

# Convert block number to 32-byte hex
BLOCK_NUMBER=$(printf "%064x" $BLOCK_NUMBER)
# Get the low and high 16 bytes
BLOCK_NUMBER_HIGH=0x${BLOCK_NUMBER:0:32}
BLOCK_NUMBER_LOW=0x${BLOCK_NUMBER:32:32}

# TODO: allow slots of non hex values
# Left pad the slot value to 32 bytes
if [[ $SLOT == 0x* ]]; then
SLOT=${SLOT:2}
Expand All @@ -110,7 +109,6 @@ done
SLOT_HIGH=0x${SLOT:0:32}
SLOT_LOW=0x${SLOT:32:32}

#TODO: Compute entry point selector from get_slot_value
HERODOTUS_FACT_QUERY='{
"id": 1,
"jsonrpc": "2.0",
Expand All @@ -124,16 +122,20 @@ HERODOTUS_FACT_QUERY='{
"'$SLOT_LOW'",
"'$SLOT_HIGH'"
],
"entry_point_selector": "0x01d02b5043fe08831f4d75f1582080c274c6b4d5245fae933747a6990009adff",
"entry_point_selector": "'$HERODOTUS_GET_SLOT_VALUE_SELECTOR'",
"contract_address": "'$HERODOTUS_FACT_REGISTRY'"
},
"pending"
]
}'
echo "Query: $HERODOTUS_FACT_QUERY"

echo
echo "Waiting for Herodotus to fulfill the slot fact..."
if [ $VERBOSE == true ]; then
echo "Query: $HERODOTUS_FACT_QUERY"

echo
echo "Waiting for Herodotus to fulfill the slot fact..."
fi

RES='{"jsonrpc":"2.0","id":1,"result":["0x1"]}'
while [ $(echo $RES | jq -r '.result[0]') == "0x1" ]; do
RES=$(curl $STARKNET_RPC_URL \
Expand All @@ -158,5 +160,3 @@ while [ $(echo $RES | jq -r '.result[0]') == "0x1" ]; do
fi
sleep 5
done

#TODO: verbose, ...
Loading

0 comments on commit afbea43

Please sign in to comment.