|
1 | 1 | #!/bin/bash |
2 | 2 | # scripts/bash/bitcoin/install-crypto-binaries.sh |
3 | | -# Downloads and installs Bitcoin Core (v24–31), Dashcoin, Starcoin, and Litecoin |
4 | | -# Reads version/coin config from configuration/nwe-config.xml <crypto-binaries> block |
5 | | -# Installs to scripts/bash/bitcoin/{version}/ and symlinks to /usr/local/bin/ |
6 | | -# |
7 | | -# Usage: sudo bash scripts/bash/bitcoin/install-crypto-binaries.sh [btc|dash|star|ltc|all] |
| 3 | +# Downloads and installs Bitcoin Core (v24–31), Dashcoin, Starcoin, and Litecoin. |
| 4 | +# Bitcoin Core installation is fail-closed on missing or invalid SHA-256 checksums. |
8 | 5 |
|
9 | | -set -e |
| 6 | +set -euo pipefail |
10 | 7 |
|
11 | 8 | SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)" |
12 | | -PROJECT_ROOT="$(cd "$SCRIPT_DIR/../../.." && pwd)" |
13 | 9 | INSTALL_BASE="${SCRIPT_DIR}" |
14 | 10 | TARGET="${1:-all}" |
15 | | - |
16 | | -# Bitcoin Core URLs (v24–31) |
17 | 11 | BTC_BASE="https://bitcoincore.org/bin/bitcoin-core-" |
18 | 12 | BTC_VERSIONS=(24.2 25.2 26.2 27.1 28.1 29.0 30.0 31.0) |
19 | | - |
20 | | -# Altcoin URLs |
21 | 13 | DASH_VERSION="21.1.1" |
22 | 14 | DASH_URL="https://github.com/dashpay/dash/releases/download/v${DASH_VERSION}/dashcore-${DASH_VERSION}-x86_64-linux-gnu.tar.gz" |
23 | | - |
24 | 15 | LITECOIN_VERSION="0.21.3" |
25 | 16 | LITECOIN_URL="https://download.litecoin.org/litecoin-${LITECOIN_VERSION}/linux/litecoin-${LITECOIN_VERSION}-x86_64-linux-gnu.tar.gz" |
26 | | - |
27 | 17 | STARCOIN_VERSION="1.13.7" |
28 | 18 | STARCOIN_URL="https://github.com/starcoinorg/starcoin/releases/download/v${STARCOIN_VERSION}/starcoin-ubuntu-v${STARCOIN_VERSION}.zip" |
29 | 19 |
|
| 20 | +verify_bitcoin_checksum() { |
| 21 | + local tarball="$1" |
| 22 | + local sums="$2" |
| 23 | + local expected |
| 24 | + expected="$(awk -v f="$tarball" '$2 == f || $2 == "*" f {print $1; exit}' "$sums")" |
| 25 | + if [[ ! "$expected" =~ ^[0-9a-fA-F]{64}$ ]]; then |
| 26 | + echo "FAIL: no trusted SHA-256 entry for ${tarball}" >&2 |
| 27 | + return 1 |
| 28 | + fi |
| 29 | + printf '%s %s\n' "$expected" "$tarball" | sha256sum -c - |
| 30 | +} |
| 31 | + |
30 | 32 | install_bitcoin() { |
31 | 33 | local VER="$1" |
32 | | - local MAJOR=$(echo "$VER" | cut -d. -f1) |
| 34 | + local MAJOR="${VER%%.*}" |
33 | 35 | local DIR="${INSTALL_BASE}/${MAJOR}" |
34 | 36 | local TARBALL="bitcoin-${VER}-x86_64-linux-gnu.tar.gz" |
35 | 37 | local URL="${BTC_BASE}${VER}/${TARBALL}" |
36 | 38 | local CHECKSUM_URL="${BTC_BASE}${VER}/SHA256SUMS" |
| 39 | + local WORK="$(mktemp -d -t bitcoin-core-${MAJOR}-XXXXXX)" |
| 40 | + trap 'rm -rf "$WORK"' RETURN |
37 | 41 |
|
38 | 42 | mkdir -p "$DIR" |
39 | 43 | echo "-- : [crypto] Installing Bitcoin Core v${VER} to ${DIR}" |
40 | | - |
41 | | - cd /tmp |
42 | | - echo -n " Downloading ${TARBALL}... " |
43 | | - curl -# -fL "$URL" -o "$TARBALL" 2>&1 || { echo "SKIP v${VER} (download failed)"; return; } |
44 | | - echo " ✓ $(du -h "$TARBALL" | cut -f1)" |
45 | | - curl -sfL "$CHECKSUM_URL" -o SHA256SUMS 2>/dev/null || true |
46 | | - |
47 | | - # Verify if checksum available |
48 | | - if [ -f SHA256SUMS ]; then |
49 | | - grep "$TARBALL" SHA256SUMS | sha256sum -c - || { echo "WARN: checksum mismatch v${VER}"; } |
50 | | - fi |
| 44 | + cd "$WORK" |
| 45 | + curl -# -fL "$URL" -o "$TARBALL" |
| 46 | + curl -# -fL "$CHECKSUM_URL" -o SHA256SUMS |
| 47 | + echo " Verifying SHA-256 checksum..." |
| 48 | + verify_bitcoin_checksum "$TARBALL" SHA256SUMS |
| 49 | + echo " ✓ checksum verified" |
51 | 50 |
|
52 | 51 | tar -xzf "$TARBALL" |
53 | | - cp "bitcoin-${VER}/bin/bitcoind" "$DIR/" |
54 | | - cp "bitcoin-${VER}/bin/bitcoin-cli" "$DIR/" |
55 | | - chmod +x "$DIR/bitcoind" "$DIR/bitcoin-cli" |
56 | | - |
57 | | - # Symlink latest version |
| 52 | + install -m 0755 "bitcoin-${VER}/bin/bitcoind" "$DIR/bitcoind" |
| 53 | + install -m 0755 "bitcoin-${VER}/bin/bitcoin-cli" "$DIR/bitcoin-cli" |
58 | 54 | sudo ln -sf "$DIR/bitcoind" /usr/local/bin/bitcoind |
59 | 55 | sudo ln -sf "$DIR/bitcoin-cli" /usr/local/bin/bitcoin-cli |
60 | | - |
61 | | - rm -rf "$TARBALL" SHA256SUMS "bitcoin-${VER}" |
62 | | - echo "-- : [crypto] Bitcoin Core v${VER} OK" |
| 56 | + echo "-- : [crypto] Bitcoin Core v${VER} verified and installed" |
63 | 57 | } |
64 | 58 |
|
65 | 59 | install_dash() { |
66 | 60 | local DIR="${INSTALL_BASE}/dash" |
67 | 61 | mkdir -p "$DIR" |
68 | | - echo "-- : [crypto] Installing Dash Core v${DASH_VERSION}" |
69 | | - |
70 | 62 | cd /tmp |
71 | | - echo -n " Downloading Dash Core v${DASH_VERSION}... " |
72 | | - curl -# -fL "$DASH_URL" -o "dashcore-${DASH_VERSION}-x86_64-linux-gnu.tar.gz" 2>&1 || { echo "FAIL: Dash download"; return; } |
73 | | - echo " ✓ $(du -h "dashcore-${DASH_VERSION}-x86_64-linux-gnu.tar.gz" | cut -f1)" |
74 | | - echo -n " Extracting... " |
| 63 | + curl -# -fL "$DASH_URL" -o "dashcore-${DASH_VERSION}-x86_64-linux-gnu.tar.gz" |
75 | 64 | tar -xzf "dashcore-${DASH_VERSION}-x86_64-linux-gnu.tar.gz" |
76 | | - echo "✓" |
77 | | - cp dashcore-${DASH_VERSION}/bin/dashd "$DIR/" |
78 | | - cp dashcore-${DASH_VERSION}/bin/dash-cli "$DIR/" |
79 | | - chmod +x "$DIR/dashd" "$DIR/dash-cli" |
| 65 | + install -m 0755 "dashcore-${DASH_VERSION}/bin/dashd" "$DIR/dashd" |
| 66 | + install -m 0755 "dashcore-${DASH_VERSION}/bin/dash-cli" "$DIR/dash-cli" |
80 | 67 | sudo ln -sf "$DIR/dashd" /usr/local/bin/dashd |
81 | 68 | sudo ln -sf "$DIR/dash-cli" /usr/local/bin/dash-cli |
82 | 69 | rm -rf "dashcore-${DASH_VERSION}"* |
83 | | - echo "-- : [crypto] Dash Core v${DASH_VERSION} OK" |
84 | 70 | } |
85 | 71 |
|
86 | 72 | install_litecoin() { |
87 | 73 | local DIR="${INSTALL_BASE}/litecoin" |
88 | 74 | mkdir -p "$DIR" |
89 | | - echo "-- : [crypto] Installing Litecoin Core v${LITECOIN_VERSION}" |
90 | | - |
91 | 75 | cd /tmp |
92 | | - echo -n " Downloading Litecoin Core v${LITECOIN_VERSION}... " |
93 | | - curl -# -fL "$LITECOIN_URL" -o "litecoin-${LITECOIN_VERSION}-x86_64-linux-gnu.tar.gz" 2>&1 || { echo "FAIL: Litecoin download"; return; } |
94 | | - echo " ✓ $(du -h "litecoin-${LITECOIN_VERSION}-x86_64-linux-gnu.tar.gz" | cut -f1)" |
95 | | - echo -n " Extracting... " |
| 76 | + curl -# -fL "$LITECOIN_URL" -o "litecoin-${LITECOIN_VERSION}-x86_64-linux-gnu.tar.gz" |
96 | 77 | tar -xzf "litecoin-${LITECOIN_VERSION}-x86_64-linux-gnu.tar.gz" |
97 | | - echo "✓" |
98 | | - cp litecoin-${LITECOIN_VERSION}/bin/litecoind "$DIR/" |
99 | | - cp litecoin-${LITECOIN_VERSION}/bin/litecoin-cli "$DIR/" |
100 | | - chmod +x "$DIR/litecoind" "$DIR/litecoin-cli" |
| 78 | + install -m 0755 "litecoin-${LITECOIN_VERSION}/bin/litecoind" "$DIR/litecoind" |
| 79 | + install -m 0755 "litecoin-${LITECOIN_VERSION}/bin/litecoin-cli" "$DIR/litecoin-cli" |
101 | 80 | sudo ln -sf "$DIR/litecoind" /usr/local/bin/litecoind |
102 | 81 | sudo ln -sf "$DIR/litecoin-cli" /usr/local/bin/litecoin-cli |
103 | 82 | rm -rf "litecoin-${LITECOIN_VERSION}"* |
104 | | - echo "-- : [crypto] Litecoin Core v${LITECOIN_VERSION} OK" |
105 | 83 | } |
106 | 84 |
|
107 | 85 | install_starcoin() { |
108 | 86 | local DIR="${INSTALL_BASE}/starcoin" |
109 | 87 | mkdir -p "$DIR" |
110 | | - echo "-- : [crypto] Installing Starcoin v${STARCOIN_VERSION}" |
111 | | - |
112 | 88 | cd /tmp |
113 | | - echo -n " Downloading Starcoin v${STARCOIN_VERSION}... " |
114 | | - curl -# -fL "$STARCOIN_URL" -o "starcoin-ubuntu-v${STARCOIN_VERSION}.zip" 2>&1 || { echo "FAIL: Starcoin download"; return; } |
115 | | - echo " ✓ $(du -h "starcoin-ubuntu-v${STARCOIN_VERSION}.zip" | cut -f1)" |
116 | | - echo -n " Extracting... " |
117 | | - unzip -qo "starcoin-ubuntu-v${STARCOIN_VERSION}.zip" -d starcoin-extract || true |
118 | | - echo "✓" |
119 | | - cp starcoin-extract/starcoin "$DIR/" 2>/dev/null || cp starcoin-extract/*/starcoin "$DIR/" 2>/dev/null || true |
120 | | - chmod +x "$DIR/starcoin" 2>/dev/null |
121 | | - sudo ln -sf "$DIR/starcoin" /usr/local/bin/starcoin 2>/dev/null |
| 89 | + curl -# -fL "$STARCOIN_URL" -o "starcoin-ubuntu-v${STARCOIN_VERSION}.zip" |
| 90 | + unzip -qo "starcoin-ubuntu-v${STARCOIN_VERSION}.zip" -d starcoin-extract |
| 91 | + install -m 0755 starcoin-extract/starcoin "$DIR/starcoin" 2>/dev/null || install -m 0755 starcoin-extract/*/starcoin "$DIR/starcoin" |
| 92 | + sudo ln -sf "$DIR/starcoin" /usr/local/bin/starcoin |
122 | 93 | rm -rf starcoin-extract "starcoin-ubuntu-v${STARCOIN_VERSION}.zip" |
123 | | - echo "-- : [crypto] Starcoin v${STARCOIN_VERSION} OK" |
124 | 94 | } |
125 | 95 |
|
126 | | -# Main |
127 | 96 | case "$TARGET" in |
128 | | - btc) |
129 | | - for ver in "${BTC_VERSIONS[@]}"; do install_bitcoin "$ver"; done |
130 | | - ;; |
131 | | - dash) |
132 | | - install_dash |
133 | | - ;; |
134 | | - ltc) |
135 | | - install_litecoin |
136 | | - ;; |
137 | | - star) |
138 | | - install_starcoin |
139 | | - ;; |
| 97 | + btc) for ver in "${BTC_VERSIONS[@]}"; do install_bitcoin "$ver"; done ;; |
| 98 | + dash) install_dash ;; |
| 99 | + ltc) install_litecoin ;; |
| 100 | + star) install_starcoin ;; |
140 | 101 | all) |
141 | 102 | for ver in "${BTC_VERSIONS[@]}"; do install_bitcoin "$ver"; done |
142 | 103 | install_dash |
143 | 104 | install_litecoin |
144 | 105 | install_starcoin |
145 | 106 | ;; |
146 | | - *) |
147 | | - echo "Usage: $0 [btc|dash|star|ltc|all]" |
148 | | - exit 1 |
149 | | - ;; |
| 107 | + *) echo "Usage: $0 [btc|dash|star|ltc|all]"; exit 1 ;; |
150 | 108 | esac |
151 | 109 |
|
152 | 110 | echo "-- : [crypto] Installation complete. Binaries in ${INSTALL_BASE}/" |
0 commit comments