From ca3881d61e9d7b9b222f0dfa8c159858650f5445 Mon Sep 17 00:00:00 2001 From: matiwinnetou Date: Tue, 29 Apr 2025 14:24:43 +0200 Subject: [PATCH 01/26] feat: ubuntu 24.04 upgrade. (#419) Co-authored-by: Mateusz Czeladka --- api/Dockerfile | 2 +- docker/Dockerfile | 8 ++++---- docker/dockerfiles/mithril/Dockerfile | 6 +++--- docker/dockerfiles/node/Dockerfile | 4 ++-- yaci-indexer/Dockerfile | 2 +- 5 files changed, 11 insertions(+), 11 deletions(-) diff --git a/api/Dockerfile b/api/Dockerfile index 3a095b612..bcfd28631 100644 --- a/api/Dockerfile +++ b/api/Dockerfile @@ -1,4 +1,4 @@ -FROM ubuntu:22.04 AS build-common +FROM ubuntu:24.04 AS build-common WORKDIR /build RUN apt update --fix-missing \ diff --git a/docker/Dockerfile b/docker/Dockerfile index 0b1cbaec4..c93f0101c 100644 --- a/docker/Dockerfile +++ b/docker/Dockerfile @@ -1,4 +1,4 @@ -FROM ubuntu:22.04 AS cardano-builder +FROM ubuntu:24.04 AS cardano-builder SHELL ["/bin/bash", "-c"] @@ -40,7 +40,7 @@ RUN curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | bash -s -- -y \ && export PATH="$HOME/.cargo/bin:$PATH" \ && apt update --fix-missing \ && apt install -y --no-install-recommends \ - build-essential m4 libssl-dev docker jq git \ + build-essential m4 libssl-dev docker.io jq git \ && rustup update stable \ && apt-get clean @@ -144,7 +144,7 @@ RUN mkdir -p /root/.local/bin \ # Compile java applications -FROM ubuntu:22.04 AS java-builder +FROM ubuntu:24.04 AS java-builder WORKDIR /root/app @@ -162,7 +162,7 @@ COPY ./.git /root/app/.git RUN --mount=type=cache,target=/root/.m2 mvn -U clean package -DskipTests # Main -FROM ubuntu:22.04 +FROM ubuntu:24.04 WORKDIR / diff --git a/docker/dockerfiles/mithril/Dockerfile b/docker/dockerfiles/mithril/Dockerfile index bc6a9e4c2..8a1ce943c 100644 --- a/docker/dockerfiles/mithril/Dockerfile +++ b/docker/dockerfiles/mithril/Dockerfile @@ -1,4 +1,4 @@ -FROM ubuntu:22.04 AS cardano-builder +FROM ubuntu:24.04 AS cardano-builder SHELL ["/bin/bash", "-c"] @@ -16,7 +16,7 @@ RUN curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | bash -s -- -y \ && export PATH="$HOME/.cargo/bin:$PATH" \ && apt update --fix-missing \ && apt install -y --no-install-recommends \ - build-essential m4 libssl-dev docker jq git pkg-config \ + build-essential m4 libssl-dev docker.io jq git pkg-config \ && apt-get clean RUN git clone https://github.com/input-output-hk/mithril.git \ @@ -28,7 +28,7 @@ RUN git clone https://github.com/input-output-hk/mithril.git \ && mkdir -p /root/.local/bin \ && cp mithril-client /root/.local/bin/ -FROM ubuntu:22.04 AS mithril-runner +FROM ubuntu:24.04 AS mithril-runner COPY --from=cardano-builder /root/.local/bin/mithril-client /usr/local/bin RUN apt update --fix-missing \ diff --git a/docker/dockerfiles/node/Dockerfile b/docker/dockerfiles/node/Dockerfile index 764e641e3..b554d87d4 100644 --- a/docker/dockerfiles/node/Dockerfile +++ b/docker/dockerfiles/node/Dockerfile @@ -1,4 +1,4 @@ -FROM ubuntu:22.04 AS cardano-builder +FROM ubuntu:24.04 AS cardano-builder WORKDIR /root/src @@ -121,5 +121,5 @@ RUN mkdir -p /root/.local/bin \ && cp -p "$(./scripts/bin-path.sh cardano-submit-api)" /root/.local/bin/ -FROM ubuntu:22.04 AS node-runner +FROM ubuntu:24.04 AS node-runner COPY --from=cardano-builder /root/.local/bin/cardano-* /usr/local/bin/ diff --git a/yaci-indexer/Dockerfile b/yaci-indexer/Dockerfile index 504b98e52..fb3e65dd0 100644 --- a/yaci-indexer/Dockerfile +++ b/yaci-indexer/Dockerfile @@ -1,4 +1,4 @@ -FROM ubuntu:22.04 AS build-common +FROM ubuntu:24.04 AS build-common WORKDIR /build RUN apt update --fix-missing \ From 030f74d0f9ed5a3d658559a7e57e7e305e5061d3 Mon Sep 17 00:00:00 2001 From: matiwinnetou Date: Tue, 29 Apr 2025 15:02:31 +0200 Subject: [PATCH 02/26] chore: spring boot upgrade for yaci-indexer (#425) Co-authored-by: Mateusz Czeladka --- pom.xml | 2 +- yaci-indexer/pom.xml | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/pom.xml b/pom.xml index 8ef5a225b..5645ee421 100644 --- a/pom.xml +++ b/pom.xml @@ -36,7 +36,7 @@ 3.2.5 0.8.11 1.3.0 - 1.18.30 + 1.18.38 2.2.8 2.20.0 0.6.4 diff --git a/yaci-indexer/pom.xml b/yaci-indexer/pom.xml index b14b83a94..c006221ba 100644 --- a/yaci-indexer/pom.xml +++ b/yaci-indexer/pom.xml @@ -2,10 +2,11 @@ 4.0.0 + org.springframework.boot spring-boot-starter-parent - 3.2.4 + 3.3.10 From 2043a47bc4f29ff5c8d6fb26cf1fa26b914ef126 Mon Sep 17 00:00:00 2001 From: VladislavKudrin Date: Tue, 29 Apr 2025 16:32:06 +0200 Subject: [PATCH 03/26] feat: docker compose build from source (#420) * feat: postgres dockerfile * feat: build node from source * feat: build postgres from source * feat: adjust integration tests --- .env.IntegrationTest | 5 +- .env.docker-compose | 5 +- docker-compose-indexer.yaml | 54 ++++---- docker-compose-node.yaml | 28 ++--- docker/dockerfiles/node/Dockerfile | 15 ++- docker/dockerfiles/node/entrypoint.sh | 28 +++++ docker/dockerfiles/postgres/Dockerfile | 40 ++++++ docker/dockerfiles/postgres/entrypoint.sh | 143 ++++++++++++++++++++++ 8 files changed, 265 insertions(+), 53 deletions(-) create mode 100644 docker/dockerfiles/node/entrypoint.sh create mode 100644 docker/dockerfiles/postgres/Dockerfile create mode 100644 docker/dockerfiles/postgres/entrypoint.sh diff --git a/.env.IntegrationTest b/.env.IntegrationTest index 8cc98e009..de234a137 100644 --- a/.env.IntegrationTest +++ b/.env.IntegrationTest @@ -4,8 +4,7 @@ NETWORK=devkit PROTOCOL_MAGIC=42 ## Postgres image -DB_IMAGE_NAME=postgres -DB_IMAGE_TAG=latest +PG_VERSION_TAG=REL_14_11 ## Yaci image YACI_VERSION=0.10.5 @@ -138,4 +137,4 @@ DB_POSTGRES_MAX_PARALLEL_WORKERS=4 DB_POSTGRES_SEQ_PAGE_COST=1.0 DB_POSTGRES_JIT=off DB_POSTGRES_BGWRITER_LRU_MAXPAGES=50 -DB_POSTGRES_BGWRITER_DELAY=500ms \ No newline at end of file +DB_POSTGRES_BGWRITER_DELAY=500ms diff --git a/.env.docker-compose b/.env.docker-compose index c17d06a0c..9e267bd2a 100644 --- a/.env.docker-compose +++ b/.env.docker-compose @@ -7,8 +7,7 @@ PROTOCOL_MAGIC=764824073 # mainnet 764824073, preprod 1, preview 2, sanchonet 4, devkit 42 ## Postgres image -DB_IMAGE_NAME=postgres -DB_IMAGE_TAG=14.11-bullseye +PG_VERSION_TAG=REL_14_11 ## Postgres variables DB_NAME=rosetta-java @@ -26,7 +25,7 @@ CARDANO_NODE_HOST=cardano-node CARDANO_NODE_PORT=3001 # Uncomment if you are using local cardano node CARDANO_NODE_VERSION=10.2.1 -CARDANO_NODE_SUBMIT_HOST=cardano-submit-api +CARDANO_NODE_SUBMIT_HOST=$CARDANO_NODE_HOST NODE_SUBMIT_API_PORT=8090 CARDANO_NODE_DIR=/node CARDANO_NODE_SOCKET_PATH=${CARDANO_NODE_DIR}/node.socket diff --git a/docker-compose-indexer.yaml b/docker-compose-indexer.yaml index 4cf59eab6..ec52e7c7e 100644 --- a/docker-compose-indexer.yaml +++ b/docker-compose-indexer.yaml @@ -42,37 +42,39 @@ services: condition: service_healthy db: - image: ${DB_IMAGE_NAME}:${DB_IMAGE_TAG} + image: postgres:${PG_VERSION_TAG} + build: + context: ./ + dockerfile: ./docker/dockerfiles/postgres/Dockerfile shm_size: 4g ports: - ${DB_PORT}:${DB_PORT} - command: [ - # "postgres", - "-p", "${DB_PORT}", - "-c", "max_connections=${DB_POSTGRES_MAX_CONNECTIONS}", - "-c", "shared_buffers=${DB_POSTGRES_SHARED_BUFFERS}", - "-c", "effective_cache_size=${DB_POSTGRES_EFFECTIVE_CACHE_SIZE}", - "-c", "work_mem=${DB_POSTGRES_WORK_MEM}", - "-c", "maintenance_work_mem=${DB_POSTGRES_MAINTENANCE_WORK_MEM}", - "-c", "wal_buffers=${DB_POSTGRES_WAL_BUFFERS}", - "-c", "checkpoint_completion_target=${DB_POSTGRES_CHECKPOINT_COMPLETION_TARGET}", - "-c", "random_page_cost=${DB_POSTGRES_RANDOM_PAGE_COST}", + environment: + DB_SECRET: ${DB_SECRET} + DB_USER: ${DB_USER} + DB_NAME: ${DB_NAME} + NETWORK: ${NETWORK} + PGPASSWORD: postgres + + DB_POSTGRES_MAX_CONNECTIONS: ${DB_POSTGRES_MAX_CONNECTIONS} + DB_POSTGRES_SHARED_BUFFERS: ${DB_POSTGRES_SHARED_BUFFERS} + DB_POSTGRES_EFFECTIVE_CACHE_SIZE: ${DB_POSTGRES_EFFECTIVE_CACHE_SIZE} + DB_POSTGRES_WORK_MEM: ${DB_POSTGRES_WORK_MEM} + DB_POSTGRES_MAINTENANCE_WORK_MEM: ${DB_POSTGRES_MAINTENANCE_WORK_MEM} + DB_POSTGRES_WAL_BUFFERS: ${DB_POSTGRES_WAL_BUFFERS} + DB_POSTGRES_CHECKPOINT_COMPLETION_TARGET: ${DB_POSTGRES_CHECKPOINT_COMPLETION_TARGET} + DB_POSTGRES_RANDOM_PAGE_COST: ${DB_POSTGRES_RANDOM_PAGE_COST} # Additional settings for advanced PostgreSQL tuning - "-c", "effective_io_concurrency=${DB_POSTGRES_EFFECTIVE_IO_CONCURRENCY}", - "-c", "parallel_tuple_cost=${DB_POSTGRES_PARALLEL_TUPLE_COST}", - "-c", "parallel_setup_cost=${DB_POSTGRES_PARALLEL_SETUP_COST}", - "-c", "max_parallel_workers_per_gather=${DB_POSTGRES_MAX_PARALLEL_WORKERS_PER_GATHER}", - "-c", "max_parallel_workers=${DB_POSTGRES_MAX_PARALLEL_WORKERS}", - "-c", "seq_page_cost=${DB_POSTGRES_SEQ_PAGE_COST}", - "-c", "jit=${DB_POSTGRES_JIT}", - "-c", "bgwriter_lru_maxpages=${DB_POSTGRES_BGWRITER_LRU_MAXPAGES}", - "-c", "bgwriter_delay=${DB_POSTGRES_BGWRITER_DELAY}" - ] - environment: - POSTGRES_PASSWORD: ${DB_SECRET} - POSTGRES_USER: ${DB_USER} - POSTGRES_DB: ${DB_NAME} + DB_POSTGRES_EFFECTIVE_IO_CONCURRENCY: ${DB_POSTGRES_EFFECTIVE_IO_CONCURRENCY} + DB_POSTGRES_PARALLEL_TUPLE_COST: ${DB_POSTGRES_PARALLEL_TUPLE_COST} + DB_POSTGRES_PARALLEL_SETUP_COST: ${DB_POSTGRES_PARALLEL_SETUP_COST} + DB_POSTGRES_MAX_PARALLEL_WORKERS_PER_GATHER: ${DB_POSTGRES_MAX_PARALLEL_WORKERS_PER_GATHER} + DB_POSTGRES_MAX_PARALLEL_WORKERS: ${DB_POSTGRES_MAX_PARALLEL_WORKERS} + DB_POSTGRES_SEQ_PAGE_COST: ${DB_POSTGRES_SEQ_PAGE_COST} + DB_POSTGRES_JIT: ${DB_POSTGRES_JIT} + DB_POSTGRES_BGWRITER_LRU_MAXPAGES: ${DB_POSTGRES_BGWRITER_LRU_MAXPAGES} + DB_POSTGRES_BGWRITER_DELAY: ${DB_POSTGRES_BGWRITER_DELAY} restart: on-failure volumes: - ${DB_PATH}:/var/lib/postgresql/data diff --git a/docker-compose-node.yaml b/docker-compose-node.yaml index 56029f002..9a343b28b 100644 --- a/docker-compose-node.yaml +++ b/docker-compose-node.yaml @@ -14,8 +14,17 @@ services: cardano-node: image: ghcr.io/intersectmbo/cardano-node:${CARDANO_NODE_VERSION} + build: + context: ./ + dockerfile: ./docker/dockerfiles/node/Dockerfile + args: + CARDANO_NODE_VERSION: ${CARDANO_NODE_VERSION} environment: - NETWORK=${NETWORK} + - PROTOCOL_MAGIC=${PROTOCOL_MAGIC} + - CARDANO_NODE_SOCKET_PATH=${CARDANO_NODE_SOCKET_PATH} + - CARDANO_NODE_PORT=${CARDANO_NODE_PORT} + - NODE_SUBMIT_API_PORT=${NODE_SUBMIT_API_PORT} volumes: - ${CARDANO_NODE_DIR}:/node/ - ${CARDANO_NODE_DB}:/node/db @@ -23,27 +32,10 @@ services: restart: unless-stopped ports: - ${CARDANO_NODE_PORT}:${CARDANO_NODE_PORT} - entrypoint: cardano-node run --database-path /node/db --port ${CARDANO_NODE_PORT} --socket-path /node/node.socket --topology /config/topology.json --config /config/config.json + - ${NODE_SUBMIT_API_PORT}:${NODE_SUBMIT_API_PORT} depends_on: mithril: condition: service_completed_successfully - cardano-submit-api: - image: ghcr.io/intersectmbo/cardano-submit-api:${CARDANO_NODE_VERSION} - environment: - - NETWORK=${NETWORK} - depends_on: - - cardano-node - volumes: - - ${CARDANO_NODE_DIR}:/node-ipc - ports: - - ${NODE_SUBMIT_API_PORT}:8090 - restart: on-failure - logging: - driver: "json-file" - options: - max-size: "200k" - max-file: "10" - networks: default: diff --git a/docker/dockerfiles/node/Dockerfile b/docker/dockerfiles/node/Dockerfile index b554d87d4..3407f183b 100644 --- a/docker/dockerfiles/node/Dockerfile +++ b/docker/dockerfiles/node/Dockerfile @@ -45,9 +45,6 @@ RUN export IOHKNIX_VERSION=$(curl https://raw.githubusercontent.com/IntersectMBO && make check \ && make install -ENV LD_LIBRARY_PATH=/usr/local/lib:$LD_LIBRARY_PATH -ENV PKG_CONFIG_PATH=/usr/local/lib/pkgconfig:$PKG_CONFIG_PATH - # Install libsodium RUN apt install -y --no-install-recommends libsodium-dev \ && apt-get clean @@ -122,4 +119,16 @@ RUN mkdir -p /root/.local/bin \ FROM ubuntu:24.04 AS node-runner +COPY --from=cardano-builder /usr/local/lib /usr/local/lib COPY --from=cardano-builder /root/.local/bin/cardano-* /usr/local/bin/ +COPY --from=cardano-builder /root/src/cardano-node/cardano-submit-api/config/tx-submit-mainnet-config.yaml /cardano-submit-api-config/cardano-submit-api.yaml + +ENV LD_LIBRARY_PATH=/usr/local/lib:$LD_LIBRARY_PATH +ENV PKG_CONFIG_PATH=/usr/local/lib/pkgconfig:$PKG_CONFIG_PATH + +RUN mkdir /logs + +COPY ./docker/dockerfiles/node/entrypoint.sh /sbin/entrypoint.sh +RUN chmod +x /sbin/entrypoint.sh + +ENTRYPOINT ["/sbin/entrypoint.sh"] diff --git a/docker/dockerfiles/node/entrypoint.sh b/docker/dockerfiles/node/entrypoint.sh new file mode 100644 index 000000000..6325cab27 --- /dev/null +++ b/docker/dockerfiles/node/entrypoint.sh @@ -0,0 +1,28 @@ +#!/bin/bash + +if [ "$NETWORK" == "mainnet" ]; then + NETWORK_STR="--mainnet" +else + NETWORK_STR="--testnet-magic $PROTOCOL_MAGIC" +fi + +function clean_up() { + # Killing all processes before exiting + kill -2 "$CARDANO_NODE_PID" "$CARDANO_SUBMIT_PID" + wait $CARDANO_NODE_PID + exit +} + +trap clean_up SIGHUP SIGINT SIGTERM + +echo "Starting Cardano node..." + +cardano-node run --socket-path "$CARDANO_NODE_SOCKET_PATH" --port $CARDANO_NODE_PORT --database-path /node/db --config /config/config.json --topology /config/topology.json > /logs/node.log & +CARDANO_NODE_PID=$! +sleep 2 + +echo "Starting Cardano submit api..." +cardano-submit-api --listen-address 0.0.0.0 --socket-path "$CARDANO_NODE_SOCKET_PATH" --port $NODE_SUBMIT_API_PORT $NETWORK_STR --config /cardano-submit-api-config/cardano-submit-api.yaml > /logs/submit-api.log & +CARDANO_SUBMIT_PID=$! + +wait -n $CARDANO_NODE_PID $CARDANO_SUBMIT_PID diff --git a/docker/dockerfiles/postgres/Dockerfile b/docker/dockerfiles/postgres/Dockerfile new file mode 100644 index 000000000..938941da6 --- /dev/null +++ b/docker/dockerfiles/postgres/Dockerfile @@ -0,0 +1,40 @@ +FROM ubuntu:22.04 + +RUN apt update && apt install -y \ + build-essential \ + libreadline-dev \ + zlib1g-dev \ + flex \ + bison \ + wget \ + git \ + ca-certificates \ + sudo \ + && apt clean + +ENV PG_VERSION_TAG=REL_14_11 +ENV PG_DATA="/var/lib/postgresql/data" +ENV PG_BIN="/usr/local/pgsql/bin" +ENV PATH="$PG_BIN:$PATH" + +WORKDIR /usr/src + +RUN git clone --branch $PG_VERSION_TAG https://github.com/postgres/postgres.git \ + && cd postgres \ + && ./configure --prefix=/usr/local/pgsql \ + && make -j$(nproc) \ + && make install + +RUN useradd -m -U -s /bin/bash postgres + +RUN mkdir -p $PG_DATA + +VOLUME ["$PG_DATA"] + +COPY ./docker/dockerfiles/postgres/entrypoint.sh /sbin/entrypoint.sh +RUN chmod +x /sbin/entrypoint.sh + +WORKDIR / + +ENTRYPOINT ["/sbin/entrypoint.sh"] + diff --git a/docker/dockerfiles/postgres/entrypoint.sh b/docker/dockerfiles/postgres/entrypoint.sh new file mode 100644 index 000000000..1ea0748a7 --- /dev/null +++ b/docker/dockerfiles/postgres/entrypoint.sh @@ -0,0 +1,143 @@ +#!/bin/bash + +database_initialization() { + if [ -z "$(ls -A "$PG_DATA")" ]; then + echo "$PGPASSWORD" > /tmp/password + echo "*:*:*:postgres:$PGPASSWORD" > /home/postgres/.pgpass + + chmod 600 /home/postgres/.pgpass + chown postgres:postgres /home/postgres/.pgpass + + sudo -u postgres "$PG_BIN/initdb" --pgdata="$PG_DATA" --auth=md5 --auth-local=md5 --auth-host=md5 --username=postgres --pwfile=/tmp/password + + rm -f /tmp/password + else + echo "Database already initialized, skipping initdb." + fi +} + +configure_postgres() { + local config_file="$PG_DATA/postgresql.conf" + + # List of parameter names and their corresponding environment variables + declare -A param_vars=( + ["max_connections"]="DB_POSTGRES_MAX_CONNECTIONS" + ["shared_buffers"]="DB_POSTGRES_SHARED_BUFFERS" + ["effective_cache_size"]="DB_POSTGRES_EFFECTIVE_CACHE_SIZE" + ["work_mem"]="DB_POSTGRES_WORK_MEM" + ["maintenance_work_mem"]="DB_POSTGRES_MAINTENANCE_WORK_MEM" + ["wal_buffers"]="DB_POSTGRES_WAL_BUFFERS" + ["checkpoint_completion_target"]="DB_POSTGRES_CHECKPOINT_COMPLETION_TARGET" + ["random_page_cost"]="DB_POSTGRES_RANDOM_PAGE_COST" + ["effective_io_concurrency"]="DB_POSTGRES_EFFECTIVE_IO_CONCURRENCY" + ["parallel_tuple_cost"]="DB_POSTGRES_PARALLEL_TUPLE_COST" + ["parallel_setup_cost"]="DB_POSTGRES_PARALLEL_SETUP_COST" + ["max_parallel_workers_per_gather"]="DB_POSTGRES_MAX_PARALLEL_WORKERS_PER_GATHER" + ["max_parallel_workers"]="DB_POSTGRES_MAX_PARALLEL_WORKERS" + ["seq_page_cost"]="DB_POSTGRES_SEQ_PAGE_COST" + ["jit"]="DB_POSTGRES_JIT" + ["bgwriter_lru_maxpages"]="DB_POSTGRES_BGWRITER_LRU_MAXPAGES" + ["bgwriter_delay"]="DB_POSTGRES_BGWRITER_DELAY" + ) + + # Check for missing required environment variables + local missing_vars=() + for param in "${!param_vars[@]}"; do + local env_var="${param_vars[$param]}" + if [ -z "${!env_var}" ]; then + missing_vars+=("$env_var") + fi + done + + # If there are missing variables, print an error and exit + if [ ${#missing_vars[@]} -gt 0 ]; then + echo "Error: The following required environment variables are missing or empty:" + for var in "${missing_vars[@]}"; do + echo " - $var" + done + echo "" + echo "Most likely, you are missing a hardware profile in your environment configuration." + echo "Make sure to pass an additional --env-file parameter when running the container." + echo "" + echo "Example Docker run command for an 'entry_level' hardware profile:" + echo "docker run --env-file ./docker/.env.dockerfile --env-file ./docker/.env.docker-profile-mid-level -p 8082:8082 --shm-size=4g -d cardanofoundation/cardano-rosetta-java:latest" + echo "" + exit 1 + fi + + # Remove all commented-out lines for the parameters we are about to update + for param in "${!param_vars[@]}"; do + sed -i "/^#$param /d" "$config_file" + done + + # Update or add parameters + for param in "${!param_vars[@]}"; do + local env_var="${param_vars[$param]}" + local value="${!env_var}" + + # Try to replace existing parameter + sed -i "s/^$param = .*/$param = $value/" "$config_file" + + # Parameter not found, append it + if ! grep -q "^$param =" "$config_file"; then + echo "$param = $value" >> "$config_file" + fi + done + + echo "host all all 0.0.0.0/0 md5" \ + >> $PG_DATA/pg_hba.conf + + echo "listen_addresses='*'" \ + >> $PG_DATA/postgresql.conf + + echo "PostgreSQL configuration updated successfully!" +} + +start_postgres() { + sudo -u postgres "$PG_BIN/postgres" -D "$PG_DATA" -c config_file="$PG_DATA/postgresql.conf" & + PG_PID=$! + + until "$PG_BIN/pg_isready" -U postgres > /dev/null; do sleep 1; done +} + +create_database_and_user() { + export DB_SCHEMA="$NETWORK" + + flag=true + while [ $(sudo -u postgres "$PG_BIN/psql" -U postgres -Atc "SELECT pg_is_in_recovery()";) == "t" ]; do + if $flag ; then + echo "Waiting for database recovery..." + flag=false + fi + sleep 1 + done + + if [[ -z $(sudo -u postgres "$PG_BIN/psql" -U postgres -Atc "SELECT 1 FROM pg_catalog.pg_user WHERE usename = '$DB_USER'";) ]]; then + echo "Creating database..." + sudo -u postgres "$PG_BIN/psql" -U postgres -c "CREATE ROLE \"$DB_USER\" with LOGIN CREATEDB PASSWORD '$DB_SECRET';" > /dev/null + fi + + if [[ -z $(sudo -u postgres "$PG_BIN/psql" -U postgres -Atc "SELECT 1 FROM pg_catalog.pg_database WHERE datname = '$DB_NAME'";) ]]; then + echo "Creating user..." + sudo -u postgres "$PG_BIN/psql" -U postgres -c "CREATE DATABASE \"$DB_NAME\";" >/dev/null + sudo -u postgres "$PG_BIN/psql" -U postgres -c "GRANT ALL PRIVILEGES ON DATABASE \"$DB_NAME\" to \"$DB_USER\";" > /dev/null + fi +} + +chown -R postgres:postgres "$PG_DATA" +chmod -R 0700 "$PG_DATA" + +echo "Initializing Database..." +database_initialization + +echo "Configuring the Database..." +configure_postgres + +echo "Starting Postgres..." +start_postgres + +echo "Creating database and user..." +create_database_and_user + +wait "$PG_PID" + From 8072e1fafb9ceec8eb91ad2d993a547b81f8f4a1 Mon Sep 17 00:00:00 2001 From: matiwinnetou Date: Tue, 29 Apr 2025 21:20:46 +0200 Subject: [PATCH 04/26] feat: sync status in the network service response. (#429) Co-authored-by: Mateusz Czeladka --- .../api/block/model/domain/NetworkStatus.java | 3 + .../CardanoConstructionServiceImpl.java | 2 +- .../service/ConstructionApiServiceImpl.java | 4 +- .../network/controller/NetworkApiImpl.java | 11 +- .../api/network/mapper/NetworkMapper.java | 1 + .../network/service/GenesisDataProvider.java | 7 + .../service/GenesisDataProviderImpl.java | 54 +++++++ .../api/network/service/NetworkService.java | 2 +- .../network/service/NetworkServiceImpl.java | 136 ++++++++---------- .../api/network/service/SlotRangeChecker.java | 21 +++ .../common/time/OfflineSlotService.java | 6 +- .../common/time/OfflineSlotServiceImpl.java | 31 ++-- .../config/CardanoConvertersConfig.java | 31 ++-- .../service/NetworkServiceImplTest.java | 2 + .../network/service/SlotRangeCheckerTest.java | 35 +++++ .../time/OfflineSlotServiceImplTest.java | 48 +++++-- .../service/AccountServiceImpl.java | 20 +-- .../TransactionScriptSizeCalculatorImpl.java | 10 +- .../TransactionSizeCalculatorImpl.java | 5 +- .../txsize/CustomTransactionSizeStore.java | 18 +-- .../txsize/model/TransactionSizeEntity.java | 1 + .../CustomTransactionSizeStoreTest.java | 16 ++- 22 files changed, 322 insertions(+), 142 deletions(-) create mode 100644 api/src/main/java/org/cardanofoundation/rosetta/api/network/service/GenesisDataProvider.java create mode 100644 api/src/main/java/org/cardanofoundation/rosetta/api/network/service/GenesisDataProviderImpl.java create mode 100644 api/src/main/java/org/cardanofoundation/rosetta/api/network/service/SlotRangeChecker.java create mode 100644 api/src/test/java/org/cardanofoundation/rosetta/api/network/service/SlotRangeCheckerTest.java diff --git a/api/src/main/java/org/cardanofoundation/rosetta/api/block/model/domain/NetworkStatus.java b/api/src/main/java/org/cardanofoundation/rosetta/api/block/model/domain/NetworkStatus.java index 4e3b6aa8f..90d3fec9e 100644 --- a/api/src/main/java/org/cardanofoundation/rosetta/api/block/model/domain/NetworkStatus.java +++ b/api/src/main/java/org/cardanofoundation/rosetta/api/block/model/domain/NetworkStatus.java @@ -8,6 +8,7 @@ import lombok.NoArgsConstructor; import org.openapitools.client.model.Peer; +import org.openapitools.client.model.SyncStatus; @Data @Builder @@ -17,5 +18,7 @@ public class NetworkStatus { private BlockIdentifierExtended latestBlock; private BlockIdentifierExtended genesisBlock; + private SyncStatus syncStatus; private List peers; + } diff --git a/api/src/main/java/org/cardanofoundation/rosetta/api/construction/service/CardanoConstructionServiceImpl.java b/api/src/main/java/org/cardanofoundation/rosetta/api/construction/service/CardanoConstructionServiceImpl.java index 14d21decb..b0c289e15 100644 --- a/api/src/main/java/org/cardanofoundation/rosetta/api/construction/service/CardanoConstructionServiceImpl.java +++ b/api/src/main/java/org/cardanofoundation/rosetta/api/construction/service/CardanoConstructionServiceImpl.java @@ -126,7 +126,7 @@ public Array decodeTransaction(String encoded) { @Override public Long calculateTtl(Long ttlOffset) { - long absoluteSlot = offlineMode ? offlineSlotService.getCurrentSlotBasedOnTime() + long absoluteSlot = offlineMode ? offlineSlotService.getCurrentSlotBasedOnTimeWithFallback() : ledgerBlockService.findLatestBlockIdentifier().getSlot(); return absoluteSlot + ttlOffset; diff --git a/api/src/main/java/org/cardanofoundation/rosetta/api/construction/service/ConstructionApiServiceImpl.java b/api/src/main/java/org/cardanofoundation/rosetta/api/construction/service/ConstructionApiServiceImpl.java index 10b4b10af..121ffbe3a 100644 --- a/api/src/main/java/org/cardanofoundation/rosetta/api/construction/service/ConstructionApiServiceImpl.java +++ b/api/src/main/java/org/cardanofoundation/rosetta/api/construction/service/ConstructionApiServiceImpl.java @@ -91,7 +91,7 @@ public ConstructionPreprocessResponse constructionPreprocessService( int relativeTtl = calculateRelativeTtl(metadata); - long currentSlotBasedOnTime = offlineSlotService.getCurrentSlotBasedOnTime() + relativeTtl; + long currentSlotBasedOnTime = offlineSlotService.getCurrentSlotBasedOnTimeWithFallback() + relativeTtl; NetworkEnum networkEnum = NetworkEnum.findByName( networkIdentifier.getNetwork()) @@ -216,7 +216,7 @@ public ConstructionPayloadsResponse constructionPayloadsService( private long calculateTtl(ConstructionPayloadsRequestMetadata metadata) { return metadata != null ? cardanoConstructionService.checkOrReturnDefaultTtl(metadata.getTtl()) : - offlineSlotService.getCurrentSlotBasedOnTime() + Constants.DEFAULT_RELATIVE_TTL; + offlineSlotService.getCurrentSlotBasedOnTimeWithFallback() + Constants.DEFAULT_RELATIVE_TTL; } private ProtocolParams convertProtocolParams(@Nullable ConstructionPayloadsRequestMetadata metadata) { diff --git a/api/src/main/java/org/cardanofoundation/rosetta/api/network/controller/NetworkApiImpl.java b/api/src/main/java/org/cardanofoundation/rosetta/api/network/controller/NetworkApiImpl.java index b11e7f976..5f4d27908 100644 --- a/api/src/main/java/org/cardanofoundation/rosetta/api/network/controller/NetworkApiImpl.java +++ b/api/src/main/java/org/cardanofoundation/rosetta/api/network/controller/NetworkApiImpl.java @@ -23,31 +23,32 @@ public class NetworkApiImpl implements NetworkApi { @Override public ResponseEntity networkList( - @RequestBody MetadataRequest metadataRequest) { + @RequestBody MetadataRequest metadataRequest) { final NetworkListResponse networkListResponse = networkService.getNetworkList(metadataRequest); return ResponseEntity.ok(networkListResponse); } @Override public ResponseEntity networkOptions( - @RequestBody NetworkRequest networkRequest) { + @RequestBody NetworkRequest networkRequest) { networkService.verifyNetworkRequest(networkRequest.getNetworkIdentifier()); final NetworkOptionsResponse networkOptionsResponse = networkService.getNetworkOptions( - networkRequest); + networkRequest); return ResponseEntity.ok(networkOptionsResponse); } @Override public ResponseEntity networkStatus( - @RequestBody NetworkRequest networkRequest) { + @RequestBody NetworkRequest networkRequest) { if (offlineMode) { throw ExceptionFactory.notSupportedInOfflineMode(); } networkService.verifyNetworkRequest(networkRequest.getNetworkIdentifier()); + final NetworkStatusResponse networkStatusResponse = networkService.getNetworkStatus( - networkRequest); + networkRequest); return ResponseEntity.ok(networkStatusResponse); } diff --git a/api/src/main/java/org/cardanofoundation/rosetta/api/network/mapper/NetworkMapper.java b/api/src/main/java/org/cardanofoundation/rosetta/api/network/mapper/NetworkMapper.java index 7c9e808b0..3b650f64e 100644 --- a/api/src/main/java/org/cardanofoundation/rosetta/api/network/mapper/NetworkMapper.java +++ b/api/src/main/java/org/cardanofoundation/rosetta/api/network/mapper/NetworkMapper.java @@ -17,6 +17,7 @@ public interface NetworkMapper { @Mapping(target = "currentBlockIdentifier.index", source = "latestBlock.number") @Mapping(target = "currentBlockIdentifier.hash", source = "latestBlock.hash") + @Mapping(target = "syncStatus", source = "syncStatus") @Mapping(target = "currentBlockTimestamp", expression = "java(java.util.concurrent.TimeUnit.SECONDS.toMillis(networkStatus.getLatestBlock().getBlockTimeInSeconds()))") @Mapping(target = "genesisBlockIdentifier.index", source = "genesisBlock.number", defaultValue = "0L") diff --git a/api/src/main/java/org/cardanofoundation/rosetta/api/network/service/GenesisDataProvider.java b/api/src/main/java/org/cardanofoundation/rosetta/api/network/service/GenesisDataProvider.java new file mode 100644 index 000000000..a19bc77e8 --- /dev/null +++ b/api/src/main/java/org/cardanofoundation/rosetta/api/network/service/GenesisDataProvider.java @@ -0,0 +1,7 @@ +package org.cardanofoundation.rosetta.api.network.service; + +public interface GenesisDataProvider { + + int getProtocolMagic(); + +} diff --git a/api/src/main/java/org/cardanofoundation/rosetta/api/network/service/GenesisDataProviderImpl.java b/api/src/main/java/org/cardanofoundation/rosetta/api/network/service/GenesisDataProviderImpl.java new file mode 100644 index 000000000..a1628ef46 --- /dev/null +++ b/api/src/main/java/org/cardanofoundation/rosetta/api/network/service/GenesisDataProviderImpl.java @@ -0,0 +1,54 @@ +package org.cardanofoundation.rosetta.api.network.service; + +import java.io.IOException; +import java.util.Map; +import javax.annotation.PostConstruct; + +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; + +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Service; +import com.fasterxml.jackson.core.type.TypeReference; +import com.fasterxml.jackson.databind.ObjectMapper; + +import org.cardanofoundation.rosetta.common.exception.ExceptionFactory; +import org.cardanofoundation.rosetta.common.util.FileUtils; + +import static org.cardanofoundation.rosetta.common.util.Constants.NETWORK_MAGIC_NAME; + +@Service +@Slf4j +@RequiredArgsConstructor +public class GenesisDataProviderImpl implements GenesisDataProvider { + + @Value("${cardano.rosetta.GENESIS_SHELLEY_PATH}") + private String genesisShelleyPath; + + private int protocolMagic; + + @PostConstruct + public void init() { + Map jsonMap = loadGenesisShelleyConfig(); + protocolMagic = (Integer) jsonMap.get(NETWORK_MAGIC_NAME); + + log.info("Protocol magic number: {} loaded from genesis config json", protocolMagic); + } + + @Override + public int getProtocolMagic() { + return protocolMagic; + } + + private Map loadGenesisShelleyConfig() { + try { + String content = FileUtils.fileReader(genesisShelleyPath); + + return new ObjectMapper().readValue(content, new TypeReference<>() { + }); + } catch (IOException e) { + throw ExceptionFactory.configNotFoundException(genesisShelleyPath); + } + } + +} diff --git a/api/src/main/java/org/cardanofoundation/rosetta/api/network/service/NetworkService.java b/api/src/main/java/org/cardanofoundation/rosetta/api/network/service/NetworkService.java index 5a986a0ad..b0a91dc9d 100644 --- a/api/src/main/java/org/cardanofoundation/rosetta/api/network/service/NetworkService.java +++ b/api/src/main/java/org/cardanofoundation/rosetta/api/network/service/NetworkService.java @@ -1,6 +1,5 @@ package org.cardanofoundation.rosetta.api.network.service; - import com.bloxbean.cardano.client.common.model.Network; import org.openapitools.client.model.MetadataRequest; import org.openapitools.client.model.NetworkIdentifier; @@ -10,6 +9,7 @@ import org.openapitools.client.model.NetworkStatusResponse; public interface NetworkService { + NetworkListResponse getNetworkList(final MetadataRequest metadataRequest); NetworkOptionsResponse getNetworkOptions(final NetworkRequest networkRequest); diff --git a/api/src/main/java/org/cardanofoundation/rosetta/api/network/service/NetworkServiceImpl.java b/api/src/main/java/org/cardanofoundation/rosetta/api/network/service/NetworkServiceImpl.java index e24bbfd99..3cb726f8c 100644 --- a/api/src/main/java/org/cardanofoundation/rosetta/api/network/service/NetworkServiceImpl.java +++ b/api/src/main/java/org/cardanofoundation/rosetta/api/network/service/NetworkServiceImpl.java @@ -2,37 +2,21 @@ import java.io.IOException; import java.io.InputStream; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Comparator; -import java.util.LinkedHashMap; -import java.util.List; -import java.util.Map; -import javax.annotation.PostConstruct; +import java.util.*; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; +import lombok.val; import org.springframework.beans.factory.annotation.Value; import org.springframework.core.io.ResourceLoader; import org.springframework.stereotype.Service; import com.bloxbean.cardano.client.common.model.Network; import com.bloxbean.cardano.client.common.model.Networks; -import com.fasterxml.jackson.core.type.TypeReference; -import com.fasterxml.jackson.databind.ObjectMapper; import io.swagger.v3.oas.models.OpenAPI; import io.swagger.v3.parser.OpenAPIV3Parser; -import org.openapitools.client.model.Allow; +import org.openapitools.client.model.*; import org.openapitools.client.model.Error; -import org.openapitools.client.model.MetadataRequest; -import org.openapitools.client.model.NetworkIdentifier; -import org.openapitools.client.model.NetworkListResponse; -import org.openapitools.client.model.NetworkOptionsResponse; -import org.openapitools.client.model.NetworkRequest; -import org.openapitools.client.model.NetworkStatusResponse; -import org.openapitools.client.model.OperationStatus; -import org.openapitools.client.model.Peer; -import org.openapitools.client.model.Version; import org.cardanofoundation.rosetta.api.block.model.domain.BlockIdentifierExtended; import org.cardanofoundation.rosetta.api.block.model.domain.NetworkStatus; @@ -41,42 +25,40 @@ import org.cardanofoundation.rosetta.common.enumeration.OperationType; import org.cardanofoundation.rosetta.common.enumeration.OperationTypeStatus; import org.cardanofoundation.rosetta.common.exception.ExceptionFactory; +import org.cardanofoundation.rosetta.common.time.OfflineSlotService; import org.cardanofoundation.rosetta.common.util.Constants; -import org.cardanofoundation.rosetta.common.util.FileUtils; import org.cardanofoundation.rosetta.common.util.RosettaConstants; -import org.cardanofoundation.rosetta.config.RosettaConfig; @Service @Slf4j @RequiredArgsConstructor public class NetworkServiceImpl implements NetworkService { - private final RosettaConfig rosettaConfig; private final LedgerBlockService ledgerBlockService; + private final OfflineSlotService offlineSlotService; private final NetworkMapper networkMapper; private final TopologyConfigService topologyConfigService; private final ResourceLoader resourceLoader; - - private Integer cachedMagicNumber; + private final GenesisDataProvider genesisDataProvider; + private final SlotRangeChecker slotRangeChecker; @Value("${cardano.rosetta.GENESIS_SHELLEY_PATH}") private String genesisShelleyPath; + @Value("${cardano.rosetta.CARDANO_NODE_VERSION}") private String cardanoNodeVersion; + @Value("${cardano.rosetta.middleware-version}") private String revision; - @PostConstruct - public void init() { - Map jsonMap = loadGenesisShelleyConfig(); - cachedMagicNumber = (Integer) jsonMap.get(Constants.NETWORK_MAGIC_NAME); - log.info("Magic number {} loaded from genesis config json", cachedMagicNumber); - } + @Value("${cardano.rosetta.ALLOWED_SLOTS_DELTA:100}") + private int allowedSlotsDelta; @Override public NetworkListResponse getNetworkList(MetadataRequest metadataRequest) { log.info("[networkList] Looking for all supported networks"); Network supportedNetwork = getSupportedNetwork(); + return networkMapper.toNetworkListResponse(supportedNetwork); } @@ -86,42 +68,42 @@ public NetworkOptionsResponse getNetworkOptions(NetworkRequest networkRequest) { String rosettaVersion = getRosettaVersion(); OperationStatus success = new OperationStatus().successful(true) - .status(OperationTypeStatus.SUCCESS.getValue()); + .status(OperationTypeStatus.SUCCESS.getValue()); OperationStatus invalid = new OperationStatus().successful(false) - .status(OperationTypeStatus.INVALID.getValue()); + .status(OperationTypeStatus.INVALID.getValue()); List operationStatuses = List.of(success, invalid); return NetworkOptionsResponse.builder() - .version(new Version().nodeVersion(cardanoNodeVersion) - .rosettaVersion(rosettaVersion) - .middlewareVersion(revision) - .metadata(new LinkedHashMap<>())) - .allow(new Allow().operationStatuses(operationStatuses) - .operationTypes( - Arrays.stream(OperationType.values()).map(OperationType::getValue).toList()) - .errors(RosettaConstants.ROSETTA_ERRORS.stream() - .map(error -> - new Error().code(error.getCode()) - .message(error.getMessage()) - .retriable(error.isRetriable()) - .description(error.getDescription()) - .code(error.getCode()) - ) - .sorted(Comparator.comparingInt(Error::getCode)) - .toList()) - .historicalBalanceLookup(true) - .callMethods(new ArrayList<>()) - .mempoolCoins(false)) - .build(); + .version(new Version().nodeVersion(cardanoNodeVersion) + .rosettaVersion(rosettaVersion) + .middlewareVersion(revision) + .metadata(new LinkedHashMap<>())) + .allow(new Allow().operationStatuses(operationStatuses) + .operationTypes( + Arrays.stream(OperationType.values()).map(OperationType::getValue).toList()) + .errors(RosettaConstants.ROSETTA_ERRORS.stream() + .map(error -> + new Error().code(error.getCode()) + .message(error.getMessage()) + .retriable(error.isRetriable()) + .description(error.getDescription()) + .code(error.getCode()) + ) + .sorted(Comparator.comparingInt(Error::getCode)) + .toList()) + .historicalBalanceLookup(true) + .callMethods(new ArrayList<>()) + .mempoolCoins(false)) + .build(); } private String getRosettaVersion() { try { InputStream openAPIStream = resourceLoader.getResource( - Constants.ROSETTA_API_PATH).getInputStream(); + Constants.ROSETTA_API_PATH).getInputStream(); OpenAPI openAPI = new OpenAPIV3Parser().readContents(new String(openAPIStream.readAllBytes()), - null, null) - .getOpenAPI(); + null, null) + .getOpenAPI(); return openAPI.getInfo().getVersion(); } catch (IOException e) { throw ExceptionFactory.configNotFoundException(Constants.ROSETTA_API_PATH); @@ -139,13 +121,15 @@ public NetworkStatusResponse getNetworkStatus(NetworkRequest networkRequest) { @Override public Network getSupportedNetwork() { - Integer networkMagic = getNetworkMagic(); + int networkMagic = genesisDataProvider.getProtocolMagic(); + return switch (networkMagic) { case Constants.MAINNET_NETWORK_MAGIC -> Networks.mainnet(); case Constants.PREPROD_NETWORK_MAGIC -> Networks.preprod(); case Constants.PREVIEW_NETWORK_MAGIC -> Networks.preview(); case Constants.SANCHONET_NETWORK_MAGIC -> new Network(0b0000, Constants.SANCHONET_NETWORK_MAGIC); case Constants.DEVKIT_NETWORK_MAGIC -> new Network(0b0000, Constants.DEVKIT_NETWORK_MAGIC); + default -> throw ExceptionFactory.invalidNetworkError(); }; } @@ -162,11 +146,28 @@ private NetworkStatus networkStatus() { List peers = topologyConfigService.getPeers(); - return NetworkStatus.builder() - .latestBlock(latestBlock) - .genesisBlock(genesisBlock) - .peers(peers) - .build(); + val networkStatusBuilder = NetworkStatus.builder() + .latestBlock(latestBlock) + .genesisBlock(genesisBlock) + .peers(peers); + + calculateSyncStatus(latestBlock).ifPresent(networkStatusBuilder::syncStatus); + + return networkStatusBuilder.build(); + } + + private Optional calculateSyncStatus(BlockIdentifierExtended latestBlock) { + return offlineSlotService.getCurrentSlotBasedOnTime().map(slotBasedOnTime -> { + long slotBasedOnLatestBlock = latestBlock.getSlot(); + + boolean isSynced = slotRangeChecker.isSlotWithinEpsilon(slotBasedOnTime, slotBasedOnLatestBlock, allowedSlotsDelta); + + return SyncStatus.builder() + .targetIndex(slotBasedOnTime) + .currentIndex(slotBasedOnLatestBlock) + .synced(isSynced) + .build(); + }); } @Override @@ -210,16 +211,5 @@ private boolean verifyNetwork(String network) { } } - public Integer getNetworkMagic() { - return cachedMagicNumber; - } - private Map loadGenesisShelleyConfig() { - try { - String content = FileUtils.fileReader(genesisShelleyPath); - return new ObjectMapper().readValue(content, new TypeReference>() {}); - } catch (IOException e) { - throw ExceptionFactory.configNotFoundException(genesisShelleyPath); - } - } } diff --git a/api/src/main/java/org/cardanofoundation/rosetta/api/network/service/SlotRangeChecker.java b/api/src/main/java/org/cardanofoundation/rosetta/api/network/service/SlotRangeChecker.java new file mode 100644 index 000000000..87ad4d78d --- /dev/null +++ b/api/src/main/java/org/cardanofoundation/rosetta/api/network/service/SlotRangeChecker.java @@ -0,0 +1,21 @@ +package org.cardanofoundation.rosetta.api.network.service; + +import org.springframework.stereotype.Service; + +@Service +public class SlotRangeChecker { + + public boolean isSlotWithinEpsilon(long slotBasedOnTime, + long slotBasedOnLatestBlock, + long epsilon) { + assert slotBasedOnTime >= 0; + assert slotBasedOnLatestBlock >= 0; + + if (epsilon < 0) { + throw new IllegalArgumentException("Epsilon must be non-negative"); + } + + return Math.abs(slotBasedOnTime - slotBasedOnLatestBlock) <= epsilon; + } + +} diff --git a/api/src/main/java/org/cardanofoundation/rosetta/common/time/OfflineSlotService.java b/api/src/main/java/org/cardanofoundation/rosetta/common/time/OfflineSlotService.java index b97d554ec..23c4884eb 100644 --- a/api/src/main/java/org/cardanofoundation/rosetta/common/time/OfflineSlotService.java +++ b/api/src/main/java/org/cardanofoundation/rosetta/common/time/OfflineSlotService.java @@ -1,7 +1,11 @@ package org.cardanofoundation.rosetta.common.time; +import java.util.Optional; + public interface OfflineSlotService { - long getCurrentSlotBasedOnTime(); + long getCurrentSlotBasedOnTimeWithFallback(); + + Optional getCurrentSlotBasedOnTime(); } diff --git a/api/src/main/java/org/cardanofoundation/rosetta/common/time/OfflineSlotServiceImpl.java b/api/src/main/java/org/cardanofoundation/rosetta/common/time/OfflineSlotServiceImpl.java index da59ee305..77e11881c 100644 --- a/api/src/main/java/org/cardanofoundation/rosetta/common/time/OfflineSlotServiceImpl.java +++ b/api/src/main/java/org/cardanofoundation/rosetta/common/time/OfflineSlotServiceImpl.java @@ -1,6 +1,7 @@ package org.cardanofoundation.rosetta.common.time; import java.time.*; +import java.util.Optional; import javax.annotation.Nullable; import lombok.RequiredArgsConstructor; @@ -39,19 +40,33 @@ public class OfflineSlotServiceImpl implements OfflineSlotService { protected CardanoConverters cardanoConverters; @Override - public long getCurrentSlotBasedOnTime() { + public long getCurrentSlotBasedOnTimeWithFallback() { if (cardanoConverters != null) { - LocalDateTime nowDateTime = LocalDateTime.now(clock); - ZoneOffset zoneOffset = ZonedDateTime.now(zoneId).getOffset(); + return timeToAbsoluteSlotNo(); + } - if (nowDateTime.toInstant(zoneOffset).isBefore(shellyStartTime)) { - throw new ApiException(ExceptionFactory.misconfiguredTime(nowDateTime).getError()); - } + return shelleyStartSlot; + } - return cardanoConverters.time().toSlot(nowDateTime); + @Override + public Optional getCurrentSlotBasedOnTime() { + if (cardanoConverters != null) { + return Optional.of(timeToAbsoluteSlotNo()); } - return shelleyStartSlot; + return Optional.empty(); + } + + private Long timeToAbsoluteSlotNo() { + LocalDateTime nowDateTime = LocalDateTime.now(clock); + ZoneOffset zoneOffset = ZonedDateTime.now(zoneId).getOffset(); + + if (nowDateTime.toInstant(zoneOffset).isBefore(shellyStartTime)) { + throw new ApiException(ExceptionFactory.misconfiguredTime(nowDateTime).getError()); + + } + + return cardanoConverters.time().toSlot(nowDateTime); } } diff --git a/api/src/main/java/org/cardanofoundation/rosetta/config/CardanoConvertersConfig.java b/api/src/main/java/org/cardanofoundation/rosetta/config/CardanoConvertersConfig.java index 1a466236e..a30401979 100644 --- a/api/src/main/java/org/cardanofoundation/rosetta/config/CardanoConvertersConfig.java +++ b/api/src/main/java/org/cardanofoundation/rosetta/config/CardanoConvertersConfig.java @@ -6,6 +6,7 @@ import java.time.ZonedDateTime; import jakarta.annotation.Nullable; +import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Qualifier; @@ -14,49 +15,53 @@ import org.cardanofoundation.conversions.CardanoConverters; import org.cardanofoundation.conversions.ClasspathConversionsFactory; -import org.cardanofoundation.conversions.domain.NetworkType; -import org.cardanofoundation.rosetta.api.network.service.NetworkService; +import org.cardanofoundation.rosetta.api.network.service.GenesisDataProvider; import org.cardanofoundation.rosetta.common.util.Constants; +import static org.cardanofoundation.conversions.domain.NetworkType.*; import static org.cardanofoundation.rosetta.common.util.Constants.MAINNET_NETWORK_MAGIC; @Configuration @Slf4j +@RequiredArgsConstructor public class CardanoConvertersConfig { + private final GenesisDataProvider genesisDataProvider; + @Bean @Nullable - public CardanoConverters cardanoConverters(NetworkService networkService) { - if (networkService.getSupportedNetwork() == null) { // mostly helper for unit tests and integration tests - return null; - } - - long protocolMagic = networkService.getSupportedNetwork().getProtocolMagic(); + public CardanoConverters cardanoConverters() { + int protocolMagic = genesisDataProvider.getProtocolMagic(); log.info("Creating CardanoConverters for network magic: {}", protocolMagic); if (protocolMagic == MAINNET_NETWORK_MAGIC) { - return ClasspathConversionsFactory.createConverters(NetworkType.MAINNET); + log.info("Creating CardanoConverters for mainnet"); + return ClasspathConversionsFactory.createConverters(MAINNET); } if (protocolMagic == Constants.PREPROD_NETWORK_MAGIC) { - return ClasspathConversionsFactory.createConverters(NetworkType.PREPROD); + log.info("Creating CardanoConverters for preprod"); + return ClasspathConversionsFactory.createConverters(PREPROD); } if (protocolMagic == Constants.PREVIEW_NETWORK_MAGIC) { - return ClasspathConversionsFactory.createConverters(NetworkType.PREVIEW); + log.info("Creating CardanoConverters for preview"); + return ClasspathConversionsFactory.createConverters(PREVIEW); } if (protocolMagic == Constants.SANCHONET_NETWORK_MAGIC) { - return ClasspathConversionsFactory.createConverters(NetworkType.SANCHONET); + log.info("Creating CardanoConverters for sanchonet"); + return ClasspathConversionsFactory.createConverters(SANCHONET); } if (protocolMagic == Constants.DEVKIT_NETWORK_MAGIC) { + log.info("Creating CardanoConverters for devkit, no converters available"); // Cardano Converters for DevKit is not supported but we still need to return something sensible return null; } - throw new IllegalArgumentException("Unsupported network magic: " + protocolMagic); + throw new IllegalArgumentException("Unsupported network magic: %d".formatted(protocolMagic)); } @Bean diff --git a/api/src/test/java/org/cardanofoundation/rosetta/api/network/service/NetworkServiceImplTest.java b/api/src/test/java/org/cardanofoundation/rosetta/api/network/service/NetworkServiceImplTest.java index 54b4f6889..6fff8827d 100644 --- a/api/src/test/java/org/cardanofoundation/rosetta/api/network/service/NetworkServiceImplTest.java +++ b/api/src/test/java/org/cardanofoundation/rosetta/api/network/service/NetworkServiceImplTest.java @@ -116,4 +116,6 @@ private NetworkIdentifier createNetworkIdentifier(String blockchain, String netw .network(network) .build(); } + + } diff --git a/api/src/test/java/org/cardanofoundation/rosetta/api/network/service/SlotRangeCheckerTest.java b/api/src/test/java/org/cardanofoundation/rosetta/api/network/service/SlotRangeCheckerTest.java new file mode 100644 index 000000000..88b40df38 --- /dev/null +++ b/api/src/test/java/org/cardanofoundation/rosetta/api/network/service/SlotRangeCheckerTest.java @@ -0,0 +1,35 @@ +package org.cardanofoundation.rosetta.api.network.service; + +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.*; + +class SlotRangeCheckerTest { + + @Test + void testIsSlotWithinEpsilonWhenWithinRange() { + SlotRangeChecker slotRangeChecker = new SlotRangeChecker(); + assertTrue(slotRangeChecker.isSlotWithinEpsilon(100, 105, 10)); + } + + @Test + void testIsSlotWithinEpsilonWhenOutOfRange() { + SlotRangeChecker slotRangeChecker = new SlotRangeChecker(); + assertFalse(slotRangeChecker.isSlotWithinEpsilon(100, 120, 10)); + } + + @Test + void testIsSlotWithinEpsilonWhenAtBoundary() { + SlotRangeChecker slotRangeChecker = new SlotRangeChecker(); + assertTrue(slotRangeChecker.isSlotWithinEpsilon(100, 110, 10)); + } + + @Test + void testIsSlotWithinEpsilonThrowsExceptionWhenEpsilonNegative() { + SlotRangeChecker slotRangeChecker = new SlotRangeChecker(); + IllegalArgumentException exception = assertThrows(IllegalArgumentException.class, + () -> slotRangeChecker.isSlotWithinEpsilon(100, 105, -1)); + assertEquals("Epsilon must be non-negative", exception.getMessage()); + } + +} diff --git a/api/src/test/java/org/cardanofoundation/rosetta/common/time/OfflineSlotServiceImplTest.java b/api/src/test/java/org/cardanofoundation/rosetta/common/time/OfflineSlotServiceImplTest.java index ba5db3b85..9b500dc83 100644 --- a/api/src/test/java/org/cardanofoundation/rosetta/common/time/OfflineSlotServiceImplTest.java +++ b/api/src/test/java/org/cardanofoundation/rosetta/common/time/OfflineSlotServiceImplTest.java @@ -4,6 +4,7 @@ import java.time.Instant; import java.time.LocalDateTime; import java.time.ZoneOffset; +import java.util.Optional; import org.mockito.Mock; import org.mockito.Spy; @@ -35,15 +36,20 @@ class OfflineSlotServiceImplTest { private final Instant shellyStartTime = Instant.parse("2020-07-29T21:44:51Z"); private final long shelleyStartSlot = 1000L; // Example slot value - private OfflineSlotServiceImpl offlineSlotService; + private OfflineSlotServiceImpl offlineSlotServiceWithConverters; + private OfflineSlotServiceImpl offlineSlotServiceWithoutConverters; @BeforeEach @SuppressWarnings("java:S5786") public void setup() { - this.offlineSlotService = new OfflineSlotServiceImpl(clock, zoneOffset); - this.offlineSlotService.cardanoConverters = cardanoConverters; - this.offlineSlotService.shelleyStartSlot = shelleyStartSlot; - this.offlineSlotService.shellyStartTime = shellyStartTime; + this.offlineSlotServiceWithConverters = new OfflineSlotServiceImpl(clock, zoneOffset); + this.offlineSlotServiceWithConverters.cardanoConverters = cardanoConverters; + this.offlineSlotServiceWithConverters.shelleyStartSlot = shelleyStartSlot; + this.offlineSlotServiceWithConverters.shellyStartTime = shellyStartTime; + + this.offlineSlotServiceWithoutConverters = new OfflineSlotServiceImpl(clock, zoneOffset); + this.offlineSlotServiceWithoutConverters.shelleyStartSlot = shelleyStartSlot; + this.offlineSlotServiceWithoutConverters.shellyStartTime = shellyStartTime; } @Test @@ -54,7 +60,7 @@ void shouldReturnSlotBasedOnCurrentTime_WhenCardanoConvertersAvailable() { when(clock.getZone()).thenReturn(zoneOffset); // When - long slot = offlineSlotService.getCurrentSlotBasedOnTime(); + long slot = offlineSlotServiceWithConverters.getCurrentSlotBasedOnTimeWithFallback(); // Then assertThat(slot).isEqualTo(105366319L); @@ -68,7 +74,7 @@ void shouldThrowException_WhenTimeIsBeforeShellyStartTime() { when(clock.getZone()).thenReturn(zoneOffset); // When / Then - assertThatThrownBy(() -> offlineSlotService.getCurrentSlotBasedOnTime()) + assertThatThrownBy(() -> offlineSlotServiceWithConverters.getCurrentSlotBasedOnTimeWithFallback()) .isInstanceOf(ApiException.class); } @@ -80,11 +86,37 @@ void shouldVerifyCardanoConvertersSlotMethodIsCalled() { when(clock.getZone()).thenReturn(zoneOffset); // When - long slot = offlineSlotService.getCurrentSlotBasedOnTime(); + long slot = offlineSlotServiceWithConverters.getCurrentSlotBasedOnTimeWithFallback(); // Then assertThat(slot).isEqualTo(105366319L); verify(cardanoConverters, atLeastOnce()).time(); } + @Test + void shouldVerifyCardanoConvertersSlotMethodIsCalledWithoutFallback() { + // Given + LocalDateTime now = LocalDateTime.of(2023, 10, 10, 10, 10, 10); + when(clock.instant()).thenReturn(now.toInstant(zoneOffset)); + when(clock.getZone()).thenReturn(zoneOffset); + + // When + Optional slotM = offlineSlotServiceWithConverters.getCurrentSlotBasedOnTime(); + + // Then + assertThat(slotM).isPresent(); + assertThat(slotM.orElseThrow()).isEqualTo(105366319L); + verify(cardanoConverters, atLeastOnce()).time(); + } + + @Test + public void cardanoConvertersNotAvailableNoCurrentSlot() { + assertThat(offlineSlotServiceWithoutConverters.getCurrentSlotBasedOnTime()).isNotPresent(); + } + + @Test + public void cardanoConvertersNotAvailableCurrentSlotFallback() { + assertThat(offlineSlotServiceWithoutConverters.getCurrentSlotBasedOnTimeWithFallback()).isEqualTo(shelleyStartSlot); + } + } diff --git a/yaci-indexer/src/main/java/org/cardanofoundation/rosetta/yaciindexer/service/AccountServiceImpl.java b/yaci-indexer/src/main/java/org/cardanofoundation/rosetta/yaciindexer/service/AccountServiceImpl.java index 86b5771ef..01ce953ae 100644 --- a/yaci-indexer/src/main/java/org/cardanofoundation/rosetta/yaciindexer/service/AccountServiceImpl.java +++ b/yaci-indexer/src/main/java/org/cardanofoundation/rosetta/yaciindexer/service/AccountServiceImpl.java @@ -1,22 +1,24 @@ package org.cardanofoundation.rosetta.yaciindexer.service; +import java.math.BigInteger; +import java.time.Duration; +import java.util.Optional; +import java.util.Set; +import jakarta.annotation.Nullable; + +import lombok.extern.slf4j.Slf4j; + +import org.springframework.boot.autoconfigure.condition.ConditionalOnExpression; +import org.springframework.stereotype.Service; import com.bloxbean.cardano.client.address.Address; import com.bloxbean.cardano.yaci.core.protocol.localstate.api.Era; import com.bloxbean.cardano.yaci.core.protocol.localstate.queries.DelegationsAndRewardAccountsQuery; import com.bloxbean.cardano.yaci.core.protocol.localstate.queries.DelegationsAndRewardAccountsResult; import com.bloxbean.cardano.yaci.helper.LocalClientProvider; import com.bloxbean.cardano.yaci.store.core.service.local.LocalClientProviderManager; -import jakarta.annotation.Nullable; -import lombok.extern.slf4j.Slf4j; -import org.cardanofoundation.rosetta.yaciindexer.domain.model.StakeAccountRewardInfo; -import org.springframework.boot.autoconfigure.condition.ConditionalOnExpression; -import org.springframework.stereotype.Service; import reactor.core.publisher.Mono; -import java.math.BigInteger; -import java.time.Duration; -import java.util.Optional; -import java.util.Set; +import org.cardanofoundation.rosetta.yaciindexer.domain.model.StakeAccountRewardInfo; @Service @Slf4j diff --git a/yaci-indexer/src/main/java/org/cardanofoundation/rosetta/yaciindexer/service/TransactionScriptSizeCalculatorImpl.java b/yaci-indexer/src/main/java/org/cardanofoundation/rosetta/yaciindexer/service/TransactionScriptSizeCalculatorImpl.java index 6829c1573..ad8934e67 100644 --- a/yaci-indexer/src/main/java/org/cardanofoundation/rosetta/yaciindexer/service/TransactionScriptSizeCalculatorImpl.java +++ b/yaci-indexer/src/main/java/org/cardanofoundation/rosetta/yaciindexer/service/TransactionScriptSizeCalculatorImpl.java @@ -1,5 +1,10 @@ package org.cardanofoundation.rosetta.yaciindexer.service; +import java.util.List; + +import lombok.extern.slf4j.Slf4j; + +import org.springframework.stereotype.Service; import co.nstant.in.cbor.model.Array; import co.nstant.in.cbor.model.ByteString; import co.nstant.in.cbor.model.Map; @@ -10,11 +15,8 @@ import com.bloxbean.cardano.yaci.core.model.PlutusScript; import com.bloxbean.cardano.yaci.helper.model.Transaction; import com.fasterxml.jackson.core.JsonProcessingException; -import lombok.extern.slf4j.Slf4j; -import org.cardanofoundation.rosetta.yaciindexer.domain.model.TransactionBuildingConstants; -import org.springframework.stereotype.Service; -import java.util.List; +import org.cardanofoundation.rosetta.yaciindexer.domain.model.TransactionBuildingConstants; import static com.bloxbean.cardano.client.util.HexUtil.decodeHexString; import static org.cardanofoundation.rosetta.yaciindexer.domain.model.TransactionBuildingConstants.*; diff --git a/yaci-indexer/src/main/java/org/cardanofoundation/rosetta/yaciindexer/service/TransactionSizeCalculatorImpl.java b/yaci-indexer/src/main/java/org/cardanofoundation/rosetta/yaciindexer/service/TransactionSizeCalculatorImpl.java index 7cc7d0578..ed20bf15e 100644 --- a/yaci-indexer/src/main/java/org/cardanofoundation/rosetta/yaciindexer/service/TransactionSizeCalculatorImpl.java +++ b/yaci-indexer/src/main/java/org/cardanofoundation/rosetta/yaciindexer/service/TransactionSizeCalculatorImpl.java @@ -1,9 +1,10 @@ package org.cardanofoundation.rosetta.yaciindexer.service; -import co.nstant.in.cbor.model.Map; -import com.bloxbean.cardano.yaci.core.util.CborSerializationUtil; import lombok.extern.slf4j.Slf4j; + import org.springframework.stereotype.Service; +import co.nstant.in.cbor.model.Map; +import com.bloxbean.cardano.yaci.core.util.CborSerializationUtil; @Service @Slf4j diff --git a/yaci-indexer/src/main/java/org/cardanofoundation/rosetta/yaciindexer/stores/txsize/CustomTransactionSizeStore.java b/yaci-indexer/src/main/java/org/cardanofoundation/rosetta/yaciindexer/stores/txsize/CustomTransactionSizeStore.java index 176a24c52..b0cbcf668 100644 --- a/yaci-indexer/src/main/java/org/cardanofoundation/rosetta/yaciindexer/stores/txsize/CustomTransactionSizeStore.java +++ b/yaci-indexer/src/main/java/org/cardanofoundation/rosetta/yaciindexer/stores/txsize/CustomTransactionSizeStore.java @@ -1,5 +1,14 @@ package org.cardanofoundation.rosetta.yaciindexer.stores.txsize; +import java.util.List; +import java.util.Optional; + +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; + +import org.springframework.context.event.EventListener; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; import co.nstant.in.cbor.model.Array; import co.nstant.in.cbor.model.DataItem; import co.nstant.in.cbor.model.Map; @@ -8,19 +17,12 @@ import com.bloxbean.cardano.yaci.core.util.CborSerializationUtil; import com.bloxbean.cardano.yaci.helper.model.Transaction; import com.bloxbean.cardano.yaci.store.events.TransactionEvent; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; + import org.cardanofoundation.rosetta.yaciindexer.domain.model.TransactionBuildingConstants; import org.cardanofoundation.rosetta.yaciindexer.service.TransactionScriptSizeCalculator; import org.cardanofoundation.rosetta.yaciindexer.service.TransactionSizeCalculator; import org.cardanofoundation.rosetta.yaciindexer.stores.txsize.model.TransactionSizeEntity; import org.cardanofoundation.rosetta.yaciindexer.stores.txsize.model.TransactionSizeRepository; -import org.springframework.context.event.EventListener; -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; - -import java.util.List; -import java.util.Optional; import static co.nstant.in.cbor.model.SimpleValue.TRUE; import static org.cardanofoundation.rosetta.yaciindexer.domain.model.TransactionBuildingConstants.*; diff --git a/yaci-indexer/src/main/java/org/cardanofoundation/rosetta/yaciindexer/stores/txsize/model/TransactionSizeEntity.java b/yaci-indexer/src/main/java/org/cardanofoundation/rosetta/yaciindexer/stores/txsize/model/TransactionSizeEntity.java index 0b1c2f25c..7000f36be 100644 --- a/yaci-indexer/src/main/java/org/cardanofoundation/rosetta/yaciindexer/stores/txsize/model/TransactionSizeEntity.java +++ b/yaci-indexer/src/main/java/org/cardanofoundation/rosetta/yaciindexer/stores/txsize/model/TransactionSizeEntity.java @@ -4,6 +4,7 @@ import jakarta.persistence.Entity; import jakarta.persistence.Id; import jakarta.persistence.Table; + import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Data; diff --git a/yaci-indexer/src/test/java/org/cardanofoundation/rosetta/yaciindexer/stores/txsize/CustomTransactionSizeStoreTest.java b/yaci-indexer/src/test/java/org/cardanofoundation/rosetta/yaciindexer/stores/txsize/CustomTransactionSizeStoreTest.java index 0267c7e16..d80f0e632 100644 --- a/yaci-indexer/src/test/java/org/cardanofoundation/rosetta/yaciindexer/stores/txsize/CustomTransactionSizeStoreTest.java +++ b/yaci-indexer/src/test/java/org/cardanofoundation/rosetta/yaciindexer/stores/txsize/CustomTransactionSizeStoreTest.java @@ -1,20 +1,22 @@ package org.cardanofoundation.rosetta.yaciindexer.stores.txsize; +import java.util.List; + import com.bloxbean.cardano.yaci.store.events.TransactionEvent; import org.assertj.core.api.Assertions; +import org.mockito.*; +import org.mockito.junit.jupiter.MockitoExtension; + +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; + import org.cardanofoundation.rosetta.yaciindexer.TestDataGenerator; import org.cardanofoundation.rosetta.yaciindexer.service.TransactionScriptSizeCalculator; import org.cardanofoundation.rosetta.yaciindexer.service.TransactionScriptSizeCalculatorImpl; import org.cardanofoundation.rosetta.yaciindexer.service.TransactionSizeCalculatorImpl; import org.cardanofoundation.rosetta.yaciindexer.stores.txsize.model.TransactionSizeEntity; import org.cardanofoundation.rosetta.yaciindexer.stores.txsize.model.TransactionSizeRepository; -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.Test; -import org.junit.jupiter.api.extension.ExtendWith; -import org.mockito.*; -import org.mockito.junit.jupiter.MockitoExtension; - -import java.util.List; @ExtendWith(MockitoExtension.class) class CustomTransactionSizeStoreTest { From 5a98d203ce095593387cc91322f7dca61482ebdc Mon Sep 17 00:00:00 2001 From: Mateusz Czeladka Date: Wed, 30 Apr 2025 16:00:08 +0200 Subject: [PATCH 05/26] chore: 1.2.8 version updated. --- README.md | 4 ++-- pom.xml | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 8b920bdfc..a545036e7 100644 --- a/README.md +++ b/README.md @@ -100,7 +100,7 @@ For every Release we provide pre-built docker images stored in the DockerHub Rep To start it use the following command: ```bash - docker run --name rosetta -v {CUSTOM_MOUNT_PATH}:/node --env-file ./docker/.env.dockerfile --env-file ./docker/.env.docker-profile-mid-level -p 8082:8082 --shm-size=4g -d cardanofoundation/cardano-rosetta-java:1.2.7 + docker run --name rosetta -v {CUSTOM_MOUNT_PATH}:/node --env-file ./docker/.env.dockerfile --env-file ./docker/.env.docker-profile-mid-level -p 8082:8082 --shm-size=4g -d cardanofoundation/cardano-rosetta-java:1.2.8 ``` Changes to the configuration can be made by adjusting the `docker/.env.dockerfile` file. For more information on the environment variables, please refer to the [documentation](https://cardano-foundation.github.io/cardano-rosetta-java/docs/install-and-deploy/env-vars). @@ -108,7 +108,7 @@ Changes to the configuration can be made by adjusting the `docker/.env.dockerfil If you want to use the `cardano-submit-api` you can additionally expose port `8090`. It can then be used to submit raw cbor transaction (API documentation here: [Link](https://input-output-hk.github.io/cardano-rest/submit-api/)) ```bash - docker run --name rosetta -v {CUSTOM_MOUNT_PATH}:/node --env-file ./docker/.env.dockerfile --env-file ./docker/.env.docker-profile-mid-level -p 8090:8090 -p 8082:8082 --shm-size=4g -d cardanofoundation/cardano-rosetta-java:1.2.7 + docker run --name rosetta -v {CUSTOM_MOUNT_PATH}:/node --env-file ./docker/.env.dockerfile --env-file ./docker/.env.docker-profile-mid-level -p 8090:8090 -p 8082:8082 --shm-size=4g -d cardanofoundation/cardano-rosetta-java:1.2.8 ``` ### Docker compose diff --git a/pom.xml b/pom.xml index 5645ee421..7ebf8261b 100644 --- a/pom.xml +++ b/pom.xml @@ -26,7 +26,7 @@ - 1.2.7 + 1.2.8 21 UTF-8 3.4.3 From 3bf272338b3e890a85b0882164f1ed4b9e30d89d Mon Sep 17 00:00:00 2001 From: VladislavKudrin Date: Fri, 2 May 2025 08:59:13 +0200 Subject: [PATCH 06/26] fix: postgres container locale (#438) --- docker-compose-indexer.yaml | 3 ++- docker/dockerfiles/postgres/Dockerfile | 4 ++++ docker/dockerfiles/postgres/entrypoint.sh | 10 ++++++---- 3 files changed, 12 insertions(+), 5 deletions(-) diff --git a/docker-compose-indexer.yaml b/docker-compose-indexer.yaml index ec52e7c7e..9eccf8b55 100644 --- a/docker-compose-indexer.yaml +++ b/docker-compose-indexer.yaml @@ -53,6 +53,7 @@ services: DB_SECRET: ${DB_SECRET} DB_USER: ${DB_USER} DB_NAME: ${DB_NAME} + DB_PORT: ${DB_PORT} NETWORK: ${NETWORK} PGPASSWORD: postgres @@ -79,7 +80,7 @@ services: volumes: - ${DB_PATH}:/var/lib/postgresql/data healthcheck: - test: [ "CMD-SHELL", "pg_isready -U ${DB_USER} -d ${DB_NAME} -p ${DB_PORT} -h localhost"] + test: [ "CMD-SHELL", "PGPASSWORD=${DB_SECRET} pg_isready -U ${DB_USER} -d ${DB_NAME} -p ${DB_PORT} -h localhost"] interval: 10s timeout: 3s retries: 10 diff --git a/docker/dockerfiles/postgres/Dockerfile b/docker/dockerfiles/postgres/Dockerfile index 938941da6..deffaa84b 100644 --- a/docker/dockerfiles/postgres/Dockerfile +++ b/docker/dockerfiles/postgres/Dockerfile @@ -10,6 +10,10 @@ RUN apt update && apt install -y \ git \ ca-certificates \ sudo \ + locales \ + && sed -i '/en_US.UTF-8/s/^# //g' /etc/locale.gen \ + && locale-gen \ + && update-locale LANG=en_US.UTF-8 \ && apt clean ENV PG_VERSION_TAG=REL_14_11 diff --git a/docker/dockerfiles/postgres/entrypoint.sh b/docker/dockerfiles/postgres/entrypoint.sh index 1ea0748a7..4adab7c20 100644 --- a/docker/dockerfiles/postgres/entrypoint.sh +++ b/docker/dockerfiles/postgres/entrypoint.sh @@ -84,11 +84,13 @@ configure_postgres() { fi done - echo "host all all 0.0.0.0/0 md5" \ - >> $PG_DATA/pg_hba.conf + if ! grep -q "^host all all 0.0.0.0/0 md5\$" "$PG_DATA/pg_hba.conf"; then + echo "host all all 0.0.0.0/0 md5" >> "$PG_DATA/pg_hba.conf" + fi - echo "listen_addresses='*'" \ - >> $PG_DATA/postgresql.conf + if ! grep -q "^listen_addresses *= *'\*'\$" "$PG_DATA/postgresql.conf"; then + echo "listen_addresses='*'" >> "$PG_DATA/postgresql.conf" + fi echo "PostgreSQL configuration updated successfully!" } From 27794a5bfc2ec4e60115a76a458e8ce99dbbff49 Mon Sep 17 00:00:00 2001 From: matiwinnetou Date: Fri, 2 May 2025 16:07:51 +0200 Subject: [PATCH 07/26] refactor: streamline spring boot configuration. (#424) Co-authored-by: Mateusz Czeladka --- api/Dockerfile | 6 +-- api/pom.xml | 19 +++++---- docker/Dockerfile | 2 +- pom.xml | 28 +++++++++---- test-data-generator/pom.xml | 7 ++++ yaci-indexer/Dockerfile | 2 +- yaci-indexer/pom.xml | 42 ++++++++++++++++--- .../application-h2-testdata.properties | 4 +- .../main/resources/application-h2.properties | 4 +- .../resources/application-postgres.properties | 4 +- .../src/main/resources/application.properties | 1 - ...0_1000_0__rosetta_app_transaction_size.sql | 6 +++ 12 files changed, 95 insertions(+), 30 deletions(-) create mode 100644 yaci-indexer/src/main/resources/db/store/postgresql/V1.0_1000_0__rosetta_app_transaction_size.sql diff --git a/api/Dockerfile b/api/Dockerfile index bcfd28631..70d33237f 100644 --- a/api/Dockerfile +++ b/api/Dockerfile @@ -2,7 +2,7 @@ FROM ubuntu:24.04 AS build-common WORKDIR /build RUN apt update --fix-missing \ - && apt install -y --no-install-recommends openjdk-21-jdk maven curl \ + && apt install -y --no-install-recommends openjdk-21-jdk maven curl ca-certificates \ && apt clean COPY ./pom.xml /build/pom.xml @@ -11,7 +11,7 @@ COPY ./yaci-indexer /build/yaci-indexer COPY ./test-data-generator /build/test-data-generator COPY ./.git .git -RUN --mount=type=cache,target=/root/.m2 mvn clean package -DskipTests +RUN --mount=type=cache,target=/root/.m2 mvn -U clean package -DskipTests WORKDIR /app RUN cp /build/api/target/*.jar /app/api.jar @@ -19,4 +19,4 @@ RUN rm -rf /build ENTRYPOINT ["java", "--enable-preview", "-jar", "/app/api.jar"] -CMD ["/bin/sh", "-c", "bash"] +CMD ["/bin/sh", "-c", "bash"] \ No newline at end of file diff --git a/api/pom.xml b/api/pom.xml index 87599728c..c968610a7 100644 --- a/api/pom.xml +++ b/api/pom.xml @@ -2,6 +2,7 @@ 4.0.0 + base org.cardanofoundation.rosetta-java @@ -30,6 +31,14 @@ junit-jupiter test + + org.springframework.boot + spring-boot-starter + + + org.springframework.boot + spring-boot-starter-security + org.springframework.boot spring-boot-starter-web @@ -52,10 +61,6 @@ org.springframework.data spring-data-commons - - org.springframework.boot - spring-boot-starter-security - org.springframework.boot spring-boot-starter-validation @@ -131,6 +136,7 @@ org.springframework.boot spring-boot-starter-data-jpa + hibernate-jpamodelgen org.hibernate.orm @@ -138,17 +144,18 @@ provided - org.postgresql postgresql runtime + commons-validator commons-validator 1.9.0 + io.swagger.parser.v3 swagger-parser @@ -165,8 +172,6 @@ io.hypersistence hypersistence-utils-hibernate-63 - 3.7.0 - compile ${project.groupId} diff --git a/docker/Dockerfile b/docker/Dockerfile index c93f0101c..d7ad03f12 100644 --- a/docker/Dockerfile +++ b/docker/Dockerfile @@ -192,7 +192,7 @@ RUN mkdir -p /node/postgres RUN rm -rf /var/lib/postgresql/${PG_VERSION}/main # Install jdk 21 -RUN apt install -y --no-install-recommends openjdk-21-jdk jq bc sudo curl \ +RUN apt install -y --no-install-recommends jq bc sudo curl \ && apt clean # Copy cardano node diff --git a/pom.xml b/pom.xml index 7ebf8261b..ac5b5bb4f 100644 --- a/pom.xml +++ b/pom.xml @@ -26,14 +26,16 @@ + full 1.2.8 21 UTF-8 - 3.4.3 + 3.4.4 1.6.15 6.4.0 3.13.0 3.2.5 + 3.7.1 0.8.11 1.3.0 1.18.38 @@ -90,6 +92,18 @@ + + org.springframework.boot + spring-boot-starter + ${version.spring-boot} + + + org.springframework.boot + spring-boot-dependencies + pom + ${version.spring-boot} + import + org.cardanofoundation cf-cardano-conversions-java @@ -100,13 +114,6 @@ vavr ${version.vavr} - - org.springframework.boot - spring-boot-dependencies - pom - ${version.spring-boot} - import - org.springdoc springdoc-openapi-ui @@ -143,6 +150,11 @@ yaci ${version.yaci} + + io.hypersistence + hypersistence-utils-hibernate-63 + ${version.hibernate-types} + com.h2database h2 diff --git a/test-data-generator/pom.xml b/test-data-generator/pom.xml index d4f75861d..079d12fba 100644 --- a/test-data-generator/pom.xml +++ b/test-data-generator/pom.xml @@ -63,6 +63,13 @@ ${version.maven-compiler-plugin} 21 + + + org.projectlombok + lombok + ${version.lombok} + + diff --git a/yaci-indexer/Dockerfile b/yaci-indexer/Dockerfile index fb3e65dd0..025d26a26 100644 --- a/yaci-indexer/Dockerfile +++ b/yaci-indexer/Dockerfile @@ -11,7 +11,7 @@ COPY ./yaci-indexer /build/yaci-indexer COPY ./test-data-generator /build/test-data-generator COPY ./.git .git -RUN --mount=type=cache,target=/root/.m2 mvn clean package -DskipTests +RUN --mount=type=cache,target=/root/.m2 mvn -U clean package -DskipTests WORKDIR /app RUN cp /build/yaci-indexer/target/*.jar /app/yaci-indexer.jar diff --git a/yaci-indexer/pom.xml b/yaci-indexer/pom.xml index c006221ba..eac23775d 100644 --- a/yaci-indexer/pom.xml +++ b/yaci-indexer/pom.xml @@ -4,19 +4,21 @@ 4.0.0 - org.springframework.boot - spring-boot-starter-parent - 3.3.10 - + base + org.cardanofoundation.rosetta-java + ${revision} - org.cardanofoundation.rosetta-java yaci-indexer 1.0.0 yaci-indexer + yaci-indexer + jar + 21 + full 0.1.2 src/main/java/org/cardanofoundation/rosetta/yaciindexer/stores/txsize/model/* 2.43.0 @@ -38,7 +40,6 @@ org.springframework.boot spring-boot-starter - org.springframework.boot spring-boot-starter-test @@ -88,6 +89,10 @@ yaci-store-epoch-spring-boot-starter ${yaci-store.version} + + io.hypersistence + hypersistence-utils-hibernate-63 + org.postgresql @@ -100,6 +105,31 @@ org.springframework.boot spring-boot-maven-plugin + ${version.spring-boot} + + + + repackage + build-info + + + + + + + org.apache.maven.plugins + maven-compiler-plugin + ${version.maven-compiler-plugin} + + 21 + + + org.projectlombok + lombok + ${version.lombok} + + + com.diffplug.spotless diff --git a/yaci-indexer/src/main/resources/application-h2-testdata.properties b/yaci-indexer/src/main/resources/application-h2-testdata.properties index cf067f902..f29b64443 100644 --- a/yaci-indexer/src/main/resources/application-h2-testdata.properties +++ b/yaci-indexer/src/main/resources/application-h2-testdata.properties @@ -7,4 +7,6 @@ spring.datasource.url=jdbc:h2:file:./testData/devkit.db spring.datasource.username=rosetta_db_admin spring.datasource.password=weakpwd#123_d -spring.h2.console.enabled=true \ No newline at end of file +spring.h2.console.enabled=true + +spring.jpa.hibernate.ddl-auto=update diff --git a/yaci-indexer/src/main/resources/application-h2.properties b/yaci-indexer/src/main/resources/application-h2.properties index 7c1db7c03..4165442a0 100644 --- a/yaci-indexer/src/main/resources/application-h2.properties +++ b/yaci-indexer/src/main/resources/application-h2.properties @@ -7,4 +7,6 @@ spring.datasource.url=jdbc:h2:mem:${DB_NAME:rosetta-java} spring.datasource.username=${DB_USER:rosetta_db_admin} spring.datasource.password=${DB_SECRET:weakpwd#123_d} -spring.h2.console.enabled=true \ No newline at end of file +spring.h2.console.enabled=true + +spring.jpa.hibernate.ddl-auto=update diff --git a/yaci-indexer/src/main/resources/application-postgres.properties b/yaci-indexer/src/main/resources/application-postgres.properties index 065da48af..839fdc4e7 100644 --- a/yaci-indexer/src/main/resources/application-postgres.properties +++ b/yaci-indexer/src/main/resources/application-postgres.properties @@ -6,4 +6,6 @@ ##################### Postgres DB ####################### spring.datasource.url=jdbc:postgresql://${DB_HOST:localhost}:${DB_PORT:5433}/${DB_NAME:rosetta-java}?currentSchema=${DB_SCHEMA:preprod} spring.datasource.username=${DB_USER:rosetta_db_admin} -spring.datasource.password=${DB_SECRET:weakpwd#123_d} \ No newline at end of file +spring.datasource.password=${DB_SECRET:weakpwd#123_d} + +spring.jpa.hibernate.ddl-auto=none \ No newline at end of file diff --git a/yaci-indexer/src/main/resources/application.properties b/yaci-indexer/src/main/resources/application.properties index 3a79b271c..49545411a 100644 --- a/yaci-indexer/src/main/resources/application.properties +++ b/yaci-indexer/src/main/resources/application.properties @@ -2,7 +2,6 @@ spring.profiles.active=${YACI_SPRING_PROFILES: h2} server.port=9095 #The following flyway section is mandatory spring.flyway.out-of-order=true -spring.jpa.hibernate.ddl-auto=update spring.flyway.locations=classpath:db/store/{vendor} #Api prefix for out-of-box REST API diff --git a/yaci-indexer/src/main/resources/db/store/postgresql/V1.0_1000_0__rosetta_app_transaction_size.sql b/yaci-indexer/src/main/resources/db/store/postgresql/V1.0_1000_0__rosetta_app_transaction_size.sql new file mode 100644 index 000000000..53e78b069 --- /dev/null +++ b/yaci-indexer/src/main/resources/db/store/postgresql/V1.0_1000_0__rosetta_app_transaction_size.sql @@ -0,0 +1,6 @@ +CREATE TABLE IF NOT EXISTS transaction_size ( + tx_hash TEXT PRIMARY KEY, + block_number BIGINT NOT NULL, + size INTEGER NOT NULL, + script_size INTEGER NOT NULL +); \ No newline at end of file From 8086e377646dff19ec3dfd900863c8db2a16e8ef Mon Sep 17 00:00:00 2001 From: matiwinnetou Date: Fri, 2 May 2025 16:27:49 +0200 Subject: [PATCH 08/26] chore: OpenJDK 24 LTS for api and indexer. (#368) Co-authored-by: Mateusz Czeladka --- .github/workflows/feature-mvn-build.yaml | 15 ++++++++++---- .github/workflows/sonar-cloud-report.yml | 16 +++++++++++---- api/Dockerfile | 14 ++++++++++++- api/pom.xml | 2 +- docker/Dockerfile | 26 ++++++++++++++++++++++-- pom.xml | 2 +- test-data-generator/pom.xml | 2 +- yaci-indexer/Dockerfile | 13 +++++++++++- yaci-indexer/pom.xml | 4 ++-- 9 files changed, 77 insertions(+), 17 deletions(-) diff --git a/.github/workflows/feature-mvn-build.yaml b/.github/workflows/feature-mvn-build.yaml index 0a0a3e6b7..d70870a73 100644 --- a/.github/workflows/feature-mvn-build.yaml +++ b/.github/workflows/feature-mvn-build.yaml @@ -10,11 +10,18 @@ jobs: - name: Checkout uses: actions/checkout@v3 - - name: Set up JDK 21 - uses: actions/setup-java@v3 +# - name: Set up JDK 21 +# uses: actions/setup-java@v3 +# with: +# java-version: '21' +# distribution: 'temurin' +# cache: maven + + - name: Set up Amazon Corretto + uses: actions/setup-java@v4 with: - java-version: '21' - distribution: 'temurin' + distribution: 'corretto' + java-version: 24 cache: maven - name: Build project diff --git a/.github/workflows/sonar-cloud-report.yml b/.github/workflows/sonar-cloud-report.yml index 81a4e7012..3608c694a 100644 --- a/.github/workflows/sonar-cloud-report.yml +++ b/.github/workflows/sonar-cloud-report.yml @@ -13,12 +13,20 @@ jobs: - uses: actions/checkout@v3 with: fetch-depth: 0 # Shallow clones should be disabled for a better relevancy of analysis - - name: Set up JDK 21 - uses: actions/setup-java@v3 +# - name: Set up JDK 21 +# uses: actions/setup-java@v3 +# with: +# java-version: '21' +# distribution: 'temurin' +# cache: maven + + - name: Set up Amazon Corretto + uses: actions/setup-java@v4 with: - java-version: '21' - distribution: 'temurin' + distribution: 'corretto' + java-version: 24 cache: maven + - name: Build env: SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }} diff --git a/api/Dockerfile b/api/Dockerfile index 70d33237f..6434429df 100644 --- a/api/Dockerfile +++ b/api/Dockerfile @@ -1,10 +1,21 @@ FROM ubuntu:24.04 AS build-common WORKDIR /build +# Install necessary tools but not OpenJDK from apt RUN apt update --fix-missing \ - && apt install -y --no-install-recommends openjdk-21-jdk maven curl ca-certificates \ + && apt install -y --no-install-recommends maven curl ca-certificates \ && apt clean +# Download and setup JDK 24.0.1 +RUN mkdir -p /opt/java \ + && curl -L https://download.java.net/java/GA/jdk24.0.1/24a58e0e276943138bf3e963e6291ac2/9/GPL/openjdk-24.0.1_linux-x64_bin.tar.gz -o /opt/jdk.tar.gz \ + && tar -xzf /opt/jdk.tar.gz -C /opt/java \ + && rm /opt/jdk.tar.gz + +# Set JAVA_HOME and update PATH +ENV JAVA_HOME=/opt/java/jdk-24.0.1 +ENV PATH="${JAVA_HOME}/bin:${PATH}" + COPY ./pom.xml /build/pom.xml COPY ./api /build/api COPY ./yaci-indexer /build/yaci-indexer @@ -12,6 +23,7 @@ COPY ./test-data-generator /build/test-data-generator COPY ./.git .git RUN --mount=type=cache,target=/root/.m2 mvn -U clean package -DskipTests +RUN java --version WORKDIR /app RUN cp /build/api/target/*.jar /app/api.jar diff --git a/api/pom.xml b/api/pom.xml index c968610a7..aadd92504 100644 --- a/api/pom.xml +++ b/api/pom.xml @@ -230,7 +230,7 @@ maven-compiler-plugin ${version.maven-compiler-plugin} - 21 + 24 org.projectlombok diff --git a/docker/Dockerfile b/docker/Dockerfile index d7ad03f12..2f454cc2e 100644 --- a/docker/Dockerfile +++ b/docker/Dockerfile @@ -11,6 +11,16 @@ RUN apt update --fix-missing \ g++ tmux git jq wget libncursesw5-dev libtool autoconf liblmdb-dev curl ca-certificates pkg-config \ && apt-get clean +# Download and setup JDK 24.0.1 +RUN mkdir -p /opt/java \ + && curl -L https://download.java.net/java/GA/jdk24.0.1/24a58e0e276943138bf3e963e6291ac2/9/GPL/openjdk-24.0.1_linux-x64_bin.tar.gz -o /opt/jdk.tar.gz \ + && tar -xzf /opt/jdk.tar.gz -C /opt/java \ + && rm /opt/jdk.tar.gz + +# Set JAVA_HOME and update PATH +ENV JAVA_HOME=/opt/java/jdk-24.0.1 +ENV PATH="${JAVA_HOME}/bin:${PATH}" + WORKDIR /root/src # Install ghcup @@ -149,7 +159,7 @@ FROM ubuntu:24.04 AS java-builder WORKDIR /root/app RUN apt update --fix-missing \ - && apt install -y --no-install-recommends openjdk-21-jdk maven \ + && apt install -y --no-install-recommends maven \ && apt-get clean COPY ./pom.xml /root/app/pom.xml @@ -159,7 +169,9 @@ COPY ./yaci-indexer /root/app/yaci-indexer COPY ./test-data-generator /root/app/test-data-generator COPY ./.git /root/app/.git -RUN --mount=type=cache,target=/root/.m2 mvn -U clean package -DskipTests +RUN java --version + +RUN --mount=type=cache,target=/root/.m2 mvn clean package -am -DskipTests # Main FROM ubuntu:24.04 @@ -195,6 +207,16 @@ RUN rm -rf /var/lib/postgresql/${PG_VERSION}/main RUN apt install -y --no-install-recommends jq bc sudo curl \ && apt clean +# Download and setup JDK 24.0.1 +RUN mkdir -p /opt/java \ + && curl -L https://download.java.net/java/GA/jdk24.0.1/24a58e0e276943138bf3e963e6291ac2/9/GPL/openjdk-24.0.1_linux-x64_bin.tar.gz -o /opt/jdk.tar.gz \ + && tar -xzf /opt/jdk.tar.gz -C /opt/java \ + && rm /opt/jdk.tar.gz + +# Set JAVA_HOME and update PATH +ENV JAVA_HOME=/opt/java/jdk-24.0.1 +ENV PATH="${JAVA_HOME}/bin:${PATH}" + # Copy cardano node COPY --from=cardano-builder /usr/local/lib /usr/local/lib COPY --from=cardano-builder /root/.local/bin/cardano-* /usr/local/bin/ diff --git a/pom.xml b/pom.xml index ac5b5bb4f..cea9ecf9c 100644 --- a/pom.xml +++ b/pom.xml @@ -28,7 +28,7 @@ full 1.2.8 - 21 + 24 UTF-8 3.4.4 1.6.15 diff --git a/test-data-generator/pom.xml b/test-data-generator/pom.xml index 079d12fba..80f2c0670 100644 --- a/test-data-generator/pom.xml +++ b/test-data-generator/pom.xml @@ -62,7 +62,7 @@ maven-compiler-plugin ${version.maven-compiler-plugin} - 21 + 24 org.projectlombok diff --git a/yaci-indexer/Dockerfile b/yaci-indexer/Dockerfile index 025d26a26..7af17b4a2 100644 --- a/yaci-indexer/Dockerfile +++ b/yaci-indexer/Dockerfile @@ -2,9 +2,19 @@ FROM ubuntu:24.04 AS build-common WORKDIR /build RUN apt update --fix-missing \ - && apt install -y --no-install-recommends openjdk-21-jdk maven curl \ + && apt install -y --no-install-recommends maven curl \ && apt clean +# Download and setup JDK 24.0.1 +RUN mkdir -p /opt/java \ + && curl -L https://download.java.net/java/GA/jdk24.0.1/24a58e0e276943138bf3e963e6291ac2/9/GPL/openjdk-24.0.1_linux-x64_bin.tar.gz -o /opt/jdk.tar.gz \ + && tar -xzf /opt/jdk.tar.gz -C /opt/java \ + && rm /opt/jdk.tar.gz + +# Set JAVA_HOME and update PATH +ENV JAVA_HOME=/opt/java/jdk-24.0.1 +ENV PATH="${JAVA_HOME}/bin:${PATH}" + COPY ./pom.xml /build/pom.xml COPY ./api /build/api COPY ./yaci-indexer /build/yaci-indexer @@ -12,6 +22,7 @@ COPY ./test-data-generator /build/test-data-generator COPY ./.git .git RUN --mount=type=cache,target=/root/.m2 mvn -U clean package -DskipTests +RUN java --version WORKDIR /app RUN cp /build/yaci-indexer/target/*.jar /app/yaci-indexer.jar diff --git a/yaci-indexer/pom.xml b/yaci-indexer/pom.xml index eac23775d..0129e559e 100644 --- a/yaci-indexer/pom.xml +++ b/yaci-indexer/pom.xml @@ -17,7 +17,7 @@ jar - 21 + 24 full 0.1.2 src/main/java/org/cardanofoundation/rosetta/yaciindexer/stores/txsize/model/* @@ -121,7 +121,7 @@ maven-compiler-plugin ${version.maven-compiler-plugin} - 21 + 24 org.projectlombok From bb6b3c9318080437c6eef791b0a92c97655b1130 Mon Sep 17 00:00:00 2001 From: VladislavKudrin Date: Tue, 6 May 2025 10:40:05 +0200 Subject: [PATCH 09/26] fix: postgres missing port and cnode socket path (#442) --- docker/dockerfiles/node/entrypoint.sh | 3 +++ docker/dockerfiles/postgres/Dockerfile | 2 +- docker/dockerfiles/postgres/entrypoint.sh | 18 ++++++++++-------- 3 files changed, 14 insertions(+), 9 deletions(-) diff --git a/docker/dockerfiles/node/entrypoint.sh b/docker/dockerfiles/node/entrypoint.sh index 6325cab27..60d4ffbd8 100644 --- a/docker/dockerfiles/node/entrypoint.sh +++ b/docker/dockerfiles/node/entrypoint.sh @@ -17,6 +17,9 @@ trap clean_up SIGHUP SIGINT SIGTERM echo "Starting Cardano node..." + +mkdir -p "$(dirname "$CARDANO_NODE_SOCKET_PATH")" +sleep 1 cardano-node run --socket-path "$CARDANO_NODE_SOCKET_PATH" --port $CARDANO_NODE_PORT --database-path /node/db --config /config/config.json --topology /config/topology.json > /logs/node.log & CARDANO_NODE_PID=$! sleep 2 diff --git a/docker/dockerfiles/postgres/Dockerfile b/docker/dockerfiles/postgres/Dockerfile index deffaa84b..50465529c 100644 --- a/docker/dockerfiles/postgres/Dockerfile +++ b/docker/dockerfiles/postgres/Dockerfile @@ -1,4 +1,4 @@ -FROM ubuntu:22.04 +FROM ubuntu:24.04 RUN apt update && apt install -y \ build-essential \ diff --git a/docker/dockerfiles/postgres/entrypoint.sh b/docker/dockerfiles/postgres/entrypoint.sh index 4adab7c20..bd731cba8 100644 --- a/docker/dockerfiles/postgres/entrypoint.sh +++ b/docker/dockerfiles/postgres/entrypoint.sh @@ -1,19 +1,19 @@ #!/bin/bash database_initialization() { - if [ -z "$(ls -A "$PG_DATA")" ]; then - echo "$PGPASSWORD" > /tmp/password - echo "*:*:*:postgres:$PGPASSWORD" > /home/postgres/.pgpass + echo "$PGPASSWORD" > /tmp/password + echo "*:*:*:postgres:$PGPASSWORD" > /home/postgres/.pgpass - chmod 600 /home/postgres/.pgpass - chown postgres:postgres /home/postgres/.pgpass + chmod 600 /home/postgres/.pgpass + chown postgres:postgres /home/postgres/.pgpass + if [ -z "$(ls -A "$PG_DATA")" ]; then sudo -u postgres "$PG_BIN/initdb" --pgdata="$PG_DATA" --auth=md5 --auth-local=md5 --auth-host=md5 --username=postgres --pwfile=/tmp/password - - rm -f /tmp/password else echo "Database already initialized, skipping initdb." fi + + rm -f /tmp/password } configure_postgres() { @@ -96,7 +96,7 @@ configure_postgres() { } start_postgres() { - sudo -u postgres "$PG_BIN/postgres" -D "$PG_DATA" -c config_file="$PG_DATA/postgresql.conf" & + sudo -u postgres "$PG_BIN/postgres" -D "$PG_DATA" -p "$DB_PORT" -c config_file="$PG_DATA/postgresql.conf" & PG_PID=$! until "$PG_BIN/pg_isready" -U postgres > /dev/null; do sleep 1; done @@ -124,6 +124,8 @@ create_database_and_user() { sudo -u postgres "$PG_BIN/psql" -U postgres -c "CREATE DATABASE \"$DB_NAME\";" >/dev/null sudo -u postgres "$PG_BIN/psql" -U postgres -c "GRANT ALL PRIVILEGES ON DATABASE \"$DB_NAME\" to \"$DB_USER\";" > /dev/null fi + + echo "User configured" } chown -R postgres:postgres "$PG_DATA" From 51da0257aa11c96d222e3849c36628a4728f2f9e Mon Sep 17 00:00:00 2001 From: matiwinnetou Date: Tue, 6 May 2025 11:51:13 +0200 Subject: [PATCH 10/26] chore: cardano-node 10.3.1 (#443) Co-authored-by: Mateusz Czeladka --- .env.docker-compose | 3 +- .env.docker-compose-preprod | 93 ++++++++++++++++++++++++++++++ .env.h2 | 2 +- .env.h2-testdata | 2 +- .gitignore | 1 + docker/.env.dockerfile | 2 +- docker/Dockerfile | 12 ++-- docker/dockerfiles/node/Dockerfile | 2 +- docker/readme.md | 2 +- 9 files changed, 107 insertions(+), 12 deletions(-) create mode 100644 .env.docker-compose-preprod diff --git a/.env.docker-compose b/.env.docker-compose index 9e267bd2a..b6b484f03 100644 --- a/.env.docker-compose +++ b/.env.docker-compose @@ -24,7 +24,7 @@ CARDANO_NODE_HOST=cardano-node # Service name in docker-compose or local cardano node CARDANO_NODE_PORT=3001 # Uncomment if you are using local cardano node -CARDANO_NODE_VERSION=10.2.1 +CARDANO_NODE_VERSION=10.3.1 CARDANO_NODE_SUBMIT_HOST=$CARDANO_NODE_HOST NODE_SUBMIT_API_PORT=8090 CARDANO_NODE_DIR=/node @@ -48,6 +48,7 @@ PRINT_EXCEPTION=true ROSETTA_VERSION=1.4.13 TOPOLOGY_FILEPATH=/config/topology.json + GENESIS_SHELLEY_PATH=/config/shelley-genesis.json GENESIS_BYRON_PATH=/config/byron-genesis.json GENESIS_ALONZO_PATH=/config/alonzo-genesis.json diff --git a/.env.docker-compose-preprod b/.env.docker-compose-preprod new file mode 100644 index 000000000..3731abbd2 --- /dev/null +++ b/.env.docker-compose-preprod @@ -0,0 +1,93 @@ +## Main variables +API_SPRING_PROFILES_ACTIVE=online +LOG=INFO +NETWORK=preprod +# mainnet, preprod, preview, sanchonet, devkit +PROTOCOL_MAGIC=1 +# mainnet 764824073, preprod 1, preview 2, sanchonet 4, devkit 42 + +## Postgres image +PG_VERSION_TAG=REL_14_11 + +## Postgres variables +DB_NAME=rosetta-java +DB_USER=rosetta_db_admin +DB_SECRET=weakpwd#123_d +DB_HOST=db +# Service name in docker-compose or local db +DB_PORT=5433 +DB_SCHEMA=${NETWORK} +DB_PATH=/opt/rosetta-java-preprod/sql_data + +## Cardano Node variables +CARDANO_NODE_HOST=cardano-node +# Service name in docker-compose or local cardano node +CARDANO_NODE_PORT=3002 +CARDANO_NODE_VERSION=10.3.1 +CARDANO_NODE_SUBMIT_HOST=$CARDANO_NODE_HOST +NODE_SUBMIT_API_PORT=8091 +CARDANO_NODE_DIR=/opt/rosetta-java-preprod/node +CARDANO_NODE_SOCKET_PATH=${CARDANO_NODE_DIR}/node.socket +CARDANO_NODE_DB=${CARDANO_NODE_DIR/db +CARDANO_CONFIG=./config/${NETWORK} + +## Mithril +MITHRIL_SYNC=true +SNAPSHOT_DIGEST=latest +# if not set standard values will be used +AGGREGATOR_ENDPOINT= +# if not set standard values will be used +GENESIS_VERIFICATION_KEY= + +## Api env +API_DOCKER_IMAGE_TAG=main +# staging, h2, test. Additional profiles: mempool (if mempool should be activated) +API_PORT=8082 +PRINT_EXCEPTION=true + +ROSETTA_VERSION=1.4.13 +TOPOLOGY_FILEPATH=/config/topology.json + +GENESIS_SHELLEY_PATH=/config/shelley-genesis.json +GENESIS_BYRON_PATH=/config/byron-genesis.json +GENESIS_ALONZO_PATH=/config/alonzo-genesis.json +GENESIS_CONWAY_PATH=/config/conway-genesis.json +SEARCH_PAGE_SIZE=100 + +## Yaci Indexer env +INDEXER_DOCKER_IMAGE_TAG=main +PRUNING_ENABLED=false +#The number of safe blocks to keep in the store. 2160 blocks *(20 seconds/block in average)=4320 seconds=12 hours. +PRUNING_SAFE_BLOCKS=2160 +#Run transaction pruning every 600 seconds or 10 minutes. +PRUNING_INTERVAL=600 + +YACI_SPRING_PROFILES=postgres,n2c-socket +# database profiles: h2, h2-testdata, postgres +MEMPOOL_ENABLED=false + +## Devkit env +DEVKIT_ENABLED=false +DEVKIT_URL=yaci-cli +DEVKIT_PORT=3333 + +## Logger Config +LOG_FILE_PATH=/var/log/rosetta-java +LOG_FILE_NAME=/var/log/rosetta-java/rosetta-java.log +LOG_FILE_MAX_SIZE=10MB +LOG_FILE_MAX_HISTORY=10 + +YACI_HTTP_BASE_URL=http://yaci-indexer:9095/api/v1 +YACI_INDEXER_PORT=9095 +HTTP_CONNECT_TIMEOUT_SECONDS=5 +HTTP_REQUEST_TIMEOUT_SECONDS=5 + +## DB tuning / debugging +API_DB_SHOW_SQL=false +API_DB_MONITOR_PERFORMANCE=false #only needed for debugging and diagnostics + +## Basic db pool tuning, generally should not be changed but can be changed rarely if needed +API_DB_POOL_MAX_LIFETIME_MS=2000000 +API_DB_POOL_CONNECTION_TIMEOUT_MS=100000 +API_DB_KEEP_ALIVE_MS=60000 +API_DB_LEAK_CONNECTIONS_WARNING_MS=60000 diff --git a/.env.h2 b/.env.h2 index a3e48896b..57af2e87f 100644 --- a/.env.h2 +++ b/.env.h2 @@ -19,7 +19,7 @@ CARDANO_NODE_HOST=localhost # Service name in docker-compose or local cardano node CARDANO_NODE_PORT=3001 # Uncomment if you are using local cardano node -CARDANO_NODE_VERSION=10.2.1 +CARDANO_NODE_VERSION=10.3.1 CARDANO_NODE_SUBMIT_HOST=localhost NODE_SUBMIT_API_PORT=8090 diff --git a/.env.h2-testdata b/.env.h2-testdata index 9b7cd71c9..8eebe5399 100644 --- a/.env.h2-testdata +++ b/.env.h2-testdata @@ -19,7 +19,7 @@ CARDANO_NODE_HOST=localhost # Service name in docker-compose or local cardano node CARDANO_NODE_PORT=3001 # Uncomment if you are using local cardano node -CARDANO_NODE_VERSION=10.2.1 +CARDANO_NODE_VERSION=10.3.1 CARDANO_NODE_SUBMIT_HOST=localhost NODE_SUBMIT_API_PORT=8090 diff --git a/.gitignore b/.gitignore index d0b5f0290..44368b664 100644 --- a/.gitignore +++ b/.gitignore @@ -46,6 +46,7 @@ settings.xml !.env.h2 !.env.h2-testdata !.env.docker-compose +!.env.docker-compose-preprod !.env.docker-compose-profile-entry-level !.env.docker-compose-profile-mid-level diff --git a/docker/.env.dockerfile b/docker/.env.dockerfile index c15b5c110..c76f46160 100644 --- a/docker/.env.dockerfile +++ b/docker/.env.dockerfile @@ -33,7 +33,7 @@ DB_PORT=5432 ## Cardano node variables CARDANO_NODE_HOST=localhost CARDANO_NODE_PORT=3001 -CARDANO_NODE_VERSION=10.2.1 +CARDANO_NODE_VERSION=10.3.1 CARDANO_NODE_SUBMIT_HOST=localhost NODE_SUBMIT_API_PORT=8090 CARDANO_NODE_SOCKET_PATH=/node/node.socket diff --git a/docker/Dockerfile b/docker/Dockerfile index 2f454cc2e..78d8838d5 100644 --- a/docker/Dockerfile +++ b/docker/Dockerfile @@ -64,12 +64,12 @@ RUN git clone https://github.com/input-output-hk/mithril.git \ && cp mithril-client /root/.local/bin/ # Cardano node version -ARG CARDANO_NODE_VERSION=10.2.1 +ARG CARDANO_NODE_VERSION=10.3.1 # Install sodium -RUN export IOHKNIX_VERSION=$(curl https://raw.githubusercontent.com/IntersectMBO/cardano-node/${CARDANO_NODE_VERSION}/flake.lock | jq -r '.nodes.iohkNix.locked.rev') \ +RUN export IOHKNIX_VERSION=$(curl -L https://raw.githubusercontent.com/IntersectMBO/cardano-node/${CARDANO_NODE_VERSION}/flake.lock | jq -r '.nodes.iohkNix.locked.rev') \ && echo "iohk-nix version: $IOHKNIX_VERSION" \ - && export SODIUM_VERSION=$(curl https://raw.githubusercontent.com/input-output-hk/iohk-nix/${IOHKNIX_VERSION}/flake.lock | jq -r '.nodes.sodium.original.rev') \ + && export SODIUM_VERSION=$(curl -L https://raw.githubusercontent.com/input-output-hk/iohk-nix/${IOHKNIX_VERSION}/flake.lock | jq -r '.nodes.sodium.original.rev') \ && echo "Using sodium version: $SODIUM_VERSION" \ && git clone https://github.com/intersectmbo/libsodium \ && cd libsodium \ @@ -85,9 +85,9 @@ RUN apt install -y --no-install-recommends libsodium-dev \ && apt-get clean # Install secp256k1 -RUN export IOHKNIX_VERSION=$(curl https://raw.githubusercontent.com/IntersectMBO/cardano-node/${CARDANO_NODE_VERSION}/flake.lock | jq -r '.nodes.iohkNix.locked.rev') \ +RUN export IOHKNIX_VERSION=$(curl -L https://raw.githubusercontent.com/IntersectMBO/cardano-node/${CARDANO_NODE_VERSION}/flake.lock | jq -r '.nodes.iohkNix.locked.rev') \ && echo "iohk-nix version: ${IOHKNIX_VERSION}" \ - && export SECP256K1_VERSION=$(curl https://raw.githubusercontent.com/input-output-hk/iohk-nix/${IOHKNIX_VERSION}/flake.lock | jq -r '.nodes.secp256k1.original.ref') \ + && export SECP256K1_VERSION=$(curl -L https://raw.githubusercontent.com/input-output-hk/iohk-nix/${IOHKNIX_VERSION}/flake.lock | jq -r '.nodes.secp256k1.original.ref') \ && echo "Using secp256k1 version:${SECP256K1_VERSION}" \ && git clone --depth 1 --branch ${SECP256K1_VERSION} https://github.com/bitcoin-core/secp256k1 \ && cd secp256k1 \ @@ -98,7 +98,7 @@ RUN export IOHKNIX_VERSION=$(curl https://raw.githubusercontent.com/IntersectMBO && make install # Install blst -RUN export BLST_VERSION=$(curl https://raw.githubusercontent.com/input-output-hk/iohk-nix/master/flake.lock | jq -r '.nodes.blst.original.ref') \ +RUN export BLST_VERSION=$(curl -L https://raw.githubusercontent.com/input-output-hk/iohk-nix/master/flake.lock | jq -r '.nodes.blst.original.ref') \ && git clone --depth 1 --branch ${BLST_VERSION} https://github.com/supranational/blst \ && cd blst \ && ./build.sh \ diff --git a/docker/dockerfiles/node/Dockerfile b/docker/dockerfiles/node/Dockerfile index 3407f183b..9b64911f1 100644 --- a/docker/dockerfiles/node/Dockerfile +++ b/docker/dockerfiles/node/Dockerfile @@ -29,7 +29,7 @@ RUN bash -c "ghcup install ghc ${GHC_VERSION}" RUN bash -c "ghcup set ghc ${GHC_VERSION}" # Cardano node version -ARG CARDANO_NODE_VERSION=10.2.1 +ARG CARDANO_NODE_VERSION=10.3.1 # Install sodium RUN export IOHKNIX_VERSION=$(curl https://raw.githubusercontent.com/IntersectMBO/cardano-node/${CARDANO_NODE_VERSION}/flake.lock | jq -r '.nodes.iohkNix.locked.rev') \ diff --git a/docker/readme.md b/docker/readme.md index 2d422d503..2b1aa0d7a 100644 --- a/docker/readme.md +++ b/docker/readme.md @@ -48,7 +48,7 @@ CABAL_VERSION=3.8.1.0 GHC_VERSION=8.10.7 `` `` -CARDANO_NODE_VERSION=10.2.1 +CARDANO_NODE_VERSION=10.3.1 `` `` PG_VERSION=14 From 9f6d00fec4f935ee055300b22799dfab0dbec68e Mon Sep 17 00:00:00 2001 From: Mateusz Czeladka Date: Wed, 7 May 2025 11:58:39 +0200 Subject: [PATCH 11/26] fix: preprod config typo fix. --- .env.docker-compose-preprod | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.env.docker-compose-preprod b/.env.docker-compose-preprod index 3731abbd2..be90479fc 100644 --- a/.env.docker-compose-preprod +++ b/.env.docker-compose-preprod @@ -28,7 +28,7 @@ CARDANO_NODE_SUBMIT_HOST=$CARDANO_NODE_HOST NODE_SUBMIT_API_PORT=8091 CARDANO_NODE_DIR=/opt/rosetta-java-preprod/node CARDANO_NODE_SOCKET_PATH=${CARDANO_NODE_DIR}/node.socket -CARDANO_NODE_DB=${CARDANO_NODE_DIR/db +CARDANO_NODE_DB=${CARDANO_NODE_DIR}/db CARDANO_CONFIG=./config/${NETWORK} ## Mithril From fc2bca11dc068073e1309526acd7f1b58bed0f60 Mon Sep 17 00:00:00 2001 From: Mateusz Czeladka Date: Wed, 7 May 2025 12:04:55 +0200 Subject: [PATCH 12/26] fix: revert back to 10.2.1 --- .env.docker-compose | 2 +- .env.docker-compose-preprod | 2 +- .env.h2 | 2 +- .env.h2-testdata | 2 +- docker/.env.dockerfile | 2 +- docker/Dockerfile | 2 +- docker/dockerfiles/node/Dockerfile | 2 +- docker/readme.md | 2 +- 8 files changed, 8 insertions(+), 8 deletions(-) diff --git a/.env.docker-compose b/.env.docker-compose index b6b484f03..43f0032c6 100644 --- a/.env.docker-compose +++ b/.env.docker-compose @@ -24,7 +24,7 @@ CARDANO_NODE_HOST=cardano-node # Service name in docker-compose or local cardano node CARDANO_NODE_PORT=3001 # Uncomment if you are using local cardano node -CARDANO_NODE_VERSION=10.3.1 +CARDANO_NODE_VERSION=10.2.1 CARDANO_NODE_SUBMIT_HOST=$CARDANO_NODE_HOST NODE_SUBMIT_API_PORT=8090 CARDANO_NODE_DIR=/node diff --git a/.env.docker-compose-preprod b/.env.docker-compose-preprod index be90479fc..d89cd5242 100644 --- a/.env.docker-compose-preprod +++ b/.env.docker-compose-preprod @@ -23,7 +23,7 @@ DB_PATH=/opt/rosetta-java-preprod/sql_data CARDANO_NODE_HOST=cardano-node # Service name in docker-compose or local cardano node CARDANO_NODE_PORT=3002 -CARDANO_NODE_VERSION=10.3.1 +CARDANO_NODE_VERSION=10.2.1 CARDANO_NODE_SUBMIT_HOST=$CARDANO_NODE_HOST NODE_SUBMIT_API_PORT=8091 CARDANO_NODE_DIR=/opt/rosetta-java-preprod/node diff --git a/.env.h2 b/.env.h2 index 57af2e87f..a3e48896b 100644 --- a/.env.h2 +++ b/.env.h2 @@ -19,7 +19,7 @@ CARDANO_NODE_HOST=localhost # Service name in docker-compose or local cardano node CARDANO_NODE_PORT=3001 # Uncomment if you are using local cardano node -CARDANO_NODE_VERSION=10.3.1 +CARDANO_NODE_VERSION=10.2.1 CARDANO_NODE_SUBMIT_HOST=localhost NODE_SUBMIT_API_PORT=8090 diff --git a/.env.h2-testdata b/.env.h2-testdata index 8eebe5399..9b7cd71c9 100644 --- a/.env.h2-testdata +++ b/.env.h2-testdata @@ -19,7 +19,7 @@ CARDANO_NODE_HOST=localhost # Service name in docker-compose or local cardano node CARDANO_NODE_PORT=3001 # Uncomment if you are using local cardano node -CARDANO_NODE_VERSION=10.3.1 +CARDANO_NODE_VERSION=10.2.1 CARDANO_NODE_SUBMIT_HOST=localhost NODE_SUBMIT_API_PORT=8090 diff --git a/docker/.env.dockerfile b/docker/.env.dockerfile index c76f46160..c15b5c110 100644 --- a/docker/.env.dockerfile +++ b/docker/.env.dockerfile @@ -33,7 +33,7 @@ DB_PORT=5432 ## Cardano node variables CARDANO_NODE_HOST=localhost CARDANO_NODE_PORT=3001 -CARDANO_NODE_VERSION=10.3.1 +CARDANO_NODE_VERSION=10.2.1 CARDANO_NODE_SUBMIT_HOST=localhost NODE_SUBMIT_API_PORT=8090 CARDANO_NODE_SOCKET_PATH=/node/node.socket diff --git a/docker/Dockerfile b/docker/Dockerfile index 78d8838d5..27171dd69 100644 --- a/docker/Dockerfile +++ b/docker/Dockerfile @@ -64,7 +64,7 @@ RUN git clone https://github.com/input-output-hk/mithril.git \ && cp mithril-client /root/.local/bin/ # Cardano node version -ARG CARDANO_NODE_VERSION=10.3.1 +ARG CARDANO_NODE_VERSION=10.2.1 # Install sodium RUN export IOHKNIX_VERSION=$(curl -L https://raw.githubusercontent.com/IntersectMBO/cardano-node/${CARDANO_NODE_VERSION}/flake.lock | jq -r '.nodes.iohkNix.locked.rev') \ diff --git a/docker/dockerfiles/node/Dockerfile b/docker/dockerfiles/node/Dockerfile index 9b64911f1..3407f183b 100644 --- a/docker/dockerfiles/node/Dockerfile +++ b/docker/dockerfiles/node/Dockerfile @@ -29,7 +29,7 @@ RUN bash -c "ghcup install ghc ${GHC_VERSION}" RUN bash -c "ghcup set ghc ${GHC_VERSION}" # Cardano node version -ARG CARDANO_NODE_VERSION=10.3.1 +ARG CARDANO_NODE_VERSION=10.2.1 # Install sodium RUN export IOHKNIX_VERSION=$(curl https://raw.githubusercontent.com/IntersectMBO/cardano-node/${CARDANO_NODE_VERSION}/flake.lock | jq -r '.nodes.iohkNix.locked.rev') \ diff --git a/docker/readme.md b/docker/readme.md index 2b1aa0d7a..2d422d503 100644 --- a/docker/readme.md +++ b/docker/readme.md @@ -48,7 +48,7 @@ CABAL_VERSION=3.8.1.0 GHC_VERSION=8.10.7 `` `` -CARDANO_NODE_VERSION=10.3.1 +CARDANO_NODE_VERSION=10.2.1 `` `` PG_VERSION=14 From a52f43e255250e9d806bd049dfb738594362c027 Mon Sep 17 00:00:00 2001 From: Mateusz Czeladka Date: Wed, 7 May 2025 18:37:07 +0200 Subject: [PATCH 13/26] chore: adjusted port for db on pre-prod config. --- .env.docker-compose-preprod | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.env.docker-compose-preprod b/.env.docker-compose-preprod index d89cd5242..45994eedd 100644 --- a/.env.docker-compose-preprod +++ b/.env.docker-compose-preprod @@ -15,7 +15,7 @@ DB_USER=rosetta_db_admin DB_SECRET=weakpwd#123_d DB_HOST=db # Service name in docker-compose or local db -DB_PORT=5433 +DB_PORT=5432 DB_SCHEMA=${NETWORK} DB_PATH=/opt/rosetta-java-preprod/sql_data From 9be126d03a5a37ed6a5ec0cdf6b54eacc40f8ab7 Mon Sep 17 00:00:00 2001 From: matiwinnetou Date: Thu, 8 May 2025 10:09:04 +0200 Subject: [PATCH 14/26] fix: do not redirect logs to a file but to sysout. (#454) Co-authored-by: Mateusz Czeladka --- docker/dockerfiles/node/entrypoint.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docker/dockerfiles/node/entrypoint.sh b/docker/dockerfiles/node/entrypoint.sh index 60d4ffbd8..8799f67db 100644 --- a/docker/dockerfiles/node/entrypoint.sh +++ b/docker/dockerfiles/node/entrypoint.sh @@ -20,12 +20,12 @@ echo "Starting Cardano node..." mkdir -p "$(dirname "$CARDANO_NODE_SOCKET_PATH")" sleep 1 -cardano-node run --socket-path "$CARDANO_NODE_SOCKET_PATH" --port $CARDANO_NODE_PORT --database-path /node/db --config /config/config.json --topology /config/topology.json > /logs/node.log & +cardano-node run --socket-path "$CARDANO_NODE_SOCKET_PATH" --port $CARDANO_NODE_PORT --database-path /node/db --config /config/config.json --topology /config/topology.json & CARDANO_NODE_PID=$! sleep 2 echo "Starting Cardano submit api..." -cardano-submit-api --listen-address 0.0.0.0 --socket-path "$CARDANO_NODE_SOCKET_PATH" --port $NODE_SUBMIT_API_PORT $NETWORK_STR --config /cardano-submit-api-config/cardano-submit-api.yaml > /logs/submit-api.log & +cardano-submit-api --listen-address 0.0.0.0 --socket-path "$CARDANO_NODE_SOCKET_PATH" --port $NODE_SUBMIT_API_PORT $NETWORK_STR --config /cardano-submit-api-config/cardano-submit-api.yaml & CARDANO_SUBMIT_PID=$! wait -n $CARDANO_NODE_PID $CARDANO_SUBMIT_PID From 8fbbb7263c10efb82be73f5efb698f65fbdf183e Mon Sep 17 00:00:00 2001 From: Mateusz Czeladka Date: Fri, 9 May 2025 11:16:43 +0200 Subject: [PATCH 15/26] chore: path adjusted. --- .env.docker-compose-preprod | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.env.docker-compose-preprod b/.env.docker-compose-preprod index 45994eedd..1af1d68c9 100644 --- a/.env.docker-compose-preprod +++ b/.env.docker-compose-preprod @@ -26,7 +26,7 @@ CARDANO_NODE_PORT=3002 CARDANO_NODE_VERSION=10.2.1 CARDANO_NODE_SUBMIT_HOST=$CARDANO_NODE_HOST NODE_SUBMIT_API_PORT=8091 -CARDANO_NODE_DIR=/opt/rosetta-java-preprod/node +CARDANO_NODE_DIR=/opt/rosetta-java-preprod/node_data CARDANO_NODE_SOCKET_PATH=${CARDANO_NODE_DIR}/node.socket CARDANO_NODE_DB=${CARDANO_NODE_DIR}/db CARDANO_CONFIG=./config/${NETWORK} From 8115d5937e4e5902f194ed4cd3722a877f113742 Mon Sep 17 00:00:00 2001 From: matiwinnetou Date: Fri, 9 May 2025 18:58:02 +0200 Subject: [PATCH 16/26] chore: cardano-node: 10.3.1, cabal: 3.12.1.0, ghc: 9.6.7 (#452) Co-authored-by: Mateusz Czeladka --- .env.IntegrationTest | 2 + .env.docker-compose | 9 +- .env.docker-compose-preprod | 13 +- .env.h2 | 6 +- .env.h2-testdata | 6 +- README.md | 1 - .../network/service/NetworkServiceImpl.java | 43 +- .../common/enumeration/NetworkEnum.java | 3 +- .../rosetta/common/util/Constants.java | 1 - .../config/CardanoConvertersConfig.java | 5 - .../CardanoConstructionServiceImplTest.java | 13 - config/mainnet/checkpoints.json | 11072 ++++++++++++++++ config/mainnet/config.json | 10 +- config/mainnet/topology.json | 4 +- config/preprod/config.json | 8 +- config/preprod/topology.json | 4 +- config/sanchonet/alonzo-genesis.json | 188 - config/sanchonet/byron-genesis.json | 62 - config/sanchonet/config.json | 114 - config/sanchonet/conway-genesis.json | 297 - config/sanchonet/shelley-genesis.json | 56 - config/sanchonet/topology.json | 23 - docker-compose-node.yaml | 23 +- docker/.env.dockerfile | 6 +- docker/Dockerfile | 73 +- docker/dockerfiles/mithril/Dockerfile | 2 +- docker/dockerfiles/mithril/entrypoint.sh | 10 +- docker/dockerfiles/node/Dockerfile | 67 +- docker/dockerfiles/node/entrypoint.sh | 3 +- docker/entrypoint.sh | 7 +- docker/readme.md | 6 +- docs/docs/core-concepts/architecture.md | 6 +- docs/docs/install-and-deploy/docker.md | 8 +- .../src/main/resources/application.properties | 4 +- 34 files changed, 11244 insertions(+), 911 deletions(-) create mode 100644 config/mainnet/checkpoints.json delete mode 100644 config/sanchonet/alonzo-genesis.json delete mode 100644 config/sanchonet/byron-genesis.json delete mode 100644 config/sanchonet/config.json delete mode 100644 config/sanchonet/conway-genesis.json delete mode 100644 config/sanchonet/shelley-genesis.json delete mode 100644 config/sanchonet/topology.json diff --git a/.env.IntegrationTest b/.env.IntegrationTest index de234a137..e8115d9ed 100644 --- a/.env.IntegrationTest +++ b/.env.IntegrationTest @@ -40,6 +40,8 @@ SNAPSHOT_DIGEST=latest AGGREGATOR_ENDPOINT= # if not set standard values will be used GENESIS_VERIFICATION_KEY= +ANCILLARY_VERIFICATION_KEY= + ## Api env API_DOCKER_IMAGE_TAG=main diff --git a/.env.docker-compose b/.env.docker-compose index 43f0032c6..ee013d7af 100644 --- a/.env.docker-compose +++ b/.env.docker-compose @@ -2,9 +2,9 @@ API_SPRING_PROFILES_ACTIVE=online LOG=INFO NETWORK=mainnet -# mainnet, preprod, preview, sanchonet, devkit +# mainnet, preprod, preview, devkit PROTOCOL_MAGIC=764824073 -# mainnet 764824073, preprod 1, preview 2, sanchonet 4, devkit 42 +# mainnet 764824073, preprod 1, preview 2, devkit 42 ## Postgres image PG_VERSION_TAG=REL_14_11 @@ -18,13 +18,12 @@ DB_HOST=db DB_PORT=5432 DB_SCHEMA=${NETWORK} DB_PATH=data - ## Cardano Node variables CARDANO_NODE_HOST=cardano-node # Service name in docker-compose or local cardano node CARDANO_NODE_PORT=3001 # Uncomment if you are using local cardano node -CARDANO_NODE_VERSION=10.2.1 +CARDANO_NODE_VERSION=10.3.1 CARDANO_NODE_SUBMIT_HOST=$CARDANO_NODE_HOST NODE_SUBMIT_API_PORT=8090 CARDANO_NODE_DIR=/node @@ -34,11 +33,13 @@ CARDANO_CONFIG=./config/${NETWORK} ## Mithril MITHRIL_SYNC=true +MITHRIL_VERSION=2517.1 SNAPSHOT_DIGEST=latest # if not set standard values will be used AGGREGATOR_ENDPOINT= # if not set standard values will be used GENESIS_VERIFICATION_KEY= +ANCILLARY_VERIFICATION_KEY= ## Api env API_DOCKER_IMAGE_TAG=main diff --git a/.env.docker-compose-preprod b/.env.docker-compose-preprod index 1af1d68c9..0dcbe3266 100644 --- a/.env.docker-compose-preprod +++ b/.env.docker-compose-preprod @@ -2,9 +2,9 @@ API_SPRING_PROFILES_ACTIVE=online LOG=INFO NETWORK=preprod -# mainnet, preprod, preview, sanchonet, devkit +# mainnet, preprod, preview, devkit PROTOCOL_MAGIC=1 -# mainnet 764824073, preprod 1, preview 2, sanchonet 4, devkit 42 +# mainnet 764824073, preprod 1, preview 2, devkit 42 ## Postgres image PG_VERSION_TAG=REL_14_11 @@ -22,10 +22,11 @@ DB_PATH=/opt/rosetta-java-preprod/sql_data ## Cardano Node variables CARDANO_NODE_HOST=cardano-node # Service name in docker-compose or local cardano node -CARDANO_NODE_PORT=3002 -CARDANO_NODE_VERSION=10.2.1 +CARDANO_NODE_PORT=3001 +# Uncomment if you are using local cardano node +CARDANO_NODE_VERSION=10.3.1 CARDANO_NODE_SUBMIT_HOST=$CARDANO_NODE_HOST -NODE_SUBMIT_API_PORT=8091 +NODE_SUBMIT_API_PORT=8090 CARDANO_NODE_DIR=/opt/rosetta-java-preprod/node_data CARDANO_NODE_SOCKET_PATH=${CARDANO_NODE_DIR}/node.socket CARDANO_NODE_DB=${CARDANO_NODE_DIR}/db @@ -33,11 +34,13 @@ CARDANO_CONFIG=./config/${NETWORK} ## Mithril MITHRIL_SYNC=true +MITHRIL_VERSION=2517.1 SNAPSHOT_DIGEST=latest # if not set standard values will be used AGGREGATOR_ENDPOINT= # if not set standard values will be used GENESIS_VERIFICATION_KEY= +ANCILLARY_VERIFICATION_KEY= ## Api env API_DOCKER_IMAGE_TAG=main diff --git a/.env.h2 b/.env.h2 index a3e48896b..06423b840 100644 --- a/.env.h2 +++ b/.env.h2 @@ -1,9 +1,9 @@ ## Main variables LOG=INFO NETWORK=devkit -# mainnet, preprod, preview, sanchonet, devkit +# mainnet, preprod, preview, devkit PROTOCOL_MAGIC=42 -# mainnet 764824073, preprod 1, preview 2, sanchonet 4, devkit 42 +# mainnet 764824073, preprod 1, preview 2, devkit 42 ## H2 image DB_IMAGE_NAME=h2 @@ -19,7 +19,7 @@ CARDANO_NODE_HOST=localhost # Service name in docker-compose or local cardano node CARDANO_NODE_PORT=3001 # Uncomment if you are using local cardano node -CARDANO_NODE_VERSION=10.2.1 +CARDANO_NODE_VERSION=10.3.1 CARDANO_NODE_SUBMIT_HOST=localhost NODE_SUBMIT_API_PORT=8090 diff --git a/.env.h2-testdata b/.env.h2-testdata index 9b7cd71c9..737b7924a 100644 --- a/.env.h2-testdata +++ b/.env.h2-testdata @@ -1,9 +1,9 @@ ## Main variables LOG=INFO NETWORK=devkit -# mainnet, preprod, preview, sanchonet, devkit +# mainnet, preprod, preview, devkit PROTOCOL_MAGIC=42 -# mainnet 764824073, preprod 1, preview 2, sanchonet 4, devkit 42 +# mainnet 764824073, preprod 1, preview 2, devkit 42 ## H2 image DB_IMAGE_NAME=h2 @@ -19,7 +19,7 @@ CARDANO_NODE_HOST=localhost # Service name in docker-compose or local cardano node CARDANO_NODE_PORT=3001 # Uncomment if you are using local cardano node -CARDANO_NODE_VERSION=10.2.1 +CARDANO_NODE_VERSION=10.3.1 CARDANO_NODE_SUBMIT_HOST=localhost NODE_SUBMIT_API_PORT=8090 diff --git a/README.md b/README.md index a545036e7..4d7b1dae7 100644 --- a/README.md +++ b/README.md @@ -2,7 +2,6 @@ [![License](https://img.shields.io:/github/license/cardano-foundation/cardano-rosetta-java?label=license)](https://github.com/cardano-foundation/cardano-rosetta-java/blob/master/LICENSE) ![Discord](https://img.shields.io/discord/1022471509173882950) [![Coverage](https://sonarcloud.io/api/project_badges/measure?project=cardano-foundation_cardano-rosetta-java&metric=coverage)](https://sonarcloud.io/summary/overall?id=cardano-foundation_cardano-rosetta-java) -[![FOSSA Status](https://app.fossa.com/api/projects/custom%2B45571%2Fgithub.com%2Fcardano-foundation%2Fcardano-rosetta-java.svg?type=shield&issueType=license)](https://app.fossa.com/projects/custom%2B45571%2Fgithub.com%2Fcardano-foundation%2Fcardano-rosetta-java?ref=badge_shield&issueType=license) ## What the project is about? diff --git a/api/src/main/java/org/cardanofoundation/rosetta/api/network/service/NetworkServiceImpl.java b/api/src/main/java/org/cardanofoundation/rosetta/api/network/service/NetworkServiceImpl.java index 3cb726f8c..79257489c 100644 --- a/api/src/main/java/org/cardanofoundation/rosetta/api/network/service/NetworkServiceImpl.java +++ b/api/src/main/java/org/cardanofoundation/rosetta/api/network/service/NetworkServiceImpl.java @@ -29,6 +29,8 @@ import org.cardanofoundation.rosetta.common.util.Constants; import org.cardanofoundation.rosetta.common.util.RosettaConstants; +import static org.cardanofoundation.rosetta.common.util.Constants.*; + @Service @Slf4j @RequiredArgsConstructor @@ -124,11 +126,11 @@ public Network getSupportedNetwork() { int networkMagic = genesisDataProvider.getProtocolMagic(); return switch (networkMagic) { - case Constants.MAINNET_NETWORK_MAGIC -> Networks.mainnet(); - case Constants.PREPROD_NETWORK_MAGIC -> Networks.preprod(); - case Constants.PREVIEW_NETWORK_MAGIC -> Networks.preview(); + case MAINNET_NETWORK_MAGIC -> Networks.mainnet(); + case PREPROD_NETWORK_MAGIC -> Networks.preprod(); + case PREVIEW_NETWORK_MAGIC -> Networks.preview(); case Constants.SANCHONET_NETWORK_MAGIC -> new Network(0b0000, Constants.SANCHONET_NETWORK_MAGIC); - case Constants.DEVKIT_NETWORK_MAGIC -> new Network(0b0000, Constants.DEVKIT_NETWORK_MAGIC); + case DEVKIT_NETWORK_MAGIC -> new Network(0b0000, DEVKIT_NETWORK_MAGIC); default -> throw ExceptionFactory.invalidNetworkError(); }; @@ -186,30 +188,17 @@ private boolean verifyBlockchain(String blockchain) { return blockchain.equals(Constants.CARDANO_BLOCKCHAIN); } - private boolean verifyNetwork(String network) { - Network supportedNetwork = getSupportedNetwork(); + private boolean verifyNetwork(String inputNetwork) { + Network currentNetwork = getSupportedNetwork(); - switch ((int) supportedNetwork.getProtocolMagic()) { - case Constants.MAINNET_NETWORK_MAGIC -> { - return network.equalsIgnoreCase(Constants.MAINNET); - } - case Constants.PREPROD_NETWORK_MAGIC -> { - return network.equals(Constants.PREPROD); - } - case Constants.PREVIEW_NETWORK_MAGIC -> { - return network.equals(Constants.PREVIEW); - } - case Constants.DEVKIT_NETWORK_MAGIC -> { - return network.equals(Constants.DEVKIT); - } - case Constants.SANCHONET_NETWORK_MAGIC -> { - return network.equals(Constants.SANCHONET); - } - default -> { - return false; - } - } - } + return switch ((int) currentNetwork.getProtocolMagic()) { + case MAINNET_NETWORK_MAGIC -> inputNetwork.equalsIgnoreCase(MAINNET); + case PREPROD_NETWORK_MAGIC -> inputNetwork.equals(PREPROD); + case PREVIEW_NETWORK_MAGIC -> inputNetwork.equals(PREVIEW); + case DEVKIT_NETWORK_MAGIC -> inputNetwork.equals(DEVKIT); + default -> false; + }; + } } diff --git a/api/src/main/java/org/cardanofoundation/rosetta/common/enumeration/NetworkEnum.java b/api/src/main/java/org/cardanofoundation/rosetta/common/enumeration/NetworkEnum.java index 412dcd0ef..d7a1edc10 100644 --- a/api/src/main/java/org/cardanofoundation/rosetta/common/enumeration/NetworkEnum.java +++ b/api/src/main/java/org/cardanofoundation/rosetta/common/enumeration/NetworkEnum.java @@ -16,8 +16,7 @@ public enum NetworkEnum { MAINNET(Constants.MAINNET, Networks.mainnet()), PREPROD(Constants.PREPROD, Networks.preprod()), DEVNET(Constants.DEVKIT, new Network(0b0000, 42)), - PREVIEW(Constants.PREVIEW, Networks.preview()), - SANCHONET(Constants.SANCHONET, new Network(0b0000, 4)); + PREVIEW(Constants.PREVIEW, Networks.preview()); private final String name; private final Network network; diff --git a/api/src/main/java/org/cardanofoundation/rosetta/common/util/Constants.java b/api/src/main/java/org/cardanofoundation/rosetta/common/util/Constants.java index e6a509540..f436f9f37 100644 --- a/api/src/main/java/org/cardanofoundation/rosetta/common/util/Constants.java +++ b/api/src/main/java/org/cardanofoundation/rosetta/common/util/Constants.java @@ -208,7 +208,6 @@ private Constants() { public static final String LOVELACE = "lovelace"; public static final String DEVKIT = "devkit"; - public static final String SANCHONET = "sanchonet"; public static final String ROSETTA_API_PATH = "classpath:/rosetta-specifications-1.4.15/api.yaml"; } diff --git a/api/src/main/java/org/cardanofoundation/rosetta/config/CardanoConvertersConfig.java b/api/src/main/java/org/cardanofoundation/rosetta/config/CardanoConvertersConfig.java index a30401979..6a908a966 100644 --- a/api/src/main/java/org/cardanofoundation/rosetta/config/CardanoConvertersConfig.java +++ b/api/src/main/java/org/cardanofoundation/rosetta/config/CardanoConvertersConfig.java @@ -50,11 +50,6 @@ public CardanoConverters cardanoConverters() { return ClasspathConversionsFactory.createConverters(PREVIEW); } - if (protocolMagic == Constants.SANCHONET_NETWORK_MAGIC) { - log.info("Creating CardanoConverters for sanchonet"); - return ClasspathConversionsFactory.createConverters(SANCHONET); - } - if (protocolMagic == Constants.DEVKIT_NETWORK_MAGIC) { log.info("Creating CardanoConverters for devkit, no converters available"); // Cardano Converters for DevKit is not supported but we still need to return something sensible diff --git a/api/src/test/java/org/cardanofoundation/rosetta/api/construction/service/CardanoConstructionServiceImplTest.java b/api/src/test/java/org/cardanofoundation/rosetta/api/construction/service/CardanoConstructionServiceImplTest.java index e0ce4372c..723eb1f47 100644 --- a/api/src/test/java/org/cardanofoundation/rosetta/api/construction/service/CardanoConstructionServiceImplTest.java +++ b/api/src/test/java/org/cardanofoundation/rosetta/api/construction/service/CardanoConstructionServiceImplTest.java @@ -181,19 +181,6 @@ void parseTransactionSignedThrowTest() { assertFalse(actualException.getError().isRetriable()); } - @SuppressWarnings("java:S5778") - @Test - void parseTransactionSignedThrowSanchonetTest() { - ApiException actualException = assertThrows(ApiException.class, () -> - cardanoService.parseTransaction(NetworkEnum.SANCHONET.getNetwork(), TRANSACTION_NOT_SIGNED, true)); - - assertEquals(RosettaErrorType.CANT_CREATE_SIGNED_TRANSACTION_ERROR.getMessage(), - actualException.getError().getMessage()); - assertEquals(RosettaErrorType.CANT_CREATE_SIGNED_TRANSACTION_ERROR.getCode(), - actualException.getError().getCode()); - assertFalse(actualException.getError().isRetriable()); - } - @Test void parseTransactionNotSignedTest() { TransactionParsed actual = cardanoService.parseTransaction(NetworkEnum.PREVIEW.getNetwork(), TRANSACTION_NOT_SIGNED, false); diff --git a/config/mainnet/checkpoints.json b/config/mainnet/checkpoints.json new file mode 100644 index 000000000..a7582dc31 --- /dev/null +++ b/config/mainnet/checkpoints.json @@ -0,0 +1,11072 @@ +{ + "checkpoints": [ + { + "blockNo": 2000, + "hash": "a82e2b2253a39897f57912cf8fdd70786eb8a2460c2955bb3521642539b87ead" + }, + { + "blockNo": 4000, + "hash": "68f5bcce46a2ef622952377854986a44aa79eded70220aaaf61ac84bf90da338" + }, + { + "blockNo": 6000, + "hash": "d12e92363bab7538983a4feae087f7748ec7bade76efd17c13d8b672e857e7f1" + }, + { + "blockNo": 8000, + "hash": "013a69353a91244d596510eaed751fe68af1b0b8e10c03f378b32ee2aec98486" + }, + { + "blockNo": 10000, + "hash": "e6a510ff8ae57fdc1c9d66692fbf32502e00e3f88ad94471f0c851b5ec5eb847" + }, + { + "blockNo": 12000, + "hash": "04d2f9e587a100cc74d9b73a3a56d785b50bdc258ff80124855235bfd3b61925" + }, + { + "blockNo": 14000, + "hash": "291a1b59fc6ddd8e8ce60ec450e444fb6b68728f9eabe70ad118d37a3550d085" + }, + { + "blockNo": 16000, + "hash": "b7149147575a37f4723fca35370aa856c76f19141bca268ce410694a35795558" + }, + { + "blockNo": 18000, + "hash": "e711abf703ebb7aa7c1ad235dafacdb6880fbc4a5ff27f368046ee6a2975724d" + }, + { + "blockNo": 20000, + "hash": "683be7324c47df71e2a234639a26d7747f1501addbba778636e66f3a18a46db7" + }, + { + "blockNo": 22000, + "hash": "aad3ea4b6f582418364b4396e52d13742a20251c0c24bd00b87a166c89721da5" + }, + { + "blockNo": 24000, + "hash": "1a8ef01c1a92288b269638552c051a64d0a9b741abd37d78d7762070f9333810" + }, + { + "blockNo": 26000, + "hash": "e1c8c5e1447fb8ef1713ce17618b17c2f62f745c84fdd02816b72c3e94f616a9" + }, + { + "blockNo": 28000, + "hash": "cfb8f792f85317b9707b162d0619c863e76c3631b757b6cd1305e793080785ae" + }, + { + "blockNo": 30000, + "hash": "ff9390758d99567a2a7b0ab271e9b096d89428865fb8452099592aa3341aa9b5" + }, + { + "blockNo": 32000, + "hash": "1c8cc272cd7f45dfd64e7f244738c0a40baf6b61798768292931bcdb40b6462c" + }, + { + "blockNo": 34000, + "hash": "8c62160f9bbf607ca57504c44153e0c4d3778583509f634746bf9a081f960c24" + }, + { + "blockNo": 36000, + "hash": "ec24119e76242271e5062bec540b2505f0236d5495d0c7af4fcf0d2d09ec4bdb" + }, + { + "blockNo": 38000, + "hash": "f247cf4f07eb43bf226acabc90d529f6e7570458931d33b84d34dd2515c1a503" + }, + { + "blockNo": 40000, + "hash": "4a3f9e61f2886e29a6b3170515b8ddd754af4b442b2475d571f80f95ec787eef" + }, + { + "blockNo": 42000, + "hash": "3c243291a31ef860c4598770121cdfea1c5081f604441dcf7064271ac6a567a9" + }, + { + "blockNo": 44000, + "hash": "f3f9bfae38dc198f67d955f69911a77c43b0b42c90476920c035dde1fd010982" + }, + { + "blockNo": 46000, + "hash": "ef74eeb076ef2fd16d6139a3b8dee55e582d0ae32c1b2e5b3786ae110e52916f" + }, + { + "blockNo": 48000, + "hash": "6ce05f8e089885edd0764ef36caf655b2f5a179d6b829fc6ce6734490e7301c0" + }, + { + "blockNo": 50000, + "hash": "1dffe5e7de9d44fcc72bff7230cad538ba83e137cc48eab14c2d70c8795f417a" + }, + { + "blockNo": 52000, + "hash": "8bc0b4c1a250df26fd37a4fa5e909072729e99c8fecfd9ea99751449a921e702" + }, + { + "blockNo": 54000, + "hash": "348791be4264a8c5884eb2bb0603d6444dd72d6db432ab0b0b4d4894314c7534" + }, + { + "blockNo": 56000, + "hash": "7416665bcdbc1f4156d697faf0cab5ba6ae45bdd503a81a709eddacdc32a1a8c" + }, + { + "blockNo": 58000, + "hash": "87ccd98bf337f9e78bad163fbe639d02f8a266f1a113af945ddeb7513a34b90d" + }, + { + "blockNo": 60000, + "hash": "8118063bd795c5b5d5f496adc131979ac72f0cd77260ab99871d11eefcb18f5d" + }, + { + "blockNo": 62000, + "hash": "adf9378c7028a2677a1efb6fd0060259913d1f63df5d7c56cb295602657b0df7" + }, + { + "blockNo": 64000, + "hash": "5241a57b71061c7305fc08a4c4b99a6a347c62a9098c1605dfd8a383100b2e5e" + }, + { + "blockNo": 66000, + "hash": "59e0a352c367f3e4f136f28b486fca30882d46b3f80906bd53274dfc7aa8d4b4" + }, + { + "blockNo": 68000, + "hash": "9e89bb9933777ff60759e36ff475d726c8ee88a131625d61313a87ea8c0df55c" + }, + { + "blockNo": 70000, + "hash": "ea5b4b53206e1be2dc7b02c6fb5de139867defc149bf90f8b703a638999c0972" + }, + { + "blockNo": 72000, + "hash": "43313d1b0c4f6d1f50fb7a9d5120d90f70033a632a9d958f2680ee69412e898b" + }, + { + "blockNo": 74000, + "hash": "de10671e00ac4e33f86b767736355012ad38fae4de03b600f11853ab03b6bc7d" + }, + { + "blockNo": 76000, + "hash": "6b7d096edeae46ba559d628b464341e5b1fe9c618492685544494af4584c121b" + }, + { + "blockNo": 78000, + "hash": "5ef448081b33d4a558e38ce37ab555411995140cf734a3560eb1b115b4fa87e0" + }, + { + "blockNo": 80000, + "hash": "21c425d06c114bd97f92f0f079259122290e4e5b1bdb4100e1f70622cae97ca7" + }, + { + "blockNo": 82000, + "hash": "56ab41d5efbd8a18668a183be2a2b91c3e6a8f956e4e81c5eb9609407fcc0146" + }, + { + "blockNo": 84000, + "hash": "6a92aee319faeef0ed5a47b7211296c03c4049c0cafbc10d33ae9c70cb214f44" + }, + { + "blockNo": 86000, + "hash": "8a7e399bf0c584b456363298c11a95d776b12c1967332e90bea322d6db1b0909" + }, + { + "blockNo": 88000, + "hash": "63cc6504a38154eebf1b57419d7dfe9592487733ef126081f5e5f0e39f8f9e3b" + }, + { + "blockNo": 90000, + "hash": "8d089976cabb536c6e7e24edbd25a5ed372ba6878bee88bdbc05abb4d5ac3fdb" + }, + { + "blockNo": 92000, + "hash": "c2320f81bf486d425e461c8efd36925dbd03efa01db96a1915f68f258832f887" + }, + { + "blockNo": 94000, + "hash": "d1cde7955d8cc38bddfdb4942597454cafb0e51d47b3a5bbdc8b42f23cbe4033" + }, + { + "blockNo": 96000, + "hash": "058fe47d218c1d8f533575405d5f1b2dfcc3cc7afa58bdf61c9a1b4bd6ab4303" + }, + { + "blockNo": 98000, + "hash": "fdc327c8a04e024a30a5a41fabc86df933c1a4a9422d130949654b0f0ead1505" + }, + { + "blockNo": 100000, + "hash": "c3d6c2dd9e7e799979f1afad4eaec6fdfd8f21a4a338da77827bdbf8aa2d45cf" + }, + { + "blockNo": 102000, + "hash": "f12d75d7792b0f9db8d9d92aa120f6657a0594981d0a3ebbd72143adbe055f84" + }, + { + "blockNo": 104000, + "hash": "39582cd513cf61b979a21fcf64b45efd59ab1bb5a9ab90087c126e1d960f2730" + }, + { + "blockNo": 106000, + "hash": "a72438226756550f8ff6f1896048122569c15665de7206c20c190137eeaae687" + }, + { + "blockNo": 108000, + "hash": "dd4f6c4a404e74c882e710005e718d261c935e7f5d25a48a7829be882557880a" + }, + { + "blockNo": 110000, + "hash": "35fb044b35fc743f2a85a9d4c2f42e727b9b6b6e878d7f7a564086078f2fc74d" + }, + { + "blockNo": 112000, + "hash": "b6c5313dabba9fa50f94bd621e2221f2573a011203d9f6d76422268193b6aee0" + }, + { + "blockNo": 114000, + "hash": "2c7a6bd20ec77225f74c1b348accbe62351363906971d7ec5f7007937758c403" + }, + { + "blockNo": 116000, + "hash": "68e409e6840bfe7a96ef116c56efb1306ba17e79568e43f9f30d228b2e7d7bb7" + }, + { + "blockNo": 118000, + "hash": "6eb04df97ca96740c64fac467e03122182f58d92a360a6aa900e4b78a05d2b7c" + }, + { + "blockNo": 120000, + "hash": "df8b4bdd401d0f0492411bc654b6465dbe68c83803f9782b5bbf3ddb8e890071" + }, + { + "blockNo": 122000, + "hash": "6e8234f918b3d0126ff1908fa053895c7da36fdfee7f71ef941adbb2166ecbc8" + }, + { + "blockNo": 124000, + "hash": "f04d542b2e49a11b1f359d9260e24eb5783c016b10e2903d10bcc49ca6099138" + }, + { + "blockNo": 126000, + "hash": "902988783a575d21eed72ee1f80a12aeb8ad7bf76756c7a1082b8d17f45a95b7" + }, + { + "blockNo": 128000, + "hash": "6be6d451d86a0055eaa2a09f0def7bc4933777dba5cd0f553bc76e23f2d3f3d9" + }, + { + "blockNo": 130000, + "hash": "f07611f65d72ecd20802123eef5cc7c200b314849338b5a9a6672e85caeb71fb" + }, + { + "blockNo": 132000, + "hash": "7aa180176cae01084ca7cc2d2d03953c1d5627ee6470aba51ad35e2331e3f331" + }, + { + "blockNo": 134000, + "hash": "15bae0f6774f8e4293e3b5a9b16cbb7ed95c8105a340041de8ba8bb8323a6568" + }, + { + "blockNo": 136000, + "hash": "a99d55652e9a7de66bb7da5371d5e175cf1771a15571b5c4ce8bc62c81191867" + }, + { + "blockNo": 138000, + "hash": "a810d35e880033947a4ac3cb7794341b463b358ccf2a73423279e31e06482462" + }, + { + "blockNo": 140000, + "hash": "59051a5749b66ce161b16df38598fa3c2fac56803f26879dee00b510caddd874" + }, + { + "blockNo": 142000, + "hash": "7ff02e3042919ae0f24ecf9dc7f439f87c67a74bc8f3453515ced3c0c0462c2c" + }, + { + "blockNo": 144000, + "hash": "a34f3acdf0f863463abfe7fd3bb3837a42d5842d2df9ec92dda48b6a5df76ccd" + }, + { + "blockNo": 146000, + "hash": "5e548286141205ea2dd5325d82bbe50c4f8433001ceeae2101cf10bcc51a1fd6" + }, + { + "blockNo": 148000, + "hash": "2528fc93a2b9d05144240e34e98590d56eb32e5b612c96c1025c805a4b42594d" + }, + { + "blockNo": 150000, + "hash": "678837032b732b33823d4d50c1b67f7f351fe06eab5aa3ac4696bd640b8280c9" + }, + { + "blockNo": 152000, + "hash": "e33afef4dedc62879cba67133af9a52b1c9b053afe421de0a352ce873ae1cdd7" + }, + { + "blockNo": 154000, + "hash": "08da4469cc7fc0192e334e31645b0cd4aba18490130e2b06e5e9b211b8b7a204" + }, + { + "blockNo": 156000, + "hash": "9c6f2156813a91d6a9aeb279269b02016cc65d2a4d407b3706356de997af578b" + }, + { + "blockNo": 158000, + "hash": "59a68501a58457ccb33a8180da5ae81c391714f19008c7a2d22a09fccd0b3577" + }, + { + "blockNo": 160000, + "hash": "5e90dbf995480116d7110d4640ac3ea240dd805e7206b792106b17f9783c25b2" + }, + { + "blockNo": 162000, + "hash": "97808546e1c8ec3774b4208265d55b7e885c9331ad449f8afa9181ca5d0c8d70" + }, + { + "blockNo": 164000, + "hash": "4199435efe8e79fbf608c2f172dfd4bd71f4b463401c8bb03b4bb3ff30ddf39e" + }, + { + "blockNo": 166000, + "hash": "0682c3557506fbd27a88eb8017f4fcbb6c2cdd4031f91ef1702f12971a17c16f" + }, + { + "blockNo": 168000, + "hash": "ae0841556638f132883bd195f13ae7100d021f428f969a6def666adfb972590b" + }, + { + "blockNo": 170000, + "hash": "2b81bbc70991aa0c2c5d170f4aab4ab45082ce1e15eb03bf63e38889f62e321c" + }, + { + "blockNo": 172000, + "hash": "921c1483383f5583dd514ea1a635ab502a953b6f0fcdbfaa21a6a75e9fc931f9" + }, + { + "blockNo": 174000, + "hash": "a618ef4ec10be247cbde17041559ef06288c060c41dd70a5170ef329d47592be" + }, + { + "blockNo": 176000, + "hash": "6dc7e64497fd54e32bf4c6238f43346b38db3774d873b72c222a2b0653a39fc0" + }, + { + "blockNo": 178000, + "hash": "f847997f5d1f9c688f3dfe13fedfb4ff96bb2fb19922b570c767ec23df4e6037" + }, + { + "blockNo": 180000, + "hash": "d134d971a9480ca5de253d4ecd9ce1e5ee2ad10b81dbc6114defb5e51b4fa909" + }, + { + "blockNo": 182000, + "hash": "88fa7274cc857d62098ee1bac0051e2cbfd2f782dbee23012293ebc5b56ba18d" + }, + { + "blockNo": 184000, + "hash": "5cbe181f8e7ffd2b364631a76953dbef03f0e6510964df8cc2588a5a3dd137dc" + }, + { + "blockNo": 186000, + "hash": "45d0133bec22968cd05fabb6e6f4c8c5e665ae07dfccf24ec023513645c9b8ff" + }, + { + "blockNo": 188000, + "hash": "eb8391ad25bb5afadcb44b93ce84c756cbf4514f245829a2c3453e682bf199ea" + }, + { + "blockNo": 190000, + "hash": "70a24dadbf6761e255b62f1a6d2f4cd6a1db72e39218fbaff1f7d01a440d3cfb" + }, + { + "blockNo": 192000, + "hash": "f733edb52389cf861cb1852bb3b7142c2d45fba16b61cd31b4f424a21c2d1425" + }, + { + "blockNo": 194000, + "hash": "252688afc6c63728a1996b7354506c9ffe6216f163352d928cfe7e49ee331952" + }, + { + "blockNo": 196000, + "hash": "329694ca7748f0fcf43a21576163e7ce08605d15330aee6e148fcc931b623524" + }, + { + "blockNo": 198000, + "hash": "798e4ed2045b8ce8889965d615280edac6aa3469a8ea4ba595f397e57a05804e" + }, + { + "blockNo": 200000, + "hash": "28d9bcb622e7a6d71f3788ba3967699f95bb1b1ea3f9751a80d647d143c4e448" + }, + { + "blockNo": 202000, + "hash": "1302bf6709afee409a00eb58a80fa1ecc960826db8a9228bc2edaba709fcd6bf" + }, + { + "blockNo": 204000, + "hash": "1b335acef3a913e37ded59641639cafa439560b1125ebad7a406b73cdeeeeefc" + }, + { + "blockNo": 206000, + "hash": "68a13f7cb9bbe124c708fd46849b1d955d6a371bf11d5c9a1fec065a0dafa790" + }, + { + "blockNo": 208000, + "hash": "aedd5a34dc23d661e32c99def07605896c61cb1a4231fc2f0e6d79a874e5f6f3" + }, + { + "blockNo": 210000, + "hash": "f4d01576a37ef4dd51d1072599d018769493d91d6cf42d5fd72d5aab605e2d9c" + }, + { + "blockNo": 212000, + "hash": "3b50000c926ace8c37e85777b01ad5dae80d8bfad60b7539b1b783e14861f734" + }, + { + "blockNo": 214000, + "hash": "28a4292833d3a12f1ef24c3e5a9b8fe0c83f819b506bdbdd22079458069402fd" + }, + { + "blockNo": 216000, + "hash": "17dcf4fe5103715efb035cc5a0c4e148c0b98a3a81628b3bca488f6d6989f893" + }, + { + "blockNo": 218000, + "hash": "6415d05a40e461e4856a2a82820c2160857f20b4211ba19015d35e20497fa3fd" + }, + { + "blockNo": 220000, + "hash": "9a3626dfee922a4db8c8f14f57b765ca0cb5de87b973148938bbebc409a4c533" + }, + { + "blockNo": 222000, + "hash": "7d7bec1fdca7454dabb0d5892e541354ae90c12f5be796b3d9dfbe3c9af639aa" + }, + { + "blockNo": 224000, + "hash": "b784d452ebc4bcc67563bc2279641da361b42e20f39860e13c3f2e4be2028576" + }, + { + "blockNo": 226000, + "hash": "cf7b6d0ff311a1e3e106869278a050340dc6778f9a7cf4de0cabbe533454dc54" + }, + { + "blockNo": 228000, + "hash": "6c83ba018b1c6f0c3015ffbd252eb2ca9f682470a40bfe479dbcc5f5bc088ca0" + }, + { + "blockNo": 230000, + "hash": "b08e4bcd48f99841300125055991667e88897a40fe7d7d07ef47205679c56fca" + }, + { + "blockNo": 232000, + "hash": "8333278553c78f9603976856f27d236bd7d55444860d5dfa168ec020883afba2" + }, + { + "blockNo": 234000, + "hash": "430fc57faf34e5075a5bfd760290f9d9908beff89f4099322f4044e53cc77923" + }, + { + "blockNo": 236000, + "hash": "32a051bfdabf393e88d5416facc3b683544dfaaf1b6f29669439583cb44791f1" + }, + { + "blockNo": 238000, + "hash": "a07cde57a17625809814dfb856459f14a6c98c911d9d39e526ba448a956bb1c6" + }, + { + "blockNo": 240000, + "hash": "8ad71935eca7a019e97be9952ab2194d22d2cb772107202d84774eaa98e5555b" + }, + { + "blockNo": 242000, + "hash": "71fffa1e7ad02939448a76fa9968210193b1a95d1303c3ee863f3f223fc97687" + }, + { + "blockNo": 244000, + "hash": "b5792a48f506965c3e5c66e39668afa9b09ccb76b697d696096e25d68b801dcd" + }, + { + "blockNo": 246000, + "hash": "f6a4ae8b7922a2b189d7a0f7a6737e8e27e599ef41f6ede0aecc9143dd05c477" + }, + { + "blockNo": 248000, + "hash": "afd1c77a425f6f8bf5d1570839f957ab61518523d3cef7810136bbb982408bc9" + }, + { + "blockNo": 250000, + "hash": "6dfddc3da13d66c53df3149babbcfb01b7985a9e03f5eb0d1c9c0438e443ce2e" + }, + { + "blockNo": 252000, + "hash": "042084ceb6c0f79f2f676d2dc43c185155c5c14c1e3ff39816839e490a24ae76" + }, + { + "blockNo": 254000, + "hash": "d35c4bf06aa17cbb5ab7c72e14ff067f36d6d4fb7ba9341ff6c022815688e107" + }, + { + "blockNo": 256000, + "hash": "309d134265faf90ca9512f1e6ffbfcf7adf3d165acb7ff24a56e0d6fa59ec17b" + }, + { + "blockNo": 258000, + "hash": "57ee374597fd26c1198bd735a53e902d2431d74c8c22d6db5ecd52c5a8169f88" + }, + { + "blockNo": 260000, + "hash": "e977abc6c792e98a22d499550f71af6145c02dbc18c89fb30692574388ba95f1" + }, + { + "blockNo": 262000, + "hash": "42ccf7fa6b2a47ff31f8b42fa6c05c561343a245c9353d553977850e08642c00" + }, + { + "blockNo": 264000, + "hash": "823061ed26a89e1619fb8564565da4ce7efb7d4f0ca239b0a803ec481f8b2115" + }, + { + "blockNo": 266000, + "hash": "cb280f1c37a28a202ad73390fc9285bbfa0bfc360c1fd0ec7f41cae13090f8c0" + }, + { + "blockNo": 268000, + "hash": "39da8e83755d79d81d3d861ab9df0e2d191a835559a44d7381d7bf5a0eb08b44" + }, + { + "blockNo": 270000, + "hash": "b68706b49ccb68a9e28d003129e6305d6a7d62956f0ec81b455c3195ce1adcd2" + }, + { + "blockNo": 272000, + "hash": "8417b07435587aebb943b6f4d567806d99234ba1ff6831f89e6f15bff66f7934" + }, + { + "blockNo": 274000, + "hash": "eeb0a06f374ce0b1bc5faa6d1790c3eed1a6f7d2ddb125de76250e9dbbe7a474" + }, + { + "blockNo": 276000, + "hash": "961a21e4a42de5a90039db67a29b6eebd5575a5eb67142a57c9075432259f4a2" + }, + { + "blockNo": 278000, + "hash": "bc8869ea84c50d4776e7a9b21d5d9a7d5cb36cd71a544ef2b78792157aa54d85" + }, + { + "blockNo": 280000, + "hash": "d94b2d011d1c14ba22d1349ee30e7cb071c2cb94323091cad550b3c69764982f" + }, + { + "blockNo": 282000, + "hash": "642c087fd1883399690113fb05970d1cceea19e9c0da7dabdcdb569108b2634b" + }, + { + "blockNo": 284000, + "hash": "1374be6079f5d8395bd4ef83f1fe11de22cebd5e1dcb31b4197fd46f6b35d60f" + }, + { + "blockNo": 286000, + "hash": "28454f4fe882ba5056f0e1082188772f7cb797a5fdbbf96cfbcbce48a0c96be5" + }, + { + "blockNo": 288000, + "hash": "e7d10010e93191b238922a404d9f3204e6e9f947252ea938c4f057dd1a5e012e" + }, + { + "blockNo": 290000, + "hash": "f7fc8990642e150ab55f4d499b06de7f9f3d1ce0f746a46f6874510d1e1cea7b" + }, + { + "blockNo": 292000, + "hash": "cb61ee98395553482d8553bcc9b999ead1e1d51bc297dc57a84752ba391c21de" + }, + { + "blockNo": 294000, + "hash": "103aaee15827f704d796f4d26c717b1969935cf38746015ec639bec395e6afce" + }, + { + "blockNo": 296000, + "hash": "675074df50f3fd3f058e364012f030609c0e2cd34766490b00eba6b92eecfa24" + }, + { + "blockNo": 298000, + "hash": "639a0f504f0a462485bcfb009715c7d44a48297eff9ccc0bd6162e456c8d82ec" + }, + { + "blockNo": 300000, + "hash": "2d1a6d628462f911be4e6c54992b2807796be812c4436a4b03e516860c208880" + }, + { + "blockNo": 302000, + "hash": "32d6d0c07b0c29e5afa6574d78fa81481d325762e276fc231885a607cd19360e" + }, + { + "blockNo": 304000, + "hash": "6b9cf847646ecd524dea57fc8671fe094e38cc39b495db2bdec1e3c2ca3e1e51" + }, + { + "blockNo": 306000, + "hash": "c358a52cdf2ea0f70288874bd1017acd0045de77a8bff3b7c3f47b7a441c8cc9" + }, + { + "blockNo": 308000, + "hash": "b2337746526282a0d646cb94107cff9e7f2399966af1c86fcd4258c02b8079a6" + }, + { + "blockNo": 310000, + "hash": "12ecee1daf43bd295bb49c356cd7922e9f852a23bc73cbb5cb14521ad58c867f" + }, + { + "blockNo": 312000, + "hash": "ce71ad428a4820252f4d4ed3b9e0743ff2c19e22b4a478a0c64c5bf3c0e7779f" + }, + { + "blockNo": 314000, + "hash": "971dd04be6c3d4d0b7a3dfa5ce53fea3792e977188d6fccea33bfc15d51d22cd" + }, + { + "blockNo": 316000, + "hash": "d970b52639a9daa88128c45386996a68213f17640a729d9c1f168c4cb9b171fd" + }, + { + "blockNo": 318000, + "hash": "f983f2dd2545ce8b8a904675ab2e1992b2ba64c0086967d5ef0736f05c9a9975" + }, + { + "blockNo": 320000, + "hash": "8cb9df3db7bbf5b96b1ccd5d843181bffc2cc71288ba9080be43dcfc15b7e818" + }, + { + "blockNo": 322000, + "hash": "3cc021a7b125b1c706306a2dfff063ccc22dbc2469317b35a4637869f4031903" + }, + { + "blockNo": 324000, + "hash": "58eda2b72b1beac8287f4d5a5c0b3b558b1fe8f848e2b2533b517966b65adae9" + }, + { + "blockNo": 326000, + "hash": "2c8c82ce75a3ad517bd08e25f4b5d914c2aee6216196c299b86a6d743d039699" + }, + { + "blockNo": 328000, + "hash": "31b3a0f574f7bdd377c0859721b34da4e9935e9797272f5f1e7d49d512468b71" + }, + { + "blockNo": 330000, + "hash": "c5d9586d246e8cc2803242a7645b2fbaf2cc460fd06a2b7653e4b4dc5521a39c" + }, + { + "blockNo": 332000, + "hash": "44f49c5f6752b0af975ed4d3d55946ac8c3a6ab2e09d4beb031ab0801879fdc8" + }, + { + "blockNo": 334000, + "hash": "d1ff59b0253ff41da9ae727442469eb507377c53d022a227efdb538882b7f3b3" + }, + { + "blockNo": 336000, + "hash": "215972161223d5033f9bef29895b6c5bbb423eb3c51defa67ead0e20371ddb93" + }, + { + "blockNo": 338000, + "hash": "1547337954f177b4264ee95f31f42397a90f380fe75f18d5928b82651e10108a" + }, + { + "blockNo": 340000, + "hash": "5dc71b437eaadf1bdfe94b47bbbc287e6c0f33e7462d4cbeab1729d07f25a05d" + }, + { + "blockNo": 342000, + "hash": "e37a0680da9e52c2d44012d15ee76f05d5b7e43d88814682fffa1c39b3410503" + }, + { + "blockNo": 344000, + "hash": "2db51bc740b15122e3203111511298dc75b9cc3ba381fa0066f368f896b21707" + }, + { + "blockNo": 346000, + "hash": "530d3ede903df25dcb8f63525a51584ab0da575ecbf19c4eb314316ddfa2e660" + }, + { + "blockNo": 348000, + "hash": "fd7199e2d3028d4f75835565cc8884c8a79ab703df240faa922cf732a0839f0e" + }, + { + "blockNo": 350000, + "hash": "e57b4718b94830dcc7aa4f65373eab7ebbe13124d62e56e66dca860b51627cad" + }, + { + "blockNo": 352000, + "hash": "d54b0dd83b57250acfa5bb8cf8bc895d1c4702adfaef6a5625e9145744e11616" + }, + { + "blockNo": 354000, + "hash": "50f16868e966e941ffebd7e2dfdef4de6b9c785cded95292ca83ed9fa66ec6b5" + }, + { + "blockNo": 356000, + "hash": "121feb2c50aa86365417ce70ba7fa97524ff0798408b4dac867c702f27120658" + }, + { + "blockNo": 358000, + "hash": "fff99e76a628675aa09a55dad48eaddfa08e4c1a5086612af3e3e88754d634d2" + }, + { + "blockNo": 360000, + "hash": "a8bea4e6c1e0d8add1288244ee5ce99d7cb195aeb1db2321c33252731558867e" + }, + { + "blockNo": 362000, + "hash": "a52620f05c451f207b15e91b04ac60b1d974b270fdcbbd1770eee7d9d4a42cf1" + }, + { + "blockNo": 364000, + "hash": "8105a6bf896d7832388d78891969ccb64a98ce507ae5a7a7335e491a97c4869d" + }, + { + "blockNo": 366000, + "hash": "8313c1353e4d6e5833ddc69fb6de21ad45c9d37906fbfd83c251f0269ec619c5" + }, + { + "blockNo": 368000, + "hash": "82439dd8e8d1f3d9a27014276d6652b7a5a8baf88daa223bd7969be285df1729" + }, + { + "blockNo": 370000, + "hash": "a1f2f16042b3d94435aabb5e039f12ed9e242ee0c8ddd5a9edc67923a016e8ec" + }, + { + "blockNo": 372000, + "hash": "36ec3685f5fbf7d4b3f4e2e601f791dc49f82223ddcc6ca6970d2a2de0f7e41b" + }, + { + "blockNo": 374000, + "hash": "b734adbcdc3d8cc607d92f011b0ce45cde50c874f6c7e9d784bb707d9b46080f" + }, + { + "blockNo": 376000, + "hash": "e166abd90103e727fc57cec7c9cb1c6484537a57721810973bdea95e113b6ee5" + }, + { + "blockNo": 378000, + "hash": "c7a04e9e525f950c84dda046fa9eb92d0215310bb78aa5c743f5f48782c36eaa" + }, + { + "blockNo": 380000, + "hash": "265813af0a0b69c94762a65f1d552f98d3a9280c02721c9204fd5006333d5166" + }, + { + "blockNo": 382000, + "hash": "815394e6b758946a99be7b2999cfcec8e751082d5b028239cdfd091629a61b3e" + }, + { + "blockNo": 384000, + "hash": "2e282361b30fe2f2160cbad7286198567238f6f422e66eda791d716a39cfc2c0" + }, + { + "blockNo": 386000, + "hash": "12383f26f7f88bd7b4d9852e983d9f81e016e5518ec883cf2b4e678b2d128066" + }, + { + "blockNo": 388000, + "hash": "7517a86c71d9de3f202b1e18df6b9300bd85dbfbf3e5e360c9574f9d03bb9ac7" + }, + { + "blockNo": 390000, + "hash": "79347a5b0fb95aafa850818668de27c61b0fa4e5d0401ad8822429dd33aa2d33" + }, + { + "blockNo": 392000, + "hash": "f06c9555ebca9683a01a28f825dcf7b0bc00a7ed891b7fb27754d095c0d18d68" + }, + { + "blockNo": 394000, + "hash": "cd433e2f1b490ee921ea19d4585aceb327a2ed7a52a2f03a21082810167239f5" + }, + { + "blockNo": 396000, + "hash": "9ddc7091256e112bbb315251dbf1de08471eaf03e1224ae5dabe63f90826ae03" + }, + { + "blockNo": 398000, + "hash": "302745ac6b7dcfb21ab56c852510cf3bf85c5f6c70ca07ebf2d3ae7548b2fb0d" + }, + { + "blockNo": 400000, + "hash": "7f948ede805c7b1bce975b0a97a5749c68f8569586f01c3eb7e801d04b04df6a" + }, + { + "blockNo": 402000, + "hash": "a4fa9e5b663c65859022dde42ff189aa39cd191156fcf9898d158dea75f84038" + }, + { + "blockNo": 404000, + "hash": "8afee0b4c7d02348c1a64fb3a0a2df3dacdfa4fd2521e9ff1786805c1fba6c8b" + }, + { + "blockNo": 406000, + "hash": "2f214b97a474dbb31f549e6a636a039b43cbe093eeeebb4993226d0d83f483c3" + }, + { + "blockNo": 408000, + "hash": "e2276879b0dc8aca78d96f466217d93aab9a63746177a11dcd066596caa20ee6" + }, + { + "blockNo": 410000, + "hash": "0ca6c93c7f6a89e85cf6c830b4ff642da8fbd9a9e4e5eb0a76c51456e90dbf3f" + }, + { + "blockNo": 412000, + "hash": "e08abb7dfffd7c5e35a264b7f70182e95e178c7b11081be36a07a3be5a3463b0" + }, + { + "blockNo": 414000, + "hash": "6aa235ce7264f5879defe0a53793bc8a56439661b4d8e3bd0fe213afc5ddf4fc" + }, + { + "blockNo": 416000, + "hash": "377f6dc3e2070e9997b50436ba2a45f833ff486618500c73fc227510543584b6" + }, + { + "blockNo": 418000, + "hash": "0f41981e145c2a6f15b40cb178c7df6495e5d98c3cd518b95c52e8402559a53b" + }, + { + "blockNo": 420000, + "hash": "d79aff7346c8d902e2d22de56b7183fb029a27340b16f42d1b206a5833ebae25" + }, + { + "blockNo": 422000, + "hash": "5ec838ff9ba0d58dd70eeb677ca8056f332eb079b51270496f975771581e31ff" + }, + { + "blockNo": 424000, + "hash": "308a4a3d36c4103b12dd842a713be0ed3c4cc63829c674d8abe981bae8a275b9" + }, + { + "blockNo": 426000, + "hash": "f8ba8c787f98b72f8c63e3e3b6e105cef64a5a4c52868035a3f257f96803e175" + }, + { + "blockNo": 428000, + "hash": "854bcd94cdffa4472806d4c07d57e34ac32472e719cb93ea7a8668525cf3dc7c" + }, + { + "blockNo": 430000, + "hash": "a5d0f86c3010b134088beb092fe2875ec892ff8921dbe011f7d4943f9cc73ae5" + }, + { + "blockNo": 432000, + "hash": "d2866d970d4e55a5c7fed2fdbb34a651f6cb9572a70f30bda7106189352129fd" + }, + { + "blockNo": 434000, + "hash": "1db27edebfebc32955467788c8ed6112e432dcfa15f6f0b34f66f35921858e61" + }, + { + "blockNo": 436000, + "hash": "25b312df46292b33c9e304b1a64cd01cd7315b2c131cde219fed1900ef22ab97" + }, + { + "blockNo": 438000, + "hash": "f4d2484596543562d8eb835efae7d8f31b1a31c2add1efc794d472cb0869fd8f" + }, + { + "blockNo": 440000, + "hash": "4e3ae85ff56d0d5b9bca9c7d3cf47e516409197ab219c7101bfdbcaedd7234da" + }, + { + "blockNo": 442000, + "hash": "028b065b1ec8b9d0c87953c615e99e9c3a1d01865ffc1b3132127db7c5011740" + }, + { + "blockNo": 444000, + "hash": "25fb840e3f2bd13745870a7bc5244d234e0686993379a5b3636cc664f372ffce" + }, + { + "blockNo": 446000, + "hash": "a6f858f38ce622f6094669509f645e469fe999780bf11f3e6ed9ce4ac0c6a9d4" + }, + { + "blockNo": 448000, + "hash": "5bfd61b4695b9f073138b3d57f112ce9146a38aa07ef5a96b8c87fb4c03d78f9" + }, + { + "blockNo": 450000, + "hash": "d4c932f1c1ef1ff0bd49515551cd105a525bb19336e6c8790817478702c06946" + }, + { + "blockNo": 452000, + "hash": "aec71bed6cd007305fe352a42c88eafac62708eeda5ee2ca9897a18482b1e195" + }, + { + "blockNo": 454000, + "hash": "cf7c3a37963fd48e0016983fd064e92023cadfd0d1894fdd32003fefddb2ed54" + }, + { + "blockNo": 456000, + "hash": "24138d6714f8946da5ecbc837e286086cce75bb8f1b8d55d44010731cff43a7b" + }, + { + "blockNo": 458000, + "hash": "c9afcae1dc19cd6fc1548f4e2ebd4129e4f66b35b01a55b3f8334f296f1975c7" + }, + { + "blockNo": 460000, + "hash": "700e892562ad859adf93eee55706a66a39c6604183a40145bfdf4c54f6328cb2" + }, + { + "blockNo": 462000, + "hash": "49131637ec7f91ddd9880ec3bd9364f6c35b10a11c283c0899ceea5f7b5f51b9" + }, + { + "blockNo": 464000, + "hash": "e3b40775f85a2b5a6673e1756b8702efc9856bddf473c321af02f9f1db347a7f" + }, + { + "blockNo": 466000, + "hash": "e285bc836dad1eb486b9d9d7846e94a62635510704fd7660026d8e1b88637466" + }, + { + "blockNo": 468000, + "hash": "5f1a4f8acdcd20afc6dbd7bcb53b1a3218860c43114aa590dc58b9a0fbb9fa4f" + }, + { + "blockNo": 470000, + "hash": "865a3a1efe46238f9cafdf2bf74931307f62e4e1c3823d26ea8e507db1b7328d" + }, + { + "blockNo": 472000, + "hash": "cb30d8f351fec91a21ca058d4778038849444c1a779cbbebc14701ac6d4f9395" + }, + { + "blockNo": 474000, + "hash": "94e5197efad13a527d689d528df8c665cf9938091767378e498be067bfacb5bc" + }, + { + "blockNo": 476000, + "hash": "af37bc9890702c190d8d114a156638da9d56ef49b1b44b5389ca2b582a2af5eb" + }, + { + "blockNo": 478000, + "hash": "fadbda37117cae34a9fb381f95f4ca558717631dd61f8fb48d207fea64696f99" + }, + { + "blockNo": 480000, + "hash": "0d9fa9e40768980cdf85eba91d9adf95736bcb0bbc199625197f6dccc801d7f9" + }, + { + "blockNo": 482000, + "hash": "a2f12dfefba164f816d121a71863e105d19a1bf8088382f9f94428c76b733ff2" + }, + { + "blockNo": 484000, + "hash": "7a641454971a67e59dd305e96c0bcbbe66f9d2f6226cec0e3e8c215c4da20a08" + }, + { + "blockNo": 486000, + "hash": "541872efb22f8c1e9af9737699855e41c15acd3bc519dfc986126a28f63c3dbd" + }, + { + "blockNo": 488000, + "hash": "837f72e10d69ff7eafeb9c7d21976a7363574e879d1421d28258240920f9d26b" + }, + { + "blockNo": 490000, + "hash": "c14bb5e2b1caca6831eadb865e86dd920216b52fc7112346d0249a3abf92bd43" + }, + { + "blockNo": 492000, + "hash": "0cb8c2a808ed3c5ac243254ab244de242e112661392d35f17d5b436246e23f97" + }, + { + "blockNo": 494000, + "hash": "34bc9e3f7048f4e54a5f48c6fce9f8d4980e6839479828b67e8af85c9ce4c3f4" + }, + { + "blockNo": 496000, + "hash": "06d890a21293f144a03880157d9569529d568cda641c547175e65d5efbaa7e79" + }, + { + "blockNo": 498000, + "hash": "1bb7846a2d17d7d0f95b7c09797196dfeff08bce603df5a031add275302eec1b" + }, + { + "blockNo": 500000, + "hash": "8bdbbea9d1f2a465d08b6acae28cea438b127f49700101160f4259b43c6d6cb4" + }, + { + "blockNo": 502000, + "hash": "883252caa1b1888c51926f25cc8a665753d37abb5dcd9c253a4715cdab3c2f87" + }, + { + "blockNo": 504000, + "hash": "a1d943c1ee52bf681c37d4be25ab2175fbc2db74f13c6875ea0bf50d44bcfe45" + }, + { + "blockNo": 506000, + "hash": "1c391538d7adc080959657ee9bf6015e95fa7b19a5ceada6534afa15aa25c56f" + }, + { + "blockNo": 508000, + "hash": "f690b1d3599fecc95cc2b893440d1600a33d643364f67f9a4cbd0401c299b255" + }, + { + "blockNo": 510000, + "hash": "32b3b2190c1ff4b0ead4bed74ac146a911b152c56b9d05f8d84427a25f528632" + }, + { + "blockNo": 512000, + "hash": "7e792356e0dc7aafefc94aaa9ea112186dc5c7278778298d5afde11e404c2ce0" + }, + { + "blockNo": 514000, + "hash": "6a8c4573a034cc437d3de9c467c46fe6593aeae169ef9058733f7e327c801337" + }, + { + "blockNo": 516000, + "hash": "312195234d6f448d44573fdfa2e53581a766c608653169e65f156b5b09678b85" + }, + { + "blockNo": 518000, + "hash": "7f1a03e093cca287d3480642d009ab6186776e46439dfeb05591fc7c838b06ec" + }, + { + "blockNo": 520000, + "hash": "7c077972284e9b7ba6e7d04d7217904b499ff0539db3663647201ae8f423097d" + }, + { + "blockNo": 522000, + "hash": "bddd68384bcc860b59c3a38338b8e78bb3ac5298493d9c7b29ddf25ef3b7a406" + }, + { + "blockNo": 524000, + "hash": "1d10a15c3377b154702b9ab35733eb669d62c45d42ceabb05df966460ad2e119" + }, + { + "blockNo": 526000, + "hash": "9327611e36c937f4144da3ea299a5b36f6852300908fc99e20f620c98f7c1e07" + }, + { + "blockNo": 528000, + "hash": "63215d5016dbea2fc4392c4292f060f8bc3b48d025b160eaedbf54878c17a7d4" + }, + { + "blockNo": 530000, + "hash": "ee68f2ff121f85b23f95b7db0e8a84504e0db912e6b07c27bbfd68ad3c596667" + }, + { + "blockNo": 532000, + "hash": "bb7d91b4fb263778712dfaefd310cb2285d78ec06fd430b81e5772effcd48358" + }, + { + "blockNo": 534000, + "hash": "06b0063af4deecd94796a0e28c725ae89f67b53c95a47d334b53e8f07961174c" + }, + { + "blockNo": 536000, + "hash": "da43ec74cc011ff975791b30f130c7330d68fce048c1e0f496f1f79fb59d850e" + }, + { + "blockNo": 538000, + "hash": "326357081ec40bd58849a5a72a277ca63ee0e3a72afc6fa3b68c2695a2e0609e" + }, + { + "blockNo": 540000, + "hash": "9c56378392eb3ffc77228cc87cdab93fb5bc36611323c826e0194909283ea852" + }, + { + "blockNo": 542000, + "hash": "695086e3d378a868dab25e823a71ad4e6a51d99e4a3af9a1e15062acc181b40c" + }, + { + "blockNo": 544000, + "hash": "3ee8f4da4e2f13e08679f96274224da538375e8f91ea9f805d7675c2e8f1f348" + }, + { + "blockNo": 546000, + "hash": "34bfff3bb7eab3eef919d17a130c8f17456867054165b11ac2b0fac72218b9ea" + }, + { + "blockNo": 548000, + "hash": "a865310128c4928befa158d618a4c236245d6fdd1e209843a223bb2b0d0c7be3" + }, + { + "blockNo": 550000, + "hash": "26e562917b89b39f285a4566bb675263c31fc2423c40f8760b7dd6ab588b2135" + }, + { + "blockNo": 552000, + "hash": "d0aca14ea7435cf8423ddc9ce0b21c0ec8148e6a19aa632cc0273bf6ddb38602" + }, + { + "blockNo": 554000, + "hash": "9f2d412ca6c6003f1140fff616d846a3cd6401934d04883e10e5056ca9b48c4d" + }, + { + "blockNo": 556000, + "hash": "c26d627ed88f4a97d45880cee573a539a6eeacf1b684f1933ae2bb2b9c4079e3" + }, + { + "blockNo": 558000, + "hash": "3e5fb688954d1e16bd5b1f5d7638398b411cc83497851aa84e78dc149544312d" + }, + { + "blockNo": 560000, + "hash": "7c0552798d6b656445910ad1429e7c96b0d158adc39f0415e77fcd62d3611d8f" + }, + { + "blockNo": 562000, + "hash": "245126be6424ab234d0ee5e395c4ffcac44e956193ae930e74f3f374b83c8470" + }, + { + "blockNo": 564000, + "hash": "1a96224c696dabd49c58057efa8a97784e2af814273a2ea5ebbc953d597f6f89" + }, + { + "blockNo": 566000, + "hash": "ac6b41b400a4cca5420f026998ab320ddde294dc9b9d9e168bad957dec561efd" + }, + { + "blockNo": 568000, + "hash": "75b040b2875f7e2d618261b56979bb25771f94311573a4a886ff32ee67ffb7c8" + }, + { + "blockNo": 570000, + "hash": "d4e97535e1f5636690b84f1b2003a1cc3c90ddfd239a18902480672c7925ba6b" + }, + { + "blockNo": 572000, + "hash": "9e46662a33d1960d4c86caf670491fa0dded4a9d7e26b6fa4accc55edfe75949" + }, + { + "blockNo": 574000, + "hash": "36a1265621ea42617e5fa86eb068dda9dfcd54bc65bd049faae3cf382d097d3a" + }, + { + "blockNo": 576000, + "hash": "87e4539933ce60fd77aeb85bab48c75705bb37925e13a8dadc197eacb71be465" + }, + { + "blockNo": 578000, + "hash": "a0b09aae0c68e5835c85b5e4132cb1ed8f384eb8f170347b3bc55b54a4b76aba" + }, + { + "blockNo": 580000, + "hash": "35cbd20a5bd972d7c1e7d33b708d808ed0433d2fa2d2659744d46619c5b3d6e9" + }, + { + "blockNo": 582000, + "hash": "d4204ec2521f732f4bf3e80325e3984956bba69328dc6f68731ea69f20d20b41" + }, + { + "blockNo": 584000, + "hash": "027bf4460c040c6de8a94a7e6553b788734075c9d30981682fb49121b0210311" + }, + { + "blockNo": 586000, + "hash": "16583d81e95eeaa53f70412d9da1e3693d91483fd5185a69aeb7145c9cfa8bf7" + }, + { + "blockNo": 588000, + "hash": "2667e09f8d8b789666212a2c8c820c566dd57f252e4a7673488d880363b88154" + }, + { + "blockNo": 590000, + "hash": "65bd7214a53d8eee9ee25841bf8115079513e1603cff4b866e2eb9019d18a203" + }, + { + "blockNo": 592000, + "hash": "e2a3e41fc6a9cac6205aea89b912e2bf2de079aca550c6abcd1370b9bc9be29d" + }, + { + "blockNo": 594000, + "hash": "d21e420dc5f9c9eb926daba4cef8ad362e3105e2ce96d0c5d029719f3a96a656" + }, + { + "blockNo": 596000, + "hash": "5a7d7e159d756e988dbcbdac9c5af96a6a155d105277947c7df656a7f405394f" + }, + { + "blockNo": 598000, + "hash": "b64d895f6708cec1a7d14eb494f9697d5a9e2cd43fd1e61fb3be80121e2e1afa" + }, + { + "blockNo": 600000, + "hash": "cd0c151e486c9616d0c684e8aa2e3d24b316c1008bdfc74a490ce06eb8b9951a" + }, + { + "blockNo": 602000, + "hash": "ca89a7e912e60987ca9dde02c4afcd72c5ec325d9042902374dda7d4139d24c0" + }, + { + "blockNo": 604000, + "hash": "8da13287940cd15aa66fb9c22c489d40864346e9bb1308aac8c1fdad010b5d77" + }, + { + "blockNo": 606000, + "hash": "1b206f8b880ed732a79ca1314ab7b626d48e1f81d172c6cff59224259ecef29d" + }, + { + "blockNo": 608000, + "hash": "0563c695c049c8f5443e3213c92381fdb3b8ac792d54d607ac2111256f1614a7" + }, + { + "blockNo": 610000, + "hash": "3df937246bbd66dc0fd51feca2f024bf77e0965e96260cd2d511dffccf74543b" + }, + { + "blockNo": 612000, + "hash": "c3dd4554647db65515781c0510bd7ae04434c01eaa17c514bee9ff232fe17deb" + }, + { + "blockNo": 614000, + "hash": "9b56320ab45f5a7296e3755d52fcb964a2567f3aac17409e1a577fb8cca57957" + }, + { + "blockNo": 616000, + "hash": "1569c18e7a1425bdf55434980d377ddc9c3755687394c9495de8b96a0b3ecd03" + }, + { + "blockNo": 618000, + "hash": "66b81f6e9668c8e330779d69c57d64e0e6444fb236e5f99aea375637d31696c2" + }, + { + "blockNo": 620000, + "hash": "49196d8a1ae20926eb98ad97265dc9d684d3198cc14bec1271c03102e43be8f1" + }, + { + "blockNo": 622000, + "hash": "d9f374e27fdc1a0654a615d2d851df9b7e397d201eab31bc040c061e7dbc86bc" + }, + { + "blockNo": 624000, + "hash": "207e66a881e94e70a4466f54aa83d08a27f61a91f617a2cfb135e40c7be052b8" + }, + { + "blockNo": 626000, + "hash": "86e592586446f55d24a2bd66e653e95460fc4e458c1d0475cecae95dc8c83ced" + }, + { + "blockNo": 628000, + "hash": "84fff469fba18dde37b11f7f2d094e513bb119baac37c07d014f0059ad503541" + }, + { + "blockNo": 630000, + "hash": "e0f0269559e046ede9baa0e22c990586602b4bfb63a198c9743192501f244ac4" + }, + { + "blockNo": 632000, + "hash": "f8ae3892ab468bb2e280ff7ef1117d79eb4ecc50c2fe39bf52bda01de197e221" + }, + { + "blockNo": 634000, + "hash": "797167eb79afb0c19c5cc740b2761afcbe4c3f5b55e9e1d26881d66a9368be29" + }, + { + "blockNo": 636000, + "hash": "4ffe4f0d683362c2cd2f2c629b88be53460b44e2329d566352d48bdfd62d141b" + }, + { + "blockNo": 638000, + "hash": "aae0bad31fc1e83e699db96a60c63de59bf9002806d4072bee83b74d49cfbcb0" + }, + { + "blockNo": 640000, + "hash": "c66e796d3f9f5ee4c79889afd37dd55ac7db1d97520cab314304e54a8cfdbcc6" + }, + { + "blockNo": 642000, + "hash": "8f53b4db1faa225ea5a7507ffc8c32a1119611d9f7c68e9c234192f9dfdf63ea" + }, + { + "blockNo": 644000, + "hash": "b9d05f69d5f2fbd1080a0021e9b223a111472f3e703383b4cf45c8692c16490c" + }, + { + "blockNo": 646000, + "hash": "b8a99608bbdf5a7e1b521c680ecb55c4b396afd91df888e15755d08698d12115" + }, + { + "blockNo": 648000, + "hash": "d69d4ee81e2f721dfc2151fc0205c638ca49e5329f9f8bc5b489fe4418c9b049" + }, + { + "blockNo": 650000, + "hash": "349e4f8e08c8c8f968d3c2752bdbbc862c659c56ec2aa933017307cea5166c90" + }, + { + "blockNo": 652000, + "hash": "a3ef95b708740adac52e1774a21214f5adb177c2ca13377e85240d79c59aa528" + }, + { + "blockNo": 654000, + "hash": "6833ff429c0d2e39204338086daffff142b676113642214ba24cd53b6810a71b" + }, + { + "blockNo": 656000, + "hash": "41fde82b1ec9e63bb6bed6a5be7913f6896fd47ad603ac01b876d84df5a195cc" + }, + { + "blockNo": 658000, + "hash": "7f72ab3fc49925df9bb536965e86f7dc2dbf09e541f6f6314e56f45e0dd95229" + }, + { + "blockNo": 660000, + "hash": "f1a38481799621cfd8e4bde5554c4b07c9a21c6cbc51383cf9e927e44ab0ab6f" + }, + { + "blockNo": 662000, + "hash": "2f1409a239db92a734374a46bf58c6b89d98e7487a77790d87e336d6aee9ee14" + }, + { + "blockNo": 664000, + "hash": "3c3ddd34774d43387a95f89ee2a4813b09604407b6e161e6c8d77ae3c95791db" + }, + { + "blockNo": 666000, + "hash": "7055cc75d9d9d464a9f55ef668ee3e85ced019dbe301f297be5e0888f631d4be" + }, + { + "blockNo": 668000, + "hash": "9b3b2b99c2450e2e736714b91e0b7624767a0065edfaa96bceb28dcfaaa6e588" + }, + { + "blockNo": 670000, + "hash": "7cebeb51df6ca3a9fc43d697eb64483a2f38454d9b387cdeaf5eea1e978e6b7c" + }, + { + "blockNo": 672000, + "hash": "ee551ba3a04c45e48e23f516a20d0ff3f99c6efde9e77b421f5dbc3760efd25e" + }, + { + "blockNo": 674000, + "hash": "10026cbeb866585032bdfbb6f17cf729ed6393feaad246894d37c03106bf38ea" + }, + { + "blockNo": 676000, + "hash": "fe1116d190a3bc52eb555c8f802cc2904cb460b2e847b23e12d34bde00f59a9a" + }, + { + "blockNo": 678000, + "hash": "f3a77329e8b5ab041594a228ccad7be008c511d51acaa96b818896f034508f85" + }, + { + "blockNo": 680000, + "hash": "cc866f2c0b158906c4f3dcdbbbe67f5fcff0b8823d54d596fe97cfa0fb319cba" + }, + { + "blockNo": 682000, + "hash": "ed759ca63b71720e521127fafad64a6940609ff979577071d0c039f6af8a9c7b" + }, + { + "blockNo": 684000, + "hash": "11fcb708885f27e14b230c21bf55ebbe3460278fdeb90feadcef17ad9f8f9db5" + }, + { + "blockNo": 686000, + "hash": "a53d9a15d7cfe8b300d37914d520f8c96ab779662cb69b2264e57b22de15ea37" + }, + { + "blockNo": 688000, + "hash": "507bdba4115c9341617bfb41af7b02ab1be57e34d79644c093e7cafbee305c44" + }, + { + "blockNo": 690000, + "hash": "750dedd3eb401a6e756882de92613cdab37b954c2dd109b4cf8400e221ce7f42" + }, + { + "blockNo": 692000, + "hash": "d47fd9db435a63b8e4e23533398718e8ed1e2499073364a6c39eb008635519c8" + }, + { + "blockNo": 694000, + "hash": "30e5536f43c659d71ad581501b7657730fb1d36f6cc00362b67defaf317ed906" + }, + { + "blockNo": 696000, + "hash": "6dd4b3582d13fea317c39280b5e18d502d18f9ca961cc42d3741df6c34facc21" + }, + { + "blockNo": 698000, + "hash": "53088d2da318834eaa60c8edbf5ac6eb7e9846fce405aeb2c8278d5943d1876f" + }, + { + "blockNo": 700000, + "hash": "bc3e420321955da46c4f8db892e3813a4f23b3f2fc80442bd952b798821af770" + }, + { + "blockNo": 702000, + "hash": "0172153666b13f850851c92d6a79bfcd6fd60591e125126b0e80233c99ef0228" + }, + { + "blockNo": 704000, + "hash": "1f427c48880758b9574f6e1710d2b4bdb859aad49e952bfc7d5b2284db1f0173" + }, + { + "blockNo": 706000, + "hash": "bfc61334304474382f1d318a2c32a66cd1245e89f8a86c57abbc9d91ce7ff9da" + }, + { + "blockNo": 708000, + "hash": "87dc9f4124fe20752ea6349bad86739310a8930d6f71389bfa54e81824ea7362" + }, + { + "blockNo": 710000, + "hash": "fc2def293cc1625118c188bc56d3c2dc42c89339841a2e74cb3dd390bdbab717" + }, + { + "blockNo": 712000, + "hash": "e08b87c7423b2127dbaff983340c9f257a76c6e085d16b9e2dc592c72ba55937" + }, + { + "blockNo": 714000, + "hash": "7a6de79f0d9b06caa441a52616266823d9a64e61f69efcedacfe636f793fd62e" + }, + { + "blockNo": 716000, + "hash": "8c07cea886b87ed9d23d2b831e4dccac0b0670be370368966da36e6f7f318a97" + }, + { + "blockNo": 718000, + "hash": "810c0179497740bcd933525e0915c0acc4704eb9f508bab26a0b0f4abf75ff2b" + }, + { + "blockNo": 720000, + "hash": "58844e6d785982ac001a5d92f8317483939e902002e79396d70973fd3f3e2d7b" + }, + { + "blockNo": 722000, + "hash": "75449ed511eca4ead6dece12e97198017e3d1f855e998bcfbec8461d2704085e" + }, + { + "blockNo": 724000, + "hash": "aa40bd1310a3b592fd2926ada39de0f6c7493e644cb9148204eb7784a2419fce" + }, + { + "blockNo": 726000, + "hash": "e3c9ba68f5734c4ae42e108358050eb564c268f2f04650d5f01c57966dbcaabc" + }, + { + "blockNo": 728000, + "hash": "eecd59a366536975b8d998652195435ab5a902aa1666b3c2e35bc1423cc8b70d" + }, + { + "blockNo": 730000, + "hash": "979ace0f8457295ef1218e8dc1e5faacbb72b4a0b2fa34085ada3459bfe51e2b" + }, + { + "blockNo": 732000, + "hash": "9a0f560831fb3185d7d7ebc4b4b76a525b39e3a468894ef40631aaf6ddd4b8cf" + }, + { + "blockNo": 734000, + "hash": "d1d4ffc5c168a6d96b7bbbec45fe768a17f563582690d22340b337bd178ae719" + }, + { + "blockNo": 736000, + "hash": "4ad1e045aa94dbb6550ea309efa4cb208c8b84c34c027ad7d6bbcd540fde42b4" + }, + { + "blockNo": 738000, + "hash": "7159304493dcc9b6b2132e36cea5287e3e2584dab4969494ed8cb7729cc593d9" + }, + { + "blockNo": 740000, + "hash": "c7413ed1de9899654ba9c877bdc354e784937edba95517d1c688fbaf1f0911fe" + }, + { + "blockNo": 742000, + "hash": "fe9c3d8b9d3ef72b65f61705bd24b85f86afb624fbb25fff5b3a467349f42ba9" + }, + { + "blockNo": 744000, + "hash": "b592cc8fdcb1fa83f51da49421788de38cbd755e360800d768c333a690a591a3" + }, + { + "blockNo": 746000, + "hash": "a2aafc34411c2fe07b25b91c44484422b7030dc12d9c4f328325fbfc93ff8720" + }, + { + "blockNo": 748000, + "hash": "6eddc2390b24ec9b970b4815093901aa36ad6ed5b6cb6becf3bd922f19f77a88" + }, + { + "blockNo": 750000, + "hash": "c2bb4b745355ac101bac4b7cc9a5bed5a64f2c91e6efed3b2c82644e7a1cce41" + }, + { + "blockNo": 752000, + "hash": "8da294b594170530721d98706cfe9b434f0f3775909acd5208bc0a81f3681f1a" + }, + { + "blockNo": 754000, + "hash": "ae5656acc7ff5943e5afe33ec7103014014de1dab097cb909d921b3f840ec56d" + }, + { + "blockNo": 756000, + "hash": "fbc2b0d1fdb6e999e72f9429fa34975e55f490583f43f1207cbc38afa93722f8" + }, + { + "blockNo": 758000, + "hash": "f3fcf6ce3b39854b967db6b436e4241bf4bdb7dce6621444a0bd4b2e197dcd4b" + }, + { + "blockNo": 760000, + "hash": "6b4586f673db4d44c03bf550a49f7184aff1fed5d1d8d01af45b6b5f78be2eac" + }, + { + "blockNo": 762000, + "hash": "e2585ab245f759fe1e6664c7c605938d19ce9a5dcec3ebc96e165061dc67b444" + }, + { + "blockNo": 764000, + "hash": "7acf75df8cd9b2982a51cd07b6d52bba8f881bef7cfbafb7c366af1e1245427d" + }, + { + "blockNo": 766000, + "hash": "52d1fb9fd3b42025a6486a6c731fa4b8f60a6a8c4b8aa315d51b61b67dea9fb6" + }, + { + "blockNo": 768000, + "hash": "fd5bc5688230266324c0255291e31263b2adeaa5d2f1db075f87ce9846047734" + }, + { + "blockNo": 770000, + "hash": "a1c613b4434fbc30a2153728bda22ac7d97588704c84da7f267d4fa6f84c2a23" + }, + { + "blockNo": 772000, + "hash": "16473929e3a281d163e75f1dc014556688e4aeb3a2d663faddbfe847b51b6ea1" + }, + { + "blockNo": 774000, + "hash": "980b603174d0883fe2fc176c3e5364f87e3da7a798d19eb8f913e0b4fd2d530e" + }, + { + "blockNo": 776000, + "hash": "49aa701618dc9b4292e0c2b6ce56628c91f7e29ff041539450d1e2cb2c80cde4" + }, + { + "blockNo": 778000, + "hash": "6982124eb1e4fde8849a65b50dbd22a58a7b46d15f4deb4ec3c428f0b8e4dbbe" + }, + { + "blockNo": 780000, + "hash": "e59bd9ab1f43679fb9d2b7db8b733a1dae49acbcff6b9af9c6afbdfa271d0715" + }, + { + "blockNo": 782000, + "hash": "bee020417fff08b685c18d66e88a6b5b314ab84396f75782227015942c06e18b" + }, + { + "blockNo": 784000, + "hash": "336b72a3fa6a660210693384cb6f005312ae9ed828d2d98b86673b5b1c9f58b7" + }, + { + "blockNo": 786000, + "hash": "53758943bc2bb257c86fd3d4169586cb50367ba6c1932d7f4ae6a8dc270f27c0" + }, + { + "blockNo": 788000, + "hash": "cc2f3e20500d0aeccf7cde059edac2ee5be39f3421b4fb1333cba868278737a5" + }, + { + "blockNo": 790000, + "hash": "bb7d77188fd3b8782bfce3e6972ff99490b7509fc3f656a4eee3a76e9aac78c6" + }, + { + "blockNo": 792000, + "hash": "28c6f519a68312325e7954615172bca716dbdb446a49eac2ef03352d12ef814c" + }, + { + "blockNo": 794000, + "hash": "fd9ce5f864e2607859c2301b0ffe190b14edb3996b713509907b95ac3fde9e71" + }, + { + "blockNo": 796000, + "hash": "f26c87ea69ae81ae269334f850790abec2bb78ee407f58d6ac6bc22ba2e26e23" + }, + { + "blockNo": 798000, + "hash": "6ec4c3f4f2be5d951fa499db77d5011027137badecf4c9d59f948b4e589fd998" + }, + { + "blockNo": 800000, + "hash": "80cbfd6d4fffd685eb2c2a528afb9bc700213d2a5020b7c4e0cc9046c9ff2c10" + }, + { + "blockNo": 802000, + "hash": "e446352c4d7ab0c78316fea2b810c1695ff437f391217f069239e7032e287557" + }, + { + "blockNo": 804000, + "hash": "570984eedcc4257d723c41c5bb2998bf006d6760e5caffb3d645d2d1a523bd81" + }, + { + "blockNo": 806000, + "hash": "50479ed6ba3fd99a59dc4416434d09e03662dffa8fe4f57b8d93dc7f67a60a88" + }, + { + "blockNo": 808000, + "hash": "7c17ed6ecdfe6d6bfc8de296311f9eb916f07c7dec195d294ffb4ad7f953475f" + }, + { + "blockNo": 810000, + "hash": "86079d88e22037970a3a73f3c33e9be630c948b5a2a1d546d61bb17a964eff2d" + }, + { + "blockNo": 812000, + "hash": "19bfca816d09a8ef38e980d82b2a53bca4752b1487452aedf01870d26b98ab0e" + }, + { + "blockNo": 814000, + "hash": "0dbe15639c94ed3b3fe2e59ae96e6424495d9d6379334e36947cbf73af2622b3" + }, + { + "blockNo": 816000, + "hash": "f2fbf4469690d0ddaf51ec2a73a3641569c8796f4188a0fd9cb2e464c49324a6" + }, + { + "blockNo": 818000, + "hash": "eabff1d4647ef24ae88ed40228a9ea5c159c6dadd725e1e3613be8857101c23c" + }, + { + "blockNo": 820000, + "hash": "813acf48ed602b14d9246b5ca90903c5c64562c93fc3685ac5e11d488bb2e8ba" + }, + { + "blockNo": 822000, + "hash": "dd3a0968d0ea798f15b4fa0efbd5eeb62be60e7695e1ee4b99b82dde723cb5d4" + }, + { + "blockNo": 824000, + "hash": "2ba4044abf1ccb9813c0c3c7babcf0b99c2003be25d74f51251a9d6a9918065a" + }, + { + "blockNo": 826000, + "hash": "a9fb06319e6c7db7fea47ccf234899ffbda51b4e7ea9836fb92271407bef321c" + }, + { + "blockNo": 828000, + "hash": "39073d0e26579fda8beb6cc30c7eda0a83804857e357911b8c8c3758bfd7bdee" + }, + { + "blockNo": 830000, + "hash": "a1d22e498b51ec912db93cc23c53c68a76f7659290aedabd7f85fb3b4f113ccf" + }, + { + "blockNo": 832000, + "hash": "45611df06f4b7b9fd663b2b2cb04106618c91df15f9bdcb9e8fbf3595fa17cf6" + }, + { + "blockNo": 834000, + "hash": "acc21e25f284c9edf58f84df779a176c6dc50bc9ce9cfdd671d320f70fbccd14" + }, + { + "blockNo": 836000, + "hash": "453fe8327d09bd43051e64de2a85d803d0490a81c411b6e5e459b4a96818c67a" + }, + { + "blockNo": 838000, + "hash": "363b62e2fdd60ad519489787f5cc9174403c36ab816e5385d4befa76acbdb6d6" + }, + { + "blockNo": 840000, + "hash": "5027167df21e2034e7da8e53815d9fbbb79ca65130f3a25db4284a3ba1bdeb65" + }, + { + "blockNo": 842000, + "hash": "798cf401adc3e0dcd32ab88d6b2d6b8f4499198d0902f0318fd62731abd3decd" + }, + { + "blockNo": 844000, + "hash": "995234cb0f64144d737e33678b5075327272aff0824ee438e675969e9621119b" + }, + { + "blockNo": 846000, + "hash": "e44adb10b0616bb45a1ceb82587c0e7389687d75671c32d037eca3a5abb6cc8d" + }, + { + "blockNo": 848000, + "hash": "5bdcc6d6007fa8a8336f0c01169c213bd8dae34f866baa164bfeb7ba97e56cf0" + }, + { + "blockNo": 850000, + "hash": "8b372adaa6308babaf2782beb78aea194571328bbf68279d3de1f5fee2880920" + }, + { + "blockNo": 852000, + "hash": "b0ed66f736bd060466d46ac71db2015d6dc964e2439da01d612a19ea2f192b87" + }, + { + "blockNo": 854000, + "hash": "94cf1e611f0ed3f627ab04af0ce386fd5f75fc43504ab82179ea2bd9bec94718" + }, + { + "blockNo": 856000, + "hash": "91b0b9a086569d3c1e2ee78a3c460b4bcc4266493bf91f9b7983b18a5588bf4b" + }, + { + "blockNo": 858000, + "hash": "ac05adf3805b21aa44e54f639b0e8d97c4799a9cac2ba17bba15087abc67e2b0" + }, + { + "blockNo": 860000, + "hash": "57325f5c6f25528074017b7b586b2181636e5f47c7f777f70bad07fbcc812ccb" + }, + { + "blockNo": 862000, + "hash": "704c0b9be224afe5a3ce2b45d4f8dcd82452fbe5d21db1497225ac28f2449ed8" + }, + { + "blockNo": 864000, + "hash": "c771a269416a423f0a778b27885af63f4f6647b691d1f47c83b9a4a149a4078c" + }, + { + "blockNo": 866000, + "hash": "bdca797a6ac33239976fec98d43599afdc95fa9756e6dffe0ee1b1c6e3268fe6" + }, + { + "blockNo": 868000, + "hash": "095da850000ef46f7408c74c61ca1191793b13234375b930f8676afa3c6ebb13" + }, + { + "blockNo": 870000, + "hash": "a432d4a7459c9b7debab0c5c9c2c2a46337961c93904466bb0d1e312223fbf7b" + }, + { + "blockNo": 872000, + "hash": "26cf12df8668f53c399381665a949ae84e4a8c0892960808b8c05176eaa00b46" + }, + { + "blockNo": 874000, + "hash": "02d0997f62652457f0a3a7147b7712464efdf58519fce6208691d7aa039e2e66" + }, + { + "blockNo": 876000, + "hash": "0bd1c81722d92b617f6f8602d0d2f529cacfa52fb920a4964e8a5d918354fbed" + }, + { + "blockNo": 878000, + "hash": "d0470b881ef17097b2416ffae41c0d097db8db8803def52fe2d861899631f220" + }, + { + "blockNo": 880000, + "hash": "1959e99ed72da8bc4b95d676c87c58b822bc84bbdacf9dc65dfed8e356f824f4" + }, + { + "blockNo": 882000, + "hash": "459f1360f43f798389bfc309ab362b52579f84d2e43f7c900e8d8f07b36e8914" + }, + { + "blockNo": 884000, + "hash": "ce11a46d2a7ba58eab67ce2a6e04cb678334453d24f5df3692c2a256afa37830" + }, + { + "blockNo": 886000, + "hash": "29a49283dd25ac99cb2f7ac2d908029fafeb28d68d6fdd2595c2305eab6af014" + }, + { + "blockNo": 888000, + "hash": "7a923dcafef01493abc9324106501329a2251ae3caa6ffb9fefd20c98a454124" + }, + { + "blockNo": 890000, + "hash": "3af6411f97860e95c749ff5fb433be949935c6c21956ae19cc829af95a95358f" + }, + { + "blockNo": 892000, + "hash": "46a49db44fec73ece3afc66ae3ce68e88e7ad673828e90212758992462c567bb" + }, + { + "blockNo": 894000, + "hash": "0e07ad6ad395faafc5f2738619327cba3fb9115dcec6be1037731d957e1c3de3" + }, + { + "blockNo": 896000, + "hash": "f6556f9794fe44ef1379da653c0a487c8deafbcb255be5f665669b8d9b852fa6" + }, + { + "blockNo": 898000, + "hash": "009076ad0792b94d443b2de48e025cc5fa8ce61ae276ddf0c679f5cf13520905" + }, + { + "blockNo": 900000, + "hash": "f6ebdf5d3c531301b942fe077ed6c3f1110fa6cdc53d97de8f95bfbf66dff055" + }, + { + "blockNo": 902000, + "hash": "0590d924beb13429e426005eb4edd07a2089f410d800e15c4306b98682be9139" + }, + { + "blockNo": 904000, + "hash": "2699d22a7283edcfcb1c5f8fd4bdeca6f576baafec13f248d0fc37ceda90044f" + }, + { + "blockNo": 906000, + "hash": "158b95122acc93c16cbdaf371808b3bee8dfb3c32d92928956d92070af7ddd5b" + }, + { + "blockNo": 908000, + "hash": "977cfb7c8743e02855acd845cd9ef0e115f3e9cefb5f76dd5426b8d44434d286" + }, + { + "blockNo": 910000, + "hash": "f1675bc470471c890efa798c54fa95c5e3be6b32d2db52e631fc23803ee8b387" + }, + { + "blockNo": 912000, + "hash": "15711d106bfb2e8e7131fa7adb063bf08aeec3ace88d379cd7414802a990ab56" + }, + { + "blockNo": 914000, + "hash": "716846a6b55ffca52091a2c66eb40a3ade833942ff5b33e8008f1e41cc30485d" + }, + { + "blockNo": 916000, + "hash": "24436dc983d6a177e796f6cb704cede29e795ce3ef8c93928ee00b2640b16fbc" + }, + { + "blockNo": 918000, + "hash": "191f652f3b79a5046d1d1ce297ec60bbfa59f5731261f00fab1f9982d0b231e2" + }, + { + "blockNo": 920000, + "hash": "b917232cf3ae73593547925daaf5c8c20e91f4172d1e11d578f7f14c1868cad2" + }, + { + "blockNo": 922000, + "hash": "1220c35933b307f42221f990598fdadc1f9ed10d49a0630d5d69fd61f3b020e1" + }, + { + "blockNo": 924000, + "hash": "e57a0095c5d9c88788b239e494cb538c924966805241e6cebfa604e73bbb9fae" + }, + { + "blockNo": 926000, + "hash": "5e1a7bdb0441da8cf3456cde24d1601e5e4e29f7f5c833c13d7a9ffbadddd51b" + }, + { + "blockNo": 928000, + "hash": "71bd691c7b14cf81ab1767bfea8b13bb9d315f553760bfffffa5789f54722458" + }, + { + "blockNo": 930000, + "hash": "566405111418ea541866675055aa2c8f260689c47ac0a7153bd6874912239e9f" + }, + { + "blockNo": 932000, + "hash": "4dfca0d519576fee698b34b4c73b471ee2eec796dbdca48cda10c15848da2c3c" + }, + { + "blockNo": 934000, + "hash": "aa53bbea26f1731ef32e44603cd8c786dd9a5d5a96643cc325ef9e97d3d8b8c7" + }, + { + "blockNo": 936000, + "hash": "caf7583a5ac2d4ac7cd3af1eee1783717070d5c817d86d04804bf61ca2fd1d75" + }, + { + "blockNo": 938000, + "hash": "e4592c68a22a370416423ff41b1839ef8c9a7da506da9978092ea8a88ce62a8f" + }, + { + "blockNo": 940000, + "hash": "0f52866ec01f59134e7e97b674071309ad328a2a61a6dcee36048711f768bafb" + }, + { + "blockNo": 942000, + "hash": "5c5ac728ac380879d2862dae5a3ad74d47836265b5f8222b5cb797dd3041419c" + }, + { + "blockNo": 944000, + "hash": "35eb3e385540dff9771c0b2e13023cd64ca148347699f302fde74004beae4d7c" + }, + { + "blockNo": 946000, + "hash": "abb834be1f8db9cbb3de448261b0c15975844d68613bda4309c75f8932d9aa8d" + }, + { + "blockNo": 948000, + "hash": "2e5633e04faf92b546c71735d78adcc3ebd621baf379304a3fd8d8f962d93f76" + }, + { + "blockNo": 950000, + "hash": "4447f60c481fb02132d2c886ed7076384b57ab677c827670048496846ada840d" + }, + { + "blockNo": 952000, + "hash": "fff137585279be0a3ea01d1db1da4a7b149f581f4cf65e1f22baa60319e2b508" + }, + { + "blockNo": 954000, + "hash": "e6592c963d42e137a256db13d4b72b51df53dd31fcae873d45d02f648f890b6f" + }, + { + "blockNo": 956000, + "hash": "74d186f7d4b2d66a0f9e8e3bd6c5d6d2dd3c25c1b10a3dced41d700f76f5833e" + }, + { + "blockNo": 958000, + "hash": "7d022bcf11e6a56db656f80592a375987bb8cc9f44528e85837f5c4d1c39c9ec" + }, + { + "blockNo": 960000, + "hash": "21f82f7c028490504abdbd4be3c01b3224e633453e84d6fa05fdc51b5acb987a" + }, + { + "blockNo": 962000, + "hash": "aff309cc44b69fbefc2589dda49986135d7cc56c1af71c737ea2b74df2678191" + }, + { + "blockNo": 964000, + "hash": "0328fb9c9abf4792dcc07c431d2bf8b1e42511f21addf7482f84d785f8bb17e4" + }, + { + "blockNo": 966000, + "hash": "13e853b11ad49239df27e79f2e24c64f705543240e3e99bbaee784009a7b29a1" + }, + { + "blockNo": 968000, + "hash": "f4ec3dcd642a6a3c7f673ec44b145b5492a4985acde8358b6ae6b96d2a7b3a05" + }, + { + "blockNo": 970000, + "hash": "c4b4d457f800867af296e3fc8ac23604ae8d87ebbb9f9775939705b926d8f265" + }, + { + "blockNo": 972000, + "hash": "74250978789d616ce384ab67329fb5757aa4855cc3f274cc975f4bd4b9d18d0a" + }, + { + "blockNo": 974000, + "hash": "3416af91be5825184d9a6bd3fdf4f7d6bc81e6957a0b1eca2925862d91a70a03" + }, + { + "blockNo": 976000, + "hash": "7083cc3ecfd56993bd7d5e9770ec4112018472a06cd69f5322eca9422fec7c59" + }, + { + "blockNo": 978000, + "hash": "ccf90bb2f0052473b4c129d051110d7bc1ca9a93c37fe38924396c949d9ad3ec" + }, + { + "blockNo": 980000, + "hash": "4101f251a59cae92d19d8eb2cf6597c6d7245511518dc62a93fcbd42a640b3e2" + }, + { + "blockNo": 982000, + "hash": "610c07d698fa9d92bccb6c229287a3da41876786a8451523a31747ef7bc73138" + }, + { + "blockNo": 984000, + "hash": "9d82a48ef663d2509cbbc8a0945f1c5f835a1638685ee03493645c4b5865dd43" + }, + { + "blockNo": 986000, + "hash": "847c9802526e0b7f8a434ad06baf44e26769ab56f07aa6936a5921798086eeef" + }, + { + "blockNo": 988000, + "hash": "b6faabe54557f4b15c7b9f4b8993e9b809e7ac370dbcaf0c14fae189db996bcf" + }, + { + "blockNo": 990000, + "hash": "e914158958d1dc02ba02085e447cca09c9190cab8993037fbe4a0eeed25adf78" + }, + { + "blockNo": 992000, + "hash": "ae2fec293e8dc70409907f9d7a823dbea6a9de17b89151f1e8bdb19ccf98826c" + }, + { + "blockNo": 994000, + "hash": "39ec8807a57700a1e6b083c6180ea7538b08bca6a3f4a86a495bd37ee555d162" + }, + { + "blockNo": 996000, + "hash": "a573c50afc78f3a4400c2b2a7eded02b6ebe9971ac468a76baf4287b9eca557d" + }, + { + "blockNo": 998000, + "hash": "97fa5ed84140931ed7d5c589e3e9dff482540fc2f08f50f97454f5f51ea368ac" + }, + { + "blockNo": 1000000, + "hash": "6c4afb5081e37d53a63eed6e5c83efd4f2a04283b4cbf6746e703186eb31f1de" + }, + { + "blockNo": 1002000, + "hash": "23004cc5e53f06a340359ded0a624139fc69e69c2c8e24bdaa19fa0a79a697a7" + }, + { + "blockNo": 1004000, + "hash": "a4d0af7340e556d45f735f4ff0b3861ce76f258bdaf6d945fa00840fcd5bd8b1" + }, + { + "blockNo": 1006000, + "hash": "9748c680fd5c70f038f0f2c850f5beffc3293dc57344b6d6e1656404ce0003e8" + }, + { + "blockNo": 1008000, + "hash": "59631f3e4c5acb642640fbd1112481c506f40498054330fb109e13017be3c66e" + }, + { + "blockNo": 1010000, + "hash": "4184388c82b799b25240b392c895b6ce0ce08e6210948d798d845fee8b0c6f17" + }, + { + "blockNo": 1012000, + "hash": "ffcd17e259d3a92ca6d12ef5eaad908d3ec243b72211ddccebd66ade086d613d" + }, + { + "blockNo": 1014000, + "hash": "390172c66f41287ce24f8cff5ceff375e235e00be3b2e3b46f82bb5d9536bce3" + }, + { + "blockNo": 1016000, + "hash": "ea963d316fb6c5b26b537a08ec698d1fbb19cc9ccbe4ad207cc8cfba0ab52e24" + }, + { + "blockNo": 1018000, + "hash": "a1fdc0f1801add916687a67a73184fd0dfda574c48b4a1ae199361351c1d4418" + }, + { + "blockNo": 1020000, + "hash": "e66d7670c6dbbcf082ada048c8ee13b8c0f759cf214314f8cd6d60c7d226dea3" + }, + { + "blockNo": 1022000, + "hash": "24a953d76e912dcd0bd1de0f0001e8a7f17d62119d1b5fbc24bd87940d076c98" + }, + { + "blockNo": 1024000, + "hash": "4d2a01b13c934c010a75349f2c953b3f04797d1396edc80b32ab7dfd3c6e382b" + }, + { + "blockNo": 1026000, + "hash": "873235ee28c2998e4aa2dd51cf7963130f7a66bd0fceb387c82145aaba2e8b19" + }, + { + "blockNo": 1028000, + "hash": "eeb12756f12ad0c917e34ce622c9b474de52b49f59cfbc190c98b95a93dd0fe5" + }, + { + "blockNo": 1030000, + "hash": "bec20832f799c18ba8a7c04b5aef799ac0c249eef341a44542a5b301884372e3" + }, + { + "blockNo": 1032000, + "hash": "0919e5f5b0f5e3dfedf20e6774f36b5271fa00127e41007e914f5c015b3aada9" + }, + { + "blockNo": 1034000, + "hash": "f6ae7df88c30462d9ffd428876fe643edcc75df345d3539b57afd974261dfc2a" + }, + { + "blockNo": 1036000, + "hash": "1c97fa35730690df46b98d86ce92e43b3726e56f52d46bfe9de5ea9cd1a1541d" + }, + { + "blockNo": 1038000, + "hash": "431a26e20204a49b8404fe88de4fc8fa6138285cb5f03695014ed78a0c7ccfef" + }, + { + "blockNo": 1040000, + "hash": "d5f4c6a41802dcaadc510eb17f7c6af3ed0e049a978822a0ee4fd38e91e770bd" + }, + { + "blockNo": 1042000, + "hash": "c6c468cdad8b21cf2d1a3f8076013c2d1f469cb2d7c241fce3fb40fe604e91e5" + }, + { + "blockNo": 1044000, + "hash": "5e362baff0f310c7d065b24a452b07552c15617d88169ac8824bb905d40b7f44" + }, + { + "blockNo": 1046000, + "hash": "2fd6d106ab21de19c269cf7689534555764096ae0b1cf9cb2107902613f81f50" + }, + { + "blockNo": 1048000, + "hash": "63bd7bb6b4c1c08f4a1319675888a94155a120c30d93181a10427c519fc61067" + }, + { + "blockNo": 1050000, + "hash": "8fd1f30908050b01524cd65c456a958acb4e277f2de8cff74bedd5a59932f1ad" + }, + { + "blockNo": 1052000, + "hash": "d55b8a0e7101b9e17edb6bb2b8cfe28b44523a8d171b999b12d226e1dc9ccd69" + }, + { + "blockNo": 1054000, + "hash": "dfca5c33694ef6a00c14e1ec1d2ed0c9d50e8362ac94b967ce2ab60dd35112c4" + }, + { + "blockNo": 1056000, + "hash": "343da229d9ae182a0555a1489f7b556be71f180e7f0b57add5425dbd90868f4e" + }, + { + "blockNo": 1058000, + "hash": "696574d6f849b04aaf19db0cdbfa625eaf050dc4d01842bc75ab60d73978c30d" + }, + { + "blockNo": 1060000, + "hash": "e608f288cba450a0097efb3da4f964a092dbf1d4bcd4be186451fa9f98c65a4f" + }, + { + "blockNo": 1062000, + "hash": "9dd11b6f8279aad9b20ad25350bcb4c433a491ca1ccd3c551f001b1e38464a6f" + }, + { + "blockNo": 1064000, + "hash": "2c76bac555eae5367532183628afa536fc47e576e40735ebccd33a2aea4d1d57" + }, + { + "blockNo": 1066000, + "hash": "0bb65f6ada993a78f58d84b8096653d914168e049b1713a8f4d7b4855c6be069" + }, + { + "blockNo": 1068000, + "hash": "df6d1c55f98d5421ffff1e09b8d29fed470946759c5bffce7ca2961a5a1f4e05" + }, + { + "blockNo": 1070000, + "hash": "fb0f334ffe415a29178c8228121f800291a5f59c78430bcb3e5942fe7f655090" + }, + { + "blockNo": 1072000, + "hash": "655d23aaf028d2b6bb5bcb340cca2e88221996aa367a73d5a17c2920d48c852b" + }, + { + "blockNo": 1074000, + "hash": "e90611df48c1c80d0e034d699303511f4315fead67846bedae7eab3da19cd2b0" + }, + { + "blockNo": 1076000, + "hash": "3481d552de0ad7fde4e90074bc40cfd6cb38224f2ce2ceaf86ccedc7b15c5e07" + }, + { + "blockNo": 1078000, + "hash": "23776cf49a2b481866e9544b8e67f03d64999a3278a4dbaa7caef072a22bdeb0" + }, + { + "blockNo": 1080000, + "hash": "4c72d5463487a233208c65223fc25ceeb94b1abb038e063e157584955e42d8d3" + }, + { + "blockNo": 1082000, + "hash": "fe5de095063753b227ea5e1320778d610856329d0554612fe9cdcf60a2aa2b2e" + }, + { + "blockNo": 1084000, + "hash": "21b28e64a075fb282f5727d94395fef7934dfa371777096880a852e7286f8359" + }, + { + "blockNo": 1086000, + "hash": "d1148eea0a80c5cb920839d7b44742be6c32e63f8e01fde0a74efc56d6961e66" + }, + { + "blockNo": 1088000, + "hash": "9c0567184f89e3038a2e87ca216d642bc0a5b14e14f03377bb7c793ddb0f2a4f" + }, + { + "blockNo": 1090000, + "hash": "f334b87b43cb035a08b1a38f7b79db7857812de052722042350e7c8517ba7294" + }, + { + "blockNo": 1092000, + "hash": "c7f81114072c747f30d3133ff782604aa786da3c8c0b2ce0b56469fdfae98ba3" + }, + { + "blockNo": 1094000, + "hash": "25715c68f399f2ddd4e776a9fdee7c09058534f266f09199d0bd4a4620cd448d" + }, + { + "blockNo": 1096000, + "hash": "43908fc24e78a7d2e353a9d73f58d7c9e0538a9fe7e2d8189d514c6bd211359e" + }, + { + "blockNo": 1098000, + "hash": "be42f6acd0615aa5f811c055f0e3853ada732982bccd58bb5a4a5b2732814e2e" + }, + { + "blockNo": 1100000, + "hash": "cfd3173ca64f0fc0d7971ba4638c482145c86de17024bee4a97faed0394aea98" + }, + { + "blockNo": 1102000, + "hash": "b034220a262a1e30e7eac6487fdb38f21a7fd3e31dabab26527d3fb83e6a82bd" + }, + { + "blockNo": 1104000, + "hash": "f491cd91db124faebd175783f9c6e12050d993cc68ed51a07d4230856acff201" + }, + { + "blockNo": 1106000, + "hash": "78bb65f368308bd0e92a647a5cb0cd2f5d286baeac7763ecb150214e804037bd" + }, + { + "blockNo": 1108000, + "hash": "43481518d6f1db9d5c66e5be5e03cc16c0b242198ce19a12ecd270ff5b192b09" + }, + { + "blockNo": 1110000, + "hash": "b8c3fc7fa39dbe7da4c7cad3c0cd99943b5c50531eebfdfd577847ab2472252f" + }, + { + "blockNo": 1112000, + "hash": "584dcc56df32f29de432ce2e8a98399ea1b494c944257f179eef1e20a75e967c" + }, + { + "blockNo": 1114000, + "hash": "7c5dc31bb7c131752645298dc9a0c13b482b5c3148690d89a80951dea5bf36c5" + }, + { + "blockNo": 1116000, + "hash": "46953ad54b3fd40cd826eeef75ca2c799c257d7ca1e42672477ffd5fccb150fb" + }, + { + "blockNo": 1118000, + "hash": "8ff9ca5a0f25ecd9e457e66326ed137771ad66209f09efd18573c99aaa6cdd72" + }, + { + "blockNo": 1120000, + "hash": "7b60aeb5e59a77acb7b81e426b6813ff21b7f8e1fc819dbc003b29b4695e9b08" + }, + { + "blockNo": 1122000, + "hash": "9d340b9437b54105e468a4e2a1f7800601de3416c42cdce0d20cd63ce7e3eb8a" + }, + { + "blockNo": 1124000, + "hash": "a1b686ad142a9684cec2266845d89a871ee05af49ef3ed7cc75110e2be24ec52" + }, + { + "blockNo": 1126000, + "hash": "7b125ecdc9353142c03e80204916b3130f919a22270743f09b1abb9b63a69dde" + }, + { + "blockNo": 1128000, + "hash": "f05f5b8899b762b00ad0cdd8d6402b195298ffe76fa306caea1a5890da4261a5" + }, + { + "blockNo": 1130000, + "hash": "04022e255491fde059d050c00facf4192ebbe4943ffec10b87f1344f1d76538d" + }, + { + "blockNo": 1132000, + "hash": "d38d41d5b38ddbc3e2dbf8f7f450233ade30035370d7212a8ceb62fb716272c9" + }, + { + "blockNo": 1134000, + "hash": "49e2b834087621a34054d078f996ae2d1de5619d95c0458ae62af5c2a6e6d53d" + }, + { + "blockNo": 1136000, + "hash": "1c047b1e73be6da5965dd0afa77ce01e662f982a36d4c5b87152286ef4f5542c" + }, + { + "blockNo": 1138000, + "hash": "f605602168405e35dda192a4fb7b59ba8951b2794006ee4067508835fdee9a28" + }, + { + "blockNo": 1140000, + "hash": "d8291f32937058e828855f7f3acc1e6baf24a0f56ee98d65fe9b365451498c4d" + }, + { + "blockNo": 1142000, + "hash": "06134baa7af73d6c9a3980f432560208c188cc853e761fdebcccb76935a1c40b" + }, + { + "blockNo": 1144000, + "hash": "26d9361940fcde071540415d33cc1df2f9b80a5b5efbbb28ebf0cdf6ffd82364" + }, + { + "blockNo": 1146000, + "hash": "1d0525b2a2ca8005b540962af6eb9228e9ab14c287ef2b8603bdc93efd97166e" + }, + { + "blockNo": 1148000, + "hash": "b2287ef7d34ef56360f060eeae37fcaf4a273e1fc39ee2b8ccaec0e45ca5bc8b" + }, + { + "blockNo": 1150000, + "hash": "25984835227313e1cb7507aacb67c8c57289e86f8867e1d70b46dca550d92562" + }, + { + "blockNo": 1152000, + "hash": "1ecaeca168999800aac734c49c6a66c947632f7cf3ead072f63fd9e5cd709310" + }, + { + "blockNo": 1154000, + "hash": "4952d242a6f14fe9c37b456be94abc9e05b508c51096d3c305e87d03a782698e" + }, + { + "blockNo": 1156000, + "hash": "b4145977d7cf1030741e4f182ca9460440f9bc61094e922bedb3305b2a1760c8" + }, + { + "blockNo": 1158000, + "hash": "06068d099ae73711324812365615e63cb2bb617cf802c7decf0880e3f5eb5562" + }, + { + "blockNo": 1160000, + "hash": "6d4b32d5e1e3c0c899d5615f62b5274a6195cd0bb297936b0137082861dabf9b" + }, + { + "blockNo": 1162000, + "hash": "8e8d89a319f65bb2829397619d5cc21814db6c2f6d59876a505c1d3413c31c4f" + }, + { + "blockNo": 1164000, + "hash": "5367536e5f366609da07d065a84d41fec3566d9688cd5f4637c1f7e5275f0a60" + }, + { + "blockNo": 1166000, + "hash": "b185fdfe09a138a98f17ddf6be450872f3021c6218f3a78846cfb7f3cadd23e4" + }, + { + "blockNo": 1168000, + "hash": "59d5c9db14cb05f068aa65307b7f9472b25c1c1aee1676ddd796c4e8dca3f2ff" + }, + { + "blockNo": 1170000, + "hash": "b38c01aad4bc37dfdb5575e3186bfb6ee366f6c5e7732bd7d8536059c0f9da42" + }, + { + "blockNo": 1172000, + "hash": "12f8ccf52554b62d8ed7a0c312a765debc2dfd5b9c970b9c6a664a33e5545902" + }, + { + "blockNo": 1174000, + "hash": "29adbc8487c5edc781c36838c1b99728a7df298b3aec8b00e555637d18e7f558" + }, + { + "blockNo": 1176000, + "hash": "e350c4fda570d47aba5c97907e95625ef1891c03c778c7bfa0a37ad5dd4d3e96" + }, + { + "blockNo": 1178000, + "hash": "b6aa6c6e49000423d7a93e7afb8e3e10104eb089c7d813250f72a7977c4c9c69" + }, + { + "blockNo": 1180000, + "hash": "631ed43db93932ec3fedd22fea1315a6379efdbcf67532ab978aa458d907f82d" + }, + { + "blockNo": 1182000, + "hash": "55a13d452ea04f9f2639a9533136f13e17d2ddea55b7bb782bb06a5a6d98cd53" + }, + { + "blockNo": 1184000, + "hash": "1598a36fb782d1af26839827afa20996658683112cfdbbfda63745d7d4526cc4" + }, + { + "blockNo": 1186000, + "hash": "3b8b8f2a78465cf077b794af4347926eb153beb3b7bc7fce5fa72e8373654814" + }, + { + "blockNo": 1188000, + "hash": "e50ead284ad16f1889e7e6f32517868c81da99c31137a08e0091b5f5f95e7f1d" + }, + { + "blockNo": 1190000, + "hash": "dc51e071b1cc5ca511e2bce545fdeb0fa02795ededeb47cbd5afde5997040117" + }, + { + "blockNo": 1192000, + "hash": "411dfa25ca133c5d1e1e9a1827711628ffc7a8738fdf2fd30c9eca98c41d809d" + }, + { + "blockNo": 1194000, + "hash": "f8381023da2dd384c881d8827c274fd496ef03751d5feb87feb1d72619cd3d9f" + }, + { + "blockNo": 1196000, + "hash": "b5cdd2e38ce513f3482de279e5611a21f0a6322f94e171b47094796cdd46ccbf" + }, + { + "blockNo": 1198000, + "hash": "fa12e49f583ce94c05722ca60c613a79ce7599e0ade9049fca71ee6476b3276f" + }, + { + "blockNo": 1200000, + "hash": "97ae67d7bec3c4705e9e114e980dc4337c60bbc585a8177731be9f3d3dc1f63e" + }, + { + "blockNo": 1202000, + "hash": "35b4d3740c38e4ba9fa32f015e490911261f261180d4b9093a66959dac916e56" + }, + { + "blockNo": 1204000, + "hash": "1c89cf4f690592d2fdaf91442e6c63303ed263b6a122efa55e860eda8cc628bc" + }, + { + "blockNo": 1206000, + "hash": "12f6f06ba124f61f37e066da6917336bf77ea0fdc850f8d9f7a96706f8161aad" + }, + { + "blockNo": 1208000, + "hash": "58a069eae7cc7e7e4a935e6985d57f3bf1ba523c8ca6b0e6de25712b3d168072" + }, + { + "blockNo": 1210000, + "hash": "0a6992879dfa3b93c19240d38ac5947333746662b872f9f7dd735cfa22a88992" + }, + { + "blockNo": 1212000, + "hash": "3f1232bccf5efaafefe86edda3819aa8ec0ce6587cb2b4524c5ed5004e0719f5" + }, + { + "blockNo": 1214000, + "hash": "dea25d69c64397a8b0e7a405fcfec597ba045a08c6e6e28d31b3becef8688d82" + }, + { + "blockNo": 1216000, + "hash": "5d1a642cb3d912df558a5c9614a76a107b36ed799dbc74169a168aac11d4a4be" + }, + { + "blockNo": 1218000, + "hash": "832c8d3d420da293e22e31f3ab8a2b006fd6ba4e389f0a83de2732af61b4bd0e" + }, + { + "blockNo": 1220000, + "hash": "3916d271d2a330836c8ca114e1a766ff5ba87f99233627a71c6ced9fdb169c1e" + }, + { + "blockNo": 1222000, + "hash": "9713caacfbb3b8ec04d7fa25c5d7ead0eb8749bae572b643d5a56912140a0d85" + }, + { + "blockNo": 1224000, + "hash": "073ba5168964ecaccfcdcd9ae5341a9515d7070be88d1182d7ff0955ee03daf6" + }, + { + "blockNo": 1226000, + "hash": "9c5e4e494769e4bc7b29467902e7531cfdfd7776e4215befbca1e6ca66572d4b" + }, + { + "blockNo": 1228000, + "hash": "03f2150f982b53dd24b55e1b957bd6172ed0c7720d773c55ce685fd7865440d2" + }, + { + "blockNo": 1230000, + "hash": "f3b7f380fc2c9631acddd822195be89195fd94ca68bc69b4aaed32200991f77c" + }, + { + "blockNo": 1232000, + "hash": "a233c9d01a6a5a9e51efca2f7a23f1d1a200af5fc757a20263a0792396090a23" + }, + { + "blockNo": 1234000, + "hash": "78ea42280b1c9cbba8504974e105f66c61f58ae49182f1f5cb269d28cb045746" + }, + { + "blockNo": 1236000, + "hash": "7332e15f7d05d10acfbdfa47cc1df6ea1cb4aa71b2f8be2e9005e9b527fa4751" + }, + { + "blockNo": 1238000, + "hash": "f42c8452fa323d74b3fb8d0428bb573bed26158ddea58f524ec31ed4ed75d955" + }, + { + "blockNo": 1240000, + "hash": "6e382b21617eb9087b5365b41aafbbee4d9121ad7287babed6c3a749114a08fd" + }, + { + "blockNo": 1242000, + "hash": "3a406874e1394f23b081f6bf24b2bd9a27fa4c086288b77704459a1408054982" + }, + { + "blockNo": 1244000, + "hash": "8214dc26e423ab0e55f6999a5e5a4bda480cd99d10682d41c91cbff0f118c46c" + }, + { + "blockNo": 1246000, + "hash": "10d7f04c512cd2e58ff7e670aee86fb3be8ab700c1df3ac8b3873539e0fe228e" + }, + { + "blockNo": 1248000, + "hash": "51e0f1028baa7c2e0353bc4c50efa81df8c2d37b5f5b1f532a4eae0704bee21f" + }, + { + "blockNo": 1250000, + "hash": "ab8b22700da5171ae451d35cfbb39bb8082a3dfd8b3855a9ff52d35636ee8685" + }, + { + "blockNo": 1252000, + "hash": "9b85ba196b1e17b326ba410626cecafed05e1d47537e689b57611a0004c0bd12" + }, + { + "blockNo": 1254000, + "hash": "475b4415017806b02b9b9de93d7c945d1db18952c688fc7a93fef4ccd2636db5" + }, + { + "blockNo": 1256000, + "hash": "be7cd7b6cb612b398b68bb44125490dd5cad986f04896acdd6b5156f80b85484" + }, + { + "blockNo": 1258000, + "hash": "458ef565dc68de0acc76afe1067ad1847155ec2be1675776314982884a318920" + }, + { + "blockNo": 1260000, + "hash": "8a96354010da96c18522d8cd9e65897bb2f131b81e692a313fa9f36e1d5c69d8" + }, + { + "blockNo": 1262000, + "hash": "98c7f0a6ce39a2eefb2e2e0f306c188ec0ff8ff65ef93f19c9bbe996786ef124" + }, + { + "blockNo": 1264000, + "hash": "6465138e659a6765f456b3d93c7767676cc35317766742d608b9491a2d631697" + }, + { + "blockNo": 1266000, + "hash": "d769ec8a12ee297806be6a8cd40ad251d1fd4938b16ae8c2cea70e47fe0a443e" + }, + { + "blockNo": 1268000, + "hash": "0854cd60be15ab1bfcb683edaff29056b04bae364a8aa0e8aad8dd6868efb275" + }, + { + "blockNo": 1270000, + "hash": "d3b8824c84a596b2abaf69fc9e607a088f30be503dc5f7c1e6e1e095bce6aaf9" + }, + { + "blockNo": 1272000, + "hash": "9956c866b54efec97493f89ba4f012f71a8e424717a37b829264cb8949c87d05" + }, + { + "blockNo": 1274000, + "hash": "aaeddd7ee0500bc691338a572153d3a8a2f8eeef9a1416db73b3231a5719a4bb" + }, + { + "blockNo": 1276000, + "hash": "9324a6cfd1ae3ca25b6776ef20b241f27cb404bf18732cb2ff2d326e2c2b1100" + }, + { + "blockNo": 1278000, + "hash": "deb6ad8b16fcad7153ee266090c09011c43fc985cce729a161db5981b7c62c2b" + }, + { + "blockNo": 1280000, + "hash": "4db104ae45145b4619b2db19fae4aed41bcd76382afbae02a9bec680001d28e5" + }, + { + "blockNo": 1282000, + "hash": "a4164e6e9c750e799d4819f910b303922f21ed145560a00259c53c71f46bc282" + }, + { + "blockNo": 1284000, + "hash": "ebad91f87950f7ef9bfe6e804097a6f985b1124de9046c6497117abc889f9f31" + }, + { + "blockNo": 1286000, + "hash": "fe1e77b234ba623822a5ab96863abbb667df19066fe4aab9dcc03dc20866e1e6" + }, + { + "blockNo": 1288000, + "hash": "8b2df02ca9891e682fc2bef3567e3882f85bdc36b779fa0d60f5ed5500d73927" + }, + { + "blockNo": 1290000, + "hash": "9f10e3faa51bd13843af02935abbf3d26b6aa7a7ac4f658d57a8309c850c5909" + }, + { + "blockNo": 1292000, + "hash": "4d327451f6d31486855064b06e06954793848eb9b6c72e4f7980bb4f900922cf" + }, + { + "blockNo": 1294000, + "hash": "37b043eb6ca877dd833b072212ab5d56d6bd39cdfacb216a4d0c171d24567d4f" + }, + { + "blockNo": 1296000, + "hash": "6d3be10343fd4ea97e2b5925dcdef82b7d286a015d0d2416792cfa29aac1abce" + }, + { + "blockNo": 1298000, + "hash": "2316055aaf50ce6a3d784a5718c530bde071341c8bc3ea9f6f9ba882e5c25a91" + }, + { + "blockNo": 1300000, + "hash": "3423d80fd880a95a7e386a3f8ffb47b56175f2660f482d60fa0e37e78f5358e7" + }, + { + "blockNo": 1302000, + "hash": "42c934038315f2ba4c71f7f8e010900446762abe6175965bd3112fe3b8502225" + }, + { + "blockNo": 1304000, + "hash": "b70d937939b52fd1ffd0d6491e9d3db47f79ea4647552429d3f60bfdde1eeaa5" + }, + { + "blockNo": 1306000, + "hash": "f40d41f06ae57166067e19387972a6f140913c1f0e4aa224964d4169c101dddb" + }, + { + "blockNo": 1308000, + "hash": "78a72c2dab59a0c1c6d4eb7e3d098bc24b576d4fa8e1804720d70090e8fe868b" + }, + { + "blockNo": 1310000, + "hash": "987d48298b5fb22bcd48da5641c7e93a2570a4c9abab9650be9fbbd500eb79f7" + }, + { + "blockNo": 1312000, + "hash": "7682436102177a74feaa863ccabc973760d482c6a7ae05eb965488335a03b514" + }, + { + "blockNo": 1314000, + "hash": "7c4c45ee38751eaad4c57cb5635f8374dc173271392edc907d915d65834e9d40" + }, + { + "blockNo": 1316000, + "hash": "b3705698e6453e14eadfcdc0376a05c346d0e35bd0929deece503c884727ced4" + }, + { + "blockNo": 1318000, + "hash": "e99cf30c7b2422be0fcc35c2e7b7bf1f591635a12307f20e8d4ca848fab1564c" + }, + { + "blockNo": 1320000, + "hash": "0861cc82aeefce2c3af4b2f2406f6050eedd5f51b84f220dc6147cb2898016d3" + }, + { + "blockNo": 1322000, + "hash": "1df03e2a4749c6003e63a605937319a55fa71a411a7127fe2f2a8320294f4479" + }, + { + "blockNo": 1324000, + "hash": "a8ab8ae4eb565182f664068ea1836ab57390bd31e73373c7b34f3655d4c311f3" + }, + { + "blockNo": 1326000, + "hash": "159a54458abdd1f9acfa735188d6873594fe6834d961d475a05a1e9d93082ec8" + }, + { + "blockNo": 1328000, + "hash": "6dce3270f56f1861533b4106aacfe253f986a1a98e1eb953a86c65ae17e7f93f" + }, + { + "blockNo": 1330000, + "hash": "cae8bd9500e2c8e595bc8517d0f1d848f3b08d274b82817d7dda4212fe9967f1" + }, + { + "blockNo": 1332000, + "hash": "5f407a64a28df850d8f15a3e8f9d2ed34541c54c5fe2664b2654e913302dd2be" + }, + { + "blockNo": 1334000, + "hash": "3cd17a0e2d30e0fa7c9f68e0b42c558bbe1f2d21c523068077f88d6093689854" + }, + { + "blockNo": 1336000, + "hash": "a32ffd967e6b9ee75646e6794a35a13ad80fc0eb1770e70cbe1729abe6757e79" + }, + { + "blockNo": 1338000, + "hash": "3df83d380ab9aa369ae8d4e8df280745f579bfe955a175793a5eed17cae243f1" + }, + { + "blockNo": 1340000, + "hash": "1591efb054d468359a248a46e2b64e910c3cad1751e11822757e9499df0da75f" + }, + { + "blockNo": 1342000, + "hash": "678b9ba7ba0ba54e69fe47df0fdaa96678ea420bfa4c16ef2f525d370b4e9439" + }, + { + "blockNo": 1344000, + "hash": "cdb6b5766c9b52063836523a1a5aa2c12ff6dd9c3d1619ebb193e5ff2361a46a" + }, + { + "blockNo": 1346000, + "hash": "edebceed49457a7f412f9eaeb28c1357c701478a6dc2653ac45b7ca2de498510" + }, + { + "blockNo": 1348000, + "hash": "3e4feb142ff38cda0fadd6aa582f03b4e2cd8eb6f0b504a0884f119e8aa1f189" + }, + { + "blockNo": 1350000, + "hash": "dcbf53bcf7e5b4e0c62ffd7d9f3c98bd2319aa21a6aee70200890d3870932f4e" + }, + { + "blockNo": 1352000, + "hash": "096d6ca01e6e7b3d4180465c6171f0efab82a53c54c2327a214c1cb88eeaa3c3" + }, + { + "blockNo": 1354000, + "hash": "23ab9ca7aa8493481c2d118d0c390fa5fc51b1066dd8b05e8d2ec95bd5952d88" + }, + { + "blockNo": 1356000, + "hash": "b00becd74a67caeb6d6674769fc494409e3caac8bb3747803bfbd24a23452456" + }, + { + "blockNo": 1358000, + "hash": "b929e54997a21c3543f69bf64c002573f52f1dc0b0d361e0801ff457bf86b79a" + }, + { + "blockNo": 1360000, + "hash": "fe3a3d1cdc356eee440fcc629383d044359605b8db2bf0f139ea89824a06f126" + }, + { + "blockNo": 1362000, + "hash": "a4ec40cdff28e37c2d19d6387462a3ba57c78b5bbfe8c4efb43ceb00f3ddaf55" + }, + { + "blockNo": 1364000, + "hash": "5ef6bacb1682ab916c5927c1859202502e08d0c84c0876f03fe0a172a1593b83" + }, + { + "blockNo": 1366000, + "hash": "7ec6601119580e483260e5ae6f985437e1819cea6e315bc1774da41a66a83a62" + }, + { + "blockNo": 1368000, + "hash": "282e779c8124160f0c11f31c0666bcf5319d872f73059be1c8e0e10e9cefd8b7" + }, + { + "blockNo": 1370000, + "hash": "474d6276a2beafc5733266d208a037e5e59f133f25c58ada96eafa160b89d24e" + }, + { + "blockNo": 1372000, + "hash": "8d8784901061825b4000fea894dcd8012532c9737dd5a300cf24f7bbdf3cbd4f" + }, + { + "blockNo": 1374000, + "hash": "586d4e6611b737ccfb0e4a5ed8a45c5ea32696226e4308c199003b36470ef7bf" + }, + { + "blockNo": 1376000, + "hash": "b7e6d9068a370108e069fdb4e5915d0cfa29b45fcc3ccf140299f402e34f5ab5" + }, + { + "blockNo": 1378000, + "hash": "ec35de41d3c4d733ba9f126713f8841876e2491f757cfc0f1a78e69ad8ffe79a" + }, + { + "blockNo": 1380000, + "hash": "d1df2f1fdc4ac1f827bc25f59cc809830e609ca3bbb567d56cba46d86f068fdd" + }, + { + "blockNo": 1382000, + "hash": "888f64c907aa3ad69a6432c1af2f3bcb8cc84a96d73604a14eabb1b0c792a832" + }, + { + "blockNo": 1384000, + "hash": "fc3ce5db92c50e7bf9c37c06ea46c05c5d8075ab14627fba6c97f87ac103b73c" + }, + { + "blockNo": 1386000, + "hash": "f6b09800fe5b435c69d7c1e4120b83f229d5328240e32ded32f1d72dedb117b9" + }, + { + "blockNo": 1388000, + "hash": "79a97a1e737cb35b4cf3c8a2413895e5891378f26550aeee4d1171b614ba430b" + }, + { + "blockNo": 1390000, + "hash": "4203ab8d49e04b3300d204c7b054268e35d26b85a157184844e9d0dbd3d282a8" + }, + { + "blockNo": 1392000, + "hash": "cb8fa1dee1f029f27ec45bfd96427b7dcecf5c427baceaaff2002ad6da24b490" + }, + { + "blockNo": 1394000, + "hash": "f6a4ee12e93cd95e07ca6dafdf17ef39dcdf403a9446e35cad73f198a3c44d60" + }, + { + "blockNo": 1396000, + "hash": "b0fb87aaebf3c3129b64f7ea0220966510bdfda44e5ef2bc1132f0ba0ec4d4b1" + }, + { + "blockNo": 1398000, + "hash": "957ffb6e792b952e787329c21fe49c7bfd803197c1e31ad59ad7445195119fda" + }, + { + "blockNo": 1400000, + "hash": "d311ca79e0a7f614c803be60f6f60873db393c583dd9b051dfbbe1e33c73265f" + }, + { + "blockNo": 1402000, + "hash": "951dd090808c2eb0101083ed7f6ec9b0abb1b5a896c3ea7cd82e068e5ef1e538" + }, + { + "blockNo": 1404000, + "hash": "00dbb1e0de74265e9971105ccbb46a1fb7795216e6c415f3e5f4a3aa8349e4a3" + }, + { + "blockNo": 1406000, + "hash": "4eb75db7f791608bd25870a58a9f9eea94eacb2ddb09e84dd9ba3f4d8fd313dd" + }, + { + "blockNo": 1408000, + "hash": "4ee31ec46e263bfa3dc965334b204d17212b71afe9bb1ca9f0e84c3fee34fab9" + }, + { + "blockNo": 1410000, + "hash": "6d34a5266961ce3f3642249a0095d8fe6155a8b6b4a85cb8d6b044297119b260" + }, + { + "blockNo": 1412000, + "hash": "c74d0b4e06bbe31ed6d4e736c6b1c0dae611900deb7900b77c25a41236f509f2" + }, + { + "blockNo": 1414000, + "hash": "2ee59ba3c1d80c42a7ac2b591f377ee95b20771811b9c9ca3912be0611b6e62b" + }, + { + "blockNo": 1416000, + "hash": "39ea4944cb31aefe1308cdfc1a7acb2c07fc1c7a1c477267a93ccdac035983b6" + }, + { + "blockNo": 1418000, + "hash": "af14272f19c0786c2dae1c64585b1ec9062afdbb3797269ffcaadf99a94d2142" + }, + { + "blockNo": 1420000, + "hash": "e53422663b30efb402d44391c004884201457a3afa112c832043dd4c52eefa2f" + }, + { + "blockNo": 1422000, + "hash": "ed8fc8b395214768fba3c66a1bc6a8ae949a86c7747e3ba6ff7262ce54eb9fba" + }, + { + "blockNo": 1424000, + "hash": "f406a9b0847a85c9094532775b74deade4cb2ef2690ef51686bc2b5d7db68c59" + }, + { + "blockNo": 1426000, + "hash": "16466b2f785386726e2f7568ab33e030e19623bf2248c5780934a82d11515aa8" + }, + { + "blockNo": 1428000, + "hash": "8e25d9b2b73c329977b694d428d95df98751ed688b719b0f288c9dc4099256b6" + }, + { + "blockNo": 1430000, + "hash": "3156096a6d9dbff403642fbfa4baed8c2a95126edd7ea1e864e7892bb5135972" + }, + { + "blockNo": 1432000, + "hash": "b40780cf79f927c95c6d36e11c28ea30efe6436fb47e4ebd7e87ccf669c3c42b" + }, + { + "blockNo": 1434000, + "hash": "af00c447e434561236d03fa9b9b30ca0415c94732ef40cca8288118fda9fa65d" + }, + { + "blockNo": 1436000, + "hash": "25695127793bcef3b9995c7b019318ab28f6f3e36a14434c728e3626f622966d" + }, + { + "blockNo": 1438000, + "hash": "10f45152f6beca0a8ff2fd1e0936415330307c14ffe655e7649373bd8afb242e" + }, + { + "blockNo": 1440000, + "hash": "fc191989164badfbd189f6ff5494329527ffcde9f586ddf14b18610dc36f5401" + }, + { + "blockNo": 1442000, + "hash": "96523b852aaa591603b7136244105bb3727452f58ec798fcf29cf57390c8a763" + }, + { + "blockNo": 1444000, + "hash": "807135770e4ff404bbd44ab91f89f25965bb9eb9e2804b46ddec01011258ef94" + }, + { + "blockNo": 1446000, + "hash": "df4ffceed6ca4093f840cb01034865509b90a1ae028984fc4e5e524026941942" + }, + { + "blockNo": 1448000, + "hash": "bc347ad23101725a9062970ebc30fe4ca084255e450f5656e952e7a0754a29f5" + }, + { + "blockNo": 1450000, + "hash": "b747cab78a741239d4327af6a78582f34395db04f8c64e357e7dbc3980844f70" + }, + { + "blockNo": 1452000, + "hash": "7f886ddb750a861f1d0b238153bb91efc7715f4c1143a21d9795ec008d0ad6b1" + }, + { + "blockNo": 1454000, + "hash": "79b70946752cfd0f9c714deed685c894e4a60510d4a3a0f746f2e8f8d757a3ee" + }, + { + "blockNo": 1456000, + "hash": "f64c474829f0c589f48f88ad0d518b2e3a269c076588297919a1ed0fdd0bdc56" + }, + { + "blockNo": 1458000, + "hash": "14b67fe07ef8183b7502c6afe3d27be71952666a8327b2b48060f1742be0119f" + }, + { + "blockNo": 1460000, + "hash": "4ee2d7a76b0c565186d203562bc6171444da9dcc7f51d8779f9ab2751bcf72b2" + }, + { + "blockNo": 1462000, + "hash": "da31207eb8719f5d111cbd4ed921821ccb702fc38a4aa59453a2f3b47d8154ba" + }, + { + "blockNo": 1464000, + "hash": "6d579ef991624d82684c1173755f32cf6575412089976b79e8bcee487e90ab77" + }, + { + "blockNo": 1466000, + "hash": "b5cf8d18d1f7a2373d35f16c3005a30662349fb4e4ec099f1652fc5160e13679" + }, + { + "blockNo": 1468000, + "hash": "d9ec60acc1c958ce606fac516dfa77a2bc02c6abc25cce40ebbae313c6a95200" + }, + { + "blockNo": 1470000, + "hash": "ab3c41012761c38f115c7c8e8603c00bcc5a6d53fa8b04c9a88933a90d01976d" + }, + { + "blockNo": 1472000, + "hash": "7d7b60afe47da45a7f371fcbd7ea7d5ebc707ee2766cb6a140e8f898beaf4c1a" + }, + { + "blockNo": 1474000, + "hash": "8ae3560883b9f1c0a78f971155910c3be008ac0812b0a7c79fd7a153f54e690d" + }, + { + "blockNo": 1476000, + "hash": "441b37c77510734d596f2491a6c43bab4cf603d1365493a080b661137748fe23" + }, + { + "blockNo": 1478000, + "hash": "e7af6802ddda72cf5014355d559f270bf17303b1899df6e01b14a9b6c1a3b8c7" + }, + { + "blockNo": 1480000, + "hash": "d8e3dfdeb5f0d82e82a366895fc0f0c22ac1e701fec1bb24f04a0690cc8d978f" + }, + { + "blockNo": 1482000, + "hash": "9b038aadc9cafe17374d2c63bd94a5dc1780b593740fd8e490feac84f2d49724" + }, + { + "blockNo": 1484000, + "hash": "fce4d78cfe155b1f1ec5768935f2503e3bf95e3ad61d84de4a16ae0b9cfaef5c" + }, + { + "blockNo": 1486000, + "hash": "03d8dcabf3ede4c5325335e2a6e543de3faa6e2ee1ddab7b4ac99d35a1eaae23" + }, + { + "blockNo": 1488000, + "hash": "da94eefc4eb072c86597fa68c43b7131d9a3eec0a69c51969afd2044a0d7961c" + }, + { + "blockNo": 1490000, + "hash": "72a6a24db8e1a14851a85ffa33c60d5525b170fd9a329123b557341904d0b36b" + }, + { + "blockNo": 1492000, + "hash": "489ae9009677279d61280e05398290453eb4388b4a01ddcebdc14bc0388adfbd" + }, + { + "blockNo": 1494000, + "hash": "601dc699a997a582b9f36b72a719560afd4bdfb027e2789ecd5ab6b103a5a478" + }, + { + "blockNo": 1496000, + "hash": "b3dbcce20bad5d1ccd1a9c9705b5d7b1f33bfb6dcbbc69468820509ca8c6e59a" + }, + { + "blockNo": 1498000, + "hash": "76408b7f70a112e1c9b361fa8871b972a8d86cf2298951db67b4ce5628c35faa" + }, + { + "blockNo": 1500000, + "hash": "726ef8b90b045ae17ebbfbd91010a3f564f9bc15ac567d56287f5f2c9d33b2dc" + }, + { + "blockNo": 1502000, + "hash": "c573e4b1b165f7f602cfa02a6b9a40582747f5e6879c22a150999bad38c1710c" + }, + { + "blockNo": 1504000, + "hash": "fcd0cf30d68a8c14e225e372558cffcddc44543c03a86004e78d4d701e9aae14" + }, + { + "blockNo": 1506000, + "hash": "c52afcfba38ce20cb2e315fb7fd0a4be5b79c29db77caf963f7e8a0d6a3eadf3" + }, + { + "blockNo": 1508000, + "hash": "e7f9ff2bd4c249cbc3d1f9ed6f0aadf5ab8da05bfaa31f3b73098c383951722c" + }, + { + "blockNo": 1510000, + "hash": "84540830b3bebf138078beb18a0afb835d0c67f92a16535f3697bfe13e47d03c" + }, + { + "blockNo": 1512000, + "hash": "ac20827dc6ba3dd95338ae63d7f091abfd3d9115dc3c1d337f9b32ef585c7747" + }, + { + "blockNo": 1514000, + "hash": "f56c85ae3970a474e093aed7e9cda9d3a70999b6104ef6938e6885c2a5f713aa" + }, + { + "blockNo": 1516000, + "hash": "3dfac04cd1713a3f3d82471c014d91d406767feb72811eb5a405cc1c6b6b30fc" + }, + { + "blockNo": 1518000, + "hash": "cc211c6bd71f49b464f0e055ed8417595f6cc67a5fd88dfbd9efb945e46cb717" + }, + { + "blockNo": 1520000, + "hash": "703750c1fbdad8581b96523c4f835fa9d4209b3f25fd4a02ebf1fa81394eb248" + }, + { + "blockNo": 1522000, + "hash": "51befc81032430704c8edf747180bf37659830ee44705ec32d6303613a9e2650" + }, + { + "blockNo": 1524000, + "hash": "b7f8b89b02800162aa2f925d588e12824911ce90ec8388af01d5792d16aed948" + }, + { + "blockNo": 1526000, + "hash": "41ad044e84d1d1677cb1ca09241cf7a46b0ed2b116f9db009304cd3d9f8482f4" + }, + { + "blockNo": 1528000, + "hash": "21a3c88585b48e7b8f05d8f2bd913d1c34ff9ce806d52754d9601da3a75874db" + }, + { + "blockNo": 1530000, + "hash": "22d4d9b224c117ef2bcddba50519902621900496dc1c5f27e40dfb2c07b0bba7" + }, + { + "blockNo": 1532000, + "hash": "d8db95a3a8cf121487f12180462bab339dd975f0eca98f50a959bf65b1de559a" + }, + { + "blockNo": 1534000, + "hash": "5278bfb1f67e6d545a19dc1bd6733e5c3ac67c391c36b947691948fd29f2adfd" + }, + { + "blockNo": 1536000, + "hash": "0b31812c9cb77f623273bac0f05f62380ac8543c651bc646b279ae7b42f69199" + }, + { + "blockNo": 1538000, + "hash": "c8dd07a651a01f5407fcbc4b0e4a5fbae2e82d7edaf96259769a0909099390c1" + }, + { + "blockNo": 1540000, + "hash": "64898f5fbe06be68572e98b614adba2fbfa2d1f118e177b12cc6ede0f28922ae" + }, + { + "blockNo": 1542000, + "hash": "c641bf883070e5a7c9025c0c2a57f2a17eaf37c18b149c9a0514a34c1ffa2f2f" + }, + { + "blockNo": 1544000, + "hash": "16837d29cb387bb837878ec91fb830a6a9b331b795cbee28b896b25b8e7f97b6" + }, + { + "blockNo": 1546000, + "hash": "3c2c85fd89e6390c8fec7df874a4876f47e4d3c43dbd7145a66186b8ea06144a" + }, + { + "blockNo": 1548000, + "hash": "d910a71db9ed74970ccfb905e435a1ea66c0b3f70f49a528163927475fc69789" + }, + { + "blockNo": 1550000, + "hash": "f5918549a65f86dd1aff5d9bfcbd344556d5f9b0d8a4649a3309aa278dbcc757" + }, + { + "blockNo": 1552000, + "hash": "3379a6512af53b76ecef1bab90187012ce01167737e6f8006bce8ff940ef1322" + }, + { + "blockNo": 1554000, + "hash": "b84c9c2c16646f53610b25d1466e2e94957c2abb4e2c0d1d803ad17827623996" + }, + { + "blockNo": 1556000, + "hash": "c3c26cb35f0983877f5fa5160a6e0628bea74fd243e2132995d55a94b547daa8" + }, + { + "blockNo": 1558000, + "hash": "78b2442eb82b436eb27a65d3c480d9b506c3077f2f01854cbb62dd8c8a8a2f75" + }, + { + "blockNo": 1560000, + "hash": "7d0673a22d716a07f7ee8221505b07856f2491446dddedaf58bce3e3b21c251c" + }, + { + "blockNo": 1562000, + "hash": "b7302172770dea3cebb318b14b5be412727ba73c8019e0bf897d3e2ddcbd7e90" + }, + { + "blockNo": 1564000, + "hash": "44e563d13200b1badcab700c7f41893f05a17c29428c36fe6151fdff45634787" + }, + { + "blockNo": 1566000, + "hash": "1480e3b336f6ef15a479973882887eda4c56d2d18f3b66b67cd148bd490c025d" + }, + { + "blockNo": 1568000, + "hash": "b73c28ff449efc40d9252306c923be29b236a86877a21979e646e8ac9c50dbfb" + }, + { + "blockNo": 1570000, + "hash": "8463ae8dfb2655e10809b6176d15c8b278f08f0cf6aa058639e398c7a1c2beb6" + }, + { + "blockNo": 1572000, + "hash": "83427faa7827b721057053d563341f81132fa13d4205b409fd8e5316a56e98b3" + }, + { + "blockNo": 1574000, + "hash": "26775ad99b897239cd533d41f33abdb292c94c6914e917935f0da4172da63953" + }, + { + "blockNo": 1576000, + "hash": "f6fdc24bc81a8d4a0f7214e2d716cc1aa1c9208509f606663ada5a01835ef4b0" + }, + { + "blockNo": 1578000, + "hash": "0f99eccf32ce27a103c015a64c243209857095c5fbf6d277663f199e697459fe" + }, + { + "blockNo": 1580000, + "hash": "7df5f983996234b391d0b273fe880dd11987d047f6aa5360e4ac5eefec19b530" + }, + { + "blockNo": 1582000, + "hash": "ba2fc641bb440d3a79b8ba85b30079c82acc8569931a7f6495b18f3ea404c306" + }, + { + "blockNo": 1584000, + "hash": "98ac5141cf9b59d5d8ffa398475c61bd2f54f28a0d9d93179ea20ad957ee0291" + }, + { + "blockNo": 1586000, + "hash": "72126b03acd5ada6ec41d7f51ff1189cd43146126550ac6ac0440e46e9f6b763" + }, + { + "blockNo": 1588000, + "hash": "9497abd7935cab3a79bec0fbcd7fb1b58d9f2f26a70bf14516d299186af4d86b" + }, + { + "blockNo": 1590000, + "hash": "57a89c70a8b26341da9541ff3c08d1f73963f0a3935348a675df1f3302898098" + }, + { + "blockNo": 1592000, + "hash": "9b3568234b5d60b129a5fc1d27ab2601c58ce9fd712139b59dbc317c41d2c3a3" + }, + { + "blockNo": 1594000, + "hash": "75c51ec9b1d413018d5fb27c3c4bd8f053d263278b10909b3f1287355e2db456" + }, + { + "blockNo": 1596000, + "hash": "05b6d097cbf2c3cee45ba41c695488678f8fa2786612af2669109fdec56133fa" + }, + { + "blockNo": 1598000, + "hash": "100246ccb7da684ea6f2cd9d62cc63a5980d42f354425bb1693e17b6b17595ef" + }, + { + "blockNo": 1600000, + "hash": "6dfe0569a9b05203a5ef57f68b514b3d1133f02e95986d1aa438fed2cb3e0ef3" + }, + { + "blockNo": 1602000, + "hash": "89b9f5b8d3b467ced2c58cffa46c18c289448029226be23b1833614cb3e3ad01" + }, + { + "blockNo": 1604000, + "hash": "a3b58b05cd0be7c1feda95664ac497159a0c70dbad4a0f46858aed74381ec974" + }, + { + "blockNo": 1606000, + "hash": "1eda07333b794e2e0aa6f08991c5471a3a8468270c3012583e53793407ee9b67" + }, + { + "blockNo": 1608000, + "hash": "83cff4fc9e37dd25eb61e3d483b24247d57bac4873b9532d9c511cb1d73730f2" + }, + { + "blockNo": 1610000, + "hash": "e0c654065ec5e05ba555c8f6930fe4bd5867d3ff9ad2537eb871fe7fe7923ba1" + }, + { + "blockNo": 1612000, + "hash": "52cabea06626e0855b4840d1d32135eb37960cb08bcdcc550c47f1f77a84b980" + }, + { + "blockNo": 1614000, + "hash": "252b92b69608b9b9e3c6d84966bb4f3ec9615028b557c0c49efef1a064970b3b" + }, + { + "blockNo": 1616000, + "hash": "9f35d8897f03f5ff739784261b433dbabe1f818e11e87a9df607c34d3e40c0e6" + }, + { + "blockNo": 1618000, + "hash": "55bcd1d0b3d332383f3e150c527ebc30bc031fc2f50b5e3a4ddf88decb13330d" + }, + { + "blockNo": 1620000, + "hash": "4ed3919e95fc8e86d585e046395130982f1b84932199edef80ec42254d2c3006" + }, + { + "blockNo": 1622000, + "hash": "29fe8e20ba542e130de3ec7e229d03a310d8c3eb008661a0411cb08b6c6721b5" + }, + { + "blockNo": 1624000, + "hash": "1540bf25974da266cd1008588cbe1bd8cc19b627a0d33be0a95c2a11c58cddb0" + }, + { + "blockNo": 1626000, + "hash": "d19d6bed120ca6c3f6b6d7c8d51d9c70034e8f52e10764ba28ac2a17e561051f" + }, + { + "blockNo": 1628000, + "hash": "b673c0bd1179d44f4de1b66767452c9044b98d3fa60731d324feffcfe29a4222" + }, + { + "blockNo": 1630000, + "hash": "f632b53b3d60e5abb8e3ad13e6642134120a2bd446bb6459d0a55d37699a1176" + }, + { + "blockNo": 1632000, + "hash": "fe588ed68da3d202ec08bc4eb769d788a80df3b070111d07c6b795aa855f9028" + }, + { + "blockNo": 1634000, + "hash": "236b4333cabbfd35c5269fe04478eaff6164b85dae3a601aeb0195114728208d" + }, + { + "blockNo": 1636000, + "hash": "785b9d17204e8f8b8cde235dcb1a0ffc106c8a6449ed0da26faed110a90cd2e4" + }, + { + "blockNo": 1638000, + "hash": "e08edb0bdec8037dd67ccad315f06e6e27eb6ed6b35ad6f2659745e9315b7066" + }, + { + "blockNo": 1640000, + "hash": "6db243fc4322075ee313ded6b96f110546c225948cb141070522ccd484ef1cbb" + }, + { + "blockNo": 1642000, + "hash": "3619c9c10f99adc6d56bdc68c4ca1a25a8cd01173408a180d43963eadd8c234c" + }, + { + "blockNo": 1644000, + "hash": "522c5c89ff9a1da5d7191098f5598192cc1e640402014a58d2d496bf04ad4709" + }, + { + "blockNo": 1646000, + "hash": "4395172897bd1ba52324a204f75827cef5fdeef358f124e801c223b1a5fd9c63" + }, + { + "blockNo": 1648000, + "hash": "230271717faff489e4e5d035412bd043596efe3ac511eeefc8f7a3fb919e1fc4" + }, + { + "blockNo": 1650000, + "hash": "7c93bcbdabad43a9098b61618d2d13e6f28c7106fb9b8d5c5ba9c184830c1730" + }, + { + "blockNo": 1652000, + "hash": "fc2373495564b1a0b7eb5d8e74518d966f84c17ab3f39d0dfd836090be29c2d6" + }, + { + "blockNo": 1654000, + "hash": "7b8105db556e63f5feb1613a9c32c8055c19197b9a6b42f3b9cdce9cd98064bf" + }, + { + "blockNo": 1656000, + "hash": "d866a76267723e8c68cd5c2c04c1ee291ac91dc9c4d60ba35a8c7bb35e2d94ad" + }, + { + "blockNo": 1658000, + "hash": "21af483554d95aef57d187b7f6944d523a0143c0a6459042677addd52186ee79" + }, + { + "blockNo": 1660000, + "hash": "9839264a179416db16acd16a45752c8374553379c2d246a4ac1f43029393dd8a" + }, + { + "blockNo": 1662000, + "hash": "cb6ceaed97b61ca1af104ef7078151e9b88b77e9a1f8335a022ecb4f8f9a0966" + }, + { + "blockNo": 1664000, + "hash": "7a5d4843728296ab2643254d8ccea3ef8787d45e8cb48abcb2ad0f238d05b669" + }, + { + "blockNo": 1666000, + "hash": "12bcb6f46244881237db404b608556baf5958899008a88413d61fbb3b06e17b1" + }, + { + "blockNo": 1668000, + "hash": "6041e5d0a98f5fb8f0c5e90ce0d2ca915fab7b94965ab7482b568b73ca703870" + }, + { + "blockNo": 1670000, + "hash": "7e96379d5cdaee3064d7e95e8419de198950e20e6ca0a4fc83399b0a28a05e6b" + }, + { + "blockNo": 1672000, + "hash": "0bf616d42c3bd5c9b3613e0ab6d18201cb620ab8d109e9db0c47ab59247d2863" + }, + { + "blockNo": 1674000, + "hash": "287cd818e223cf8ed2cf2b5d15baae890bb4eeb547aa99329e60274b5c7ea47d" + }, + { + "blockNo": 1676000, + "hash": "d519168dbd402eff34477fc5d6a3a80a661ca76c8f4f4f95f1ced1ed3371cb22" + }, + { + "blockNo": 1678000, + "hash": "8a698b7b23cad74be96c9fd49b44bba6e0937a23b006f250d35b75adfd69d2c1" + }, + { + "blockNo": 1680000, + "hash": "7a6c8965a33a18d2a0f34338f89efc1103582e1e6dd50fcfd7085666633f7563" + }, + { + "blockNo": 1682000, + "hash": "2e70fa1261a786988c15cbee4c16e41152345c38fe050f0eed989ede7cb2a7da" + }, + { + "blockNo": 1684000, + "hash": "78cb51bab057e2c4e8fadb70454d450e20c46082031f0070028ba6cfef87a450" + }, + { + "blockNo": 1686000, + "hash": "624ea1a71a9f5a29d5f0b47285cef991632fc0a9ae2e1a1fef741a144a916293" + }, + { + "blockNo": 1688000, + "hash": "8f61a1eb2d36402e363a33d22a3d0e55e609953aa332967fecf03b71671beffe" + }, + { + "blockNo": 1690000, + "hash": "318974c4c3217b37ee4787c50d76ba6c09e271c569b5d3f0498c8bb643f29e55" + }, + { + "blockNo": 1692000, + "hash": "aa3f8967dae0bfcf6330f756c7ac62c0fb2a3f6ce491c4760cd057b1d32a25e1" + }, + { + "blockNo": 1694000, + "hash": "c0bf43da4feeb143762f9fb492be2c5d53a3fb25191ec80e0c96cc2be01e3e4e" + }, + { + "blockNo": 1696000, + "hash": "0a44c9e5376791b241139947bcafd2f054fdf34e76eb77f5c85e0b3d4a43dbde" + }, + { + "blockNo": 1698000, + "hash": "d6496d1bec3f0f2d4dd92402f4d5db89cb7ff446dcd306c6f20868e544067de8" + }, + { + "blockNo": 1700000, + "hash": "a51acaca9ede399669ed4bad779527d4fca775a84f42c83d9b9cdbed1a8d35de" + }, + { + "blockNo": 1702000, + "hash": "dfce198a7d3c7acc36588afede4346f69ee533e935cc29ec89f1d3270d3d5c87" + }, + { + "blockNo": 1704000, + "hash": "9e58693db2a9510286b3e75d8040c2b78df4e87ec90b10b0164799fa57fcf563" + }, + { + "blockNo": 1706000, + "hash": "2cb045751384f5a740ee8aa45db3d8af35554822c95c28f65ecde7a6b131fb7a" + }, + { + "blockNo": 1708000, + "hash": "1372cf5efe199022b37ebb8898b49288399efaad72d089218a94b8a26bff8396" + }, + { + "blockNo": 1710000, + "hash": "d1e258343d1f61664ddc036db53a597980ad0a3cb0d95acc17774f3b880f35e9" + }, + { + "blockNo": 1712000, + "hash": "9930a0db4ed5ee035c47e14a24e276126f8bdde544d03935a7fa416a75166290" + }, + { + "blockNo": 1714000, + "hash": "a010ee921d4e96e93892728564009c8e745377bc73d382dc54e1dc853bac18d8" + }, + { + "blockNo": 1716000, + "hash": "370c045ed38ddc16833a9ad6fec11ec6e07b9c5778812107ea5297279f840a55" + }, + { + "blockNo": 1718000, + "hash": "14370f6015b2364da2f11c056a8451dde6a3eb5da625a914f3d9e091e366a036" + }, + { + "blockNo": 1720000, + "hash": "ab327a98e80c082c9bbb00ab050e3b5ddc68ec39523d3b337992cfdd38ba1bb9" + }, + { + "blockNo": 1722000, + "hash": "237391559ec504745d2a2e5eea1cd49a34d48b552cc3428a32fcf8c5264ba6e3" + }, + { + "blockNo": 1724000, + "hash": "fadd494141dff8f5b4e2c4fef74b345982b5463094f67828f6024dd29de8233c" + }, + { + "blockNo": 1726000, + "hash": "9abe61dc5aaa5dafc457048d4fdb326a10b1e1ec9fc9c1f7888910e19831e073" + }, + { + "blockNo": 1728000, + "hash": "0253ab5fa3e83c9008ba8ac551a0c885de591ec04315e3fc3c042454225f377f" + }, + { + "blockNo": 1730000, + "hash": "d57b520a3a31698f9bc01ca6bbf150aa1ca1fade9d2f2ea467ca2263c06a4814" + }, + { + "blockNo": 1732000, + "hash": "ba7fc3a5e111fd6e69d571371ae4837cca8d73a4b5b676a611110ddc999cd8f2" + }, + { + "blockNo": 1734000, + "hash": "67af054b0d0e39476687782c0cb1566fb3be2e951190ac78e5526e2c1a84ed12" + }, + { + "blockNo": 1736000, + "hash": "4c2f95c5382037f958c95f2443bf6de595b8d23949662bd041faa31ae09f6235" + }, + { + "blockNo": 1738000, + "hash": "3394c8e7ff4743f9b5ed7c5036f574871be266789abdb37c6e1f489d2f21257e" + }, + { + "blockNo": 1740000, + "hash": "d37e9eebc24d459b30a7026e2da6fa862a32a783f164c1ae8fc6fec48269c2c7" + }, + { + "blockNo": 1742000, + "hash": "5d2cc783d8aa11579deccf6f9064b851a085b9afb76f946561baf2fcc4446ddb" + }, + { + "blockNo": 1744000, + "hash": "9acd0b349b6643f15c1edd2ba225ead39e53c2748c16070186b5083ff4af6df3" + }, + { + "blockNo": 1746000, + "hash": "83d1778c82b8695430c87987c125fb0ccf330b9b9bca1bc6aec1d1c0763e5c4b" + }, + { + "blockNo": 1748000, + "hash": "00ffe02f481fdc0807f221e92c63b2b8407e04f6cba11bafee9151202594c7cd" + }, + { + "blockNo": 1750000, + "hash": "5ccd91ebae12b53a676df2a31d8f414bb41ae82855bfa21a0c3932e5c0d2ae56" + }, + { + "blockNo": 1752000, + "hash": "9a147b1ced1f95b65ff3fe2f7a41822b0fdd5abccc767f2cca9f5c460ae6cce2" + }, + { + "blockNo": 1754000, + "hash": "4878cd0910141ab884c1966d3cf08619278ea0c86a55e3c47808af033bab0d3c" + }, + { + "blockNo": 1756000, + "hash": "da9f4507119bcad35f50be579da14c01d3c28daf68bd495150faaf09590f79d3" + }, + { + "blockNo": 1758000, + "hash": "3000e788959810f330ebdb6fddf498f14ae890d4e1846aabf1107a7e31339953" + }, + { + "blockNo": 1760000, + "hash": "bdea3b8df1e9b26b4cc5605c096ed331ea3d51e68bc00bd9da5a403db4ff99fc" + }, + { + "blockNo": 1762000, + "hash": "c614e027dbc4476490d8db0adde06a5ea483951075622b73faae1b5a2ff84375" + }, + { + "blockNo": 1764000, + "hash": "ec3a98cb0a58cf859b330a5bdc91d74b19d3ceffd7c145cb6aabec0e1d188fb6" + }, + { + "blockNo": 1766000, + "hash": "2d671cb88fdf6bc86d05d0b9e87402a21aa544e9f2afec4eb7182b0a43b1d6a8" + }, + { + "blockNo": 1768000, + "hash": "432ee91e482b8934e51d7302d86744f3c793a2de07e4a2acc2ae060c9f1a927a" + }, + { + "blockNo": 1770000, + "hash": "514abc610fedc6a776fa15ce04cb99597b126f2aca900f3a867ba586110aee34" + }, + { + "blockNo": 1772000, + "hash": "e034798403c03ae75a1f5962298c788b3c14f5b0ff51af3e590f0b9a35f16b09" + }, + { + "blockNo": 1774000, + "hash": "3e13c6b2963f20a258e98407daba6b39de24e1a1e48956bd5cc6b18b7abbd4d3" + }, + { + "blockNo": 1776000, + "hash": "87fafb49f1f12d51a5537a84dad92e3ecc5ebb41f4ebbe25387f816312419ecf" + }, + { + "blockNo": 1778000, + "hash": "e1e2db397b2a53d90cdfa87efcdee1b5faed50907c02602092f545263da9afa2" + }, + { + "blockNo": 1780000, + "hash": "9e0d6ee88a10652e713cdcb97017e72e2b3c08e167afa664b4003c6d503bdfd1" + }, + { + "blockNo": 1782000, + "hash": "b51818935e8d1e548e7a85f3c6f960a0750e66ad02cc3f528ac50335440df6fe" + }, + { + "blockNo": 1784000, + "hash": "5286e54db300c0a8f89c0481a5a11f42d7e6c13dbafc51dac4b8a5bb189b7fd8" + }, + { + "blockNo": 1786000, + "hash": "68bbdc75bc8744b8d38a01ee7c44db2995b7080574b45e3929f75476caa5bd43" + }, + { + "blockNo": 1788000, + "hash": "ffc3e9f2ff33eb17808a1d5500da5e381613fd22cee3e77ac07bc02067a92b90" + }, + { + "blockNo": 1790000, + "hash": "03004da576ea4b1883dd1ff4b9225ef7808e71aebea80a0fe603d8b56780e683" + }, + { + "blockNo": 1792000, + "hash": "785a8b38412f222c2d00a614c07aec841756b2a6bf5994e3f51d04e44b6d9839" + }, + { + "blockNo": 1794000, + "hash": "585c4feaf60029690962679738f7319553b8201eefe54d1b243dd1b0494a9f19" + }, + { + "blockNo": 1796000, + "hash": "0e78760d9b69e1e2041bd70c5ba745b651e2d8ca0e899a886145a9b045c0a7f5" + }, + { + "blockNo": 1798000, + "hash": "0d7118d7b4d1f875c37c9bdf585ce4a41bf061938ae87c8df4c0ed3691673225" + }, + { + "blockNo": 1800000, + "hash": "c0cd658ae88e7fa5feb9aae3acbab62366e87e96135f8c4c3236af1f5a6c3e7b" + }, + { + "blockNo": 1802000, + "hash": "b786de314468c095c32199a541b2d763f5007e0267b3d4914fb8de2e091d4ceb" + }, + { + "blockNo": 1804000, + "hash": "61bf6ff058120f403cf27458b1329a0627c675252390eef272e4fea99377417a" + }, + { + "blockNo": 1806000, + "hash": "ec8e8ee46dca581b5c2a0f4c087d1f8e5ba453af0a8507f9215ce292233285f2" + }, + { + "blockNo": 1808000, + "hash": "e20dfe17b9ddaca7e9f2f1d0efbcf5ba16ba484f873a9f28ade9b4e4b3502d97" + }, + { + "blockNo": 1810000, + "hash": "c93fef9a35b7d1e4371dbd2f89405d0b6905076ff9e3c30ce52a282270814fe1" + }, + { + "blockNo": 1812000, + "hash": "515e38180dde4d60832d1a90b2b1bd92957f98151f053fff65fca3252162eb98" + }, + { + "blockNo": 1814000, + "hash": "8f18dac4c9a8daf5f041d4f97cf72dbe176e34d70b9288b3de443d6aa523cd0e" + }, + { + "blockNo": 1816000, + "hash": "3db58e876f958eb39cf589b90b353a9339f89d39b1ed18a0d884e79aba5f4df2" + }, + { + "blockNo": 1818000, + "hash": "b91f6ad8f78ca2bdea419477a320c96fde0366c87a783dc6e28a90a9f5f7c5f6" + }, + { + "blockNo": 1820000, + "hash": "8cbcd7d53f5c0221780f37e47c4916df13f5f246ba70a2241648dc1036cb5e4f" + }, + { + "blockNo": 1822000, + "hash": "2f20c814cd55070186e11bb5a477e404f36dbbd045f01f6cd6fb70c232bbf496" + }, + { + "blockNo": 1824000, + "hash": "ec97dec7a0272970fefb743862a868e0c29c3ffc9fd930d0d472e2e6a3110fec" + }, + { + "blockNo": 1826000, + "hash": "4ac113afb92fce6768968dfb0379ccf28cdb58d75ed7ba587102907701fd547c" + }, + { + "blockNo": 1828000, + "hash": "91a5dda040a9f44468e224d5dc6f0c4134f29733e001e2747d04aea531f43bb8" + }, + { + "blockNo": 1830000, + "hash": "7dcf8db75ba8004a3ef1468d9033ed6101bbfbd73fc2a58c99db7cf4637a6a4c" + }, + { + "blockNo": 1832000, + "hash": "265f00485da2cec103788fc40171388bd92e2ec96dea3ed305bedae07ebe0680" + }, + { + "blockNo": 1834000, + "hash": "6577e9fc2cf098d08ae5dd1d3d7c8fc2342543599ffd1dc280612573f4a15e4d" + }, + { + "blockNo": 1836000, + "hash": "e3f6202eb1bd5883968eab95643d7420816a88184e27e766acd729d5d8635612" + }, + { + "blockNo": 1838000, + "hash": "1c48e06f37019f912fa19e7558fba408190f50985e9a726519799aceab8f108a" + }, + { + "blockNo": 1840000, + "hash": "a054f7ebf86d895c8d80714e2357e2fb0077ac916e1130a6b0974326f84c8fe3" + }, + { + "blockNo": 1842000, + "hash": "8edc19644de4fc0672db17123e2480801360f79dc135eec5c32ad2fb1b548f96" + }, + { + "blockNo": 1844000, + "hash": "1d96eded0786496925d05e32c6dd6b4dfff09d1a38ff2b4e9d79a505485ef56b" + }, + { + "blockNo": 1846000, + "hash": "a47c56caba7bf36f3be10b20c69999eccb54bbd566456b0d757fbeb55120d3bd" + }, + { + "blockNo": 1848000, + "hash": "d50e190fbc489057d86ad47d89599769aa21937d7c893fa9d1ee56cc00cbfca3" + }, + { + "blockNo": 1850000, + "hash": "97413ac3aad5c3610d8faff4c6995e87c082c8cb55f3972c7a1485cc266b6775" + }, + { + "blockNo": 1852000, + "hash": "66bac2e7260e4e2379511c8e1e7222d0fb46f4862b9d6688b675beebf31ea7c0" + }, + { + "blockNo": 1854000, + "hash": "42535e700bfea855b54dfaa52d234cdd02839070941674360cc0ef6d8f9a3eb6" + }, + { + "blockNo": 1856000, + "hash": "3bb5f280c3c2a4bf3deccdf85d6b347be28548601897bf8841406f332e6516d9" + }, + { + "blockNo": 1858000, + "hash": "30ab9668e50bf285444f5656975ec2d7e11c08637b3bceb242726c451f57d622" + }, + { + "blockNo": 1860000, + "hash": "050ffbb3f7a878ea4d420495f69d2e80f651c4a454ba8ff3eaffdd8a04104e27" + }, + { + "blockNo": 1862000, + "hash": "385420a52a0340fd28239fbe97f130f43e5e77fd844207e2500123eff3dbe9e9" + }, + { + "blockNo": 1864000, + "hash": "bd30f9dfad16375da791bb7722bf4f0ee810a2d1baf529e951197e1bd8c0cbe8" + }, + { + "blockNo": 1866000, + "hash": "e9e3f91c6ae808c7468c6a3daed623e052febdb0994c4db06f84c5d9e7edee1b" + }, + { + "blockNo": 1868000, + "hash": "b423b41a0bb5680957d3970533e357f74ea893e875673f81efe61e331f72ee89" + }, + { + "blockNo": 1870000, + "hash": "e7c7ea4940cb9e1d059c8da4c738daf68d0804f5e6f97af3bd140ba41ec86373" + }, + { + "blockNo": 1872000, + "hash": "3065fc8fce5b565cdf05e17f966fa5bd2015edb4035866121e74c7be0b8e1fc3" + }, + { + "blockNo": 1874000, + "hash": "70fd45b69c19d651bda44d263271cf9b81d9d14d7e218ad2e64dfd5e91a4761b" + }, + { + "blockNo": 1876000, + "hash": "76bad632ec6c521d771c05bf124f3f683693ee8ed08130355a1c27fc21463e31" + }, + { + "blockNo": 1878000, + "hash": "4af1971eb2e5d2027df87182d20495c80c2b393cfbaa1074b8d3653eeb1b5b8e" + }, + { + "blockNo": 1880000, + "hash": "4e0ce0d0f0d70c3c280b15bbaeb023f2d39a02126302fe9502fcdd4472ea4afb" + }, + { + "blockNo": 1882000, + "hash": "736558b63759c691f230f5d58ddf8b45a6b22ed3465a503fec581070a97a1c78" + }, + { + "blockNo": 1884000, + "hash": "4e606b7e16463b443cc1fd611eedfa1a12f0ac3b49cdbce42062ead867ab46e6" + }, + { + "blockNo": 1886000, + "hash": "8ed366cb5932795b8cc3ac618e0d62005ffec5a3569d2b7eb8d098747be8e175" + }, + { + "blockNo": 1888000, + "hash": "6de8bb7a47fae1106e0ba1dfaf5381dd2ca418d4f0f31637be3ef67c5a728d23" + }, + { + "blockNo": 1890000, + "hash": "d2ef31da71e2f0a2b602dbd1113cb7a5d18b9c8c8a83076abef3869258bf9828" + }, + { + "blockNo": 1892000, + "hash": "c4ab6d72a8804af651f8d0c4a092675ed5b1e268371fac359c5ad2f9b345a301" + }, + { + "blockNo": 1894000, + "hash": "5d517ec27547dfa986bead94855e164e8a380e959faf502483c0f15a4d32042d" + }, + { + "blockNo": 1896000, + "hash": "bd7862a1c66c0d74c37f4cc51a5344916d2fa379961d1f46759e12c0474f0c0b" + }, + { + "blockNo": 1898000, + "hash": "40c4a610d77b3bdeb9f452006d7bb053f9ef18a3d87efc7ea74ac6a12132cb9d" + }, + { + "blockNo": 1900000, + "hash": "6bf82d8f748f109ad50ce9c7806d7ec05d66742a5ea7f0ea660537aa8c60da0c" + }, + { + "blockNo": 1902000, + "hash": "12ae9926e8f4a2a7c11818e1631436dffd39e124ff2eba983f3c72a6245ec227" + }, + { + "blockNo": 1904000, + "hash": "5f723dfdb97a452c64ec32e86b7539eb9ee0798ff45926ca469ef67216ffdf30" + }, + { + "blockNo": 1906000, + "hash": "728f04d896ea7cf22221e01854a266776d95b8aafe1554dee9e5cff8d81b40c7" + }, + { + "blockNo": 1908000, + "hash": "d969bf3a0e9eeaed996724884908762462858546eb062354c65e12e197f89cde" + }, + { + "blockNo": 1910000, + "hash": "154a1eebf59056dea5d724badabedba55c70aab5ce95518b31d35f847e2d22f9" + }, + { + "blockNo": 1912000, + "hash": "8a5bd2ea9f90c979ccec7a2f6f83569562123621b9a03daefe67f3180026815c" + }, + { + "blockNo": 1914000, + "hash": "75e506f1d01b85c0dca49f4b6dbb61139e9474b761925091d70f9b732e202357" + }, + { + "blockNo": 1916000, + "hash": "ef49383f785376ed531a5f9db31a606ff18ff61eda7cd4b047664b5546e9dd08" + }, + { + "blockNo": 1918000, + "hash": "360fe431ab04a72a76ce0d6128a576741b9d82c8656f46dbc5e6eade917b9ba0" + }, + { + "blockNo": 1920000, + "hash": "fc1bfddc79e4fdf6c93331aa66bb07d070d12f1e12c884969952ed1b731f7a2c" + }, + { + "blockNo": 1922000, + "hash": "0f3476f19f0c5109cb91c320d91d27949f3269e9c74397eb2ee4124f46d4bf04" + }, + { + "blockNo": 1924000, + "hash": "0856c30281e067609a52ed5b1bf0f3a9764a6d9581d5bf3e8810c5f5a4f6b854" + }, + { + "blockNo": 1926000, + "hash": "b028591ce586922c427605e56e0c0492f8f8dcfe4d472598870579c9e3eb817a" + }, + { + "blockNo": 1928000, + "hash": "d70c0edf249ec8bb623b20e3548978360973dd3b231f160801e93b24ab09255e" + }, + { + "blockNo": 1930000, + "hash": "17be454f806ea76446ba89cc721475567027d039a5bc5bc0d70182be372154fe" + }, + { + "blockNo": 1932000, + "hash": "1f1803be52974d6defc84c808542ff4b86af1fce3560449ad08a4a69b0828a8d" + }, + { + "blockNo": 1934000, + "hash": "34d1fce3e6324d1b80622af4c56f227b50dfca73ffb03cddbbd4fee7fd826737" + }, + { + "blockNo": 1936000, + "hash": "01e9c8d45eaa2fbc1c447a96c18bdc1f3d5ff8f74ab3a237bcdcc8fdf96c1011" + }, + { + "blockNo": 1938000, + "hash": "a9a8003fed1e037188e198bacb09179a31251831e016fb03cf764aa5ebecdd98" + }, + { + "blockNo": 1940000, + "hash": "289fc3c02db7a3945e8360285b663b78ab87cb854c8f605b2842d0695cb16618" + }, + { + "blockNo": 1942000, + "hash": "5aefc5aff501e59feb3498839ff19ae5c6596dfd72f6ce370ced1278f4e87b15" + }, + { + "blockNo": 1944000, + "hash": "06a4768f75b624a9460d0edd27306ad768de187b1aebfb458eb5efcad15562b1" + }, + { + "blockNo": 1946000, + "hash": "bbd3f2f4b766644759162da09ece7abddfc7bf873c66cc82f68aebe910602e10" + }, + { + "blockNo": 1948000, + "hash": "af62fb9e78351d42183f68092364ce15c21d242e42d045c785003bf6f4ab12f1" + }, + { + "blockNo": 1950000, + "hash": "3d556e898649938ffdf9043f01a1f38d72cb950b17ffca34a45946a327c17a69" + }, + { + "blockNo": 1952000, + "hash": "a96e819aee67663c9d909c195f4104abf37bcd9488cfb03983bd1ee4d42406b0" + }, + { + "blockNo": 1954000, + "hash": "d4a105ae099196eb06326f3f228225f404c93fd6aa3b4e7a3b885024d46ed240" + }, + { + "blockNo": 1956000, + "hash": "408079a3593f52504311ad9a955e19a8d3fc86ad59cafb70e7eb0a03087f118a" + }, + { + "blockNo": 1958000, + "hash": "68d6f2a6cc9a78ef4ade1c7fed713c7fed11d3765fa282fd1d2fac09cd5557a3" + }, + { + "blockNo": 1960000, + "hash": "3350af3908b1d6f6266f3279cb71950226abb03b8e2a71f5a3b2a6b63f521965" + }, + { + "blockNo": 1962000, + "hash": "a8c29d7848712ba44a9e5a1260d25c95bb937f2af61f717646a087985053465c" + }, + { + "blockNo": 1964000, + "hash": "a7032bb472d94479d75882998bf8c97dfa99ba0a4335999c67f7824facd23d39" + }, + { + "blockNo": 1966000, + "hash": "337079563965d8417c4a16e74fc2c9641d93f53868ab62cf1a65d66872434a87" + }, + { + "blockNo": 1968000, + "hash": "c7fbf80079f78611207cf1aa640eac10a0ebb34ad1e4898f81a09428c5471fc0" + }, + { + "blockNo": 1970000, + "hash": "88f359855fcea8f9af8fcb8193db8ae54d72ead404068955dedc73a08351d852" + }, + { + "blockNo": 1972000, + "hash": "ac5ad748c0e6eb67a91c58a19b59f88614afc33c3b2ef4d76d43bef215bd3fba" + }, + { + "blockNo": 1974000, + "hash": "8c47538f0987e362dd8cd5552882cd41ab1644a4666cf8fb957703c786caf198" + }, + { + "blockNo": 1976000, + "hash": "5f27e83653d93b9fafa51c0655ab5a333a182858e70f9f84baba41bcd9b2f8b9" + }, + { + "blockNo": 1978000, + "hash": "e00b2a5346a6b9c729021eb96804af7de620cd10fc8c1ec531a472e84e758c05" + }, + { + "blockNo": 1980000, + "hash": "cd9d44c942c0bc2b2cd95be9889bc5022ed5cec28b225c78dd897a7d4110a588" + }, + { + "blockNo": 1982000, + "hash": "9940a52f3b239a1062cbb98bee8e89974cc0de5d53f840b9005fa83949c61889" + }, + { + "blockNo": 1984000, + "hash": "f2de9880f45212419d31abaddbdfe5ea7f7d4c748e0c8f0318ef2b4dab8e46cf" + }, + { + "blockNo": 1986000, + "hash": "5daa83f50207835cd5e61e55214c6ed84d6b570f8319bfadc09231caef64e3b3" + }, + { + "blockNo": 1988000, + "hash": "4524674af3ebd68f23a0aaae2546a177eab89ef3a91898d66a8f7ed63b3afbce" + }, + { + "blockNo": 1990000, + "hash": "c657bb4c3620fcec72f1ea9ffa60ab39454b8760a5d9cafde12ac948260f6339" + }, + { + "blockNo": 1992000, + "hash": "8c4afb27d02132dbe3a2574bdf5da57d82b71b4e7d2cbb5ec74d358b726ab719" + }, + { + "blockNo": 1994000, + "hash": "fdb08904032f4af550822ffa019f293d18623a1f1332d5a3430787dc9dd4e8e3" + }, + { + "blockNo": 1996000, + "hash": "aaa65f3ea676c06f20f32266263b4aac9627037d8ad2cdeba280218766de2ebf" + }, + { + "blockNo": 1998000, + "hash": "65c03293a351ac713d430e8a9184f9bbc71a442915c3e7387202e19a68cd4f0c" + }, + { + "blockNo": 2000000, + "hash": "5d8c9a7ebe6fb9745301a70c526d49abb12b5b461a0e0cde880e35e3f51fb2b5" + }, + { + "blockNo": 2002000, + "hash": "576bac71dcaca4390048d6f99a5f5cb59540a0350610ad645bdd6a76508e8a2d" + }, + { + "blockNo": 2004000, + "hash": "34c9e7b43f67b4782f33bc832cd59e4042c8efe0ad2acc497d0e97feb3af2fff" + }, + { + "blockNo": 2006000, + "hash": "b6148ddfa76a0ab12f20dd6fb5645e276198bdf54d4d70a537b5fe2819971de6" + }, + { + "blockNo": 2008000, + "hash": "174be74fbb1d7607136a96b4ce10029902594d39d986aa40e2afd9a4eca6be98" + }, + { + "blockNo": 2010000, + "hash": "e813ef0230ea00ec5751f35d49814f8ceadcd2aad3a928d13d2af3c6c1046511" + }, + { + "blockNo": 2012000, + "hash": "1ceca20f7b5a322fdfced762b9ecd1228291ed5a20c7b6fdc79a3aba84fcd90e" + }, + { + "blockNo": 2014000, + "hash": "cdfee0ad1fcb50b5a214be6dabdf0cdc30d89ade402d5281ba15a816c101a6a6" + }, + { + "blockNo": 2016000, + "hash": "f8181989363ba272a662ce95893189511fd53a1a47954018b02b5abcd9452541" + }, + { + "blockNo": 2018000, + "hash": "38d13b0558351a86e5b372b25a0a7a3df094d580a1f53fcfc3a2eb98ead71559" + }, + { + "blockNo": 2020000, + "hash": "fcd7856965cee3dd6c4c0e3f48f32ba5c4655e3505c002e0f82cff59c7a1ea95" + }, + { + "blockNo": 2022000, + "hash": "5d9aa7eca3f6d305532af10e5b5cf5b68f7f6d4ef149381d29664ab731c4a059" + }, + { + "blockNo": 2024000, + "hash": "c7a8333d074c67a64e6b81044ca9bedd9c04621f4e69a8863a7dd1e2b44126f8" + }, + { + "blockNo": 2026000, + "hash": "641e259b57c8c94d097adc5645af07aebd8806187516432cf15f01d8ceceac28" + }, + { + "blockNo": 2028000, + "hash": "083ba92950e4245e86ef3e4a6da6f98b2fd28e7a5e3f89de95e535a88ada8191" + }, + { + "blockNo": 2030000, + "hash": "4159531761d1065c651930ae3b09fcfd4f617cfe80f13ab62ad1cb785d2f9812" + }, + { + "blockNo": 2032000, + "hash": "778ac4d728c6af961a65469c4a9082b28d26e458d9cf835e3ed854b8dc72ad70" + }, + { + "blockNo": 2034000, + "hash": "6c1fbc59c36df6c208309af5144a62c5f34b5c39f7e620d7cad8679b68c41f8e" + }, + { + "blockNo": 2036000, + "hash": "addd56ea3ed1485e367da5dd2267858bb1416a1f9510e93b07d23de833012237" + }, + { + "blockNo": 2038000, + "hash": "908ca9c08c7d2a67681970798085d464e9dba4ea69507ad0f8e504188d714b72" + }, + { + "blockNo": 2040000, + "hash": "5e5748e4522699b67413140704ee40358b664bf9811245a199a3df533054bc8e" + }, + { + "blockNo": 2042000, + "hash": "0f51afdeb97b5e5bdbe2a48a812925732115dc6c13d016c3baa9ac0e821b2cb0" + }, + { + "blockNo": 2044000, + "hash": "b5a36ae0b3946ca4e8334aa457e201f0f21a4c2d2a2162e2b6ed9c7582cfa823" + }, + { + "blockNo": 2046000, + "hash": "359098d24114252158037a618ce210e81b83914b73dcd04db0c8aae5c10c695b" + }, + { + "blockNo": 2048000, + "hash": "ce6eb8a26d7e3efac6e986be22774d971f2aea16e69b9925aa02d66b33e9e6b7" + }, + { + "blockNo": 2050000, + "hash": "c83fcb26cd81bcaaaf7b36037e82da66db8371027c076103c38375b3a6dadf59" + }, + { + "blockNo": 2052000, + "hash": "611ea6d293fa9dca5a45e64be6cf1baf4880cd9a18382b7b35a007acb27efe06" + }, + { + "blockNo": 2054000, + "hash": "8d126199b73cecefb964b552582cd293f18d8e1f4b0aeb978cc163043b32caf7" + }, + { + "blockNo": 2056000, + "hash": "9d12429ca28009ee38a7780785a9af5b404fd1f65dd119d744a29afb54a542ae" + }, + { + "blockNo": 2058000, + "hash": "072306d2451245f52c52d3a70c6df881f5a5f980c635908034d78a7b2ef92226" + }, + { + "blockNo": 2060000, + "hash": "f49a60e643b2c53c38dde02299481e04f2b02d31938c1626b7c6b457b4ef6a39" + }, + { + "blockNo": 2062000, + "hash": "670f5b5d26be4bc9c2ac30966904f4e5256540c9fc03f77e09d0ae1c78bbf2ba" + }, + { + "blockNo": 2064000, + "hash": "22327326880880ad5396ed537ce4c36808590461ffcfd93dc0ee00eaa5fc0c81" + }, + { + "blockNo": 2066000, + "hash": "7add0fdabddc9f1fec0a16e8c34ea97c234d4752505486b12e799c38672f2e11" + }, + { + "blockNo": 2068000, + "hash": "98eba63f3a226892e0fd339fe9e00e876e5686130bdced6706c6f258078222e5" + }, + { + "blockNo": 2070000, + "hash": "4ad18e756a899277197a301f0b059d624283c14eb652a580aa58d749fbd8318f" + }, + { + "blockNo": 2072000, + "hash": "e31adb145395109172272ae787940f5efc8a2e7aa0e64c6204ddcad751e22da2" + }, + { + "blockNo": 2074000, + "hash": "ce950212bd4e7cb2b20a2987f071de06bdf9b0aac92b2034780b37d15d8a7447" + }, + { + "blockNo": 2076000, + "hash": "eb2ab0bc27c6b9674e767de4bef6b567a228dbc3b5d16719a76d0534ce9ceb5d" + }, + { + "blockNo": 2078000, + "hash": "5969ef8d49614608a3aea9147ff74780c58360f2cb6a880d2e3d561791df5686" + }, + { + "blockNo": 2080000, + "hash": "486d6f03c8ed67f865203604e76a1050aecd7b3c217366e570eed2bca39e6197" + }, + { + "blockNo": 2082000, + "hash": "edf42ca557da17c61ce313c0310190dc7df531b9aa0e7027800d17c849137de0" + }, + { + "blockNo": 2084000, + "hash": "7b66abdc268b8b4e54486dffa3679dd702e0b8643a85ad217aceab5093956cbf" + }, + { + "blockNo": 2086000, + "hash": "015284fa268afb99308745c5513d047db4bc5bfd90166f553c6509339992b744" + }, + { + "blockNo": 2088000, + "hash": "9ee6ae67ec85955c25ac1ec204f9969b49ac15d23fb802f2cd44c2037561a3de" + }, + { + "blockNo": 2090000, + "hash": "8d8c345a719f19cb9bb78c84bee7667a8fdb423adfdcb93852b4fb26b321376d" + }, + { + "blockNo": 2092000, + "hash": "bfc35ff7e244589aef9abd73bbc3ee83fca3d6620fca10c0e2c08a18531c9156" + }, + { + "blockNo": 2094000, + "hash": "72ac5faac73f8fb77dd2f7360c31088e1201da13b6cd8e05cdf4d8f10e9b6862" + }, + { + "blockNo": 2096000, + "hash": "67f1666934aec745c91d53a37854c4547826e4d25bb964d21b83f2706e1f657e" + }, + { + "blockNo": 2098000, + "hash": "b63b9b4f2bf17de2058982d300a675c46b09478300815f0fee4f281e50dcd90c" + }, + { + "blockNo": 2100000, + "hash": "6ebfdda65d71bc73b40ecee532cbd400f31f98f00d42d638a85d673ce7666f14" + }, + { + "blockNo": 2102000, + "hash": "d5d2aa33aa3a819910cd1ba3d6288c731e87e9972e92176e5f12d7f3c7fd2199" + }, + { + "blockNo": 2104000, + "hash": "d536883e868db80215b58ce667893ab4e022e9578ac72daa751b33c8e81eaace" + }, + { + "blockNo": 2106000, + "hash": "dfb84093a59d4ff7094dc8bf8453a71706b66b952eb872a53113014580cec8ae" + }, + { + "blockNo": 2108000, + "hash": "14b3a6c032074ac3bde412ed4a2923e13f580793020095bbfc27bff0e6dd8756" + }, + { + "blockNo": 2110000, + "hash": "7ed12a53e5f39745c480b779343d162c399457b459816f9204b7e35e42bf244d" + }, + { + "blockNo": 2112000, + "hash": "7c0953c8195cd5c619040411435894bb8e86453c29a0c92de6b32c7e960ab4ac" + }, + { + "blockNo": 2114000, + "hash": "862af31f4a1a9af6be93bedb2cc6472cdd72114dddf9ee3fe20396049a6f8caf" + }, + { + "blockNo": 2116000, + "hash": "db857d92a61e21336fb727954de42c4374fa93fb960aa0c8603250cfb4697f00" + }, + { + "blockNo": 2118000, + "hash": "8b3566ca85ef51a139bf958c5a40a62faa1039be32da6c7313ff50d7fea59fca" + }, + { + "blockNo": 2120000, + "hash": "1ac1382f4e3411cf5f85d4b505ca46bc05632e8a46fccec34429419a6a16202c" + }, + { + "blockNo": 2122000, + "hash": "1baea63c1ee69f15ff87688aa70d4c832f9c3a45807c61a8d8e45ff04f06b22e" + }, + { + "blockNo": 2124000, + "hash": "0aa9adcf5ba4dc223bc798b1951011c43d034266152b272e70b3bbc75fbe053b" + }, + { + "blockNo": 2126000, + "hash": "516408de1ae4b395ab2ddc980f95d310a52e42ced98beb841e249fc2418cf560" + }, + { + "blockNo": 2128000, + "hash": "5e09eba2a40655eda081a197cbec7d72037b276fe8378a0324e6d18426115816" + }, + { + "blockNo": 2130000, + "hash": "5fc49331f725586f2a9b74937e293462c2c89724d408ba2206d3b717353ebe38" + }, + { + "blockNo": 2132000, + "hash": "241f32ccf0257837b5f96cfcd550ea0200d1d14ac67f33707583866bfe95f9c4" + }, + { + "blockNo": 2134000, + "hash": "c627b9d69f4e1db40d2bc35eb9a9b756b0bc3c9d116c48aa8af2b7d570284df4" + }, + { + "blockNo": 2136000, + "hash": "24f5236c62404cd9a13989fdaa8bfa02f93fb97992a97944ac1ed9991c734029" + }, + { + "blockNo": 2138000, + "hash": "4db83156fca1523056be951c568b5f0abdb427e81c5ee43e185e1a6c99294a00" + }, + { + "blockNo": 2140000, + "hash": "9e3765fb8963983ec2380204e5c38e897a15afa41f248fb38489d3f86b22de1e" + }, + { + "blockNo": 2142000, + "hash": "fdbfd171fffe887addd701826faa9401f356bdf303d2a34a1b671a4e6ae40db3" + }, + { + "blockNo": 2144000, + "hash": "b69d6d9f05e1605aa7217ad08587c7cf92c223973f31854ef47cfb50477d138a" + }, + { + "blockNo": 2146000, + "hash": "028a9e218659499eb27bc761333b1733e98a9a42205b2069cf67ac430b687fd1" + }, + { + "blockNo": 2148000, + "hash": "3b503cfd2a5c1c1da2ed7644ab7bb68c01e55f670a5e18da3334bd53866a3ff2" + }, + { + "blockNo": 2150000, + "hash": "0b22aae3e9a74d134b542601f7620f36a1531e59bbb1d736c3507d8c1cbd89da" + }, + { + "blockNo": 2152000, + "hash": "caf760e649a0edbb8f0274d40dbef9c4d47fe533871bc6b69d2e817f06913c69" + }, + { + "blockNo": 2154000, + "hash": "2de9a6cc82f4ee884a1c574768f445997337a9c8123dc8aea112aa330349d949" + }, + { + "blockNo": 2156000, + "hash": "c8e5555039f5c5a59a06516033761ec9b121898718fecdfa42b9f184085e0497" + }, + { + "blockNo": 2158000, + "hash": "a95a1a14b7ecd89ff50d8299c0ccce7356f7509e24db1b51b1149387e924b311" + }, + { + "blockNo": 2160000, + "hash": "9583b0a282664beaa0819e1944aa8b2c871bf17fc10e894f4553312d9cd612b0" + }, + { + "blockNo": 2162000, + "hash": "8beaf08413d32ef9b088369d9addeb0c9ebdaaef960302ea6f980ea1e3557584" + }, + { + "blockNo": 2164000, + "hash": "cc7a0f0df2725e251c1e508bd84cf2e24a36fb39b27b306006a54ed00bd92f31" + }, + { + "blockNo": 2166000, + "hash": "0fdc533b7f838793654431e07c27bd4853d92b86244a68a42ca5e94dbabd6fb3" + }, + { + "blockNo": 2168000, + "hash": "356bcfb1c073e57045576fffb31472477646c8a3902f8d237ceadc6a424c9215" + }, + { + "blockNo": 2170000, + "hash": "44fcedebb312ebc93d09427f7832f59e85d930e3de5cfc5e4f86c2c4ca6fc3a7" + }, + { + "blockNo": 2172000, + "hash": "7820e39e4826985424b37b94bf5c92a93871827810a7ee3d252b9782109ff7cf" + }, + { + "blockNo": 2174000, + "hash": "423451b98535fe199d715745f6dd6ef7c8241002e2853c42654fef6f87f16d88" + }, + { + "blockNo": 2176000, + "hash": "abbfd89d438a41e1d5703724125af5950fb2203a82ef6b897d05cc5471cfdc8f" + }, + { + "blockNo": 2178000, + "hash": "5ef13abc82b6cf5e60a3a71489737b0f9734856d72408a6ca7951dd401085e0f" + }, + { + "blockNo": 2180000, + "hash": "31f9871ecf7d74a674925b9c2010219e19e8b84a6f7d63ffd6857b6708b73e16" + }, + { + "blockNo": 2182000, + "hash": "cc3bc6b5f33e1a84bd0b03e9a2e3a4bb4510e8cef183c74389b79d02e84c29ab" + }, + { + "blockNo": 2184000, + "hash": "107073eee38d9671e3e0d156543bbc2f35a807e95a41c5153b894745385ff9b7" + }, + { + "blockNo": 2186000, + "hash": "fba34c490361515bb418f1c63a91b873f18f51df5ab8a178f6ee605892e150ed" + }, + { + "blockNo": 2188000, + "hash": "e1c86bf706daa09b71f17bafe006adb4aa5ad4c9ed642ba4d3f335a40f49ff1f" + }, + { + "blockNo": 2190000, + "hash": "2dbc04375b2096298a53aa9a42be66a5136258c6c584eef17ec5fc8eabad00f1" + }, + { + "blockNo": 2192000, + "hash": "24a7d3911dd3c94d2c150c2b817bbe91283030c366ff743ba24d2acd3ae2006c" + }, + { + "blockNo": 2194000, + "hash": "2f1d22b1df0ba8dce42d3efcbef584de86a610c0c2af80a9ae754a8eb6a7310d" + }, + { + "blockNo": 2196000, + "hash": "949695288f426232147b924589d7408141f561250035c117300e3b31a7443f6a" + }, + { + "blockNo": 2198000, + "hash": "8ba2bec2f0d1ff0018f48f3ea160bd9038b945b8fa8b4ab7ac5466f11d644066" + }, + { + "blockNo": 2200000, + "hash": "b700f19eef80e4e6b9cbfb2f5935b3a7559a4dbb49f6104144a27abaabc45354" + }, + { + "blockNo": 2202000, + "hash": "dca4448028c4f3015c8d3cf8740c56cfd24a77d54b4af0effe32d8c793b1a7b8" + }, + { + "blockNo": 2204000, + "hash": "ea086558bd6ff4220a41d0be10d7278a74377991218cda9299dc51dbe30ff665" + }, + { + "blockNo": 2206000, + "hash": "ed2150ff77fcc08dd2508ba7c7ee978dd1c4eeda70dcc8672333b0098802eaa7" + }, + { + "blockNo": 2208000, + "hash": "2d7af5a1c4b2cf6ce85a7d7116e0a102baf973f395d836ce5d961acf94d5aed6" + }, + { + "blockNo": 2210000, + "hash": "dd744e5c2aa1cbcc09ed7110991b73e9f4fdfdac7151f5126c5cea5552abe128" + }, + { + "blockNo": 2212000, + "hash": "86988e98d8a6a31ea103e9c67e801ae4b5fcdef7ea1b85754449f507c3bcf6f2" + }, + { + "blockNo": 2214000, + "hash": "8443647b91fa41f0f730c92a3135c36a5cc51f2b1cedf939b5c58c28cf87dda6" + }, + { + "blockNo": 2216000, + "hash": "b9be6128767e4e47e9e0211f4e86e2d3a23cf85a434c0a31d5d9b857b32d7528" + }, + { + "blockNo": 2218000, + "hash": "c3f04f05a973b3b802cebcf0e19e8f3ad4ded2f02c5e764d0b7ce665a98c3f1f" + }, + { + "blockNo": 2220000, + "hash": "4d3e7a16cd56930c251a76bd72a8d028604f32261aefa12edd8e30c061ccfe2a" + }, + { + "blockNo": 2222000, + "hash": "1e937000daed3ab5a317d67964f6bf084814008ea93ce14e1440d9808145892c" + }, + { + "blockNo": 2224000, + "hash": "0552c54c7602bceaec250741e1e32a010471c6bb3a502063243aea7db7bf13f2" + }, + { + "blockNo": 2226000, + "hash": "0597ef76c00f55d68d901ee1f4866722336568e95efaa5815e62fa2fcc092512" + }, + { + "blockNo": 2228000, + "hash": "1bbf91e25a10cc657b5a7392ccfb9db3eb657b999889bd4646ec7fb3e6c4bb6a" + }, + { + "blockNo": 2230000, + "hash": "7743b34e6dc0e1d790972ddfb6c1a2f85a22886b780d2c46bc88ec9131089b28" + }, + { + "blockNo": 2232000, + "hash": "f7284b89a8d7b5fcc1f7e0c88fa91d3494a2ca802e68e40a386ec7f91f90be41" + }, + { + "blockNo": 2234000, + "hash": "c121e257e1216797e156b465f664fbc9fb2fe84097162f7b3988bc0ca993e758" + }, + { + "blockNo": 2236000, + "hash": "8d8ebb97603e1a600a183ca3bacc49e0f844d5ff69f5d4fee4acd5513b3435a9" + }, + { + "blockNo": 2238000, + "hash": "4819774e032785fbc586f7cf6a264fad9e9c7d13c92bc45a5734a6aee77d9254" + }, + { + "blockNo": 2240000, + "hash": "17f40588398a33c20334804a53acf42d289704dd72313907e0dc7f7af04f4c03" + }, + { + "blockNo": 2242000, + "hash": "8665a881f70f0a9bdacb8bac47fddae933413ee53ea00ca04d7c07e3e683b92d" + }, + { + "blockNo": 2244000, + "hash": "b9c37fdb302212fc5616eaa00972cdde506dfe4d80d36da7a20c71623cf02f4f" + }, + { + "blockNo": 2246000, + "hash": "8d50ca43d29ef3501f28c0d90193263c1b5b4e61cdb3828370088a9fbb6feebe" + }, + { + "blockNo": 2248000, + "hash": "5c8b8a337f0cd42d5ee5c5b68db92e0da213a74ebfb3471295c2ba8b32315f1b" + }, + { + "blockNo": 2250000, + "hash": "50fef6ff1a21b532ae5184cca5d5e270e0f3416ce83fd95213305667a8d8cf5f" + }, + { + "blockNo": 2252000, + "hash": "dda9378ff751a1b118589570b98a897229759949ce1aec969f2e99735bcc9c47" + }, + { + "blockNo": 2254000, + "hash": "f094697b8e471499bd4e59c24f4b37e45f6e563b9d2e7d6fdb5a41359100bcc4" + }, + { + "blockNo": 2256000, + "hash": "7f302d39308d91b7b6f70c81b6cce0d3d321bcfd57e6258d273e4568d50d3324" + }, + { + "blockNo": 2258000, + "hash": "4537d4e09796b3f80a9aca21b2a37b3aeab4569d9fc5806334bd67cc724ed12b" + }, + { + "blockNo": 2260000, + "hash": "620ebfcecda15d50d6418f5b47bfaddb9afdc50c4a8220a7ea708eef6dea9657" + }, + { + "blockNo": 2262000, + "hash": "0568f7b81090ab3c48331381a76e634dd97bfccbf51a6b7b7bae1b8b33cefcbc" + }, + { + "blockNo": 2264000, + "hash": "fa62add38dfa1c1f9534b602597c1d966858888deca6435d2b7f9c8bcdc5111b" + }, + { + "blockNo": 2266000, + "hash": "c4cf056ecfc2bf8cd73e38bdff0f9fea14d2c24e9266f9add212fef089858825" + }, + { + "blockNo": 2268000, + "hash": "1bcf4bff900d4af061cc01a41854ae42a73c828051c5f5aade94f283aa85bf4c" + }, + { + "blockNo": 2270000, + "hash": "78836d5cb6e8ef84ab83a8bb37244249fd0ba87566bf1d742eea8c579026bb16" + }, + { + "blockNo": 2272000, + "hash": "af7b58de917291eb824788ff8cb6e70ba78220d451c9513b9dea9b4cd9f4106f" + }, + { + "blockNo": 2274000, + "hash": "58b82b87a909d32814b444bca74a31c80f80c993767bc0498fd4c8697cf557d9" + }, + { + "blockNo": 2276000, + "hash": "4e52bac92dfd300c0c3d64a58fb213cbe2bfe6e6f3c9a8660052303fcca707f6" + }, + { + "blockNo": 2278000, + "hash": "1869714acf42b16f17e6977df26e08572d0affbec0d8125c766fa2c28d7c7c50" + }, + { + "blockNo": 2280000, + "hash": "a6abd2a51bfeb9e54d8d9caf54edf6123002585979076c8547efe7fb8b97ed61" + }, + { + "blockNo": 2282000, + "hash": "7a765ec96b71edd481928b41e95fc7040262ae82b421b59efb57745a1d1aa561" + }, + { + "blockNo": 2284000, + "hash": "1ca1916237f766f0ff009222625de8020e7cc40d4d0f2f50bc753644598108a3" + }, + { + "blockNo": 2286000, + "hash": "613b1686de582aeec4df3790eb1566739e1aa7d5141b762ff88348bd0a87a324" + }, + { + "blockNo": 2288000, + "hash": "b70a3c143c02da03ce8a74d74047cee0df8bc3a43cd800a0470b3d8e1f34b454" + }, + { + "blockNo": 2290000, + "hash": "6aee1f00278335903499bb368d4df62a6cc0c5f1efa441a435edac62e67710e1" + }, + { + "blockNo": 2292000, + "hash": "7aa6f284a312cf07000a9e9c98602bc6810d74fbb094ca32a3a47db25c072ebb" + }, + { + "blockNo": 2294000, + "hash": "ca2bca8ec9b95d28fe0cd07101402bdaccef7b15072e55eb9cd8f47bd88c9e23" + }, + { + "blockNo": 2296000, + "hash": "beb867a979137817d3cea94618c97c686fec4749882a3ae380aeb44ebcee5a97" + }, + { + "blockNo": 2298000, + "hash": "1c8e7962cea4f802a10044dd32f4481133ebce2a80cc3b51e52be60ce29e1730" + }, + { + "blockNo": 2300000, + "hash": "b5f20d9ff2c500b204bf5641631ab512448e03e3ff9eee6b8600028a8ff4ae40" + }, + { + "blockNo": 2302000, + "hash": "897dc3ec8c21c2085145d0f2d6c437f315f082b1a8ef90894fe885e0d1b4505c" + }, + { + "blockNo": 2304000, + "hash": "881646c39dfe5992611663877347493b5c3ee8a658c85c4abb3f334bfe07db01" + }, + { + "blockNo": 2306000, + "hash": "999a905db3c20e6d99440759d8882cce251ef5b17d8c0032d02b2686decad784" + }, + { + "blockNo": 2308000, + "hash": "a360ae31d1d963821a11c04eaf73934ec54262ff675eb54a19a7bfa984b41c9a" + }, + { + "blockNo": 2310000, + "hash": "f4d0a08f18596f0d45ca2b44b0ba8bd983ff2ff44e18eae008773fb7c8fc73e4" + }, + { + "blockNo": 2312000, + "hash": "345aa97eb9894f52d91228077e094a50156db3b7e96a0a1abb49fdb14aef3ee3" + }, + { + "blockNo": 2314000, + "hash": "d282617fa59ca8f4c55ea0f48f76d5b1db725ece1386f2444e01a80c35bcfcfa" + }, + { + "blockNo": 2316000, + "hash": "2d6ff1a533b9955653f1fdfeb4f1df4671b7660adfccd7b16d707f1eb8432505" + }, + { + "blockNo": 2318000, + "hash": "ac5b6c244eaddb840b0f230cde0873aa485feb7c1ee2d4a1052556502ea1598d" + }, + { + "blockNo": 2320000, + "hash": "5c7bc7a72dbf55b0663c603d43c3328eab5e5d8f9007e900339fb9692e51b84b" + }, + { + "blockNo": 2322000, + "hash": "b73f1c245b7b776527c0ed2b962819754bdf3f1c51b4b2512041b1946820128b" + }, + { + "blockNo": 2324000, + "hash": "a3aca17484e7d143868377361435a8bfe1f9b92eb9be6a133ef8bc4c4dc80972" + }, + { + "blockNo": 2326000, + "hash": "cfc4749d104e572f97c48a7730925fb4d69bc23d71a87ea6002f0f1ba7574a41" + }, + { + "blockNo": 2328000, + "hash": "4591c0a1484b806f84b295d7b352c32701f8ebca49fd2c172e701683f0dc4fc1" + }, + { + "blockNo": 2330000, + "hash": "fa87cbea1dee6a210cc4811af483ab4d604b4275b46746ec7f4950e2c6a77cb7" + }, + { + "blockNo": 2332000, + "hash": "116b1a1d3e803ce06b4602b5edf6fdcdf40be9d2aee1353a43c676b5fcd85ab7" + }, + { + "blockNo": 2334000, + "hash": "4d6a627acfa728a8996f9f00cbeac42012110207e74b6c6b944cbd68e347ae94" + }, + { + "blockNo": 2336000, + "hash": "b59cbc1d6b352bea52d94aa049ad6b69e49d252bb756fe3a27fc8d2b8de5a9ff" + }, + { + "blockNo": 2338000, + "hash": "85a18754bc90811a07d95016d23fbd38cd547dbb981918521bac69be478ab70f" + }, + { + "blockNo": 2340000, + "hash": "484c53cbcf5867c8a379d3f52fbfdda6f4c2eebba6108a91b2c11177ba0eff99" + }, + { + "blockNo": 2342000, + "hash": "1ed1918fd2f492148f457a8abbceb6485a19fdcdfc79b7e2f88bef8c24243561" + }, + { + "blockNo": 2344000, + "hash": "0db09c3138eaa4231486405489d3673ce11f9adac1a496192478018d7ef54a53" + }, + { + "blockNo": 2346000, + "hash": "3bcd70ddfa128c47c72c3fba24e406b0997bfb6fe885a7edf4db08a5035b8bea" + }, + { + "blockNo": 2348000, + "hash": "1d173402b5bc0daf9dce96a979eda20bd34814136265f977ea5d05477454496b" + }, + { + "blockNo": 2350000, + "hash": "171f26f8da55ffe994f6b1f0d3f095cd4a0c3ebe04edb52e3220621a0a2037e8" + }, + { + "blockNo": 2352000, + "hash": "7607dadd8db0a6b983f78adcd85399e63ac07d71ef49660fb9ac9e4468cabe8b" + }, + { + "blockNo": 2354000, + "hash": "6231354ff5608cdcc261a24f2c3179dee480866fdf7f16b0d01cde54281cb249" + }, + { + "blockNo": 2356000, + "hash": "4afb9a905138be19c24411e7758a2c961ffd3e00483bf29b5da94c0b56efcdd8" + }, + { + "blockNo": 2358000, + "hash": "591b4dec93bd7c67d5240568a0b816ed925dcb42ca329882f0cb148480cd90c3" + }, + { + "blockNo": 2360000, + "hash": "a700a935cd16026aad934ae1e8ca607588e4a54faed539530361c7bd1b58272c" + }, + { + "blockNo": 2362000, + "hash": "eb1db3a211711f6aea0faaabfd71d0f43ccf92cc6df707b0ad48d0e957cc335d" + }, + { + "blockNo": 2364000, + "hash": "e71cd57857b6506c90b2e522aba0c3dd1abde676a60c4c1e7255a6a23e402b28" + }, + { + "blockNo": 2366000, + "hash": "89b07e821e0186c7ad88b237668aeb7817478006d3e676bc5d0e46de66c2ca38" + }, + { + "blockNo": 2368000, + "hash": "9192f984bdcfb13afe7c474df6e46557cc37a6beda7bc33f02f06f99ae86f9db" + }, + { + "blockNo": 2370000, + "hash": "ec11327b4034bc554fbbe258c5c08e338a527eba57f1ad7d697869b2ecfec0dc" + }, + { + "blockNo": 2372000, + "hash": "09c683de1bc0baf3cdc05a2ac1072183c046813bd65592376858dd7333c33254" + }, + { + "blockNo": 2374000, + "hash": "7320b1e8293a77b0e2e27ca09f3f0b80379b19fb0ee85d22a0b063f3dd24f9ac" + }, + { + "blockNo": 2376000, + "hash": "598502426981be43cb9a6b0e90ce483b8ed3a3f531289c0a278f9e1a6238e893" + }, + { + "blockNo": 2378000, + "hash": "b54e487038df00ec4ad9365f31e622150a63ed22e79dea7fb82d8e31490f43bd" + }, + { + "blockNo": 2380000, + "hash": "c55d5200ab099514bcc3ba50d22f67383e4aea5bc789c8da2b0910e8a6f6048d" + }, + { + "blockNo": 2382000, + "hash": "d38c0941bdcd62423fb14f45ca325d7427439b2d2f14c57ae7cfb752483e7145" + }, + { + "blockNo": 2384000, + "hash": "eeb833425f68f47cede174549d6572408351f5e6083e6a7b333fdff3ba73e79f" + }, + { + "blockNo": 2386000, + "hash": "0c91b38e3a02712d5e0f89cb3f09a19210a86f15bb7fcec76dd09f53ffac2756" + }, + { + "blockNo": 2388000, + "hash": "25886b339d15f52f7d5e7210a22318f56f7508f990134f69689ade292e85fcd5" + }, + { + "blockNo": 2390000, + "hash": "f988c73266c6a74f4113e930a3f8d8e8429cba311496e1dd5abf32beb30f942a" + }, + { + "blockNo": 2392000, + "hash": "09a0d5e36224066b885bff4e1b6984a9b93ff09f1cdb27fb37f52ef289eccf78" + }, + { + "blockNo": 2394000, + "hash": "c1a4e1b61b64dcdbcdc227f1e0184e71db1e17630a02d768cba3bb9dc64f7da1" + }, + { + "blockNo": 2396000, + "hash": "9c98634010ea07bf14d4705827ac035fd990225eac2600c334dce40d499c0b44" + }, + { + "blockNo": 2398000, + "hash": "daf96bf415c78486e0d8ca1208ec53e9d4fdeff543eeb6c18bc19976869443a6" + }, + { + "blockNo": 2400000, + "hash": "fbaf88f0bb8c485b5a4fd6ecfc61d595cf7f5ed4adb0fa3e1b75190666ed90de" + }, + { + "blockNo": 2402000, + "hash": "421452c961b5225d9bcabb33a4ff73a2e79937e3e1e97bc32d1fc07feffbc5fd" + }, + { + "blockNo": 2404000, + "hash": "499cabc3a264029df2f32b958a79d2bf28276911cf10f048002a9bcdd3d32c26" + }, + { + "blockNo": 2406000, + "hash": "d94633c6f2b25f1d03e6d4a75dbbc24bcae1a95a7ed1fe4826d4cd464309d20f" + }, + { + "blockNo": 2408000, + "hash": "bbddbc1b472e55ac3bb132fd5e1c1568f98f0809bc80a5cdcc371dcbbb5cc028" + }, + { + "blockNo": 2410000, + "hash": "7026f9f111338c4de6f1f13e55bcda40ef51feca11a2d04d8c3ad716ae627077" + }, + { + "blockNo": 2412000, + "hash": "3f73cc994a04be5b5b5a5f034d753d3fd1550798bba5b0de9fb6e70eafaebdb5" + }, + { + "blockNo": 2414000, + "hash": "d5599e00f48c51683e7d2e9bc43bc4ede2ba345e57fbe80ddca03394ea6404a5" + }, + { + "blockNo": 2416000, + "hash": "b871a28e20870a8319a1e1c04e5e13a0de98345a8145731deb1b450864447a72" + }, + { + "blockNo": 2418000, + "hash": "2b2b2f6888d57b6b142434154160a440acf4f5f96a77dcdee966937a209e2bca" + }, + { + "blockNo": 2420000, + "hash": "976187eb157725a5b43f8a454b7136beee64d9b13f96466e35c0920a20e628d9" + }, + { + "blockNo": 2422000, + "hash": "1cb47c2b6208d9253514c61598f968ff9721982282f9f9cd12573860646328a0" + }, + { + "blockNo": 2424000, + "hash": "4251a7f4fb715b1c55037e829000089ad7f5c85b7cebfca441f43e53f81e72b7" + }, + { + "blockNo": 2426000, + "hash": "966e126328bd584dadfe68ecd929bd960dff60bebbfe14fa924828e3252bf96e" + }, + { + "blockNo": 2428000, + "hash": "8ee8d1b14a49b2099571bd882e13f2c83634da6696fe8ced864d5317a211a078" + }, + { + "blockNo": 2430000, + "hash": "14780ed30aae68475f99c3e8e7312f6b5930c80d044159a0a14822897f448743" + }, + { + "blockNo": 2432000, + "hash": "59e0ed6a555dc7ea34bd4d20f026d993ca90bc24e645a9f5a7d7b20ed48d29fc" + }, + { + "blockNo": 2434000, + "hash": "d26703f031a9b96835109459fb612d28bbda4d5f377735774dcbfada0bfa22e2" + }, + { + "blockNo": 2436000, + "hash": "621e3108bbd17973fbcb94b6a30080db4e1f27997159610cdf4aee7e5dd7c861" + }, + { + "blockNo": 2438000, + "hash": "8835fbec58d3a8701cd694ccf0432834aaf8a4908676737e015822c96b1663a3" + }, + { + "blockNo": 2440000, + "hash": "4150d65fc8134b7b35cea01d4488fc6ddd436f5c48cccfc5d856c942f677b3f7" + }, + { + "blockNo": 2442000, + "hash": "54619408dfa2ab26a5590d3bce5535475f6e38c97cdbead5b04a0d24746aeda2" + }, + { + "blockNo": 2444000, + "hash": "2a8d3a485bea11d551afd7bc9248fe01dcca3a2f2497a0e01f43fa120f44df9b" + }, + { + "blockNo": 2446000, + "hash": "e9060842235730fee3e48e1b58b217b200425c617ff7ce7ff1e84716104a6f6f" + }, + { + "blockNo": 2448000, + "hash": "51eddbd78f4f46e36562440af31c134e36165d93c2f169c0b9a2262ae03f8fcd" + }, + { + "blockNo": 2450000, + "hash": "aee56caa47477222af6f7355646e02580fb9af6576593baa76381b25b0144288" + }, + { + "blockNo": 2452000, + "hash": "ee96947d778b503666a9b0b7c8b07fd64721b381582374a159cdc2bda6aec380" + }, + { + "blockNo": 2454000, + "hash": "2bf2d48b631481643d9a539fe986baa4c8441f449e83a5a8c26bdbd752cf0503" + }, + { + "blockNo": 2456000, + "hash": "82f6cf23b6d536a5dfbbc1e7be50e5e644314ec0424dbe54a99c21426f5773ad" + }, + { + "blockNo": 2458000, + "hash": "c8df03562fc7f1af1807cdf70f3d0a44b4d0d7edb6f7d9d481777e26aa0fbc58" + }, + { + "blockNo": 2460000, + "hash": "65dc07a563cae819d6f875ecb79834e49268f402c34a51cb9d3de346296f975e" + }, + { + "blockNo": 2462000, + "hash": "b28c65d1e789c3066d0499440885ed2cbd7b7e28d08dc2b13cced8c2372dc6db" + }, + { + "blockNo": 2464000, + "hash": "be7b2e749b9cd246f9a55a340352565b54848f9d2d23b742d51f2a7ff61a1360" + }, + { + "blockNo": 2466000, + "hash": "c9ea0c91058f8af58672f492d5090c18f7d16af24d7e4a789e11bc4dedfde6e8" + }, + { + "blockNo": 2468000, + "hash": "c5c42c1f8c046af4618a6322411528b13a23d0a9b77ceb8c6b6230820499f6f6" + }, + { + "blockNo": 2470000, + "hash": "fa44935d26977920548c10568288b2526f2efb5f873681fab0c5fb8ce5a09914" + }, + { + "blockNo": 2472000, + "hash": "42b8247b50553216a929db78e2a020bb8ecabfc2531dd91b53c214255bb9e3b5" + }, + { + "blockNo": 2474000, + "hash": "b49cac206ef6332904edb7754718816f55a9a211903ed6e05cda0a71cff3193c" + }, + { + "blockNo": 2476000, + "hash": "3c7a1d5c130ea18545f20a1cd60f0b5a1d26f0e7a146bd77b942581687b262e0" + }, + { + "blockNo": 2478000, + "hash": "1fc76cd1918b94064d1527e5e72881e4a8c9819777d0ad444f8d6a29b6947fe7" + }, + { + "blockNo": 2480000, + "hash": "bb09cd9207cb270e520b27a6997e5bc5a0da57dce35397d495f3d66a1c606eaa" + }, + { + "blockNo": 2482000, + "hash": "83ed8f80cc4c28e226e33eed5e0605810c2f61de5e3224c9493c27d7119d710e" + }, + { + "blockNo": 2484000, + "hash": "cfa7bf48f7759beea63f04670e9b1f71e173a6a6ef4d3370e0fa214b7233cbf0" + }, + { + "blockNo": 2486000, + "hash": "57b44b6106f9c7ace558c563779a2d6c25549b1daab562db2e73285574f787d4" + }, + { + "blockNo": 2488000, + "hash": "d8374ee509c595429f2af72d0227a31b15b5c448505cc6558eb66a84b12315bc" + }, + { + "blockNo": 2490000, + "hash": "a836d51d1ee7cec4c641352f70fa688f5f51d25130ed70a66eb9804aa1d1ad21" + }, + { + "blockNo": 2492000, + "hash": "3df69fe3f55b384bb6ee2e7b0dd4be999516748f6f0d2e320ece7c76e4af7832" + }, + { + "blockNo": 2494000, + "hash": "df735f642040fba1400d8816e6ca51d155bb10f5db7aa60981715d9b6b4bd6bc" + }, + { + "blockNo": 2496000, + "hash": "5106efd385a39f87ae92a57380d03832310f1c694a26d52e3d6a8eb6ea1604c9" + }, + { + "blockNo": 2498000, + "hash": "a7e65ab71058f762dca47eed1ab3c4fc0aaa27f71b72c628e891f222611a4b58" + }, + { + "blockNo": 2500000, + "hash": "30b3cfb22fcb213ecdbea9f3373cd5e71f47dce783536c906716708a456ce96d" + }, + { + "blockNo": 2502000, + "hash": "894c3f8801f4c5f14d2af308dac17d7457d4d190d95a213ed12ced2ad27f6778" + }, + { + "blockNo": 2504000, + "hash": "27b977e317d72f9bac5a1943b848017d1fe504037cf34a9493906ed01ea7a14d" + }, + { + "blockNo": 2506000, + "hash": "bdb77ff046c5d2e9b84defc8c6aba06f5481c38a2e70942e9a157170bafeda3c" + }, + { + "blockNo": 2508000, + "hash": "aeb850613f1cedc9ec745a3992b445dcfa52f5e784959a1603f6869309ebb84c" + }, + { + "blockNo": 2510000, + "hash": "3e3d8c775e9c64ba82e4c92a878a55b88bf48c9faf12221cba0c57bbf1caecd8" + }, + { + "blockNo": 2512000, + "hash": "ce84b57a41efeb869a66b26085432d67102e917f3ebbae144038b9037cf3e32b" + }, + { + "blockNo": 2514000, + "hash": "d70c19393a5f904f32c9de9bbac9cde83adcec9417c73557a713e3f8748611c3" + }, + { + "blockNo": 2516000, + "hash": "84597bf6d061c3b554288ebec4a3c501d6d9e399ed22b59439db3ee67ae0d326" + }, + { + "blockNo": 2518000, + "hash": "49139636f1484573a138fd50dbe2836c210959ee1b4f2878d0f3ed5506641e25" + }, + { + "blockNo": 2520000, + "hash": "b8f77b9ab9c1dc679080d145c49b735ced2d7d64fdb3bad616fe369290b84f6e" + }, + { + "blockNo": 2522000, + "hash": "6559055f1b5ceb8235faef0f20f3e4fc11dd98b79d36267e073312f083e40229" + }, + { + "blockNo": 2524000, + "hash": "98a7546495a85ec1021780e7466ae2ff6e70a6ccdf26447e3d1e7381ec7aee77" + }, + { + "blockNo": 2526000, + "hash": "940b520835873696ec154aa1490cb5f3b00b1149345117d1f29a5726fa4f5de5" + }, + { + "blockNo": 2528000, + "hash": "e0d33746b500ec87a9790a7b8f5c71c5969d9014cd359558e281430999c135c5" + }, + { + "blockNo": 2530000, + "hash": "83c4c24dbe8db26db5ee6d0d5116d4ee52c54fe60e584f284cb4ec357a6e95f7" + }, + { + "blockNo": 2532000, + "hash": "09433fde8153955855621ccfe6097db83692dfb35d6dc0bdf4e5640d8cf09f83" + }, + { + "blockNo": 2534000, + "hash": "8566e7feb737b3ec71860cc568c9fd85da6e38661cd43a57e2534fa279a1cd45" + }, + { + "blockNo": 2536000, + "hash": "bd6295f16c1ae33c394793048e464d9a52482701c1b2bc4aaca6bc79a09076d3" + }, + { + "blockNo": 2538000, + "hash": "245379141a37db1541c52024658e84ad41e5093b630e2184c70d5fa5626e2ef5" + }, + { + "blockNo": 2540000, + "hash": "7ce2d78688fd631897e714f875801149ff79c22e9d8d4aead81393826fe79482" + }, + { + "blockNo": 2542000, + "hash": "57a43891d8637216bc8e8b67e25318f59efe468cb3e56adb201ebf9f1659cc28" + }, + { + "blockNo": 2544000, + "hash": "09b1ba8bc5439bf8c85feb8c2e77af1b2f0d61710e843931b830003b94546c82" + }, + { + "blockNo": 2546000, + "hash": "a4171c8b18a27e465855105409ff91bba0b92777a8fa52529a21b362cb175629" + }, + { + "blockNo": 2548000, + "hash": "0baede1ca7413c41989f2e507694c21139d2d509d40d17c40164949bf18022f7" + }, + { + "blockNo": 2550000, + "hash": "8f5fdbafa6ab5d72c7960e64d1d85f8327f89839a6446335d98c0b7a4d2a7f6f" + }, + { + "blockNo": 2552000, + "hash": "fc5aeaee614e14e906bd4dd668f79a8b3b9faf987f3e8f29a45e9bf36403db00" + }, + { + "blockNo": 2554000, + "hash": "42432ad6ed063007870a7c5d909c7d69eb18b208873317a6c51978d680e91b6f" + }, + { + "blockNo": 2556000, + "hash": "e9d965dc89994e0475afaebc29014be755d51c7cefa877fceb4ba1374aa1bbf0" + }, + { + "blockNo": 2558000, + "hash": "23a6dd6578887abf96c447c5e00250bc152e7bbfce365f3a06b040d5477b6390" + }, + { + "blockNo": 2560000, + "hash": "dcf22f660411842aa5e21479343c1b53448523e57c801bf24e42bbe51ffb43b5" + }, + { + "blockNo": 2562000, + "hash": "ab718b4c2405469d448f3bc32ba32ff765480a052a1440cf629b2c0e28df0a5b" + }, + { + "blockNo": 2564000, + "hash": "316112b7be1d12b72bd38cc29742a15a6fb93376d047e2c303e92710646feda1" + }, + { + "blockNo": 2566000, + "hash": "d272e31de63d14eae8d69b20ec593ba3fd8065ea72c499899ba32fcc37f240c2" + }, + { + "blockNo": 2568000, + "hash": "95aeb6a6afdbb190b475ab6dcec308e4f3776e22e53e0098b4f5dd7301b3628b" + }, + { + "blockNo": 2570000, + "hash": "05a15e97c7508c234610b43c2ba724eb268f65c9455f933904c5ba450a43f2c3" + }, + { + "blockNo": 2572000, + "hash": "a6f8096c71fd76af786f35c1145d66096349a3d5a21aeb617f3040afeec7c734" + }, + { + "blockNo": 2574000, + "hash": "49b1dbc0138eec28e5669305c783a3d940f8a58d8c18c4b8ef77b2a54f0406f6" + }, + { + "blockNo": 2576000, + "hash": "0eac4e32d91c54b44b8a19fa4971bb8da524dca6d07d5dda000843da4974fe4b" + }, + { + "blockNo": 2578000, + "hash": "36b9737600415bf754df3cdefc72e48399d2adba7abdf2bcdd9cfa233d0ba7a1" + }, + { + "blockNo": 2580000, + "hash": "a78221f84b1f1425dfa146e4817c662e8b0b22cf52c2d23559597901aff3b8f3" + }, + { + "blockNo": 2582000, + "hash": "b3f7408dd07a5ed7160e0178c326c13e7e0f1a8b931a1df06a898306892057a7" + }, + { + "blockNo": 2584000, + "hash": "4a3880eb9e9cc6204630fc4a1e17107825db4dc2ad3a680dbb6e1ec54573c2ab" + }, + { + "blockNo": 2586000, + "hash": "f077d15a2ecdeb894cef7aa90d6b8cb6556b4eb5bfb129f1af883c0a92566eec" + }, + { + "blockNo": 2588000, + "hash": "fc7aef4c6d9a5fd92250a902591e43bb587fa041586f3ddae8b68df7217c48df" + }, + { + "blockNo": 2590000, + "hash": "653055429a0cac3f206e381be87f26ea704ed091e3fc684d87182760ee1ba01a" + }, + { + "blockNo": 2592000, + "hash": "f58f5a8871f9b29b7eb35ada928bfac3f3b966cc9e013406a0ff1f80da3844ed" + }, + { + "blockNo": 2594000, + "hash": "687ee8db958e8814a08ca34389429812afa54d6adfcf202cb91b7ec48cbf6792" + }, + { + "blockNo": 2596000, + "hash": "d2226b871a5b26433e1179d78fca7a8e275c78628639c4b8d8255fe755aa8a5c" + }, + { + "blockNo": 2598000, + "hash": "a53e87392ba9d3437f6b683883d3052cd1a4700c8cb3a717c4812224ff8891f8" + }, + { + "blockNo": 2600000, + "hash": "f2a8a42fb822df50bd830e336340501cffb454e1ae112e60b8c26eb4b6803a88" + }, + { + "blockNo": 2602000, + "hash": "95e8ec6fe67e4c23f7bce954a203d38b6dd51396d1a6694cc2858b96fdb74f8d" + }, + { + "blockNo": 2604000, + "hash": "133e1583c69ebc899822777d58ae94b588430621684c5111b835035e07b50849" + }, + { + "blockNo": 2606000, + "hash": "2952ed98c1fa57c9f635756c5b00e91e0d8e334aa5be4f8464bc055e21237dfc" + }, + { + "blockNo": 2608000, + "hash": "e1a3dd7bc4a4d3810c689f822b19cd8004b85018448f2bd71c874d3def227c07" + }, + { + "blockNo": 2610000, + "hash": "37a3fc3e5132b1f364e18374731e29deac48b8989abad73c99e323c8601b2ccb" + }, + { + "blockNo": 2612000, + "hash": "f7681326e23c779ccc1de5c6205f503b93b894a4b28bccab6844ad3fe9395cba" + }, + { + "blockNo": 2614000, + "hash": "56d1a956bfcd8aa211583e5e31ef56b1ba02f41683e91e1160879ee675374b72" + }, + { + "blockNo": 2616000, + "hash": "6a331757eda4a72399ea6cb5a4decd31a10bf71febbddab0be8ab706009b4607" + }, + { + "blockNo": 2618000, + "hash": "6bb34c184814292a7aa31129f4bcee941f3167e285253959840ac2236a179107" + }, + { + "blockNo": 2620000, + "hash": "cf6fdebced246638d320d2d32828016112a0c714ad3d59443fd2407af37fe9f2" + }, + { + "blockNo": 2622000, + "hash": "40c6617264d62b5a18765198666cfc390833a21c2ec781a0d6856697c2d5fb56" + }, + { + "blockNo": 2624000, + "hash": "840b01166b7d5dfb89f1dff3860fa82128de9de3ee728ad4147293e898aa188f" + }, + { + "blockNo": 2626000, + "hash": "4ab2b8bc339d9dbcbeff20b9756a83433bdf304417bfe995c226cdcc6c5e1125" + }, + { + "blockNo": 2628000, + "hash": "754cf0a2676547c1bf2eaf7390fa6e0d811e03f3b7c7d948095ae10ed7e99a7b" + }, + { + "blockNo": 2630000, + "hash": "194c2ff4611129febd020f08694dc57198339d4b3c2e37a0830c2812fc7663de" + }, + { + "blockNo": 2632000, + "hash": "05ebc4d45ca165ec8646a80074cf988998913cc04b2df1b5c5ff2b7dd4a0b932" + }, + { + "blockNo": 2634000, + "hash": "c526a3a688229486d2eb0a6fbf16eb31ed1610733f272282dd742aafaebea719" + }, + { + "blockNo": 2636000, + "hash": "b6402d11b7d8b12ea688666758e0013924217224e3381d675ad1b4cdeafa161c" + }, + { + "blockNo": 2638000, + "hash": "0e04d9325840139d6905726d8d0b3c668002381f5ed48009e5ba38597146765a" + }, + { + "blockNo": 2640000, + "hash": "b836a3525d48fa9ac6ed5262897e303dcf854cf3b723e2c99442013e5ac9c071" + }, + { + "blockNo": 2642000, + "hash": "dda4f09f083582f0a83019f23f543d35553af96623b73e570f0a35d9dfd01051" + }, + { + "blockNo": 2644000, + "hash": "64ae0197c2567971e6822bc0253647539afaf8f4d4758cb236801819654b6c37" + }, + { + "blockNo": 2646000, + "hash": "dc17e495bea0c585a85f5182ad9aa40fc6a210d9b2da8d986c3fec59afe22c40" + }, + { + "blockNo": 2648000, + "hash": "419c31b824fd7ca773c1e081032f5bc3eaa00e64f91ff2c9e70f176d434bfc70" + }, + { + "blockNo": 2650000, + "hash": "5b9da5efd802e6f719331d84d24c8289a89963bbbb459a71537a05da516f5506" + }, + { + "blockNo": 2652000, + "hash": "7044638d64e8eccc5cbcaefb2b20cbd2a3414b786b886527996c83cf3dccb1fb" + }, + { + "blockNo": 2654000, + "hash": "ab76b75f049a573156db1f8eb2186df31a5632488030287e495d43e14fbb4556" + }, + { + "blockNo": 2656000, + "hash": "1847b22909b20535a87189b4103347762394f06ca65f0a596ab6e6eba021c739" + }, + { + "blockNo": 2658000, + "hash": "4d937110f4e2e2c41edb747cbe666f7baae369a5902c98e6a483a67e81bd5c78" + }, + { + "blockNo": 2660000, + "hash": "7235346012da1f098caeb8a4b0f930a190a4630c96707ef04541d558c4247073" + }, + { + "blockNo": 2662000, + "hash": "7a14e9b288a0f843e467f4a76117577c4e32d2b30c40ff295e3e562c0ed9cc49" + }, + { + "blockNo": 2664000, + "hash": "844bcfcd6a4285724e5bb61612ec1efc206860f03aae1abe3b82e9c501c1ab2b" + }, + { + "blockNo": 2666000, + "hash": "e4034e1b848159a6c625aeb79dfa3d821cda62bcf5f3655295dfb1afb047cd9f" + }, + { + "blockNo": 2668000, + "hash": "6810e5467c90dfa7b0875d2edb4fcd5009a040e0430830023d6e769d333ab41a" + }, + { + "blockNo": 2670000, + "hash": "8dfc3244060aff8afdc8c7de3484385e9f1bef9641b59a4c6bd8ebe044bf8870" + }, + { + "blockNo": 2672000, + "hash": "021ac49de0f801d1ea427861163e52247864de667e5f3f0aac997f0dfa4752e0" + }, + { + "blockNo": 2674000, + "hash": "8ce4d7fe0a8c78b31511b3339f6d8ff950600fc6d301434ca4fa487320e0f070" + }, + { + "blockNo": 2676000, + "hash": "bb522dd8fc59586bfa455e2b927897e483d2bd750506fcd96eacfc740aee2aa6" + }, + { + "blockNo": 2678000, + "hash": "ab93137838f509258fc299eb6cda969909a0048fafbd1dd21989ae57ef5ef03c" + }, + { + "blockNo": 2680000, + "hash": "9afe00c8cb5a0862206da56a10c67006389b084828b0c5ff0453dc048c517249" + }, + { + "blockNo": 2682000, + "hash": "77bd39d8585870770460f3322d70a501d4d17170759ba44a904056e3c5de4227" + }, + { + "blockNo": 2684000, + "hash": "11a2f8f7e63b014205188835d543ae694ad457c82078db7842edcc5cab613dab" + }, + { + "blockNo": 2686000, + "hash": "0f27d3cfa3196d420f61d221f88ec897c69be19b26554a1f4b7f990c0b1fce12" + }, + { + "blockNo": 2688000, + "hash": "42d14a005aaeaeec01284012b903ebce367113d2ffce100f16fc98a63ebee00b" + }, + { + "blockNo": 2690000, + "hash": "c8c5d4beddd155413408bd34663c2e49ebdacba892990d9069c0a5151ffcdee2" + }, + { + "blockNo": 2692000, + "hash": "011147bf151adccff10d4cc0f30aed163543319bd471b07e9d9ab0d8b51b0a42" + }, + { + "blockNo": 2694000, + "hash": "cb01c07c55745735329e13f23aca4cea3d9aeffc352ca134934ee2c690df70a2" + }, + { + "blockNo": 2696000, + "hash": "a4ecd03db140cbe2ed242b74769efb2b36634bd56824c55ed6399bfdd6df0210" + }, + { + "blockNo": 2698000, + "hash": "c02c57c8588d36c9f095980339b1e2f60ecb454ea08a43e7c3c48ca98e2077fb" + }, + { + "blockNo": 2700000, + "hash": "cdb421df4a056056fb66afaefb057c098fe4e2059fc6d1e8a3fe96a5f89a9257" + }, + { + "blockNo": 2702000, + "hash": "b268e370ca6e1eaab3d7e9868d4f37c21331a482f6348ccfdb3aefa2a7ee2bae" + }, + { + "blockNo": 2704000, + "hash": "9ce3996bc66872fba9efd23b1c5a4fea00af34a9c46a8ebddd776bc08120eae1" + }, + { + "blockNo": 2706000, + "hash": "64d36e00c197f5f4d8afc4a1a083ffff05ad0c66f2717dacf7642029e583df6f" + }, + { + "blockNo": 2708000, + "hash": "4740d815c3cfe253c704b6e4a872ecc7e808d24a761ea9fdea0ff93f77e42113" + }, + { + "blockNo": 2710000, + "hash": "d66b24f5fc92334b27e7232d29f1331f2729ffbed541672773a73d65e30f1c66" + }, + { + "blockNo": 2712000, + "hash": "68414feb134a3e67b6d22ac1bd70969a18782ad69e1e21f1f8c3dba63f368d72" + }, + { + "blockNo": 2714000, + "hash": "76ea98b7b4e92a4dd2d8404a03042ff790fc69dd08721f3d10a439397c2171b3" + }, + { + "blockNo": 2716000, + "hash": "b6c683e9332247b0ec2393ae6e6c4db98ec9f585e5787972f3e42bc343c9c786" + }, + { + "blockNo": 2718000, + "hash": "74c1b84bae5859e35c9630ea553ee767c3f624a401ef1ff4fb832746d1e9272c" + }, + { + "blockNo": 2720000, + "hash": "20787e94b4846bb7142f059e2df21a168f795ab980bbfe8bbde2437c9a952e4d" + }, + { + "blockNo": 2722000, + "hash": "1c052ed5de654ec8392b759313755d417124db63b796790d1e3486e220f50fbe" + }, + { + "blockNo": 2724000, + "hash": "75be05294dbb9454bd6d834017924fdede291f05d823951fdd8389b6572e40e3" + }, + { + "blockNo": 2726000, + "hash": "292e1d9dbf9111e3a33c76731401d0c9c8bea5da38eabb5999c18257053cfc26" + }, + { + "blockNo": 2728000, + "hash": "1adc90cee6eb7d7afec3c0b69b4d07b5624c5bda27389810ece84cbca527f96b" + }, + { + "blockNo": 2730000, + "hash": "d95db1e4133c889915ed5ee1dbc1ae2be76d26b4aa021658c8a35a382d17bcf6" + }, + { + "blockNo": 2732000, + "hash": "d55caebed0b17fd5ab0aa1583b865172a23589c370189501d37244d2d3b5f48e" + }, + { + "blockNo": 2734000, + "hash": "f883edfe1a9f559ebeb02157d78333ada8b19a637f3f640543a7c9bf592f4432" + }, + { + "blockNo": 2736000, + "hash": "71c9272e54703dda453e7c63b791a260324a204b2bc85f60b89c4a50a3d85c17" + }, + { + "blockNo": 2738000, + "hash": "ff8e968c7de71d0610cebd3c3113ef220e1851edec3c6e10b69de3f8a85fdf0e" + }, + { + "blockNo": 2740000, + "hash": "3b6154193aae36034f423fbccb34113b9980f813220e7b25601de559fb95ef6a" + }, + { + "blockNo": 2742000, + "hash": "581f5f0f5af17795c6101caeb6ca1586af27260acb988e874e8cfeb1dc7484c9" + }, + { + "blockNo": 2744000, + "hash": "f0fed195a4411e69998ceb7638d9296266f1b793c9ed2fd10f821f3883040049" + }, + { + "blockNo": 2746000, + "hash": "b36dc26e17230a8b1e456c5e2c3b2f39dbbb9b9a1cdc6e04d0e18103a273eee5" + }, + { + "blockNo": 2748000, + "hash": "97b90d31d803c845adfbb786a007d350c4468a06e2ae7cb1075ce29a179234ed" + }, + { + "blockNo": 2750000, + "hash": "5465c10bd352ef0ac205e185dd8c9b6ccb72d27f4b68bec867ccf4aed6adec72" + }, + { + "blockNo": 2752000, + "hash": "ceb489307f4166ffa1bba1773a52726ebabdd20e9426d56643539986e6730dc9" + }, + { + "blockNo": 2754000, + "hash": "6ac1c8b3444e6a0ef47cddbe3c865b30676ed0aa444796dfac7a976fcd1a0d10" + }, + { + "blockNo": 2756000, + "hash": "94d9c49c68cb53a62189db4312b19d54393d1ee4bf6838672a3608a3bbeee97c" + }, + { + "blockNo": 2758000, + "hash": "c329c4831023a08db3987d7c967d3dac15d2c692bc28dc5914a5dcc726771138" + }, + { + "blockNo": 2760000, + "hash": "c996b0c063235ab215988cbab149b95fd3f1c1c569fab339a9becf9897ec7514" + }, + { + "blockNo": 2762000, + "hash": "f2de7dd7997b86a23f0f362d75d6ced66270efb322b8fe7edb373ad67ab2fce1" + }, + { + "blockNo": 2764000, + "hash": "175d49f29624c7e43e23d1fee66c7b6e7526221c71add8431cee2008bc04eabd" + }, + { + "blockNo": 2766000, + "hash": "2742e8fe2a67f5f6d627b0885fc994bab4849ee0a05701a1756d6b3f316bd286" + }, + { + "blockNo": 2768000, + "hash": "d08301f528f23c9f34a1a38e33196d20a24e5c0d1e7d0ce3d93289857ba4ce0f" + }, + { + "blockNo": 2770000, + "hash": "0ca2c94ef54fe7d5f854bf92add26b7cf0bd304d885b9bfa06c57e50c059efd0" + }, + { + "blockNo": 2772000, + "hash": "cab6cc25fa399e47e0e5eed3b735369f772d8ecaa36270065ff47e70459f3535" + }, + { + "blockNo": 2774000, + "hash": "a35c7b799bfbb81f0d8a515488637aabc67248f9770ab9ee28b7cc2b4d1c9955" + }, + { + "blockNo": 2776000, + "hash": "84b6d351c62dd9d19bfd02175c865b5964db5cfa63db51868f457bd8fb814fcc" + }, + { + "blockNo": 2778000, + "hash": "8980d8dfe705fab17cbb10fa68176a666558927283a006f08351d79bf3b24a28" + }, + { + "blockNo": 2780000, + "hash": "b1919218b09bb4e37b739e3d76737c19a65b08ca6902fd268ee68cd5d7814dd5" + }, + { + "blockNo": 2782000, + "hash": "fd9bcdebe9a2e6ece8cd7d9c903d7d96f693bfe690c31f576462d2b910d246db" + }, + { + "blockNo": 2784000, + "hash": "4c59afb09fe9c67c45618de7a954cf44d20ea7a65c7038c175cd1dc2b5ec579d" + }, + { + "blockNo": 2786000, + "hash": "5cdc6dd632933ec3c252d1a6ee3b2f139d3ae8b0c5484420400bfd7849bf9ba5" + }, + { + "blockNo": 2788000, + "hash": "6d8b4e6ac140c35015ebde631d65a717ce607d37ec623073cad32ab6fbfd5243" + }, + { + "blockNo": 2790000, + "hash": "960edd38cd1048ff13bf04b6ca18939a9a7d855f150261e9a45841618adaf658" + }, + { + "blockNo": 2792000, + "hash": "d1572cff140fd67ac230b1c789dd8a24e3c24d9cd07c49623b2011204353a6fc" + }, + { + "blockNo": 2794000, + "hash": "3384275f82c2fe5f6ec2e6e40cbd7c6a6f13ec81a864dfdf3ba94b4b9469447b" + }, + { + "blockNo": 2796000, + "hash": "1e8c8e4ec6c97bed9f18067cc4ef152bc42ebcf0292eeb27854f79ed9cf3c385" + }, + { + "blockNo": 2798000, + "hash": "c3f16500021ecb5fe6536c6a8d6d7cb03fdbf0f9baae813dd22d5fa36a2971b2" + }, + { + "blockNo": 2800000, + "hash": "be392bb04e38faee51c3d3e1ec000d0777542ae8c685a3bb1fb7a7afda09ae81" + }, + { + "blockNo": 2802000, + "hash": "611a457245e7a4ae64664a714794d3c284f1fe9b102a2a4af94936ab7bcd0711" + }, + { + "blockNo": 2804000, + "hash": "d9edaf19b7881023543b3cb0ee9f0f1dd35ba016e1e022799e1a41ddc20ad8ac" + }, + { + "blockNo": 2806000, + "hash": "453c02db7bc8a0658c8ec7cb2b2593954a6d81cc9ba89a52e3d0f1141dc92011" + }, + { + "blockNo": 2808000, + "hash": "97e05410193b4e5f3e972a9ee2f9655be7faa4cc02d8eef0c3e95c7bb5d4bd78" + }, + { + "blockNo": 2810000, + "hash": "597d71f915fbc2f526d1946a4b577a1e88b26fe8926437fa90ffb4a431b8cba4" + }, + { + "blockNo": 2812000, + "hash": "abb0b9bb05e7594d3f2acc3abca6f007815a9bea8418a6b0e5cade4085b54f94" + }, + { + "blockNo": 2814000, + "hash": "518627885b3dc1744cb7c81a43fa09e23a8a8c6784725f43ba2fd1995616c46c" + }, + { + "blockNo": 2816000, + "hash": "94ca9721cb798cc93650808a9612b5a03484776ec6ed90e1c22fd20904daf407" + }, + { + "blockNo": 2818000, + "hash": "325cff9df19190ff1c4aa60eac97bfaf875b9089850aed4766767e47a831b793" + }, + { + "blockNo": 2820000, + "hash": "3bae4dabaeb38b1eef439d3212d138ad5eba483a466589c614a7e5e6d75a3505" + }, + { + "blockNo": 2822000, + "hash": "af55e312dfa49b50910a565dc89003cc84ed3ac3d4078ab8530b077d0bb3f63d" + }, + { + "blockNo": 2824000, + "hash": "c6ef7edf72c0d680a335be43d79dd12965685f114d0a31a12a6d4419f996433f" + }, + { + "blockNo": 2826000, + "hash": "886a760a53a3092ba8e73317ac6554c05e84a957cc162b372a431b364ebb0c60" + }, + { + "blockNo": 2828000, + "hash": "a43208a4ae778d869b91bfaddd0b7b0d28ce3c3eaa14d4ac5da9c3a0411f88bf" + }, + { + "blockNo": 2830000, + "hash": "957679f724ad4163e6104fbf0f8d98579f0e3c6fd3ae3d3f84d5ad9d92cfdf51" + }, + { + "blockNo": 2832000, + "hash": "2a357525664a7c54c76aaebb96a1fd0eeb84280dd20aca9cf39a08661a3241a1" + }, + { + "blockNo": 2834000, + "hash": "58b54bc36065455d6b31333e9814f8d4be951e736aa60f26e911dc3d781b1b04" + }, + { + "blockNo": 2836000, + "hash": "4154c8a549069dcc6f63289d3a6491138c4b616e506040e6793488fb4374e0ce" + }, + { + "blockNo": 2838000, + "hash": "0cfd30d33df3076b0a0013d41bce2e48c11012a223f7d930ce8620024aad60ad" + }, + { + "blockNo": 2840000, + "hash": "9a1fce6cfdf4c87b650cbaa1956575d6503eb4f155cfc73e897db41722646c0d" + }, + { + "blockNo": 2842000, + "hash": "1118a114a9f401f79453ae0d1add77ac26ee12c0f0a8e9419cc360513432fe43" + }, + { + "blockNo": 2844000, + "hash": "0904e2ab4141aab25ca583b7ed8d06953281638e567025cc48960b59aa4785e6" + }, + { + "blockNo": 2846000, + "hash": "c63675a1c0ef5f1bb99d5093150efec97a77e7f5075c23a2b9cdfaa923aa382d" + }, + { + "blockNo": 2848000, + "hash": "e05edab65810996b06a9eb9c3df09259d593742dc48373ad766205810ca3db87" + }, + { + "blockNo": 2850000, + "hash": "6530f7f7518cc422f1bcee51a4f3ea537e0a42a72be61c43644250aa42e4d216" + }, + { + "blockNo": 2852000, + "hash": "522e1109c1b14a9b1d204c649697170a7a4364e83af516e4126ea46073371dc7" + }, + { + "blockNo": 2854000, + "hash": "46a6ea0217d7f25ca2c5df1fed8ebc30e04cfe21eef59fb6abfddd4c5323645f" + }, + { + "blockNo": 2856000, + "hash": "64db3311c57b5d5c42f1e6b411f9178c45959deaf04db63f4613c93771dc3ce9" + }, + { + "blockNo": 2858000, + "hash": "99c12a139703680ed301b11ffc2f9f2d34ffda37ed3f15aaac20be03ed7d7c8a" + }, + { + "blockNo": 2860000, + "hash": "ff063fc13a7aae05c6aca0e2778c446221d0bf89860b81ca4223ae4e97c07e5a" + }, + { + "blockNo": 2862000, + "hash": "a6ae9e9c6180d36a95e3e416db771aa758e8b7208bbd00a878ab06e0b31ef8d5" + }, + { + "blockNo": 2864000, + "hash": "0a54d5c7bc551731de966a677122bb4dbf2bfdda5bcbe62a01756b0f136801b6" + }, + { + "blockNo": 2866000, + "hash": "8ed28e8e118270f3947c5741616893d443b78b37d85035bd6ed1d802dbf9a3b8" + }, + { + "blockNo": 2868000, + "hash": "012a501beb8e2740b4cc3e91f303ee7fc011e5dbc285b5a250a2e0b30f54248d" + }, + { + "blockNo": 2870000, + "hash": "64d997373930120e1a02858baccf8d91d555b30ed8f02a0c53ebd6abc20ae7dd" + }, + { + "blockNo": 2872000, + "hash": "690ed027dd889cf61313992bad45281d6a2f5e40a952507463c58a35a5581aac" + }, + { + "blockNo": 2874000, + "hash": "f02f15912d3fdf7659d02a3c4fac92376946c2ed6364a821452631e490260ddd" + }, + { + "blockNo": 2876000, + "hash": "7a1870aae80b4137f4c22880b35531a64e81342eb36c8d71dfc102dff15796ce" + }, + { + "blockNo": 2878000, + "hash": "1bd824400e44b67cd77f2c3daab72654d2cbc865b6b4040b828694305c0392f9" + }, + { + "blockNo": 2880000, + "hash": "622f8c5c6aec882383610d1130636b2bcdba797ed0096e735f3166103db96db1" + }, + { + "blockNo": 2882000, + "hash": "d3d91674bd0eafe3fdf40f63f18ce4d967243d597691efdca69566c15ab41a13" + }, + { + "blockNo": 2884000, + "hash": "30c36363e136d1d342e58138f2d5ac232f36c74ec5dcb4392da770195b085a1d" + }, + { + "blockNo": 2886000, + "hash": "d722b05c84d09593576b62c9250dfd896b1324026dcb7f1e78c2fa89245c3bfc" + }, + { + "blockNo": 2888000, + "hash": "6343fa076c5eed4e04ff393052f11801167f3d74d92e201a5d7d5cfc33eb36c0" + }, + { + "blockNo": 2890000, + "hash": "aab44f015f1016a888b7ae659f5bd46474d394961b9c5127582b45dd59f6868a" + }, + { + "blockNo": 2892000, + "hash": "fcf6610a352fd286053fc278670da82a439ab2903969f4104ffd07d1fb36707f" + }, + { + "blockNo": 2894000, + "hash": "bca82d757e2ff435c1f9cb9e33ab7eea5e42c13fc8c2e2611d9f2f55d3a0b124" + }, + { + "blockNo": 2896000, + "hash": "e9d7efe3beb2747241a4c1627738683ee1d237a8b3c842516bbbb8a97886e0af" + }, + { + "blockNo": 2898000, + "hash": "2a89b732cac62d8cfabbf1f9c978841afd140f2a65c87fabcdf8ef6d1cf5954a" + }, + { + "blockNo": 2900000, + "hash": "55e244e8d8ac15155f91641bff84db2788f6274f43b412464f963140290325bb" + }, + { + "blockNo": 2902000, + "hash": "f9439c161cfa6a0fec64419e1bfdb1115c5e541a376f6c04c15b5e22cd2f55bd" + }, + { + "blockNo": 2904000, + "hash": "f864cda93aca205e7a894fe249ac78ec237693b38f0119e10c652c4592a9db26" + }, + { + "blockNo": 2906000, + "hash": "8ee70e2a39cd6f027ad783a6fa65d4323a4f4759ba2e14471a748ed5e0bd7106" + }, + { + "blockNo": 2908000, + "hash": "2ecd284ee499fc685f60b334563d5f5899af3be0600068f1cb92efa80d502bc3" + }, + { + "blockNo": 2910000, + "hash": "22fa83cc1e2f849ed8368c094648e4025ae75c05a2a55fbc5fe85329f09947c2" + }, + { + "blockNo": 2912000, + "hash": "011545eb98a5469b407455789ee8e58b1970cf8ed0daa695ceb00e3708fc2c64" + }, + { + "blockNo": 2914000, + "hash": "40e3bd94dafb211284811486386f679a405015fdf2df3397549d5b9eb1828f53" + }, + { + "blockNo": 2916000, + "hash": "f6c7c58d4be89309bf4c796626bd27f271f74e9395bf71a3282529be7e74ec20" + }, + { + "blockNo": 2918000, + "hash": "5f8d40ea8dcca6c608d4f7e434b4ecbea35f89d7f3f251039839fde320ce47e3" + }, + { + "blockNo": 2920000, + "hash": "cac7aebc607990b34f59c98ed7a34fd8ea48a568dea539834eb083f0e4548bf9" + }, + { + "blockNo": 2922000, + "hash": "0ef4ad73119c5de319acf84a356b945bb7514e203dbb5875e487ded05f34f621" + }, + { + "blockNo": 2924000, + "hash": "4f04973f2c846dc90d4e98c355037bafcaaaff66e07537bbefca18100a2ae698" + }, + { + "blockNo": 2926000, + "hash": "72a4dc8007cdddf5127f919881228bd6b61a5bceb61831e7e55934cca9d699fc" + }, + { + "blockNo": 2928000, + "hash": "bd16668947e82454a92eeec7f5c67ce164f81aafc6f6a7850c24ca46f8f626aa" + }, + { + "blockNo": 2930000, + "hash": "29a514f7c862cfc13a901ae45985fbb17c03b4a1abcc134ac0725f68794d4364" + }, + { + "blockNo": 2932000, + "hash": "ccde666b5a48192f9cf051bdf9d837142c423a5cfd262f0b03e4a2724547bc6e" + }, + { + "blockNo": 2934000, + "hash": "df5f69aa161e97bf44b76326b651999abb0b61be587573ba9774a823ec468c8d" + }, + { + "blockNo": 2936000, + "hash": "c214cf156cae4ee4c1351c3391c9c78d97975166a2c9ef0cbda96f6ffac31846" + }, + { + "blockNo": 2938000, + "hash": "d83cc60f8cacee5ad113069581bd6b097c9aa7b6cee76fb1626133dd82468ea4" + }, + { + "blockNo": 2940000, + "hash": "ac6f7ec2f9c46f115b7bc2c052a6fb9bb353dc881fbb5a47b8cc2aa3cb5f2e47" + }, + { + "blockNo": 2942000, + "hash": "49c3b4e04676658d4c9210b44a958e498283e93bce59a04533a65d336903a6c7" + }, + { + "blockNo": 2944000, + "hash": "4454d6b3692df540f1ba11998e62e528e7f61a0af08a149dd0849c60b7eb1ee7" + }, + { + "blockNo": 2946000, + "hash": "f819cd6d21331a9027527340f73bb819d99ee315ebf2fe4deb5057dc41eaecf8" + }, + { + "blockNo": 2948000, + "hash": "b3b4f4472fd8ffd179d30572842aa87cfc2a0c499e6ee59d27ce16431b277867" + }, + { + "blockNo": 2950000, + "hash": "27ad55f4bdfd2a398df1816df1341e37a3070ac7afaf2d9a1dc709bc45d84fa0" + }, + { + "blockNo": 2952000, + "hash": "0c63b793fa297aa4fddc0346d6470fcc13cb6cc85a4ec6e1b2bccd03fffc4fb5" + }, + { + "blockNo": 2954000, + "hash": "6ae69ef56aa8ec33233101082e37461e13e80b6f9ee944656df2a47d827c0351" + }, + { + "blockNo": 2956000, + "hash": "67b6c22f85a09fe6a74bcca10c7c6f5c1eeffc3a5edba2ee39246447bd5dfcd3" + }, + { + "blockNo": 2958000, + "hash": "66958f5de482adfce577c6ebb8115dd88ae121523ee606b1584e82a6cc1887a1" + }, + { + "blockNo": 2960000, + "hash": "6b532134ce350e10b7b4dd6167fd467dc75665c6c142ab4d6979ba552d5e2092" + }, + { + "blockNo": 2962000, + "hash": "48da70c2491c005f65cbe0162983546dd346c195bf630ff59451ac361871af5a" + }, + { + "blockNo": 2964000, + "hash": "6307adba2c06ef8dea26b9b936cfe520126bdd0cee1d2b701330d8b702118411" + }, + { + "blockNo": 2966000, + "hash": "5884a1727e64adcf4da098f63bd1b3f8e4e13ea0297ec1e5e3d3f857759e8ccf" + }, + { + "blockNo": 2968000, + "hash": "5194fc0a36b086c1e235584632215e413d4f98a05a88ff9ee00b8b4ebdd69846" + }, + { + "blockNo": 2970000, + "hash": "9d4f0be2744f07527dc89d7146a16a340d3231bd0518adc489091e8b38dbb7ae" + }, + { + "blockNo": 2972000, + "hash": "e8b903616bb0ed82b3885813780ea10bf9c318ad456cf63283d41865cab3b1e4" + }, + { + "blockNo": 2974000, + "hash": "9e4ddf8c14bdfeed39ce978acb3b12f15309e7eae00425e6152a4a4fa7c297a3" + }, + { + "blockNo": 2976000, + "hash": "8e81abe2c04f540acfc6a25269ab870f266d3ee81f5ecfc641df0104d9ff9922" + }, + { + "blockNo": 2978000, + "hash": "84584daf613ddaa023ffd7f6271647a632a61c62d0aa413de2151b1448ce1488" + }, + { + "blockNo": 2980000, + "hash": "96a050b166d3243f51eded6ed51971c781b0c4d88268803c9df52269403acac2" + }, + { + "blockNo": 2982000, + "hash": "abd71d6cd0799e6552f77760bf89a8bb88b49e36adbe8e73d706fe66cd61134c" + }, + { + "blockNo": 2984000, + "hash": "4ae7cb3084da06c77b5a9417188a127e96560ea4c3f577b74d138a118cf4124c" + }, + { + "blockNo": 2986000, + "hash": "d55d8ba902015722d5a017c4f807044eba301f277d9b05158cbe43af4f2b8c00" + }, + { + "blockNo": 2988000, + "hash": "5f124e25047491211befddf04509f34245aacd24128efd0eabab1fd916d0e28b" + }, + { + "blockNo": 2990000, + "hash": "3f05f2cf926869b4a0622853325912beb4baf94fac999c833648824108d5a59b" + }, + { + "blockNo": 2992000, + "hash": "3e515358898cedeac5cfdb05caaddee2821426b81fddd598ca4c42d6215ea1c1" + }, + { + "blockNo": 2994000, + "hash": "2562e24ab0b69c0d218d7828f870520d6ea3c5e5fce0b5d05d05e9fde16c9d3d" + }, + { + "blockNo": 2996000, + "hash": "66564e150bb72b549c385aec677fc0c76ad242da940a206236ce8cea328da53e" + }, + { + "blockNo": 2998000, + "hash": "edf22091c87afadafb73aec7fd43e00e9990fbe6afbb3c8bf5b24f475d988efe" + }, + { + "blockNo": 3000000, + "hash": "91c84448d73d4c9557229b0eba83c0943f9c875f906a8b3f8d07a1fc284b8354" + }, + { + "blockNo": 3002000, + "hash": "13b308c944f6c79d5565d7d4d6fcf9d7023baa9b176cf698b101c5eed625545e" + }, + { + "blockNo": 3004000, + "hash": "d6df7b834cce19e109b3821d71cd476cdd7ee75e443b7e217e157ed96173a55f" + }, + { + "blockNo": 3006000, + "hash": "c6ee9e7646eb2e87852c9eb620dfd21225808baeb5aeb419316a061da83a060e" + }, + { + "blockNo": 3008000, + "hash": "ee535a085093d6ac8e1cad3582f9f5197895fadc083a975556a4f25ca140f4e3" + }, + { + "blockNo": 3010000, + "hash": "12169566f26e63a11d2a6b27d37ca2d29241751d606d6e43c4ed9a526fcc33d1" + }, + { + "blockNo": 3012000, + "hash": "215e42d3f16b606deee3783ff5bd235f7d749fefb7f3aaceb5ebfc19f5e460fe" + }, + { + "blockNo": 3014000, + "hash": "869acfc76707fd90c04841d28264619313132f048f849f82ed1dc33200c926cb" + }, + { + "blockNo": 3016000, + "hash": "82ede50c1c13814bd20c69170314f49953c74b914bb5bf4070a68f303d94b1db" + }, + { + "blockNo": 3018000, + "hash": "13d3ba4879c79e564a1227c819ba8bb968361f2e96fe19ff1b5b6c0640bc4e4b" + }, + { + "blockNo": 3020000, + "hash": "5e06c7e72f06df165e47091e162c1579cf1a96d0b7396a43bf0b19a45184d737" + }, + { + "blockNo": 3022000, + "hash": "161058afbe4439ac4e787b00cdb58bc71ac55e1a56af4bd75a138d0ec25d1fbf" + }, + { + "blockNo": 3024000, + "hash": "9546bef55981edeb35f8f94bb2a0ff3d5fedfa77e2b146d7f76601baa4e22936" + }, + { + "blockNo": 3026000, + "hash": "af174a3f2d6652ab5cca2cb7b2962378a53840f87025a22f4c1884784bd34e9c" + }, + { + "blockNo": 3028000, + "hash": "0b382b1a41c9299cc61f69c3b23ccbca0737abb7275f45bb9ba041862c1e1e42" + }, + { + "blockNo": 3030000, + "hash": "183dd1c24ca310b1d2e3ff89adf571d93a7e494c5b3aac1bf338a5a059dd95b1" + }, + { + "blockNo": 3032000, + "hash": "3f2ee5a0d69b5557fc48b8faa0faf551d7bb996571d4973d9b6da5d8fd83de43" + }, + { + "blockNo": 3034000, + "hash": "a2b13e29d3a21ea69bd58b77c1128c5432eeab4963da4b20515e43d6e763c3dd" + }, + { + "blockNo": 3036000, + "hash": "bf83ecaef35be087ca43d281797cb6ac1be134bd95b39cc0b998419f3ea3bc8f" + }, + { + "blockNo": 3038000, + "hash": "640233c4564371b3e7bded4eb017bd0b08f99d84c40cecf778c36fcd07b4513d" + }, + { + "blockNo": 3040000, + "hash": "2da4cd0c32249e2076bd3c2db658e80aaeb9968c246574185592cf40031ce831" + }, + { + "blockNo": 3042000, + "hash": "9a240593d06e10ebcf73969f9ca445ccd037c02d933a33ac12aed24e8b197257" + }, + { + "blockNo": 3044000, + "hash": "0f2927857042afbbaa4854cea1da76e01a89af79c27e7deb31735ccef1ec33ce" + }, + { + "blockNo": 3046000, + "hash": "5e05997c1192d092f7f8a3012061d53291af2a5d73da8bd2f6025126af054f5e" + }, + { + "blockNo": 3048000, + "hash": "e6ce3e644b3b11d57d88a2e3a3935c40277e63e55e98615f583c85ec8a92b470" + }, + { + "blockNo": 3050000, + "hash": "f19ee738d7a472abd44c53d20c98518f62ac733dbb3f10bcecdec47bbbc14486" + }, + { + "blockNo": 3052000, + "hash": "ddd01a448221f26166d50dade6a237d6770d782d4f2facd1b76e17060bafe2dc" + }, + { + "blockNo": 3054000, + "hash": "f271465d636227bff1d627c6fbe68b5c791ac90f1065b5c33e13a14d3314076e" + }, + { + "blockNo": 3056000, + "hash": "7b916a9c81b3ec398db7011c66dc3e4e2efb70cdf71785ad512ed062d3e48a7d" + }, + { + "blockNo": 3058000, + "hash": "298d150eabbf7a7d29cc3eb014fb703f2a020baf887c223cdd79737b5d519b0b" + }, + { + "blockNo": 3060000, + "hash": "6d6243d5a1eca3f1ce118150f8aac5ab2bc4cdbb7e9d433d7d80972d4d513344" + }, + { + "blockNo": 3062000, + "hash": "e15588492d32af443f9a7e100a6696de150fd2cb568493dcf7783735b9b51561" + }, + { + "blockNo": 3064000, + "hash": "4ff80702b4991d49df86577848d8ab61a5a619a8741e71aaa59ed615ddaa9b70" + }, + { + "blockNo": 3066000, + "hash": "3cf13fcb5e8bb81722bf9990869814f0f6e6130806e5a50fcb658b4112deb038" + }, + { + "blockNo": 3068000, + "hash": "1a0346b54066909248172693c04c739df04f1070145d2f6b541c93c3abcd8135" + }, + { + "blockNo": 3070000, + "hash": "2cb4d8894cc80fa6fc08a99fe6dcb67b8028383e8373fe5c21724d20acbf7420" + }, + { + "blockNo": 3072000, + "hash": "b6655787806e4a425070f4f1d319acb4c5e98690ba51861f0790b9a6a1cf66de" + }, + { + "blockNo": 3074000, + "hash": "500055e72df5976d91db9f86bff093dc642334a64c03be8abc48ed15350751cb" + }, + { + "blockNo": 3076000, + "hash": "966ff3a08871bd3bb4144241de4db9419df777622b2fe87b06c591e3f13426c8" + }, + { + "blockNo": 3078000, + "hash": "707c3f9f5e5fb81311f7b98712d32b68745a1fc4a38371c61b3694f720de6dd3" + }, + { + "blockNo": 3080000, + "hash": "042678f9776fa3ea9dd0433fb5e61028fe2eb25107b662d67d6b1344852aeb5f" + }, + { + "blockNo": 3082000, + "hash": "2d8015a0f836c8d72d6c54f95938542f094a69a99f3e6d904affffa4c9d78893" + }, + { + "blockNo": 3084000, + "hash": "4d0c0e006531baea0ecf92df05441fa757e78e484b5f58b9c211aadd9d869a22" + }, + { + "blockNo": 3086000, + "hash": "07234dc9eebae892b31cad19af4425985ea7737b7a1d04f98b76f5d4d8cface6" + }, + { + "blockNo": 3088000, + "hash": "01eb3adf4fac66f400001caaa9e3fcad4da74d886497c1f208a10d5350ffd7eb" + }, + { + "blockNo": 3090000, + "hash": "523ecfa169add79cebda1498d83f96fe46325fb5ae82915c6cf366ced3947232" + }, + { + "blockNo": 3092000, + "hash": "7c905b36f1598af955757f4a9c24df6004935a7790d03cc9c6c1393084e7243c" + }, + { + "blockNo": 3094000, + "hash": "749df89ba91f303754971f4657a0240a90641fe7de1a7f75687b16eba93e0968" + }, + { + "blockNo": 3096000, + "hash": "59ecab35b8c7a0463367fd2d371fa10b3c0a87fe36e4bbf735fc0cd3d692601b" + }, + { + "blockNo": 3098000, + "hash": "0d9bf22f1c62c3a80d321f75682afa9b5a54591d893016bebf251a99721146be" + }, + { + "blockNo": 3100000, + "hash": "b7a5a23f7d74759ab0d4dc61d7728cd5327bc73c6f7b551d08262f4541403c29" + }, + { + "blockNo": 3102000, + "hash": "25d42acf71429ebf6e572618b179e689d4e860efdc0a788152e57e5bd57d65e2" + }, + { + "blockNo": 3104000, + "hash": "eb7270bb262fd7e24f584f506e17eb48f3115cd99dde35f4a856c5f3c6a05fb0" + }, + { + "blockNo": 3106000, + "hash": "bf696deea9063904822ca8ad9e896dda07c9b92a1c2a6511b32abbf2513d3752" + }, + { + "blockNo": 3108000, + "hash": "ed38a072690e7b624929ef5e264fda39c30f49998c200b0b95d49fd5edf67b05" + }, + { + "blockNo": 3110000, + "hash": "c947fd90a20e3d271afeaf6c83c6a9e2f448b660aa9deca9be9c773b1d478a5a" + }, + { + "blockNo": 3112000, + "hash": "b83e3a0b8e467aed236f7961bf99a8cdac18d4cd4e6a8bc46d36c07e44022630" + }, + { + "blockNo": 3114000, + "hash": "7330f981487ddcdcff82c22159ee48749c7eafa1e59a7c95e09f08a86fd63349" + }, + { + "blockNo": 3116000, + "hash": "144b8f5f8e7bafa17ef43222c55f02a4b2c087ac10f8ce72e68d9ab66652f94c" + }, + { + "blockNo": 3118000, + "hash": "020af7133cffa9393bbd0dda90f79aaa8a090e6b2a574cb783b28e28297ad3ec" + }, + { + "blockNo": 3120000, + "hash": "a624ce8c97f98dcc68b94634f87cfa711c3af72c3fd7c7a5ce0ebd25da641f21" + }, + { + "blockNo": 3122000, + "hash": "ad8aa5be2326650922d5ab6f6b541264fa15413ff24d3abbfa749ab61f6da6cc" + }, + { + "blockNo": 3124000, + "hash": "840a20ada8d8e3ad9a0adf139e79e8786cefce173cf8a2bcc933254aa3b0c292" + }, + { + "blockNo": 3126000, + "hash": "a05f71ab073b9c8d06ba53aaf8157fbb8eb1c16d161786d756eacdc12f2e2dd6" + }, + { + "blockNo": 3128000, + "hash": "09e08882f326775e902e8c457fe94b4df367f8647703f99419f1c7251f28ecf9" + }, + { + "blockNo": 3130000, + "hash": "e4583b58b8d4c6e247b8f37c42e9aef3cafc223dc4ab13727abb9ed9636d784d" + }, + { + "blockNo": 3132000, + "hash": "20a9e6055a1d14137f91b2d51fcaa7983ba2b88f59989e986f5f921be2c81c2b" + }, + { + "blockNo": 3134000, + "hash": "6b9edbd2c0255a36792b33f3193f0eb8aa07293ed03ae45ecef9d5a77464cb3d" + }, + { + "blockNo": 3136000, + "hash": "4469b803b59a06c0bd16813e15b5179015f296b4bcfb680e8d17ce882ede3734" + }, + { + "blockNo": 3138000, + "hash": "a3e62b12562749f8068efc929836c7e4703a64714192e2ee96688fbda3d783a7" + }, + { + "blockNo": 3140000, + "hash": "32b3fd489ef6ae8000014f868d92b5da3c35bbe1b495b7513d44ce4bddf95857" + }, + { + "blockNo": 3142000, + "hash": "02b6909ff1e6c2b91385ce06934e08104f504134fdc4c9f657cf8a8dc2bb5830" + }, + { + "blockNo": 3144000, + "hash": "48bd31934dec06917ff73536453c01dac5ae3286f5adcd1c8f177088967a6624" + }, + { + "blockNo": 3146000, + "hash": "e5e22222a5ec7ce2e51f5bef33bb1aeeafe497bb232a656500b2d0975645f91d" + }, + { + "blockNo": 3148000, + "hash": "af38a336e49579af6ad5e7b86ef2d2e689b764ec99240f0c4e9d5a6d43caa883" + }, + { + "blockNo": 3150000, + "hash": "4f398c4813c96fc090083346a8bc4d62704ffc949ab5819ca7f279bee71edc30" + }, + { + "blockNo": 3152000, + "hash": "00b20973996ec13238867603d08f956faf557c8b4b5e48767c601d389985ee00" + }, + { + "blockNo": 3154000, + "hash": "b2d889e04b452d57da561ef8bf5a1cf5fcefbe92fa4c337c519e4aa6a798d4cc" + }, + { + "blockNo": 3156000, + "hash": "08b6ce84f6d1f27419180c2e201e0896f29ffab837d8bb5e9bfb3a3c9006023b" + }, + { + "blockNo": 3158000, + "hash": "58a15e39f137de5f16986ddd88d9cbc3e99b26409efea2165597c357ced81129" + }, + { + "blockNo": 3160000, + "hash": "24816a230153ed3bddc2c762b3aa968f6c55eeb889bf2504ecbe0edb2b913dae" + }, + { + "blockNo": 3162000, + "hash": "b55fc49ff861efdd953ff51c2ca40d98fdb15b54a9a9e7cabe2da606a4839c25" + }, + { + "blockNo": 3164000, + "hash": "35fd3d84feded29fa98b43d4c8c48c3344ff800505cc5840344163ec8af062cf" + }, + { + "blockNo": 3166000, + "hash": "34f125d30670bf3197b2cb7cb10353d837c21e53df7d9ff429372142bf4d5bbc" + }, + { + "blockNo": 3168000, + "hash": "c4971e4c1b10c5f7910860eb9240e753821f9ee64cf2f1ddab4725407dd75c44" + }, + { + "blockNo": 3170000, + "hash": "4475b3e112b928fbe96c468614cb05698bebe15a972c53c9e4043b52a092d224" + }, + { + "blockNo": 3172000, + "hash": "616304bb4a3a1236dd337d88bc2c149e761605785e78f93c39ccba691a04bbaf" + }, + { + "blockNo": 3174000, + "hash": "e26c7420eb40c58a9acdab76f31aa01810b617e8fa096c8091668103d225d5c6" + }, + { + "blockNo": 3176000, + "hash": "fea647b3a551afa0733e1a04292fe625b5ea798d5478b0b79b2bd6eb56c5be25" + }, + { + "blockNo": 3178000, + "hash": "0d068529529a629f9b556868a24fc38fa39e9aa910b191803cd0c36ae9bbd8c6" + }, + { + "blockNo": 3180000, + "hash": "7c1ed1b0b29e03c8f0f93e22750c80c6244d8bbc2bdb4436cbd3eec08be55468" + }, + { + "blockNo": 3182000, + "hash": "f6a2e26de5ae54bb2ff7a61c49b9095ecc765c01250d1c0cde01fc15d6f1d418" + }, + { + "blockNo": 3184000, + "hash": "8996974428105f494322d0369437c1db1d829d3a51521fceb8575f95d6fd9725" + }, + { + "blockNo": 3186000, + "hash": "ecc3e22415252912e86c55354dda0c0d122cd68504c5ed5d133abe36338727b8" + }, + { + "blockNo": 3188000, + "hash": "82fc19462d9754c220dfad7744e8c81e435682fe43305784e74554a8374f9733" + }, + { + "blockNo": 3190000, + "hash": "de406887d55d57e7d027986297c67cc18b3e061ffd5875425560bec2522cbbff" + }, + { + "blockNo": 3192000, + "hash": "b2b40bbd1ac62970698ad3352620cdb6e1db145ebe06594063c97bc775e98e28" + }, + { + "blockNo": 3194000, + "hash": "0617dc09cb8edb0028be38b5b640488a72e29f73a114c727382e62526c004546" + }, + { + "blockNo": 3196000, + "hash": "ca1c6fe1194db6d1165741296873f1c77e416914cfd93c38766ac2c81bc99988" + }, + { + "blockNo": 3198000, + "hash": "4165ffdab1c18cba4f5571b3d6f36bf86537d97e50348a3b32d5568ab0f3f8d5" + }, + { + "blockNo": 3200000, + "hash": "83bb6a9659044327630da752c09901b9bbe6235328f739fdead78ad3c202b752" + }, + { + "blockNo": 3202000, + "hash": "83dedce585bda273deac8debd1e222d4f9de68f36bf8eab601986ace8b1edc1b" + }, + { + "blockNo": 3204000, + "hash": "b622325bbc19d2317b258b79f42749d92982a274bb2247de1c7ba20235948bd4" + }, + { + "blockNo": 3206000, + "hash": "3fe62daa2504b8afa73ccd436bd1f46ff29fc81f99d750da36a9090232a053bf" + }, + { + "blockNo": 3208000, + "hash": "ffe3a6f3b61e308eb6473821ded4e0ca2aac42d98f38a0a190ff1abdd9353f40" + }, + { + "blockNo": 3210000, + "hash": "f3e46492e317c843ae894dd1e89de0d82566db7a98aa3fc07893d61e16626f80" + }, + { + "blockNo": 3212000, + "hash": "658ea7c3cf742d01da110296c7f0e0bdf5109460fb6c3b968cd7254234442977" + }, + { + "blockNo": 3214000, + "hash": "d3e4ef8730aa25faf88c15eeb0c76eb3f1e18c0d49b5bb64e4ecb3db52e0b590" + }, + { + "blockNo": 3216000, + "hash": "acd00e9070d814f5bce4a2af3e1c67adbad15a057cc08cd795904905bd9cc6eb" + }, + { + "blockNo": 3218000, + "hash": "5f46d8a7b377a056d87bc8625c64494227d7f206d59045bc7c1d2e624c964018" + }, + { + "blockNo": 3220000, + "hash": "438a6f347a13d4a1e5c7dcb6c4743220973c80fd23ed0fab66dcdd20d181941d" + }, + { + "blockNo": 3222000, + "hash": "de8f05f7ad8a4985d2e05e6cb21ea1a59c03be6e3f5d08b995035f1d81701eb2" + }, + { + "blockNo": 3224000, + "hash": "a5c53f9e0c30bfd13f8c34e64f62d1e590cb2b3854b782abaee0effcf5a968cd" + }, + { + "blockNo": 3226000, + "hash": "ded84905d96e95d9b4694c31c5884670005e704bc076ad511b341680ba485fb4" + }, + { + "blockNo": 3228000, + "hash": "34560a5f07db2c2075813722bac371d0e5b3c18547412ee22442c40fa28b1ca1" + }, + { + "blockNo": 3230000, + "hash": "16dc6c315c38c3538f2ef19f6e45bceae932defd0ce11a4eed27e7a6d1eb3a13" + }, + { + "blockNo": 3232000, + "hash": "3e489296a51a836ff5851dc71f788b0ac6ffbb8fca669dc14a3a0288e4427a93" + }, + { + "blockNo": 3234000, + "hash": "cd02fef72dccafb65c28ec62c6c474f458ed1eba290217985003137ce51918bb" + }, + { + "blockNo": 3236000, + "hash": "234fdf874a4fc3b524069ca33104f2f04aad28d6066d14e74fca1cb263b71918" + }, + { + "blockNo": 3238000, + "hash": "00b09cf79c55d9e2e19b07cc1e07ee21365098c81975c4e4bee74cbf11ddadfb" + }, + { + "blockNo": 3240000, + "hash": "bc1777c04aabd7aa35f684e6abf09a3b4c6a5c2ba91b88d259aa5822326b50db" + }, + { + "blockNo": 3242000, + "hash": "304e8bdbe484e6549b2a84173fef0c95c737385ebe793be35e71deaceb5e33f2" + }, + { + "blockNo": 3244000, + "hash": "f3eeb9c6c81e221d6ed727120d1ae27437802d50b745f43fed78a9ca5041b372" + }, + { + "blockNo": 3246000, + "hash": "5e923488db0f919b6ae77302443caea1ab7544608f72e865b2088259fc45d243" + }, + { + "blockNo": 3248000, + "hash": "ba38c57151881f6374e4ebb1c2d52070044d2b72eeccb4ce4ced139e4503738d" + }, + { + "blockNo": 3250000, + "hash": "c6d2b8b202f4e7416da530c972d6dcb6db0f39d1b4a1933fbdf51092b3fe003e" + }, + { + "blockNo": 3252000, + "hash": "2be3e0621a781689e84204ab9860e13f139bf811f4ef40231ae8f91247003c94" + }, + { + "blockNo": 3254000, + "hash": "8235a801081a540870bb73be89d04f019f56fe431892837cdbd34ae9d74c8aae" + }, + { + "blockNo": 3256000, + "hash": "a4f923de16de367f338a0734c83e50d762135318fb4a60535515188a1e91d169" + }, + { + "blockNo": 3258000, + "hash": "2dd610b6c4505e264444366786e901671b55a7841fa9b6ce9dee3be051212a23" + }, + { + "blockNo": 3260000, + "hash": "46f016b7410ab916b0cf9ee471b70d9fc6b38f8bf28a6296e1af5990053cf5d2" + }, + { + "blockNo": 3262000, + "hash": "3a3607cd6a5ba7a78439af43ad524f97ac0e52607c3aaf73b314258faadd7fdf" + }, + { + "blockNo": 3264000, + "hash": "54998a73fe6ee2d2bed169a24c4e688b2c62868499597e8402dd6f9fdd0d650d" + }, + { + "blockNo": 3266000, + "hash": "2e9627369009a6cd5744d625dc038a3311017021290630ad4791c4469c1165a9" + }, + { + "blockNo": 3268000, + "hash": "ec441fbc763add622922e26f80dd6abbe35c298c1e06c32a712c838f0a322f64" + }, + { + "blockNo": 3270000, + "hash": "4e59aab4cfd7a2419a210ea1edcd8c1d7a366e1d3f09820aedc28ff17a6c8a84" + }, + { + "blockNo": 3272000, + "hash": "6461884c9f67d18e1ff87aff2dd3f33056a87065130b1037737679e04f470d7f" + }, + { + "blockNo": 3274000, + "hash": "1e21d9d2f8fe18187ee773c43c17bdb6663950c66140e181d5d8a1d555b4104d" + }, + { + "blockNo": 3276000, + "hash": "b9540f880efb3cc477f3d3dd8240d8c976a2aa208f4ec931fa61b1c621c7d5ee" + }, + { + "blockNo": 3278000, + "hash": "a170f346e725e4a5ae54e3a1aad8dee217997e4cabf0089039cf15a10fcfcc20" + }, + { + "blockNo": 3280000, + "hash": "8c510aa2958e98f1b9a41c3bb856929c04be894ef19eb45084f2d0a54d77c98d" + }, + { + "blockNo": 3282000, + "hash": "666a7051143ddaa443d0721a0e0b989c3c930bdf0e24428374dbdf2a9a277b93" + }, + { + "blockNo": 3284000, + "hash": "2e449122ed906fa054ee716a432f2e5b9f210df620f625bb1197afe735faa5aa" + }, + { + "blockNo": 3286000, + "hash": "b993428be2d359952f8d59d7c167c66adc5b0b00f55f4dab4fd540ec5a5ec231" + }, + { + "blockNo": 3288000, + "hash": "1b4fba53c4ca6ab109474469bf8b26e3ae2f955f7a75e4063ff7a1c227227ecc" + }, + { + "blockNo": 3290000, + "hash": "78fb2c459fbd8df05cc2585fcf930c375e45d3fa1333713053bb16d4d0fcb073" + }, + { + "blockNo": 3292000, + "hash": "2dd2f2aae172607e4649de602cb06e9eea6bbee0f8c4bcccecf1bfaa1e8eb734" + }, + { + "blockNo": 3294000, + "hash": "69c378b6132643701d83464e6ec06788470b4c9f2963aa67af9384b6fb716973" + }, + { + "blockNo": 3296000, + "hash": "dd56eac225fd277c72deb21d15fdedb42a1a1a57de475ea2cbe05e673fa67ab9" + }, + { + "blockNo": 3298000, + "hash": "6f8189bcd02c78bc2041d2fc360d67da52fc1eb62ea4af49ce282711cb94782b" + }, + { + "blockNo": 3300000, + "hash": "68d05e03c4c6e8719eb4dc55a220e7e187c3f6c08af109b2793b27b076cb4f44" + }, + { + "blockNo": 3302000, + "hash": "8863eeae40952dcad3d872b60b0ad8438ab4c48fe92e8c2c549619dad92dd95e" + }, + { + "blockNo": 3304000, + "hash": "60b2eaef5c295e49f668adc426464a3f2cde7a16881aaa5e7e84ee1a8723998d" + }, + { + "blockNo": 3306000, + "hash": "130df2797913fbcd1c18dfa9b8978fbaf40069c5457dcf328399a665fb6b3cb9" + }, + { + "blockNo": 3308000, + "hash": "18f97e94b89b036d0a155b64d045b66d1dbef4e3db40e0bb536830d3ebdfd227" + }, + { + "blockNo": 3310000, + "hash": "414ab773f50f45b9382fa8a3b734c5868888a79d6ee949f1649ca63070fe24ca" + }, + { + "blockNo": 3312000, + "hash": "873682cd720514686101ffeda1250e9d4b1222d69f237fdd40c09d190c530483" + }, + { + "blockNo": 3314000, + "hash": "70b958bad04988218ee5ab441842057c3e45f00ebb7f7c8907a4f7997eabb24e" + }, + { + "blockNo": 3316000, + "hash": "51aa6787f2b7b1f8508adb0fddffa61d6355b86d4de8856d9a07c186c05a2adb" + }, + { + "blockNo": 3318000, + "hash": "f858808e1ecffa0b6487723dc2b1710f1e4d95476fcfe3ef67721f3b613a0820" + }, + { + "blockNo": 3320000, + "hash": "bbf233aaa86321d7c6cde25da439f7cf0a9b4687477335231abb2b802e579c62" + }, + { + "blockNo": 3322000, + "hash": "10b6160f9dcae6ef281628bae8b1081040dbeafed640527d7dc56e0b22078af2" + }, + { + "blockNo": 3324000, + "hash": "c1ca02f95b2dc8c01805fe5cb661f024cb453146996f1e44ec885507c0eb9411" + }, + { + "blockNo": 3326000, + "hash": "f21078da6bc83c91b1cee2f69aed7182705eb3d819dfaa18edb365df900f2260" + }, + { + "blockNo": 3328000, + "hash": "37a31c05d64966bb439e8ca296d0413fdb89cb32a28021f7fe11212e5305e3d0" + }, + { + "blockNo": 3330000, + "hash": "31208f0f2384cd8fca0f1ad7349b19bff1e85ad46c2ec7a9976e1cab117fd598" + }, + { + "blockNo": 3332000, + "hash": "b3b2ab5665dc4759d160e171e00221db2b7ccd723991e7248027563ae804ca33" + }, + { + "blockNo": 3334000, + "hash": "b30d231426981916df15477462566b2a3f7ecce3c0e5d72195b1fdd2ed7a61c8" + }, + { + "blockNo": 3336000, + "hash": "804161c67494fdcf6aa99d235cc128c20f22ce4c4f8be462b0efd33d8685a518" + }, + { + "blockNo": 3338000, + "hash": "f3f2245fadeb815ccf2ed57137fbae2cca1f1af39ce249f2c03f8f17a3d892d0" + }, + { + "blockNo": 3340000, + "hash": "a3c8dcfb8e13a66df939def79cc12bd13a784884ab38a08b656e369b746bad1b" + }, + { + "blockNo": 3342000, + "hash": "02159812282ce92d86502b2b502c9a3f94de16e43e3fba4d00b10640f67a289c" + }, + { + "blockNo": 3344000, + "hash": "e94ead52b37596fc9a0e02733a5e8f0b3b0e95a169700a2f2a5f9c026dfd5794" + }, + { + "blockNo": 3346000, + "hash": "548b2202153ccdcedf3c3f773bde56bd177580af841fe635a579ac23257930fd" + }, + { + "blockNo": 3348000, + "hash": "a4126d27b65b4a22b082fba066633b7c8974120a600ef055ce3425afb355b1c0" + }, + { + "blockNo": 3350000, + "hash": "b2056f4d24bbdb79126502a4a2ecb5042f1dc57d9a0f9436ed1ca4dcb5cba73f" + }, + { + "blockNo": 3352000, + "hash": "d0c3c47e43f21162ffec3983a4b2bf34b51b448ae36db41b3b2f86bc4edc9354" + }, + { + "blockNo": 3354000, + "hash": "5149278e587f498dd237807da8e5bd85dfd1cb7cb0db297800b5b195f296487c" + }, + { + "blockNo": 3356000, + "hash": "46cfc28aeb4418858733754553a6ca11f4e661b1c39e371babf3dfde8010882f" + }, + { + "blockNo": 3358000, + "hash": "fbdf531d7055057ae364f41f1bbd2867ca26bc326383022408baa0e241fc7db7" + }, + { + "blockNo": 3360000, + "hash": "e0403782de99f83d323dbde363258a1cbd12c90ce12796d58edfbc5dd2b69bfb" + }, + { + "blockNo": 3362000, + "hash": "128ed0efa1124fc5d3cb48cbc870e57bdee3516b2a6e72c74448056312e20156" + }, + { + "blockNo": 3364000, + "hash": "1b9fa85816feaf014b0e90091d47a12cacb6c848a1ac119c0518156a71d190e5" + }, + { + "blockNo": 3366000, + "hash": "eeb72d1d2443ac14580e8bb167f74cc15e172e103dbbc4bf537c14d2b68da5e0" + }, + { + "blockNo": 3368000, + "hash": "46bb3dc5c50e472d5457d48130be9f8d95660a796c127eaa30ebc14e33a5feee" + }, + { + "blockNo": 3370000, + "hash": "07fe3613ed548d23af13797fed123a32311e92e2a0a38473aaf87f657c87c1b7" + }, + { + "blockNo": 3372000, + "hash": "2a38eb9209254ec8854a219676ef9aaaad76c56d6d9e06a11e0f0844bb23c745" + }, + { + "blockNo": 3374000, + "hash": "3b739c1c196986dce9380bf909268f5aec34dc2bea38684e6ae79bbc92e17d24" + }, + { + "blockNo": 3376000, + "hash": "55d5259a59381a6a72b68927ed3c750fc474d409e9279e1d1134a5275b41b1f2" + }, + { + "blockNo": 3378000, + "hash": "5ecfa5c14bf9b0d389b4656025f42f08dcb160fcf28ecf5e2f754d4bee58b534" + }, + { + "blockNo": 3380000, + "hash": "9b5280b10fba8b401aa73c810317ba73251221f97d562b0bc80998619940cb21" + }, + { + "blockNo": 3382000, + "hash": "41a80f45825a7bd857b8b5d627f49112490e5957e1b17002011fcde083b1b1b6" + }, + { + "blockNo": 3384000, + "hash": "f6216c5284610d69497f2f62c1904e26aea86f4cb93f212064743ed3f38be46c" + }, + { + "blockNo": 3386000, + "hash": "9dd7d73318f0e1d9e279e9912acca72e0cda0ea295b9357c06338014d1ba7e74" + }, + { + "blockNo": 3388000, + "hash": "deadb2b893ebe1a08a0931ae3ab8ef418181fdf2ce4d2b00d5c78ef3e0970ab7" + }, + { + "blockNo": 3390000, + "hash": "3786d7ae1108113398af196a555406d030e6be8ebb3c092c014682fddffaf1e7" + }, + { + "blockNo": 3392000, + "hash": "6dae8db7a2c81e113e42cfac7dcd8dd92014100ea8bea2ba345dc74d09a7bb60" + }, + { + "blockNo": 3394000, + "hash": "260015f104d24be3683923a43f3876ccedc1f29f7c15101e56d2896fd8bf047f" + }, + { + "blockNo": 3396000, + "hash": "32a9a24ea8f64fb226e461e8b43bf6a78a6c932932a00d03456d4ad4d4878e50" + }, + { + "blockNo": 3398000, + "hash": "a7ab1600f1d2324877f8ce9b42e06f5418ca9deedfedb2d9b54d5803b5ef5fe0" + }, + { + "blockNo": 3400000, + "hash": "88c8506c5fd9f9cca20363dd2844219e45b3476be28c03a75c4acd6d6d8641d1" + }, + { + "blockNo": 3402000, + "hash": "ebaec6763f461c6a2b2aa8ba22c63390c9b27d6673980e1c0321c20cc50d3f84" + }, + { + "blockNo": 3404000, + "hash": "a3875136e42e2e7a3350adf096b232a418e502f58cbfdab82e4704d75003316c" + }, + { + "blockNo": 3406000, + "hash": "5deec9a3d9439858d6c320f5e70c18d9a4543b5c013661a355868ba231cc0805" + }, + { + "blockNo": 3408000, + "hash": "107a3c7dca3d6e9020f36832c4b7b38112d0339bc7f6dbc00452cbbde2033125" + }, + { + "blockNo": 3410000, + "hash": "ad6a976b38d63fd71573f56cf2f7477a087fe9a512935cd8b046b830af4aec01" + }, + { + "blockNo": 3412000, + "hash": "f5b6887775c7ce25a2783aecf0d997be83f8c0ff7dd2e9d09d5a22d36a4394a1" + }, + { + "blockNo": 3414000, + "hash": "90d7de2b83678d9e3a315d61f4c57b2c72f8aac6fc58520da800b63af6f5708c" + }, + { + "blockNo": 3416000, + "hash": "de3d39c6227ca2233eddd44e9fa26ad04440cd1cb17d203d3c4ee8879b37dce7" + }, + { + "blockNo": 3418000, + "hash": "fd5d9f892a564a856d8299e09ef0adf0bfe2c9d8352dbb0460a9667118cc13ac" + }, + { + "blockNo": 3420000, + "hash": "95e98b3ef2262d703fa3c0a22cb90029ad59f07d959f903c069283109ff29d8c" + }, + { + "blockNo": 3422000, + "hash": "711d1f42639a83a4812021ddfc98ec0b8e6148ae87bee5a88440fa4bf56936a5" + }, + { + "blockNo": 3424000, + "hash": "52933c059860f729efcde84531b1c0b7ab35ea3c264a7422d817a7c0906baaf5" + }, + { + "blockNo": 3426000, + "hash": "5a48c52f9e1353c6fea0ed9615a623dbb13fc8c9ba47dc47ae1f87400d8299fa" + }, + { + "blockNo": 3428000, + "hash": "27b4e4fc9e59bf6d982449804be667c77fa3581d74aada707b9348b83dff6ce7" + }, + { + "blockNo": 3430000, + "hash": "562bac677870943930db49108b4c425df9eed56006a2f2c11b75e49494d95449" + }, + { + "blockNo": 3432000, + "hash": "cf4896fe1708f8fe05c3fb5e0e5b45a065f04efb6c521f70ebd9c0eb3b28104e" + }, + { + "blockNo": 3434000, + "hash": "9cb014bf85826a8b174476c26076f0db35699f6d4a6bbfb32f699da2936faf52" + }, + { + "blockNo": 3436000, + "hash": "1779032a4960d17277276490e0464c214c5ffb86cefa311a3c8f1de9026af3a2" + }, + { + "blockNo": 3438000, + "hash": "64058cde585882f9370494b82b93eb30d7660660ba2460d8ff4421787fbd6833" + }, + { + "blockNo": 3440000, + "hash": "85a6637e51262628ff3e2d8215ff8d826e8c9e901313b9339e13e68ca0a37fc6" + }, + { + "blockNo": 3442000, + "hash": "81474a0eb1bdf4ab7b5fcb9c51abd0e942730da86954dad920057f06d4924e30" + }, + { + "blockNo": 3444000, + "hash": "f18c1019cc13f22379f3498f347745346f245d112bed8089026b8438e123ce1b" + }, + { + "blockNo": 3446000, + "hash": "92e596a05a6f54a927f5cae085e4069b4fac7eb3f30059406a05364ba7df566d" + }, + { + "blockNo": 3448000, + "hash": "0317e633a5cc08e3bd38b4dc0fc01adcf8b9a6179a1a4203d16c1ed7713278ff" + }, + { + "blockNo": 3450000, + "hash": "889910299a6ff018d3fee61f03e8e4d9860772cc1901dfce40e5881d62843d64" + }, + { + "blockNo": 3452000, + "hash": "f4f8694dd211f3e6b2275e95a12cb80a3b5d2ff951642e56bd137531f54f1088" + }, + { + "blockNo": 3454000, + "hash": "8b08162aae9fc748619029e5e7e394fd04cbfdf7a8be921d55de1f4b287b1464" + }, + { + "blockNo": 3456000, + "hash": "43a11a953d97476d96a3a7c226d1abb83a7472f3b1b3183ac16994fe1247ad05" + }, + { + "blockNo": 3458000, + "hash": "95bfd694fe68c1789e8853d3527dff9daec104dc611261b992d2e02a013d6b3d" + }, + { + "blockNo": 3460000, + "hash": "19b6dda137ff0a97f52b441302356522bd0158260f82831dc94ad38248697f52" + }, + { + "blockNo": 3462000, + "hash": "dcab9df8faca14b29692018f4d425b023be04fdcf341bca7f10c6aea582f6243" + }, + { + "blockNo": 3464000, + "hash": "31298a5e5004c952541fabfc37c85c7e2fbccde86daf55ac5ad4578d6032fae1" + }, + { + "blockNo": 3466000, + "hash": "a4a3f938da21f78be806ff2a764d21cbff2ad94dde21abb009725927cb67dbb9" + }, + { + "blockNo": 3468000, + "hash": "4c4da83d53580eba3a22240ba18921c66fdd1c01be35fbe0d0c5bc7f883f9f28" + }, + { + "blockNo": 3470000, + "hash": "3314c80b7aa0795fe31b13e9bbe64387bfc92d740e64b41f6ab71e7985a44cda" + }, + { + "blockNo": 3472000, + "hash": "73e60c961404638c698817a459a246585a925ebd5f06ebc5c97abea670893e2a" + }, + { + "blockNo": 3474000, + "hash": "093ab2a73017f77a7ad9f0ff626deaa9fe7b161474a11b76d0602aadef5d9809" + }, + { + "blockNo": 3476000, + "hash": "d20a1b8848eb9bf08e7794367b624769d77b4b4c133dd5bfcb732989c7082921" + }, + { + "blockNo": 3478000, + "hash": "6ce63e3444735585e1fff9677781c6003b3b8704327ff1baa05f1094a0232a64" + }, + { + "blockNo": 3480000, + "hash": "04264e31c4f21665867e6177c755f0e5983a94f9c2d91681d6281c0ce8692c4d" + }, + { + "blockNo": 3482000, + "hash": "7358587f1a12ab87420cb5ab46e3bb84d4278d30e4b58705e9b451908773f0bc" + }, + { + "blockNo": 3484000, + "hash": "ae58a9eac77ee67d083805f1e2407365a8f2e19908b30a2f5309110ebacb46a5" + }, + { + "blockNo": 3486000, + "hash": "904ef07b46b1eb084dd00cd14ad12a992aec00bb19211aca40ec8ca51255a5fc" + }, + { + "blockNo": 3488000, + "hash": "ba4b31c7860c8776632683e9b86b9551935a1680be29c927e2a4e237ca1bf952" + }, + { + "blockNo": 3490000, + "hash": "4ed3698f20f91910bfd705f3673b96f8ae2e9517ce253db09ab6ae92f3dc3238" + }, + { + "blockNo": 3492000, + "hash": "ff03fdd7efe2a87ecdc22f0c9ef8a12e9c196d46a8a9c4d7f2a356371ca9df72" + }, + { + "blockNo": 3494000, + "hash": "6f87a47f07a31f4090d048af95b06303e210db7f387f60c491f5e4f2324bf02c" + }, + { + "blockNo": 3496000, + "hash": "bd9e69ec3e215f174a9a72f499feacf9b90c84bd21431b9507e811781354c21a" + }, + { + "blockNo": 3498000, + "hash": "6586bb4db815c00783d74fa43f08463eb621ae6ddf9b2f074722e2aa583849db" + }, + { + "blockNo": 3500000, + "hash": "a53aef5be0fa9d7a0157b0b97af98d1a3e70ff97aee0848e3002a6d734ae8fbe" + }, + { + "blockNo": 3502000, + "hash": "82f5c3b6c0d9658e189b77a3450fe233c2f2f60e96370d19ee6fafefd1768a0a" + }, + { + "blockNo": 3504000, + "hash": "278027c44d49e09b9808c55a141bdf613004ed436d255f708edbef0344acc554" + }, + { + "blockNo": 3506000, + "hash": "6110c067cfbb5cbcb898618e9c40de6b8b9eb1dc60e103d3ee3a40f1e5e0d7fc" + }, + { + "blockNo": 3508000, + "hash": "e24ce805b816cda4cfc9db3d29c77c34a494cd4d0049e216e36c81872154cca6" + }, + { + "blockNo": 3510000, + "hash": "9160b555c8c500ee846160b65ebad5e9648855756ea3a4efad91d02f37c7880d" + }, + { + "blockNo": 3512000, + "hash": "df2c5250f83ecc316294ff94a063f3072ad03ac5fdb66c96c73d1d8262b4e8dd" + }, + { + "blockNo": 3514000, + "hash": "a2e2ae41e62642afc65229bee9026af1ac41ceb5ca8dbce73e701a5c43ad04ae" + }, + { + "blockNo": 3516000, + "hash": "8a233dd2eaba82b15e3169d277c0ba7b27d1c1ca5d0aec2bd4e7db9d4498bcee" + }, + { + "blockNo": 3518000, + "hash": "7d9407062bb499a20ed51c0e6edefee5f492aaa67666f6560e3701ec0d7fdec7" + }, + { + "blockNo": 3520000, + "hash": "99f7a25be4728140bb2b243b1520a43a69312f6b082a2953593d965a3a7f8745" + }, + { + "blockNo": 3522000, + "hash": "9994c167144fe5724d3629baae496a16aad1b81df6e61ed6b60f3bf1e57d1bac" + }, + { + "blockNo": 3524000, + "hash": "13a439982781410b1f03b550701ce141a427c6e947d39af1e58788a1c1f99d27" + }, + { + "blockNo": 3526000, + "hash": "3ddb6f7c03364271eaa593ee0b9b01471e3dbfc9fe77abaa31d900723f0e2e6c" + }, + { + "blockNo": 3528000, + "hash": "9a17cf9981f2532f5d78eb7ab326cd8095099923ba01545bddccedfd5ceea0c8" + }, + { + "blockNo": 3530000, + "hash": "fb92245ad57ae88cfc4f67330ff3be180c37f15d18495e8c179a2429db73dfe8" + }, + { + "blockNo": 3532000, + "hash": "6cc0669540a3322aad0825ddca18c547335f0c7e1cc377cc64ebf50a46a9e3ea" + }, + { + "blockNo": 3534000, + "hash": "c461cfb1135a6a6ce5f033160696df5f0b36ec188d01dafa6bae91876b22ecd5" + }, + { + "blockNo": 3536000, + "hash": "aa99f1cc5639318fbea89074c9502a9cf8d40005eb40edc12b594b5e7d236679" + }, + { + "blockNo": 3538000, + "hash": "9df565eb7e92d24034af70c877f198fc64171c136b1499b969c39fa3161dc443" + }, + { + "blockNo": 3540000, + "hash": "c88ecfa310e7167bed0485d4ecbb935798a996b9ce1112407f2b80a47bc515ba" + }, + { + "blockNo": 3542000, + "hash": "76154523067667c19654583244674d1caede41abc74a29fed6ff9c5187a2469f" + }, + { + "blockNo": 3544000, + "hash": "9521cd42734cfdb442dca4e3391bb84851108ae54de0e1f7ac72ed3b44c9045a" + }, + { + "blockNo": 3546000, + "hash": "a78da672abbd3a37e254b97f2ff982ed46274f21f838c3017536d4bdea9d2f15" + }, + { + "blockNo": 3548000, + "hash": "623fe18e2e8e6bc3f57bd592fa328082a00515c5428a0ac5abd39455ceba3e4f" + }, + { + "blockNo": 3550000, + "hash": "faa5e014866a560c26f7f8bc95406a6c48d9fba5c457c9bca3487af1287bc6ae" + }, + { + "blockNo": 3552000, + "hash": "9607394282bdc3413716320b49ddec0ce64c51445119d4e5afb5c4b4af038df2" + }, + { + "blockNo": 3554000, + "hash": "7ee8614f0281b6cb2df5e3d05b0c51486e39a861b2aca8a96b21f02edb9cd554" + }, + { + "blockNo": 3556000, + "hash": "d9992dd47d4772542b39239ec2cb617d96983b53576fa6e406d3590ca42c305b" + }, + { + "blockNo": 3558000, + "hash": "4f933e9723dbc6fa97145c00a4f40496cc35a777138df0b88d7fb683d2a32300" + }, + { + "blockNo": 3560000, + "hash": "690717ce41d66df172c4da571c0a76f9afb4bd5f335961ef48636a70e2fe45f7" + }, + { + "blockNo": 3562000, + "hash": "83b6948c7b6dbd6e22318b9ee1ce92d070534a62e1ebfa9bc76458aeacf34675" + }, + { + "blockNo": 3564000, + "hash": "1869b70e410ce814ef4e0fc47b71670f071e16dec48426845811bc5a27e0d5fb" + }, + { + "blockNo": 3566000, + "hash": "9360b0a541ef9ff7c0191701f33e839cb37cbd60388772a053bcfdff0441db26" + }, + { + "blockNo": 3568000, + "hash": "b1a32341019f2a7f0abb5755996553815c7f4a1cb6e5f8d2ba6a9370cc728d8f" + }, + { + "blockNo": 3570000, + "hash": "9a35a4120a67b07a8935f81ef89f15d0d92a7c31a2676c4ae07760c0db45229f" + }, + { + "blockNo": 3572000, + "hash": "046adade84e6c42a60588d3a667cc673740d5f282924b5edcca825071bdac0fa" + }, + { + "blockNo": 3574000, + "hash": "259d169efc763a03d1558248245a806b326a35a15cd1411bed5443b584b83eeb" + }, + { + "blockNo": 3576000, + "hash": "208423599e8c990f00e9cd2a9ee17e6cf4f4449650173edc13750d5b5f849955" + }, + { + "blockNo": 3578000, + "hash": "2c3876e3050f0436c13ebf4406c40d4cc7b702dbfe0fabae10fecd6140724604" + }, + { + "blockNo": 3580000, + "hash": "2716f2ab67a95f63ceb37124dd82e99ca289c6128da1509e6ab155007d3ca884" + }, + { + "blockNo": 3582000, + "hash": "2d33a0a463805494d5ba49d7c5d25a30d01340d1bb7d28b6918cf91eed5ab2ca" + }, + { + "blockNo": 3584000, + "hash": "c929376e2a4f819ade07f95a5c474af6e229945b78fcd88a7739e94a9e16ffbd" + }, + { + "blockNo": 3586000, + "hash": "26ef9effd59613696baeecd497e71ef474ed3a0d293db966940e8cbdedc0889d" + }, + { + "blockNo": 3588000, + "hash": "c70172d09fb1171fa867956cb6dcc9e3ffb663d3d8544d99b0def99f570a55ad" + }, + { + "blockNo": 3590000, + "hash": "c1a721b87088b0e3f99efbc309d0d4b17d2c9663bed6064256e615b65a9e8da9" + }, + { + "blockNo": 3592000, + "hash": "c38b8aff15e2449f5dcfa89b0af818f312a246ed7bfd3f3e1bf914fcd0c60b04" + }, + { + "blockNo": 3594000, + "hash": "e9c16d50ea3e629fd16afe83cc75d1a4805bcf2a66128d1e475cb997d0e7c482" + }, + { + "blockNo": 3596000, + "hash": "9016a7cc87be06c8d9166a71de7149fccc872184a55a4fffde6ceb4afff44e24" + }, + { + "blockNo": 3598000, + "hash": "a6877c58acb3e01122bb9dc31a2125fd12fae3c4730bf6879b1e7defcf2ccfb5" + }, + { + "blockNo": 3600000, + "hash": "09ee0f4d22d8696d622c2e936eacf3b729a8229adfbfd00c73a1a73b5f2356f2" + }, + { + "blockNo": 3602000, + "hash": "3faf1ad3d96c06532834ce898a0c173e834c5ddc15c414c19c42b0db04dde6c4" + }, + { + "blockNo": 3604000, + "hash": "00fd33cfa3ba7a52191075da9633dcc6e572a1fbe3fcca8247bcefaa403ee777" + }, + { + "blockNo": 3606000, + "hash": "e0f2b4437d72d12af823ff9a61ca122c5ef366d2aa0bfc0ddee41a49857d369f" + }, + { + "blockNo": 3608000, + "hash": "fadc972dcb0fee2fefd347cdcdae8ecb0ab2945d44e889fbaab88caf2a190999" + }, + { + "blockNo": 3610000, + "hash": "1d8ce99821071357867328dcc1060ef9da6af7347f2517acd0605b9fe882e3bd" + }, + { + "blockNo": 3612000, + "hash": "21c39f415477dd7ce50d6cde93ec1f415c8f9e54ce0ddeabe10689094a2e029e" + }, + { + "blockNo": 3614000, + "hash": "54c697fec2cfa90259a526a8545aff534166d4e0a9ffde6d553f925eeab5c5b3" + }, + { + "blockNo": 3616000, + "hash": "d326782444603022f8f097af80a305ad684e043e53a83b9a94b1586f7a4cfe59" + }, + { + "blockNo": 3618000, + "hash": "3eeff267f42abaeddd9388432f8a1fcb9085f7bae886e38ea5817897d66dea6b" + }, + { + "blockNo": 3620000, + "hash": "c87167d0982b8fd953d95a51e84bc4828ff27aa1967482fd7073e6a47f6ac88d" + }, + { + "blockNo": 3622000, + "hash": "0cfc29ae222eee8bfe2cccfdb349f7d968d2d10f283ad4626b3e679a8ca59089" + }, + { + "blockNo": 3624000, + "hash": "ef79f1c9676ea27f8f9f0d3d391237175dcd4bad3f0f6cb99f4c7a0205884ff2" + }, + { + "blockNo": 3626000, + "hash": "985effdefe046855c566b9ba8e7dc1fa561d077f91508894bf954e69576b30c9" + }, + { + "blockNo": 3628000, + "hash": "907f51bb3bbbcbfb8b00b1dd0d1d86d728b76986874ad4aab2f869720a6897b0" + }, + { + "blockNo": 3630000, + "hash": "87be33aa09a5e0734c891f527585314544adb7bf05f7052f35e723639e81d7d5" + }, + { + "blockNo": 3632000, + "hash": "baf3d77e8b198ab321c3158560c97ef4787b19b180516f78c15f2c1cfeb56fba" + }, + { + "blockNo": 3634000, + "hash": "8eff046e81a68ff7e77ca10e4091ac8e60b28f53f880d2bd38c4732198bbc2de" + }, + { + "blockNo": 3636000, + "hash": "4af9f4081e5430796e65abbef5894f9633636f20ea227641c5b8f1b9d2f0a3b8" + }, + { + "blockNo": 3638000, + "hash": "052c5547e2313d5edd749b1ad28be571c3882a20e8ef26aa5014269001d2817b" + }, + { + "blockNo": 3640000, + "hash": "66d4b06479eddd86f614f1edb5a866801679e1b69275766cbcceb002f0f662f1" + }, + { + "blockNo": 3642000, + "hash": "f6c61bb7719f1f4c076e5c8cac0feb96f1f51abac83dfab06f215e6ce1f9f2cb" + }, + { + "blockNo": 3644000, + "hash": "f0aa62ae9c236232b89980b515b48b5d35fb11928f261f66515a84044c0ad90a" + }, + { + "blockNo": 3646000, + "hash": "8549d9395fcce7d7446b04c9c1c30417f45ede70f25b345105c25289a749ffeb" + }, + { + "blockNo": 3648000, + "hash": "1ad0b7a6838331fbb48821c53ae54efd63013d84a356778916f6dc2fd747035a" + }, + { + "blockNo": 3650000, + "hash": "f711143e9a3ed8829f07c2e47bcd1e6378787a6bf0074735bca40d7c228d6f56" + }, + { + "blockNo": 3652000, + "hash": "76cb3d7735516b0e9a465dd1d32f6de84ef8f9ab001d950ceac55b57612846d0" + }, + { + "blockNo": 3654000, + "hash": "de7f62374635640865966bbfb257aabc61b95f1b0c9d05659302f39aef2fd72d" + }, + { + "blockNo": 3656000, + "hash": "072a5c2df2b8d0f2e6a3734c0dc8c9203f55438327cb2a77d38f9fe2c94488e4" + }, + { + "blockNo": 3658000, + "hash": "3ff4ed57e992850779b2042273b425e0309e80546ef1018c6e941a00f0c06368" + }, + { + "blockNo": 3660000, + "hash": "4a1af9bc98ecb7519b1f3cdc3c1f3b81dfcf94925bc4eff6ed68c1d4cd26a560" + }, + { + "blockNo": 3662000, + "hash": "724ddc272a7055c6e3e902205626ed2573aeef197b234479dde623fbea74d7fe" + }, + { + "blockNo": 3664000, + "hash": "0cc6bd86e0153b9714f246493800fcd8b0643ca991de362dfd1986b5a2c36300" + }, + { + "blockNo": 3666000, + "hash": "f41fab1ec456306e8d7252d5710bfbc2f940cf2e7f9a3acd4408b02af6df4617" + }, + { + "blockNo": 3668000, + "hash": "b601ab3c202668a817cb8a905cafc2e973b02b3e9a60a49f19982a2e7a5084c9" + }, + { + "blockNo": 3670000, + "hash": "e0a01edf60e4337a3c04b07a8fd52b63bb628fe4c99dfef00df31186de037a03" + }, + { + "blockNo": 3672000, + "hash": "7822ac205b9efe9eec62b11335d9e8a13faab67fb63d7adf93d213f5c69b6e12" + }, + { + "blockNo": 3674000, + "hash": "386d47dbbbb0a3847993135857b7ce4a988f6d10cb3ca6e22bcf800fe3e27116" + }, + { + "blockNo": 3676000, + "hash": "e27475f278f229e841bec2b3f90adf30303273ab33967535690de88319c434f9" + }, + { + "blockNo": 3678000, + "hash": "d9c1f22832b36d5b169138239a495c5c64644b41ae17b8c21f74688b0e1b9213" + }, + { + "blockNo": 3680000, + "hash": "2dd421b8c58989f96c80a3508464441723b4609c506d6146800c6af864b09a6d" + }, + { + "blockNo": 3682000, + "hash": "5fe559b62e93161687c529970a719a3122cae3a61b13562f9ca03464ef7c1720" + }, + { + "blockNo": 3684000, + "hash": "a503ff371253f49b760024b005c6844329fe2d12e01305302afa2aecc9cd11ef" + }, + { + "blockNo": 3686000, + "hash": "9b3f811589b22723a14697ac3e18e1b56db5047f91ce5bda3a5a40120f70d0d3" + }, + { + "blockNo": 3688000, + "hash": "ab7bf1f8ba5d7bb814cf2c0da91ac7029478c9727ab02825cba5d83c506ef0fd" + }, + { + "blockNo": 3690000, + "hash": "d161ba2fd50ea8e9cc38049a41f66d68e759490d380c1d13fb194e779de50e83" + }, + { + "blockNo": 3692000, + "hash": "0cb9c4983a22785f8bb60f7a8a44ff9dc6386c000736d27ceb1c47b96f2a66a6" + }, + { + "blockNo": 3694000, + "hash": "625c87243c658f19c89f5a6302419cb6755a538666fc94f8460d3cde4bb71d31" + }, + { + "blockNo": 3696000, + "hash": "3c96be68b01a754285e33b18199925daf5f9b9dced6d55010226866ffa9e1353" + }, + { + "blockNo": 3698000, + "hash": "fbf52e36c6ecfb6592e75a8cb5daf4d77e17c00c318b7f2c3c9c00fcd5448579" + }, + { + "blockNo": 3700000, + "hash": "6de1f62a0e6699619e532fa5838be91a63264a5316fb0b6e2e5e1c3ae35a3db4" + }, + { + "blockNo": 3702000, + "hash": "e993aab54a9049f9e06aa78f0a583ebe6d2eaf62b2f70ced6295f8cdaef62f3f" + }, + { + "blockNo": 3704000, + "hash": "a1f9535485dbded62de9c694d7dbaa29f2067ad66a9d035f17852574684c5452" + }, + { + "blockNo": 3706000, + "hash": "7cb7b84f7a7e401a13ecd2f2e9eb8321d1c1216c07098745c7724cfd42379be1" + }, + { + "blockNo": 3708000, + "hash": "bb2fd14539429bc51f57e258d8a207d111fcad5df557d948e57edf8c7e843a53" + }, + { + "blockNo": 3710000, + "hash": "5281edaf8906432b5398b303e7f5d91ffdfd3d92b86d0d855bd0d924e618cd06" + }, + { + "blockNo": 3712000, + "hash": "c04cb6b0ca9f92cb6a5645b808e34922e7f4c30f8e7212da17dd27f852b55c65" + }, + { + "blockNo": 3714000, + "hash": "bb9078d98647def443c5e72116c109dfcd6fec2d250958b4924240ccb477ac96" + }, + { + "blockNo": 3716000, + "hash": "c6a99e0f62bc4ac00893487770ea99f7b136f09d06435cab17375fbf12b43595" + }, + { + "blockNo": 3718000, + "hash": "20ad902c1ff89708731472f844305f9d99d796615cd61677e063dbfafb9199b0" + }, + { + "blockNo": 3720000, + "hash": "42488c6393ad78fde91a7066766aea829da54226dab18f50f1f5b1809a73ec78" + }, + { + "blockNo": 3722000, + "hash": "46617266b8917c8902289d7619f0f9d5c15805c39104ea1456970389f3a4e675" + }, + { + "blockNo": 3724000, + "hash": "b2cdb973140e3a07b09975fd7064a78eaac7296cfbf3aaca3c9ec1c6ccc6bb5b" + }, + { + "blockNo": 3726000, + "hash": "4b7318c6d347548fad398b910f445f54fac5209be3f9aa0c03b3cbc8807d8c33" + }, + { + "blockNo": 3728000, + "hash": "29e79226f41c09709b8414d1ca1dce7e67ea769b935076afed2b19991d013856" + }, + { + "blockNo": 3730000, + "hash": "bed513a45d09d250060248d3b9c2901ddaa8acdef50d416615361ce492aca8b7" + }, + { + "blockNo": 3732000, + "hash": "54033f13d25ac865f7dc771452ded00ee14dffc94e1e50efacf9f9e45f7203c1" + }, + { + "blockNo": 3734000, + "hash": "6881957209b35e0ee7cc59159bf9ac3f9471313534fedcf8df7a5c593daf6699" + }, + { + "blockNo": 3736000, + "hash": "e783d11d02b4215a147473745c841d95e5b2c1b32472a53c7c8d9a1ed37900d8" + }, + { + "blockNo": 3738000, + "hash": "b6d178513a59556bb6b3ea96b8bbed8146b272925d938b019d8d25c9afcd099e" + }, + { + "blockNo": 3740000, + "hash": "a809bfc694f0af20492ba35c6970fbe00d037ff0258e8e5b5603af512d4b33c3" + }, + { + "blockNo": 3742000, + "hash": "91479738582f141e1039b81d40e5c6b6760aa0b2f78e00dfb068b23e86a858f8" + }, + { + "blockNo": 3744000, + "hash": "520aa12d69416a3349306b32efc553eff10ddcae131050e6e8af67bbe0f29eac" + }, + { + "blockNo": 3746000, + "hash": "939d1b084458b5d29e9aad0442ff77d658114daa623b6497f6f9c16bc51faa80" + }, + { + "blockNo": 3748000, + "hash": "a33c6ba70472d736b076a1577643d5cf7e58eaed7538105e8878b8d16ede9611" + }, + { + "blockNo": 3750000, + "hash": "f5cba9395ad85c325cd366d092d00d25513f5644d286906291393dce5fc6237b" + }, + { + "blockNo": 3752000, + "hash": "f6f1837e42446a2c9d38f510e978bfb3b8d9940042752adc27aa97b313cf5bdf" + }, + { + "blockNo": 3754000, + "hash": "687fcf0078ea1c1c094ef7cb6670ced92a4848b43f346d5bcda5a1b60d1b0134" + }, + { + "blockNo": 3756000, + "hash": "35150106c4cc97129d771f907fd8452f868c648243b246a35fba6b8d480ee425" + }, + { + "blockNo": 3758000, + "hash": "b1b2938e0581119d36e053866c6805ec57afd37c2c512574a8e3b0f338b4b001" + }, + { + "blockNo": 3760000, + "hash": "10696862afd3fdfd9cf1e4ff747f14cd264790a6c3a6bd0816e277f5c5692c48" + }, + { + "blockNo": 3762000, + "hash": "ce7861b6bf73ade547d75902f60f1be07636f3d1604e45d1336d2c8fe49e8801" + }, + { + "blockNo": 3764000, + "hash": "5ed073bfb155cd0830e743fb27ac17ba3e17e8c7ec9bf6f72e943f8525413609" + }, + { + "blockNo": 3766000, + "hash": "31f3c512a007e49d891ea809aa75aaa74377436562fb1401f80e0dbbfb0e0922" + }, + { + "blockNo": 3768000, + "hash": "a2fc1bd11cbb0fef73db7e4ebddc76187c8a830854ed6d09143639c8ad689730" + }, + { + "blockNo": 3770000, + "hash": "f1ca791319e24919179b87af94addf2457b497f1a595a2be705146b0f1a32986" + }, + { + "blockNo": 3772000, + "hash": "af113f5f36724906d87929fcd73f13a38a976e1574295fd522a5d07f67094df9" + }, + { + "blockNo": 3774000, + "hash": "49f802e9d819a76b2326d1402fef9411f7adb05f151ed672324369397131c859" + }, + { + "blockNo": 3776000, + "hash": "8dab258030e8b3e1fa06714404acd91fbbe3a42f847d445e175555310e8f3595" + }, + { + "blockNo": 3778000, + "hash": "8597dd7d36cb1372e7f6e47beda8a9b9f2e9ce773a0071eb04ec4c2ab0365dce" + }, + { + "blockNo": 3780000, + "hash": "d3c6abac44055e4d3176fc7b6a6e258d9de66826dfd82dc68e06d57fa68f8afd" + }, + { + "blockNo": 3782000, + "hash": "fc9dc23d37e1e7fe1127bbc8ccffedd394a8a9d1b0bfb9e4e4b42542d9f39cf7" + }, + { + "blockNo": 3784000, + "hash": "4c759c9328f3a5a6cf9ec7fceaa41e28832b9213e2423cf31a1f188e02aff3dc" + }, + { + "blockNo": 3786000, + "hash": "9ab0ab9a0de53b279ff4995a90bf49368085c24a44ee539ad0117146515b895f" + }, + { + "blockNo": 3788000, + "hash": "4874c8490e544207f886824eb9312006bb6038a3e49146f9a59b1d8879fc1218" + }, + { + "blockNo": 3790000, + "hash": "7a9a0639698f0941e4c8f764694cee026bef3e000890d119a65bf10f72e60f84" + }, + { + "blockNo": 3792000, + "hash": "5509cf5ef12159c154d4364ee320fd3c7b9ff458b0eb6f90fb722059f7d6adb3" + }, + { + "blockNo": 3794000, + "hash": "d1fa9ff99886a04e8c203887e2fd25c75d1c8c170a925169aa6c69eda16cb0f0" + }, + { + "blockNo": 3796000, + "hash": "402941344f3598cea14fbceef92ed92bf86943e99af138e2117420509facf697" + }, + { + "blockNo": 3798000, + "hash": "589060f1c36fd1a82b332ee592df82fce1b6224e3e7d7b3dff823270068b62a0" + }, + { + "blockNo": 3800000, + "hash": "b6db20474997239b2f5e8c98649989b50edfce7fe9db2a2159c30cc789aa6bb5" + }, + { + "blockNo": 3802000, + "hash": "01e424a59b5da3618f2d830d6b2f9fed683bc0dbb0d18d0e2ed8b58da218e87d" + }, + { + "blockNo": 3804000, + "hash": "b6e839432c7e2a1347baf77719a7861b34e5dff05163775094c342fe844d51d8" + }, + { + "blockNo": 3806000, + "hash": "018bbb26bdc0c8773f934142860ac867a40ecbf34c6b53d56d74ebfe31392bf1" + }, + { + "blockNo": 3808000, + "hash": "a70f2d274d4a8cfd288d71b1e10ed8aa13bf6c07e1d835ce2c35db9a6bba4f0d" + }, + { + "blockNo": 3810000, + "hash": "1748e8d378c1e9e7005f874dfd38f64fa8ad41d2c9da89a7510a5118daf6c636" + }, + { + "blockNo": 3812000, + "hash": "787745b58b3bdaf4ee65077f71103046bf5610dde04f50c13cb31d78c490eb91" + }, + { + "blockNo": 3814000, + "hash": "976fe820a9539ab10bfed46c561cc05f593e740027ffe0bd097cb1ff644841de" + }, + { + "blockNo": 3816000, + "hash": "580536fecf39910a9d09e240d186e8aef06c1a5d49ac257012b6c5f552988b34" + }, + { + "blockNo": 3818000, + "hash": "1914dc999d356fad08c8ddafb14610f9518e894a3a29943b121d8f150ece888d" + }, + { + "blockNo": 3820000, + "hash": "3bc300e3e9ab176a4de57fb1a319e31a4b40ca235e90cd7c9a1b57cf2037706f" + }, + { + "blockNo": 3822000, + "hash": "4dc43af681742f33e62301f5518ac83083e6f21039e8b6c14475efcf2f7fcdfc" + }, + { + "blockNo": 3824000, + "hash": "1b9bbed87df2d447de9b5e958255829972cebfbe0af1c7f1ede9ca529797e788" + }, + { + "blockNo": 3826000, + "hash": "76baef87a8adf8dcf1c530acf03d67176506cace7c2d5b81eead11d6092a34e2" + }, + { + "blockNo": 3828000, + "hash": "3c146afb72258f11072f83c825f7ce3cf89a8fdcbec8fed2d16c22f83f47a3e5" + }, + { + "blockNo": 3830000, + "hash": "6cefbdb2124455eee2d7d5ea5ca5377854364a655f46f33911d94746b8587aa9" + }, + { + "blockNo": 3832000, + "hash": "0bc3f679e9e8d4cb93b78a75f994693c1606504ea9429f72e08fc5217482069e" + }, + { + "blockNo": 3834000, + "hash": "d5abaf5d73c900893c9201d95dfb53e0860e5a4d55d8e2a7d4e9b131d32c8079" + }, + { + "blockNo": 3836000, + "hash": "4ee510c8ac944348f63e7849688f097a9f86787f0bba243db3e4ad75e4fdf8ab" + }, + { + "blockNo": 3838000, + "hash": "109b3fce028b90a22871300dcdaea165526fc56e2efb264adea0b631c8fbdbb3" + }, + { + "blockNo": 3840000, + "hash": "4d1fec4e15b815c81876522131c10c7b2e56a61f430693bc95cdbd7fe20f7db2" + }, + { + "blockNo": 3842000, + "hash": "893e832d8cdfd990c571b23b5da3b0b7d840b06f76e67b76a109b38e031bacaf" + }, + { + "blockNo": 3844000, + "hash": "03f69fb898960e011e8c6a818249b0937aacac8fe52cfcdd5b29645dcdbcc2c0" + }, + { + "blockNo": 3846000, + "hash": "40ec32bab832b8d7d79566207f3fdb19f4ad6c5717813c8eef30b295fc88ef88" + }, + { + "blockNo": 3848000, + "hash": "294ffd68e9a6094d451792ee93454d2175acba4356a30e719bad60ccc8981058" + }, + { + "blockNo": 3850000, + "hash": "5eecfe5c464cc319f53b1e4480328d2baefe3f11c547bcb6258067b55e5ace23" + }, + { + "blockNo": 3852000, + "hash": "00b1388507e0a528018f50744440e29138c37d4baf71f883d11d5d26f590070c" + }, + { + "blockNo": 3854000, + "hash": "8eca85f2a19f17fbfb638f1b997f9f851866243a9a85e75f5ba4838b769e35b7" + }, + { + "blockNo": 3856000, + "hash": "ca7060e05ea358cd005fd31976f8f8f48ead0c812aeab6b93a6c0ed7f6bb82c5" + }, + { + "blockNo": 3858000, + "hash": "f999e702322ebd06dcf7561e2eb4ac9863010a50a7cf6bd955d635894646d054" + }, + { + "blockNo": 3860000, + "hash": "4fd7153f6064911d4b96348ec0ec18cc3c05f601bd07588beb7678b38ea8c170" + }, + { + "blockNo": 3862000, + "hash": "4128c70e8f8e25c7143d0bb13d63708b2796d5b62b49dfca988c8f2e457bbc40" + }, + { + "blockNo": 3864000, + "hash": "7c07ee80db11652430e02788efe117e1013918dbfc2d83a9bbab6d4442b50aa6" + }, + { + "blockNo": 3866000, + "hash": "c6214c32ed707fcd718bcfbc35ba0ad4f8abd340ff240240d21f804a057220e9" + }, + { + "blockNo": 3868000, + "hash": "881524b024af109966152bf0cf1fe5ca7003728b936da83ff786d86c2f3b1b7a" + }, + { + "blockNo": 3870000, + "hash": "e18ba72a2533336ba59917dc83817b5489644ce9b2db55762394c450997f3939" + }, + { + "blockNo": 3872000, + "hash": "4bee16f14d63fdd335af0f6b72f1ab26d03b9101c5be82586028426ad370b7b2" + }, + { + "blockNo": 3874000, + "hash": "fecbd8c5b18a86b9b2184608afec46435b5ee83924400e509c0223597dda701e" + }, + { + "blockNo": 3876000, + "hash": "4b3a37c0bd6385f6aab8d20cd062ddd7042f25489106a697c0c04f83554238b1" + }, + { + "blockNo": 3878000, + "hash": "a6c1e7cfdefdf5dcaa1861ba944cf127ae970fb5d988ca7a8d52e48268fbafa4" + }, + { + "blockNo": 3880000, + "hash": "22d5149ea09f67e77e16b4518293dfb1d49b202ac35eee12b031af745d115688" + }, + { + "blockNo": 3882000, + "hash": "12af10f98fffd7f177ddf1fb3eb043507c2f013bf8cd9ccb52aeb9ef698e2a87" + }, + { + "blockNo": 3884000, + "hash": "98c926b739b6d4f2b295a032228df38b06ea1f4b354bdef8fd474edc6a4873dc" + }, + { + "blockNo": 3886000, + "hash": "259ee9e30ce0bbc8cbaf91987fd5bf4267f28f4dfcc12b67584fadf4bbd69bbd" + }, + { + "blockNo": 3888000, + "hash": "9bc3ecf56c8629547f137d0825e6be94d17ef1ee51755d026186b8df2c5297a6" + }, + { + "blockNo": 3890000, + "hash": "769a555adc47351bf57dfd041abd2f0d2470cb265a472594596cd3580a6f94df" + }, + { + "blockNo": 3892000, + "hash": "f40f477c86713b3c8eb95ce858afa189a62fb4946911d1558ecf71c5c8350b90" + }, + { + "blockNo": 3894000, + "hash": "248b9a4114b3eb5ffd3627f8d4938f5a2da615bbc39e9d74134777deb929a09c" + }, + { + "blockNo": 3896000, + "hash": "ba22d81dcbb504861db06c458fae85ff2b5c19f82cb09cf6cbefd022ea928ffb" + }, + { + "blockNo": 3898000, + "hash": "78fa9f667a47466f7279a464f3d84e8f776d2b713f96006cb21ef9bb95848c18" + }, + { + "blockNo": 3900000, + "hash": "f7d1458e3324b03ccb053e56f67e03ae8eb466359d7ac265e3ddd62646520b11" + }, + { + "blockNo": 3902000, + "hash": "8a6de077e5efd252e181258cf00fcd31dea8aec956140a8d6be3e1e406849ad8" + }, + { + "blockNo": 3904000, + "hash": "808b0f34523c7457d9aa8b4beb0c41d7406a9f827bf7a529f0a6ea55746c2b9a" + }, + { + "blockNo": 3906000, + "hash": "d9dd311f42fc3be0380952e60bbdeeba4090622269b6445d601aa614dc6d6f58" + }, + { + "blockNo": 3908000, + "hash": "b5328e9c751bf9f090535fb500c5633c1d0a1940a71107e14f369ff6f2cecad5" + }, + { + "blockNo": 3910000, + "hash": "b642ceb57c4566f5206c8db446fc0b02623c1b0a9346a07cf39587f1c562e839" + }, + { + "blockNo": 3912000, + "hash": "ec5a8ee9dda2792929bad5c3a2e633d257d4a6c13ef1b7fe7797800717896280" + }, + { + "blockNo": 3914000, + "hash": "9caf513e7a390a37ffca40c482fd82899c9c4288bdc24115a17ea1ec33d25356" + }, + { + "blockNo": 3916000, + "hash": "e28b60949eefd6914dcc0efb080df33ae34bff245dc73e923b0398d754138118" + }, + { + "blockNo": 3918000, + "hash": "f7647df4e133ecdc4b465f087d5524aac0f4967e2963c131b28fb0c6135089b0" + }, + { + "blockNo": 3920000, + "hash": "f7631731c10e6bce579defba2bd25604bb686d02a031702c733ae6eae908610a" + }, + { + "blockNo": 3922000, + "hash": "f787cdc94381c748bbfb0e2a608d22bae300d402c8f4ba635f556a6b83a28d24" + }, + { + "blockNo": 3924000, + "hash": "da87ce980368d3f201370916d8641716cedc610324fb2a76c0ed152a340c8c2f" + }, + { + "blockNo": 3926000, + "hash": "930eb3a48920066b239dedf2bc18cc731d94ca5941ed44a163e2e76bd3ed3099" + }, + { + "blockNo": 3928000, + "hash": "eafcb5b624861f8fb3040266e7d8423f9f58d1fa39a29b32b69d3cc0d6ee2795" + }, + { + "blockNo": 3930000, + "hash": "a24e98ad3b04441260a7616da385f289d368b68ceb9c5a08c63f6dcb1f88f28e" + }, + { + "blockNo": 3932000, + "hash": "a8d8a81d6748676fc10eba846477388966be7f77ddce8096da942d8627777af2" + }, + { + "blockNo": 3934000, + "hash": "ac8e9e59ccd344e108d3ec998b97565379ef1d95d6f38152dd789a3644e8cd5a" + }, + { + "blockNo": 3936000, + "hash": "99e996a13239cb143ed3a685b02f94e98153d98b400d9c032f51c26464d8ad96" + }, + { + "blockNo": 3938000, + "hash": "fb9088d7fc05d4a7e41e5e54c110efeb1dcc9884d86c1a07a7cf4b0d8993d0ca" + }, + { + "blockNo": 3940000, + "hash": "a29f6152443620c9fb1cde674d6f372c6edc8cea8b0a43ddd60b74925a6764f2" + }, + { + "blockNo": 3942000, + "hash": "245009e063d9045d64ae21233a198f1985596018a18344ea085b4bf3936349c8" + }, + { + "blockNo": 3944000, + "hash": "eabc6d6158aa26006deeaf4d9fef158889cf51a66006a044a50b08ce29fd0274" + }, + { + "blockNo": 3946000, + "hash": "e007e7b6d663e04e226ed3f4237f33c46c9d772e0c9b5cff9c030a247f9d7764" + }, + { + "blockNo": 3948000, + "hash": "5a72ffaeb5394bf235304957464a3e3fccd202728efeddacccd3d05ae18cc82e" + }, + { + "blockNo": 3950000, + "hash": "f90619a026a9e9c84c8caa79419e133b0a2ca04a73c90694c9eda0e443f31dfa" + }, + { + "blockNo": 3952000, + "hash": "d5ee56012a18caa06c748b8026b7fe25411604ca20befb453b4d60376f32117f" + }, + { + "blockNo": 3954000, + "hash": "6160cba9d1867142d5962eca817e69a262cdbe54265070266d2ce47c9def5ceb" + }, + { + "blockNo": 3956000, + "hash": "d746ef7504ab66b92c23f532e23bd66b793bdf8a7390ecaae7b141edb5addff2" + }, + { + "blockNo": 3958000, + "hash": "3c58889262edd2cfd0ef8b6e91e8a8897908a685041d7c0f3e9ccb0f439d437f" + }, + { + "blockNo": 3960000, + "hash": "f69b50d9b35e8f5da3b4c1a5e03b2e008589a2f63d5928ad1198becdffe7f4ca" + }, + { + "blockNo": 3962000, + "hash": "5c773165899ef137811d54e769c006f556218dc263ddabf403c3d25df219f551" + }, + { + "blockNo": 3964000, + "hash": "5a71f1ebcfe493d67e319660b1d230665e2853db0be131144466637876f55e30" + }, + { + "blockNo": 3966000, + "hash": "7df20ce93a973b73a799678825165d43644744ee17a0ceae4478d146376abadb" + }, + { + "blockNo": 3968000, + "hash": "e57bdee7213b3f271de21fcbb1f24fd43a0fcb3d0c04886ddabe53c622c06a27" + }, + { + "blockNo": 3970000, + "hash": "88ac5585699560ca86377b55cc4dd6c4fc112be569957144b51824f117f98f6b" + }, + { + "blockNo": 3972000, + "hash": "a81c443579ae3d6792819bb2f5dd5ed0240aae03d9d3b0148f3ecde0fab47812" + }, + { + "blockNo": 3974000, + "hash": "daefcb0f51504fbb92f8028c4aa228058a85fdb32f5322d75849b49a65efee14" + }, + { + "blockNo": 3976000, + "hash": "a0d9164d74dc8349cc165b05f13dd24d172937a896498b8caab0a81b143a2efa" + }, + { + "blockNo": 3978000, + "hash": "0a63d3bb8e43876514ec7741659b38f9caa0245f24a2c9534aec43e937051bca" + }, + { + "blockNo": 3980000, + "hash": "ed5d1b62c4a2c38b72d78d76c2d68fdc375b2a942b52e52c9230cab89187ee9c" + }, + { + "blockNo": 3982000, + "hash": "63add32e120ffaf679f09c15329e45d17912c0b119e47cdabc437d789e3c54a0" + }, + { + "blockNo": 3984000, + "hash": "52b033227241e0895e82af76e1d46c631e31a88838f0513772b1ed98ed1503d3" + }, + { + "blockNo": 3986000, + "hash": "cf691230589a722321199d7de5d22bdd12975955ce081c936dec3e50d3ec179d" + }, + { + "blockNo": 3988000, + "hash": "b0a0a5b3e368b680ce53d7645d08ef963e30bb95b084263beee09afef9da0216" + }, + { + "blockNo": 3990000, + "hash": "8a675f3578a135b5052508caa3375d909b8bdbcdfc0826f0b903d8e7cff3609b" + }, + { + "blockNo": 3992000, + "hash": "38b0d1da148519ca16bbc98f2c23cbfbad1cc8639de92bf0b3eecabb0c08ac4e" + }, + { + "blockNo": 3994000, + "hash": "ed13e6ba524c32aa810c6728456c58fc39d05f95b21f329591de9937b58ec7f6" + }, + { + "blockNo": 3996000, + "hash": "efae6e6ec941262da51ae761a5f9f7bff8ea51dfa8f39e8d131a9737d4bfcd2e" + }, + { + "blockNo": 3998000, + "hash": "86e06ef699d0e744cf40bf6a385a5448496543be13327284aaaa188b1915413c" + }, + { + "blockNo": 4000000, + "hash": "8714e8e9d476647e191cba06febf3b416f5aa788fc4c5252c23edfdd3dc4c076" + }, + { + "blockNo": 4002000, + "hash": "7838a11782b8a676a358d343016a7208a8e6ad05ff0cd5760ee9e174685a77b7" + }, + { + "blockNo": 4004000, + "hash": "f3ccb9ca027946c429feb8e3b773a2a30ff1987ed394b9dd6c5f0e94b91602cb" + }, + { + "blockNo": 4006000, + "hash": "be4ee952dc5beebaaa31196432618678dac56717085eea79b03d70b0437557aa" + }, + { + "blockNo": 4008000, + "hash": "3548e1b697364f904af835b73bc7e24b8434c58fae286544705e382b0ae0ff38" + }, + { + "blockNo": 4010000, + "hash": "c0cc5e5a913f2a06e6be696472ca32b58d5de5182db4947fd93c354a2321f2ff" + }, + { + "blockNo": 4012000, + "hash": "0763256f96d40660a6650bdbc224b15c0a1a01837152d172faf3318d52d60bdc" + }, + { + "blockNo": 4014000, + "hash": "8e63ef33f3ba9d2529afeb421d32682ea7938d265c71b119e5a8d11b75a98713" + }, + { + "blockNo": 4016000, + "hash": "477e6e74ad588dfcd69737f932139208b58ac5c4620b71be48e4f6115a28413f" + }, + { + "blockNo": 4018000, + "hash": "e116a6a635e1333320da7051b9ad1c695e06e78e66b82a03bce9603caf2640cb" + }, + { + "blockNo": 4020000, + "hash": "ba16e4dbd61227e00138f2e3962005aafdbde2bf810f5d5e68d3d11c6630047b" + }, + { + "blockNo": 4022000, + "hash": "6cbf92bce315363b8ff9ed990b277b38e012f7c8a2e1298d2205d56ffe307546" + }, + { + "blockNo": 4024000, + "hash": "afb75c9e54734cd0ebcef78dbc6d82bba31d4b60b31de0d45463d41e3bccd01d" + }, + { + "blockNo": 4026000, + "hash": "9a6eecd271a38806a45f90ef38de7fa14572746b7f6b8a5bc346b604961acc2b" + }, + { + "blockNo": 4028000, + "hash": "d90af011a295686536a818ab2f6d01a75bed115f6171e07f681f7d033d229cd2" + }, + { + "blockNo": 4030000, + "hash": "76995c1274af6ae4a507774621249e857fa302db1d9f6f6b7a370242937f7737" + }, + { + "blockNo": 4032000, + "hash": "0be3b66ce198bfb0af40c4fff0c574d4063a2a3a2448d993a111adeb44f94de0" + }, + { + "blockNo": 4034000, + "hash": "676fc7bc07ff531dabcc7c3fa14a567296659d7c58ef01ed14925c55beaacf5c" + }, + { + "blockNo": 4036000, + "hash": "0497e739677843d2d8deb66e0290562d635b1f23e80ee0b7b2badad7038a3e53" + }, + { + "blockNo": 4038000, + "hash": "2d47a9beda7a56ece5fb8cd5ae65e17db0f13e6df4029bb7ca93ec929e17a673" + }, + { + "blockNo": 4040000, + "hash": "20fbe9198028c9114da8cf9341d6b4550aa3e1fe235e91a9da102affc80f29f5" + }, + { + "blockNo": 4042000, + "hash": "abfc302b70a0781107ddd2a9820c816155453786b5badae8fd74ed101a664218" + }, + { + "blockNo": 4044000, + "hash": "6f1d227583f5b26cbd4740a001eab44dcf9ab6223cde03305f5c270f37f79cfe" + }, + { + "blockNo": 4046000, + "hash": "dceefc3d3855e8c88412da289c23435f26cc96fb727899fbcf3db82db2f4d095" + }, + { + "blockNo": 4048000, + "hash": "3d2f0f5869607bb5d4a904c086c701af4fc88b3df02f13b7b2a66272a49391cb" + }, + { + "blockNo": 4050000, + "hash": "3addcaa8fc34e9eb2f04dde40a6a57dd162e4c42b30c7a986f46888e9c0f194a" + }, + { + "blockNo": 4052000, + "hash": "b8931bb1f5794e2b6492f96f55ccabd8646d4facc391cb715e22ac88a63483a4" + }, + { + "blockNo": 4054000, + "hash": "13bcc63a05f94af7d59ed48fb56cfb50073a76c10cb6757c7c50f2e5b6b32e26" + }, + { + "blockNo": 4056000, + "hash": "99f845b25fe94c3bb0c65c3ea0376dd5f2d20e8455e28b174c62bfc4ce522bf1" + }, + { + "blockNo": 4058000, + "hash": "5bd0790c1b8ca47c156ed9c36f1ec38c9af69d66b820d81ec24c467ce1bef26a" + }, + { + "blockNo": 4060000, + "hash": "2e0514d5d416c3cbdb5d6b4e6e919ea31bde9031f775a7909fccd0faecf3e6cf" + }, + { + "blockNo": 4062000, + "hash": "c04a1a92eb1484d83c27d4efbf7a0e9f8eb6458f1c26e314d742faec5580b843" + }, + { + "blockNo": 4064000, + "hash": "f288eb5651dbbd16d0330860f60adcc6cd50caae5b43f6d9dab59fa40dc29f9a" + }, + { + "blockNo": 4066000, + "hash": "d24f91a994dd853237939afcef66b393aa0b84c62aeec9d8ef2d83560e174e22" + }, + { + "blockNo": 4068000, + "hash": "b8ab306bbcf3110339a26b33ce39cd1dd7a4cfd4d3c826fee14895fd2daa3c78" + }, + { + "blockNo": 4070000, + "hash": "2a563f2053f00ebfc4ce9aa0d3d2e4c6894897ac53ccf3d6acfb304dfa7944f2" + }, + { + "blockNo": 4072000, + "hash": "7ab3ac2b8f6e009648ff79eb292995d8f7437a20fe5cc66f7fbe2f74803eafea" + }, + { + "blockNo": 4074000, + "hash": "feeec323cbdb1ed712e281795af17329d3799a24d3db0fdcce3789bdaff1b3a2" + }, + { + "blockNo": 4076000, + "hash": "172743fb9a5f772cd7893b00866431dab47457c6983458a7f7dbf8b6e905a4fd" + }, + { + "blockNo": 4078000, + "hash": "5e83a178d0b0f0c15a592bd35ecb33d859a5e4b612754b9c938095da4f757f92" + }, + { + "blockNo": 4080000, + "hash": "fdfd3a064f9e0fe0ae9b7dacb8768770227e6164c945bc37d2b3c7b58b809715" + }, + { + "blockNo": 4082000, + "hash": "83d7f53f2e5354f937cae4603255ac65d23e0672085c6e04471e4730dc297b10" + }, + { + "blockNo": 4084000, + "hash": "1ced20493500a276357b959f11ce77d4d93589402e26a5543fd87c19eaca94f0" + }, + { + "blockNo": 4086000, + "hash": "97e294e2cf85e32d6af3438dfcf4441012088ebd430ecb8ddac6723c79f4daf3" + }, + { + "blockNo": 4088000, + "hash": "4b24752091a0d0b73b40dc4690aac675a1bab013268d77437b49e5b11a514bfd" + }, + { + "blockNo": 4090000, + "hash": "ad06548465e767b5c57ad774c7c19b31e57313103a921d6c4d48a7366a8a32e7" + }, + { + "blockNo": 4092000, + "hash": "1fc45067c82864d99906e013048bba747746de85b5b70da95133c19f33ec8271" + }, + { + "blockNo": 4094000, + "hash": "bcd1ced59ac1fda3bad14236ed9852f33793e79921cad4bf13af5b8d020fd6a4" + }, + { + "blockNo": 4096000, + "hash": "462f09fa6450c35b44041cd01469abf7bd4f27f55e7e191e8dff57f836f9c8fd" + }, + { + "blockNo": 4098000, + "hash": "ca136189872334844e8431ab24b5f73b7bbd37b8888d9d1b2e63126aadd921d4" + }, + { + "blockNo": 4100000, + "hash": "10e67494b136f944d4e2593aae672372977c3e3e62173dd687d6cb3df8055bc1" + }, + { + "blockNo": 4102000, + "hash": "865a5b970710a44775890785d87c23e3824dba316d98e7ccee0c13f978cfd1e8" + }, + { + "blockNo": 4104000, + "hash": "28211f8c786ee0b0616b88c99f4382348751b2081b8c3c3222da558ec5757c25" + }, + { + "blockNo": 4106000, + "hash": "869253b3c04844e13bda2a6fd85bb2bc6625cfe9d00046a9f31e88563c2357bb" + }, + { + "blockNo": 4108000, + "hash": "1b9a225c8729a4fd909646fce9368a212a880248e4c86c4d91ad09e2afa9ee60" + }, + { + "blockNo": 4110000, + "hash": "1cd658882ef8919eb3de30f51299ea17d5c5f8f61b828b633ecb0611409c7da9" + }, + { + "blockNo": 4112000, + "hash": "062e3eeb19a02e719f9387ceb51f4097a98079437d99078d9d20af3991bbf9be" + }, + { + "blockNo": 4114000, + "hash": "78d522f23af2575f2a94fa7d71d26afa8e22ee676e8cc5125cb28d00e8d3c698" + }, + { + "blockNo": 4116000, + "hash": "e60356fe539f19c8f5f43a4d24e3836a5d822100ead33d5b4c7b619452577a71" + }, + { + "blockNo": 4118000, + "hash": "701d04959b145f7c80a0b87fd1d49b88b20ad821b41fdb74a43bbd24f6dfc9bc" + }, + { + "blockNo": 4120000, + "hash": "ab34ffcb160d9bc0309bb87e16749e52643b90cb3e79140c6fac2bc938e40362" + }, + { + "blockNo": 4122000, + "hash": "11ed5c90d8ba0f8d32ced08513bd6ce80f90acb4f392978d3520c69e0144f62a" + }, + { + "blockNo": 4124000, + "hash": "01b55fa3236fff78b7981427fe11666fc15f16bdd5700e1902d854f38e121f8b" + }, + { + "blockNo": 4126000, + "hash": "66241f4ef6eefb476c5e1f2721c28fdbe35c3df1fb30fd324db423aaf99724aa" + }, + { + "blockNo": 4128000, + "hash": "f0501d37ba2f1127bff35adf36254cd013d91fcb468410367261d59a6fab04d3" + }, + { + "blockNo": 4130000, + "hash": "c33b1473843401f110b1f2d7ac4a0562ccf18b3656778e0dd3da53313b829291" + }, + { + "blockNo": 4132000, + "hash": "0022deca2fe6761a5852360bbeedc7153d673de396e7c2ab7ffc455eb79a0df1" + }, + { + "blockNo": 4134000, + "hash": "7c38b90f3f8bb3876e58c966dcd5ef5e291ed253df853fc7e34523078640d836" + }, + { + "blockNo": 4136000, + "hash": "aa508acd8eafc154a9b8af0083bf423caec7989d361761cf39859eaab15abec2" + }, + { + "blockNo": 4138000, + "hash": "83bce2ecbbabcc381aa65c0b032e53ef5090e1e54ecbe161a0c308ca807f3fdf" + }, + { + "blockNo": 4140000, + "hash": "848138695a587bc6729b6ce149ec5983393292aa0a86f2d5b527c4f172e7f8b0" + }, + { + "blockNo": 4142000, + "hash": "e7e673bb797ec26bdecbbb6fc7acc1a6b28031d5731dfeb9d3f6a5fb5981e3a4" + }, + { + "blockNo": 4144000, + "hash": "6c3c9991259d5a59aeff038f4bfb71215022d14bfa9444313c060b3f7aa015a3" + }, + { + "blockNo": 4146000, + "hash": "9452ef007c4684a2a4a447f3e7a111db3210797869814091d86c148a4d6b0ce7" + }, + { + "blockNo": 4148000, + "hash": "e289a57616ca4ff16b8995663a1c0aec9a2ab84c91e8c1a7bb702eda6d7b9dba" + }, + { + "blockNo": 4150000, + "hash": "bfa54cd3bd23b6f6685943ffb9cf77783071ffa51c36e6e3ad0b967a3d101450" + }, + { + "blockNo": 4152000, + "hash": "62639a6a6ae5cb91932842d2fdd133deda905c553ef202651ebdbdcb8abdaa45" + }, + { + "blockNo": 4154000, + "hash": "26fd22ff4eadbf779b59d9c9f4bc02c6a6ba7551a70add501af2684c64f5e010" + }, + { + "blockNo": 4156000, + "hash": "093e39d89bfdf67ff2d3aede4655abbf444cec7181312a0e497e4139b08a95a3" + }, + { + "blockNo": 4158000, + "hash": "ab51a093be030bcfe7aa5625a5cecc59ce0729b50f92863805da9531d5e05ace" + }, + { + "blockNo": 4160000, + "hash": "493d2f762b1a8504a9e33cef72385ba3219d6c37a15973facf9684da8f2718f6" + }, + { + "blockNo": 4162000, + "hash": "806630334c92735542ade979cd21dec5693b12e4fec119a3c23a9a5cfc078969" + }, + { + "blockNo": 4164000, + "hash": "6afa4c42a6ad7a7bf0528cdc64cac98fa0987c28a372b0e620568639c4a0301e" + }, + { + "blockNo": 4166000, + "hash": "f805efad8dd1c96d8355efa1d29d720a48c48d5c5d5af50c9733d237ca0a5959" + }, + { + "blockNo": 4168000, + "hash": "d6f97e56176eef32bf48dbdf9d86fd8798deeae2b66333b60a64334a59b3badb" + }, + { + "blockNo": 4170000, + "hash": "f483ffaee15061f2c552a6094edaaf986119ff3169efd55053f1a8082c2ae894" + }, + { + "blockNo": 4172000, + "hash": "54c305a0fca282b9326ecab3d3565c6b3bef0c6087d738a00cedc4db7ba24ead" + }, + { + "blockNo": 4174000, + "hash": "ec6045c52a168903a8f712af92c1d379f6c456777c6f7bc46cd5c192579129b3" + }, + { + "blockNo": 4176000, + "hash": "555b2c2c4d1146af939ebe379c47710cd973e3d6c5317ac9b8684bc5c3e46815" + }, + { + "blockNo": 4178000, + "hash": "0b9ef9bc3912ac294ddf799f045623ed8ffc0c06dd0304bd602d51627a670335" + }, + { + "blockNo": 4180000, + "hash": "61a905f34ca69ecfb0bb32319b21032f0ea9a47ab9191477792d61c294e50bff" + }, + { + "blockNo": 4182000, + "hash": "4f7790412e9de7cf3a4a4e386227215b44fd80b32b21d8ceced07c2167df0b17" + }, + { + "blockNo": 4184000, + "hash": "99b7202b68a2c09224748aafeb58dd4eee6555ed969638633ae36bc4d9c94565" + }, + { + "blockNo": 4186000, + "hash": "ea1940645c040b1a14d80029ea173f36baf1974aee48d38426391d21970006f4" + }, + { + "blockNo": 4188000, + "hash": "4fb16ab30f4af6374b93678d748fc0d380fdf307e1e8b3c9e7b58ddf89385eb9" + }, + { + "blockNo": 4190000, + "hash": "b050d0cfaa7aedd8388452f8835e04261ad8e86442012f05e0e2d35c9629bb08" + }, + { + "blockNo": 4192000, + "hash": "75ef36bb70626bcedee49f6ff881f8231d6abef586d2c2b4a900b60561bc397a" + }, + { + "blockNo": 4194000, + "hash": "30b739463364d80a5d6ef5620661363626d925af778241c8bc9a40c8fd8fac0c" + }, + { + "blockNo": 4196000, + "hash": "405904c6478e4d83dbe4d5d3415df6dc42718a07af60ff26b0734be5d0d9c81b" + }, + { + "blockNo": 4198000, + "hash": "aebf06bdc7b15b24fa78909dcdeae32481253f09c3cf64d5ee1a8357d70c150f" + }, + { + "blockNo": 4200000, + "hash": "6e6100dd13db814741ff622522df1a91002df8012ae8e284dec9fb6d58279340" + }, + { + "blockNo": 4202000, + "hash": "c8ca0a2308a9e2c793adb84df3a2a799a3f73de3bd53f33d6349e3002eab6570" + }, + { + "blockNo": 4204000, + "hash": "13a60c998c15a883612276b1e67a85ca0d48bd93789ab6fcf79640bdf71168f2" + }, + { + "blockNo": 4206000, + "hash": "c0983e470322494399ae36245631bf9b1c6416694680b6e101c9642af232ec0c" + }, + { + "blockNo": 4208000, + "hash": "52b95a825b9ad3bdab636a56323c6a82cccb75f1affd53af829f5fb43a91e758" + }, + { + "blockNo": 4210000, + "hash": "8b8127b92784be25433fd782840c91449e2f24fc6bda3c9ca5652816bbc10871" + }, + { + "blockNo": 4212000, + "hash": "8910067e23822669947bae85a375c968edc0c742b3b9825934ba97f389bd9c8e" + }, + { + "blockNo": 4214000, + "hash": "85a833330e328d6d6debda9be5176071d636392089abb9f802e2effa07ea4e49" + }, + { + "blockNo": 4216000, + "hash": "90694c8d493d009e82a6c3810146d86c6995bd7b89c1929882cabb457dfaeabf" + }, + { + "blockNo": 4218000, + "hash": "5da91b76ffe4e333ba139e80dfa86eccfdec2ad63035b7eceaa0980f98cb8bcf" + }, + { + "blockNo": 4220000, + "hash": "36dc104d2cebd14eb296d5c1c2a58b580e6bd595c36fad8baa90122fafbe6466" + }, + { + "blockNo": 4222000, + "hash": "ab8a072a6498a75f59e423ac3729316d2d8bb5794e05b710cf0a5cfe3fed40de" + }, + { + "blockNo": 4224000, + "hash": "8560cdd335e88462e0cd12c830123471712134bbd2ad7826ff5fafd35843cd24" + }, + { + "blockNo": 4226000, + "hash": "28cfbf55b7192141ec83f14b200a7b160b5eed3c5789698942b24f563163c163" + }, + { + "blockNo": 4228000, + "hash": "d4fd50cb29dd87cdfa97de1f22a3342989c1c102b6388f2e3104dc81948d29dc" + }, + { + "blockNo": 4230000, + "hash": "597f5755b876beccfb099c5139c36d32fcf08c6b2bdabb31de487ec6536557c0" + }, + { + "blockNo": 4232000, + "hash": "3b7370d08c53499c7b1f57fafe9f6848f24790397c94ce5c819c5fa4971ac3c5" + }, + { + "blockNo": 4234000, + "hash": "6a8a1d6f35c8962120f94acd090d5e3d8e36a477206f8195aeb5d6355acee029" + }, + { + "blockNo": 4236000, + "hash": "6dddff95c3709299701703362db8a5b9904f496a7ebecbd329ea9b8b0a513d01" + }, + { + "blockNo": 4238000, + "hash": "e21587ef3168ece699ba0609c5f884560f8ab008fd9ca79673b95ad674c23c44" + }, + { + "blockNo": 4240000, + "hash": "2d108ee7851dc038e65901faf9b80177386155d4eba788c71219d53bf22f0462" + }, + { + "blockNo": 4242000, + "hash": "af946e4c616d795f0c7c669aa26d7c2b69d46dd5930309fd15b838d339307a82" + }, + { + "blockNo": 4244000, + "hash": "a170ed09d56cbe377915cbbd7e19c5fef71b8f5cbebd7b38097e28003b2b581a" + }, + { + "blockNo": 4246000, + "hash": "850aa5b409618e6733d5465eaa23f85e9bc69280be15f41631ed1437779a958a" + }, + { + "blockNo": 4248000, + "hash": "b2a778d60f7f76880f4cd4d897c1607c054a926ffa95284f8e9fb2e600e30419" + }, + { + "blockNo": 4250000, + "hash": "bc50569bc9d7b6f16fa21f804d790f557827f53ed465fd99637cf1d64f43261e" + }, + { + "blockNo": 4252000, + "hash": "16b455189ac170bfd5a85701a65dc528f0cf387839d4cf01b11e208d7bf2bcf7" + }, + { + "blockNo": 4254000, + "hash": "2f5219e5deea9021307b1f1eb89526a2e0e16edc7851a9cac8bf2fc44097878c" + }, + { + "blockNo": 4256000, + "hash": "dc529155e453a9ad87a5f301342258047c0ccc01817e1d7debe38187b2b294d0" + }, + { + "blockNo": 4258000, + "hash": "f5627e7e4ce00769439312cd67747147d20d5d8ad89c9975d207f5585b3ee8b8" + }, + { + "blockNo": 4260000, + "hash": "f6bca6cd7a71e7a69da6cd205335ef679181d18dc8cc0c982857e2d7c8402b73" + }, + { + "blockNo": 4262000, + "hash": "c6dd11e156ec4b405d2b1e9f023b94c54874fe4bd92a29520b65e6038a50f439" + }, + { + "blockNo": 4264000, + "hash": "d1f7ebbc88fd71a9f242f7f499539e8d8241ffda117239ed50a0d772987a7d83" + }, + { + "blockNo": 4266000, + "hash": "1f9440101bf09a3b2564720ef26b78e03adec0a2ca97e4d38e1405582bef9588" + }, + { + "blockNo": 4268000, + "hash": "f3d369e34044e054a619df0bf06bdf7211f812d3af4b9c7f5b3bd851115e001e" + }, + { + "blockNo": 4270000, + "hash": "d6de5fa9216d2a438a6dab296935e2eb4dcfb71fe498e16f364698f58f56b5ba" + }, + { + "blockNo": 4272000, + "hash": "63baed50b9a2c4eab0c4f58c128db38b2404680eb43ae324f5c0e3bf939ad609" + }, + { + "blockNo": 4274000, + "hash": "d11c1c6ef7e45d5de9481bf74c597d9486e46e9bdd4b3c6144af99412437b8df" + }, + { + "blockNo": 4276000, + "hash": "2622d604e48d91f82b4d0867d149c1d02c983ed2dcc3f678f0e86cbdfb2ce78b" + }, + { + "blockNo": 4278000, + "hash": "df82d95db4ab790810df1afd217750496f98a0cee80a73a95c329366588c5b6a" + }, + { + "blockNo": 4280000, + "hash": "b8c1f21a519b13e28f00d49eace477a5a8ebcefbb29c4a00df7bad3728058858" + }, + { + "blockNo": 4282000, + "hash": "7620e6d9e1c5482bffd033423b2822906804d71c4da9dcf814a02e6cbab4f58a" + }, + { + "blockNo": 4284000, + "hash": "30b4bda030b7dcdbf42a01db8cf9f86d72104372e86183f7604c99780b19239b" + }, + { + "blockNo": 4286000, + "hash": "86cbad289c3693e405017f1af0a8e258b6665910da0ef8045469c013550bf9a7" + }, + { + "blockNo": 4288000, + "hash": "5e1851359937a471fe9f3115bfd14202351e0bad13edca25dcde04ea9e005db5" + }, + { + "blockNo": 4290000, + "hash": "04d3fda7b5ba4152c856758856759fd98ed9a5efb15aee1d4adb81effe2a2f19" + }, + { + "blockNo": 4292000, + "hash": "ea0446142c0903caaf2d0c6b751e6ee8444f4b5bff0e11e93d84cebf4ab36ca0" + }, + { + "blockNo": 4294000, + "hash": "53d41959bef84528bdd8cb9227f0c901d25993f03de30864323f510101b8110a" + }, + { + "blockNo": 4296000, + "hash": "979d9fbb58f4b128c2c082df06044743a57267646b31675fe4060ef65f1d232d" + }, + { + "blockNo": 4298000, + "hash": "cb0636ae143cad820710cdbdf26761f38170e88a8c759e9b08f210a62f232b98" + }, + { + "blockNo": 4300000, + "hash": "d2872db9df77489191f64c863d5b25d2e5ff9359481a7b98fec77365faac589d" + }, + { + "blockNo": 4302000, + "hash": "97960f9f9ba55b3212f767d20089737e285e709a10c5bce39e4907d7d8fb5be2" + }, + { + "blockNo": 4304000, + "hash": "a58f4b474e4339b10551121334c2a51516f5fd89a53ba748d65a85c10e6528d3" + }, + { + "blockNo": 4306000, + "hash": "5ad313c4991f99ee3e16f25918b78f00c1020638bf8dd598bee546dc27dfb749" + }, + { + "blockNo": 4308000, + "hash": "ddbbf6c1b6891539ca8aeeb202a9306119b4dcb7494ea7069b4b87424880bdf1" + }, + { + "blockNo": 4310000, + "hash": "9ba7a4752011a74e8b46d6e6168a88cfab9473f630d583e1d8cd85a07d7e95bf" + }, + { + "blockNo": 4312000, + "hash": "636c8e53a99837273f98ff9eeba7b8dc1d0dbf0e59d4dca8cc253a29b80ab089" + }, + { + "blockNo": 4314000, + "hash": "623f2a2f74d3b4032e4348dadb898b9cbcf565f45072926445de59bd2b827918" + }, + { + "blockNo": 4316000, + "hash": "322e245831dcf5b00132e1104d45f002e45e898ea8d9688a9d6535414ca2abfc" + }, + { + "blockNo": 4318000, + "hash": "af85498c72455621c8ee68704513d35c4a5b4b17e788ff47c9c245fcd78aa577" + }, + { + "blockNo": 4320000, + "hash": "a7af434ca2c6a67b77ce2ca539cd4da4b603074683e203c4f803ccbd7c2d6dc9" + }, + { + "blockNo": 4322000, + "hash": "185ca289155ff1c8f50a7aa1968aa93b8de1842a5a9954afda376558d7880311" + }, + { + "blockNo": 4324000, + "hash": "6a578055c54f90c97d46d5cd7ea5232e4d2241bf62a18a426d5b174d8c257372" + }, + { + "blockNo": 4326000, + "hash": "f6482cee744485086dfa7d234b2dc73ed893810bc34b093101a609a83c573a0d" + }, + { + "blockNo": 4328000, + "hash": "d9f6473e11b41887014c9c4232d44b7767e57692898c1a618a6063025574aa6a" + }, + { + "blockNo": 4330000, + "hash": "9034734581a01e1f80e68b0ad01441757005efd765d3c7c596b8fb83d85e44cf" + }, + { + "blockNo": 4332000, + "hash": "17fb5c58020f012656ca01c789871894142e05d3fd9c6290b432e05b0d02fc37" + }, + { + "blockNo": 4334000, + "hash": "0c07f7915f509225171e66137703e72ba179ddff9d4db0c4981f5c39ab5181a6" + }, + { + "blockNo": 4336000, + "hash": "80901a291f3eb6459ca5d55f332ecc63c2773a3e4aabf5b04de145fb6c735454" + }, + { + "blockNo": 4338000, + "hash": "f74cb1065f74a32d3758a81d0e3329e0215038ce64c394383b054f925c75ad14" + }, + { + "blockNo": 4340000, + "hash": "e2fcff4c72ff373137a773f5635d83db66b866a46973c2c2036cc87cc85e8757" + }, + { + "blockNo": 4342000, + "hash": "f2e04d36f99f99ac14cab85ff6554a90a8b9060fc08700dfb3269ebe943d438c" + }, + { + "blockNo": 4344000, + "hash": "e2c4e75e8cd8ae692fee47cefb4b65df61faa6950f30f7602759998cdfd4ef26" + }, + { + "blockNo": 4346000, + "hash": "fa7998403415340cc7f4cc7f147dd8800cfa1774d9c32250c3bde52bcdb5848a" + }, + { + "blockNo": 4348000, + "hash": "31b42b1742ef06ab0a0760e0b6678aa6550e07e95e78d6535d6651c025fdbdb0" + }, + { + "blockNo": 4350000, + "hash": "612e246ab0a8a609e079d87c3e567d474918880263391beade854cb07025f321" + }, + { + "blockNo": 4352000, + "hash": "5bf5309f876cb391c6cfbdf042c5d47d74227ffd597f309d6ca9651e03adc5e3" + }, + { + "blockNo": 4354000, + "hash": "52b17df2e8aeb724db2baf39c279d02726d22098764d710e790e342bb313f444" + }, + { + "blockNo": 4356000, + "hash": "8139b4a342826c0e7c90872eff8a09ec474a8049ea28ae9d8af34792f5a072f5" + }, + { + "blockNo": 4358000, + "hash": "a7f45e95b2c69c451f834079c3cefa05915451480e7b2bbc04f70aa7e400b45c" + }, + { + "blockNo": 4360000, + "hash": "34d393e9fbe8e3be902103323667bf223c5ebe23b24798487f8166df9bf0d74b" + }, + { + "blockNo": 4362000, + "hash": "76ce95511d374938f910863ee33e0ee924943ac45954fa336c3f960d0733460d" + }, + { + "blockNo": 4364000, + "hash": "365b4cb39bcf9b4d77ad18f9b8ac836d0af9fefcbdcb72699913aeb81fe926d8" + }, + { + "blockNo": 4366000, + "hash": "52da3bf7904537f305978499d6df4ef466ab59dbc6a00fb869857cc4db474e8a" + }, + { + "blockNo": 4368000, + "hash": "4e2700619cc0c3fdb1d0b96b7ed8e8c0cf713b81f99546c3ce89c1d476aba39c" + }, + { + "blockNo": 4370000, + "hash": "e3dcec925a3e5521d13d5f1895ed518e771edd6fcc040d55c9990884c3fbcb9a" + }, + { + "blockNo": 4372000, + "hash": "1790e369210f936e9eca9d240d543eba242e1e951eab8e75cf17b382ec2a7381" + }, + { + "blockNo": 4374000, + "hash": "468d2bfd5021cb2c40828bdcce8480e8c8ec554884bef38a670322e24d65b22b" + }, + { + "blockNo": 4376000, + "hash": "6136ab5377835c22442eb2bca5602c00388a45da23f3672433b16634357463bc" + }, + { + "blockNo": 4378000, + "hash": "6707c1f70dc50a89c2339ca8f2c18834db13cfbe20d838999dfb2e849025d7ac" + }, + { + "blockNo": 4380000, + "hash": "6c13bc61c96a1ee4b4b9a7f1880a700e04253f6e0479ca5c2390e98526705f9f" + }, + { + "blockNo": 4382000, + "hash": "1fb6d900f5ea384d0e6e5f669b2322d39d32d253b88f5c3aa61d5bd81868dd62" + }, + { + "blockNo": 4384000, + "hash": "e574b96a68e808401aeabd42d79aad9a3310d864f8e4709df705aa4a343056d2" + }, + { + "blockNo": 4386000, + "hash": "e824bf8ac894c390cd5cd52648b5ac7ba32a9b953dab6b5ee7c498aaf934cdde" + }, + { + "blockNo": 4388000, + "hash": "afca09eb6c12cf20fd5b38b2c9294b8f104d255dac9060fe77791a569b4c8a40" + }, + { + "blockNo": 4390000, + "hash": "e9c4ca4b9cc7680da5350db91dc8dc7250cb0b6bb4d410ef8f43ea8ceaf0d521" + }, + { + "blockNo": 4392000, + "hash": "b555fb024180d9984b65872a6261fb14848818fad26096df563bfe99d4d7ad29" + }, + { + "blockNo": 4394000, + "hash": "f8889edc742a176076e3fce7804d8ef2e1874c73deae3df7c2236ca1393c7286" + }, + { + "blockNo": 4396000, + "hash": "3a3213efd46343111f657afd8aaf713b7266750c8d52c1322ee1f092ec65914d" + }, + { + "blockNo": 4398000, + "hash": "f082be2ea306ebbdd7e7432941b7cc22f3ebe0ec64ec4977cfc90f0e9d4211b8" + }, + { + "blockNo": 4400000, + "hash": "55cd4419fe807a8537c6ede79a1200813b3d5d626a72b7e0307c4021afd15a2d" + }, + { + "blockNo": 4402000, + "hash": "0d72bb0999a5250a93dc87ab1a6279fbc556001d4ed2d0fdd911ee8b591cc8c4" + }, + { + "blockNo": 4404000, + "hash": "9144b7e413523cc4ab7e5bdfecb43915471e4d77419bab6e491239d13712b78e" + }, + { + "blockNo": 4406000, + "hash": "033cbd5505b995e3aca715bf2f2e89f86e8e43d7b1bdf1c32df16061923b3f83" + }, + { + "blockNo": 4408000, + "hash": "d7a6ef21ef8bc20868804a43b93306c00099dfa96e3773590f4d5c6953209f89" + }, + { + "blockNo": 4410000, + "hash": "a17cec450d762ad696d2c4311af962031b351fa67d6c9e4d90ba16ec54848110" + }, + { + "blockNo": 4412000, + "hash": "7847cbef17f7a026efe6ba008dc7eeab1c7181e084f8067151a8657e9d0f8e2d" + }, + { + "blockNo": 4414000, + "hash": "5b6b638d39eac06c52bbb1fcd898c9300546797e02362105824f339e6e6ab700" + }, + { + "blockNo": 4416000, + "hash": "5b42103283ad864a8de06238c0bb63dd034f49db9f47ab91202b980be405b188" + }, + { + "blockNo": 4418000, + "hash": "49963232e3753e0228ed9a6a1c230e32a3d8743691d8a949c81dd88a60d0d1f2" + }, + { + "blockNo": 4420000, + "hash": "7b34ea30387ac8f3bed01ee71f1871ec5b99627d00452d2adbfb05ae319a7ab7" + }, + { + "blockNo": 4422000, + "hash": "0e4ebe758676a5694679b33a95f105793048035f62825747f3236aa50c8620eb" + }, + { + "blockNo": 4424000, + "hash": "0f3e7ed89d1276104fd465e80fa97e60006c46425855a349fe74df317fa4a6f7" + }, + { + "blockNo": 4426000, + "hash": "7f4767fe0649516303e5785844906ee8b98cb2c57587c486d6815c0bdcc5150f" + }, + { + "blockNo": 4428000, + "hash": "74675c257d1d8dffa3e4f7400d9746296ddf986bd76a4aad6c4d23beaf6c5c63" + }, + { + "blockNo": 4430000, + "hash": "6a346b3a86574fd7a873fe3ce69bd0ea980e1acb3dc79361d2cb799a52da1b1c" + }, + { + "blockNo": 4432000, + "hash": "d294b0adc005876d64cd2e3f81422308d6716b996eebed58c6fc736f318e2509" + }, + { + "blockNo": 4434000, + "hash": "33a4c4cb25e1d94472aaece010008ce9ed6e01445b4938afb06cadc4d1b7dd20" + }, + { + "blockNo": 4436000, + "hash": "af750526319fb79f7fd07301faa6e42123ecc9fff30aa406a3ac0d997904f285" + }, + { + "blockNo": 4438000, + "hash": "69ab52792b877b3d97ef20784eb412a03b4f5a68819fe4cb82b6990c967412f9" + }, + { + "blockNo": 4440000, + "hash": "ce2ae7601976a0b54a1c123e21856893b01940076444b3a1e84fbda5220a0b09" + }, + { + "blockNo": 4442000, + "hash": "5af52a9005cfa6bfe22b9cff0d226af9f9c0d131ffd0a8f8adc70789a151c5e7" + }, + { + "blockNo": 4444000, + "hash": "2d4d997f5b75598f3b8390b834dbccd02a1fe6ea6552a02c6527a37d6c7dd05a" + }, + { + "blockNo": 4446000, + "hash": "3f481132a10de909f6b33bc96689c827d075e17adb12dbcc3c41e610188a2663" + }, + { + "blockNo": 4448000, + "hash": "5fdca700312880d1de4e5c6ce323f9c8d619394dba9595a4d2bc6b95581753d7" + }, + { + "blockNo": 4450000, + "hash": "edcad528ef64a8b10e42a3e51e7714fce2c9bd2eaeec8cef62093f0a06b2e94b" + }, + { + "blockNo": 4452000, + "hash": "5bdef4f94ff155f052763311b77289f37fdb0fd08d6903d1b2205c29df051104" + }, + { + "blockNo": 4454000, + "hash": "5520dde8a9d64d72507b3c6c7e2c938c172248592f22ff5b00f077bb773f75fa" + }, + { + "blockNo": 4456000, + "hash": "5569873f477264b6f4b565640873f4885ce74df3a4c7ef72eada071069fa1072" + }, + { + "blockNo": 4458000, + "hash": "5223f34668d6681b48de23d0b24c44a9888a07fd284a33d607d5ff5e04d78d77" + }, + { + "blockNo": 4460000, + "hash": "a7c4883702f17f81ba336adb42a9f20bd0ecb5641ad4d97dae774feaa61f1450" + }, + { + "blockNo": 4462000, + "hash": "e8e98596b8989a4ddb3135bf616ff2537f36f8884253adc4d70ab5e0483146cf" + }, + { + "blockNo": 4464000, + "hash": "e5705ca8c8353c164310221d616020aa731ac79f15b5b4202e7f81c9d6b2b8de" + }, + { + "blockNo": 4466000, + "hash": "78dbd03f65ddf33beab070ffcc0ab75917e20ffc5a5629adf5fa3c19bf7ccaf3" + }, + { + "blockNo": 4468000, + "hash": "01104f9c4261723e52f5e2a82fde68d655880f47ebb7a380ee87e4c509600e33" + }, + { + "blockNo": 4470000, + "hash": "8e8c27cc45fcc31a2bdb45f478dae700206c760bd4f0ebb2f347c00c7236f441" + }, + { + "blockNo": 4472000, + "hash": "3497be2079e9171956c9a3e0a43d395890f65c708bb7a76d87b1cd1058c04f03" + }, + { + "blockNo": 4474000, + "hash": "ef4b4ad025e4e129c6113f0cfd31b8151d53fb7254a0de2a2a07201e9b3596dd" + }, + { + "blockNo": 4476000, + "hash": "35c582a08d7b8d95726b327767f021a338184b605a8ea3539695b14e01da00cc" + }, + { + "blockNo": 4478000, + "hash": "370d06c21d255cb89878d47ea326b00d7a270dd48166ef4a5019fdbc32b6578b" + }, + { + "blockNo": 4480000, + "hash": "c391dea7dbef394d2bc4f430d057d3dfb07a5dd656bd985e28cbefa61af0ef2f" + }, + { + "blockNo": 4482000, + "hash": "97fd64c15637aae4fd1189ab64a0ea8c27d8c462ee861ee9d60564e91b60e73d" + }, + { + "blockNo": 4484000, + "hash": "fce272963003c295c92f3474faa0b9282a50fac685fcb9209cc49eb9031f9cf9" + }, + { + "blockNo": 4486000, + "hash": "56349ee89225812c641412e048757ecee2e285c28c631c3303f7bccd6395a8d2" + }, + { + "blockNo": 4488000, + "hash": "5ab52f17ab097c7b0cb487fec83b5a5e0b0fe0170ff5321db8e45d293f5ab0db" + }, + { + "blockNo": 4490000, + "hash": "428b01626de393dff5c41916ec07be1b307213bc750dbf2ec0cadb5f9e8c2247" + }, + { + "blockNo": 4492000, + "hash": "41905137b578d54e5b99240efed9e0635b121b02d3af68d5b1e40cf58008bfc9" + }, + { + "blockNo": 4494000, + "hash": "2670f5a18a329f9535a7573bca6ee4a7953cb9691ba40d68457dc0177c9c1164" + }, + { + "blockNo": 4496000, + "hash": "74d6137cfdfe6ab5061b431b1258360c17314a5f135ee93c9698ac8f48044b86" + }, + { + "blockNo": 4498000, + "hash": "228081ace8ffa6081419d89c418eeedf9c2345fe368dcae4426510ab67f1c7dd" + }, + { + "blockNo": 4500000, + "hash": "8fd777280a329123d3b9e6391442b49d9d224b70564aa26de30ed6d3518d1fe8" + }, + { + "blockNo": 4502000, + "hash": "255a9df0e4dfe8ef87fe077535de43d4db4cca7e98c9e51397b084b45fd0f31c" + }, + { + "blockNo": 4504000, + "hash": "40da440953140f1de17331df4b9eeecfd3fde26db8c1b07c556a33b874bde048" + }, + { + "blockNo": 4506000, + "hash": "6786f3e01f299af20a056ea0ad6de7ef8468ab48a0baba6740b6d0a920860028" + }, + { + "blockNo": 4508000, + "hash": "749f17bb9c0c81d942fd21622302d3df8f80e89667b85d91e7254d739ccc7c2c" + }, + { + "blockNo": 4510000, + "hash": "c75f966581b73d8388289121a669212f0b92968963a940070f846b595b210092" + }, + { + "blockNo": 4512000, + "hash": "0a8fd19e03b4845a350743087612c040ac85a67a9aa592e28ce64c93d947af29" + }, + { + "blockNo": 4514000, + "hash": "64f0eea2cc6d21c5cb4d4fef906dba448f81e47f3b54c6ea8161c0fe13d071ec" + }, + { + "blockNo": 4516000, + "hash": "1694b7b6a90fe93be36470131a42e4d76a17ce45ca356159fb4c372a56231799" + }, + { + "blockNo": 4518000, + "hash": "86c2ccb538f44409ebb40af69a5078bc34c52ce1014b000159ca463b25bd011a" + }, + { + "blockNo": 4520000, + "hash": "9328719bfc79bdd7a11fcf9dfa5b77d4f7f0a81a3f771fa893f3e11353739176" + }, + { + "blockNo": 4522000, + "hash": "2ba0669a1be5256abade1b28d5e203a3770d428b7956b1841e3e251c1bc90b68" + }, + { + "blockNo": 4524000, + "hash": "e6dcd974001d730c88b2bdb5f2befd1f3d2a0dfbd5d09e00b7911bb67ca95379" + }, + { + "blockNo": 4526000, + "hash": "b8883845ead852ee7e642fced507471222532d0bb289da496d7294620b5944b9" + }, + { + "blockNo": 4528000, + "hash": "57561b3cacdff4c47f5a97309d407bf044d10ad93f5048ae88dfeeaba0072296" + }, + { + "blockNo": 4530000, + "hash": "e4bd9d40a853e8adcd77fc2d07f346b2e3eefeb1494eb322a8d64ff412c0ab97" + }, + { + "blockNo": 4532000, + "hash": "da23809b16859dbe2a8af10b095ede327a7f8ad81458478c96deca7d9911b638" + }, + { + "blockNo": 4534000, + "hash": "cdaa8574c3c3756f6892a604dd8712cbc31f15f632a59eeb5ca4cf652e60f7e3" + }, + { + "blockNo": 4536000, + "hash": "301a8a8988b6bb8423f039fd4938616a5ca28fc7d54bcf25c6d5b4bd437adea2" + }, + { + "blockNo": 4538000, + "hash": "a75547c6afb6dba20a1afdebb294323fa811307b7548d246c17c424e15d205e8" + }, + { + "blockNo": 4540000, + "hash": "1aa4a64eea168970680026a08c8692ce4fac02768663868fe07a7b2aef515bc6" + }, + { + "blockNo": 4542000, + "hash": "93ba4317bcdd7a0909c2a605ac5f412e308ec2b8085de34365bf40b31f9d657c" + }, + { + "blockNo": 4544000, + "hash": "d11de93e15d310b8ec49b8952560d4dc85aa76d3f72fa3ae817fb610ede0db8e" + }, + { + "blockNo": 4546000, + "hash": "2f476406e0da1624ecffc8376fa5d13795c9a930cecb84ffdd46b932db1cf55a" + }, + { + "blockNo": 4548000, + "hash": "ddd9456c50575658aa6a377f7e523a4994370426aa24455f7fc70af07a94f7b6" + }, + { + "blockNo": 4550000, + "hash": "91bb50fe96ea521bef58b88b85a559bd0395548cb523b8437cae8d4652a0cb7d" + }, + { + "blockNo": 4552000, + "hash": "5acb97c39f1c1ad5add32db5ce8d56a887e50ccf50e8a8317ff0541649dbc38f" + }, + { + "blockNo": 4554000, + "hash": "e26bb4dbe63113e5c13816d9fa060e40c42648e5d052441785baa290a7916c97" + }, + { + "blockNo": 4556000, + "hash": "e711b51b2f411b3018311b52c85f5e1cad48e456abf32cc3967de9bbc59fa55e" + }, + { + "blockNo": 4558000, + "hash": "86686db2821f887f3bd9804a1604e25ec1312eb6e97f12640b23333e910e771b" + }, + { + "blockNo": 4560000, + "hash": "6a064885317b2a272236579f0033967430a4ea9ba19fae660f6c9579aa5490fd" + }, + { + "blockNo": 4562000, + "hash": "f81c4146ad65c8ff58dc544296e70e5bd9db16d064349f3e28dbbfb27549f189" + }, + { + "blockNo": 4564000, + "hash": "3c7e312b32aa41eb398d6d706124caad106a41aa49c4660bb0fd168831fc8828" + }, + { + "blockNo": 4566000, + "hash": "738443dc011aad25d7ff5c9be1e5957b3e9797b4a98882dd5e61a45706bcacfe" + }, + { + "blockNo": 4568000, + "hash": "59756a35c625ccc744fc3c2f6a4a9ba39e342d1c255337d0a1ea98ce44c2205c" + }, + { + "blockNo": 4570000, + "hash": "440c19d3f97eab8fcc63d22d4348652bc707de85cf88c81a8a3cf7ea201e7c45" + }, + { + "blockNo": 4572000, + "hash": "6085a164fe9bd49b92ce5f2a07095bf7cabaf776651e40fef39eaf7621889803" + }, + { + "blockNo": 4574000, + "hash": "34c8504453c68d7627da91ee34140f679c9f468e91c5b2ae538f0e754f02bdd5" + }, + { + "blockNo": 4576000, + "hash": "1444abc640657a285f4f544320bcb65ecc70278bbc6b685d3edb48d67328d6f5" + }, + { + "blockNo": 4578000, + "hash": "bc23f4c5f112ed719029021cdab15996839924245536dc48be8facd3137a6858" + }, + { + "blockNo": 4580000, + "hash": "8f93bb548ec6892dcd0d52e0b4933a8633d5dd410cf39ea9363d14e52ae4e9f3" + }, + { + "blockNo": 4582000, + "hash": "6039b672f0fdbb6f7966e61d0e0a901741a7226f704c702725dd8e7594577838" + }, + { + "blockNo": 4584000, + "hash": "780bdc71456886c1b09ee26d63f4446b437106c61e48760602a14ba0ab5acf63" + }, + { + "blockNo": 4586000, + "hash": "0c424354457cdaa84e65323606e086c4923c8ad75e965e918179d52bae7ed076" + }, + { + "blockNo": 4588000, + "hash": "773f8cc8294c62b1e4a0cf34071ca91bcacac38bfb50695ab4e504ca223ec1c3" + }, + { + "blockNo": 4590000, + "hash": "93dc1e9924880ed6658741d21a4acab4dba06efc3200aa685cc6bfeb539f8a54" + }, + { + "blockNo": 4592000, + "hash": "d083ce33ef99174aca35cb77fddbfebae3b87355e22a9360770c0c8e06b2b075" + }, + { + "blockNo": 4594000, + "hash": "2c893f4f3c0fc5713a226d0d37c74e994395ccf87b4f7b811465773e156cd2cf" + }, + { + "blockNo": 4596000, + "hash": "62fa83cc5491d2f20c2a5793e6b4b0d1df40622206489ec3aca21713d91c9b46" + }, + { + "blockNo": 4598000, + "hash": "005c92f406d3a42f60bf6229afef90415ebcd2c8c564c68645c75b8e803d108d" + }, + { + "blockNo": 4600000, + "hash": "0cb3e204bdb6db8ca270e74eac0bbe793f3a9c33a2ceb0eed61d689116ab1dbf" + }, + { + "blockNo": 4602000, + "hash": "b3f72272255cce3c5c6c797e50b0edd8379ea44cafe2a76837636ed442365bb5" + }, + { + "blockNo": 4604000, + "hash": "224ad20850b73984e5ae88d3df5e18043bbdf551efa5c23e9241d26b82c4b753" + }, + { + "blockNo": 4606000, + "hash": "46ed02f7897942797e2b1e02565ef85864230305f934e8983c9d11df88203518" + }, + { + "blockNo": 4608000, + "hash": "d28b79c63b573b008d25f988f63ad45cf74dee639f971dc8c16cbe0cefbfa75b" + }, + { + "blockNo": 4610000, + "hash": "d1458e4f230200d4c9746f1434c8066e57a54934ba5edacdca1167a03d129107" + }, + { + "blockNo": 4612000, + "hash": "9f0a50ec12a9908747ba7ca825bb0ff4de125bedd43dab0843b5c68f37c13109" + }, + { + "blockNo": 4614000, + "hash": "9c0b9af1cd15df69afae2d79d4cc7386828e0c2e243f8959a61a491a6ba01599" + }, + { + "blockNo": 4616000, + "hash": "d7876aedb1ef46ee689ad604353c1c42310a3057414ce3eca406f119678c08af" + }, + { + "blockNo": 4618000, + "hash": "25504a973f89c93598a0c7b24a6793bedf700823839cdc5cc89491f95b2e9ce7" + }, + { + "blockNo": 4620000, + "hash": "3df1685c381a59d9931b0a6076f1dd885611f320da57b9be4b4f4da41c54a709" + }, + { + "blockNo": 4622000, + "hash": "610f77b077b41bea7559871bfdbc37aebb8706e238909c0927f85f02305b5a8d" + }, + { + "blockNo": 4624000, + "hash": "30fccc0930a53d0d6483fbbb766458e3be64cba0fa53d8d047f4a8a85ae01b71" + }, + { + "blockNo": 4626000, + "hash": "8723f9edf83e84cf85e92d9c9168c104187059b530d78d407756ec2595606882" + }, + { + "blockNo": 4628000, + "hash": "3eb883834ee4a7d047bcc9aa35a9512cf93650f7f13a813301844062eec07889" + }, + { + "blockNo": 4630000, + "hash": "03f7b51a769a2e40c5237f7f0d59047d8362d1483ad2cca5af35cd9fbb6c0b38" + }, + { + "blockNo": 4632000, + "hash": "ab51806fa6f066f38b84858457f5d1c2ff281edda2db8786d2ad8b7e31fb2d60" + }, + { + "blockNo": 4634000, + "hash": "ef0f942c2b91b38e05131adfddddbd860dbbf60ecbad693a043e0a4d90d0d2bc" + }, + { + "blockNo": 4636000, + "hash": "612a3faf27872ee273bbfe2db909d3d0a65717f75ef8e29795e76f066f5471dc" + }, + { + "blockNo": 4638000, + "hash": "690229f6361afeef19e302b39036b0746913b633b377dbd1fa928e8334a87f69" + }, + { + "blockNo": 4640000, + "hash": "52f1e267ba331592726c5022f70dee0dee8c481a01fb8c317e0ae6883d6c0108" + }, + { + "blockNo": 4642000, + "hash": "4645145d410d000af0679e463c70cff5b14f4ca11e86b8cde6f5d130e72ed52e" + }, + { + "blockNo": 4644000, + "hash": "f05014e1e0c904dac208060bf0faff6b81a4a84b773350399e5c62ff3e808b43" + }, + { + "blockNo": 4646000, + "hash": "0f745244bcba8d8e44fd501a73beed456375b50255248e9a366b180d9dd9d7ba" + }, + { + "blockNo": 4648000, + "hash": "d3d97c9585bc41eb49e21a22835de005d91fc3c1a5e506c8b498fb85630f7d12" + }, + { + "blockNo": 4650000, + "hash": "6598793e8adb1a16a84ed1e69f32edc16a4f4617c2de610f1dde5f800954d68c" + }, + { + "blockNo": 4652000, + "hash": "b962641d49a5816c178781cd485a04b704c13e8fb9ca82c236aeb91b6ac03ebc" + }, + { + "blockNo": 4654000, + "hash": "02ed137363d4de38ceabe6a4bfd06f913ff8aa657689986adf5ad1198227152f" + }, + { + "blockNo": 4656000, + "hash": "0f5a94a68bc914a6a29edb5913991073567336648da75aacde5690d65cb8a7aa" + }, + { + "blockNo": 4658000, + "hash": "b3a173cfbd05d9cf27e673c78ca6d791baad7b9b64256e849f3b64ea9911e4dc" + }, + { + "blockNo": 4660000, + "hash": "0d8d16f5203ead24ac535f7df7863c5efb43e38f3720cc59b87a13187a936503" + }, + { + "blockNo": 4662000, + "hash": "c853280fa115578fc56844bfd1c37544b3ff6ec845756bfac275ce6d887f6f05" + }, + { + "blockNo": 4664000, + "hash": "4b1068fe884c48c3a9a79574881aa19848feb6bb2cbadb8e592a26b754c98976" + }, + { + "blockNo": 4666000, + "hash": "bec3e9d6a1fd83ffaaa1158e5e0af3aa720d23642faa938f5fe2de30db66c8c5" + }, + { + "blockNo": 4668000, + "hash": "003fe9d23a8bc2b25aa3aa52dd55540c7ed8cc5cfea2e6b08bc7047280ed347f" + }, + { + "blockNo": 4670000, + "hash": "35b6ca83ab2c4c6bc7c2d1799f8c98b9f83c99856f79ffbb51d82189d93889bc" + }, + { + "blockNo": 4672000, + "hash": "10458134f5adc4beda40196387b792ccb149d8ee5b3605b3a5ead5ccac908cc3" + }, + { + "blockNo": 4674000, + "hash": "2d698c175c1bacfa5a2de9923c0dcbf37121af0e7d6d2878a2c3bd9499f035bb" + }, + { + "blockNo": 4676000, + "hash": "ef0cc85b9b701977ce362368a06dfd1e9099dd7004caa1e065a3db9cfc8ee2e5" + }, + { + "blockNo": 4678000, + "hash": "faad692ec1e734df105f611831a8dc9deea60a0cdcf5181ec89ddc3a36c7c63d" + }, + { + "blockNo": 4680000, + "hash": "9e073f04e1c6f2104c997863e005e83946c8a7f2bde560f73a6011557b5416a5" + }, + { + "blockNo": 4682000, + "hash": "c4266c77976c82999f753780d3f5a2bb8101959f1b7717791c54596ce2c98a46" + }, + { + "blockNo": 4684000, + "hash": "bb7a84e043bea89ec66b1815f7e44d45fa95e168762fb95ffc52ca5cd0fe543e" + }, + { + "blockNo": 4686000, + "hash": "26eabb471318d41d1c5610c4be9b5b5dcbf9e93087376feef632d037c0c02d42" + }, + { + "blockNo": 4688000, + "hash": "f5e60a309aeae1cd8d633f04658cf83744f9f51c8a40c8b64081f26213e7598e" + }, + { + "blockNo": 4690000, + "hash": "14e76c908767ec1e76d18257b3576fe1c67ea8935ab8160783cfe52fdabce7f7" + }, + { + "blockNo": 4692000, + "hash": "d03fe990f372554a9c029f043b0f2f4f9bb42e31cdf5942440e8345f75d2c6bf" + }, + { + "blockNo": 4694000, + "hash": "84d3b3557e268b0e9b12b22c1cc7f044f60623968e3737033b87caffbdee4ae1" + }, + { + "blockNo": 4696000, + "hash": "7ddc883c7e7cddc5460c3a5a036beddbacf28091da0d28253ced0d0f402257a0" + }, + { + "blockNo": 4698000, + "hash": "8be402bdb43209214cc713a0a88dd65c25fd26d399b05b60f00f2b9397fb90e4" + }, + { + "blockNo": 4700000, + "hash": "c1164edff4177ebb2b7c2b5e82486fbedf54dcddede0f7161767fa4c743e0c3f" + }, + { + "blockNo": 4702000, + "hash": "01fecde2e80dcbcc0469118ba27620d70702e925f707d08d3e221c4e551026a9" + }, + { + "blockNo": 4704000, + "hash": "b600974b49a4b99bc609ad6ac6411e6bfc5ffd57a296bbec7da6306c620d11d4" + }, + { + "blockNo": 4706000, + "hash": "cc657c829028ef0a3ffae623fcf356c846134b80fbd388481fefff6bf7f8403d" + }, + { + "blockNo": 4708000, + "hash": "fce1c46e3a4f3779977f01f6a9a3453d88f9b9cf53ac67f764de853e5bee7b64" + }, + { + "blockNo": 4710000, + "hash": "21ce428f430b4970a37aa63220cf69ba9283c02191314d07038efb25d744d217" + }, + { + "blockNo": 4712000, + "hash": "ee0087d48dbe617d86dfe9bee72713df86cbd3d2e731e5fdc78e329cd243988a" + }, + { + "blockNo": 4714000, + "hash": "946163ec9ca708c5eeffc09508b13cfdbc5976c6cbcb928927ad9d6b26ef30b5" + }, + { + "blockNo": 4716000, + "hash": "1d51b67900e727ee48187b7b398e59655f603203a5709bca63bcab43a83f6d7a" + }, + { + "blockNo": 4718000, + "hash": "1ae8167df35e973e0afa37b47358f43d28640a2f760b5374fcf11878e6a4d0a4" + }, + { + "blockNo": 4720000, + "hash": "89ca7371ea0f09313cdb04d96f13b771f61c9e1f77c8f4a6729b8fd7d5bbced4" + }, + { + "blockNo": 4722000, + "hash": "7d21801038f4ea72e0ed553ad9ad8d14e55c5e3197b135b1ebd3171657157011" + }, + { + "blockNo": 4724000, + "hash": "1315680d7b6757c9145c70ce47f40313df78a4019f67d12ee4c7103ffecd006b" + }, + { + "blockNo": 4726000, + "hash": "5ce23a186db07494e4163fb0ecb0535ea006a0d5d318d0fa0a762417ca9d777f" + }, + { + "blockNo": 4728000, + "hash": "be6911727a067ceb36730d210c2dc4c4def88c2b5d146771a3703cf26f8f3f36" + }, + { + "blockNo": 4730000, + "hash": "050789f3ca0bf7f56841579160563b51b22eb073c5d5479f9db571d52f3eb415" + }, + { + "blockNo": 4732000, + "hash": "b77e8411e27beb183f06506a23cfe0c5b84f5ab81c7769ac0e16b6f9ae21fabd" + }, + { + "blockNo": 4734000, + "hash": "2b2ec6023bca4a869bc23346a93cc4b375a80eb61843e4599f27a74e14590188" + }, + { + "blockNo": 4736000, + "hash": "da1bf3137b840a33950b00f4905dd26f2108feb7febb09edab9d6eccb235c210" + }, + { + "blockNo": 4738000, + "hash": "42465129e4b32834acbc5715b22175dd005bc07449c6a2cac41239f485469a51" + }, + { + "blockNo": 4740000, + "hash": "49e24ac71b18afd14da043d03162260e1b156b8136288410bd4e3d83f11610ef" + }, + { + "blockNo": 4742000, + "hash": "9bc594737bc493b89dd3ee44c2c7a99d95d4fac4f08c9967e3882a9d45f65ba2" + }, + { + "blockNo": 4744000, + "hash": "3bcd71b93aae72d80e74f1be2adc97ce87e1ac1325df140b7a2a0d96e73c27bc" + }, + { + "blockNo": 4746000, + "hash": "ca1d5cc4eea7f03a28e24e378a08d5e64acfd795d936e63775049630cba2af48" + }, + { + "blockNo": 4748000, + "hash": "dc05bd35b7fde7370a623ede7a0ac7750c90fb2ac9b715bc897106f2d95ecbc3" + }, + { + "blockNo": 4750000, + "hash": "faa7a92a28fbd122dd5638b39009a2c4107751d874c73a9ebe6fd61330eaf323" + }, + { + "blockNo": 4752000, + "hash": "e91cd1e290106f2a9edfbb9af4ec7117bbbd0b9cfc94faab2873e3b369d4dbab" + }, + { + "blockNo": 4754000, + "hash": "51a46888e68c5b463c027b0c97be0f553aaf6210af489277288fda1bea4d1d06" + }, + { + "blockNo": 4756000, + "hash": "efb7af7d4f6e5c933dbe1ba02f978ff87a697c06672eec3521e176c910a62f55" + }, + { + "blockNo": 4758000, + "hash": "cbd60be78adfbeadfb2167971765322cdfabb61bc0050423cba74f556a6a6b09" + }, + { + "blockNo": 4760000, + "hash": "fc7180b94470571ec7b035e4e053d5f935d311e0c5465fe9259a0f5a1365a348" + }, + { + "blockNo": 4762000, + "hash": "17545345d7371baf9db31e019f83f284b4c9885ad47036a8f6f63ce5fdb57cd8" + }, + { + "blockNo": 4764000, + "hash": "3307524de08f80a8aa37be5d691fdd247de0fa820435b4ce76d7fd8f6d6eea6f" + }, + { + "blockNo": 4766000, + "hash": "2f925bf4d1805acdc2984014805e9f0ed31afb704047a56b60286c7a04f0a555" + }, + { + "blockNo": 4768000, + "hash": "c87d97e583ac16f96e333e5c63abe0292e7078105f0a50a978d77ace75e30c50" + }, + { + "blockNo": 4770000, + "hash": "7fa61599416eb18e952de5e0d638f2be8d0b323cb3673cd464121a783f55efc1" + }, + { + "blockNo": 4772000, + "hash": "b1b3c9e304201fcf7583728b6f222fff359b0a92c512f49ffeeffc4cdad77135" + }, + { + "blockNo": 4774000, + "hash": "cb58e68516dd204b5f3322838cd223c243d315b81c354e6d5520eb5d63d4935a" + }, + { + "blockNo": 4776000, + "hash": "d382ef932df43db051545c2d88a0fe724477735f0adc4fc5ae7b5c048028b995" + }, + { + "blockNo": 4778000, + "hash": "46ed2ea450b1e925a195455aeeca9850e6015d60cfa0506fb9aa95c903bda43a" + }, + { + "blockNo": 4780000, + "hash": "406ad5430d0ec41bbef0881a035099e15928a2c0a48860ec7375a8675a7180fc" + }, + { + "blockNo": 4782000, + "hash": "fa9df2173030b22716381663b1b97a952feb51709f97bc1336998806c9cac8a7" + }, + { + "blockNo": 4784000, + "hash": "1ab3eda6d33d898f83a74287dfe244358a992dd8587a48197f6e715a376944b5" + }, + { + "blockNo": 4786000, + "hash": "48da8f86efd73bd8bb021ba7f30d3d0bab37c371cd79bbe8a03682f13d329e26" + }, + { + "blockNo": 4788000, + "hash": "30ea960beda32f91ed178670e8ecd5f2843f3cf0da48fa44a799a2b0009ce372" + }, + { + "blockNo": 4790000, + "hash": "e80237ce146a41d6e027f5a0f9073c21f5088d807b8f7eac9ff59f4bc033d542" + }, + { + "blockNo": 4792000, + "hash": "1078851765bdabbbcd92230cab0684581b58783f7bd2cdb43a5fd8aa2d8aefb2" + }, + { + "blockNo": 4794000, + "hash": "1b7d310a7345533f90ebc8168e94740b611811afba84ad39f0b27eee37780123" + }, + { + "blockNo": 4796000, + "hash": "88a81ecf8b14dc45231fcee70436fbd7c3851115f690110d86b036b1e6446a8f" + }, + { + "blockNo": 4798000, + "hash": "4e7d9e3f9eb022e42074c713aae618728baa1aade164063cd526d9cd2b6be647" + }, + { + "blockNo": 4800000, + "hash": "e71de6b6c55654c8c98af0da419c4625631872f1d7d2f93f17ecd877f3e1928a" + }, + { + "blockNo": 4802000, + "hash": "d38f7bb993a53015ab8e7c5202e8f1ebac351c2e67e39d027de4eea4e012d9ab" + }, + { + "blockNo": 4804000, + "hash": "6883469a0320bae5fc848054ee0f613a7bd9d1a04d6fa4bd7522be829e456f4d" + }, + { + "blockNo": 4806000, + "hash": "d8acadb432962efdbc12c843c745efb4e13824e802430cb30a4eb6f9cf6a546f" + }, + { + "blockNo": 4808000, + "hash": "25bedcd8490df6ef40665e53fc8b0b740ea793e0437283d0f77a7002dc87f319" + }, + { + "blockNo": 4810000, + "hash": "a87e2bdfe20d1fba37dfb7e067d0c77b7554ffc448d50b5acde45cd5f90227ba" + }, + { + "blockNo": 4812000, + "hash": "d67ac10c286ec27795e667c8a875a8cff4a8385c8a1a4dcd54092f6f7d96b61c" + }, + { + "blockNo": 4814000, + "hash": "29ddbbd7a6386b60211741f066ee91ed3ef9bdd8d6ca2d0a9193eae73730e727" + }, + { + "blockNo": 4816000, + "hash": "388c8821cb4237d9c90548c8a862680c61ee490559c5f197cea908db1396ea98" + }, + { + "blockNo": 4818000, + "hash": "360e06c0514d3881d5577e10b57c54967b57c1d556011ea031c03bbb3c4058d5" + }, + { + "blockNo": 4820000, + "hash": "34af0c8b16171469f9aadf8a9671823674096d74b2a3f85b3b268cbf33064e8e" + }, + { + "blockNo": 4822000, + "hash": "a71e47f96e918a870305738e271a8c7b647dee2b3d5d2647ace5da0188625098" + }, + { + "blockNo": 4824000, + "hash": "5347c5dc87141799f8abf9392f8d1197903ad7ea6d6c61fca7b7bb94902915c0" + }, + { + "blockNo": 4826000, + "hash": "43ee7014b884079630805830654c86b7e056321a2e7097c9c94cfb4765c42058" + }, + { + "blockNo": 4828000, + "hash": "15b36bd05db40b36d3e022af172bb8c46662847dbd4fd21dab3b6d9bcf567654" + }, + { + "blockNo": 4830000, + "hash": "28eed8135c84e807178cfa0c727773b9ca20b4adf7484bbb621946902ec2037b" + }, + { + "blockNo": 4832000, + "hash": "1b1346897f950f79ea6b0c220b6937e82fff9b3183f438c02de8623f32635215" + }, + { + "blockNo": 4834000, + "hash": "22d4895e9f032f0d15c4b10944a7ef93e4ef796a5788b618ff4a4d779f05e10a" + }, + { + "blockNo": 4836000, + "hash": "4bb5db5f5f9075ce6f2fae6a7b8e058fd2df29228a6c0af5a103fd75a9010e10" + }, + { + "blockNo": 4838000, + "hash": "d0b4b14232d0ab44e2923ce5b060d209f2c24a3e7d5af374ad104df2936e558b" + }, + { + "blockNo": 4840000, + "hash": "b654a2b464da1dcbb1e9ecc31a02a94c6cf4f0cea3f30639bbaf32a16fe712c1" + }, + { + "blockNo": 4842000, + "hash": "db2a6c637e643315091eabcdc3abb1e71a407b538bbb01079cd8c411bf6aba44" + }, + { + "blockNo": 4844000, + "hash": "9f8bc4c9efe99441696a7248e8291ee6e8ff0771416be5b54cd9d23c89c348e9" + }, + { + "blockNo": 4846000, + "hash": "6133625aff2695cdd187fd013aef3076276117ac11f76de3f70e6e1b08991fd7" + }, + { + "blockNo": 4848000, + "hash": "901e690dbc6acfc17855c495f9b85781b9a73144ea94a3579269e903790958f6" + }, + { + "blockNo": 4850000, + "hash": "8cb940e9d2b6769e548e20d6f7e687c951e171a9289bdea00f70a6d16959c71e" + }, + { + "blockNo": 4852000, + "hash": "b5b0a512ea8f1718d4963501da98f8f234fc71c65750150b7e5961c195ed1986" + }, + { + "blockNo": 4854000, + "hash": "3ad29ce678ee4fa812f6a875960dc7d5fbc4c04b793a25e8d12ab32a298fa1f9" + }, + { + "blockNo": 4856000, + "hash": "33e79f00232f6509bc522d3ea4a71eca1205e2ec4c886d1fa00c6c150ff6d683" + }, + { + "blockNo": 4858000, + "hash": "49247fdc64bb19192a3aeadd777ca02dc161ba1c6a3203037922b7b0ea7cc876" + }, + { + "blockNo": 4860000, + "hash": "01d88f81a232e21dd98fa14cf1c35bf9ca70e1fee94ca62c667a00e9ff38f0aa" + }, + { + "blockNo": 4862000, + "hash": "278626747825f67cb4e650a23e32af73bf80c695a0543c7094449580b7bc5326" + }, + { + "blockNo": 4864000, + "hash": "1faf649e5f7ce223f965d0444abcab6f23dcd7aed738021a5c25d45e8f99a430" + }, + { + "blockNo": 4866000, + "hash": "2bbc6dde83f459b2a7c5057d06a91a3c64514529b3096ba1de9a387f2c7ddeeb" + }, + { + "blockNo": 4868000, + "hash": "5017d9a52ebc591eaaee4c4c6dab296f1587fe6c8acf23c143a48d74a225226f" + }, + { + "blockNo": 4870000, + "hash": "5e3e2cd09e475466b193de7316a019556908f42eeef62630bea88745fda289ff" + }, + { + "blockNo": 4872000, + "hash": "efb74f90386090f3cd8da0d129128b4a8a9dec668090db76cc0464418dedff1e" + }, + { + "blockNo": 4874000, + "hash": "f744235201becadab0e10612ed324d3555025cc85168b8e0404b718a7b140805" + }, + { + "blockNo": 4876000, + "hash": "976a79bafca29e7fde832433c928f8c2c046c58025e05a20e94ea3b5ba2a9bd0" + }, + { + "blockNo": 4878000, + "hash": "a2845f9a2cb40a8c8d3dbc36d50d4a6aaca85c133f42645857aeecb2769b40fc" + }, + { + "blockNo": 4880000, + "hash": "6fdf3d0a3d1149f887cc40b5b71a77b8a1bd8cdb0375b886e5392f80e6865e86" + }, + { + "blockNo": 4882000, + "hash": "eef91247ebe4bc449c62368f4fde2ae8ba774144a97851964133138207c1a184" + }, + { + "blockNo": 4884000, + "hash": "b279adb459f38dab964c3bc9db0da02d201af721ceae393db23fa37484d0a6bd" + }, + { + "blockNo": 4886000, + "hash": "7343cc4b1b474472e64f63fcd8a1f609596aee4649caeb36a8e088ce1aa4d5eb" + }, + { + "blockNo": 4888000, + "hash": "22d4bae1386e3fe4f9c5fd7571a536b8e55493362a96f0865e3cd9586affef96" + }, + { + "blockNo": 4890000, + "hash": "1a92a03b438f02f6882fd1e4690df80db771d5c46acad5da31d6c672c91baf9f" + }, + { + "blockNo": 4892000, + "hash": "7a2c5fcaa4162d7673aafbd988b9731916244e00502df2e60abb2d5e40604b95" + }, + { + "blockNo": 4894000, + "hash": "eaee4643ce8f78bc791878f3bb5b096569f75e7e9d9a2fdfc52e769bf6f7556b" + }, + { + "blockNo": 4896000, + "hash": "b2021749f9f0ff87ff46372d152541e1a4131d0a971e54dfb1434d5e19667210" + }, + { + "blockNo": 4898000, + "hash": "8776b1b36dbb8cfb2d2d4e908050716f774b8ee0c6eecb58eab4ca4e30d8c1d7" + }, + { + "blockNo": 4900000, + "hash": "819c4be63e6c7cfe9eeb2e8c268f200ef4190bc935b40923f295bb702c9510e5" + }, + { + "blockNo": 4902000, + "hash": "007e62acfe5037dd4b9a08e1db34349a00db5492dfd6b03989922171d9e81586" + }, + { + "blockNo": 4904000, + "hash": "5f6bf30ed4d9f6a90297904e2337341866e2ee78fae9e5ebe0effd815681facd" + }, + { + "blockNo": 4906000, + "hash": "fbf60047b3e5f2392764f7eb34ea801d631336b722aec06a32f07b9553717825" + }, + { + "blockNo": 4908000, + "hash": "d330084d898d014b5d0033aa58b84ac98fab27696901d48508c2d000631ba5ce" + }, + { + "blockNo": 4910000, + "hash": "a51b29ff177027845e6792af71296ab99052d94765afa76c9bc76d8d8af94012" + }, + { + "blockNo": 4912000, + "hash": "e81cf3c3920222e23f76c70d2ad6f2726a6f83f3d8850313d99a8e8e08de2269" + }, + { + "blockNo": 4914000, + "hash": "53f8b18c9cf33065f99fe868336048f97aa00ba4b6a33ed33c4f22fd369aee22" + }, + { + "blockNo": 4916000, + "hash": "1d72e0b2c500a4aeb7aa4b820fc3bc48bee7b78344c73454c30178281ebb8fda" + }, + { + "blockNo": 4918000, + "hash": "364a1e94687031343f446e8fa2bcc49a8151f80611926005f324f75100a765ab" + }, + { + "blockNo": 4920000, + "hash": "a12852d48202ab8c0bbf10fc59007c11b9489ee39b1b489bfc1efd8e1be66008" + }, + { + "blockNo": 4922000, + "hash": "a9f2ff9c4b95699f38492db59608663bf85c882e3c3bf087ad336775897d0684" + }, + { + "blockNo": 4924000, + "hash": "258ebf3b039afb7a26d9fba4ce320c069ce1dc7f3d2402cf8efec883c0e47e40" + }, + { + "blockNo": 4926000, + "hash": "fcda5e7bf24d84e2c3b37b307f56ad7e0dba89d86209f2ac4bfbfe14267ef08d" + }, + { + "blockNo": 4928000, + "hash": "8f94673a96c9136f111cb83175a71e199d4075d0d09ff4404b7094ced9f56ab0" + }, + { + "blockNo": 4930000, + "hash": "f3691a93409c82af302aca7ab0384e279afc199cd1457266fef5c167465c12e3" + }, + { + "blockNo": 4932000, + "hash": "888e4b606bc404b90f0e06cefe2548d0ec7501e31d9864fca8e7c8dc1812565b" + }, + { + "blockNo": 4934000, + "hash": "6260128740f9580bd728e2a5544326466eee2e9a5a1db8a363f74032b568f09b" + }, + { + "blockNo": 4936000, + "hash": "ce8e1952b022e79ed2948217c5158f354e286c53eb6a7a05800bfdce32ba1cf1" + }, + { + "blockNo": 4938000, + "hash": "163c9abf72905d27b8799e15701d7cbf2f7ec6ddc8fdfa54ada8d23de57ec7f4" + }, + { + "blockNo": 4940000, + "hash": "66a95362adbe1a0b0bde674d0e3994aaa78d2be290f66cb03b3fdf7cae54d4cf" + }, + { + "blockNo": 4942000, + "hash": "b151d7d11a6e55ab48084aee639fda294360edc6cf571d63b77ae81f5f4d47e3" + }, + { + "blockNo": 4944000, + "hash": "2d1ca3d0f589686080ba80e03f9a58771fbf31eeeeaaa3c9594a228cfa3c99e9" + }, + { + "blockNo": 4946000, + "hash": "62f252f1b135163e808552281735dc7eee74190a52552a7fa8328e35c74e9fd2" + }, + { + "blockNo": 4948000, + "hash": "008fa0297a02f2d7242e1ad515dc9d2b050b95732c22aef5bcf6bcca5ddff8ad" + }, + { + "blockNo": 4950000, + "hash": "223162c8c604201ba1703b16d6aea2551053c3af2549923939e9583f9f476ada" + }, + { + "blockNo": 4952000, + "hash": "d7a19946de501cbeb0f96af74a9a7573e04ba629db666824e3de9edd25660ad4" + }, + { + "blockNo": 4954000, + "hash": "dddc64c9a8a7c729dcdf885be401c813b8edd5337057bc2ce2a5159cf43dd3bf" + }, + { + "blockNo": 4956000, + "hash": "9389fdd803a29f04b4e933568a7cf75e0a9842acaf10a971093afeae7e4ed678" + }, + { + "blockNo": 4958000, + "hash": "f6c529f6f5b2805361cb635624c0cbf614b98df951bec9355a82d6a7c559b183" + }, + { + "blockNo": 4960000, + "hash": "748e01cbb0786664aed88b0d0cc966e6165b0314e2d027beb4157c7c04558e2a" + }, + { + "blockNo": 4962000, + "hash": "55533dd901f56e8b271f1a4d8f93c48df46372d18fccde4abbce5bb0959ba3d3" + }, + { + "blockNo": 4964000, + "hash": "87a3e76c1f91cbcc093f89500f7b2427b8ffdb12f67ed70de1a4ca41646518aa" + }, + { + "blockNo": 4966000, + "hash": "415886b162d2b5da276fc890dbc3dd1e9c0610b018f739aa3c7ab531de3a0ca9" + }, + { + "blockNo": 4968000, + "hash": "06cc768dd7eec8605b5ab20daa6642568645f54dcbf76edf9a3ab6196cc0ffea" + }, + { + "blockNo": 4970000, + "hash": "da2304983bc6002c54814b992123cae4f160809fcfcd25e9f1439c75f8d55b71" + }, + { + "blockNo": 4972000, + "hash": "4b0480f88599250031cdf8af0b2aa84bdc533b8707a6a6e6ee754c4a94b5fe94" + }, + { + "blockNo": 4974000, + "hash": "563bc4e78bab2f78024b067e1efbf6e41ba8d3dc9239180829a0f04aa22f39a5" + }, + { + "blockNo": 4976000, + "hash": "fc659b0639db9d28de2657126d79cefb247bf64a90ee96c4bd7a3887e445f3d9" + }, + { + "blockNo": 4978000, + "hash": "f125b3289f1ee6caae9bf0216c7db3c8b143689ac434a0cee89d0fbe14075a05" + }, + { + "blockNo": 4980000, + "hash": "c9b67b5e5e47ca409a2abd6015f2cf33b01fdbbacdc3c1a2515d3e61d8d788fc" + }, + { + "blockNo": 4982000, + "hash": "876c1662f0e10fbf9b02d2e7ea82f7a3539fc247639856f461bf03832d946f50" + }, + { + "blockNo": 4984000, + "hash": "615f399934a46696a681b5f95c23577657f37ed75d57db5d9b057574fb4a3e88" + }, + { + "blockNo": 4986000, + "hash": "73297cd13bb2973d7808daabf24ccfd7aacf0ced35af094f8a2369fb134e7d8d" + }, + { + "blockNo": 4988000, + "hash": "af7db52e903165faf7a514de02e7e16f7c4c6e62aefecfd6eea09701c17fcb7b" + }, + { + "blockNo": 4990000, + "hash": "3aec74f3f9a5fc9ed44cd73a6d4093fa44274596212fa86e2fda1a8c7ce388bd" + }, + { + "blockNo": 4992000, + "hash": "5fe9bf34629825345467e16e17d53015cb05627a823f84e94fbe040225dee0b3" + }, + { + "blockNo": 4994000, + "hash": "53cc4374771b29f18c85b17afc5cac908d5f58d8bd9c62fb3af4338fb492278b" + }, + { + "blockNo": 4996000, + "hash": "a5f85a65e2a85a59e3da9d8d896e490fba29f08d80e1f73beec6c0d1c123a693" + }, + { + "blockNo": 4998000, + "hash": "d3b88dc48573ea33a16acf6b03908070b54c555e56b770537422c32a7bb21d24" + }, + { + "blockNo": 5000000, + "hash": "97e160fc41b9cd751270100dd639202c1b8ae81932f20340bd6dd9f44e429a1d" + }, + { + "blockNo": 5002000, + "hash": "8bc013deb9a2fc6bb0a655d0a5a46ec6cb56c7474b5dae144399ae3a460588ff" + }, + { + "blockNo": 5004000, + "hash": "9804efa3a160a0a84e2a2ad995f9fd3cb07a067b9e8d9be90e813b12aa7b64b2" + }, + { + "blockNo": 5006000, + "hash": "2498175cdc8f8388191be11e64e0786a46f72409ae72ad8af746cbe1516e0a7c" + }, + { + "blockNo": 5008000, + "hash": "03dd6e64113bcd590c3dd4e133a3a68655c9fac4d5498b70d42c3eb0055c5fb5" + }, + { + "blockNo": 5010000, + "hash": "a389305f17ff9402d68f374014ea9ae2afa079fcdcb9a88841ae44e9cec46278" + }, + { + "blockNo": 5012000, + "hash": "5b4cbee94c35f0f03e05fc59c62c3012701d860ed05c25d16e9f7508192bff6d" + }, + { + "blockNo": 5014000, + "hash": "35f9e32954072d62a114fa807cf6d27446725052eed05accfcef723af8ae1beb" + }, + { + "blockNo": 5016000, + "hash": "5845e24e56e5a1c8cb5945056e1646f9417f0700509add92b3e0b9636d1302e0" + }, + { + "blockNo": 5018000, + "hash": "06fa68421b0c802273f70d06ff7b22b18d5adf6f473ff906d21635bba696b8d0" + }, + { + "blockNo": 5020000, + "hash": "a7967a9506fc33b31ff1cc824f7e0092acf3e2c92f45b470e2d69d439532597e" + }, + { + "blockNo": 5022000, + "hash": "b3fc0c5704e4724f97c5c9c57b9071e3adde3524c2d31d5ea260feacc9ab6710" + }, + { + "blockNo": 5024000, + "hash": "85771d063d04d6fea3272806bfa782a0008491f182979e2a9cc468971e891446" + }, + { + "blockNo": 5026000, + "hash": "435b5e134c8b518c5b6f419a774ece8abde2367837b744e388af079faeac8734" + }, + { + "blockNo": 5028000, + "hash": "209fdaa19f1f9f5aef129585f5c07540a19b63212ac50604e8b032d4edca7922" + }, + { + "blockNo": 5030000, + "hash": "0dfd887ce248f5dabfe12ca8ba82b746bc51dd4f7abfa920a11c5bd0d06fbf9b" + }, + { + "blockNo": 5032000, + "hash": "8c9ae3331cf2ab189be60bdfeedbc6051b5e1ee0004e8863d1e272ec4ebe663f" + }, + { + "blockNo": 5034000, + "hash": "bae21bea43d38c51fadc1ec677f08b1245e6348e64b8e9defd69fe3773daa77a" + }, + { + "blockNo": 5036000, + "hash": "f45aae877e9841e3bb9b51d46d2ea3b9601012678217ec7116f713aabd726876" + }, + { + "blockNo": 5038000, + "hash": "ec1351a02f47762cfed9ebf06ad77f05941412842edec673fee3a20db52e68b2" + }, + { + "blockNo": 5040000, + "hash": "d66cfee10a0bfcae7f2c73faeeb9b5f29d1871736b97ef832a033f312bc4eb4c" + }, + { + "blockNo": 5042000, + "hash": "e6a755366c3eb561fe413ad8e425493ec9ba9a65e97dbf1f50a1dc387b5faa22" + }, + { + "blockNo": 5044000, + "hash": "6961f236e85ea69a8d790dd7677053d26ed066dc5391cd285bce4ce65991d59f" + }, + { + "blockNo": 5046000, + "hash": "2af785f4eec433ae0561845fefa914e87d19c69f4db826314758ed7474ee342b" + }, + { + "blockNo": 5048000, + "hash": "312efbd9943a72d2329595134668fd4cae7958383bf545b0b0d313c1d71cf5f6" + }, + { + "blockNo": 5050000, + "hash": "65f98ba3d43ab7ec3753e1cdec84ed35e2eeec5086e8aa6ba1e0aa9c7f431b1b" + }, + { + "blockNo": 5052000, + "hash": "3652773c1c04a2e96b0367578c7a30a97c1ce313aaf38271c4f72e07a5aa7cc3" + }, + { + "blockNo": 5054000, + "hash": "c05b8bcb738487af14805ea54c062aa2dc238fff3780165f9f3c20f3fe654818" + }, + { + "blockNo": 5056000, + "hash": "b808851b8c9ce8dbb5a5c7577c2cfd696198bb03735da37972d6e785455d0d50" + }, + { + "blockNo": 5058000, + "hash": "806aa01c02032fcada5cbb381b7443f5b30c8c5cb9bb3de8b0be4b18dcc29c41" + }, + { + "blockNo": 5060000, + "hash": "ffe4f6fbe2fb13b1ce9f91f100450d662677b99aafae98f2c59ff988b4e75931" + }, + { + "blockNo": 5062000, + "hash": "9162322ec8c033ece38c48b65ec0e021b132b55aba21283a18e5f1c018167827" + }, + { + "blockNo": 5064000, + "hash": "6b960cd87a04ddbce02503983e132d438189736dd1f0e290f1af7c7c8faece6b" + }, + { + "blockNo": 5066000, + "hash": "f07bf0d85bf4c9acccdfc7658cfca362a04ec45df31f8f535c1a395a924b85a2" + }, + { + "blockNo": 5068000, + "hash": "cebe3014f54a664fa42e0699eed73a05105827021993239415c3c8861a089d90" + }, + { + "blockNo": 5070000, + "hash": "4bbb48de31a8bb3d8d3216b6dc928894371a9ae8deedf80f9e85d154dadbc9c5" + }, + { + "blockNo": 5072000, + "hash": "66b397262009833fb8d91af3f09e583bd556d3661e3400e836bebe4f2d8b2641" + }, + { + "blockNo": 5074000, + "hash": "7fadcc1e374194a0fd907ad866bdc44acc5f372b4db54cb766a8be965f2685d4" + }, + { + "blockNo": 5076000, + "hash": "74b80cf250576a3bd4b460fdb204296427c37612b2ce678132b9d5d5a167a1e8" + }, + { + "blockNo": 5078000, + "hash": "650fa2b64eefc18e0dfb1799aaa3e5c3f924bfcdf99add207c87d236dcc00a46" + }, + { + "blockNo": 5080000, + "hash": "3a984f5be430d2ef984c3bbd13108b592c17def551f917ae9c4b265da78e1549" + }, + { + "blockNo": 5082000, + "hash": "75f7fd62ce53b2cbdccfccae2adbc9e6ea75a93a6880c0e8f58306beb835160e" + }, + { + "blockNo": 5084000, + "hash": "bf96f8fb745b676fa8ae5da6de5988ba217a8f748c0c817811989f41a0795942" + }, + { + "blockNo": 5086000, + "hash": "f34e643f4675a32cf98876122c8203ea14e19faaf483f48b0450e62e131074f0" + }, + { + "blockNo": 5088000, + "hash": "12a0112ee3b6bb7496511aace611e3069401017f0dca83b80b7cf68ec55576b6" + }, + { + "blockNo": 5090000, + "hash": "8c3ffbfa77644c4558afed4aaec63095dfc908ff99d7567654d3c752721f4080" + }, + { + "blockNo": 5092000, + "hash": "6e9f1d2cbec9256bd30dfc5086cb1da0b0614d7c5125220fdee9b9b1bc33d46d" + }, + { + "blockNo": 5094000, + "hash": "5ff0c9a2332ee0db16169543c1abce577c3c4522e1d6d82bc0c1536d3b39e93f" + }, + { + "blockNo": 5096000, + "hash": "3ae399d0d4fe88cbe8d94ff4f486c26e8b5b9dadf7b778d5f55ac9cfa093ce4f" + }, + { + "blockNo": 5098000, + "hash": "155a72ad12304ed91a3e4ba864cf750a24597b93493ceeded9520253d2079a39" + }, + { + "blockNo": 5100000, + "hash": "3d219d321aabba7b7e89a6f34445f52ce1ca26a21e5401ce22a9d60ed1607748" + }, + { + "blockNo": 5102000, + "hash": "da602ccaae5649f5d15687a9a7e5c4a5598e4559fbe923ca8a10a034e01f7be4" + }, + { + "blockNo": 5104000, + "hash": "919e8927be9ab8e5deebfb0036d38fc9458f984cd79c776745fa16263fb2c384" + }, + { + "blockNo": 5106000, + "hash": "f2aabba105363036dc273f2369715cbf90432ee373ce8357d698e61afe8165ee" + }, + { + "blockNo": 5108000, + "hash": "4fefe1bb118103becda5411c111c9a26e1b740bc5e1dc197ff394f0135b61bfe" + }, + { + "blockNo": 5110000, + "hash": "d07c4ee219d86fd339a34e5fd6fef4109e75b8d467175e6b4877e3413da6ac39" + }, + { + "blockNo": 5112000, + "hash": "335e49b7b0b69bf54ac7337db644a5aaee3d631d52462f118edb066638e649b7" + }, + { + "blockNo": 5114000, + "hash": "822122d686fc171cd3a0f19fb4063a5a096cfff8bfab91de7fa1a5e635a5c110" + }, + { + "blockNo": 5116000, + "hash": "f990c6d0fa2f245250cd641800d1465f767e61e1971b2578fb031e4fd8a0dbcb" + }, + { + "blockNo": 5118000, + "hash": "ecec28203bb6a234568c03f225b5c6a8548c24101008be46213b499e98141977" + }, + { + "blockNo": 5120000, + "hash": "e112e771aa3c9e38ac0c1cdd6e4adea272306aaad457e638c80f76f32c92af85" + }, + { + "blockNo": 5122000, + "hash": "fabe562a4662cb5cdfd5458f68c906beacf8cb01d0757b95c66adac946a1a0cc" + }, + { + "blockNo": 5124000, + "hash": "1034cefbc940030a44b6a59beb6249cc27c9bf0cb5871c423930b0d32b505556" + }, + { + "blockNo": 5126000, + "hash": "8ce304ca332bfd738559df5b7380714488530b7eeb8a8e08e8762f3c1aada3a6" + }, + { + "blockNo": 5128000, + "hash": "15c1fbb190e6df2e5e6c2f021f5e068814a5b36f1ef871e7533591e148f77c1f" + }, + { + "blockNo": 5130000, + "hash": "292b7cea1c5eb7b02cb49451475e3a06c27440b1d7a040da8295a5c7f0fc0cfd" + }, + { + "blockNo": 5132000, + "hash": "15a513a6c86cb671b955f6807ac30987fabc98b4042da69d31180d5ff368a536" + }, + { + "blockNo": 5134000, + "hash": "61ecc39911f163040d3e4dd832351d52709cae2dab59182dafb0eb9026671ddb" + }, + { + "blockNo": 5136000, + "hash": "0818a53d1640ee7f39b43955d5205be08b67502d0f18a3cbf2b01407fdf49dd6" + }, + { + "blockNo": 5138000, + "hash": "c0c6642f5d40e3e47d323bb23e5bc9df020efbbc4f0601f37714351ed1228abb" + }, + { + "blockNo": 5140000, + "hash": "b845f64e49dd8abf8ef1740ec38d4a3dbe626f1775ecf19e3529e6d493fa0699" + }, + { + "blockNo": 5142000, + "hash": "171743780556225176e1c3ec0ce84f168de81ec8556adcd508ea167c369faee1" + }, + { + "blockNo": 5144000, + "hash": "d1775961a594c28f533414b42e5f813e13b0606b12d0da6237c1a7c515665c48" + }, + { + "blockNo": 5146000, + "hash": "108196f98ec03fb88c628bee6bbbdfe10788c4c4a11ecb082d6868d3fc7181da" + }, + { + "blockNo": 5148000, + "hash": "49918258fa1fda7fcd7f61c019b754f204b0e6b61d612c2c5050a49d706d8a7a" + }, + { + "blockNo": 5150000, + "hash": "f7ae601abab38f4cc96b294eeb227cf2fab85da7b82a9ff2a59dcce079738eaf" + }, + { + "blockNo": 5152000, + "hash": "8a3c30e8a8c5d691055e4527d715b67d0417227c3a294de424d041a5cc617323" + }, + { + "blockNo": 5154000, + "hash": "513cbeb00d7452709bf7604759e0b50ff8cdfde88d133be5862ea3767f42cd87" + }, + { + "blockNo": 5156000, + "hash": "d19840883b42ea45e5c4f0e250ad19a7ff947ec7cc2027773f32f1583fa69858" + }, + { + "blockNo": 5158000, + "hash": "7b252c960195372b30b9423c17238580e79e2d40dec717eaea449bb8a9d9a064" + }, + { + "blockNo": 5160000, + "hash": "f60a94747d1869d6afd1d18aa73cd85d76468a3b3d6de77b7b3377d61aee9357" + }, + { + "blockNo": 5162000, + "hash": "43084a120d9ca4dc48f9d9d2242e640ca919e85c5255e2954ebc3d06eb866723" + }, + { + "blockNo": 5164000, + "hash": "1e801aeb0402b0bef3ff36e5e08c17f6ec95797bb640de762f5c49072b7f6355" + }, + { + "blockNo": 5166000, + "hash": "4836102919d5092e94fe3d640350133c4a7809cc21f60043ab98f8ad93b0b92a" + }, + { + "blockNo": 5168000, + "hash": "90127c6e7f30137fe53239f8272d2137c310bdb95ca4ec7322d35204d8f0ca7c" + }, + { + "blockNo": 5170000, + "hash": "06d0d6009a5d76e44d5d1dd1608f06d30c8ec34b34a5db8e31ed50d1d1b5a1f9" + }, + { + "blockNo": 5172000, + "hash": "98c304dc9e5225bec1693b16bc86d969b9f70936e66f7c13ba2e5ea663b93416" + }, + { + "blockNo": 5174000, + "hash": "825d32909aaafb4b0637ac0b0de3c73110d24f6f93b7c7e120f9996dd8f560b1" + }, + { + "blockNo": 5176000, + "hash": "8bc58ac36f887615fe3f159e9e3181989dfa99c65eef72afd522a8eba5b393bf" + }, + { + "blockNo": 5178000, + "hash": "a6e02347fab794482599dd6e5a9ac67040877448f80ccc3b8b829967590c3fb8" + }, + { + "blockNo": 5180000, + "hash": "1c5a6064d534651edd4e9dd03fe82e26593a1ae216b1fffafab70e738d3788d3" + }, + { + "blockNo": 5182000, + "hash": "876963fda222c493df55f58d317caa26c66378d413f1aecd430ac9bacef522c8" + }, + { + "blockNo": 5184000, + "hash": "9e085afafc6fb2b769f17e9373f3a659656a29e4f8ccff90e6fe36cb6d715a43" + }, + { + "blockNo": 5186000, + "hash": "ebf551b1ac5d2596f134d3cf921798d3b42279115948464b84feb6b5e80c2959" + }, + { + "blockNo": 5188000, + "hash": "9194e1e211f012fef79d93b34d3498e8844c4fd2b15000dc5d473687faa1f552" + }, + { + "blockNo": 5190000, + "hash": "abfcc8c52c5408ba88664fb7f40a3b9e95f2641334bea364375263192ef2057d" + }, + { + "blockNo": 5192000, + "hash": "98a6ef6ea26082d34c52f7f9bd1b34fd949be7dec0040d47f50f6b4a875cb0af" + }, + { + "blockNo": 5194000, + "hash": "60e1efae2150b38bc0dc83aca7b48f8f429300a8cffade7f7fa0a9f959c304e5" + }, + { + "blockNo": 5196000, + "hash": "fd9943566a3e7ee21bb61bfe8e221c7b23c2bdfe4ba2818c916691b0725e7cb2" + }, + { + "blockNo": 5198000, + "hash": "d4681192000739090ac6811441c14b0a58f798a1a2b48f368d87d7b7cd1bda95" + }, + { + "blockNo": 5200000, + "hash": "306eace6f42da39726c9b7b384ade83df54814e40532557cbe32c540dbde9961" + }, + { + "blockNo": 5202000, + "hash": "c92121b7b0934346c8a32d9b80ad84b7e610d8a74aaa1bb1defaed7cc0eed02b" + }, + { + "blockNo": 5204000, + "hash": "a4d1c88fc24b3b19ea7c7b043a4531a88e518c0d7f0d2a9896ae931c1886d085" + }, + { + "blockNo": 5206000, + "hash": "821c8035a1f7a1624e7e603acf60edd1262402926544346b0ff91771b2a6db61" + }, + { + "blockNo": 5208000, + "hash": "2b8484977c23ec10aab6a2d4d82cb3c3c432b737b58df7ffa748820de5f8bfe6" + }, + { + "blockNo": 5210000, + "hash": "bc30b43205b894d6aca3342ef3d7f10c80f904e1bdb4799a5fb11b8ca95774eb" + }, + { + "blockNo": 5212000, + "hash": "89f7dc975c9227366535be420bb3f3b4f02b99f2c31b18f0b10ebbdde2ab0f4b" + }, + { + "blockNo": 5214000, + "hash": "c4a153dfb3417f6c4d861e6137508bf56e4ba13b218d933a763671acdea5da8d" + }, + { + "blockNo": 5216000, + "hash": "27f7bf41813ed50c8b533160821ea3efcba7ecb1504e1f0e56588721b727e8b9" + }, + { + "blockNo": 5218000, + "hash": "45adec127d844fe1c420a97d17f3a04f4a4cb72c607c92b924354a25014663f6" + }, + { + "blockNo": 5220000, + "hash": "65936c93d56f41240d107fc6aded466fa64a1edcfd58bcf545977f637a2a7198" + }, + { + "blockNo": 5222000, + "hash": "16299c36af9ebce7059e25440218383386ba3392f463b82614641ee2c11f04bf" + }, + { + "blockNo": 5224000, + "hash": "bd4d2fee0e9b1d79c98d457263f801020b33473b09f34dc3859e197eb179cd13" + }, + { + "blockNo": 5226000, + "hash": "f132896f36269d33f292702ce814b191c1932900e53dd2ed508f6ac5f1fd99cb" + }, + { + "blockNo": 5228000, + "hash": "6974affcb9974adddecdda459163478ef1156db82d71a7514c600559aa56ecbf" + }, + { + "blockNo": 5230000, + "hash": "b1a021ca84b79fcf8cc87d1b427c5a93deae3ca2be533ce0191d12742dd093d8" + }, + { + "blockNo": 5232000, + "hash": "2db3505520622ec8f668a6234262382780ac07262cf966d5261afd181f2bd9af" + }, + { + "blockNo": 5234000, + "hash": "92cbb422b593fbb39fd1a4e81bde6af24bbf02ca06bee77be424c16a2b1cf8c2" + }, + { + "blockNo": 5236000, + "hash": "0006e21bb73ab3ec1b58108866186b6f4ca078b93f5fce2f216b0c2b250cfb96" + }, + { + "blockNo": 5238000, + "hash": "aeae7bcaa69b8e5be764bf588761e67cab7cca831755c73c71a4ee8b9013a431" + }, + { + "blockNo": 5240000, + "hash": "22b29cdcdb459f2cc47b3aea4076fa00ddbe0a7398712bf511ac7b3f16f5cd79" + }, + { + "blockNo": 5242000, + "hash": "cf197996b24fd1707ac847a0023de1022c5ec6a1759898666a4b5e7a798c72ec" + }, + { + "blockNo": 5244000, + "hash": "1228125e432fa4c3b62ab06975e7cce2eb2150ebf4b037e308f70a74f54b2c78" + }, + { + "blockNo": 5246000, + "hash": "cc1d78d6efbc65fe1535745eb2d854b187ffeba405f29c7e536ab825e33c2a74" + }, + { + "blockNo": 5248000, + "hash": "fd70189c19d0c1375b3c57ffc3c2db7da3bf74ad8779134b5cb7f536393387f8" + }, + { + "blockNo": 5250000, + "hash": "9d6c2f6530c1f5bbc92c935698f1f48ea008d9003e7dda897024eb2304f9067d" + }, + { + "blockNo": 5252000, + "hash": "43a71924a8eaebf87a642a4ee37fcee0a471a54dc8b6f47031c4acc243d5d1dc" + }, + { + "blockNo": 5254000, + "hash": "efe03cb67fe38709a1ea3d7a919b900ed125ec4c868d3df536046d8787a45a9f" + }, + { + "blockNo": 5256000, + "hash": "990a05e6056e392f27fc26b5fcbeadeb78acddceabac1c3d108fe88cda929044" + }, + { + "blockNo": 5258000, + "hash": "77f565ca3c179749fa9f33d433170e2fae782bc602e464bd7cf75127b8c27d80" + }, + { + "blockNo": 5260000, + "hash": "3dde92018341916b8c523d48b31aa6b64fe14b63c4dc011b3ca731d3e32eeca5" + }, + { + "blockNo": 5262000, + "hash": "4375d204b15bc819924eca54de458cc98e9668ce82546899acdfa0c1773bf820" + }, + { + "blockNo": 5264000, + "hash": "84421665ba5e3a8eeb8837904393cdb5ac1c305e8edfc994f61694b59c355da0" + }, + { + "blockNo": 5266000, + "hash": "20c9919d15c688cb492658a8d7a30a9c6168f8fa204d9e4df1f0cdb9f0a9c37d" + }, + { + "blockNo": 5268000, + "hash": "482834c2817c6db492d467e9f28eccc31049cbd072d8263d5cfb4bbc3c58c114" + }, + { + "blockNo": 5270000, + "hash": "7165a7e654afbb17da282d10fff76c19b13d8e4f3b0fd8de65495993839d14c1" + }, + { + "blockNo": 5272000, + "hash": "07926d8675ad4933ac8765d6b722609c941be6b5ca1d869e64de3b372253010e" + }, + { + "blockNo": 5274000, + "hash": "ca0ea52a2d95820e3fb4274bb5e471114c0c4dc538e42f300016de192d0ce36c" + }, + { + "blockNo": 5276000, + "hash": "fdbd7070f1e4119a9583958d94921bbd7d9fc26c4b9871d7029eb6aacc98bd3a" + }, + { + "blockNo": 5278000, + "hash": "08b16858e2a599e7abc80404d7215a9c2422761536cb5a652d20425b53eae9c9" + }, + { + "blockNo": 5280000, + "hash": "e56f7be4c745c99448394d62289423669e8e9bd566a9b2a1c01c56ae974803b4" + }, + { + "blockNo": 5282000, + "hash": "49757b362a15b5baa30edda26e6b39141aa95550c19c090f4fd61c08063cb903" + }, + { + "blockNo": 5284000, + "hash": "2ece489361711d22cf1088bbd94bffc72a07f3a310309b136cedd49bea42fe21" + }, + { + "blockNo": 5286000, + "hash": "2a6df9816e3b1f852239beb99d733dc0effb120002ce7aa2f562475c6055b15a" + }, + { + "blockNo": 5288000, + "hash": "4269f3caa0e9fab042162689673365a8905f04fc57491a8aa93a1f687b029a85" + }, + { + "blockNo": 5290000, + "hash": "ee2ab3bacefb3046245b192516ee344103b559d98bb57d094a459e14bddfecb0" + }, + { + "blockNo": 5292000, + "hash": "325917a0d674caa28cdb2f59c2b789f85c61e2ef2c8443a2670e4f2d8e83203c" + }, + { + "blockNo": 5294000, + "hash": "ed6d1fdfd843e71ee7109781cd365c061c306785eead59c90a8b681b9b563a64" + }, + { + "blockNo": 5296000, + "hash": "19758d545371f60792ebe6ec2481ba092354f4cd5fc994da46fd5b5775163b52" + }, + { + "blockNo": 5298000, + "hash": "bab5afe55500b0f614efbfa7238a24b035bd1a682071dbeb3af4c12178792e8c" + }, + { + "blockNo": 5300000, + "hash": "68197462c26e1799c2888b5f290f3e0855cf1ab8adb7648cc39f25c4f5d04473" + }, + { + "blockNo": 5302000, + "hash": "65e3713bf0f80271fdadae9b655deb199211f033bf604cbe246b59724d290cae" + }, + { + "blockNo": 5304000, + "hash": "0e7716a83f00ab5c55fda2a49f4438a5265aa3385f0b36bbe145739e829bda25" + }, + { + "blockNo": 5306000, + "hash": "a22799aca2d08e74c3b663b34565980be74fde8b59d33273e6b12d63e2cc3d9a" + }, + { + "blockNo": 5308000, + "hash": "92fe6ed039e44bdfb6614d849aa7c2afb7e07ebb773e6ba2556cac2d510939ab" + }, + { + "blockNo": 5310000, + "hash": "64b49f76a45016e286d5d4081c1f001876aef2dc418f84859e947e9061fceb73" + }, + { + "blockNo": 5312000, + "hash": "7b1ff901458523ccc90a1114a3fc9b78a0a4869fc338603ff59d3ecf5ab56e46" + }, + { + "blockNo": 5314000, + "hash": "15edc684e396eed4d843cba87ba355d3c127e321ab422197296e1c7a8f98d2ea" + }, + { + "blockNo": 5316000, + "hash": "94e391f2e7c21b824b45c78b2b247b34423df968bd7acd8f7f5dcda6e02b1176" + }, + { + "blockNo": 5318000, + "hash": "cf23af0f5c6855ab1f9d6930b31938b6b9af0cd7859e0ac1f432a081fca2bc38" + }, + { + "blockNo": 5320000, + "hash": "5192aa448b162be8998a1284c03aeb2e41b1010e5d10953af33927110d5cd2df" + }, + { + "blockNo": 5322000, + "hash": "583df5a7dfb406027b03d9e1614af79aeb88c728f91bf2c01be1ce9cc6b7daaa" + }, + { + "blockNo": 5324000, + "hash": "eeafd6a1b90aec35e83238d6510cc98d441b2ec2c6ea6d6bec6ab96118c44ace" + }, + { + "blockNo": 5326000, + "hash": "be7317cb9165c369c46bc843bd44b1d39e1326bf18827194744a90e131e7afd0" + }, + { + "blockNo": 5328000, + "hash": "485e3fb0cb215f976737cd49aed6d761a947a962c1752bbe302107597e02cd1b" + }, + { + "blockNo": 5330000, + "hash": "3afa1f0e1180f80348e31479d67996d6935196fc4e6b68d4d266325b214bf0d9" + }, + { + "blockNo": 5332000, + "hash": "1d37fca5bd103f5dd34483023781e035a2630ccf980258f9a44442bbeddeb331" + }, + { + "blockNo": 5334000, + "hash": "f969e3b0dd65860529ea19ba6df6422b78734b95650c5cf22e4af06c583d2871" + }, + { + "blockNo": 5336000, + "hash": "429d2f62704d88c793c9b08430db5fc020d0a497d91a1bf57f5ad2a27f13e77c" + }, + { + "blockNo": 5338000, + "hash": "7588c8b3ca7ea83adf097ee6c08a6ea3774409b278f36155d38f97210021d66e" + }, + { + "blockNo": 5340000, + "hash": "40247ac769e1f5e425105f4a04e019f49b54ad3f059bf6837d952a3059dc65e3" + }, + { + "blockNo": 5342000, + "hash": "f4fd69cb270b9469a0d731d18582fad1d3a1fb1084180540dff098e3fd0659c0" + }, + { + "blockNo": 5344000, + "hash": "93ca88984514e5e70b22b5425cc95111050abc778fc6b793387dd808cf6db7c8" + }, + { + "blockNo": 5346000, + "hash": "c2bb179dd5226da9017316b71552c8511ff1c3a277cf4142c96c71d6fc0dab1a" + }, + { + "blockNo": 5348000, + "hash": "5cb33b67af0da048924ce689f486854eec80aa9b5b0a3c72fa0b2dbbe5018b35" + }, + { + "blockNo": 5350000, + "hash": "0df388e553257f33902511592396ab1d15b14d372c18f6cbe7b09cc2323b19cd" + }, + { + "blockNo": 5352000, + "hash": "fa207ec553003bc748a77263bb061b5cc7a667f7794a089ea2a22a8631eb841a" + }, + { + "blockNo": 5354000, + "hash": "f9e56e6556209563fc8730097560a2dce8bbfe520766a98dfce7f3d1f97da411" + }, + { + "blockNo": 5356000, + "hash": "586ac41946fef9acf3b212722f4d446a0115aa9ce196e5447c72eb9f4104829b" + }, + { + "blockNo": 5358000, + "hash": "8a3673682aebecdf0acc55bfc091791b29e222b1849c4565c9302f6ed8b41a20" + }, + { + "blockNo": 5360000, + "hash": "85b76015cf6c0e701de6f008690caf270b53fd78c6472a42fa796753ea125345" + }, + { + "blockNo": 5362000, + "hash": "445a257f29318d60c5871085c11baab0e6b9ffd8fa6425328db7581993225c1b" + }, + { + "blockNo": 5364000, + "hash": "41235dea27762a303a6f44b658a125464990f859f106bdb9c981fa073d24c65f" + }, + { + "blockNo": 5366000, + "hash": "0e33bb07162e10878203a774824806b9c6ad38d8a6e61a32b61c7c363ae2483f" + }, + { + "blockNo": 5368000, + "hash": "4ab1a1eec22e8359150066690af12cda720ebd7fc059402f08ee6416d2866bed" + }, + { + "blockNo": 5370000, + "hash": "d00d0c8e807b0c00386f768e880e5f4fa71569525533887103dbb54fb9c316a1" + }, + { + "blockNo": 5372000, + "hash": "7914cf09c65ef87298fe06aeb4e8e01a4362bbb3b73b227dde7c587e757d1cd2" + }, + { + "blockNo": 5374000, + "hash": "5b580658c8b1b3a775eb6adaa047c014840553a60fa784826291ea9eb207fbd4" + }, + { + "blockNo": 5376000, + "hash": "f492e900aa3ca9f61eaab0fb4a59375aa48c87995d9cb41dfaa743456047ead0" + }, + { + "blockNo": 5378000, + "hash": "426c1ab228c6662eed44941876a4269ec91f3e3009b328c68a845c49a7b54675" + }, + { + "blockNo": 5380000, + "hash": "e5cda6d5287acbddcede872565b89ca08a53b7146dc459f90ca56c254ad91576" + }, + { + "blockNo": 5382000, + "hash": "23178dc7e2653a116b43ed3c53cf563c9e7c21f24eda18802ad78b576e97df93" + }, + { + "blockNo": 5384000, + "hash": "45b5eb3800ff75d4bf6dc5d63c9d7a525a71ef1def99950d1c6f22b9362c82b4" + }, + { + "blockNo": 5386000, + "hash": "966f74e719409482e682616cdace0dcec10ee5140c9b99dd37d26cbc6c768119" + }, + { + "blockNo": 5388000, + "hash": "38ac136b62955a6c22c9ed5b9a2f14529ebf394169bde90172f9103b6329c965" + }, + { + "blockNo": 5390000, + "hash": "a7f64e269b72e3c21f2ca478663bbb9ca41f875572a602c536c2f2198e03d9d8" + }, + { + "blockNo": 5392000, + "hash": "9a0e132dc197ed04b7e64c5a360bdbf1e2b012dd223960e52f7635c5aa404c70" + }, + { + "blockNo": 5394000, + "hash": "4c486172952fa32b1e39d973b9c6bb45e50cdac6e172305b6da94d9155508092" + }, + { + "blockNo": 5396000, + "hash": "00a93caf95f5945c88c0b9d9c2daae98b8997ab3536c4f5fc0deada31c686591" + }, + { + "blockNo": 5398000, + "hash": "eda918dcbea7a5fef2c5362d39b83326842d40264bb9193a1d8842c7e01dbd0e" + }, + { + "blockNo": 5400000, + "hash": "aac8f992c269e7acbd08fcc3821b3b6ca69bf3a5985c2612ee558acf9576f864" + }, + { + "blockNo": 5402000, + "hash": "fb8cec470d203ccafa759d528e160470dd295b40d86939f8f222649b183580e2" + }, + { + "blockNo": 5404000, + "hash": "43a5adda73257d744abdf6c61f3d4ae162ac3c0d0d5b92ee107efcbc0ec8b7ff" + }, + { + "blockNo": 5406000, + "hash": "5ae41d909fb33fb3811e858f505eca22d32b93a0936edfb47972cdbb97ccbaf7" + }, + { + "blockNo": 5408000, + "hash": "85820852dc06634fe5dc32bc20bd7eaddad082e800f5e840425bbd7fc21a5618" + }, + { + "blockNo": 5410000, + "hash": "d9473c2fa15eb386cfcf5103c4f1f5554c0bf03c50dc0652394f3c433cbb2a3e" + }, + { + "blockNo": 5412000, + "hash": "d32fa72011261c4e28cb358cfb2bd0b095f5330b416ce36ee621d961e6469f3f" + }, + { + "blockNo": 5414000, + "hash": "863570a6018f48d690e85f4e629604fbfcb37331804730ecb8986cb3a53c0057" + }, + { + "blockNo": 5416000, + "hash": "90ec5e5b67557db0631af8fbf547fcd0680638577915ba3d9b3a5ac7387ca0a2" + }, + { + "blockNo": 5418000, + "hash": "4b851da386291ffd2a7055f51ec1dc44a2af9af702956a301d630f1fbe340359" + }, + { + "blockNo": 5420000, + "hash": "0c565a8dc0c140304fd96ad83d5aacd6e2070913db6bd1f1e920bbe830a8cc29" + }, + { + "blockNo": 5422000, + "hash": "574ae09a268f8d179e616eccbf0a27e0942d79f4bb3772dd528fd90ba7030e35" + }, + { + "blockNo": 5424000, + "hash": "21dd65387e017668ff7819c6f0f0eb307847149c849d5054a7e0bc572c96cab6" + }, + { + "blockNo": 5426000, + "hash": "8c27f60f2000f561cab8eb25eb3237e93a79c340951fc927b2ef0f1a700c2ab9" + }, + { + "blockNo": 5428000, + "hash": "7c6d2132ee4c841af4fb6b278300754476c1d8c53cfdf32aada7f23f5a0fe95d" + }, + { + "blockNo": 5430000, + "hash": "dad9dd44cf15ebc4418b8ca5ed17c8c161b56aba88db28f06a11b759a53f0420" + }, + { + "blockNo": 5432000, + "hash": "ffd797a1d21b542019f7d83eb099abef1993031326c97fc9c29bcac6b429379f" + }, + { + "blockNo": 5434000, + "hash": "e174542836896f2311f2d4563a513ec4a262f52643eba367981bb63045814261" + }, + { + "blockNo": 5436000, + "hash": "12c47b8cbdce58fd5325c9cb9131178bd4214fdb16d0ef5794bd939bf4fc6620" + }, + { + "blockNo": 5438000, + "hash": "d5bd8e82e3c3372c458f789dada50c22c1b52d65c6c01eaed6a456102da77ee3" + }, + { + "blockNo": 5440000, + "hash": "cdcb2ad3b4213df24a80da164874b792a9e2c82c0eee42c2b3dbde105476d1c2" + }, + { + "blockNo": 5442000, + "hash": "0c193fbf408c1f317f1380d1c41d101706052b320d7027ec852067883e53a941" + }, + { + "blockNo": 5444000, + "hash": "f311bba886ec56b66c21b969500b4417cbcb3ba12ac4e2eb8a53e6c822d16df6" + }, + { + "blockNo": 5446000, + "hash": "5103d897032e650097ad371e60b409a9a6c426cd2b18da4318df7ad5586fa99e" + }, + { + "blockNo": 5448000, + "hash": "a4f77f1052587786e441490c04a162259a4f0a5d54945e64246f8d9b07c8ee3b" + }, + { + "blockNo": 5450000, + "hash": "67a2730d9351252422382b697c1bd2dbdf765231014777c453928c72d4422910" + }, + { + "blockNo": 5452000, + "hash": "18537cd611c621103a0f40fcc14573e388d51d995f1ecc7295af2c85b13a893a" + }, + { + "blockNo": 5454000, + "hash": "824b54292959c9f226cb6043156a645a6f5d7c2b715d4a4b209b7762d0113296" + }, + { + "blockNo": 5456000, + "hash": "50085f6514ba31672c65e569144f89377d28446117fb08bbbb7e903bfd5be514" + }, + { + "blockNo": 5458000, + "hash": "66148acd8f0202242447256d852c35fd0494899d4ad60fca709584da2caa17bf" + }, + { + "blockNo": 5460000, + "hash": "97a2b46aa10fad696ea3ffd7c6dc82c5d8ab51ca781bb9a24ae0e3cc1c82c06a" + }, + { + "blockNo": 5462000, + "hash": "67bfae1b419b512fcbca17b992d551ee743d0bec05e68c9485d8c8816a051f4a" + }, + { + "blockNo": 5464000, + "hash": "fd76a5aad46f8d47176e8dcd0fd18bbf44dc4fa1c32c270a563bc134a07d5d75" + }, + { + "blockNo": 5466000, + "hash": "613060056281746885007f676190b47486c94621c20566953d49f64c3053adcc" + }, + { + "blockNo": 5468000, + "hash": "194f22e05651957abbec7588a97fc9c193bc9faac110c64050bf86b3682f7110" + }, + { + "blockNo": 5470000, + "hash": "9b4d8fc43d5af7783b9d3cd397fbbfe6bdb66784424df3d6af63d5881499b5a9" + }, + { + "blockNo": 5472000, + "hash": "6755e676afed9bb1064b88c8c0995732a294515fee7f30019d0898df890a1dc4" + }, + { + "blockNo": 5474000, + "hash": "20984a2613c7294483cceff1065af05787487b74e2dfd7150b0cd49dc17fe949" + }, + { + "blockNo": 5476000, + "hash": "fcf183ad5518d80d39f9c837e29834bf3b7903aaf93ea39b29343871397495c6" + }, + { + "blockNo": 5478000, + "hash": "6924662c1d05650c55254909dc70c2a3b7d25a0ffc4cb1003d3a320af7cb75e7" + }, + { + "blockNo": 5480000, + "hash": "f46adf6fc3eb79fab12d7edec178cc85712c6d850623cc38b725866ce4fbf18b" + }, + { + "blockNo": 5482000, + "hash": "e92bf22a17273c04a239646987670684f37383ab2ebb4905f2448560faf8432b" + }, + { + "blockNo": 5484000, + "hash": "1b926a98b304a9e4907f8480e6593d9717308d102e9f6bf435995c43438ce947" + }, + { + "blockNo": 5486000, + "hash": "152f027803c6c0f4dca98313adaf5dcb53047a0372be0f0150f78dc18b8dc7be" + }, + { + "blockNo": 5488000, + "hash": "6a46654e22fbec526bc5018412a4cab61ad7c01cbde33f8f498e19f0899b34f2" + }, + { + "blockNo": 5490000, + "hash": "3a91c1dd1d37a80af8949345ef1b6e2d781fadfebcf35ff1aff098da885a7983" + }, + { + "blockNo": 5492000, + "hash": "d59c41fe964842ed71eacffd57990d68f0623f2665d7eaad1bc270ec09988190" + }, + { + "blockNo": 5494000, + "hash": "be30445b5363b6aa777f9cbef1a9fa42309ac4d9635149836c892f4007c2276a" + }, + { + "blockNo": 5496000, + "hash": "4c8b2cffe59cced691f9c913eb782cfb7d496fb989ea71c97682da37ded81278" + }, + { + "blockNo": 5498000, + "hash": "0baa8e308efcee66821798b2673638ea4744c0b3990f86c5879d237ec059dfef" + }, + { + "blockNo": 5500000, + "hash": "8b01f8b9daaa23e0dedbb9e20b514a11a5bd0f034b023fcb3e834368431dddf6" + }, + { + "blockNo": 5502000, + "hash": "10e8ce8fd2e4bdb596b6ebbdf6ee861d2e51dbc34ed060087f7c1e4cbe674a79" + }, + { + "blockNo": 5504000, + "hash": "f38c40f7e6a1eeb2919328d9d30fa6d8d354d307612f63fde7176b4c0d2057dd" + }, + { + "blockNo": 5506000, + "hash": "95cf4d30830db5ac79d115847f3fa09c990c163fbac92811d5da5a58ef166a2c" + }, + { + "blockNo": 5508000, + "hash": "c94f4d0c31bef65bc4d85adab395360e5f9ccad2006be800ae7636d8bb9280d3" + }, + { + "blockNo": 5510000, + "hash": "aa13480ae1cbb647390ef9b68c76fd8ae3740d98df4f67f9b25527226d13fda0" + }, + { + "blockNo": 5512000, + "hash": "439e6c1f5e9f0d97160b914cc0cac0b57752e578ecddaee11916a8c260018b9e" + }, + { + "blockNo": 5514000, + "hash": "713c3e48b9da355d4255e5e505f75f8ad2bd0de1e08c2028f216f34190ff2663" + }, + { + "blockNo": 5516000, + "hash": "398ba74332a4f17a058fa237ae56db0c66e4df164612a699a66349981ce1f7fc" + }, + { + "blockNo": 5518000, + "hash": "d0d839f8ed7a60e2269815e6147da693de8cdc9ff4e087a4fe4452e7f16f4465" + }, + { + "blockNo": 5520000, + "hash": "698167335b3e206add56df4a128919a2a5e992c59f5db153db7b69fd31fd4e7e" + }, + { + "blockNo": 5522000, + "hash": "cc3536322ae3183baf91a205345581de23d41b091de881ecb70bbfaa4bda1cf4" + }, + { + "blockNo": 5524000, + "hash": "ed23505e516dbf14af8dda42664b9e95c4cf99329d68511f840427fb05bf2ea9" + }, + { + "blockNo": 5526000, + "hash": "c00e379456642f930fdf6c9a0ebdaf92d83aa94e8cab44a1ef241f47cef40eba" + }, + { + "blockNo": 5528000, + "hash": "a4b953af301ed8afb9e7265afbd2efe87dd5e174a45b1f10bcca35f6ed5dc062" + }, + { + "blockNo": 5530000, + "hash": "bf737ce62f1d6ffe8ec56945b33fabaa93a82f887dd6c1499cb84bb3e193a2f4" + }, + { + "blockNo": 5532000, + "hash": "978c1f5f8f1f03037d4c4176db2522fd0cba35c6d8eec8d7c01ed3720ed25c50" + }, + { + "blockNo": 5534000, + "hash": "f21b827c5bf684e4f600647dcfcd741c197ab248c60b2c75ec29c4ec33ffd534" + } + ] +} diff --git a/config/mainnet/config.json b/config/mainnet/config.json index 08c9a5f7d..76c1b2bf9 100644 --- a/config/mainnet/config.json +++ b/config/mainnet/config.json @@ -3,6 +3,9 @@ "AlonzoGenesisHash": "7e94a15f55d1e82d10f09203fa1d40f8eede58fd8066542cf6566008068ed874", "ByronGenesisFile": "byron-genesis.json", "ByronGenesisHash": "5f20df933584822601f9e3f8c024eb5eb252fe8cefb24d1317dc3d432e940ebb", + "CheckpointsFile": "checkpoints.json", + "CheckpointsFileHash": "3e6dee5bae7acc6d870187e72674b37c929be8c66e62a552cf6a876b1af31ade", + "ConsensusMode": "PraosMode", "ConwayGenesisFile": "conway-genesis.json", "ConwayGenesisHash": "15a199f895e461ec0ffc6dd4e4028af28a492ab4e806d39cb674c88f7643ef62", "EnableP2P": true, @@ -10,12 +13,17 @@ "LastKnownBlockVersion-Major": 3, "LastKnownBlockVersion-Minor": 0, "MaxKnownMajorProtocolVersion": 2, - "MinNodeVersion": "10.1.4", + "MinBigLedgerPeersForTrustedState": 5, + "MinNodeVersion": "10.2.1", "PeerSharing": true, "Protocol": "Cardano", "RequiresNetworkMagic": "RequiresNoMagic", "ShelleyGenesisFile": "shelley-genesis.json", "ShelleyGenesisHash": "1a3be38bcbb7911969283716ad7aa550250226b76a61fc51cc9a9a35d9276d81", + "SyncTargetNumberOfActiveBigLedgerPeers": 30, + "SyncTargetNumberOfActivePeers": 0, + "SyncTargetNumberOfEstablishedBigLedgerPeers": 50, + "SyncTargetNumberOfKnownBigLedgerPeers": 100, "TargetNumberOfActivePeers": 20, "TargetNumberOfEstablishedPeers": 40, "TargetNumberOfKnownPeers": 150, diff --git a/config/mainnet/topology.json b/config/mainnet/topology.json index 267c34a44..e0d29cc65 100644 --- a/config/mainnet/topology.json +++ b/config/mainnet/topology.json @@ -27,5 +27,5 @@ "advertise": false } ], - "useLedgerAfterSlot": 128908821 -} + "useLedgerAfterSlot": 148350000 +} \ No newline at end of file diff --git a/config/preprod/config.json b/config/preprod/config.json index 0e91fdf6e..f60a23c4a 100644 --- a/config/preprod/config.json +++ b/config/preprod/config.json @@ -3,18 +3,24 @@ "AlonzoGenesisHash": "7e94a15f55d1e82d10f09203fa1d40f8eede58fd8066542cf6566008068ed874", "ByronGenesisFile": "byron-genesis.json", "ByronGenesisHash": "d4b8de7a11d929a323373cbab6c1a9bdc931beffff11db111cf9d57356ee1937", + "ConsensusMode": "PraosMode", "ConwayGenesisFile": "conway-genesis.json", "ConwayGenesisHash": "0eb6adaec3fcb1fe286c1b4ae0da2a117eafc3add51e17577d36dd39eddfc3db", "EnableP2P": true, "LastKnownBlockVersion-Alt": 0, "LastKnownBlockVersion-Major": 2, "LastKnownBlockVersion-Minor": 0, - "MinNodeVersion": "10.1.4", + "MinBigLedgerPeersForTrustedState": 5, + "MinNodeVersion": "10.2.1", "PeerSharing": true, "Protocol": "Cardano", "RequiresNetworkMagic": "RequiresMagic", "ShelleyGenesisFile": "shelley-genesis.json", "ShelleyGenesisHash": "162d29c4e1cf6b8a84f2d692e67a3ac6bc7851bc3e6e4afe64d15778bed8bd86", + "SyncTargetNumberOfActiveBigLedgerPeers": 30, + "SyncTargetNumberOfActivePeers": 0, + "SyncTargetNumberOfEstablishedBigLedgerPeers": 50, + "SyncTargetNumberOfKnownBigLedgerPeers": 100, "TargetNumberOfActivePeers": 20, "TargetNumberOfEstablishedPeers": 40, "TargetNumberOfKnownPeers": 150, diff --git a/config/preprod/topology.json b/config/preprod/topology.json index 2241cbcb9..0a47930da 100644 --- a/config/preprod/topology.json +++ b/config/preprod/topology.json @@ -19,5 +19,5 @@ "advertise": false } ], - "useLedgerAfterSlot": 64454371 -} + "useLedgerAfterSlot": 83894000 +} \ No newline at end of file diff --git a/config/sanchonet/alonzo-genesis.json b/config/sanchonet/alonzo-genesis.json deleted file mode 100644 index de05d3d9e..000000000 --- a/config/sanchonet/alonzo-genesis.json +++ /dev/null @@ -1,188 +0,0 @@ -{ - "collateralPercentage": 150, - "costModels": { - "PlutusV1": [ - 197209, - 0, - 1, - 1, - 396231, - 621, - 0, - 1, - 150000, - 1000, - 0, - 1, - 150000, - 32, - 2477736, - 29175, - 4, - 29773, - 100, - 29773, - 100, - 29773, - 100, - 29773, - 100, - 29773, - 100, - 29773, - 100, - 100, - 100, - 29773, - 100, - 150000, - 32, - 150000, - 32, - 150000, - 32, - 150000, - 1000, - 0, - 1, - 150000, - 32, - 150000, - 1000, - 0, - 8, - 148000, - 425507, - 118, - 0, - 1, - 1, - 150000, - 1000, - 0, - 8, - 150000, - 112536, - 247, - 1, - 150000, - 10000, - 1, - 136542, - 1326, - 1, - 1000, - 150000, - 1000, - 1, - 150000, - 32, - 150000, - 32, - 150000, - 32, - 1, - 1, - 150000, - 1, - 150000, - 4, - 103599, - 248, - 1, - 103599, - 248, - 1, - 145276, - 1366, - 1, - 179690, - 497, - 1, - 150000, - 32, - 150000, - 32, - 150000, - 32, - 150000, - 32, - 150000, - 32, - 150000, - 32, - 148000, - 425507, - 118, - 0, - 1, - 1, - 61516, - 11218, - 0, - 1, - 150000, - 32, - 148000, - 425507, - 118, - 0, - 1, - 1, - 148000, - 425507, - 118, - 0, - 1, - 1, - 2477736, - 29175, - 4, - 0, - 82363, - 4, - 150000, - 5000, - 0, - 1, - 150000, - 32, - 197209, - 0, - 1, - 1, - 150000, - 32, - 150000, - 32, - 150000, - 32, - 150000, - 32, - 150000, - 32, - 150000, - 32, - 150000, - 32, - 3345831, - 1, - 1 - ] - }, - "executionPrices": { - "prMem": 5.77e-2, - "prSteps": 7.21e-5 - }, - "lovelacePerUTxOWord": 34482, - "maxBlockExUnits": { - "exUnitsMem": 50000000, - "exUnitsSteps": 40000000000 - }, - "maxCollateralInputs": 3, - "maxTxExUnits": { - "exUnitsMem": 10000000, - "exUnitsSteps": 10000000000 - }, - "maxValueSize": 5000 -} \ No newline at end of file diff --git a/config/sanchonet/byron-genesis.json b/config/sanchonet/byron-genesis.json deleted file mode 100644 index f0c29c655..000000000 --- a/config/sanchonet/byron-genesis.json +++ /dev/null @@ -1,62 +0,0 @@ -{ - "avvmDistr": {}, - "blockVersionData": { - "heavyDelThd": "300000000000", - "maxBlockSize": "2000000", - "maxHeaderSize": "2000000", - "maxProposalSize": "700", - "maxTxSize": "4096", - "mpcThd": "20000000000000", - "scriptVersion": 0, - "slotDuration": "20000", - "softforkRule": { - "initThd": "900000000000000", - "minThd": "600000000000000", - "thdDecrement": "50000000000000" - }, - "txFeePolicy": { - "multiplier": "43946000000", - "summand": "155381000000000" - }, - "unlockStakeEpoch": "18446744073709551615", - "updateImplicit": "10000", - "updateProposalThd": "100000000000000", - "updateVoteThd": "1000000000000" - }, - "bootStakeholders": { - "318488dc356f6034104804b2cb6a2dcc055202491386fb0d5af7c3ba": 1, - "3a3c2ffaf066c8f211a1bdfd844f767ac453b1d94915e725c5867467": 1, - "3ae8eabb4e0626cea0ba38d8303d59514dae9c307d93bad3d259e4a9": 1 - }, - "heavyDelegation": { - "318488dc356f6034104804b2cb6a2dcc055202491386fb0d5af7c3ba": { - "cert": "b80e06679023284236df3464dc6aab3f56f23cb721d5943c59632ac77004f76ae415b6d291606c7194509e1fefa0c8341eed269bd0e0e1433302b00912a4230c", - "delegatePk": "9ELoyHN4GVtXrFzAJZApAVjrhwftqEFVoDXl9ebtTwpe/lG4b5ZkgH3DqwHE1hNJFRsnYs4zYzMmdbnoR7lfUA==", - "issuerPk": "MHFL9SqIV6KuXSAvp08jHBRtHwNsDJMsCxbmXLorSbfLAORg7waqVL8NEaKU3Lb0FBIX5sHVC21i1M/c0jrnlA==", - "omega": 0 - }, - "3a3c2ffaf066c8f211a1bdfd844f767ac453b1d94915e725c5867467": { - "cert": "ce91b8e35b67de2236fa79b353d1c4ebd97ad4b4cc89056a1acfc217ece8e91fbffc4bf44604a96a1064c9997f6cd39b81284aadfac752056eafc6b5996a6509", - "delegatePk": "Grpf6iTqd9aWc3QWvfthNv2l8Pp0X2tKpoIoPn0+Dy1+ow60UTu9i1j4KPjp1uzrnM4JoUcmkCGF507fPagO8w==", - "issuerPk": "1FPA7qSOPVDlNZoQAuoB2dnm+tKI5td6+BO5sJ2rswVxuS6S6sjBFVfVz/VXfKTcEt/AKyffgzWXAtPCnhC1jw==", - "omega": 0 - }, - "3ae8eabb4e0626cea0ba38d8303d59514dae9c307d93bad3d259e4a9": { - "cert": "908dd25262598050d60cb24928a7059fea3726a1dd7764645edab654d3b4e37ba69acd4841454f70f0f643305ede0ef66dc0ea9747a2387da05d2af77963f30a", - "delegatePk": "1zYduiReianx6HJHgQqtira7XY6M/Ol4tFj/O7TzTLcNfgazJm8pq5y6HAANwl91iL1pDZuIgFjzI+2i1Z6y2Q==", - "issuerPk": "Pgj3IyTJDyxr+t5fcMuM3aPtyNCxOo4T9sr78BNbgWBGwlTGo0P6UtzNLyqloLsH8V6Lv6kYMdWELAiEyfCpkw==", - "omega": 0 - } - }, - "nonAvvmBalances": { - "FHnt4NL7yPXqn7xha3WB99wYLxAc1FhceD3D1pQWaCthk9RYB46aGb6Tbq2KxV5": "0", - "FHnt4NL7yPXwj8m191s48v1RZtQqA2sVHpamzStuXTuAnzYUSR6hRPqhYmW3MY4": "0", - "FHnt4NL7yPXzVZ5xexcb7rWqCYWuFU7y6Pp4tLTiv6txhDcpQ2m7AFGMirsi1F1": "30000000000000000", - "FHnt4NL7yPY27r794z4UiYJ3RwezucDRLX94Pzy6mYPNUNWboB71S9xUm2WEDrv": "0" - }, - "protocolConsts": { - "k": 432, - "protocolMagic": 4 - }, - "startTime": 1686789000 -} diff --git a/config/sanchonet/config.json b/config/sanchonet/config.json deleted file mode 100644 index 85946eb5a..000000000 --- a/config/sanchonet/config.json +++ /dev/null @@ -1,114 +0,0 @@ -{ - "AlonzoGenesisFile": "alonzo-genesis.json", - "AlonzoGenesisHash": "8bedcaea62107d8a79ed5293b0027b3f8706a4bc2422f33380cb1fd01c6fa6ec", - "ByronGenesisFile": "byron-genesis.json", - "ByronGenesisHash": "785eb88427e136378a15b0a152a8bfbeec7a611529ccda29c43a1e60ffb48eaa", - "ConwayGenesisFile": "conway-genesis.json", - "ConwayGenesisHash": "ff31343b814adddfdcaceb76f635647e2b7d1adfc0ddac7c40b70cbdcd82fed9", - "EnableP2P": true, - "ExperimentalHardForksEnabled": true, - "ExperimentalProtocolsEnabled": true, - "LastKnownBlockVersion-Alt": 0, - "LastKnownBlockVersion-Major": 3, - "LastKnownBlockVersion-Minor": 1, - "MinNodeVersion": "10.0.0", - "PeerSharing": true, - "Protocol": "Cardano", - "RequiresNetworkMagic": "RequiresMagic", - "ShelleyGenesisFile": "shelley-genesis.json", - "ShelleyGenesisHash": "f94457ec45a0c6773057a529533cf7ccf746cb44dabd56ae970e1dbfb55bfdb2", - "TargetNumberOfActivePeers": 20, - "TargetNumberOfEstablishedPeers": 50, - "TargetNumberOfKnownPeers": 150, - "TargetNumberOfRootPeers": 60, - "TestAllegraHardForkAtEpoch": 0, - "TestAlonzoHardForkAtEpoch": 0, - "TestMaryHardForkAtEpoch": 0, - "TestShelleyHardForkAtEpoch": 0, - "TraceAcceptPolicy": true, - "TraceBlockFetchClient": false, - "TraceBlockFetchDecisions": false, - "TraceBlockFetchProtocol": false, - "TraceBlockFetchProtocolSerialised": false, - "TraceBlockFetchServer": false, - "TraceChainDb": true, - "TraceChainSyncBlockServer": false, - "TraceChainSyncClient": false, - "TraceChainSyncHeaderServer": false, - "TraceChainSyncProtocol": false, - "TraceConnectionManager": true, - "TraceDNSResolver": true, - "TraceDNSSubscription": true, - "TraceDiffusionInitialization": true, - "TraceErrorPolicy": true, - "TraceForge": true, - "TraceHandshake": true, - "TraceInboundGovernor": true, - "TraceIpSubscription": true, - "TraceLedgerPeers": true, - "TraceLocalChainSyncProtocol": false, - "TraceLocalConnectionManager": true, - "TraceLocalErrorPolicy": true, - "TraceLocalHandshake": true, - "TraceLocalRootPeers": true, - "TraceLocalTxSubmissionProtocol": false, - "TraceLocalTxSubmissionServer": false, - "TraceMempool": true, - "TraceMux": false, - "TracePeerSelection": true, - "TracePeerSelectionActions": true, - "TracePublicRootPeers": true, - "TraceServer": true, - "TraceTxInbound": false, - "TraceTxOutbound": false, - "TraceTxSubmissionProtocol": false, - "TracingVerbosity": "NormalVerbosity", - "TurnOnLogMetrics": true, - "TurnOnLogging": true, - "defaultBackends": [ - "KatipBK" - ], - "defaultScribes": [ - [ - "StdoutSK", - "stdout" - ] - ], - "hasEKG": 12788, - "hasPrometheus": [ - "127.0.0.1", - 12798 - ], - "minSeverity": "Info", - "options": { - "mapBackends": { - "cardano.node.metrics": [ - "EKGViewBK" - ], - "cardano.node.resources": [ - "EKGViewBK" - ] - }, - "mapSubtrace": { - "cardano.node.metrics": { - "subtrace": "Neutral" - } - } - }, - "rotation": { - "rpKeepFilesNum": 10, - "rpLogLimitBytes": 5000000, - "rpMaxAgeHours": 24 - }, - "setupBackends": [ - "KatipBK" - ], - "setupScribes": [ - { - "scFormat": "ScText", - "scKind": "StdoutSK", - "scName": "stdout", - "scRotation": null - } - ] -} diff --git a/config/sanchonet/conway-genesis.json b/config/sanchonet/conway-genesis.json deleted file mode 100644 index ea67c6b48..000000000 --- a/config/sanchonet/conway-genesis.json +++ /dev/null @@ -1,297 +0,0 @@ -{ - "poolVotingThresholds": { - "committeeNormal": 0.51, - "committeeNoConfidence": 0.51, - "hardForkInitiation": 0.51, - "motionNoConfidence": 0.51, - "ppSecurityGroup": 0.51 - }, - "dRepVotingThresholds": { - "motionNoConfidence": 0.67, - "committeeNormal": 0.67, - "committeeNoConfidence": 0.6, - "updateToConstitution": 0.75, - "hardForkInitiation": 0.6, - "ppNetworkGroup": 0.67, - "ppEconomicGroup": 0.67, - "ppTechnicalGroup": 0.67, - "ppGovGroup": 0.75, - "treasuryWithdrawal": 0.67 - }, - "committeeMinSize": 0, - "committeeMaxTermLength": 1000, - "govActionLifetime": 60, - "govActionDeposit": 100000000000, - "dRepDeposit": 500000000, - "dRepActivity": 20, - "minFeeRefScriptCostPerByte": 15, - "plutusV3CostModel": [ - 100788, - 420, - 1, - 1, - 1000, - 173, - 0, - 1, - 1000, - 59957, - 4, - 1, - 11183, - 32, - 201305, - 8356, - 4, - 16000, - 100, - 16000, - 100, - 16000, - 100, - 16000, - 100, - 16000, - 100, - 16000, - 100, - 100, - 100, - 16000, - 100, - 94375, - 32, - 132994, - 32, - 61462, - 4, - 72010, - 178, - 0, - 1, - 22151, - 32, - 91189, - 769, - 4, - 2, - 85848, - 123203, - 7305, - -900, - 1716, - 549, - 57, - 85848, - 0, - 1, - 1, - 1000, - 42921, - 4, - 2, - 24548, - 29498, - 38, - 1, - 898148, - 27279, - 1, - 51775, - 558, - 1, - 39184, - 1000, - 60594, - 1, - 141895, - 32, - 83150, - 32, - 15299, - 32, - 76049, - 1, - 13169, - 4, - 22100, - 10, - 28999, - 74, - 1, - 28999, - 74, - 1, - 43285, - 552, - 1, - 44749, - 541, - 1, - 33852, - 32, - 68246, - 32, - 72362, - 32, - 7243, - 32, - 7391, - 32, - 11546, - 32, - 85848, - 123203, - 7305, - -900, - 1716, - 549, - 57, - 85848, - 0, - 1, - 90434, - 519, - 0, - 1, - 74433, - 32, - 85848, - 123203, - 7305, - -900, - 1716, - 549, - 57, - 85848, - 0, - 1, - 1, - 85848, - 123203, - 7305, - -900, - 1716, - 549, - 57, - 85848, - 0, - 1, - 955506, - 213312, - 0, - 2, - 270652, - 22588, - 4, - 1457325, - 64566, - 4, - 20467, - 1, - 4, - 0, - 141992, - 32, - 100788, - 420, - 1, - 1, - 81663, - 32, - 59498, - 32, - 20142, - 32, - 24588, - 32, - 20744, - 32, - 25933, - 32, - 24623, - 32, - 43053543, - 10, - 53384111, - 14333, - 10, - 43574283, - 26308, - 10, - 16000, - 100, - 16000, - 100, - 962335, - 18, - 2780678, - 6, - 442008, - 1, - 52538055, - 3756, - 18, - 267929, - 18, - 76433006, - 8868, - 18, - 52948122, - 18, - 1995836, - 36, - 3227919, - 12, - 901022, - 1, - 166917843, - 4307, - 36, - 284546, - 36, - 158221314, - 26549, - 36, - 74698472, - 36, - 333849714, - 1, - 254006273, - 72, - 2174038, - 72, - 2261318, - 64571, - 4, - 207616, - 8310, - 4, - 1293828, - 28716, - 63, - 0, - 1, - 1006041, - 43623, - 251, - 0, - 1 - ], - "constitution": { - "anchor": { - "dataHash": "ca41a91f399259bcefe57f9858e91f6d00e1a38d6d9c63d4052914ea7bd70cb2", - "url": "ipfs://bafkreifnwj6zpu3ixa4siz2lndqybyc5wnnt3jkwyutci4e2tmbnj3xrdm" - }, - "script": "fa24fb305126805cf2164c161d852a0e7330cf988f1fe558cf7d4a64" - }, - "committee": { - "members": { - "keyHash-77c0a65f9302bccab35b44adc1823cb66c88a66c97cf3de8236dd718": 1000 - }, - "threshold": { - "numerator": 2, - "denominator": 3 - } - } -} diff --git a/config/sanchonet/shelley-genesis.json b/config/sanchonet/shelley-genesis.json deleted file mode 100644 index 544585999..000000000 --- a/config/sanchonet/shelley-genesis.json +++ /dev/null @@ -1,56 +0,0 @@ -{ - "activeSlotsCoeff": 5.0e-2, - "epochLength": 86400, - "genDelegs": { - "c1ad22cabb342cbb83ce3859708232f4945ccb669e9b5f932cffc0ed": { - "delegate": "405357b552c397e81f73dcb5a0da0828fe29610bd25197d86130df34", - "vrf": "458215df6c07abc66e80082caa7a189dc2f4995ad4b4b5f09481a55d8d0692d2" - }, - "c264bca994a3a5deee5a1d9b92a3d7e9d6cbdb81f2f6989bb7f7b437": { - "delegate": "d9d9d0f0e1f25c4af4d80cb2d62878b611d8b3a8e1ef548d01f246d7", - "vrf": "624f1bf3b2f978e0c95644f26228b307d7acca7fc7eb3d88fb6f107e0aa1198c" - }, - "d4bf7eb45b72dffa5ac33d5c902fe409e4e611f2e9a52fb0d09784c3": { - "delegate": "806eb0c17d9b0fe6d99acbabe7be76ef72bf9de96c5b58435e50837f", - "vrf": "57e52289207a7128c29e0b7e96a02c731a961a5944329b363bed751ad8f377ee" - } - }, - "initialFunds": {}, - "maxKESEvolutions": 62, - "maxLovelaceSupply": 45000000000000000, - "networkId": "Testnet", - "networkMagic": 4, - "protocolParams": { - "a0": 0.3, - "decentralisationParam": 1.0, - "eMax": 18, - "extraEntropy": { - "tag": "NeutralNonce" - }, - "keyDeposit": 2000000, - "maxBlockBodySize": 65536, - "maxBlockHeaderSize": 1100, - "maxTxSize": 16384, - "minFeeA": 44, - "minFeeB": 155381, - "minPoolCost": 340000000, - "minUTxOValue": 1000000, - "nOpt": 150, - "poolDeposit": 500000000, - "protocolVersion": { - "major": 6, - "minor": 0 - }, - "rho": 3.0e-3, - "tau": 0.2 - }, - "securityParam": 432, - "slotLength": 1, - "slotsPerKESPeriod": 129600, - "staking": { - "pools": {}, - "stake": {} - }, - "systemStart": "2023-06-15T00:30:00Z", - "updateQuorum": 3 -} \ No newline at end of file diff --git a/config/sanchonet/topology.json b/config/sanchonet/topology.json deleted file mode 100644 index 101e1e4a6..000000000 --- a/config/sanchonet/topology.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "bootstrapPeers": [ - { - "address": "sanchonet-node.play.dev.cardano.org", - "port": 3001 - } - ], - "localRoots": [ - { - "accessPoints": [], - "advertise": false, - "trustable": false, - "valency": 1 - } - ], - "publicRoots": [ - { - "accessPoints": [], - "advertise": false - } - ], - "useLedgerAfterSlot": 33695977 -} diff --git a/docker-compose-node.yaml b/docker-compose-node.yaml index 9a343b28b..ec06db33f 100644 --- a/docker-compose-node.yaml +++ b/docker-compose-node.yaml @@ -1,6 +1,7 @@ version: '3.8' services: mithril: + image: cardanofoundation/rosetta-mithril:${MITHRIL_VERSION} build: context: ./docker/dockerfiles/mithril environment: @@ -9,22 +10,25 @@ services: - SNAPSHOT_DIGEST=${SNAPSHOT_DIGEST} - AGGREGATOR_ENDPOINT=${AGGREGATOR_ENDPOINT} - GENESIS_VERIFICATION_KEY=${GENESIS_VERIFICATION_KEY} + - ANCILLARY_VERIFICATION_KEY=${ANCILLARY_VERIFICATION_KEY} + volumes: - ${CARDANO_NODE_DIR}:/node cardano-node: image: ghcr.io/intersectmbo/cardano-node:${CARDANO_NODE_VERSION} - build: - context: ./ - dockerfile: ./docker/dockerfiles/node/Dockerfile - args: - CARDANO_NODE_VERSION: ${CARDANO_NODE_VERSION} + #image: cardano-foundation/rosetta-cardano-node:${CARDANO_NODE_VERSION} +# build: +# context: ./ +# dockerfile: ./docker/dockerfiles/node/Dockerfile +# args: +# CARDANO_NODE_VERSION: ${CARDANO_NODE_VERSION} environment: - NETWORK=${NETWORK} - - PROTOCOL_MAGIC=${PROTOCOL_MAGIC} - - CARDANO_NODE_SOCKET_PATH=${CARDANO_NODE_SOCKET_PATH} - - CARDANO_NODE_PORT=${CARDANO_NODE_PORT} - - NODE_SUBMIT_API_PORT=${NODE_SUBMIT_API_PORT} +# - PROTOCOL_MAGIC=${PROTOCOL_MAGIC} +# - CARDANO_NODE_SOCKET_PATH=${CARDANO_NODE_SOCKET_PATH} +# - CARDANO_NODE_PORT=${CARDANO_NODE_PORT} +# - NODE_SUBMIT_API_PORT=${NODE_SUBMIT_API_PORT} volumes: - ${CARDANO_NODE_DIR}:/node/ - ${CARDANO_NODE_DB}:/node/db @@ -33,6 +37,7 @@ services: ports: - ${CARDANO_NODE_PORT}:${CARDANO_NODE_PORT} - ${NODE_SUBMIT_API_PORT}:${NODE_SUBMIT_API_PORT} + entrypoint: cardano-node run --database-path /node/db --port ${CARDANO_NODE_PORT} --socket-path /node/node.socket --topology /config/topology.json --config /config/config.json depends_on: mithril: condition: service_completed_successfully diff --git a/docker/.env.dockerfile b/docker/.env.dockerfile index c15b5c110..92447101b 100644 --- a/docker/.env.dockerfile +++ b/docker/.env.dockerfile @@ -7,9 +7,9 @@ API_SPRING_PROFILES_ACTIVE=online ## Main variables LOG=INFO NETWORK=mainnet -# mainnet, preprod, preview, sanchonet, devkit +# mainnet, preprod, preview, devkit PROTOCOL_MAGIC=764824073 -# mainnet 764824073, preprod 1, preview 2, sanchonet 4, devkit 42 +# mainnet 764824073, preprod 1, preview 2, devkit 42 # Node synchronization SYNC=true @@ -33,7 +33,7 @@ DB_PORT=5432 ## Cardano node variables CARDANO_NODE_HOST=localhost CARDANO_NODE_PORT=3001 -CARDANO_NODE_VERSION=10.2.1 +CARDANO_NODE_VERSION=10.3.1 CARDANO_NODE_SUBMIT_HOST=localhost NODE_SUBMIT_API_PORT=8090 CARDANO_NODE_SOCKET_PATH=/node/node.socket diff --git a/docker/Dockerfile b/docker/Dockerfile index 27171dd69..5e87b6b98 100644 --- a/docker/Dockerfile +++ b/docker/Dockerfile @@ -29,23 +29,25 @@ RUN bash -c "curl --proto '=https' --tlsv1.2 -sSf https://get-ghcup.haskell.org ENV PATH=/root/.local/bin:/root/.ghcup/bin:/root/.cabal/bin:${PATH} -# Install cabal -ARG CABAL_VERSION=3.8.1.0 +ARG BLST_VERSION=0.3.11 +ARG LIBSODIUM_VERSION=dbb48cc +ARG SECP256K1_VERSION=ac83be33 + +ARG CABAL_VERSION=${CABAL_VERSION:-3.12.1.0} +ARG GHC_VERSION=${GHC_VERSION:-9.6.7} + +# Cardano node version +ARG CARDANO_NODE_VERSION=${CARDANO_NODE_VERSION:-10.3.1} + +ARG MITHRIL_VERSION=${MITHRIL_VERSION:-2517.1} RUN bash -c "ghcup install cabal ${CABAL_VERSION}" RUN bash -c "ghcup set cabal ${CABAL_VERSION}" -# Install GHC -ARG GHC_VERSION=8.10.7 - RUN bash -c "ghcup install ghc ${GHC_VERSION}" RUN bash -c "ghcup set ghc ${GHC_VERSION}" - -# Mithril setup -ARG MITHRIL_VERSION=2513.0 -# Install dependencies - +# Install mithril RUN curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | bash -s -- -y \ && export PATH="$HOME/.cargo/bin:$PATH" \ && apt update --fix-missing \ @@ -63,44 +65,33 @@ RUN git clone https://github.com/input-output-hk/mithril.git \ && mkdir -p /root/.local/bin \ && cp mithril-client /root/.local/bin/ -# Cardano node version -ARG CARDANO_NODE_VERSION=10.2.1 +WORKDIR /usr/local/src # Install sodium -RUN export IOHKNIX_VERSION=$(curl -L https://raw.githubusercontent.com/IntersectMBO/cardano-node/${CARDANO_NODE_VERSION}/flake.lock | jq -r '.nodes.iohkNix.locked.rev') \ - && echo "iohk-nix version: $IOHKNIX_VERSION" \ - && export SODIUM_VERSION=$(curl -L https://raw.githubusercontent.com/input-output-hk/iohk-nix/${IOHKNIX_VERSION}/flake.lock | jq -r '.nodes.sodium.original.rev') \ - && echo "Using sodium version: $SODIUM_VERSION" \ - && git clone https://github.com/intersectmbo/libsodium \ +RUN git clone --branch master https://github.com/IntersectMBO/libsodium.git \ && cd libsodium \ - && git checkout ${SODIUM_VERSION} \ + && git checkout ${LIBSODIUM_VERSION} \ && ./autogen.sh \ && ./configure \ && make \ && make check \ && make install -# Install libsodium -RUN apt install -y --no-install-recommends libsodium-dev \ - && apt-get clean +WORKDIR /usr/local/src -# Install secp256k1 -RUN export IOHKNIX_VERSION=$(curl -L https://raw.githubusercontent.com/IntersectMBO/cardano-node/${CARDANO_NODE_VERSION}/flake.lock | jq -r '.nodes.iohkNix.locked.rev') \ - && echo "iohk-nix version: ${IOHKNIX_VERSION}" \ - && export SECP256K1_VERSION=$(curl -L https://raw.githubusercontent.com/input-output-hk/iohk-nix/${IOHKNIX_VERSION}/flake.lock | jq -r '.nodes.secp256k1.original.ref') \ - && echo "Using secp256k1 version:${SECP256K1_VERSION}" \ - && git clone --depth 1 --branch ${SECP256K1_VERSION} https://github.com/bitcoin-core/secp256k1 \ +RUN git clone --branch master https://github.com/bitcoin-core/secp256k1.git \ && cd secp256k1 \ + && git checkout ${SECP256K1_VERSION} \ && ./autogen.sh \ - && ./configure --enable-module-schnorrsig --enable-experimental \ + && ./configure --prefix=/usr --enable-module-schnorrsig --enable-experimental \ && make \ && make check \ && make install # Install blst -RUN export BLST_VERSION=$(curl -L https://raw.githubusercontent.com/input-output-hk/iohk-nix/master/flake.lock | jq -r '.nodes.blst.original.ref') \ - && git clone --depth 1 --branch ${BLST_VERSION} https://github.com/supranational/blst \ +RUN git clone --branch master https://github.com/supranational/blst.git \ && cd blst \ + && git checkout v$BLST_VERSION \ && ./build.sh \ && echo "prefix=/usr/local" >> libblst.pc \ && echo "exec_prefix=\${prefix}" >> libblst.pc \ @@ -118,10 +109,9 @@ RUN export BLST_VERSION=$(curl -L https://raw.githubusercontent.com/input-output && cp libblst.a /usr/local/lib \ && bash -c "chmod u=rw,go=r /usr/local/{lib/{libblst.a,pkgconfig/libblst.pc},include/{blst.{h,hpp},blst_aux.h}}" -RUN apt install -y --no-install-recommends libsecp256k1-dev \ - && apt-get clean +WORKDIR /usr/local/src -# Install node +# Install cardano-node RUN git clone https://github.com/intersectmbo/cardano-node.git \ && cd cardano-node \ && git checkout tags/${CARDANO_NODE_VERSION} \ @@ -140,7 +130,7 @@ RUN git clone https://github.com/intersectmbo/cardano-node.git \ && ln -s /opt/homebrew/opt/openssl@3/lib /usr/local/opt/openssl/lib \ && ln -s /opt/homebrew/opt/openssl@3/include /usr/local/opt/openssl/include -WORKDIR /root/src/cardano-node +WORKDIR /usr/local/src/cardano-node RUN bash -c "cabal update" RUN bash -c "cabal build all" @@ -221,7 +211,20 @@ ENV PATH="${JAVA_HOME}/bin:${PATH}" COPY --from=cardano-builder /usr/local/lib /usr/local/lib COPY --from=cardano-builder /root/.local/bin/cardano-* /usr/local/bin/ COPY --from=cardano-builder /root/.local/bin/mithril-client /usr/local/bin/ -COPY --from=cardano-builder /root/src/cardano-node/cardano-submit-api/config/tx-submit-mainnet-config.yaml /cardano-submit-api-config/cardano-submit-api.yaml +COPY --from=cardano-builder /usr/local/src/cardano-node/cardano-submit-api/config/tx-submit-mainnet-config.yaml /cardano-submit-api-config/cardano-submit-api.yaml + +# Link libsodium library +COPY --from=cardano-builder --chown=root:root /usr/local/lib/libsodium.so /usr/local/lib +RUN ln -snf /usr/local/lib/libsodium.so /usr/local/lib/libsodium.so.23 \ + && ln -snf /usr/local/lib/libsodium.so /usr/local/lib/libsodium.so.23.3.0 +RUN ldconfig + +# Link secp256k1 library +COPY --from=cardano-builder --chown=root:root /usr/local/src/secp256k1/.libs/libsecp256k1.so /usr/local/lib +RUN ln -snf /usr/local/lib/libsecp256k1.so /usr/local/lib/libsecp256k1.so.0 \ + && ln -snf /usr/local/lib/libsecp256k1.so /usr/local/lib/libsecp256k1.so.1 \ + && ln -snf /usr/local/lib/libsecp256k1.so /usr/local/lib/libsecp256k1.so.1.0.1 +RUN ldconfig ENV LD_LIBRARY_PATH=/usr/local/lib ENV PATH=/usr/local/lib/:$PATH diff --git a/docker/dockerfiles/mithril/Dockerfile b/docker/dockerfiles/mithril/Dockerfile index 8a1ce943c..f7964ee1d 100644 --- a/docker/dockerfiles/mithril/Dockerfile +++ b/docker/dockerfiles/mithril/Dockerfile @@ -9,7 +9,7 @@ RUN apt update --fix-missing \ && apt-get clean # Mithril setup -ARG MITHRIL_VERSION=2513.0 +ARG MITHRIL_VERSION=2517.1 # Install dependencies RUN curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | bash -s -- -y \ diff --git a/docker/dockerfiles/mithril/entrypoint.sh b/docker/dockerfiles/mithril/entrypoint.sh index 82fbb8ccf..344708852 100644 --- a/docker/dockerfiles/mithril/entrypoint.sh +++ b/docker/dockerfiles/mithril/entrypoint.sh @@ -7,27 +7,27 @@ download_mithril_snapshot() { mainnet) AGGREGATOR_ENDPOINT=${AGGREGATOR_ENDPOINT:-https://aggregator.release-mainnet.api.mithril.network/aggregator} GENESIS_VERIFICATION_KEY=${GENESIS_VERIFICATION_KEY:-$(wget -q -O - https://raw.githubusercontent.com/input-output-hk/mithril/main/mithril-infra/configuration/release-mainnet/genesis.vkey)} + ANCILLARY_VERIFICATION_KEY=${ANCILLARY_VERIFICATION_KEY:-$(wget -q -O - https://raw.githubusercontent.com/input-output-hk/mithril/main/mithril-infra/configuration/release-mainnet/ancillary.vkey)} ;; preprod) AGGREGATOR_ENDPOINT=${AGGREGATOR_ENDPOINT:-https://aggregator.release-preprod.api.mithril.network/aggregator} GENESIS_VERIFICATION_KEY=${GENESIS_VERIFICATION_KEY:-$(wget -q -O - https://raw.githubusercontent.com/input-output-hk/mithril/main/mithril-infra/configuration/release-preprod/genesis.vkey)} + ANCILLARY_VERIFICATION_KEY=${ANCILLARY_VERIFICATION_KEY:-$(wget -q -O - https://raw.githubusercontent.com/input-output-hk/mithril/main/mithril-infra/configuration/release-preprod/ancillary.vkey)} ;; preview) AGGREGATOR_ENDPOINT=${AGGREGATOR_ENDPOINT:-https://aggregator.pre-release-preview.api.mithril.network/aggregator} GENESIS_VERIFICATION_KEY=${GENESIS_VERIFICATION_KEY:-$(wget -q -O - https://raw.githubusercontent.com/input-output-hk/mithril/main/mithril-infra/configuration/pre-release-preview/genesis.vkey)} - ;; - sanchonet) - AGGREGATOR_ENDPOINT=${AGGREGATOR_ENDPOINT:-https://aggregator.testing-sanchonet.api.mithril.network/aggregator} - GENESIS_VERIFICATION_KEY=${GENESIS_VERIFICATION_KEY:-$(wget -q -O - https://raw.githubusercontent.com/input-output-hk/mithril/main/mithril-infra/configuration/testing-sanchonet/genesis.vkey)} + ANCILLARY_VERIFICATION_KEY=${ANCILLARY_VERIFICATION_KEY:-$(wget -q -O - https://raw.githubusercontent.com/input-output-hk/mithril/main/mithril-infra/configuration/pre-release-preview/ancillary.vkey)} ;; esac echo "Listing content of /node dir:" ls -la /node - mithril-client cardano-db download latest --download-dir /node & + mithril-client cardano-db download latest --include-ancillary --ancillary-verification-key $ANCILLARY_VERIFICATION_KEY --download-dir /node & MITHRIL_PID=$! wait $MITHRIL_PID echo "Done downloading Mithril Snapshot" } + echo $NETWORK if [ "${MITHRIL_SYNC}" == "true" ]; then download_mithril_snapshot diff --git a/docker/dockerfiles/node/Dockerfile b/docker/dockerfiles/node/Dockerfile index 3407f183b..4920e298e 100644 --- a/docker/dockerfiles/node/Dockerfile +++ b/docker/dockerfiles/node/Dockerfile @@ -9,63 +9,54 @@ RUN apt update --fix-missing \ g++ tmux git jq wget libncursesw5-dev libtool autoconf liblmdb-dev curl ca-certificates \ && apt-get clean - # Install ghcup ENV BOOTSTRAP_HASKELL_NONINTERACTIVE=1 RUN bash -c "curl --proto '=https' --tlsv1.2 -sSf https://get-ghcup.haskell.org | sh" ENV PATH=/root/.local/bin:/root/.ghcup/bin:/root/.cabal/bin:${PATH} -# Install cabal -ARG CABAL_VERSION=3.8.1.0 +ARG BLST_VERSION="0.3.11" +ARG LIBSODIUM_VERSION="dbb48cc" +ARG SECP256K1_VERSION="ac83be33" + +ARG CABAL_VERSION="3.12.1.0" +ARG GHC_VERSION="9.6.7" + +ARG CARDANO_NODE_VERSION=10.3.1 RUN bash -c "ghcup install cabal ${CABAL_VERSION}" RUN bash -c "ghcup set cabal ${CABAL_VERSION}" -# Install GHC -ARG GHC_VERSION=8.10.7 - RUN bash -c "ghcup install ghc ${GHC_VERSION}" RUN bash -c "ghcup set ghc ${GHC_VERSION}" -# Cardano node version -ARG CARDANO_NODE_VERSION=10.2.1 +WORKDIR /usr/local/src # Install sodium -RUN export IOHKNIX_VERSION=$(curl https://raw.githubusercontent.com/IntersectMBO/cardano-node/${CARDANO_NODE_VERSION}/flake.lock | jq -r '.nodes.iohkNix.locked.rev') \ - && echo "iohk-nix version: $IOHKNIX_VERSION" \ - && export SODIUM_VERSION=$(curl https://raw.githubusercontent.com/input-output-hk/iohk-nix/${IOHKNIX_VERSION}/flake.lock | jq -r '.nodes.sodium.original.rev') \ - && echo "Using sodium version: $SODIUM_VERSION" \ - && git clone https://github.com/intersectmbo/libsodium \ +RUN git clone --branch master https://github.com/IntersectMBO/libsodium.git \ && cd libsodium \ - && git checkout ${SODIUM_VERSION} \ + && git checkout ${LIBSODIUM_VERSION} \ && ./autogen.sh \ && ./configure \ && make \ && make check \ && make install -# Install libsodium -RUN apt install -y --no-install-recommends libsodium-dev \ - && apt-get clean +WORKDIR /usr/local/src -# Install secp256k1 -RUN export IOHKNIX_VERSION=$(curl https://raw.githubusercontent.com/IntersectMBO/cardano-node/${CARDANO_NODE_VERSION}/flake.lock | jq -r '.nodes.iohkNix.locked.rev') \ - && echo "iohk-nix version: ${IOHKNIX_VERSION}" \ - && export SECP256K1_VERSION=$(curl https://raw.githubusercontent.com/input-output-hk/iohk-nix/${IOHKNIX_VERSION}/flake.lock | jq -r '.nodes.secp256k1.original.ref') \ - && echo "Using secp256k1 version:${SECP256K1_VERSION}" \ - && git clone --depth 1 --branch ${SECP256K1_VERSION} https://github.com/bitcoin-core/secp256k1 \ +RUN git clone --branch master https://github.com/bitcoin-core/secp256k1.git \ && cd secp256k1 \ + && git checkout ${SECP256K1_VERSION} \ && ./autogen.sh \ - && ./configure --enable-module-schnorrsig --enable-experimental \ + && ./configure --prefix=/usr --enable-module-schnorrsig --enable-experimental \ && make \ && make check \ && make install # Install blst -RUN export BLST_VERSION=$(curl https://raw.githubusercontent.com/input-output-hk/iohk-nix/master/flake.lock | jq -r '.nodes.blst.original.ref') \ - && git clone --depth 1 --branch ${BLST_VERSION} https://github.com/supranational/blst \ +RUN git clone --branch master https://github.com/supranational/blst.git \ && cd blst \ + && git checkout v${BLST_VERSION} \ && ./build.sh \ && echo "prefix=/usr/local" >> libblst.pc \ && echo "exec_prefix=\${prefix}" >> libblst.pc \ @@ -81,12 +72,11 @@ RUN export BLST_VERSION=$(curl https://raw.githubusercontent.com/input-output-hk && cp libblst.pc /usr/local/lib/pkgconfig/ \ && cp bindings/blst_aux.h bindings/blst.h bindings/blst.hpp /usr/local/include/ \ && cp libblst.a /usr/local/lib \ - && bash -c "chmod u=rw,go=r /usr/local/{lib/{libblst.a,pkgconfig/libblst.pc},include/{blst.{h,hpp},blst_aux.h}}" + && bash -c "chmod u=rw,go=r /usr/local/{lib/{libblst.a,pkgconfig/libblst.pc},include/{blst.{h,hpp},blst_aux.h}}" \ -RUN apt install -y --no-install-recommends libsecp256k1-dev \ - && apt-get clean +WORKDIR /usr/local/src -# Install node +# Install cardano-node RUN git clone https://github.com/intersectmbo/cardano-node.git \ && cd cardano-node \ && git checkout tags/${CARDANO_NODE_VERSION} \ @@ -105,7 +95,7 @@ RUN git clone https://github.com/intersectmbo/cardano-node.git \ && ln -s /opt/homebrew/opt/openssl@3/lib /usr/local/opt/openssl/lib \ && ln -s /opt/homebrew/opt/openssl@3/include /usr/local/opt/openssl/include -WORKDIR /root/src/cardano-node +WORKDIR /usr/local/src/cardano-node RUN bash -c "cabal update" RUN bash -c "cabal build all" @@ -121,7 +111,20 @@ RUN mkdir -p /root/.local/bin \ FROM ubuntu:24.04 AS node-runner COPY --from=cardano-builder /usr/local/lib /usr/local/lib COPY --from=cardano-builder /root/.local/bin/cardano-* /usr/local/bin/ -COPY --from=cardano-builder /root/src/cardano-node/cardano-submit-api/config/tx-submit-mainnet-config.yaml /cardano-submit-api-config/cardano-submit-api.yaml +COPY --from=cardano-builder /usr/local/src/cardano-node/cardano-submit-api/config/tx-submit-mainnet-config.yaml /cardano-submit-api-config/cardano-submit-api.yaml + +# Link libsodium library +COPY --from=cardano-builder --chown=root:root /usr/local/lib/libsodium.so /usr/local/lib +RUN ln -snf /usr/local/lib/libsodium.so /usr/local/lib/libsodium.so.23 \ + && ln -snf /usr/local/lib/libsodium.so /usr/local/lib/libsodium.so.23.3.0 +RUN ldconfig + +# Link secp256k1 library +COPY --from=cardano-builder --chown=root:root /usr/local/src/secp256k1/.libs/libsecp256k1.so /usr/local/lib +RUN ln -snf /usr/local/lib/libsecp256k1.so /usr/local/lib/libsecp256k1.so.0 \ + && ln -snf /usr/local/lib/libsecp256k1.so /usr/local/lib/libsecp256k1.so.1 \ + && ln -snf /usr/local/lib/libsecp256k1.so /usr/local/lib/libsecp256k1.so.1.0.1 +RUN ldconfig ENV LD_LIBRARY_PATH=/usr/local/lib:$LD_LIBRARY_PATH ENV PKG_CONFIG_PATH=/usr/local/lib/pkgconfig:$PKG_CONFIG_PATH diff --git a/docker/dockerfiles/node/entrypoint.sh b/docker/dockerfiles/node/entrypoint.sh index 8799f67db..dd5f3a69c 100644 --- a/docker/dockerfiles/node/entrypoint.sh +++ b/docker/dockerfiles/node/entrypoint.sh @@ -17,9 +17,10 @@ trap clean_up SIGHUP SIGINT SIGTERM echo "Starting Cardano node..." - mkdir -p "$(dirname "$CARDANO_NODE_SOCKET_PATH")" + sleep 1 +#cardano-node run --socket-path "$CARDANO_NODE_SOCKET_PATH" --port $CARDANO_NODE_PORT --database-path "$CARDANO_NODE_DB" --config /config/config.json --topology /config/topology.json & cardano-node run --socket-path "$CARDANO_NODE_SOCKET_PATH" --port $CARDANO_NODE_PORT --database-path /node/db --config /config/config.json --topology /config/topology.json & CARDANO_NODE_PID=$! sleep 2 diff --git a/docker/entrypoint.sh b/docker/entrypoint.sh index 38ab69686..edbd6f6ce 100644 --- a/docker/entrypoint.sh +++ b/docker/entrypoint.sh @@ -184,18 +184,17 @@ download_mithril_snapshot() { mainnet) AGGREGATOR_ENDPOINT=${AGGREGATOR_ENDPOINT:-https://aggregator.release-mainnet.api.mithril.network/aggregator} GENESIS_VERIFICATION_KEY=${GENESIS_VERIFICATION_KEY:-$(wget -q -O - https://raw.githubusercontent.com/input-output-hk/mithril/main/mithril-infra/configuration/release-mainnet/genesis.vkey)} + ANCILLARY_VERIFICATION_KEY=${ANCILLARY_VERIFICATION_KEY:-$(wget -q -O - https://raw.githubusercontent.com/input-output-hk/mithril/main/mithril-infra/configuration/release-mainnet/ancillary.vkey)} ;; preprod) AGGREGATOR_ENDPOINT=${AGGREGATOR_ENDPOINT:-https://aggregator.release-preprod.api.mithril.network/aggregator} GENESIS_VERIFICATION_KEY=${GENESIS_VERIFICATION_KEY:-$(wget -q -O - https://raw.githubusercontent.com/input-output-hk/mithril/main/mithril-infra/configuration/release-preprod/genesis.vkey)} + ANCILLARY_VERIFICATION_KEY=${ANCILLARY_VERIFICATION_KEY:-$(wget -q -O - https://raw.githubusercontent.com/input-output-hk/mithril/main/mithril-infra/configuration/release-preprod/ancillary.vkey)} ;; preview) AGGREGATOR_ENDPOINT=${AGGREGATOR_ENDPOINT:-https://aggregator.pre-release-preview.api.mithril.network/aggregator} GENESIS_VERIFICATION_KEY=${GENESIS_VERIFICATION_KEY:-$(wget -q -O - https://raw.githubusercontent.com/input-output-hk/mithril/main/mithril-infra/configuration/pre-release-preview/genesis.vkey)} - ;; - sanchonet) - AGGREGATOR_ENDPOINT=${AGGREGATOR_ENDPOINT:-https://aggregator.testing-sanchonet.api.mithril.network/aggregator} - GENESIS_VERIFICATION_KEY=${GENESIS_VERIFICATION_KEY:-$(wget -q -O - https://raw.githubusercontent.com/input-output-hk/mithril/main/mithril-infra/configuration/testing-sanchonet/genesis.vkey)} + ANCILLARY_VERIFICATION_KEY=${ANCILLARY_VERIFICATION_KEY:-$(wget -q -O - https://raw.githubusercontent.com/input-output-hk/mithril/main/mithril-infra/configuration/pre-release-testing-preview/ancillary.vkey)} ;; esac echo "Listing content of /node dir:" diff --git a/docker/readme.md b/docker/readme.md index 2d422d503..7d4518d2b 100644 --- a/docker/readme.md +++ b/docker/readme.md @@ -42,13 +42,13 @@ You can specify Cabal, GHC, Cardano node, and Postgres versions when building an The default values: `` -CABAL_VERSION=3.8.1.0 +CABAL_VERSION=3.12.1.0 `` `` -GHC_VERSION=8.10.7 +GHC_VERSION=9.6.7 `` `` -CARDANO_NODE_VERSION=10.2.1 +CARDANO_NODE_VERSION=10.3.1 `` `` PG_VERSION=14 diff --git a/docs/docs/core-concepts/architecture.md b/docs/docs/core-concepts/architecture.md index ec824d7b8..594d68b2a 100644 --- a/docs/docs/core-concepts/architecture.md +++ b/docs/docs/core-concepts/architecture.md @@ -53,11 +53,11 @@ _Figure 2: Component Diagram showing internal architecture_ The Cardano Node is a full implementation of the Cardano blockchain protocol that connects to the Cardano network, validates transactions and blocks, and maintains the blockchain state. :::info -**Version**: 10.2.1 (configurable via build args) -**Built with**: GHC 8.10.7 and Cabal 3.8.1.0 +**Version**: 10.3.1 (configurable via build args) +**Built with**: GHC 9.6.7 and Cabal 3.12.1.0 **Runtime socket path**: `/node/node.socket` **Data directory**: `/node/db` -**Network options**: mainnet, preprod, preview, sanchonet, devkit +**Network options**: mainnet, preprod, preview, devkit **Configuration files**: stored in `/config` directory ::: diff --git a/docs/docs/install-and-deploy/docker.md b/docs/docs/install-and-deploy/docker.md index 7f8d0714a..e7b3deb6f 100644 --- a/docs/docs/install-and-deploy/docker.md +++ b/docs/docs/install-and-deploy/docker.md @@ -64,7 +64,7 @@ docker compose --env-file .env.docker-compose -f docker-compose.yaml up :::tip Node Synchronization To speed up the initial synchronization process, you can use [Mithril](https://mithril.network/doc/) snapshots by setting `MITHRIL_SYNC=true` in your environment file. -Mithril provides cryptographically certified blockchain snapshots for multiple Cardano networks (mainnet, preprod, preview, sanchonet) and is integrated directly into the Docker setup. This can reduce synchronization time from days to hours. +Mithril provides cryptographically certified blockchain snapshots for multiple Cardano networks (mainnet, preprod, preview) and is integrated directly into the Docker setup. This can reduce synchronization time from days to hours. ::: @@ -128,9 +128,9 @@ docker build -t {image_name} --build-arg PG_VERSION=14 -f ./docker/Dockerfile . Default values: -- `CABAL_VERSION=3.8.1.0` -- `GHC_VERSION=8.10.7` -- `CARDANO_NODE_VERSION=8.9.2` +- `CABAL_VERSION=3.12.1.0` +- `GHC_VERSION=9.6.7` +- `CARDANO_NODE_VERSION=10.2.1` - `PG_VERSION=14` #### Configuration diff --git a/yaci-indexer/src/main/resources/application.properties b/yaci-indexer/src/main/resources/application.properties index 49545411a..52209428f 100644 --- a/yaci-indexer/src/main/resources/application.properties +++ b/yaci-indexer/src/main/resources/application.properties @@ -5,7 +5,7 @@ spring.flyway.out-of-order=true spring.flyway.locations=classpath:db/store/{vendor} #Api prefix for out-of-box REST API -apiPrefix: /api/v1 +apiPrefix="/api/v1" ## Other Yaci Store properties can be configured here or in application properties under config folder. ## ################## Network Configuration ########### @@ -15,6 +15,8 @@ apiPrefix: /api/v1 store.cardano.host=${CARDANO_NODE_HOST:preprod-node.world.dev.cardano.org} store.cardano.port=${CARDANO_NODE_PORT:30000} store.cardano.protocol-magic=${PROTOCOL_MAGIC:1} +# 3 seconds for keep alive +store.cardano.keep-alive-interval=3000 ############### Genesis files ############################# # The application reads the below genesis files to get data like slotLength, maxLovelaceSupply From bf51e0cfbc6726f17aeff449777946a27777e938 Mon Sep 17 00:00:00 2001 From: Mateusz Czeladka Date: Tue, 20 May 2025 13:47:54 +0200 Subject: [PATCH 17/26] chore: 1.2.9 bump for develop branch. --- README.md | 4 ++-- pom.xml | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 4d7b1dae7..bbb2d0490 100644 --- a/README.md +++ b/README.md @@ -99,7 +99,7 @@ For every Release we provide pre-built docker images stored in the DockerHub Rep To start it use the following command: ```bash - docker run --name rosetta -v {CUSTOM_MOUNT_PATH}:/node --env-file ./docker/.env.dockerfile --env-file ./docker/.env.docker-profile-mid-level -p 8082:8082 --shm-size=4g -d cardanofoundation/cardano-rosetta-java:1.2.8 + docker run --name rosetta -v {CUSTOM_MOUNT_PATH}:/node --env-file ./docker/.env.dockerfile --env-file ./docker/.env.docker-profile-mid-level -p 8082:8082 --shm-size=4g -d cardanofoundation/cardano-rosetta-java:1.2.9 ``` Changes to the configuration can be made by adjusting the `docker/.env.dockerfile` file. For more information on the environment variables, please refer to the [documentation](https://cardano-foundation.github.io/cardano-rosetta-java/docs/install-and-deploy/env-vars). @@ -107,7 +107,7 @@ Changes to the configuration can be made by adjusting the `docker/.env.dockerfil If you want to use the `cardano-submit-api` you can additionally expose port `8090`. It can then be used to submit raw cbor transaction (API documentation here: [Link](https://input-output-hk.github.io/cardano-rest/submit-api/)) ```bash - docker run --name rosetta -v {CUSTOM_MOUNT_PATH}:/node --env-file ./docker/.env.dockerfile --env-file ./docker/.env.docker-profile-mid-level -p 8090:8090 -p 8082:8082 --shm-size=4g -d cardanofoundation/cardano-rosetta-java:1.2.8 + docker run --name rosetta -v {CUSTOM_MOUNT_PATH}:/node --env-file ./docker/.env.dockerfile --env-file ./docker/.env.docker-profile-mid-level -p 8090:8090 -p 8082:8082 --shm-size=4g -d cardanofoundation/cardano-rosetta-java:1.2.9 ``` ### Docker compose diff --git a/pom.xml b/pom.xml index cea9ecf9c..bf32e4854 100644 --- a/pom.xml +++ b/pom.xml @@ -27,7 +27,7 @@ full - 1.2.8 + 1.2.9 24 UTF-8 3.4.4 From cc186e25eb993f338525bd193c8f2918f6744d97 Mon Sep 17 00:00:00 2001 From: matiwinnetou Date: Wed, 21 May 2025 11:15:41 +0200 Subject: [PATCH 18/26] feat: oldest_block reported on network status when configuration remove_spent_utxos parameter is enabled and renaming and removal of configuration variables related to removal or spent utxos. (#448) Co-authored-by: Mateusz Czeladka --- .env.IntegrationTest | 8 +- .env.docker-compose | 8 +- .env.docker-compose-preprod | 8 +- .env.h2 | 11 +- .env.h2-testdata | 11 +- README.md | 5 +- .../model/entity/AddressUtxoEntity.java | 1 + .../api/block/model/domain/NetworkStatus.java | 1 + .../api/block/model/entity/BlockEntity.java | 11 +- .../projection/BlockIdentifierProjection.java | 1 + .../model/repository/BlockRepository.java | 8 +- .../api/block/service/BlockServiceImpl.java | 1 + .../api/block/service/LedgerBlockService.java | 6 + .../block/service/LedgerBlockServiceImpl.java | 35 +++++- .../api/network/mapper/NetworkMapper.java | 7 +- .../network/service/NetworkServiceImpl.java | 27 ++++- .../common/exception/ExceptionFactory.java | 4 + .../rosetta/common/util/RosettaConstants.java | 3 +- .../resources/config/application-offline.yaml | 3 + .../main/resources/config/application.yaml | 4 +- .../service/LedgerBlockServiceImplTest.java | 106 ++++++++++++++++++ .../config/application-test-integration.yaml | 9 +- docker-compose-api.yaml | 3 + docker-compose-indexer.yaml | 7 +- docker/.env.dockerfile | 9 +- docs/docs/advanced-configuration/pruning.md | 28 ++--- docs/docs/install-and-deploy/env-vars.md | 75 +++++++------ docs/docs/intro.md | 12 +- .../src/main/resources/application.properties | 7 +- .../application-test-integration.properties | 4 +- 30 files changed, 301 insertions(+), 122 deletions(-) diff --git a/.env.IntegrationTest b/.env.IntegrationTest index e8115d9ed..3155fe607 100644 --- a/.env.IntegrationTest +++ b/.env.IntegrationTest @@ -60,11 +60,9 @@ SEARCH_PAGE_SIZE=100 ## Yaci Indexer env INDEXER_DOCKER_IMAGE_TAG=main -PRUNING_ENABLED=false +REMOVE_SPENT_UTXOS=false #The number of safe blocks to keep in the store. 2160 blocks *(20 seconds/block in average)=4320 seconds=12 hours. -PRUNING_SAFE_BLOCKS=2160 -#Run transaction pruning every 600 seconds or 10 minutes. -PRUNING_INTERVAL=600 +REMOVE_SPENT_UTXOS_LAST_BLOCKS_GRACE_COUNT=2160 YACI_SPRING_PROFILES=postgres,n2c-socat # database profiles: h2, h2-testdata, postgres @@ -140,3 +138,5 @@ DB_POSTGRES_SEQ_PAGE_COST=1.0 DB_POSTGRES_JIT=off DB_POSTGRES_BGWRITER_LRU_MAXPAGES=50 DB_POSTGRES_BGWRITER_DELAY=500ms + +SYNC_GRACE_SLOTS_COUNT=100 \ No newline at end of file diff --git a/.env.docker-compose b/.env.docker-compose index ee013d7af..9afbc4caf 100644 --- a/.env.docker-compose +++ b/.env.docker-compose @@ -58,11 +58,9 @@ SEARCH_PAGE_SIZE=100 ## Yaci Indexer env INDEXER_DOCKER_IMAGE_TAG=main -PRUNING_ENABLED=false +REMOVE_SPENT_UTXOS=false #The number of safe blocks to keep in the store. 2160 blocks *(20 seconds/block in average)=4320 seconds=12 hours. -PRUNING_SAFE_BLOCKS=2160 -#Run transaction pruning every 600 seconds or 10 minutes. -PRUNING_INTERVAL=600 +REMOVE_SPENT_UTXOS_LAST_BLOCKS_GRACE_COUNT=2160 YACI_SPRING_PROFILES=postgres,n2c-socket # database profiles: h2, h2-testdata, postgres @@ -93,3 +91,5 @@ API_DB_POOL_MAX_LIFETIME_MS=2000000 API_DB_POOL_CONNECTION_TIMEOUT_MS=100000 API_DB_KEEP_ALIVE_MS=60000 API_DB_LEAK_CONNECTIONS_WARNING_MS=60000 + +SYNC_GRACE_SLOTS_COUNT=100 \ No newline at end of file diff --git a/.env.docker-compose-preprod b/.env.docker-compose-preprod index 0dcbe3266..85d12fc80 100644 --- a/.env.docker-compose-preprod +++ b/.env.docker-compose-preprod @@ -59,11 +59,9 @@ SEARCH_PAGE_SIZE=100 ## Yaci Indexer env INDEXER_DOCKER_IMAGE_TAG=main -PRUNING_ENABLED=false +REMOVE_SPENT_UTXOS=false #The number of safe blocks to keep in the store. 2160 blocks *(20 seconds/block in average)=4320 seconds=12 hours. -PRUNING_SAFE_BLOCKS=2160 -#Run transaction pruning every 600 seconds or 10 minutes. -PRUNING_INTERVAL=600 +REMOVE_SPENT_UTXOS_LAST_BLOCKS_GRACE_COUNT=2160 YACI_SPRING_PROFILES=postgres,n2c-socket # database profiles: h2, h2-testdata, postgres @@ -94,3 +92,5 @@ API_DB_POOL_MAX_LIFETIME_MS=2000000 API_DB_POOL_CONNECTION_TIMEOUT_MS=100000 API_DB_KEEP_ALIVE_MS=60000 API_DB_LEAK_CONNECTIONS_WARNING_MS=60000 + +SYNC_GRACE_SLOTS_COUNT=100 \ No newline at end of file diff --git a/.env.h2 b/.env.h2 index 06423b840..1b85dec1a 100644 --- a/.env.h2 +++ b/.env.h2 @@ -40,11 +40,8 @@ SEARCH_PAGE_SIZE=100 ## Yaci Indexer env INDEXER_DOCKER_IMAGE_TAG=main -PRUNING_ENABLED=false -#The number of safe blocks to keep in the store. 2160 blocks *(20 seconds/block in average)=4320 seconds=12 hours. -PRUNING_SAFE_BLOCKS=2160 -#Run transaction pruning every 600 seconds or 10 minutes. -PRUNING_INTERVAL=600 +REMOVE_SPENT_UTXOS=false +REMOVE_SPENT_UTXOS_LAST_BLOCKS_GRACE_COUNT=2160 YACI_SPRING_PROFILES=h2,n2c-socket # database profiles: h2, h2-testdata, postgres MEMPOOL_ENABLED=false @@ -94,4 +91,6 @@ DB_POSTGRES_BGWRITER_LRU_MAXPAGES=50 DB_POSTGRES_BGWRITER_DELAY=500ms # Path to local cardano node socket (Yaci DevKit) -CARDANO_NODE_SOCKET_PATH=${HOME}/.yaci-cli/local-clusters/default/node/node.sock \ No newline at end of file +CARDANO_NODE_SOCKET_PATH=${HOME}/.yaci-cli/local-clusters/default/node/node.sock + +SYNC_GRACE_SLOTS_COUNT=100 \ No newline at end of file diff --git a/.env.h2-testdata b/.env.h2-testdata index 737b7924a..dfe21e652 100644 --- a/.env.h2-testdata +++ b/.env.h2-testdata @@ -40,11 +40,10 @@ SEARCH_PAGE_SIZE=100 ## Yaci Indexer env INDEXER_DOCKER_IMAGE_TAG=main -PRUNING_ENABLED=false +REMOVE_SPENT_UTXOS=false #The number of safe blocks to keep in the store. 2160 blocks *(20 seconds/block in average)=4320 seconds=12 hours. -PRUNING_SAFE_BLOCKS=2160 -#Run transaction pruning every 600 seconds or 10 minutes. -PRUNING_INTERVAL=600 +REMOVE_SPENT_UTXOS_LAST_BLOCKS_GRACE_COUNT=2160 + YACI_SPRING_PROFILES=h2-testdata,n2c-socket # database profiles: h2, h2-testdata, postgres MEMPOOL_ENABLED=false @@ -94,4 +93,6 @@ DB_POSTGRES_BGWRITER_LRU_MAXPAGES=50 DB_POSTGRES_BGWRITER_DELAY=500ms # Path to local cardano node socket (Yaci DevKit) -CARDANO_NODE_SOCKET_PATH=${HOME}/.yaci-cli/local-clusters/default/node/node.sock \ No newline at end of file +CARDANO_NODE_SOCKET_PATH=${HOME}/.yaci-cli/local-clusters/default/node/node.sock + +SYNC_GRACE_SLOTS_COUNT=100 \ No newline at end of file diff --git a/README.md b/README.md index bbb2d0490..aefe7e870 100644 --- a/README.md +++ b/README.md @@ -29,8 +29,8 @@ Since [Yaci-Store](https://github.com/bloxbean/yaci-store) is a comparatively li - 4CPU Cores - 32GB RAM -- 1TB of storage (PRUNING_ENABLED=false) [default] -- 400GB of storage (PRUNING_ENABLED=true) +- ca. > 1TB of storage (REMOVE_SPENT_UTXOS=false) [default] +- ca > 400GB of storage (REMOVE_SPENT_UTXOS=true) Better hardware will improve the performance of the indexer and the node, which will result in faster syncing times. @@ -141,3 +141,4 @@ Further adjustments can be made by changing `.env.docker-compose` file. For more --- Thanks for visiting us and enjoy :heart:! + diff --git a/api/src/main/java/org/cardanofoundation/rosetta/api/account/model/entity/AddressUtxoEntity.java b/api/src/main/java/org/cardanofoundation/rosetta/api/account/model/entity/AddressUtxoEntity.java index b98b98bcb..eb58d580f 100644 --- a/api/src/main/java/org/cardanofoundation/rosetta/api/account/model/entity/AddressUtxoEntity.java +++ b/api/src/main/java/org/cardanofoundation/rosetta/api/account/model/entity/AddressUtxoEntity.java @@ -44,4 +44,5 @@ public class AddressUtxoEntity { @Column(name = "block") private Long blockNumber; + } diff --git a/api/src/main/java/org/cardanofoundation/rosetta/api/block/model/domain/NetworkStatus.java b/api/src/main/java/org/cardanofoundation/rosetta/api/block/model/domain/NetworkStatus.java index 90d3fec9e..a7a243a45 100644 --- a/api/src/main/java/org/cardanofoundation/rosetta/api/block/model/domain/NetworkStatus.java +++ b/api/src/main/java/org/cardanofoundation/rosetta/api/block/model/domain/NetworkStatus.java @@ -17,6 +17,7 @@ public class NetworkStatus { private BlockIdentifierExtended latestBlock; + private BlockIdentifierExtended oldestBlock; private BlockIdentifierExtended genesisBlock; private SyncStatus syncStatus; private List peers; diff --git a/api/src/main/java/org/cardanofoundation/rosetta/api/block/model/entity/BlockEntity.java b/api/src/main/java/org/cardanofoundation/rosetta/api/block/model/entity/BlockEntity.java index b883bfe34..fd4523a1d 100644 --- a/api/src/main/java/org/cardanofoundation/rosetta/api/block/model/entity/BlockEntity.java +++ b/api/src/main/java/org/cardanofoundation/rosetta/api/block/model/entity/BlockEntity.java @@ -1,16 +1,7 @@ package org.cardanofoundation.rosetta.api.block.model.entity; import java.util.List; -import jakarta.persistence.Column; -import jakarta.persistence.ConstraintMode; -import jakarta.persistence.Entity; -import jakarta.persistence.FetchType; -import jakarta.persistence.ForeignKey; -import jakarta.persistence.Id; -import jakarta.persistence.JoinColumn; -import jakarta.persistence.OneToMany; -import jakarta.persistence.OneToOne; -import jakarta.persistence.Table; +import jakarta.persistence.*; import lombok.AllArgsConstructor; import lombok.Builder; diff --git a/api/src/main/java/org/cardanofoundation/rosetta/api/block/model/entity/projection/BlockIdentifierProjection.java b/api/src/main/java/org/cardanofoundation/rosetta/api/block/model/entity/projection/BlockIdentifierProjection.java index 1f1a8c49a..100f3db29 100644 --- a/api/src/main/java/org/cardanofoundation/rosetta/api/block/model/entity/projection/BlockIdentifierProjection.java +++ b/api/src/main/java/org/cardanofoundation/rosetta/api/block/model/entity/projection/BlockIdentifierProjection.java @@ -1,6 +1,7 @@ package org.cardanofoundation.rosetta.api.block.model.entity.projection; public interface BlockIdentifierProjection { + String getHash(); Long getNumber(); Long getBlockTimeInSeconds(); diff --git a/api/src/main/java/org/cardanofoundation/rosetta/api/block/model/repository/BlockRepository.java b/api/src/main/java/org/cardanofoundation/rosetta/api/block/model/repository/BlockRepository.java index 873824074..a16eda04c 100644 --- a/api/src/main/java/org/cardanofoundation/rosetta/api/block/model/repository/BlockRepository.java +++ b/api/src/main/java/org/cardanofoundation/rosetta/api/block/model/repository/BlockRepository.java @@ -4,6 +4,7 @@ import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.Query; +import org.springframework.data.repository.query.Param; import org.springframework.stereotype.Repository; import org.cardanofoundation.rosetta.api.block.model.entity.BlockEntity; @@ -15,6 +16,9 @@ public interface BlockRepository extends JpaRepository { @Query("FROM BlockEntity b WHERE b.number = 0 ORDER BY b.number ASC LIMIT 1") Optional findGenesisBlockIdentifier(); + @Query("FROM BlockEntity b WHERE b.number = :blockNumber ORDER BY b.number ASC LIMIT 1") + Optional findBlockProjectionByNumber(@Param("blockNumber") long blockNumber); + Optional findByNumber(Long blockNumber); Optional findByHash(String blockHash); @@ -32,6 +36,6 @@ public interface BlockRepository extends JpaRepository { Optional findBlockIdentifierByHash(String blockHash); Optional findBlockIdentifierByNumberAndHash( - Long blockNumber, - String blockHash); + Long blockNumber, + String blockHash); } diff --git a/api/src/main/java/org/cardanofoundation/rosetta/api/block/service/BlockServiceImpl.java b/api/src/main/java/org/cardanofoundation/rosetta/api/block/service/BlockServiceImpl.java index dc60b79bc..fe044d251 100644 --- a/api/src/main/java/org/cardanofoundation/rosetta/api/block/service/BlockServiceImpl.java +++ b/api/src/main/java/org/cardanofoundation/rosetta/api/block/service/BlockServiceImpl.java @@ -38,6 +38,7 @@ public Block findBlock(Long index, String hash) { } log.error("Block was not found"); + throw ExceptionFactory.blockNotFoundException(); } diff --git a/api/src/main/java/org/cardanofoundation/rosetta/api/block/service/LedgerBlockService.java b/api/src/main/java/org/cardanofoundation/rosetta/api/block/service/LedgerBlockService.java index ddaf1ef80..135b7bba4 100644 --- a/api/src/main/java/org/cardanofoundation/rosetta/api/block/service/LedgerBlockService.java +++ b/api/src/main/java/org/cardanofoundation/rosetta/api/block/service/LedgerBlockService.java @@ -46,6 +46,12 @@ public interface LedgerBlockService { */ BlockIdentifierExtended findLatestBlockIdentifier(); + /** + * Returns the oldest full block (block for which we have full data) + * @return the oldest block identifier + */ + BlockIdentifierExtended findOldestBlockIdentifier(BlockIdentifierExtended latestBlock); + /** * Returns the genesis block identifier. * @return the genesis block identifier diff --git a/api/src/main/java/org/cardanofoundation/rosetta/api/block/service/LedgerBlockServiceImpl.java b/api/src/main/java/org/cardanofoundation/rosetta/api/block/service/LedgerBlockServiceImpl.java index 98570c874..991956bad 100644 --- a/api/src/main/java/org/cardanofoundation/rosetta/api/block/service/LedgerBlockServiceImpl.java +++ b/api/src/main/java/org/cardanofoundation/rosetta/api/block/service/LedgerBlockServiceImpl.java @@ -14,6 +14,7 @@ import jakarta.validation.constraints.NotNull; import lombok.RequiredArgsConstructor; +import lombok.Setter; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Value; @@ -38,6 +39,7 @@ @Component @Transactional(readOnly = true) @RequiredArgsConstructor +@Setter public class LedgerBlockServiceImpl implements LedgerBlockService { private final BlockRepository blockRepository; @@ -57,9 +59,15 @@ public class LedgerBlockServiceImpl implements LedgerBlockService { private BlockIdentifierExtended cachedGenesisBlock; - @Value("${rosetta.blockFetchTimeoutInSeconds:5}") + @Value("${cardano.rosetta.BLOCK_FETCH_TIMEOUT_SECS:5}") private int blockFetchTimeoutInSeconds; + @Value("${cardano.rosetta.REMOVE_SPENT_UTXOS:false}") + private boolean isRemovalOfSpentUTxOsEnabled; + + @Value("${cardano.rosetta.REMOVE_SPENT_UTXOS_LAST_BLOCKS_GRACE_COUNT:2160}") + private int removeSpentUTxOsLastBlocksGraceCount; + @Override public Optional findBlock(Long blockNumber, String blockHash) { log.debug("Query blockNumber: {} , blockHash: {}", blockNumber, blockHash); @@ -179,6 +187,30 @@ public BlockIdentifierExtended findGenesisBlockIdentifier() { return cachedGenesisBlock; } + public BlockIdentifierExtended findOldestBlockIdentifier(BlockIdentifierExtended latestBlock) { + log.debug("About to run findOldestBlock query"); + + if (!isRemovalOfSpentUTxOsEnabled) { + throw ExceptionFactory.oldestBlockNotFound(); + } + + long targetBlockNo = latestBlock.getNumber() - removeSpentUTxOsLastBlocksGraceCount; // this could result in less than 0 + + if (targetBlockNo < 0) { + log.debug("Oldest block number is less than 0, returning genesis block"); + + return cachedGenesisBlock; + } + + BlockIdentifierExtended oldestBlock = blockRepository.findBlockProjectionByNumber(targetBlockNo) + .map(blockMapper::mapToBlockIdentifierExtended) + .orElseThrow(ExceptionFactory::oldestBlockNotFound); + + log.debug("Returning oldest block {}", oldestBlock); + + return oldestBlock; + } + private TransactionInfo findByTxHash(List transactions) { List txHashes = transactions.stream().map(BlockTx::getHash).toList(); List utxHashes = transactions.stream() @@ -300,7 +332,6 @@ record TransactionInfo(List utxos, } record UtxoKey(String txHash, Integer outputIndex) { - } } diff --git a/api/src/main/java/org/cardanofoundation/rosetta/api/network/mapper/NetworkMapper.java b/api/src/main/java/org/cardanofoundation/rosetta/api/network/mapper/NetworkMapper.java index 3b650f64e..099894770 100644 --- a/api/src/main/java/org/cardanofoundation/rosetta/api/network/mapper/NetworkMapper.java +++ b/api/src/main/java/org/cardanofoundation/rosetta/api/network/mapper/NetworkMapper.java @@ -17,11 +17,16 @@ public interface NetworkMapper { @Mapping(target = "currentBlockIdentifier.index", source = "latestBlock.number") @Mapping(target = "currentBlockIdentifier.hash", source = "latestBlock.hash") + @Mapping(target = "oldestBlockIdentifier.index", source = "oldestBlock.number") + @Mapping(target = "oldestBlockIdentifier.hash", source = "oldestBlock.hash") + @Mapping(target = "syncStatus", source = "syncStatus") @Mapping(target = "currentBlockTimestamp", - expression = "java(java.util.concurrent.TimeUnit.SECONDS.toMillis(networkStatus.getLatestBlock().getBlockTimeInSeconds()))") + expression = "java(java.util.concurrent.TimeUnit.SECONDS.toMillis(networkStatus.getLatestBlock().getBlockTimeInSeconds()))") + @Mapping(target = "genesisBlockIdentifier.index", source = "genesisBlock.number", defaultValue = "0L") @Mapping(target = "genesisBlockIdentifier.hash", source = "genesisBlock.hash") @Mapping(target = "peers", qualifiedByName = "getPeerWithoutMetadata") NetworkStatusResponse toNetworkStatusResponse(NetworkStatus networkStatus); + } diff --git a/api/src/main/java/org/cardanofoundation/rosetta/api/network/service/NetworkServiceImpl.java b/api/src/main/java/org/cardanofoundation/rosetta/api/network/service/NetworkServiceImpl.java index 79257489c..c16b13201 100644 --- a/api/src/main/java/org/cardanofoundation/rosetta/api/network/service/NetworkServiceImpl.java +++ b/api/src/main/java/org/cardanofoundation/rosetta/api/network/service/NetworkServiceImpl.java @@ -3,10 +3,10 @@ import java.io.IOException; import java.io.InputStream; import java.util.*; +import javax.annotation.PostConstruct; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; -import lombok.val; import org.springframework.beans.factory.annotation.Value; import org.springframework.core.io.ResourceLoader; @@ -53,9 +53,19 @@ public class NetworkServiceImpl implements NetworkService { @Value("${cardano.rosetta.middleware-version}") private String revision; - @Value("${cardano.rosetta.ALLOWED_SLOTS_DELTA:100}") + @Value("${cardano.rosetta.SYNC_GRACE_SLOTS_COUNT:100}") private int allowedSlotsDelta; + @Value("${cardano.rosetta.REMOVE_SPENT_UTXOS:false}") + private boolean isRemovalOfSpentUTxOsEnabled; + + @PostConstruct + public void init() { + log.info("NetworkServiceImpl initializing..."); + log.info("allowedSlotsDelta: {}", allowedSlotsDelta); + log.info("isRemovalOfSpentUTxOsEnabled: {}", isRemovalOfSpentUTxOsEnabled); + } + @Override public NetworkListResponse getNetworkList(MetadataRequest metadataRequest) { log.info("[networkList] Looking for all supported networks"); @@ -114,7 +124,7 @@ private String getRosettaVersion() { @Override public NetworkStatusResponse getNetworkStatus(NetworkRequest networkRequest) { - log.debug("[networkStatus] Request received: {}", networkRequest.toString()); + log.info("[networkStatus] Request received: {}", networkRequest.toString()); log.info("[networkStatus] Looking for latest block"); NetworkStatus networkStatus = networkStatus(); @@ -137,22 +147,29 @@ public Network getSupportedNetwork() { } private NetworkStatus networkStatus() { - log.info("[networkStatus] Looking for latest block"); + log.info("[networkStatus] Looking for network status"); BlockIdentifierExtended latestBlock = ledgerBlockService.findLatestBlockIdentifier(); log.debug("[networkStatus] Latest block found {}", latestBlock); log.debug("[networkStatus] Looking for genesis block"); BlockIdentifierExtended genesisBlock = ledgerBlockService.findGenesisBlockIdentifier(); + log.debug("[networkStatus] Genesis block found {}", genesisBlock); List peers = topologyConfigService.getPeers(); - val networkStatusBuilder = NetworkStatus.builder() + NetworkStatus.NetworkStatusBuilder networkStatusBuilder = NetworkStatus.builder() .latestBlock(latestBlock) .genesisBlock(genesisBlock) .peers(peers); + if (isRemovalOfSpentUTxOsEnabled) { + BlockIdentifierExtended oldestBlockIdentifier = ledgerBlockService.findOldestBlockIdentifier(latestBlock); + + networkStatusBuilder.oldestBlock(oldestBlockIdentifier); + } + calculateSyncStatus(latestBlock).ifPresent(networkStatusBuilder::syncStatus); return networkStatusBuilder.build(); diff --git a/api/src/main/java/org/cardanofoundation/rosetta/common/exception/ExceptionFactory.java b/api/src/main/java/org/cardanofoundation/rosetta/common/exception/ExceptionFactory.java index bf0b8c0bf..ea1e698ec 100644 --- a/api/src/main/java/org/cardanofoundation/rosetta/common/exception/ExceptionFactory.java +++ b/api/src/main/java/org/cardanofoundation/rosetta/common/exception/ExceptionFactory.java @@ -337,4 +337,8 @@ public static ApiException invalidBlockIdentifier(@NotNull long index) { return new ApiException(RosettaErrorType.INVALID_BLOCK_INDEX.toRosettaError(false, Details.builder().message("Invalid block index, must be greater than or equal to 0, supplied index:%d".formatted(index)).build())); } + public static ApiException oldestBlockNotFound() { + return new ApiException(RosettaErrorType.OLDEST_BLOCK_NOT_FOUND.toRosettaError(false)); + } + } diff --git a/api/src/main/java/org/cardanofoundation/rosetta/common/util/RosettaConstants.java b/api/src/main/java/org/cardanofoundation/rosetta/common/util/RosettaConstants.java index 1eabf3986..8791164a9 100644 --- a/api/src/main/java/org/cardanofoundation/rosetta/common/util/RosettaConstants.java +++ b/api/src/main/java/org/cardanofoundation/rosetta/common/util/RosettaConstants.java @@ -198,7 +198,8 @@ public enum RosettaErrorType { MISSING_DREP_ID("Missing drep id", 5039), MISSING_DREP_TYPE("Missing drep type", 5040), TIMEOUT("Downstream timeout", 5041), - INVALID_BLOCK_INDEX("Invalid block index", 5042); + INVALID_BLOCK_INDEX("Invalid block index", 5042), + OLDEST_BLOCK_NOT_FOUND("Oldest block not found", 5043); final String message; final int code; diff --git a/api/src/main/resources/config/application-offline.yaml b/api/src/main/resources/config/application-offline.yaml index 7d06fdcac..3b12803e2 100644 --- a/api/src/main/resources/config/application-offline.yaml +++ b/api/src/main/resources/config/application-offline.yaml @@ -12,6 +12,9 @@ spring: cardano: rosetta: OFFLINE_MODE: true + SYNC_GRACE_SLOTS_COUNT: ${SYNC_GRACE_SLOTS_COUNT:100} + REMOVE_SPENT_UTXOS: ${REMOVE_SPENT_UTXOS:false} + YACI_HTTP_BASE_URL: ${YACI_HTTP_BASE_URL:http://localhost:9095} HTTP_CONNECT_TIMEOUT_SECONDS: ${HTTP_CONNECT_TIMEOUT_SECONDS:5} HTTP_REQUEST_TIMEOUT_SECONDS: ${HTTP_REQUEST_TIMEOUT_SECONDS:5} \ No newline at end of file diff --git a/api/src/main/resources/config/application.yaml b/api/src/main/resources/config/application.yaml index 06b4db79b..376fa0e72 100644 --- a/api/src/main/resources/config/application.yaml +++ b/api/src/main/resources/config/application.yaml @@ -28,13 +28,15 @@ cardano: CARDANO_NODE_SUBMIT_HOST: ${CARDANO_NODE_SUBMIT_HOST} CARDANO_NODE_VERSION: ${CARDANO_NODE_VERSION} CARDANO_NODE_SOCKET_PATH: ${CARDANO_NODE_SOCKET_PATH} - # devkit variables DEVKIT_ENABLED: ${DEVKIT_ENABLED:false} DEVKIT_URL: ${DEVKIT_URL:yaci-cli} DEVKIT_PORT: ${DEVKIT_PORT:3333} SEARCH_PAGE_SIZE: ${SEARCH_PAGE_SIZE:10} OFFLINE_MODE: ${OFFLINE_MODE:false} + SYNC_GRACE_SLOTS_COUNT: ${SYNC_GRACE_SLOTS_COUNT:100} + REMOVE_SPENT_UTXOS: ${REMOVE_SPENT_UTXOS:false} + YACI_HTTP_BASE_URL: ${YACI_HTTP_BASE_URL:http://localhost:9095} HTTP_CONNECT_TIMEOUT_SECONDS: ${HTTP_CONNECT_TIMEOUT_SECONDS:5} HTTP_REQUEST_TIMEOUT_SECONDS: ${HTTP_REQUEST_TIMEOUT_SECONDS:5} diff --git a/api/src/test/java/org/cardanofoundation/rosetta/api/block/service/LedgerBlockServiceImplTest.java b/api/src/test/java/org/cardanofoundation/rosetta/api/block/service/LedgerBlockServiceImplTest.java index 2470a8089..6f490e92a 100644 --- a/api/src/test/java/org/cardanofoundation/rosetta/api/block/service/LedgerBlockServiceImplTest.java +++ b/api/src/test/java/org/cardanofoundation/rosetta/api/block/service/LedgerBlockServiceImplTest.java @@ -22,10 +22,15 @@ import org.cardanofoundation.rosetta.api.block.mapper.TransactionMapper; import org.cardanofoundation.rosetta.api.block.model.domain.*; import org.cardanofoundation.rosetta.api.block.model.entity.*; +import org.cardanofoundation.rosetta.api.block.model.entity.projection.BlockIdentifierProjection; import org.cardanofoundation.rosetta.api.block.model.repository.*; +import org.cardanofoundation.rosetta.common.exception.ApiException; import org.cardanofoundation.rosetta.common.services.ProtocolParamService; import static org.assertj.core.api.AssertionsForClassTypes.assertThat; +import static org.cardanofoundation.rosetta.common.util.RosettaConstants.RosettaErrorType.OLDEST_BLOCK_NOT_FOUND; +import static org.junit.jupiter.api.Assertions.assertThrows; +import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; @ExtendWith(MockitoExtension.class) @@ -277,4 +282,105 @@ void populateTransaction_populatesPoolRetirements() { assertThat(transaction.getPoolRetirements().size()).isEqualTo(1); } + @Test + void findOldestBlockIdentifier_throwsException_whenPruningIsEnabled() { + // Given + ledgerBlockService.setRemovalOfSpentUTxOsEnabled(true); + BlockIdentifierExtended latestBlock = new BlockIdentifierExtended(); + latestBlock.setNumber(5000L); + + // When & Then + ApiException exception = assertThrows(ApiException.class, () -> + ledgerBlockService.findOldestBlockIdentifier(latestBlock)); + + // Verify the exception is the correct type + assertThat(exception.getError().getCode()).isEqualTo(OLDEST_BLOCK_NOT_FOUND.getCode()); + } + + @Test + void findOldestBlockIdentifier_returnsGenesisBlock_whenTargetBlockNumberIsNegative() { + // Given + ledgerBlockService.setRemovalOfSpentUTxOsEnabled(true); + ledgerBlockService.setRemoveSpentUTxOsLastBlocksGraceCount(100); + + BlockIdentifierExtended latestBlock = new BlockIdentifierExtended(); + latestBlock.setNumber(50L); + + BlockIdentifierExtended genesisBlock = new BlockIdentifierExtended(); + genesisBlock.setNumber(0L); + genesisBlock.setHash("Genesis"); + ledgerBlockService.setCachedGenesisBlock(genesisBlock); + + // When + BlockIdentifierExtended result = ledgerBlockService.findOldestBlockIdentifier(latestBlock); + + // Then + assertThat(result).isSameAs(genesisBlock); + } + + @Test + void findOldestBlockIdentifier_returnsCorrectBlock_whenTargetBlockNumberIsValid() { + // Given + ledgerBlockService.setRemovalOfSpentUTxOsEnabled(true); + ledgerBlockService.setRemoveSpentUTxOsLastBlocksGraceCount(100); + + BlockIdentifierExtended latestBlock = new BlockIdentifierExtended(); + latestBlock.setNumber(500L); + + BlockIdentifierProjection blockProjection = new BlockIdentifierProjection() { + @Override + public String getHash() { + return "oldestHash"; + } + + @Override + public Long getNumber() { + return 400L; // 500 - 100 = 400 + } + + @Override + public Long getBlockTimeInSeconds() { + return 0L; + } + + @Override + public Long getSlot() { + return 0L; + } + }; + + BlockIdentifierExtended expectedBlock = new BlockIdentifierExtended(); + expectedBlock.setNumber(400L); + expectedBlock.setHash("oldestHash"); + + when(blockRepository.findBlockProjectionByNumber(400L)).thenReturn(Optional.of(blockProjection)); + when(blockMapper.mapToBlockIdentifierExtended(blockProjection)).thenReturn(expectedBlock); + + // When + BlockIdentifierExtended result = ledgerBlockService.findOldestBlockIdentifier(latestBlock); + + // Then + assertThat(result).isEqualTo(expectedBlock); + verify(blockRepository).findBlockProjectionByNumber(400L); + verify(blockMapper).mapToBlockIdentifierExtended(blockProjection); + } + + + @Test + void findOldestBlockIdentifier_throwsException_whenTargetBlockIsNotFound() { + // Given + ledgerBlockService.setRemovalOfSpentUTxOsEnabled(false); + ledgerBlockService.setRemoveSpentUTxOsLastBlocksGraceCount(100); + + BlockIdentifierExtended latestBlock = new BlockIdentifierExtended(); + latestBlock.setNumber(500L); + + // When & Then + ApiException exception = assertThrows(ApiException.class, () -> + ledgerBlockService.findOldestBlockIdentifier(latestBlock)); + + // Verify the exception is the correct type + assertThat(exception.getError().getCode()).isEqualTo(OLDEST_BLOCK_NOT_FOUND.getCode()); + } + } diff --git a/api/src/test/resources/config/application-test-integration.yaml b/api/src/test/resources/config/application-test-integration.yaml index fbd047230..836d5c0dd 100644 --- a/api/src/test/resources/config/application-test-integration.yaml +++ b/api/src/test/resources/config/application-test-integration.yaml @@ -43,7 +43,7 @@ cardano: GENESIS_SHELLEY_PATH: ${GENESIS_SHELLEY_PATH:../config/devkit/shelley-genesis.json} GENESIS_ALONZO_PATH: ${GENESIS_ALONZO_PATH:../config/devkit/alonzo-genesis.json} GENESIS_CONWAY_PATH: ${GENESIS_CONWAY_PATH:../config/devkit/conway-genesis.json} - CARDANO_NODE_VERSION: ${CARDANO_NODE_VERSION:10.1.2} + CARDANO_NODE_VERSION: ${CARDANO_NODE_VERSION:10.3.1} CARDANO_NODE_SUBMIT_HOST: ${CARDANO_NODE_SUBMIT_HOST:localhost} NODE_SUBMIT_API_PORT: ${NODE_SUBMIT_API_PORT:8090} CARDANO_NODE_SOCKET_PATH: ${CARDANO_NODE_SOCKET_PATH:""} @@ -53,10 +53,9 @@ cardano: DEVKIT_PORT: ${DEVKIT_PORT:3333} SEARCH_PAGE_SIZE: ${SEARCH_PAGE_SIZE:10} OFFLINE_MODE: ${OFFLINE_MODE:false} - #The number of safe blocks to keep in the store. 2160 blocks *(20 seconds/block in average)=4320 seconds=12 hours. - PRUNING_SAFE_BLOCKS: ${PRUNING_SAFE_BLOCKS} - #Run transaction pruning every 600 seconds or 10 minutes. - PRUNING_INTERVAL: ${PRUNING_INTERVAL} + SYNC_GRACE_SLOTS_COUNT: ${SYNC_GRACE_SLOTS_COUNT:100} + BLOCK_FETCH_TIMEOUT_SECS: ${BLOCK_FETCH_TIMEOUT_SECS:5} + REMOVE_SPENT_UTXOS: ${REMOVE_SPENT_UTXOS:false} YACI_HTTP_BASE_URL: http://localhost:9095/api/v1 HTTP_CONNECT_TIMEOUT_SECONDS: 5 diff --git a/docker-compose-api.yaml b/docker-compose-api.yaml index 30b2c0bd3..9f87308e7 100644 --- a/docker-compose-api.yaml +++ b/docker-compose-api.yaml @@ -32,6 +32,9 @@ services: HTTP_CONNECT_TIMEOUT_SECONDS: ${HTTP_CONNECT_TIMEOUT_SECONDS} HTTP_REQUEST_TIMEOUT_SECONDS: ${HTTP_REQUEST_TIMEOUT_SECONDS} + SYNC_GRACE_SLOTS_COUNT: ${SYNC_GRACE_SLOTS_COUNT} + REMOVE_SPENT_UTXOS: ${REMOVE_SPENT_UTXOS} + # DB performance tuning API_DB_POOL_MIN_COUNT: ${API_DB_POOL_MIN_COUNT} API_DB_POOL_MAX_COUNT: ${API_DB_POOL_MAX_COUNT} diff --git a/docker-compose-indexer.yaml b/docker-compose-indexer.yaml index 9eccf8b55..5485af95a 100644 --- a/docker-compose-indexer.yaml +++ b/docker-compose-indexer.yaml @@ -21,15 +21,12 @@ services: GENESIS_BYRON_PATH: ${GENESIS_BYRON_PATH} GENESIS_ALONZO_PATH: ${GENESIS_ALONZO_PATH} GENESIS_CONWAY_PATH: ${GENESIS_CONWAY_PATH} - PRUNING_ENABLED: ${PRUNING_ENABLED} + REMOVE_SPENT_UTXOS: ${REMOVE_SPENT_UTXOS} CARDANO_NODE_SOCKET_PATH: ${CARDANO_NODE_SOCKET_PATH} HOST_N2C_SOCAT_HOST: ${HOST_N2C_SOCAT_HOST} HOST_N2C_SOCAT_PORT: ${HOST_N2C_SOCAT_PORT} SEARCH_PAGE_SIZE: ${SEARCH_PAGE_SIZE} - #The number of safe blocks to keep in the store. 2160 blocks *(20 seconds/block in average)=4320 seconds=12 hours. - PRUNING_INTERVAL: ${PRUNING_INTERVAL} - #Run transaction pruning every 600 seconds or 10 minutes. - PRUNING_SAFE_BLOCKS: ${PRUNING_SAFE_BLOCKS} + REMOVE_SPENT_UTXOS_LAST_BLOCKS_GRACE_COUNT: ${REMOVE_SPENT_UTXOS_LAST_BLOCKS_GRACE_COUNT} volumes: - ${CARDANO_CONFIG}:/config diff --git a/docker/.env.dockerfile b/docker/.env.dockerfile index 92447101b..7e4098b5b 100644 --- a/docker/.env.dockerfile +++ b/docker/.env.dockerfile @@ -50,9 +50,10 @@ PRINT_EXCEPTION=true ## Yaci Indexer env YACI_SPRING_PROFILES=postgres,n2c-socket -PRUNING_ENABLED=false -PRUNING_INTERVAL=600 -PRUNING_SAFE_BLOCKS=2160 +REMOVE_SPENT_UTXOS=false + +REMOVE_SPENT_UTXOS_LAST_BLOCKS_GRACE_COUNT=2160 + # database profiles: h2, h2-testdata, postgres MEMPOOL_ENABLED=false # Haven't implemented yet @@ -72,3 +73,5 @@ API_DB_POOL_CONNECTION_TIMEOUT_MS=100000 API_DB_KEEP_ALIVE_MS=60000 API_DB_LEAK_CONNECTIONS_WARNING_MS=60000 API_DB_MONITOR_PERFORMANCE=false + +SYNC_GRACE_SLOTS_COUNT=100 \ No newline at end of file diff --git a/docs/docs/advanced-configuration/pruning.md b/docs/docs/advanced-configuration/pruning.md index b0e6e9ff1..482e9ef7d 100644 --- a/docs/docs/advanced-configuration/pruning.md +++ b/docs/docs/advanced-configuration/pruning.md @@ -1,28 +1,31 @@ --- sidebar_position: 1 -title: Pruning UTXOs -description: Optimizing disk usage with pruning +title: Remove Spent UTXOs +description: Optimizing disk usage with removal of spent UTxOs --- -# Pruning UTXOs +# Remove Spent UTXOs -This guide explains how to optimize disk usage in **cardano-rosetta-java** through pruning. +This guide explains how to optimize disk usage in **cardano-rosetta-java** through removal of spent utxo (a special rosetta-java specific form of pruning). -## What is Pruning? +## What is UTxO Spent Pruning (removal of spent UTxOs)? -Pruning removes spent (consumed) UTXOs from local storage, keeping only unspent UTXOs. This can reduce on-disk storage from ~1TB down to ~400GB, but discards historical transaction data. +UTxO Spent Pruning removes spent (consumed) UTXOs from local storage, keeping only unspent UTXOs. This can reduce on-disk storage from ~1TB down to ~400GB, but discards historical transaction data. - Only unspent outputs are preserved. - You can still validate the chain's current state (and spend tokens), since active UTXOs remain. -- **Enable Pruning**: Set `PRUNING_ENABLED=true` in your environment (e.g., in `.env.dockerfile` or `.env.docker-compose`). -- **Disable Pruning** (default): Set `PRUNING_ENABLED=false`. +- You should be able to build transaction because only spent UTxOs are removed (unspent stay) -## When to Enable Pruning +**Enable Spent UTxO removal **: Set `REMOVE_SPENT_UTXOS=true` in your environment (e.g., in `.env.dockerfile` or `.env.docker-compose`). +**Disable Spent UTxO removal ** (default): Set `REMOVE_SPENT_UTXOS=false`. + +## When Spent UTxO Removal should be enabled? - **Low Disk Environments**: If you need to minimize disk usage and only require UTXO data for current balances. - **Exploratory / Dev Environments**: If historical queries are not critical. +- **Performance**: if you are running into performance / scalability issues, i.e. especially on /account/balance when working with large addresses -## When to Avoid Pruning +## When to avoid setting UtxO Removal feature? - **Full Historical Data Requirements**: If you need the complete transaction history—whether for exchange operations, audit trails, or compliance mandates—do not enable pruning. Pruning discards spent UTXOs, which removes older transaction data and prevents certain types of historical lookups or reporting. @@ -31,9 +34,8 @@ Pruning removes spent (consumed) UTXOs from local storage, keeping only unspent Below is a snippet of how you might configure `.env.dockerfile` or `.env.docker-compose` for pruning: ```bash -# --- Pruning Toggle --- -PRUNING_ENABLED=true -# Enables pruning to reduce disk space requirements +# --- Remove Spent UTxOs Toggle --- +REMOVE_SPENT_UTXOS=true ``` ## Further Reading diff --git a/docs/docs/install-and-deploy/env-vars.md b/docs/docs/install-and-deploy/env-vars.md index ae02a6baa..2a8dd5d37 100644 --- a/docs/docs/install-and-deploy/env-vars.md +++ b/docs/docs/install-and-deploy/env-vars.md @@ -13,40 +13,41 @@ Within root folder of the project there are example `.env` files, which can be c - `.env.IntegrationTest` - Is used for integration tests with yaci devkit - `.env.docker-compose` - Is used for standard docker-compose setup (Copy this file and adjusted it to your needs) -| Variable | Description | Default | -| ---------------------------- | ---------------------------- | ------------------------------------- | -| `LOG` | Log level | INFO | -| `NETWORK` | Network | mainnet | -| `MITHRIL_SYNC` | Sync from Mithril snapshot | true | -| `PROTOCOL_MAGIC` | Cardano protocol magic | 764824073 | -| `DB_IMAGE_NAME` | Postgres docker image name | postgres | -| `DB_IMAGE_TAG` | Postgres docker image tag | 14.11-bullseye | -| `DB_NAME` | Postgres database | rosetta-java | -| `DB_USER` | Postgres admin user | rosetta_db_admin | -| `DB_SECRET` | Postgres admin secret | weakpwd#123_d | -| `DB_HOST` | Postgres host | db | -| `DB_PORT` | Postgres port | 5432 | -| `DB_SCHEMA` | Database schema | mainnet | -| `DB_PATH` | Database path | /data | -| `CARDANO_NODE_HOST` | Cardano node host | cardano-node | -| `CARDANO_NODE_PORT` | Cardano node port | 3001 | -| `CARDANO_NODE_VERSION` | Cardano node version | 8.9.2 | -| `CARDANO_NODE_SUBMIT_HOST` | Cardano node submit api host | cardano-submit-api | -| `NODE_SUBMIT_API_PORT` | Cardano node submit api port | 8090 | -| `CARDANO_NODE_SOCKET_PATH` | Cardano node socket path | /node | -| `CARDANO_NODE_SOCKET` | Cardano node socket file | /node/node.socket | -| `CARDANO_NODE_DB` | Cardano node db path | /node/db | -| `CARDANO_CONFIG` | Cardano node config path | /config/mainnet | -| `API_DOCKER_IMAGE_TAG` | Docker Tag for API Image | main | -| `API_SPRING_PROFILES_ACTIVE` | Api spring profile | staging | -| `API_PORT` | Rosetta api exposed port | 8082 | -| `ROSETTA_VERSION` | Rosetta version | 1.4.13 | -| `TOPOLOGY_FILEPATH` | Topology file path | ./config/mainnet/topology.json | -| `GENESIS_SHELLEY_PATH` | Genesis file path | ./config/mainnet/shelley-genesis.json | -| `GENESIS_BYRON_PATH` | Genesis file path | ./config/mainnet/byron-genesis.json | -| `GENESIS_ALONZO_PATH ` | Genesis file path | ./config/mainnet/alonzo-genesis.json | -| `GENESIS_CONWAY_PATH` | Genesis file path | ./config/mainnet/conway-genesis.json | -| `INDEXER_DOCKER_IMAGE_TAG` | Yaci indexer Docker version | main | -| `PRUNING_ENABLED` | If pruning should be enabled | true | -| `YACI_SPRING_PROFILES` | Yaci indexer spring profile | postgres | -| `DEVKIT_ENABLED` | Devkit enabled | false | +| Variable | Description | Default | +|------------------------------|----------------------------------------------------------------|---------------------------------------| +| `LOG` | Log level | INFO | +| `NETWORK` | Network | mainnet | +| `MITHRIL_SYNC` | Sync from Mithril snapshot | true | +| `PROTOCOL_MAGIC` | Cardano protocol magic | 764824073 | +| `DB_IMAGE_NAME` | Postgres docker image name | postgres | +| `DB_IMAGE_TAG` | Postgres docker image tag | 14.11-bullseye | +| `DB_NAME` | Postgres database | rosetta-java | +| `DB_USER` | Postgres admin user | rosetta_db_admin | +| `DB_SECRET` | Postgres admin secret | weakpwd#123_d | +| `DB_HOST` | Postgres host | db | +| `DB_PORT` | Postgres port | 5432 | +| `DB_SCHEMA` | Database schema | mainnet | +| `DB_PATH` | Database path | /data | +| `CARDANO_NODE_HOST` | Cardano node host | cardano-node | +| `CARDANO_NODE_PORT` | Cardano node port | 3001 | +| `CARDANO_NODE_VERSION` | Cardano node version | 8.9.2 | +| `CARDANO_NODE_SUBMIT_HOST` | Cardano node submit api host | cardano-submit-api | +| `NODE_SUBMIT_API_PORT` | Cardano node submit api port | 8090 | +| `CARDANO_NODE_SOCKET_PATH` | Cardano node socket path | /node | +| `CARDANO_NODE_SOCKET` | Cardano node socket file | /node/node.socket | +| `CARDANO_NODE_DB` | Cardano node db path | /node/db | +| `CARDANO_CONFIG` | Cardano node config path | /config/mainnet | +| `API_DOCKER_IMAGE_TAG` | Docker Tag for API Image | main | +| `API_SPRING_PROFILES_ACTIVE` | API spring profile | staging | +| `API_PORT` | Rosetta api exposed port | 8082 | +| `ROSETTA_VERSION` | Rosetta version | 1.4.13 | +| `TOPOLOGY_FILEPATH` | Topology file path | ./config/mainnet/topology.json | +| `GENESIS_SHELLEY_PATH` | Genesis file path | ./config/mainnet/shelley-genesis.json | +| `GENESIS_BYRON_PATH` | Genesis file path | ./config/mainnet/byron-genesis.json | +| `GENESIS_ALONZO_PATH ` | Genesis file path | ./config/mainnet/alonzo-genesis.json | +| `GENESIS_CONWAY_PATH` | Genesis file path | ./config/mainnet/conway-genesis.json | +| `INDEXER_DOCKER_IMAGE_TAG` | Yaci indexer Docker version | main | +| `REMOVE_SPENT_UTXOS` | If spent UTxO pruning is enabled | true | +| `YACI_SPRING_PROFILES` | Yaci Indexer spring profile | postgres | +| `DEVKIT_ENABLED` | Devkit enabled (development / integration tests) | false | +| `SYNC_GRACE_SLOTS_COUNT` | Number of absolute slots to consider rosetta node to be synced | 100 | \ No newline at end of file diff --git a/docs/docs/intro.md b/docs/docs/intro.md index 186a8aefe..44ac92104 100644 --- a/docs/docs/intro.md +++ b/docs/docs/intro.md @@ -23,12 +23,12 @@ For a more detailed architecture overview, see the [Architecture](core-concepts/ Running Cardano Rosetta Java requires the following minimum resources: -| Component | Requirement | Notes | -| :---------- | :---------- | :----------------------- | -| **CPU** | 4 Cores | | -| **RAM** | 32 GB | | -| **Storage** | 1 TB | When pruning is disabled | -| | 400 GB | When pruning is enabled | +| Component | Requirement | Notes | +| :---------- | :---------- |:------------------------------------| +| **CPU** | 4 Cores | | +| **RAM** | 32 GB | | +| **Storage** | 1 TB | When remove spent UTxOs is disabled | +| | 400 GB | When remove spent UTxOs is enabled | :::tip Performance Note Better hardware resources (more CPU cores, RAM) will improve indexer and node performance, resulting in faster chain synchronization and better API response times. diff --git a/yaci-indexer/src/main/resources/application.properties b/yaci-indexer/src/main/resources/application.properties index 52209428f..b10864641 100644 --- a/yaci-indexer/src/main/resources/application.properties +++ b/yaci-indexer/src/main/resources/application.properties @@ -105,9 +105,8 @@ logging.level.com.bloxbean.cardano.yaci.core.protocol.keepalive=debug store.admin.auto-recovery-enabled=true store.admin.health-check-interval=20 - -store.utxo.pruning-enabled=${PRUNING_ENABLED:false} -store.utxo.pruning-interval=${PRUNING_INTERVAL:600} -store.utxo.pruning-safe-blocks=${PRUNING_SAFE_BLOCKS:2160} +store.utxo.pruning-enabled=${REMOVE_SPENT_UTXOS:false} +store.utxo.pruning-safe-blocks=${REMOVE_SPENT_UTXOS_LAST_BLOCKS_GRACE_COUNT:2160} +store.utxo.pruning-interval=600 store.epoch.endpoints.epoch.local.enabled=true diff --git a/yaci-indexer/src/test/resources/application-test-integration.properties b/yaci-indexer/src/test/resources/application-test-integration.properties index fc25f73a9..ccdca2d9f 100644 --- a/yaci-indexer/src/test/resources/application-test-integration.properties +++ b/yaci-indexer/src/test/resources/application-test-integration.properties @@ -13,5 +13,5 @@ spring.h2.console.enabled=true store.cardano.host=${CARDANO_NODE_HOST:localhost} store.cardano.port=${CARDANO_NODE_PORT:8090} -store.utxo.pruning-interval=${PRUNING_INTERVAL:600} -store.utxo.pruning-safe-blocks=${PRUNING_SAFE_BLOCKS:2160} \ No newline at end of file +store.utxo.pruning-interval=600 +store.utxo.pruning-safe-blocks=${REMOVE_SPENT_UTXOS_LAST_BLOCKS_GRACE_COUNT:2160} \ No newline at end of file From f01cab604d6d05dc6e639f8a7d765121dd54c7c0 Mon Sep 17 00:00:00 2001 From: Mateusz Czeladka Date: Wed, 21 May 2025 13:55:50 +0200 Subject: [PATCH 19/26] chore: removed sanochnet. --- .../rosetta/api/network/service/NetworkServiceImpl.java | 1 - .../org/cardanofoundation/rosetta/common/util/Constants.java | 1 - 2 files changed, 2 deletions(-) diff --git a/api/src/main/java/org/cardanofoundation/rosetta/api/network/service/NetworkServiceImpl.java b/api/src/main/java/org/cardanofoundation/rosetta/api/network/service/NetworkServiceImpl.java index c16b13201..972367b74 100644 --- a/api/src/main/java/org/cardanofoundation/rosetta/api/network/service/NetworkServiceImpl.java +++ b/api/src/main/java/org/cardanofoundation/rosetta/api/network/service/NetworkServiceImpl.java @@ -139,7 +139,6 @@ public Network getSupportedNetwork() { case MAINNET_NETWORK_MAGIC -> Networks.mainnet(); case PREPROD_NETWORK_MAGIC -> Networks.preprod(); case PREVIEW_NETWORK_MAGIC -> Networks.preview(); - case Constants.SANCHONET_NETWORK_MAGIC -> new Network(0b0000, Constants.SANCHONET_NETWORK_MAGIC); case DEVKIT_NETWORK_MAGIC -> new Network(0b0000, DEVKIT_NETWORK_MAGIC); default -> throw ExceptionFactory.invalidNetworkError(); diff --git a/api/src/main/java/org/cardanofoundation/rosetta/common/util/Constants.java b/api/src/main/java/org/cardanofoundation/rosetta/common/util/Constants.java index f436f9f37..85c941155 100644 --- a/api/src/main/java/org/cardanofoundation/rosetta/common/util/Constants.java +++ b/api/src/main/java/org/cardanofoundation/rosetta/common/util/Constants.java @@ -28,7 +28,6 @@ public class Constants { public static final int MAINNET_NETWORK_MAGIC = 764824073; public static final int PREPROD_NETWORK_MAGIC = 1; public static final int PREVIEW_NETWORK_MAGIC = 2; - public static final int SANCHONET_NETWORK_MAGIC = 4; public static final int DEVKIT_NETWORK_MAGIC = 42; public static final int OPERATION_TYPE_VOTE_DELEGATION = 43; From 17b3a39e0dddca49f29e073e972801c1b8d343fd Mon Sep 17 00:00:00 2001 From: VladislavKudrin Date: Wed, 21 May 2025 14:30:28 +0200 Subject: [PATCH 20/26] fix: cardano node db path / mithril version / tags (#460) --- docker-compose-node.yaml | 32 ++++++++++++++------------- docker/dockerfiles/mithril/Dockerfile | 4 ++-- docker/dockerfiles/node/entrypoint.sh | 7 +----- 3 files changed, 20 insertions(+), 23 deletions(-) diff --git a/docker-compose-node.yaml b/docker-compose-node.yaml index ec06db33f..54aa5017d 100644 --- a/docker-compose-node.yaml +++ b/docker-compose-node.yaml @@ -3,7 +3,10 @@ services: mithril: image: cardanofoundation/rosetta-mithril:${MITHRIL_VERSION} build: - context: ./docker/dockerfiles/mithril + context: ./ + dockerfile: ./docker/dockerfiles/mithril/Dockerfile + args: + MITHRIL_VERSION: ${MITHRIL_VERSION} environment: - NETWORK=${NETWORK} - MITHRIL_SYNC=${MITHRIL_SYNC} @@ -16,28 +19,27 @@ services: - ${CARDANO_NODE_DIR}:/node cardano-node: - image: ghcr.io/intersectmbo/cardano-node:${CARDANO_NODE_VERSION} - #image: cardano-foundation/rosetta-cardano-node:${CARDANO_NODE_VERSION} -# build: -# context: ./ -# dockerfile: ./docker/dockerfiles/node/Dockerfile -# args: -# CARDANO_NODE_VERSION: ${CARDANO_NODE_VERSION} + image: cardanofoundation/rosetta-cardano-node:${CARDANO_NODE_VERSION} + build: + context: ./ + dockerfile: ./docker/dockerfiles/node/Dockerfile + args: + CARDANO_NODE_VERSION: ${CARDANO_NODE_VERSION} environment: - NETWORK=${NETWORK} -# - PROTOCOL_MAGIC=${PROTOCOL_MAGIC} -# - CARDANO_NODE_SOCKET_PATH=${CARDANO_NODE_SOCKET_PATH} -# - CARDANO_NODE_PORT=${CARDANO_NODE_PORT} -# - NODE_SUBMIT_API_PORT=${NODE_SUBMIT_API_PORT} + - PROTOCOL_MAGIC=${PROTOCOL_MAGIC} + - CARDANO_NODE_SOCKET_PATH=${CARDANO_NODE_SOCKET_PATH} + - CARDANO_NODE_PORT=${CARDANO_NODE_PORT} + - NODE_SUBMIT_API_PORT=${NODE_SUBMIT_API_PORT} + - CARDANO_NODE_DB=${CARDANO_NODE_DB} volumes: - - ${CARDANO_NODE_DIR}:/node/ - - ${CARDANO_NODE_DB}:/node/db + - ${CARDANO_NODE_DIR}:${CARDANO_NODE_DIR} + - ${CARDANO_NODE_DB}:${CARDANO_NODE_DB} - ${CARDANO_CONFIG}:/config restart: unless-stopped ports: - ${CARDANO_NODE_PORT}:${CARDANO_NODE_PORT} - ${NODE_SUBMIT_API_PORT}:${NODE_SUBMIT_API_PORT} - entrypoint: cardano-node run --database-path /node/db --port ${CARDANO_NODE_PORT} --socket-path /node/node.socket --topology /config/topology.json --config /config/config.json depends_on: mithril: condition: service_completed_successfully diff --git a/docker/dockerfiles/mithril/Dockerfile b/docker/dockerfiles/mithril/Dockerfile index f7964ee1d..e73ef33c9 100644 --- a/docker/dockerfiles/mithril/Dockerfile +++ b/docker/dockerfiles/mithril/Dockerfile @@ -33,7 +33,7 @@ FROM ubuntu:24.04 AS mithril-runner COPY --from=cardano-builder /root/.local/bin/mithril-client /usr/local/bin RUN apt update --fix-missing \ && apt install -y wget -COPY entrypoint.sh /sbin/entrypoint.sh +COPY ./docker/dockerfiles/mithril/entrypoint.sh /sbin/entrypoint.sh RUN chmod +x /sbin/entrypoint.sh -CMD ["/sbin/entrypoint.sh"] \ No newline at end of file +CMD ["/sbin/entrypoint.sh"] diff --git a/docker/dockerfiles/node/entrypoint.sh b/docker/dockerfiles/node/entrypoint.sh index dd5f3a69c..3f3f7b0e6 100644 --- a/docker/dockerfiles/node/entrypoint.sh +++ b/docker/dockerfiles/node/entrypoint.sh @@ -16,12 +16,7 @@ function clean_up() { trap clean_up SIGHUP SIGINT SIGTERM echo "Starting Cardano node..." - -mkdir -p "$(dirname "$CARDANO_NODE_SOCKET_PATH")" - -sleep 1 -#cardano-node run --socket-path "$CARDANO_NODE_SOCKET_PATH" --port $CARDANO_NODE_PORT --database-path "$CARDANO_NODE_DB" --config /config/config.json --topology /config/topology.json & -cardano-node run --socket-path "$CARDANO_NODE_SOCKET_PATH" --port $CARDANO_NODE_PORT --database-path /node/db --config /config/config.json --topology /config/topology.json & +cardano-node run --socket-path "$CARDANO_NODE_SOCKET_PATH" --port $CARDANO_NODE_PORT --database-path "$CARDANO_NODE_DB" --config /config/config.json --topology /config/topology.json & CARDANO_NODE_PID=$! sleep 2 From 0bc8fbf117846054aa2878b6844108be7f091a14 Mon Sep 17 00:00:00 2001 From: VladislavKudrin Date: Tue, 27 May 2025 12:38:40 +0200 Subject: [PATCH 21/26] feat: split cardano-node and cardano-submit-api (#464) --- .env.docker-compose | 2 +- .env.docker-compose-preprod | 2 +- docker-compose-node.yaml | 26 +++++++++++++-- docker/dockerfiles/node/entrypoint.sh | 47 +++++++++++++++------------ 4 files changed, 51 insertions(+), 26 deletions(-) diff --git a/.env.docker-compose b/.env.docker-compose index f3fefc98b..6be1ce132 100644 --- a/.env.docker-compose +++ b/.env.docker-compose @@ -25,7 +25,7 @@ CARDANO_NODE_HOST=cardano-node CARDANO_NODE_PORT=3001 # Uncomment if you are using local cardano node CARDANO_NODE_VERSION=10.3.1 -CARDANO_NODE_SUBMIT_HOST=$CARDANO_NODE_HOST +CARDANO_NODE_SUBMIT_HOST=cardano-submit-api NODE_SUBMIT_API_PORT=8090 CARDANO_NODE_DIR=/node CARDANO_NODE_SOCKET_PATH=${CARDANO_NODE_DIR}/node.socket diff --git a/.env.docker-compose-preprod b/.env.docker-compose-preprod index 85d12fc80..d983621d6 100644 --- a/.env.docker-compose-preprod +++ b/.env.docker-compose-preprod @@ -25,7 +25,7 @@ CARDANO_NODE_HOST=cardano-node CARDANO_NODE_PORT=3001 # Uncomment if you are using local cardano node CARDANO_NODE_VERSION=10.3.1 -CARDANO_NODE_SUBMIT_HOST=$CARDANO_NODE_HOST +CARDANO_NODE_SUBMIT_HOST=cardano-submit-api NODE_SUBMIT_API_PORT=8090 CARDANO_NODE_DIR=/opt/rosetta-java-preprod/node_data CARDANO_NODE_SOCKET_PATH=${CARDANO_NODE_DIR}/node.socket diff --git a/docker-compose-node.yaml b/docker-compose-node.yaml index 54aa5017d..0c0d6b7f2 100644 --- a/docker-compose-node.yaml +++ b/docker-compose-node.yaml @@ -26,11 +26,8 @@ services: args: CARDANO_NODE_VERSION: ${CARDANO_NODE_VERSION} environment: - - NETWORK=${NETWORK} - - PROTOCOL_MAGIC=${PROTOCOL_MAGIC} - CARDANO_NODE_SOCKET_PATH=${CARDANO_NODE_SOCKET_PATH} - CARDANO_NODE_PORT=${CARDANO_NODE_PORT} - - NODE_SUBMIT_API_PORT=${NODE_SUBMIT_API_PORT} - CARDANO_NODE_DB=${CARDANO_NODE_DB} volumes: - ${CARDANO_NODE_DIR}:${CARDANO_NODE_DIR} @@ -39,7 +36,30 @@ services: restart: unless-stopped ports: - ${CARDANO_NODE_PORT}:${CARDANO_NODE_PORT} + entrypoint: ["/sbin/entrypoint.sh", "cardano-node"] + depends_on: + mithril: + condition: service_completed_successfully + + cardano-submit-api: + image: cardanofoundation/rosetta-cardano-node:${CARDANO_NODE_VERSION} + build: + context: ./ + dockerfile: ./docker/dockerfiles/node/Dockerfile + args: + CARDANO_NODE_VERSION: ${CARDANO_NODE_VERSION} + environment: + - NETWORK=${NETWORK} + - PROTOCOL_MAGIC=${PROTOCOL_MAGIC} + - CARDANO_NODE_SOCKET_PATH=${CARDANO_NODE_SOCKET_PATH} + - NODE_SUBMIT_API_PORT=${NODE_SUBMIT_API_PORT} + volumes: + - ${CARDANO_NODE_DIR}:${CARDANO_NODE_DIR} + - ${CARDANO_CONFIG}:/config + restart: unless-stopped + ports: - ${NODE_SUBMIT_API_PORT}:${NODE_SUBMIT_API_PORT} + entrypoint: ["/sbin/entrypoint.sh", "cardano-submit-api"] depends_on: mithril: condition: service_completed_successfully diff --git a/docker/dockerfiles/node/entrypoint.sh b/docker/dockerfiles/node/entrypoint.sh index 3f3f7b0e6..fd667628f 100644 --- a/docker/dockerfiles/node/entrypoint.sh +++ b/docker/dockerfiles/node/entrypoint.sh @@ -1,27 +1,32 @@ #!/bin/bash if [ "$NETWORK" == "mainnet" ]; then - NETWORK_STR="--mainnet" + NETWORK_STR="--mainnet" else - NETWORK_STR="--testnet-magic $PROTOCOL_MAGIC" + NETWORK_STR="--testnet-magic $PROTOCOL_MAGIC" fi -function clean_up() { - # Killing all processes before exiting - kill -2 "$CARDANO_NODE_PID" "$CARDANO_SUBMIT_PID" - wait $CARDANO_NODE_PID - exit -} - -trap clean_up SIGHUP SIGINT SIGTERM - -echo "Starting Cardano node..." -cardano-node run --socket-path "$CARDANO_NODE_SOCKET_PATH" --port $CARDANO_NODE_PORT --database-path "$CARDANO_NODE_DB" --config /config/config.json --topology /config/topology.json & -CARDANO_NODE_PID=$! -sleep 2 - -echo "Starting Cardano submit api..." -cardano-submit-api --listen-address 0.0.0.0 --socket-path "$CARDANO_NODE_SOCKET_PATH" --port $NODE_SUBMIT_API_PORT $NETWORK_STR --config /cardano-submit-api-config/cardano-submit-api.yaml & -CARDANO_SUBMIT_PID=$! - -wait -n $CARDANO_NODE_PID $CARDANO_SUBMIT_PID +cmd="$1"; shift +case "$cmd" in + cardano-node) + echo "Starting Cardano node..." + exec cardano-node run \ + --socket-path "$CARDANO_NODE_SOCKET_PATH" \ + --port "$CARDANO_NODE_PORT" \ + --database-path "$CARDANO_NODE_DB" \ + --config /config/config.json \ + --topology /config/topology.json + ;; + cardano-submit-api) + echo "Starting Cardano submit api..." + exec cardano-submit-api \ + --listen-address 0.0.0.0 \ + --socket-path "$CARDANO_NODE_SOCKET_PATH" \ + --port "$NODE_SUBMIT_API_PORT" \ + $NETWORK_STR \ + --config /cardano-submit-api-config/cardano-submit-api.yaml + ;; + *) + exit 1 + ;; +esac From c6c66327ed645e088ef5f1325ffb2aa8380a5eb3 Mon Sep 17 00:00:00 2001 From: VladislavKudrin Date: Tue, 27 May 2025 15:07:37 +0200 Subject: [PATCH 22/26] feat: rosetta java images dockerhub (#465) * feat: split cardano-node and cardano-submit-api * feat: adjust node / mithril tags * feat: add cardano-rosetta-java-cardano-node image to dockerhub * feat: add mithril / postgres to dockerhub * feat: adjust tags --- .../actions/build_docker_images/action.yml | 45 +++++++++++++++++++ docker-compose-indexer.yaml | 3 +- docker-compose-node.yaml | 7 ++- 3 files changed, 49 insertions(+), 6 deletions(-) diff --git a/.github/actions/build_docker_images/action.yml b/.github/actions/build_docker_images/action.yml index d2f51aa87..9bc8ba928 100644 --- a/.github/actions/build_docker_images/action.yml +++ b/.github/actions/build_docker_images/action.yml @@ -49,6 +49,51 @@ runs: file: ./yaci-indexer/Dockerfile tags: cardanofoundation/cardano-rosetta-java-indexer:latest push: true + - name: Cardano Node - Build and push Docker ${{ inputs.tag }} image + uses: docker/build-push-action@v4 + with: + context: . + file: ./docker/node/Dockerfile + tags: cardanofoundation/cardano-rosetta-java-cardano-node:${{ inputs.tag }} + push: true + - name: Cardano Node - Build and push Docker latest image + uses: docker/build-push-action@v4 + if: ${{ inputs.isRelease == 'true' }} + with: + context: . + file: ./docker/node/Dockerfile + tags: cardanofoundation/cardano-rosetta-java-cardano-node:latest + push: true + - name: Postgres - Build and push Docker ${{ inputs.tag }} image + uses: docker/build-push-action@v4 + with: + context: . + file: ./docker/postgres/Dockerfile + tags: cardanofoundation/cardano-rosetta-java-postgres:${{ inputs.tag }} + push: true + - name: Postgres - Build and push Docker latest image + uses: docker/build-push-action@v4 + if: ${{ inputs.isRelease == 'true' }} + with: + context: . + file: ./docker/postgres/Dockerfile + tags: cardanofoundation/cardano-rosetta-java-postgres:latest + push: true + - name: Mithril - Build and push Docker ${{ inputs.tag }} image + uses: docker/build-push-action@v4 + with: + context: . + file: ./docker/mithril/Dockerfile + tags: cardanofoundation/cardano-rosetta-java-mithril:${{ inputs.tag }} + push: true + - name: Mithril - Build and push Docker latest image + uses: docker/build-push-action@v4 + if: ${{ inputs.isRelease == 'true' }} + with: + context: . + file: ./docker/mithril/Dockerfile + tags: cardanofoundation/cardano-rosetta-java-mithril:latest + push: true - name: All-in-one - Build and push Docker image uses: docker/build-push-action@v4 with: diff --git a/docker-compose-indexer.yaml b/docker-compose-indexer.yaml index 5485af95a..d6b13783e 100644 --- a/docker-compose-indexer.yaml +++ b/docker-compose-indexer.yaml @@ -27,7 +27,6 @@ services: HOST_N2C_SOCAT_PORT: ${HOST_N2C_SOCAT_PORT} SEARCH_PAGE_SIZE: ${SEARCH_PAGE_SIZE} REMOVE_SPENT_UTXOS_LAST_BLOCKS_GRACE_COUNT: ${REMOVE_SPENT_UTXOS_LAST_BLOCKS_GRACE_COUNT} - volumes: - ${CARDANO_CONFIG}:/config - ${CARDANO_NODE_DIR}:${CARDANO_NODE_DIR} @@ -39,7 +38,7 @@ services: condition: service_healthy db: - image: postgres:${PG_VERSION_TAG} + image: cardanofoundation/cardano-rosetta-java-postgres:${PG_VERSION_TAG} build: context: ./ dockerfile: ./docker/dockerfiles/postgres/Dockerfile diff --git a/docker-compose-node.yaml b/docker-compose-node.yaml index 0c0d6b7f2..383453def 100644 --- a/docker-compose-node.yaml +++ b/docker-compose-node.yaml @@ -1,7 +1,7 @@ version: '3.8' services: mithril: - image: cardanofoundation/rosetta-mithril:${MITHRIL_VERSION} + image: cardanofoundation/cardano-rosetta-java-mithril:${MITHRIL_VERSION} build: context: ./ dockerfile: ./docker/dockerfiles/mithril/Dockerfile @@ -14,12 +14,11 @@ services: - AGGREGATOR_ENDPOINT=${AGGREGATOR_ENDPOINT} - GENESIS_VERIFICATION_KEY=${GENESIS_VERIFICATION_KEY} - ANCILLARY_VERIFICATION_KEY=${ANCILLARY_VERIFICATION_KEY} - volumes: - ${CARDANO_NODE_DIR}:/node cardano-node: - image: cardanofoundation/rosetta-cardano-node:${CARDANO_NODE_VERSION} + image: cardanofoundation/cardano-rosetta-java-cardano-node:${CARDANO_NODE_VERSION} build: context: ./ dockerfile: ./docker/dockerfiles/node/Dockerfile @@ -42,7 +41,7 @@ services: condition: service_completed_successfully cardano-submit-api: - image: cardanofoundation/rosetta-cardano-node:${CARDANO_NODE_VERSION} + image: cardanofoundation/cardano-rosetta-java-cardano-node:${CARDANO_NODE_VERSION} build: context: ./ dockerfile: ./docker/dockerfiles/node/Dockerfile From fa0aff931914db910eb28f055e38e3e6a4e0dda9 Mon Sep 17 00:00:00 2001 From: VladislavKudrin Date: Wed, 28 May 2025 12:58:57 +0200 Subject: [PATCH 23/26] feat: retry mechanism for node (#468) * feat: retry mechanism for node dependencies - single docker image * feat: retry mechanism for node dependencies - docker compose image --- docker/Dockerfile | 106 +++++++++++++++++---------- docker/dockerfiles/node/Dockerfile | 112 ++++++++++++++++++----------- 2 files changed, 141 insertions(+), 77 deletions(-) diff --git a/docker/Dockerfile b/docker/Dockerfile index b0b81f7d8..a9acf0711 100644 --- a/docker/Dockerfile +++ b/docker/Dockerfile @@ -69,47 +69,79 @@ WORKDIR /usr/local/src # Install sodium RUN git clone --branch master https://github.com/IntersectMBO/libsodium.git \ - && cd libsodium \ - && git checkout ${LIBSODIUM_VERSION} \ - && ./autogen.sh \ - && ./configure \ - && make \ - && make check \ - && make install - -WORKDIR /usr/local/src - + && cd libsodium \ + && git checkout ${LIBSODIUM_VERSION} \ + && \ + for i in $(seq 1 10); do \ + echo "Attempt $i/10: building libsodium…"; \ + if ./autogen.sh && ./configure && make && make check && make install; then \ + echo "Success on attempt $i"; \ + break; \ + elif [ "$i" -eq 10 ]; then \ + echo "All 10 attempts failed, aborting" >&2; \ + exit 1; \ + else \ + echo "Build failed, retrying in 10s…"; \ + sleep 10; \ + fi; \ + done + +# Install secp256k1 RUN git clone --branch master https://github.com/bitcoin-core/secp256k1.git \ - && cd secp256k1 \ - && git checkout ${SECP256K1_VERSION} \ - && ./autogen.sh \ - && ./configure --prefix=/usr --enable-module-schnorrsig --enable-experimental \ - && make \ - && make check \ - && make install + && cd secp256k1 \ + && git checkout ${SECP256K1_VERSION} \ + && \ + for i in $(seq 1 10); do \ + echo "Attempt $i/10: building secp256k1…"; \ + if ./autogen.sh \ + && ./configure --prefix=/usr --enable-module-schnorrsig --enable-experimental \ + && make \ + && make check \ + && make install; then \ + echo "secp256k1 built successfully on attempt $i"; \ + break; \ + elif [ "$i" -eq 10 ]; then \ + echo "All 10 attempts failed for secp256k1, aborting." >&2; \ + exit 1; \ + else \ + echo "Build failed on attempt $i — retrying in 10s…"; \ + sleep 10; \ + fi; \ + done # Install blst RUN git clone --branch master https://github.com/supranational/blst.git \ - && cd blst \ - && git checkout v$BLST_VERSION \ - && ./build.sh \ - && echo "prefix=/usr/local" >> libblst.pc \ - && echo "exec_prefix=\${prefix}" >> libblst.pc \ - && echo "libdir=\${exec_prefix}/lib" >> libblst.pc \ - && echo "includedir=\${prefix}/include" >> libblst.pc \ - && echo "" >> libblst.pc \ - && echo "Name: libblst" >> libblst.pc \ - && echo "Description: Multilingual BLS12-381 signature library" >> libblst.pc \ - && echo "URL: https://github.com/supranational/blst" >> libblst.pc \ - && echo "Version: ${BLST_VERSION#v}" >> libblst.pc \ - && echo "Cflags: -I\${includedir}" >> libblst.pc \ - && echo "Libs: -L\${libdir} -lblst" >> libblst.pc \ - && cp libblst.pc /usr/local/lib/pkgconfig/ \ - && cp bindings/blst_aux.h bindings/blst.h bindings/blst.hpp /usr/local/include/ \ - && cp libblst.a /usr/local/lib \ - && bash -c "chmod u=rw,go=r /usr/local/{lib/{libblst.a,pkgconfig/libblst.pc},include/{blst.{h,hpp},blst_aux.h}}" - -WORKDIR /usr/local/src + && cd blst \ + && git checkout v${BLST_VERSION} \ + && \ + for i in $(seq 1 10); do \ + echo "Attempt $i/10: building blst…"; \ + if ./build.sh \ + && echo "prefix=/usr/local" >> libblst.pc \ + && echo "exec_prefix=\${prefix}" >> libblst.pc \ + && echo "libdir=\${exec_prefix}/lib" >> libblst.pc \ + && echo "includedir=\${prefix}/include" >> libblst.pc \ + && echo "" >> libblst.pc \ + && echo "Name: libblst" >> libblst.pc \ + && echo "Description: Multilingual BLS12-381 signature library" >> libblst.pc \ + && echo "URL: https://github.com/supranational/blst" >> libblst.pc \ + && echo "Version: ${BLST_VERSION#v}" >> libblst.pc \ + && echo "Cflags: -I\${includedir}" >> libblst.pc \ + && echo "Libs: -L\${libdir} -lblst" >> libblst.pc \ + && cp libblst.pc /usr/local/lib/pkgconfig/ \ + && cp bindings/blst_aux.h bindings/blst.h bindings/blst.hpp /usr/local/include/ \ + && cp libblst.a /usr/local/lib \ + && bash -c "chmod u=rw,go=r /usr/local/{lib/{libblst.a,pkgconfig/libblst.pc},include/{blst.{h,hpp},blst_aux.h}}"; then \ + echo "blst built successfully on attempt $i"; \ + break; \ + elif [ "$i" -eq 10 ]; then \ + echo "All 10 attempts failed for blst, aborting." >&2; \ + exit 1; \ + else \ + echo "blst build failed on attempt $i — retrying in 10s…"; \ + sleep 10; \ + fi; \ + done # Install cardano-node RUN git clone https://github.com/intersectmbo/cardano-node.git \ diff --git a/docker/dockerfiles/node/Dockerfile b/docker/dockerfiles/node/Dockerfile index 4920e298e..e79f44281 100644 --- a/docker/dockerfiles/node/Dockerfile +++ b/docker/dockerfiles/node/Dockerfile @@ -19,10 +19,10 @@ ARG BLST_VERSION="0.3.11" ARG LIBSODIUM_VERSION="dbb48cc" ARG SECP256K1_VERSION="ac83be33" -ARG CABAL_VERSION="3.12.1.0" -ARG GHC_VERSION="9.6.7" +ARG CABAL_VERSION=${CABAL_VERSION:-3.12.1.0} +ARG GHC_VERSION=${GHC_VERSION:-9.6.7} -ARG CARDANO_NODE_VERSION=10.3.1 +ARG CARDANO_NODE_VERSION=${CARDANO_NODE_VERSION:-10.3.1} RUN bash -c "ghcup install cabal ${CABAL_VERSION}" RUN bash -c "ghcup set cabal ${CABAL_VERSION}" @@ -34,47 +34,79 @@ WORKDIR /usr/local/src # Install sodium RUN git clone --branch master https://github.com/IntersectMBO/libsodium.git \ - && cd libsodium \ - && git checkout ${LIBSODIUM_VERSION} \ - && ./autogen.sh \ - && ./configure \ - && make \ - && make check \ - && make install - -WORKDIR /usr/local/src - + && cd libsodium \ + && git checkout ${LIBSODIUM_VERSION} \ + && \ + for i in $(seq 1 10); do \ + echo "Attempt $i/10: building libsodium…"; \ + if ./autogen.sh && ./configure && make && make check && make install; then \ + echo "Success on attempt $i"; \ + break; \ + elif [ "$i" -eq 10 ]; then \ + echo "All 10 attempts failed, aborting" >&2; \ + exit 1; \ + else \ + echo "Build failed, retrying in 10s…"; \ + sleep 10; \ + fi; \ + done + +# Install secp256k1 RUN git clone --branch master https://github.com/bitcoin-core/secp256k1.git \ - && cd secp256k1 \ - && git checkout ${SECP256K1_VERSION} \ - && ./autogen.sh \ - && ./configure --prefix=/usr --enable-module-schnorrsig --enable-experimental \ - && make \ - && make check \ - && make install + && cd secp256k1 \ + && git checkout ${SECP256K1_VERSION} \ + && \ + for i in $(seq 1 10); do \ + echo "Attempt $i/10: building secp256k1…"; \ + if ./autogen.sh \ + && ./configure --prefix=/usr --enable-module-schnorrsig --enable-experimental \ + && make \ + && make check \ + && make install; then \ + echo "secp256k1 built successfully on attempt $i"; \ + break; \ + elif [ "$i" -eq 10 ]; then \ + echo "All 10 attempts failed for secp256k1, aborting." >&2; \ + exit 1; \ + else \ + echo "Build failed on attempt $i — retrying in 10s…"; \ + sleep 10; \ + fi; \ + done # Install blst RUN git clone --branch master https://github.com/supranational/blst.git \ - && cd blst \ - && git checkout v${BLST_VERSION} \ - && ./build.sh \ - && echo "prefix=/usr/local" >> libblst.pc \ - && echo "exec_prefix=\${prefix}" >> libblst.pc \ - && echo "libdir=\${exec_prefix}/lib" >> libblst.pc \ - && echo "includedir=\${prefix}/include" >> libblst.pc \ - && echo "" >> libblst.pc \ - && echo "Name: libblst" >> libblst.pc \ - && echo "Description: Multilingual BLS12-381 signature library" >> libblst.pc \ - && echo "URL: https://github.com/supranational/blst" >> libblst.pc \ - && echo "Version: ${BLST_VERSION#v}" >> libblst.pc \ - && echo "Cflags: -I\${includedir}" >> libblst.pc \ - && echo "Libs: -L\${libdir} -lblst" >> libblst.pc \ - && cp libblst.pc /usr/local/lib/pkgconfig/ \ - && cp bindings/blst_aux.h bindings/blst.h bindings/blst.hpp /usr/local/include/ \ - && cp libblst.a /usr/local/lib \ - && bash -c "chmod u=rw,go=r /usr/local/{lib/{libblst.a,pkgconfig/libblst.pc},include/{blst.{h,hpp},blst_aux.h}}" \ - -WORKDIR /usr/local/src + && cd blst \ + && git checkout v${BLST_VERSION} \ + && \ + for i in $(seq 1 10); do \ + echo "Attempt $i/10: building blst…"; \ + if ./build.sh \ + && echo "prefix=/usr/local" >> libblst.pc \ + && echo "exec_prefix=\${prefix}" >> libblst.pc \ + && echo "libdir=\${exec_prefix}/lib" >> libblst.pc \ + && echo "includedir=\${prefix}/include" >> libblst.pc \ + && echo "" >> libblst.pc \ + && echo "Name: libblst" >> libblst.pc \ + && echo "Description: Multilingual BLS12-381 signature library" >> libblst.pc \ + && echo "URL: https://github.com/supranational/blst" >> libblst.pc \ + && echo "Version: ${BLST_VERSION#v}" >> libblst.pc \ + && echo "Cflags: -I\${includedir}" >> libblst.pc \ + && echo "Libs: -L\${libdir} -lblst" >> libblst.pc \ + && cp libblst.pc /usr/local/lib/pkgconfig/ \ + && cp bindings/blst_aux.h bindings/blst.h bindings/blst.hpp /usr/local/include/ \ + && cp libblst.a /usr/local/lib \ + && bash -c "chmod u=rw,go=r /usr/local/{lib/{libblst.a,pkgconfig/libblst.pc},include/{blst.{h,hpp},blst_aux.h}}"; then \ + echo "blst built successfully on attempt $i"; \ + break; \ + elif [ "$i" -eq 10 ]; then \ + echo "All 10 attempts failed for blst, aborting." >&2; \ + exit 1; \ + else \ + echo "blst build failed on attempt $i — retrying in 10s…"; \ + sleep 10; \ + fi; \ + done # Install cardano-node RUN git clone https://github.com/intersectmbo/cardano-node.git \ From ba61feebf41f625099f30c14f772911f862e9a63 Mon Sep 17 00:00:00 2001 From: Mateusz Czeladka Date: Tue, 3 Jun 2025 11:04:52 +0200 Subject: [PATCH 24/26] fix: wrong escaping of string text in yaci-indexer configuration, fixes: #472. --- yaci-indexer/src/main/resources/application.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/yaci-indexer/src/main/resources/application.properties b/yaci-indexer/src/main/resources/application.properties index b10864641..970051325 100644 --- a/yaci-indexer/src/main/resources/application.properties +++ b/yaci-indexer/src/main/resources/application.properties @@ -5,7 +5,7 @@ spring.flyway.out-of-order=true spring.flyway.locations=classpath:db/store/{vendor} #Api prefix for out-of-box REST API -apiPrefix="/api/v1" +apiPrefix=/api/v1 ## Other Yaci Store properties can be configured here or in application properties under config folder. ## ################## Network Configuration ########### From 1054c225d1aeb2d9d483460e9e1c5ce16dd66e62 Mon Sep 17 00:00:00 2001 From: matiwinnetou Date: Tue, 3 Jun 2025 15:37:16 +0200 Subject: [PATCH 25/26] fix: single docker build fix related to java-builder (#475) Co-authored-by: Mateusz Czeladka --- docker/Dockerfile | 41 ++++++++++++++++------------------------- 1 file changed, 16 insertions(+), 25 deletions(-) diff --git a/docker/Dockerfile b/docker/Dockerfile index a9acf0711..eca76c397 100644 --- a/docker/Dockerfile +++ b/docker/Dockerfile @@ -11,16 +11,6 @@ RUN apt update --fix-missing \ g++ tmux git jq wget libncursesw5-dev libtool autoconf liblmdb-dev curl ca-certificates pkg-config \ && apt-get clean -# Download and setup JDK 24.0.1 -RUN mkdir -p /opt/java \ - && curl -L https://download.java.net/java/GA/jdk24.0.1/24a58e0e276943138bf3e963e6291ac2/9/GPL/openjdk-24.0.1_linux-x64_bin.tar.gz -o /opt/jdk.tar.gz \ - && tar -xzf /opt/jdk.tar.gz -C /opt/java \ - && rm /opt/jdk.tar.gz - -# Set JAVA_HOME and update PATH -ENV JAVA_HOME=/opt/java/jdk-24.0.1 -ENV PATH="${JAVA_HOME}/bin:${PATH}" - WORKDIR /root/src # Install ghcup @@ -178,12 +168,24 @@ RUN mkdir -p /root/.local/bin \ # Compile java applications FROM ubuntu:24.04 AS java-builder -WORKDIR /root/app - +# Install dependencies RUN apt update --fix-missing \ - && apt install -y --no-install-recommends maven \ + && apt install -y --no-install-recommends \ + maven curl \ && apt-get clean +# Download and setup JDK 24.0.1 +RUN mkdir -p /opt/java \ + && curl -L https://download.java.net/java/GA/jdk24.0.1/24a58e0e276943138bf3e963e6291ac2/9/GPL/openjdk-24.0.1_linux-x64_bin.tar.gz -o /opt/jdk.tar.gz \ + && tar -xzf /opt/jdk.tar.gz -C /opt/java \ + && rm /opt/jdk.tar.gz + +# Set JAVA_HOME and update PATH +ENV JAVA_HOME=/opt/java/jdk-24.0.1 +ENV PATH="${JAVA_HOME}/bin:${PATH}" + +WORKDIR /root/app + COPY ./pom.xml /root/app/pom.xml COPY ./api /root/app/api @@ -191,7 +193,7 @@ COPY ./yaci-indexer /root/app/yaci-indexer COPY ./test-data-generator /root/app/test-data-generator COPY ./.git /root/app/.git -RUN --mount=type=cache,target=/root/.m2 mvn clean package -am -DskipTests +RUN --mount=type=cache,target=/root/.m2 mvn -U clean package -DskipTests # Main FROM ubuntu:24.04 @@ -223,20 +225,9 @@ RUN sed -i "s|var/lib/postgresql/${PG_VERSION}/main|node/postgres|" /etc/postgre RUN mkdir -p /node/postgres RUN rm -rf /var/lib/postgresql/${PG_VERSION}/main -# Install jdk 21 RUN apt install -y --no-install-recommends jq bc sudo curl \ && apt clean -# Download and setup JDK 24.0.1 -RUN mkdir -p /opt/java \ - && curl -L https://download.java.net/java/GA/jdk24.0.1/24a58e0e276943138bf3e963e6291ac2/9/GPL/openjdk-24.0.1_linux-x64_bin.tar.gz -o /opt/jdk.tar.gz \ - && tar -xzf /opt/jdk.tar.gz -C /opt/java \ - && rm /opt/jdk.tar.gz - -# Set JAVA_HOME and update PATH -ENV JAVA_HOME=/opt/java/jdk-24.0.1 -ENV PATH="${JAVA_HOME}/bin:${PATH}" - # Copy cardano node COPY --from=cardano-builder /usr/local/lib /usr/local/lib COPY --from=cardano-builder /root/.local/bin/cardano-* /usr/local/bin/ From 252028ebcd321cb6a27a3786536faa06ee976dd6 Mon Sep 17 00:00:00 2001 From: VladislavKudrin Date: Thu, 5 Jun 2025 17:16:18 +0200 Subject: [PATCH 26/26] feat: postgres source building single docker (#481) * feat: postgres buiding from source - single docker image * feat: add missing jdk to the main image * feat: env --- docker/Dockerfile | 84 ++++++++++++++++++++++++++++---------------- docker/entrypoint.sh | 73 +++++++++++++++++++++++++++----------- 2 files changed, 105 insertions(+), 52 deletions(-) diff --git a/docker/Dockerfile b/docker/Dockerfile index eca76c397..457675147 100644 --- a/docker/Dockerfile +++ b/docker/Dockerfile @@ -195,44 +195,57 @@ COPY ./.git /root/app/.git RUN --mount=type=cache,target=/root/.m2 mvn -U clean package -DskipTests -# Main -FROM ubuntu:24.04 - -WORKDIR / +# Build postgres +FROM ubuntu:24.04 AS postgres-builder + +RUN apt update && apt install -y \ + build-essential \ + libreadline-dev \ + zlib1g-dev \ + flex \ + bison \ + wget \ + git \ + ca-certificates \ + sudo \ + locales \ + && sed -i '/en_US.UTF-8/s/^# //g' /etc/locale.gen \ + && locale-gen \ + && update-locale LANG=en_US.UTF-8 \ + && apt clean + +ENV PG_VERSION_TAG=REL_14_11 + +WORKDIR /usr/src + +RUN git clone --branch $PG_VERSION_TAG https://github.com/postgres/postgres.git \ + && cd postgres \ + && ./configure --prefix=/usr/local/pgsql \ + && make -j$(nproc) \ + && make install -# Install postgres -ARG PG_VERSION=14 -ARG PG_VERSION_TEMP=$PG_VERSION -ENV PG_VERSION=$PG_VERSION_TEMP -RUN apt update --fix-missing \ - && DEBIAN_FRONTEND=noninteractive apt install -y wget sudo gnupg \ - && wget --quiet -O - https://www.postgresql.org/media/keys/ACCC4CF8.asc | apt-key add - \ - && echo 'deb http://apt.postgresql.org/pub/repos/apt/ jammy-pgdg main' >> /etc/apt/sources.list \ - && apt-get clean - -RUN apt update --fix-missing \ - && DEBIAN_FRONTEND=noninteractive apt install -y --no-install-recommends \ - postgresql-${PG_VERSION} \ - && apt-get clean +# Main +FROM ubuntu:24.04 -# Allow remote connections -RUN echo "host all all 0.0.0.0/0 md5" >> /etc/postgresql/${PG_VERSION}/main/pg_hba.conf -# Listen on all interfaces -RUN echo "listen_addresses='*'" >> /etc/postgresql/${PG_VERSION}/main/postgresql.conf -# Change data directory path -RUN sed -i "s|var/lib/postgresql/${PG_VERSION}/main|node/postgres|" /etc/postgresql/${PG_VERSION}/main/postgresql.conf -RUN mkdir -p /node/postgres -RUN rm -rf /var/lib/postgresql/${PG_VERSION}/main +RUN apt update && apt install -y --no-install-recommends jq bc sudo curl \ + libreadline-dev \ + sudo \ + locales \ + && sed -i '/en_US.UTF-8/s/^# //g' /etc/locale.gen \ + && locale-gen \ + && update-locale LANG=en_US.UTF-8 \ + && apt clean -RUN apt install -y --no-install-recommends jq bc sudo curl \ - && apt clean +WORKDIR / # Copy cardano node COPY --from=cardano-builder /usr/local/lib /usr/local/lib COPY --from=cardano-builder /root/.local/bin/cardano-* /usr/local/bin/ COPY --from=cardano-builder /root/.local/bin/mithril-client /usr/local/bin/ COPY --from=cardano-builder /usr/local/src/cardano-node/cardano-submit-api/config/tx-submit-mainnet-config.yaml /cardano-submit-api-config/cardano-submit-api.yaml +ENV NODE_DATA="/node/db" +RUN mkdir -p $NODE_DATA # Link libsodium library COPY --from=cardano-builder --chown=root:root /usr/local/lib/libsodium.so /usr/local/lib @@ -253,12 +266,21 @@ ENV PATH=/usr/local/lib/:$PATH COPY ./config /networks RUN mkdir /config -RUN mkdir -p /node/db -RUN mkdir -p /node/postgres - # Copy jars COPY --from=java-builder /root/app/api/target/*.jar /api/app.jar COPY --from=java-builder /root/app/yaci-indexer/target/*.jar /yaci-indexer/app.jar +# Copy JDK +COPY --from=java-builder /opt/java/jdk-24.0.1 /opt/java/jdk-24.0.1 +ENV JAVA_HOME=/opt/java/jdk-24.0.1 +ENV PATH="${JAVA_HOME}/bin:${PATH}" + +# Copy and configure postgres +COPY --from=postgres-builder /usr/local/pgsql /usr/local/pgsql +ENV PG_BIN="/usr/local/pgsql/bin" +ENV PG_DATA="/var/lib/postgresql/data" +ENV PATH="$PG_BIN:$PATH" +RUN mkdir -p $PG_DATA +RUN useradd -m -U -s /bin/bash postgres # Run RUN mkdir /logs diff --git a/docker/entrypoint.sh b/docker/entrypoint.sh index 4053e1dcd..11f5fa3ab 100644 --- a/docker/entrypoint.sh +++ b/docker/entrypoint.sh @@ -9,6 +9,7 @@ function clean_up() { trap clean_up SIGHUP SIGINT SIGTERM +# NODE FUNCTIONS show_progress() { message="$1"; percent="$2" done=$(bc <<< "scale=0; 40 * ${percent%.*} / 100" ) @@ -68,15 +69,25 @@ node_synchronization() { echo "Node synchronization: DONE" } +# POSTGRES FUNCTIONS database_initialization() { - echo "Starting database initialization..." - echo "postgres" >> /tmp/password - initdb_command="/usr/lib/postgresql/$PG_VERSION/bin/initdb --pgdata=/node/postgres --auth=md5 --auth-local=md5 --auth-host=md5 --username=postgres --pwfile=/tmp/password" - sudo -H -u postgres bash -c "$initdb_command" + echo "postgres" > /tmp/password + echo "*:*:*:postgres:postgres" > /home/postgres/.pgpass + + chmod 600 /home/postgres/.pgpass + chown postgres:postgres /home/postgres/.pgpass + + if [ -z "$(ls -A "$PG_DATA")" ]; then + sudo -u postgres "$PG_BIN/initdb" --pgdata="$PG_DATA" --auth=md5 --auth-local=md5 --auth-host=md5 --username=postgres --pwfile=/tmp/password + else + echo "Database already initialized, skipping initdb." + fi + + rm -f /tmp/password } configure_postgres() { - local config_file="/etc/postgresql/${PG_VERSION}/main/postgresql.conf" + local config_file="$PG_DATA/postgresql.conf" # List of parameter names and their corresponding environment variables declare -A param_vars=( @@ -143,14 +154,29 @@ configure_postgres() { fi done + if ! grep -q "^host all all 0.0.0.0/0 md5\$" "$PG_DATA/pg_hba.conf"; then + echo "host all all 0.0.0.0/0 md5" >> "$PG_DATA/pg_hba.conf" + fi + + if ! grep -q "^listen_addresses *= *'\*'\$" "$PG_DATA/postgresql.conf"; then + echo "listen_addresses='*'" >> "$PG_DATA/postgresql.conf" + fi + echo "PostgreSQL configuration updated successfully!" } +start_postgres() { + sudo -u postgres "$PG_BIN/postgres" -D "$PG_DATA" -p "$DB_PORT" -c config_file="$PG_DATA/postgresql.conf" > /logs/postgres.log 2>&1 & + POSTGRES_PID=$! + + until "$PG_BIN/pg_isready" -U postgres > /dev/null; do sleep 1; done +} + create_database_and_user() { - export DB_SCHEMA=$NETWORK + export DB_SCHEMA="$NETWORK" flag=true - while [ $(sudo -u postgres psql -U postgres -Atc "SELECT pg_is_in_recovery()";) == "t" ]; do + while [ $(sudo -u postgres "$PG_BIN/psql" -U postgres -Atc "SELECT pg_is_in_recovery()";) == "t" ]; do if $flag ; then echo "Waiting for database recovery..." flag=false @@ -158,18 +184,21 @@ create_database_and_user() { sleep 1 done - if [[ -z $(sudo -u postgres psql -U postgres -Atc "SELECT 1 FROM pg_catalog.pg_user WHERE usename = '$DB_USER'";) ]]; then - echo "Creating database..." - sudo -u postgres psql -U postgres -c "CREATE ROLE \"$DB_USER\" with LOGIN CREATEDB PASSWORD '$DB_SECRET';" > /dev/null + if [[ -z $(sudo -u postgres "$PG_BIN/psql" -U postgres -Atc "SELECT 1 FROM pg_catalog.pg_user WHERE usename = '$DB_USER'";) ]]; then + echo "Creating database..." + sudo -u postgres "$PG_BIN/psql" -U postgres -c "CREATE ROLE \"$DB_USER\" with LOGIN CREATEDB PASSWORD '$DB_SECRET';" > /dev/null fi - if [[ -z $(sudo -u postgres psql -U postgres -Atc "SELECT 1 FROM pg_catalog.pg_database WHERE datname = '$DB_NAME'";) ]]; then - echo "Creating user..." - sudo -u postgres psql -U postgres -c "CREATE DATABASE \"$DB_NAME\";" >/dev/null - sudo -u postgres psql -U postgres -c "GRANT ALL PRIVILEGES ON DATABASE \"$DB_NAME\" to \"$DB_USER\";" > /dev/null + if [[ -z $(sudo -u postgres "$PG_BIN/psql" -U postgres -Atc "SELECT 1 FROM pg_catalog.pg_database WHERE datname = '$DB_NAME'";) ]]; then + echo "Creating user..." + sudo -u postgres "$PG_BIN/psql" -U postgres -c "CREATE DATABASE \"$DB_NAME\";" >/dev/null + sudo -u postgres "$PG_BIN/psql" -U postgres -c "GRANT ALL PRIVILEGES ON DATABASE \"$DB_NAME\" to \"$DB_USER\";" > /dev/null fi + + echo "User configured" } +# API FUNCTIONS get_current_index() { json="{\"network_identifier\":{\"blockchain\":\"cardano\",\"network\":\"${NETWORK}\"},\"metadata\":{}}" response=$(curl -s -X POST -H "Content-Type: application/json" -H "Content-length: 1000" -H "Host: localhost.com" --data "$json" "localhost:{$API_PORT}/network/status") @@ -177,6 +206,7 @@ get_current_index() { if [[ -z "$current_index" || "$current_index" == "null" ]]; then current_index=0; fi } +# MITHRIL FUNCTIONS download_mithril_snapshot() { echo "Downloading Mithril Snapshot..." export CARDANO_NETWORK=$NETWORK @@ -248,17 +278,18 @@ else cardano-submit-api --listen-address 0.0.0.0 --socket-path "$CARDANO_NODE_SOCKET_PATH" --port $NODE_SUBMIT_API_PORT $NETWORK_STR --config /cardano-submit-api-config/cardano-submit-api.yaml > /logs/submit-api.log & CARDANO_SUBMIT_PID=$! - mkdir -p /node/postgres - chown -R postgres:postgres /node/postgres - chmod -R 0700 /node/postgres - if [ ! -f "/node/postgres/PG_VERSION" ]; then - database_initialization - fi + echo "Initializing Database..." + chown -R postgres:postgres "$PG_DATA" + chmod -R 0700 "$PG_DATA" + database_initialization + echo "Configuring the Database..." configure_postgres echo "Starting Postgres..." - /etc/init.d/postgresql start + start_postgres + + echo "Creating database and user..." create_database_and_user echo "Starting Yaci indexer..."