Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

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_ROOTpnpm i を実行済みであること

検証ページのダウンロードは、s3BundleUrlverificationBundleUrl の候補から実行されます。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.json
  • bundle/journal.json
  • bundle/public-input.json

metadata.json は同期モードでのみ含まれる場合があります。

4. 期待 Image ID を決定

journal.jsonmethodVersion から 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.jsoninputCommitment と一致することを確認します。 このステップには 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 の結果が success
  • excludedCount == 0 かつ missingIndices == 0 かつ invalidIndices == 0

この2点を満たさない場合、Verified と判定しません。