From 216b9ab715b207d0c79562a70f5b830718befa9a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rafael=20C=C3=A1rdenas?= Date: Wed, 1 Dec 2021 17:03:21 -0600 Subject: [PATCH] feat: docker cleanup * cleaning up docker feat/cleanup needed it's own cleanup since it was so out of date. better to just start over with an up to date pull of develop * Update paths for docker-compose files * Updating paths and compose version * switch network to testnet * adjusting stacks-blockchain configs * use correct context to build api image * use the defaults from develop branch * feat: update to latest stacks blockchain * fix: rosetta output paths * chore: update stacks api to v0.71.2 Co-authored-by: Charlie <2747302+CharlieC3@users.noreply.github.com> * fix: remove magic_byte from mainnet toml Co-authored-by: Charlie <2747302+CharlieC3@users.noreply.github.com> * fix: update stacks node everywhere Co-authored-by: wileyj <2847772+wileyj@users.noreply.github.com> Co-authored-by: Charlie <2747302+CharlieC3@users.noreply.github.com> --- .github/workflows/stacks-blockchain-api.yml | 2 +- .gitpod.Dockerfile | 2 +- docker/.gitignore | 2 + .../docker-compose.dev.bitcoind.yml | 5 +- .../docker-compose.dev.postgres.yml | 0 .../docker-compose.dev.rosetta-cli.yml | 3 +- ...compose.dev.stacks-blockchain-follower.yml | 6 +- .../docker-compose.dev.stacks-blockchain.yml | 6 +- .../docker-compose.override.yml | 0 .../docker-compose.yml | 10 +- .../stx-rosetta.Dockerfile | 41 +++--- follower.Dockerfile | 120 ------------------ package.json | 14 +- rosetta-cli-config/docker/Dockerfile | 8 +- .../docker/start-construction.sh | 3 + rosetta-cli-config/docker/start-data.sh | 3 + .../envs/env.construction | 2 +- .../validate-construction.ts | 39 ++---- src/tests-rosetta-cli-data/envs/env.data | 2 +- .../validate-rosetta.ts | 36 ++---- stacks-blockchain/Stacks-mainnet.toml | 14 ++ stacks-blockchain/Stacks-testnet.toml | 37 ++++++ stacks-blockchain/docker/Dockerfile | 2 +- 23 files changed, 136 insertions(+), 221 deletions(-) create mode 100644 docker/.gitignore rename docker-compose.dev.bitcoind.yml => docker/docker-compose.dev.bitcoind.yml (86%) rename docker-compose.dev.postgres.yml => docker/docker-compose.dev.postgres.yml (100%) rename docker-compose.dev.rosetta-cli.yml => docker/docker-compose.dev.rosetta-cli.yml (78%) rename docker-compose.dev.stacks-blockchain-follower.yml => docker/docker-compose.dev.stacks-blockchain-follower.yml (67%) rename docker-compose.dev.stacks-blockchain.yml => docker/docker-compose.dev.stacks-blockchain.yml (70%) rename docker-compose.override.yml => docker/docker-compose.override.yml (100%) rename docker-compose.yml => docker/docker-compose.yml (85%) rename stx-rosetta.Dockerfile => docker/stx-rosetta.Dockerfile (81%) delete mode 100644 follower.Dockerfile create mode 100644 rosetta-cli-config/docker/start-construction.sh create mode 100644 rosetta-cli-config/docker/start-data.sh create mode 100644 stacks-blockchain/Stacks-mainnet.toml create mode 100644 stacks-blockchain/Stacks-testnet.toml diff --git a/.github/workflows/stacks-blockchain-api.yml b/.github/workflows/stacks-blockchain-api.yml index 79d5c856..75f1f354 100644 --- a/.github/workflows/stacks-blockchain-api.yml +++ b/.github/workflows/stacks-blockchain-api.yml @@ -467,7 +467,7 @@ jobs: - name: Build/Tag/Push standalone Image uses: docker/build-push-action@v1 with: - dockerfile: follower.Dockerfile + dockerfile: docker/stx-rosetta.Dockerfile repository: blockstack/${{ github.workflow }}-standalone username: ${{ secrets.DOCKERHUB_USERNAME }} password: ${{ secrets.DOCKERHUB_PASSWORD }} diff --git a/.gitpod.Dockerfile b/.gitpod.Dockerfile index a9fe4fdb..7e3fab0d 100644 --- a/.gitpod.Dockerfile +++ b/.gitpod.Dockerfile @@ -1,4 +1,4 @@ -FROM blockstack/stacks-blockchain:2.0.11.2.0-stretch as corenode +FROM blockstack/stacks-blockchain:2.05.0.0.0-stretch as corenode FROM gitpod/workspace-postgres diff --git a/docker/.gitignore b/docker/.gitignore new file mode 100644 index 00000000..2aef0776 --- /dev/null +++ b/docker/.gitignore @@ -0,0 +1,2 @@ +rosetta-output/ +rosetta-output-construction/ diff --git a/docker-compose.dev.bitcoind.yml b/docker/docker-compose.dev.bitcoind.yml similarity index 86% rename from docker-compose.dev.bitcoind.yml rename to docker/docker-compose.dev.bitcoind.yml index 353cc11a..3ed5851c 100644 --- a/docker-compose.dev.bitcoind.yml +++ b/docker/docker-compose.dev.bitcoind.yml @@ -1,11 +1,12 @@ -version: '3.7' +version: "3" services: bitcoind: - image: "ruimarinho/bitcoin-core:0.19.1-alpine" + image: "blockstack/bitcoind:v0.20.99.0" ports: - "18443:18443" - "18444:18444" command: + /usr/local/bin/bitcoind -printtoconsole -regtest=1 -txindex=1 diff --git a/docker-compose.dev.postgres.yml b/docker/docker-compose.dev.postgres.yml similarity index 100% rename from docker-compose.dev.postgres.yml rename to docker/docker-compose.dev.postgres.yml diff --git a/docker-compose.dev.rosetta-cli.yml b/docker/docker-compose.dev.rosetta-cli.yml similarity index 78% rename from docker-compose.dev.rosetta-cli.yml rename to docker/docker-compose.dev.rosetta-cli.yml index 2f356fbd..75705387 100644 --- a/docker-compose.dev.rosetta-cli.yml +++ b/docker/docker-compose.dev.rosetta-cli.yml @@ -2,9 +2,8 @@ version: '3.7' services: rosetta-cli: build: - context: ./rosetta-cli-config + context: ../rosetta-cli-config dockerfile: docker/Dockerfile command: ${CMD} volumes: - ${OUTPUT} - diff --git a/docker-compose.dev.stacks-blockchain-follower.yml b/docker/docker-compose.dev.stacks-blockchain-follower.yml similarity index 67% rename from docker-compose.dev.stacks-blockchain-follower.yml rename to docker/docker-compose.dev.stacks-blockchain-follower.yml index 1f1e6ccd..7c2f2c0f 100644 --- a/docker-compose.dev.stacks-blockchain-follower.yml +++ b/docker/docker-compose.dev.stacks-blockchain-follower.yml @@ -2,7 +2,7 @@ version: '3.7' services: stacks-blockchain: build: - context: ./stacks-blockchain/docker + context: ../stacks-blockchain/docker command: stacks-node start --config=/app/config/Stacks-follower.toml restart: on-failure environment: @@ -12,5 +12,5 @@ services: - "20443:20443" - "20444:20444" volumes: - - ./stacks-blockchain/:/app/config - - ./stacks-blockchain/.chaindata:/tmp/stacks-blockchain-data + - ../stacks-blockchain/:/app/config + - ../stacks-blockchain/.chaindata:/tmp/stacks-blockchain-data diff --git a/docker-compose.dev.stacks-blockchain.yml b/docker/docker-compose.dev.stacks-blockchain.yml similarity index 70% rename from docker-compose.dev.stacks-blockchain.yml rename to docker/docker-compose.dev.stacks-blockchain.yml index 61303368..5a876418 100644 --- a/docker-compose.dev.stacks-blockchain.yml +++ b/docker/docker-compose.dev.stacks-blockchain.yml @@ -2,7 +2,7 @@ version: '3.7' services: stacks-blockchain: build: - context: ./stacks-blockchain/docker + context: ../stacks-blockchain/docker command: stacks-node start --config=/app/config/Stacks-dev.toml restart: on-failure environment: @@ -13,5 +13,5 @@ services: - "20443:20443" - "20444:20444" volumes: - - ./stacks-blockchain/:/app/config - - ./stacks-blockchain/.chaindata:/tmp/stacks-blockchain-data + - ../stacks-blockchain/:/app/config + - ../stacks-blockchain/.chaindata:/tmp/stacks-blockchain-data diff --git a/docker-compose.override.yml b/docker/docker-compose.override.yml similarity index 100% rename from docker-compose.override.yml rename to docker/docker-compose.override.yml diff --git a/docker-compose.yml b/docker/docker-compose.yml similarity index 85% rename from docker-compose.yml rename to docker/docker-compose.yml index b6af4e88..8222c281 100644 --- a/docker-compose.yml +++ b/docker/docker-compose.yml @@ -13,7 +13,7 @@ services: - backend stacks-blockchain: build: - context: ./stacks-blockchain/docker + context: ../stacks-blockchain/docker command: stacks-node start --config=/app/config/Stacks-follower.toml restart: on-failure environment: @@ -24,13 +24,13 @@ services: - "20443:20443" - "20444:20444" volumes: - - ./stacks-blockchain/:/app/config - - ./stacks-blockchain/.chaindata:/tmp/stacks-blockchain-data + - ../stacks-blockchain/:/app/config + - ../stacks-blockchain/.chaindata:/tmp/stacks-blockchain-data networks: - backend stacks-blockchain-api: build: - context: . + context: .. restart: on-failure environment: PG_HOST: postgres @@ -50,7 +50,7 @@ services: - "3999:3999" - "9153:9153" volumes: - - ./stacks-blockchain/:/app/config + - ../stacks-blockchain/:/app/config networks: - backend depends_on: diff --git a/stx-rosetta.Dockerfile b/docker/stx-rosetta.Dockerfile similarity index 81% rename from stx-rosetta.Dockerfile rename to docker/stx-rosetta.Dockerfile index 726d90aa..d5d9a0ba 100644 --- a/stx-rosetta.Dockerfile +++ b/docker/stx-rosetta.Dockerfile @@ -1,15 +1,20 @@ -ARG STACKS_API_VERSION=v0.63.0 -ARG STACKS_NODE_VERSION=2.0.11.2.0 -ARG STACKS_API_REPO=hirosystems/stacks-blockchain-api +ARG STACKS_API_VERSION=v0.71.2 +ARG STACKS_NODE_VERSION=2.05.0.0.0 +ARG STACKS_API_REPO=blockstack/stacks-blockchain-api ARG STACKS_NODE_REPO=blockstack/stacks-blockchain ARG PG_VERSION=12 -ARG STACKS_NETWORK=testnet +ARG STACKS_NETWORK=mainnet ARG STACKS_LOG_DIR=/var/log/stacks-node ARG STACKS_SVC_DIR=/etc/service ARG STACKS_BLOCKCHAIN_DIR=/stacks-blockchain ARG STACKS_BLOCKCHAIN_API_DIR=/stacks-blockchain-api -ARG PG_DATA=/data/postgres ARG V2_POX_MIN_AMOUNT_USTX=90000000260 +ARG PG_DATA=/data/postgres +ARG PG_DATABASE=postgres +ARG PG_HOST=127.0.0.1 +ARG PG_PORT=5432 +ARG PG_USER=postgres +ARG PG_PASSWORD=postgres ####################################################################### ## Build the stacks-blockchain-api @@ -60,13 +65,17 @@ ARG STACKS_BLOCKCHAIN_API_DIR ARG PG_DATA ARG PG_VERSION ARG V2_POX_MIN_AMOUNT_USTX -ENV PG_HOST=127.0.0.1 -ENV PG_PORT=5432 -ENV PG_USER=postgres -ENV PG_PASSWORD=postgres -ENV PG_DATABASE=postgres +ARG PG_HOST +ARG PG_PORT +ARG PG_USER +ARG PG_PASSWORD +ARG PG_DATABASE +ENV PG_HOST=${PG_HOST} +ENV PG_PORT=${PG_PORT} +ENV PG_USER=${PG_USER} +ENV PG_PASSWORD=${PG_PASSWORD} +ENV PG_DATABASE=${PG_DATABASE} ENV PG_DATA=${PG_DATA} -ENV PG_VERSION=${PG_VERSION} ENV STACKS_SVC_DIR=${STACKS_SVC_DIR} ENV STACKS_BLOCKCHAIN_DIR=${STACKS_BLOCKCHAIN_DIR} ENV STACKS_BLOCKCHAIN_API_DIR=${STACKS_BLOCKCHAIN_API_DIR} @@ -79,6 +88,7 @@ ENV STACKS_BLOCKCHAIN_API_PORT=3999 ENV STACKS_BLOCKCHAIN_API_HOST=0.0.0.0 ENV STACKS_CORE_RPC_HOST=127.0.0.1 ENV STACKS_CORE_RPC_PORT=20443 +ENV STACKS_CORE_P2P_PORT=20444 ENV MAINNET_STACKS_CHAIN_ID=0x00000001 ENV TESTNET_STACKS_CHAIN_ID=0x80000000 ENV V2_POX_MIN_AMOUNT_USTX=${V2_POX_MIN_AMOUNT_USTX} @@ -110,15 +120,14 @@ RUN mkdir -p \ && rm -rf /var/cache/apt/* /var/lib/apt/lists/* /tmp/* ${STACKS_SVC_DIR}/getty* COPY --from=stacks-blockchain-build /out ${STACKS_BLOCKCHAIN_DIR} COPY --from=stacks-blockchain-api-build /app ${STACKS_BLOCKCHAIN_API_DIR} -RUN cp ${STACKS_BLOCKCHAIN_API_DIR}/stacks-blockchain/Stacks-mocknet.toml ${STACKS_BLOCKCHAIN_DIR}/Stacks-testnet.toml \ - && cp ${STACKS_BLOCKCHAIN_API_DIR}/stacks-blockchain/Stacks-mocknet.toml ${STACKS_BLOCKCHAIN_DIR}/Stacks-mocknet.toml +COPY stacks-blockchain/Stacks-*.toml ${STACKS_BLOCKCHAIN_DIR}/ ################################### ## runit service files RUN printf '#!/bin/sh\nexec 2>&1\n[ ! -d %s ] && mkdir -p %s && chown -R postgres:postgres %s && gosu postgres /usr/lib/postgresql/%s/bin/pg_ctl init -D %s\nexec gosu postgres /usr/lib/postgresql/%s/bin/postmaster -D %s' ${PG_DATA} ${PG_DATA} ${PG_DATA} ${PG_VERSION} ${PG_DATA} ${PG_VERSION} ${PG_DATA} > ${STACKS_SVC_DIR}/postgresql/run \ && printf '#!/bin/sh\nrm -rf %s' ${PG_DATA} > ${STACKS_SVC_DIR}/postgresql/finish \ && printf '#!/bin/sh\nexec svlogd -tt %s/postgresql' ${STACKS_LOG_DIR} > ${STACKS_SVC_DIR}/postgresql/log/run \ - && printf '#!/bin/sh\nexec 2>&1\nif [ $STACKS_NETWORK != "mainnet" ]; then\n exec %s/stacks-node start --config=%s/Stacks-testnet.toml 2>&1\nelse\n exec %s/stacks-node mainnet 2>&1\nfi' ${STACKS_BLOCKCHAIN_DIR} ${STACKS_BLOCKCHAIN_DIR} ${STACKS_BLOCKCHAIN_DIR} > ${STACKS_SVC_DIR}/stacks-blockchain/run \ + && printf '#!/bin/sh\nexec 2>&1\ncase $STACKS_NETWORK in\n testnet)\n exec %s/stacks-node start --config=%s/Stacks-testnet.toml 2>&1\n ;;\n mocknet)\n exec %s/stacks-node start --config=%s/Stacks-mocknet.toml 2>&1\n ;;\n *)\n exec %s/stacks-node start --config=%s/Stacks-mainnet.toml 2>&1\n ;;\nesac' ${STACKS_BLOCKCHAIN_DIR} ${STACKS_BLOCKCHAIN_DIR} ${STACKS_BLOCKCHAIN_DIR} ${STACKS_BLOCKCHAIN_DIR} ${STACKS_BLOCKCHAIN_DIR} ${STACKS_BLOCKCHAIN_DIR} > ${STACKS_SVC_DIR}/stacks-blockchain/run \ && printf '#!/bin/bash\nexec 2>&1\nsv start postgresql stacks-blockchain || exit 1\nif [ $STACKS_NETWORK != "mainnet" ]; then\n export STACKS_CHAIN_ID=%s\nelse\n export STACKS_CHAIN_ID=%s\n export V2_POX_MIN_AMOUNT_USTX=%s\nfi\ncd %s && exec node ./lib/index.js 2>&1' ${TESTNET_STACKS_CHAIN_ID} ${MAINNET_STACKS_CHAIN_ID} ${V2_POX_MIN_AMOUNT_USTX} ${STACKS_BLOCKCHAIN_API_DIR} > ${STACKS_SVC_DIR}/stacks-blockchain-api/run \ && printf '#!/bin/sh\nexec svlogd -tt %s/stacks-blockchain-api' ${STACKS_LOG_DIR} > ${STACKS_SVC_DIR}/stacks-blockchain-api/log/run \ && printf '#!/bin/sh\n/usr/bin/runsvdir %s' ${STACKS_SVC_DIR} > /entrypoint.sh \ @@ -131,6 +140,6 @@ RUN printf '#!/bin/sh\nexec 2>&1\n[ ! -d %s ] && mkdir -p %s && chown -R postgre ${STACKS_SVC_DIR}/stacks-blockchain-api/log/run \ /entrypoint.sh -EXPOSE ${STACKS_BLOCKCHAIN_API_PORT} ${STACKS_CORE_RPC_PORT} +EXPOSE ${STACKS_BLOCKCHAIN_API_PORT} ${STACKS_CORE_RPC_PORT} ${STACKS_CORE_P2P_PORT} VOLUME /data -ENTRYPOINT ["/entrypoint.sh"] +CMD ["/entrypoint.sh"] diff --git a/follower.Dockerfile b/follower.Dockerfile deleted file mode 100644 index dcb6f38a..00000000 --- a/follower.Dockerfile +++ /dev/null @@ -1,120 +0,0 @@ -### Build blockstack-core-sidecar API -FROM node:14-alpine as build -WORKDIR /app -COPY . . -RUN apk add --no-cache --virtual .build-deps alpine-sdk python2 git openjdk8-jre -RUN echo "GIT_TAG=$(git tag --points-at HEAD)" >> .env -RUN npm config set unsafe-perm true && npm install && npm run build && npm prune --production - -### Fetch stacks-node binary -FROM blockstack/stacks-blockchain:2.0.11.2.0-stretch as stacks-node-build - -### Begin building base image -FROM ubuntu:focal - -SHELL ["/bin/bash", "-c"] - -### Install utils -RUN apt-get update -RUN apt-get install -y sudo curl pslist - -### Install nodejs -RUN curl -sL https://deb.nodesource.com/setup_14.x | bash - -RUN apt-get install -y nodejs - -### Set noninteractive apt-get -RUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections - -### stacky user ### -# see https://docs.docker.com/develop/develop-images/dockerfile_best-practices/#user -RUN useradd -l -u 33333 -G sudo -md /home/stacky -s /bin/bash -p stacky stacky \ - # passwordless sudo for users in the 'sudo' group - && sed -i.bkp -e 's/%sudo\s\+ALL=(ALL\(:ALL\)\?)\s\+ALL/%sudo ALL=NOPASSWD:ALL/g' /etc/sudoers -ENV HOME=/home/stacky -WORKDIR $HOME -USER stacky -RUN sudo chown -R stacky:stacky $HOME -RUN mkdir /home/stacky/.bashrc.d - -### Setup stacks-node -COPY --from=stacks-node-build /bin/stacks-node stacks-node/ -ENV PATH="$PATH:$HOME/stacks-node" - -#### Copy stacks-node mocknet config -COPY ./stacks-blockchain/Stacks-mocknet.toml ./ - -### Setup stacks-blockchain-api -COPY --from=build /app stacks-blockchain-api -RUN sudo chown -Rh stacky:stacky stacks-blockchain-api -RUN printf '#!/bin/bash\ncd $(dirname $0)\nnpm run start\n' > stacks-blockchain-api/stacks_api \ - && chmod +x stacks-blockchain-api/stacks_api -ENV PATH="$PATH:$HOME/stacks-blockchain-api" -EXPOSE 3999 - -### Install Postgres -RUN sudo apt-get install -y postgresql-12 postgresql-contrib-12 - -### Setup Postgres -# Borrowed from https://github.com/gitpod-io/workspace-images/blob/master/postgres/Dockerfile -ENV PATH="$PATH:/usr/lib/postgresql/12/bin" -ENV PGDATA="/home/stacky/.pgsql/data" -RUN mkdir -p ~/.pg_ctl/bin ~/.pg_ctl/sockets \ - && printf '#!/bin/bash\n[ ! -d $PGDATA ] && mkdir -p $PGDATA && initdb -D $PGDATA\npg_ctl -D $PGDATA -l ~/.pg_ctl/log -o "-k ~/.pg_ctl/sockets" start\n' > ~/.pg_ctl/bin/pg_start \ - && printf '#!/bin/bash\npg_ctl -D $PGDATA -l ~/.pg_ctl/log -o "-k ~/.pg_ctl/sockets" stop\n' > ~/.pg_ctl/bin/pg_stop \ - && chmod +x ~/.pg_ctl/bin/* -ENV PATH="$PATH:$HOME/.pg_ctl/bin" - -### Clear caches -RUN sudo apt-get clean && sudo rm -rf /var/cache/apt/* /var/lib/apt/lists/* /tmp/* - -### Setup service env vars -ENV PG_HOST=127.0.0.1 -ENV PG_PORT=5432 -ENV PG_USER=stacky -ENV PG_PASSWORD=postgres -ENV PG_DATABASE=postgres - -ENV STACKS_CORE_EVENT_PORT=3700 -ENV STACKS_CORE_EVENT_HOST=127.0.0.1 - -ENV STACKS_EVENT_OBSERVER=127.0.0.1:3700 - -ENV STACKS_BLOCKCHAIN_API_PORT=3999 -ENV STACKS_BLOCKCHAIN_API_HOST=0.0.0.0 - -ENV STACKS_CORE_RPC_HOST=127.0.0.1 -ENV STACKS_CORE_RPC_PORT=20443 - -### Startup script & coordinator -RUN printf '#!/bin/bash\n\ -MAINNET_ID=0x00000001\n\ -MOCKNET_ID=0x80000000\n\ -[ $1 = "mocknet" ] && STACKS_CHAIN_ID="${MOCKNET_ID}" || STACKS_CHAIN_ID="${MAINNET_ID}"\n\ -export STACKS_CHAIN_ID\n\ -trap "exit" INT TERM\n\ -trap "kill 0" EXIT\n\ -echo Your container args are: "$@"\n\ -tail --retry -F stacks-api.log stacks-node.log 2>&1 &\n\ -while true\n\ -do\n\ - pg_start\n\ - stacks_api &> stacks-api.log &\n\ - stacks_api_pid=$!\n\ - if [ $1 = "mocknet" ]; then\n\ - stacks-node start --config=/home/stacky/Stacks-mocknet.toml &> stacks-node.log &\n\ - else\n\ - stacks-node mainnet &> stacks-node.log &\n\ - fi\n\ - stacks_node_pid=$!\n\ - wait $stacks_node_pid\n\ - echo "node exit, restarting..."\n\ - rkill -9 $stacks_api_pid\n\ - pg_stop\n\ - rm -rf $PGDATA\n\ - sleep 5\n\ -done\n\ -' >> run.sh && chmod +x run.sh - -ENTRYPOINT ["/home/stacky/run.sh"] - -CMD ["/home/stacky/run.sh"] diff --git a/package.json b/package.json index 5602ff43..c9f4d919 100644 --- a/package.json +++ b/package.json @@ -30,13 +30,13 @@ "lint:prettier": "prettier --check src/**/*.{ts,json}", "lint:fix": "eslint . --ext .js,.jsx,.ts,.tsx -f codeframe --fix && prettier --write --check src/**/*.{ts,json}", "migrate": "node-pg-migrate -m src/migrations", - "devenv:build": "docker-compose -f docker-compose.dev.postgres.yml -f docker-compose.dev.stacks-blockchain.yml -f docker-compose.dev.bitcoind.yml -f docker-compose.dev.rosetta-cli.yml build --no-cache", - "devenv:deploy": "docker-compose -f docker-compose.dev.postgres.yml -f docker-compose.dev.stacks-blockchain.yml -f docker-compose.dev.bitcoind.yml up", - "devenv:deploy:pg": "docker-compose -f docker-compose.dev.postgres.yml up", - "devenv:follower": "docker-compose -f docker-compose.dev.postgres.yml -f docker-compose.dev.stacks-blockchain-follower.yml up", - "devenv:stop": "docker-compose -f docker-compose.dev.postgres.yml -f docker-compose.dev.stacks-blockchain.yml -f docker-compose.dev.bitcoind.yml down -v -t 0", - "devenv:stop:pg": "docker-compose -f docker-compose.dev.postgres.yml kill", - "devenv:logs": "docker-compose -f docker-compose.dev.postgres.yml -f docker-compose.dev.stacks-blockchain.yml -f docker-compose.dev.bitcoind.yml logs -t -f" + "devenv:build": "docker-compose -f docker/docker-compose.dev.postgres.yml -f docker/docker-compose.dev.stacks-blockchain.yml -f docker/docker-compose.dev.bitcoind.yml -f docker/docker-compose.dev.rosetta-cli.yml build --no-cache", + "devenv:deploy": "docker-compose -f docker/docker-compose.dev.postgres.yml -f docker/docker-compose.dev.stacks-blockchain.yml -f docker/docker-compose.dev.bitcoind.yml up", + "devenv:deploy:pg": "docker-compose -f docker/docker-compose.dev.postgres.yml up", + "devenv:follower": "docker-compose -f docker/docker-compose.dev.postgres.yml -f docker/docker-compose.dev.stacks-blockchain-follower.yml up", + "devenv:stop": "docker-compose -f docker/docker-compose.dev.postgres.yml -f docker/docker-compose.dev.stacks-blockchain.yml -f docker/docker-compose.dev.bitcoind.yml down -v -t 0", + "devenv:stop:pg": "docker-compose -f docker/docker-compose.dev.postgres.yml kill", + "devenv:logs": "docker-compose -f docker/docker-compose.dev.postgres.yml -f docker/docker-compose.dev.stacks-blockchain.yml -f docker/docker-compose.dev.bitcoind.yml logs -t -f" }, "repository": { "type": "git", diff --git a/rosetta-cli-config/docker/Dockerfile b/rosetta-cli-config/docker/Dockerfile index 37f8a1ec..ff1ebedf 100644 --- a/rosetta-cli-config/docker/Dockerfile +++ b/rosetta-cli-config/docker/Dockerfile @@ -16,9 +16,15 @@ RUN mkdir -p /bin /app COPY --from=build /bin/rosetta-cli /bin/ -COPY docker/docker-entrypoint.sh /bin +COPY docker/docker-entrypoint.sh /bin/ RUN chmod +x /bin/docker-entrypoint.sh +COPY docker/start-construction.sh /bin/ +RUN chmod +x /bin/start-construction.sh + +COPY docker/start-data.sh /bin/ +RUN chmod +x /bin/start-data.sh + COPY . /app WORKDIR /app diff --git a/rosetta-cli-config/docker/start-construction.sh b/rosetta-cli-config/docker/start-construction.sh new file mode 100644 index 00000000..94313c00 --- /dev/null +++ b/rosetta-cli-config/docker/start-construction.sh @@ -0,0 +1,3 @@ +#!/usr/bin/env bash +/bin/rosetta-cli --configuration-file /app/rosetta-config-docker.json check:construction +chmod -R 777 /app/rosetta-output diff --git a/rosetta-cli-config/docker/start-data.sh b/rosetta-cli-config/docker/start-data.sh new file mode 100644 index 00000000..ca41fdb2 --- /dev/null +++ b/rosetta-cli-config/docker/start-data.sh @@ -0,0 +1,3 @@ +#!/usr/bin/env bash +/bin/rosetta-cli --configuration-file /app/rosetta-config-docker.json check:data +chmod -R 777 /app/rosetta-output diff --git a/src/tests-rosetta-cli-construction/envs/env.construction b/src/tests-rosetta-cli-construction/envs/env.construction index 0fc6ad0f..cdec89de 100644 --- a/src/tests-rosetta-cli-construction/envs/env.construction +++ b/src/tests-rosetta-cli-construction/envs/env.construction @@ -1,2 +1,2 @@ -CMD=/bin/rosetta-cli --configuration-file /app/rosetta-config-docker.json check:construction +CMD="/bin/start-construction.sh" OUTPUT=./rosetta-output-construction:/app/rosetta-output diff --git a/src/tests-rosetta-cli-construction/validate-construction.ts b/src/tests-rosetta-cli-construction/validate-construction.ts index d895ecfa..47a87262 100644 --- a/src/tests-rosetta-cli-construction/validate-construction.ts +++ b/src/tests-rosetta-cli-construction/validate-construction.ts @@ -9,11 +9,9 @@ import { StacksTestnet } from '@stacks/network'; import * as BN from 'bn.js'; import * as fs from 'fs'; import { StacksCoreRpcClient, getCoreNodeEndpoint } from '../core-rpc/client'; +import { timeout } from '../helpers'; import * as compose from 'docker-compose'; import * as path from 'path'; -import Docker = require('dockerode'); - -const docker = new Docker(); const sender1 = { address: 'STB44HYPYAT2BB2QE513NSP81HTMYWBJP02HPGK6', @@ -26,22 +24,6 @@ const HOST = 'localhost'; const PORT = 20443; const stacksNetwork = GetStacksTestnetNetwork(); -const isContainerRunning = async (name: string): Promise => - new Promise((resolve, reject): void => { - docker.listContainers((err: any, containers: any): void => { - if (err) { - reject(err); - } - - const running = (containers || []).filter((container: any): boolean => - // eslint-disable-next-line @typescript-eslint/no-unsafe-return - container.Names.includes(name) - ); - - resolve(running.length > 0); - }); - }); - describe('Rosetta API', () => { let db: PgDataStore; let client: PoolClient; @@ -57,16 +39,13 @@ describe('Rosetta API', () => { eventServer = await startEventServer({ datastore: db, chainId: ChainID.Testnet }); api = await startApiServer({ datastore: db, chainId: ChainID.Testnet }); - // remove previous outputs if any - fs.rmdirSync('rosetta-output-construction', { recursive: true }); - // build rosetta-cli container await compose.buildOne('rosetta-cli', { cwd: path.join(__dirname, '../../'), log: true, composeOptions: [ '-f', - 'docker-compose.dev.rosetta-cli.yml', + 'docker/docker-compose.dev.rosetta-cli.yml', '--env-file', 'src/tests-rosetta-cli-construction/envs/env.construction', ], @@ -77,7 +56,7 @@ describe('Rosetta API', () => { log: true, composeOptions: [ '-f', - 'docker-compose.dev.rosetta-cli.yml', + 'docker/docker-compose.dev.rosetta-cli.yml', '--env-file', 'src/tests-rosetta-cli-construction/envs/env.construction', ], @@ -85,18 +64,20 @@ describe('Rosetta API', () => { }); await waitForBlock(api); - // await sleep(10000); + await transferStx(recipientAdd1, 1000000000, sender1.privateKey, api); await transferStx(recipientAdd1, 1000000000, sender1.privateKey, api); await transferStx(recipientAdd1, 1000000000, sender1.privateKey, api); await transferStx(recipientAdd1, 1000000000, sender1.privateKey, api); await transferStx(recipientAdd1, 1000000000, sender1.privateKey, api); - //wait on rosetta-cli to finish output + // Wait on rosetta-cli to finish output while (!rosettaOutput) { - if (fs.existsSync('rosetta-output-construction/rosetta-cli-output-const.json')) - rosettaOutput = require('../../rosetta-output-construction/rosetta-cli-output-const.json'); - await sleep(1000); + if (fs.existsSync('docker/rosetta-output-construction/rosetta-cli-output-const.json')) { + rosettaOutput = require('../../docker/rosetta-output-construction/rosetta-cli-output-const.json'); + } else { + await timeout(1000); + } } }); diff --git a/src/tests-rosetta-cli-data/envs/env.data b/src/tests-rosetta-cli-data/envs/env.data index 8f119ccf..db0b017d 100644 --- a/src/tests-rosetta-cli-data/envs/env.data +++ b/src/tests-rosetta-cli-data/envs/env.data @@ -1,2 +1,2 @@ -CMD=/bin/rosetta-cli --configuration-file /app/rosetta-config-docker.json check:data +CMD="/bin/start-data.sh" OUTPUT=./rosetta-output:/app/rosetta-output diff --git a/src/tests-rosetta-cli-data/validate-rosetta.ts b/src/tests-rosetta-cli-data/validate-rosetta.ts index b9e7bfa5..4dfbb494 100644 --- a/src/tests-rosetta-cli-data/validate-rosetta.ts +++ b/src/tests-rosetta-cli-data/validate-rosetta.ts @@ -26,9 +26,6 @@ import { StacksCoreRpcClient, getCoreNodeEndpoint } from '../core-rpc/client'; import { timeout, unwrapOptional } from '../helpers'; import * as compose from 'docker-compose'; import * as path from 'path'; -import Docker = require('dockerode'); - -const docker = new Docker(); const sender1 = { address: 'STF9B75ADQAVXQHNEQ6KGHXTG7JP305J2GRWF3A2', @@ -97,22 +94,6 @@ const HOST = 'localhost'; const PORT = 20443; const stacksNetwork = getStacksTestnetNetwork(); -const isContainerRunning = async (name: string): Promise => - new Promise((resolve, reject): void => { - docker.listContainers((err: any, containers: any): void => { - if (err) { - reject(err); - } - - const running = (containers || []).filter((container: any): boolean => - // eslint-disable-next-line @typescript-eslint/no-unsafe-return - container.Names.includes(name) - ); - - resolve(running.length > 0); - }); - }); - describe('Rosetta API', () => { let db: PgDataStore; let client: PoolClient; @@ -128,16 +109,13 @@ describe('Rosetta API', () => { eventServer = await startEventServer({ datastore: db, chainId: ChainID.Testnet }); api = await startApiServer({ datastore: db, chainId: ChainID.Testnet }); - // remove previous outputs if any - fs.rmdirSync('rosetta-output', { recursive: true }); - // build rosetta-cli container await compose.buildOne('rosetta-cli', { cwd: path.join(__dirname, '../../'), log: true, composeOptions: [ '-f', - 'docker-compose.dev.rosetta-cli.yml', + 'docker/docker-compose.dev.rosetta-cli.yml', '--env-file', 'src/tests-rosetta-cli-data/envs/env.data', ], @@ -148,7 +126,7 @@ describe('Rosetta API', () => { log: true, composeOptions: [ '-f', - 'docker-compose.dev.rosetta-cli.yml', + 'docker/docker-compose.dev.rosetta-cli.yml', '--env-file', 'src/tests-rosetta-cli-data/envs/env.data', ], @@ -177,11 +155,13 @@ describe('Rosetta API', () => { await callContractFunction(api, sender2.privateKey, contract, 'say-hi'); } - //wait on rosetta-cli to finish output + // Wait on rosetta-cli to finish output while (!rosettaOutput) { - if (fs.existsSync('rosetta-output')) - rosettaOutput = require('../../rosetta-output/rosetta-cli-output.json'); - await timeout(1000); + if (fs.existsSync('docker/rosetta-output/rosetta-cli-output.json')) { + rosettaOutput = require('../../docker/rosetta-output/rosetta-cli-output.json'); + } else { + await timeout(1000); + } } }); diff --git a/stacks-blockchain/Stacks-mainnet.toml b/stacks-blockchain/Stacks-mainnet.toml new file mode 100644 index 00000000..78fc13cd --- /dev/null +++ b/stacks-blockchain/Stacks-mainnet.toml @@ -0,0 +1,14 @@ +[node] +rpc_bind = "0.0.0.0:20443" +p2p_bind = "0.0.0.0:20444" +bootstrap_node = "02da7a464ac770ae8337a343670778b93410f2f3fef6bea98dd1c3e9224459d36b@seed-0.mainnet.stacks.co:20444,02afeae522aab5f8c99a00ddf75fbcb4a641e052dd48836408d9cf437344b63516@seed-1.mainnet.stacks.co:20444,03652212ea76be0ed4cd83a25c06e57819993029a7b9999f7d63c36340b34a4e62@seed-2.mainnet.stacks.co:20444" +# working_dir = "/tmp/stacks-blockchain-data" + +[burnchain] +chain = "bitcoin" +mode = "mainnet" +peer_host = "bitcoin.blockstack.com" +username = "blockstack" +password = "blockstacksystem" +rpc_port = 8332 +peer_port = 8333 diff --git a/stacks-blockchain/Stacks-testnet.toml b/stacks-blockchain/Stacks-testnet.toml new file mode 100644 index 00000000..b447d406 --- /dev/null +++ b/stacks-blockchain/Stacks-testnet.toml @@ -0,0 +1,37 @@ +[node] +rpc_bind = "0.0.0.0:20443" +p2p_bind = "0.0.0.0:20444" +bootstrap_node = "047435c194e9b01b3d7f7a2802d6684a3af68d05bbf4ec8f17021980d777691f1d51651f7f1d566532c804da506c117bbf79ad62eea81213ba58f8808b4d9504ad@testnet.stacks.co:20444" +# working_dir = "/tmp/stacks-blockchain-data" + + +[burnchain] +chain = "bitcoin" +mode = "xenon" +peer_host = "bitcoind.testnet.stacks.co" +username = "blockstack" +password = "blockstacksystem" +rpc_port = 18332 +peer_port = 18333 + +# Used for sending events to a local stacks-blockchain-api service +[[events_observer]] +endpoint = "localhost:3700" +retry_count = 255 +events_keys = ["*"] + +[[mstx_balance]] +address = "ST2QKZ4FKHAH1NQKYKYAYZPY440FEPK7GZ1R5HBP2" +amount = 10000000000000000 + +[[mstx_balance]] +address = "ST319CF5WV77KYR1H3GT0GZ7B8Q4AQPY42ETP1VPF" +amount = 10000000000000000 + +[[mstx_balance]] +address = "ST221Z6TDTC5E0BYR2V624Q2ST6R0Q71T78WTAX6H" +amount = 10000000000000000 + +[[mstx_balance]] +address = "ST2TFVBMRPS5SSNP98DQKQ5JNB2B6NZM91C4K3P7B" +amount = 10000000000000000 diff --git a/stacks-blockchain/docker/Dockerfile b/stacks-blockchain/docker/Dockerfile index 366e7c9c..190f5ca7 100644 --- a/stacks-blockchain/docker/Dockerfile +++ b/stacks-blockchain/docker/Dockerfile @@ -1,4 +1,4 @@ -FROM blockstack/stacks-blockchain:2.0.11.2.0-stretch as build +FROM blockstack/stacks-blockchain:2.05.0.0.0-stretch as build FROM debian:stretch