diff --git a/.dockerignore b/.dockerignore
index 46c3ebed..dbc99a6b 100644
--- a/.dockerignore
+++ b/.dockerignore
@@ -1,6 +1,6 @@
 # Generated by Cargo
 # will have compiled files and executables
-/target/
+target/
 
 # Remove Cargo.lock from gitignore if creating an executable, leave it for libraries
 # More information here https://doc.rust-lang.org/cargo/guide/cargo-toml-vs-cargo-lock.html
diff --git a/.github/actions/deps/action.yaml b/.github/actions/deps/action.yaml
index aff79b69..8bd69a1c 100644
--- a/.github/actions/deps/action.yaml
+++ b/.github/actions/deps/action.yaml
@@ -22,11 +22,20 @@ runs:
         unzip /tmp/protoc.zip -d ${HOME}/.local
         echo "PROTOC=${HOME}/.local/bin/protoc" >> $GITHUB_ENV
         export PATH="${PATH}:${HOME}/.local/bin"
+    - name: Setup sccache
+      uses: mozilla-actions/sccache-action@v0.0.3
+    - name: Set sccache variables
+      shell: bash
+      run: |
+        echo SCCACHE_GHA_ENABLED=true >> $GITHUB_ENV
+        echo RUSTC_WRAPPER=sccache >> $GITHUB_ENV
     - name: Rust cache
       uses: Swatinem/rust-cache@v2
       with:
-        cache-directories: |
-          proto/src/prost
-    - name: Compile Protobuf definitions
+        # Don't cache ./target, as it takes tons of space, use sccache instead.
+        cache-targets: false
+        # We set a shared key, as our cache is reusable between jobs
+        shared-key: rust-cargo
+    - name: "Compile Protobuf definitions (needed by fmt, doc, etc.)"
       shell: bash
       run: cargo build -p tenderdash-proto
