Skip to content

Commit

Permalink
Add dockerfile for the demo client (#3)
Browse files Browse the repository at this point in the history
* Arseni- add

* Update Dockerfile-demo

* Arseni- add

* Arseni- add
  • Loading branch information
seniakalma authored Jul 29, 2024
1 parent cd44fce commit 26ac691
Show file tree
Hide file tree
Showing 4 changed files with 335 additions and 5 deletions.
49 changes: 49 additions & 0 deletions Dockerfile-demo
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
# Use a more recent Rust version
FROM rust:1.74.0

# Install system dependencies
RUN apt-get update && apt-get install -y \
sqlite3 \
libsqlite3-dev \
wget \
&& rm -rf /var/lib/apt/lists/*

# Set the working directory
WORKDIR /app

# Copy the entire repository
COPY . .

# Install diesel_cli with specific version
RUN cargo install [email protected] --no-default-features --features sqlite --locked

# Run migrations
RUN diesel migration run

# Build the application in release mode
RUN cargo build --release

# Install ipfs (for fetch-params.sh)
RUN wget https://dist.ipfs.io/go-ipfs/v0.9.1/go-ipfs_v0.9.1_linux-amd64.tar.gz && \
tar -xvzf go-ipfs_v0.9.1_linux-amd64.tar.gz && \
cd go-ipfs && \
bash install.sh && \
cd .. && \
rm -rf go-ipfs go-ipfs_v0.9.1_linux-amd64.tar.gz

# Make fetch-params.sh executable
RUN chmod +x fetch-params.sh

# Run fetch-params.sh
RUN ./fetch-params.sh

# Create necessary directories
RUN mkdir -p /root/.local/share/ZcashParams

# Set default environment variables
ENV ZCASH_NODE_ADDRESS=127.0.0.1
ENV ZCASH_NODE_PORT=18232
ENV ZCASH_NODE_PROTOCOL=http

# Set the entrypoint
ENTRYPOINT ["cargo", "run", "--release", "--package", "zcash_tx_tool", "--bin", "zcash_tx_tool", "test"]
30 changes: 29 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,7 @@ To build and run the docker image:
```bash
docker build -t qedit/zebra-singlenode-txv5 .

docker run -p 18232:18232 qedit/zebra-singlenode-txv5
docker run --name zebra-node -p 18232:18232 qedit/zebra-singlenode-txv5
```

More details on how the docker file is created and synced: [Link](https://github.com/QED-it/zcash_tx_tool/blob/main/Dockerfile)
Expand Down Expand Up @@ -85,3 +85,31 @@ With optional, but recommended `--release` flag, or simply
```bash
zcash_tx_tool test
```

You can also run the tests using docker. To do that you'll need first to build the docker image

```bash
docker build -t zcash_tx_tool -f Dockerfile-demo .
```

And after that run the image itself.
The default connection parameters are set to connect to the zebra-node running on the machine itself (127.0.0.1)
If you ran the node in a docker container with the command above, you named that container "zebra-node", so you should use that as the ZCASH_NODE_ADDRESS.
If the node is running on the ECS server, you can connect to it by setting the ZCASH_NODE_ADDRESS=<Domain>.

First, make sure you created the network:
```bash
docker network create zcash-network
```
And started the node with the network argument, like this
```bash
docker run --name zebra-node --network zcash-network -p 18232:18232 qedit/zebra-singlenode-txv5
```

Here are the 3 options (No parameters will default to the first configuration)

```bash
docker run --network zcash-network -e ZCASH_NODE_ADDRESS=127.0.0.1 -e ZCASH_NODE_PORT=18232 -e ZCASH_NODE_PROTOCOL=http zcash_tx_tool
docker run --network zcash-network -e ZCASH_NODE_ADDRESS=zebra-node -e ZCASH_NODE_PORT=18232 -e ZCASH_NODE_PROTOCOL=http zcash_tx_tool
docker run --network zcash-network -e ZCASH_NODE_ADDRESS=<Domain> -e ZCASH_NODE_PORT=18232 -e ZCASH_NODE_PROTOCOL=http zcash_tx_tool
```
247 changes: 247 additions & 0 deletions fetch-params.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,247 @@
#!/usr/bin/env bash

export LC_ALL=C
set -eu

SCRIPT_NAME=$(basename $0)

[[ -v XDG_CACHE_HOME ]] || XDG_CACHE_HOME="${HOME}/.cache"
# We don’t care too much about most of the properties of `XDG_RUNTIME_DIR` in
# this script, so we just fall back to `XDG_CACHE_HOME`.
[[ -v XDG_RUNTIME_DIR ]] || XDG_RUNTIME_DIR="${XDG_CACHE_HOME}"

uname_S=$(uname -s 2>/dev/null || echo not)

if [ "$uname_S" = "Darwin" ]; then
PARAMS_DIR="$HOME/Library/Application Support/ZcashParams"
else
PARAMS_DIR="$HOME/.zcash-params"
fi

# Commented out because these are unused; see below.
#SPROUT_PKEY_NAME='sprout-proving.key'
#SPROUT_VKEY_NAME='sprout-verifying.key'
SAPLING_SPEND_NAME='sapling-spend.params'
SAPLING_OUTPUT_NAME='sapling-output.params'
SAPLING_SPROUT_GROTH16_NAME='sprout-groth16.params'
DOWNLOAD_URL="https://download.z.cash/downloads"
IPFS_HASH="/ipfs/QmXRHVGLQBiKwvNq7c2vPxAKz1zRVmMYbmt7G5TQss7tY7"

SHA256CMD="$(command -v sha256sum || echo shasum)"
SHA256ARGS="$(command -v sha256sum >/dev/null || echo '-a 256')"

WGETCMD="$(command -v wget || echo '')"
IPFSCMD="$(command -v ipfs || echo '')"
CURLCMD="$(command -v curl || echo '')"

# fetch methods can be disabled with ZC_DISABLE_SOMETHING=1
ZC_DISABLE_WGET="${ZC_DISABLE_WGET:-}"
ZC_DISABLE_IPFS="${ZC_DISABLE_IPFS:-}"
ZC_DISABLE_CURL="${ZC_DISABLE_CURL:-}"

LOCK_DIR="${XDG_RUNTIME_DIR}/zcash"
mkdir -p "${LOCK_DIR}"
LOCKFILE="${LOCK_DIR}/fetch-params.lock"

fetch_wget() {
if [ -z "$WGETCMD" ] || [ -n "$ZC_DISABLE_WGET" ]; then
return 1
fi

cat <<EOF
Retrieving (wget): $DOWNLOAD_URL/$1
EOF

wget \
--progress=dot:giga \
--output-document="$2" \
--continue \
--retry-connrefused --waitretry=3 --timeout=30 \
"$DOWNLOAD_URL/$1"
}

fetch_ipfs() {
if [ -z "$IPFSCMD" ] || [ -n "$ZC_DISABLE_IPFS" ]; then
return 1
fi

cat <<EOF
Retrieving (ipfs): $IPFS_HASH/$1
EOF

ipfs get --output "$2" "$IPFS_HASH/$1"
}

fetch_curl() {
if [ -z "$CURLCMD" ] || [ -n "$ZC_DISABLE_CURL" ]; then
return 1
fi

cat <<EOF
Retrieving (curl): $DOWNLOAD_URL/$1
EOF

curl \
--output "$2" \
-# -L -C - \
"$DOWNLOAD_URL/$1"

}

fetch_failure() {
cat >&2 <<EOF
Failed to fetch the Zcash zkSNARK parameters!
Try installing one of the following programs and make sure you're online:
* ipfs
* wget
* curl
EOF
exit 1
}

fetch_params() {
# We only set these variables inside this function,
# and unset them at the end of the function.
filename="$1"
output="$2"
dlname="${output}.dl"
expectedhash="$3"

if ! [ -f "$output" ]
then
for i in 1 2
do
for method in wget ipfs curl failure; do
if "fetch_$method" "${filename}.part.${i}" "${dlname}.part.${i}"; then
echo "Download of part ${i} successful!"
break
fi
done
done

for i in 1 2
do
if ! [ -f "${dlname}.part.${i}" ]
then
fetch_failure
fi
done

cat "${dlname}.part.1" "${dlname}.part.2" > "${dlname}"
rm "${dlname}.part.1" "${dlname}.part.2"

"$SHA256CMD" $SHA256ARGS -c <<EOF
$expectedhash $dlname
EOF

# Check the exit code of the shasum command:
CHECKSUM_RESULT=$?
if [ $CHECKSUM_RESULT -eq 0 ]; then
mv -v "$dlname" "$output"
else
echo "Failed to verify parameter checksums!" >&2
exit 1
fi
fi

unset -v filename
unset -v output
unset -v dlname
unset -v expectedhash
}

# Use flock to prevent parallel execution.
lock() {
if [ "$uname_S" = "Darwin" ]; then
if shlock -f ${LOCKFILE} -p $$; then
return 0
else
return 1
fi
else
# create lock file
eval "exec 9>$LOCKFILE"
# acquire the lock
flock -n 9 \
&& return 0 \
|| return 1
fi
}

exit_locked_error() {
echo "Only one instance of ${SCRIPT_NAME} can be run at a time." >&2
echo "If you are certain no other instance is running, you can try removing" >&2
echo "${LOCKFILE}" >&2
exit 1
}

main() {

lock \
|| exit_locked_error

cat <<EOF
Zcash - ${SCRIPT_NAME}
This script will fetch the Zcash zkSNARK parameters and verify their
integrity with sha256sum.
If they already exist locally, it will exit now and do nothing else.
EOF

# Now create PARAMS_DIR and insert a README if necessary:
if ! [ -d "$PARAMS_DIR" ]
then
mkdir -p "$PARAMS_DIR"
README_PATH="$PARAMS_DIR/README"
cat >> "$README_PATH" <<EOF
This directory stores common Zcash zkSNARK parameters. Note that it is
distinct from the daemon's -datadir argument because the parameters are
large and may be shared across multiple distinct -datadir's such as when
setting up test networks.
EOF

# This may be the first time the user's run this script, so give
# them some info, especially about bandwidth usage:
cat <<EOF
The complete parameters are currently just under 800MB in size, so plan
accordingly for your bandwidth constraints. If the files are already
present and have the correct sha256sum, no networking is used.
Creating params directory. For details about this directory, see:
$README_PATH
EOF
fi

cd "$PARAMS_DIR"

# Sprout parameters:
# Commented out because they are unneeded, but we will eventually update
# this to delete the parameters if possible.
#fetch_params "$SPROUT_PKEY_NAME" "$PARAMS_DIR/$SPROUT_PKEY_NAME" "8bc20a7f013b2b58970cddd2e7ea028975c88ae7ceb9259a5344a16bc2c0eef7"
#fetch_params "$SPROUT_VKEY_NAME" "$PARAMS_DIR/$SPROUT_VKEY_NAME" "4bd498dae0aacfd8e98dc306338d017d9c08dd0918ead18172bd0aec2fc5df82"

# Sapling parameters:
fetch_params "$SAPLING_SPEND_NAME" "$PARAMS_DIR/$SAPLING_SPEND_NAME" "8e48ffd23abb3a5fd9c5589204f32d9c31285a04b78096ba40a79b75677efc13"
fetch_params "$SAPLING_OUTPUT_NAME" "$PARAMS_DIR/$SAPLING_OUTPUT_NAME" "2f0ebbcbb9bb0bcffe95a397e7eba89c29eb4dde6191c339db88570e3f3fb0e4"
fetch_params "$SAPLING_SPROUT_GROTH16_NAME" "$PARAMS_DIR/$SAPLING_SPROUT_GROTH16_NAME" "b685d700c60328498fbde589c8c7c484c722b788b265b72af448a5bf0ee55b50"
}

if [ "${1:-}" = '--testnet' ]
then
echo "NOTE: testnet now uses the mainnet parameters, so the --testnet argument"
echo "is no longer needed (ignored)"
echo ""
fi

main
rm -f $LOCKFILE
exit 0

14 changes: 10 additions & 4 deletions src/config.rs
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
//! for specifying it.
use serde::{Deserialize, Serialize};
use std::env;

/// Application Configuration
#[derive(Clone, Debug, Deserialize, Serialize)]
Expand Down Expand Up @@ -55,9 +56,14 @@ pub struct NetworkConfig {
impl Default for NetworkConfig {
fn default() -> Self {
Self {
node_address: "127.0.0.1".to_string(),
node_port: 18232,
protocol: "http".to_string(),
node_address: env::var("ZCASH_NODE_ADDRESS")
.unwrap_or_else(|_| "127.0.0.1".to_string()),
node_port: env::var("ZCASH_NODE_PORT")
.ok()
.and_then(|s| s.parse().ok())
.unwrap_or(18232),
protocol: env::var("ZCASH_NODE_PROTOCOL")
.unwrap_or_else(|_| "http".to_string()),
}
}
}
Expand All @@ -80,4 +86,4 @@ impl Default for ChainConfig {
nu5_activation_height: 1_060_755, // NU5 activation height for shorter chain, should be in sync with node's chain params
}
}
}
}

0 comments on commit 26ac691

Please sign in to comment.