]> Git Repo - VerusCoin.git/blob - zcutil/fetch-params.sh
Merge branch 'dev' into jl777
[VerusCoin.git] / zcutil / fetch-params.sh
1 #!/bin/bash
2
3 set -eu
4
5 PARAMS_DIR="$HOME/.zcash-params"
6
7 SPROUT_PKEY_NAME='sprout-proving.key'
8 SPROUT_VKEY_NAME='sprout-verifying.key'
9 SPROUT_URL="https://z.cash/downloads"
10 SPROUT_IPFS="/ipfs/QmZKKx7Xup7LiAtFRhYsE1M7waXcv9ir9eCECyXAFGxhEo"
11
12 SHA256CMD="$(command -v sha256sum || echo shasum)"
13 SHA256ARGS="$(command -v sha256sum >/dev/null || echo '-a 256')"
14
15 WGETCMD="$(command -v wget || echo '')"
16 IPFSCMD="$(command -v ipfs || echo '')"
17
18 # fetch methods can be disabled with ZC_DISABLE_SOMETHING=1
19 ZC_DISABLE_WGET="${ZC_DISABLE_WGET:-}"
20 ZC_DISABLE_IPFS="${ZC_DISABLE_IPFS:-}"
21
22 function fetch_wget {
23     if [ -z "$WGETCMD" ] || ! [ -z "$ZC_DISABLE_WGET" ]; then
24         return 1
25     fi
26
27     local filename="$1"
28     local dlname="$2"
29
30     cat <<EOF
31
32 Retrieving (wget): $SPROUT_URL/$filename
33 EOF
34
35     wget \
36         --progress=dot:giga \
37         --output-document="$dlname" \
38         --continue \
39         --retry-connrefused --waitretry=3 --timeout=30 \
40         "$SPROUT_URL/$filename"
41 }
42
43 function fetch_ipfs {
44     if [ -z "$IPFSCMD" ] || ! [ -z "$ZC_DISABLE_IPFS" ]; then
45         return 1
46     fi
47
48     local filename="$1"
49     local dlname="$2"
50
51     cat <<EOF
52
53 Retrieving (ipfs): $SPROUT_IPFS/$filename
54 EOF
55
56     ipfs get --output "$dlname" "$SPROUT_IPFS/$filename"
57 }
58
59 function fetch_failure {
60     cat >&2 <<EOF
61
62 Failed to fetch the Zcash zkSNARK parameters!
63 Try installing one of the following programs and make sure you're online:
64
65  * ipfs
66  * wget
67
68 EOF
69     exit 1
70 }
71
72 function fetch_params {
73     local filename="$1"
74     local output="$2"
75     local dlname="${output}.dl"
76     local expectedhash="$3"
77
78     if ! [ -f "$output" ]
79     then
80         for method in wget ipfs failure; do
81             if "fetch_$method" "$filename" "$dlname"; then
82                 echo "Download successful!"
83                 break
84             fi
85         done
86
87         "$SHA256CMD" $SHA256ARGS -c <<EOF
88 $expectedhash  $dlname
89 EOF
90
91         # Check the exit code of the shasum command:
92         CHECKSUM_RESULT=$?
93         if [ $CHECKSUM_RESULT -eq 0 ]; then
94             mv -v "$dlname" "$output"
95         else
96             echo "Failed to verify parameter checksums!" >&2
97             exit 1
98         fi
99     fi
100 }
101
102 # Use flock to prevent parallel execution.
103 function lock() {
104     local lockfile=/tmp/fetch_params.lock
105     # create lock file
106     eval "exec 200>/$lockfile"
107     # acquire the lock
108     flock -n 200 \
109         && return 0 \
110         || return 1
111 }
112
113 function exit_locked_error {
114     echo "Only one instance of fetch-params.sh can be run at a time." >&2
115     exit 1
116 }
117
118 function main() {
119
120     lock fetch-params.sh \
121     || exit_locked_error
122
123     cat <<EOF
124 Zcash - fetch-params.sh
125
126 This script will fetch the Zcash zkSNARK parameters and verify their
127 integrity with sha256sum.
128
129 If they already exist locally, it will exit now and do nothing else.
130 EOF
131
132     # Now create PARAMS_DIR and insert a README if necessary:
133     if ! [ -d "$PARAMS_DIR" ]
134     then
135         mkdir -p "$PARAMS_DIR"
136         README_PATH="$PARAMS_DIR/README"
137         cat >> "$README_PATH" <<EOF
138 This directory stores common Zcash zkSNARK parameters. Note that it is
139 distinct from the daemon's -datadir argument because the parameters are
140 large and may be shared across multiple distinct -datadir's such as when
141 setting up test networks.
142 EOF
143
144         # This may be the first time the user's run this script, so give
145         # them some info, especially about bandwidth usage:
146         cat <<EOF
147 The parameters are currently just under 911MB in size, so plan accordingly
148 for your bandwidth constraints. If the files are already present and
149 have the correct sha256sum, no networking is used.
150
151 Creating params directory. For details about this directory, see:
152 $README_PATH
153
154 EOF
155     fi
156
157     cd "$PARAMS_DIR"
158
159     fetch_params "$SPROUT_PKEY_NAME" "$PARAMS_DIR/$SPROUT_PKEY_NAME" "8bc20a7f013b2b58970cddd2e7ea028975c88ae7ceb9259a5344a16bc2c0eef7"
160     fetch_params "$SPROUT_VKEY_NAME" "$PARAMS_DIR/$SPROUT_VKEY_NAME" "4bd498dae0aacfd8e98dc306338d017d9c08dd0918ead18172bd0aec2fc5df82"
161 }
162
163 main
164 rm -f /tmp/fetch_params.lock
165 exit 0
This page took 0.033801 seconds and 4 git commands to generate.