diff --git a/.github/workflows/docker.yml b/.github/workflows/docker.yml
new file mode 100644
index 00000000..23d03fab
--- /dev/null
+++ b/.github/workflows/docker.yml
@@ -0,0 +1,65 @@
+---
+name: Docker
+
+on:
+  workflow_dispatch:
+  pull_request:
+    paths-ignore:
+      - "docs/**"
+  push:
+    paths-ignore:
+      - "docs/**"
+    branches:
+      - master
+      - "v*.*.*"
+
+jobs:
+  build:
+    strategy:
+      matrix:
+        os: [alpine, debian]
+    runs-on: ubuntu-22.04
+    steps:
+      - uses: actions/checkout@v3
+
+      - name: Setup sccache
+        uses: mozilla-actions/sccache-action@v0.0.3
+
+      - name: Set up QEMU
+        uses: docker/setup-qemu-action@master
+        with:
+          platforms: amd64
+
+      - name: Set up Docker Build
+        uses: docker/setup-buildx-action@v2.4.1
+
+      # ARM build takes very long time, so we build PRs for AMD64 only
+      - name: Select target platform
+        id: select_platforms
+        run: |
+          if  [[ "${GITHUB_EVENT_NAME}" == "pull_request" ]] ; then
+            echo "build_platforms=linux/amd64" >> $GITHUB_ENV
+          else
+            echo "build_platforms=linux/amd64,linux/arm64" >> $GITHUB_ENV
+          fi
+
+      - name: Build Docker sample image
+        id: docker_build
+        uses: docker/build-push-action@v4.0.0
+        with:
+          context: .
+          file: ./Dockerfile-${{ matrix.os }}
+          build-args: |
+            REVISION=${{ github.ref }}
+            SCCACHE_GHA_ENABLED=true
+            ACTIONS_CACHE_URL=${{ env.ACTIONS_CACHE_URL }}
+            ACTIONS_RUNTIME_TOKEN=${{ env.ACTIONS_RUNTIME_TOKEN }}
+          platforms: ${{ env.build_platforms }}
+          push: false
+          cache-from: |
+            type=gha
+          cache-to: |
+            type=gha,mode=max
+
+      - name: Show Docker image digest
+        run: echo ${{ steps.docker_build.outputs.digest }}
diff --git a/Dockerfile-alpine b/Dockerfile-alpine
new file mode 100644
index 00000000..c05b353a
--- /dev/null
+++ b/Dockerfile-alpine
@@ -0,0 +1,68 @@
+# This is an example Dockerfile, demonstrating build process of rs-tenderdash-abci
+
+# rust:alpine3.17, published Mar 24, 2023 at 2:55 am
+FROM rust:alpine3.17
+
+RUN apk add --no-cache \
+        git \
+        wget \
+        alpine-sdk \
+        openssl-dev \
+        libc6-compat \
+        perl \
+        unzip \
+        sccache \
+        bash
+
+SHELL ["/bin/bash", "-c"]
+
+# one of: aarch_64, x86_64
+# ARG PROTOC_ARCH=x86_64
+ARG TARGETPLATFORM
+ARG BUILDPLATFORM
+
+# Install protoc - protobuf compiler
+# The one shipped with Alpine does not work
+RUN if [[ "$BUILDPLATFORM" == "linux/arm64" ]] ; then export PROTOC_ARCH=aarch_64; else export PROTOC_ARCH=x86_64 ; fi; \
+    wget -q -O /tmp/protoc.zip https://github.com/protocolbuffers/protobuf/releases/download/v22.2/protoc-22.2-linux-${PROTOC_ARCH}.zip && \
+    unzip -qd /opt/protoc /tmp/protoc.zip && \
+    rm /tmp/protoc.zip && \
+    ln -s /opt/protoc/bin/protoc /usr/bin/
+
+# Set RUSTC_WRAPPER=/usr/bin/sccache to enable `sccache` caching.
+ARG RUSTC_WRAPPER=/usr/bin/sccache
+# These should be set for Github Actions caching
+ARG SCCACHE_GHA_ENABLED
+ARG ACTIONS_CACHE_URL
+ARG ACTIONS_RUNTIME_TOKEN
+
+# Create a dummy package
+RUN cargo init /usr/src/abci-app
+WORKDIR /usr/src/abci-app
+
+# Let's display ABCI version instead of "hello world"
+RUN sed -i'' -e  's/println!("Hello, world!");/println!("ABCI version: {}",tenderdash_abci::proto::ABCI_VERSION);/' src/main.rs
+
+# revspec or SHA of commit/branch/tag to use
+ARG REVISION="refs/heads/master"
+
+# Add tenderdash-abci as a dependency and build the package
+#
+# Some notes here:
+# 1. All these --mount... are to cache reusable info between runs.
+# See https://doc.rust-lang.org/cargo/guide/cargo-home.html#caching-the-cargo-home-in-ci
+# 2. We add `--config net.git-fetch-with-cli=true` to address ARM build issue,
+# see https://github.com/rust-lang/cargo/issues/10781#issuecomment-1441071052
+# 3. To preserve space on github cache, we call `cargo clean`.
+# 4. We set SCCACHE_SERVER_PORT to avoid conflicts during parallel builds
+RUN --mount=type=cache,sharing=shared,target=/root/.cache/sccache \
+    --mount=type=cache,sharing=shared,target=${CARGO_HOME}/registry/index \
+    --mount=type=cache,sharing=shared,target=${CARGO_HOME}/registry/cache \
+    --mount=type=cache,sharing=shared,target=${CARGO_HOME}/git/db \
+    SCCACHE_SERVER_PORT=$((RANDOM+1025)) cargo add --config net.git-fetch-with-cli=true \
+        --git https://github.com/dashpay/rs-tenderdash-abci --rev "${REVISION}" tenderdash-abci && \
+    cargo build --config net.git-fetch-with-cli=true && \
+    cargo run --config net.git-fetch-with-cli=true && \
+    cargo clean && \
+    sccache --show-stats
+
diff --git a/Dockerfile-debian b/Dockerfile-debian
new file mode 100644
index 00000000..d758fd19
--- /dev/null
+++ b/Dockerfile-debian
@@ -0,0 +1,62 @@
+# This is an example Dockerfile, demonstrating build process of rs-tenderdash-abci
+
+# We use Debian base image, as Alpine has some segmentation fault issue
+FROM rust:bullseye
+
+RUN --mount=type=cache,sharing=locked,target=/var/lib/apt/lists \
+    --mount=type=cache,sharing=locked,target=/var/cache/apt \
+    rm -f /etc/apt/apt.conf.d/docker-clean && \
+    apt-get update -qq && \
+    apt-get install -qq --yes \
+        protobuf-compiler \
+        git \
+        wget \
+        bash
+
+
+#
+# Install sccache - build cache for Rust.
+# This is optional, but it will speed up the build process 
+#
+ARG SCCACHE_URL="https://github.com/mozilla/sccache/releases/download/v0.4.0/sccache-v0.4.0-x86_64-unknown-linux-musl.tar.gz"
+RUN wget -q -O /tmp/sccache.tar.gz ${SCCACHE_URL} \
+    && mkdir -p /tmp/sccache \
+    && tar -z -C /tmp/sccache -xf /tmp/sccache.tar.gz \
+    && mv /tmp/sccache/sccache*/sccache /usr/bin/sccache \
+    && rm -r /tmp/sccache.tar.gz /tmp/sccache
+
+# Set RUSTC_WRAPPER=/usr/bin/sccache to enable `sccache` caching.
+ARG RUSTC_WRAPPER=/usr/bin/sccache
+# These should be set for Github Actions caching
+ARG SCCACHE_GHA_ENABLED
+ARG ACTIONS_CACHE_URL
+ARG ACTIONS_RUNTIME_TOKEN
+
+# Create a dummy package
+RUN cargo init /usr/src/abci-app
+WORKDIR /usr/src/abci-app
+
+
+# revspec or SHA of commit/branch/tag to use
+ARG REVISION="refs/heads/master"
+
+SHELL ["/bin/bash", "-c"]
+
+# Add tenderdash-abci as a dependency and build the package
+#
+# Some notes here:
+# 1. All these --mount... are to cache reusable info between runs.
+# See https://doc.rust-lang.org/cargo/guide/cargo-home.html#caching-the-cargo-home-in-ci
+# 2. We add `--config net.git-fetch-with-cli=true` to address ARM build issue,
+# see https://github.com/rust-lang/cargo/issues/10781#issuecomment-1441071052
+# 3. To preserve space on github cache, we call `cargo clean`.
+# 4. We set SCCACHE_SERVER_PORT to avoid conflicts during parallel builds
+RUN --mount=type=cache,sharing=shared,target=/root/.cache/sccache \
+    --mount=type=cache,sharing=shared,target=${CARGO_HOME}/registry/index \
+    --mount=type=cache,sharing=shared,target=${CARGO_HOME}/registry/cache \
+    --mount=type=cache,sharing=shared,target=${CARGO_HOME}/git/db \
+    SCCACHE_SERVER_PORT=$((RANDOM+1025)) cargo add --config net.git-fetch-with-cli=true \
+        --git https://github.com/dashpay/rs-tenderdash-abci --rev "${REVISION}" tenderdash-abci && \
+    cargo build --config net.git-fetch-with-cli=true && \
+    cargo clean && \
+    sccache --show-stats
diff --git a/proto-compiler/Cargo.toml b/proto-compiler/Cargo.toml
index 2af58944..b034cae6 100644
--- a/proto-compiler/Cargo.toml
+++ b/proto-compiler/Cargo.toml
@@ -12,8 +12,8 @@ publish = false
 walkdir = { version = "2.3" }
 prost-build = { version = "0.11" }
 tempfile = { version = "3.2.0" }
