ZIP ローカル検証(Ubuntu)
この手順は、検証ページでダウンロードした bundle.zip を対象に、Ubuntu 上で第三者検証を行うためのガイドです。
0. 前提
- 検証ページから
bundle.zipをダウンロード済みであること - Ubuntu 22.04 / 24.04
- このリポジトリ(
stark-ballot-simulator)のソースを取得済みであること - (Step 7 を実行する場合)Node.js 22+ と pnpm が利用可能であること
- (Step 7 を実行する場合)
$REPO_ROOTでpnpm iを実行済みであること
検証ページのダウンロードは、s3BundleUrl と verificationBundleUrl の候補から実行されます。S3 URL が期限切れの場合は refreshS3=1 で再取得されます。
以降の手順では、リポジトリルートを REPO_ROOT として扱います。実際のクローン先に合わせて先に設定してください。
export REPO_ROOT="$HOME/stark-ballot-simulator"
cd "$REPO_ROOT"
1. Ubuntu セットアップ(Rust)
sudo apt update
sudo apt install -y build-essential pkg-config libssl-dev unzip jq curl ca-certificates
curl https://sh.rustup.rs -sSf | sh -s -- -y
source "$HOME/.cargo/env"
RUST_CHANNEL="$(awk -F'\"' '/^channel *=/ {print $2}' "$REPO_ROOT/rust-toolchain.toml")"
rustup toolchain install "$RUST_CHANNEL"
rustup default "$RUST_CHANNEL"
echo "rust_channel=$RUST_CHANNEL"
rustc --version
cargo --version
2. verifier-service をビルド
cd "$REPO_ROOT/verifier-service"
cargo build --release
生成物:
verifier-service/target/release/verifier-service
3. bundle.zip を展開
mkdir -p ~/stark-audit
cp ~/Downloads/stark-ballot-verification-*.zip ~/stark-audit/bundle.zip
cd ~/stark-audit
unzip -o bundle.zip -d bundle
ls -1 bundle
最低限、以下のファイルが必要です。
bundle/receipt.jsonbundle/journal.jsonbundle/public-input.json
metadata.json は同期モードでのみ含まれる場合があります。
4. 期待 Image ID を決定
journal.json の methodVersion から public/imageId-mapping.json を参照します。
METHOD_VERSION="$(jq -r '.methodVersion' bundle/journal.json)"
EXPECTED_IMAGE_ID="$(jq -r --arg v "$METHOD_VERSION" '.mappings[$v].expectedImageID // empty' "$REPO_ROOT/public/imageId-mapping.json")"
echo "methodVersion=$METHOD_VERSION"
echo "expectedImageId=$EXPECTED_IMAGE_ID"
EXPECTED_IMAGE_ID が空の場合は、マッピングの対象外です。検証を中断してください。
5. STARK レシートを検証
"$REPO_ROOT/verifier-service/target/release/verifier-service" verify \
--bundle ./bundle.zip \
--image-id "$EXPECTED_IMAGE_ID" \
--output ./verification.json
echo "exit_code=$?"
jq '{status, expected_image_id, receipt_image_id, dev_mode_receipt, errors}' ./verification.json
判定:
exit_code=0かつstatus="success": 合格exit_code=2またはstatus="dev_mode": フェイクレシート(本番検証としては不合格)exit_code=3またはstatus="failed": 不合格
6. journal.json の完全性チェック
jq '{excludedCount, missingIndices, invalidIndices, totalVotes, validVotes, verifiedTally}' bundle/journal.json
jq -e '.excludedCount == 0 and .missingIndices == 0 and .invalidIndices == 0' bundle/journal.json >/dev/null \
&& echo 'integrity_counts=ok' \
|| echo 'integrity_counts=ng'
jq -e '(.verifiedTally | add) == .validVotes' bundle/journal.json >/dev/null \
&& echo 'tally_sum=ok' \
|| echo 'tally_sum=ng'
excludedCount > 0 または missingIndices > 0 または invalidIndices > 0 は、検証失敗として扱います。
7. (任意)inputCommitment 再計算
public-input.json から再計算した値が journal.json の inputCommitment と一致することを確認します。
このステップには Node.js / pnpm と、$REPO_ROOT での pnpm i が必要です。
RECALC="$(cd "$REPO_ROOT" && pnpm tsx -e "import fs from 'node:fs'; import { computeInputCommitmentFromPublicInput } from './src/lib/zkvm/types'; const p = JSON.parse(fs.readFileSync(process.argv[1], 'utf-8')); console.log(computeInputCommitmentFromPublicInput(p));" "$PWD/bundle/public-input.json")"
JOURNAL_COMMITMENT="$(jq -r '.inputCommitment' bundle/journal.json)"
echo "recalculated=$RECALC"
echo "journal=$JOURNAL_COMMITMENT"
[ "${RECALC,,}" = "${JOURNAL_COMMITMENT,,}" ] && echo 'input_commitment=ok' || echo 'input_commitment=ng'
合格条件(最小セット)
verifier-serviceの結果がsuccessexcludedCount == 0かつmissingIndices == 0かつinvalidIndices == 0
この2点を満たさない場合、Verified と判定しません。