ゼロ知識証明(Zero-Knowledge Proof)
ゼロ知識証明(Zero-Knowledge Proof:ZKP)
- ゼロ知識証明(Zero-Knowledge Proof)とは、ある情報を持っていることを証明する方法であり、その情報自体を開示することなく、証明者(Prover)が検証者(Verifier)に対してその情報の正当性を示すことが可能で、これにより、プライバシーを保ちながら、信頼性のある認証が可能となる。
- ゼロ知識証明(Zero-Knowledge Proof)は、プライバシー強化テクノロジー(PrivacyEnhancingTechnologies:PETs)から生まれたテクノロジー。ある人が特定の事柄を証明したいときに、機密情報を明かさずに証明するテクノロジーの総称。次世代のプライバシー強化テクノロジーとして注目されていて、不要なセンシティブ情報を受け取らずに機械学習やデータ分析を可能にさせる。
ZKPの特徴 | 内容 |
---|---|
完全性 | 正しい証明者は、正しい証明を提供できる。 |
健全性 | 不正な証明者は、正しい証明を提供できない。証明者は検証者にその主張を否定する説得力を持ってはいけない。 |
ゼロ知識性 | 検証者は、証明者が持っている情報について何も学ばない。 |
「ZK-SNARK (ゼロ知識簡潔非対話型知識論証)」と「ZK-STARK (ゼロ知識スケーラブルで透明な知識論証)」
ZK-SNARKとZK-STARKでは「信頼できる設定」に関して、大きく異なる点がある。
-
ZK-SNARK: ゼロ知識証明の一種で、証明のサイズが小さく、検証が非常に速いが、信頼できる設定が必要。一度でも「信頼できる設定」が不正に行われると、その後のすべての証明が信頼できなくなる。設定プロセスに関与する人々が悪意を持っている場合、生成されたパラメータを悪用して不正な証明を作成する可能性がある。 量子コンピュータに対して脆弱であり、将来的なセキュリティの懸念がある。
-
ZK-STARK: より透明でスケーラブルなゼロ知識証明で、信頼できる設定が不要だが、証明のサイズが大きく、計算が重くなることがある。量子コンピュータに対しても安全であり、将来的なテクノロジー進化に対しても強い耐性を持っている。より大規模なデータセットを扱うことができ、スケーラビリティの面で優れている。
特徴 | ZK-SNARK | ZK-STARK |
---|---|---|
証明のサイズ | 小さい | 大きい |
証明の生成速度 | 比較的速い | 遅い |
証明の検証速度 | 非常に速い | 比較的速い |
透明性 | 不透明(信頼できる設定が必要) | 透明(信頼できる設定が不要) |
スケーラビリティ | 限定的 | 高い |
計算の複雑さ | 複雑な計算が必要 | よりシンプルな計算 |
使用例 | プライバシー保護、ブロックチェーン | スケーラブルなブロックチェーン、データ証明 |
長所 | ZK-SNARK | ZK-STARK |
---|---|---|
プライバシー | 高いプライバシーを提供 | 高いプライバシーを提供 |
証明の小ささ | 小さな証明サイズが通信コストを削減 | 大きな証明サイズが通信コストを増加 |
検証の効率 | 高速な検証が可能 | 高速な検証が可能 |
短所 | ZK-SNARK | ZK-STARK |
---|---|---|
証明生成の複雑さ | 複雑な設定が必要 | 計算が重くなることがある |
信頼性の問題 | 初期設定として「信頼できる設定」(trusted setup)と呼ばれるプロセスが必要。一度でも「信頼できる設定」が不正に行われると、その後のすべての証明が信頼できなくなる。設定プロセスに関与する人々が悪意を持っている場合、生成されたパラメータを悪用して不正な証明を作成する可能性がある。 | 「透明性のある設定」(transparent setup)を使用しており、証明サイズが大きくなる。 |
スケーラビリティ | 限定的なスケーラビリティ | スケーラビリティが高いが計算が重い |
ZK-SNARK (ゼロ知識簡潔非対話型知識論証)
- ゼロ知識証明: 証明者がある情報を知っていることを、検証者にその情報を明かさずに証明する方法。
- 簡潔性: 証明が非常に短く、検証も迅速に行えるため効率的。
- 用途: プライバシーを重視したトランザクションや、スマートコントラクトの実行に利用される。例えば、Zcashという暗号通貨で使用されている。
ZK-STARK (ゼロ知識スケーラブルで透明な知識論証)
- スケーラビリティ: 大規模な計算を効率的に処理できる能力を持ち、より多くのデータを扱うことが可能。
- 透明性: ZK-STARKは、証明の生成に必要な設定が不要で、誰でも検証できるため、よりオープンで透明なシステムを提供できる。
- 量子耐性: ZK-STARKは、量子コンピュータに対しても耐性があるとされており、将来的なセキュリティの観点からも注目されている。
- 用途: 大規模なデータ処理や、複雑な計算を必要とするアプリケーションに適している。
暗号通貨と採用しているZKP、公開台帳方式の危険性
-
暗号通貨で話題のBitcoinでは、採用している主なZKPテクノロジーや匿名性拡張はない。Bitcoinは従来からの公開型台帳方式である。
-
Bitcoinのような公開台帳方式(Public Block Chain)のブロックチェーンの証明方法は、全データを参加者全員に公開することを基本とした仕組みであり、これは致命的な欠点である。企業間決済やサプライチェーンで機密の取引情報が公開されるというのは業務上、大きな支障をきたす。金融や法人用途での暗号資産の大規模導入に、公開台帳方式(Public Block Chain)のコインは不向きである。 公開台帳方式(Public Block Chain)では全取引・資産が特定されるリスクを持っており、所有者情報が一度でもリーク(ネット公開、KYC漏洩、SNS投稿など)すると、標的型犯罪を誘発する。海外では以前からビットコイン保有者が物理的脅迫や自宅押し入り被害に遭った事件も報告されており、近年国内でもビットコイン保有者が脅迫や監禁の被害に遭ったりするという事件が起きてきている。韓国・中国を含むアジア圏では仮想通貨市場の規模が大きいため、絶対数で犯罪件数が多い傾向がでている。
コイン(トークン) | 採用ZKP | 詳細・用途(代表例) |
---|---|---|
Zcash | ZK-SNARK | トランザクション匿名化 |
Horizen (旧ZenCash) | ZK-SNARK | プライバシートランザクション |
Komodo | ZK-SNARK | Zcashベース。プライバシー送金 |
Pirate Chain | ZK-SNARK | ZK-SNARK改良型(Sapling)完全匿名 |
Aleo | ZK-SNARK | プライバシースマートコントラクト |
Mina Protocol | ZK-SNARK | 超軽量ブロックチェーン |
Aztec (Ethereum L2) | ZK-SNARK | プライバシーL2ロールアップ |
チェーン/プロジェクト名 | 採用ZKP | 詳細・用途(代表例) |
---|---|---|
StarkNet | ZK-STARK | Ethereum向け L2スケーリング |
StarkEx | ZK-STARK | DeversiFi等のL2エンジン |
Immutable X | ZK-STARK | NFT取引所のL2 |
dydx v4(新バージョン) | ZK-STARK | 分散型取引所Eth L2。パーペチュアル取引が可能な通貨でネットワーク手数料(ガス代)の支払い手段としてイーサリアム必須。 |
コイン(トークン) | 採用チェーン/プロジェクト | 補足 |
---|---|---|
STRK(StarkNet Token) | StarkNet | Ethereum L2 StarkNetのガバナンストークン |
IMX(Immutable X Token) | Immutable X | L2 NFTマーケット、StarkExエンジン利用 |
DVF(Rhino.fi Token) | DeversiFi(Rhino.fi) | StarkExエンジン利用L2 DEX |
DYDX(dYdX Chain Token) | dYdX(v4/perpチェーン等) | v4はCosmosチェーン、v3まではStarkEx基盤・ERC20として流通 |
プライバシー強化テクノロジー(PrivacyEnhancingTechnologies:PETs)
- 個人情報の保護やプライバシーの維持を目的としたテクノロジーや手法の総称を"PETs"と呼ぶ。これらのテクノロジーは、データの収集、保存、処理、共有の過程で個人のプライバシーを守るために使用され、現在、いくつかの主要なプライバシー強化テクノロジーが存在する。
技テクノロジー名 | 特徴 | 長所 | 短所 |
---|---|---|---|
暗号化 | データを特定のアルゴリズムを用いて変換するテクノロジー | - データの機密性を保護 - データが盗まれても解読が困難 |
- 鍵管理が必要 - 処理速度が遅くなる場合がある |
匿名化 | 個人を特定できる情報を削除または変換するテクノロジー | - 個人情報の漏洩リスクを低減 - データ分析に利用可能 |
- 完全な匿名性を保証することは難しい - データの有用性が低下する可能性がある |
差分プライバシー | データベースに対するクエリの結果にノイズを加えるテクノロジー | - 個人情報を保護しつつ統計的な分析が可能 - 様々なデータセットに適用可能 |
- ノイズの追加によりデータの精度が低下する可能性がある - 実装が複雑で専門知識が必要 |
アクセス制御 | データやシステムへのアクセスを制限するテクノロジー | - 不正アクセスを防止 - ユーザーごとに異なる権限を設定可能 |
- 適切な設定がされていないとリスクを生む可能性がある - ユーザーの利便性が損なわれることがある |
トラッキング防止テクノロジー | ウェブサイトやアプリによるユーザーの行動追跡を防ぐテクノロジー | - ユーザーのプライバシーを保護 - 広告のパーソナライズを制限 |
- 一部のサービスが正常に機能しなくなる可能性がある - ユーザー体験が損なわれることがある |
テクノロジー名 | 特徴 | 短所 |
---|---|---|
差分プライバシー | - 個人情報を保護しつつ、統計的な分析を可能にする。 - ノイズを加えることで個々のデータポイントを隠す。 |
- ノイズの量が多すぎると、分析結果の精度が低下する可能性がある。 |
統合分析 | - 複数のデバイスでデータをローカルに保持し、中央サーバーに送信せずにモデルをトレーニング。 - プライバシーを保護しながら協調的な学習が可能。 |
- モデルの精度がデバイスのデータ量に依存するため、データが少ないデバイスの影響を受ける。 |
準同型暗号 | - 暗号化されたデータに対して計算を行い、結果も暗号化されたまま得られる。 - データのプライバシーを保ちながら計算が可能。 |
- 計算コストが高く、実用化には性能の向上が必要。 |
秘密分散 | - 複数の当事者がデータを共有せずに共同で計算を行う。 - 各当事者のデータは分散され、個人情報が保護される。 |
- 実装が複雑で、通信コストが高くなる可能性がある。 |
ゼロ知識証明 | - 証明者が特定の情報を持っていることを、情報を明かさずに証明できる。 - プライバシーを保ちながら、信頼性を確保。 |
- 計算が複雑で、実用化には高い計算リソースが必要。 |
本物に秘密を知らなくても検証できる仕組み
- ZKPでは、検証者は秘密そのものは絶対に知らない。
- 「検証者は証明者の秘密にしている値を知らずにOK/NOだけ確認」する。
[例] 範囲チェック
ZKPの雰囲気を掴むためのコード例。検証者が秘密の数字を教えられずに、証明者が「20 以上の秘密の数字を持っていること」を証明する。
- 証明者:「秘密の数字=25」を持っている
- 証明者:証明用チャレンジ(乱数と、秘密で生成した情報)を生成
- 検証者:その証明情報を元に「本当に25という数字を持っていて、それが20以上か?」だけ確認
/* JAVA VERSION */
import java.security.SecureRandom;
public class ZKPDemo {
// ユーザーが持つ秘密値(ここでは年齢)
static class User {
private int secretAge;
public User(int secretAge) {
this.secretAge = secretAge;
}
// ZKP風に20以上である証明を作る
// サーバーには年齢は送らない
public Proof proveAgeAtLeast20() {
if (secretAge < 20) return null; // 証明不可能
// ランダムなnonce(乱数)生成
SecureRandom rand = new SecureRandom();
int nonce = rand.nextInt(1000000);
// チャレンジ1:「secretAge - 20 = D」として、Dとnonceのハッシュを渡す
int diff = secretAge - 20;
int maskedValue = diff + nonce;
// サーバーにはmaskedValueとnonce渡す
return new Proof(maskedValue, nonce);
}
}
// 証明情報
static class Proof {
public int maskedValue;
public int nonce;
public Proof(int maskedValue, int nonce) {
this.maskedValue = maskedValue;
this.nonce = nonce;
}
}
// サーバー側は「秘密年齢」は知らないが、証明は検証できる
static boolean verifyProof(Proof proof) {
// maskedValue - nonce = diff
// diff >= 0 なら、年齢は20以上
int diff = proof.maskedValue - proof.nonce;
return diff >= 0;
}
public static void main(String[] args) {
User userOK = new User(23);
Proof proofOK = userOK.proveAgeAtLeast20();
if (proofOK != null && verifyProof(proofOK)) {
System.out.println("年齢が20以上であることのみが証明されました(値は非公開です)");
} else {
System.out.println("証明できませんでした。");
}
User userNG = new User(17);
Proof proofNG = userNG.proveAgeAtLeast20();
if (proofNG != null && verifyProof(proofNG)) {
System.out.println("年齢が20以上であることのみが証明されました(値は非公開です)");
} else {
System.out.println("証明できませんでした。");
}
}
}
/* C# VERSION */
using System;
class ZKPDemo
{
class User
{
private int secretAge;
public User(int secretAge)
{
this.secretAge = secretAge;
}
// 20歳以上をZKPのように証明(年齢は公開しない)
public Proof ProveAgeAtLeast20()
{
if (secretAge < 20) return null;
Random rand = new Random();
int nonce = rand.Next(0, 1000000);
int diff = secretAge - 20;
int maskedValue = diff + nonce;
return new Proof(maskedValue, nonce);
}
}
class Proof
{
public int MaskedValue { get; }
public int Nonce { get; }
public Proof(int maskedValue, int nonce)
{
MaskedValue = maskedValue;
Nonce = nonce;
}
}
static bool VerifyProof(Proof proof)
{
int diff = proof.MaskedValue - proof.Nonce;
return diff >= 0;
}
static void Main()
{
User userOK = new User(25);
Proof proofOK = userOK.ProveAgeAtLeast20();
if (proofOK != null && VerifyProof(proofOK))
Console.WriteLine("年齢が20以上であることのみが証明されました(値は非公開です)");
else
Console.WriteLine("証明できませんでした。");
User userNG = new User(17);
Proof proofNG = userNG.ProveAgeAtLeast20();
if (proofNG != null && VerifyProof(proofNG))
Console.WriteLine("年齢が20以上であることのみが証明されました(値は非公開です)");
else
Console.WriteLine("証明できませんでした。");
}
}
本格ZKP実装を行うには?
Bulletproofs、zk-SNARKsなどがあり、
- Java: ZKProofのzkp4j
- C#: NethereumのzkSNARKs対応
がある。
Discussion