-subtle-encoding = { version = "0.5" }
 regex = { "version" = "1.7.1" }
-reqwest = { "version" = "0.11.16", features = ["blocking"] }
+# Use of native-tls-vendored should build vendored openssl, which is required for Alpine build
+ureq = { "version" = "2.6.2" }
 zip = { version = "0.6.4", default-features = false, features = ["deflate"] }
 fs_extra = { version = "1.3.0" }
diff --git a/proto-compiler/src/functions.rs b/proto-compiler/src/functions.rs
index 658b5c2e..72e64481 100644
--- a/proto-compiler/src/functions.rs
+++ b/proto-compiler/src/functions.rs
@@ -51,15 +51,10 @@ fn download_and_unzip(url: &str, archive_file: &Path, dest_dir: &Path) {
     // We download only if the file does not exist
     if !archive_file.is_file() {
         let mut file = File::create(archive_file).expect("cannot create file");
-
-        let mut rb = reqwest::blocking::get(url).expect("cannot download archive");
-        if !rb.status().is_success() {
-            panic!(
-                "cannot download tenderdash sources from {url}: {:?}",
-                rb.status()
-            )
-        }
-        rb.copy_to(&mut file).expect("cannot save downloaded data");
+        let rb = ureq::get(url).call().expect("cannot download archive");
+        // let mut rb = reqwest::blocking::get(url).expect("cannot download archive");
+        let mut reader = rb.into_reader();
+        std::io::copy(&mut reader, &mut file).expect("cannot save downloaded data");
         file.flush().expect("flush of archive file failed");
     }
 
diff --git a/proto/Cargo.toml b/proto/Cargo.toml
index a12d799d..a4b5bd7d 100644
--- a/proto/Cargo.toml
+++ b/proto/Cargo.toml
@@ -17,12 +17,8 @@ all-features = true
 
 [dependencies]
 prost = { version = "0.11", default-features = false }
-prost-types = { version = "0.11", default-features = false }
 bytes = { version = "1.0", default-features = false, features = ["serde"] }
 serde = { version = "1.0", default-features = false, features = ["derive"] }
-serde_bytes = { version = "0.11", default-features = false, features = [
-    "alloc",
-] }
 subtle-encoding = { version = "0.5", default-features = false, features = [
     "hex",
     "base64",