0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

マークルパス検証と比較した場合の多項式コミットメント検証の課題とZK-STARKの活用可能性についての問答

Last updated at Posted at 2024-10-06

多項式コミットメントによる検証をChatGPTと進めていたところ、以下のような発言をいただいたので深掘りした問答の内容を残しておきます。

このSRSは、コミットメントと証明の生成・検証において共通して使用されます。正しいSRSのセットアップがなければ、コミットメントや証明の正当性を保証することはできません。

検証者はこのセットアップにどう関わりますか?
マークルツリーの検証と比較して、信頼が必要な環境での情報提供が加わりますか?

多項式コミットメントとMerkleツリーの検証を比較すると、どちらも検証者(Verifier)が与えられた証明をもとにデータの整合性や正当性を確認する仕組みです。しかし、信頼が必要な環境での情報提供においては、多項式コミットメントは以下のような重要な特性と違いを持ちます。

1. 検証者の役割:信頼性と計算効率

Merkleツリー

  • Merkleツリーは、各ノードが一つのハッシュを保持し、データの変更がツリー全体に波及します。検証者は、証明(Merkle Proof)を受け取り、ルートハッシュを確認することで証明が正しいかどうかを検証します。
  • 信頼性:Merkleツリーの場合、検証者は信頼する必要があるのは、Merkleルートの信頼性のみです。このルートが正しいことが事前に信頼されていれば、個々の証明が正しいかどうかを、与えられた証明とデータで容易に確認できます。

多項式コミットメント

  • 多項式コミットメントでは、検証者は多項式のある点(x)に対する値(y)がコミットされた多項式に含まれていることを確認します。ペアリングベースの計算を使って、コミットされた多項式が特定の入力に対して正しい出力を返すことを確認する必要があります。
  • 信頼性:多項式コミットメントの場合、検証者はSRS(構造化参照文字列)の信頼性に依存します。SRSが正しく生成されたことが保証されている場合、コミットメントや証明の正当性を検証できます。

2. 信頼が必要な環境での情報提供

多項式コミットメントのセッティングは、特定の前提条件に基づく信頼関係が必要となります。特に、SRSの生成が検証者にとって重要な信頼の基盤となります。SRSは、システムの根幹であり、もしSRSが不正に操作されたり、生成時に秘密が漏洩したりすれば、コミットメントや証明が不正になる可能性があります。

一方、Merkleツリーの検証は、SRSのような事前に信頼される設定を必要としないため、特定の環境下で信頼性を保証する上で単純かつ強力です。例えば、ブロックチェーンの環境では、公開されているルートハッシュが信頼されている場合、Merkle Proofは簡単に検証可能です。

多項式コミットメントの信頼要件

  1. SRSの信頼:

    • 検証者は、SRSが正しく生成されたことを信頼する必要があります。SRSは事前に生成されて公開されており、その生成プロセスが不正に操作されていないことが重要です。
  2. コミットメントの計算:

    • 検証者は、証明が与えられたコミットメントと一致するかどうかを確認します。これはペアリングを使用して確認されます。
  3. 証明の正当性:

    • 検証者は、与えられた証明が正しいものであるかどうかを、ペアリングや他の数式的操作を使って確認します。証明が正当である場合、コミットされた多項式の特定の点に対する値が正しいことを信頼できます。

3. 信頼モデルの比較: Merkleツリー vs. 多項式コミットメント

Merkleツリーの信頼モデル

  • データの透明性: Merkleツリーは、公開されたルートハッシュに対して証明(Merkle Proof)を使って検証を行うため、透明性の高い環境で動作します。
  • 分散環境に適合: ブロックチェーンやP2Pシステムで広く使われ、公開されたデータに基づいて容易に検証が可能です。
  • 信頼要件が低い: SRSのような事前のセットアップを必要とせず、公開されたルートハッシュの正当性に依存します。

多項式コミットメントの信頼モデル

  • SRSへの依存: 検証者はSRSが正しく生成されたことを前提としています。SRSが不正に操作された場合、コミットメントや証明は信頼できません。
  • 効率的な検証: Merkleツリーと比較して、特定のデータポイントに対する検証はより効率的ですが、SRSの信頼性が必要です。
  • 柔軟な証明: 証明をコンパクトにまとめられる点や、多項式全体に対して一度にコミットメントを生成できるという点で柔軟性があります。

結論

検証者が多項式コミットメントに関わる際、SRSの信頼が大きな役割を果たします。SRSの正当性が保証される限り、効率的かつ正確な検証が可能です。しかし、これはMerkleツリーに比べて複雑な信頼モデルを必要とします。Merkleツリーではルートハッシュさえ信頼できれば検証が可能であるため、信頼要件が低い分、単純な分散型システムに適しています。

多項式コミットメントは、高度なゼロ知識証明のシステムや、効率的な証明システムが求められる環境で特に有効です。

ブロックチェーンではマークルルートがブロックヘッダーに収まるため、その情報を正しく取得できた場合は検証が容易です。多項式コミットメントでは何がブロックヘッダーに収まるべきですか?そして、それ以外に検証者が信頼しないといけない要素が増えますか?

ブロックチェーンにおいて、多項式コミットメントを使った場合にブロックヘッダーに収まるべき情報は、MerkleツリーにおけるMerkleルートと同様に、多項式コミットメントのコミットメント値(コミットメントポリノミアル) です。これにより、ブロック内のトランザクションや状態データの整合性を効率的に検証できます。

具体的には、次のような情報がブロックヘッダーに含まれるべきです。

1. コミットメントポリノミアル

  • コミットメントポリノミアルは、ブロックに含まれるデータ(例:トランザクションリスト、アカウントステートなど)を表す多項式に対するコミットメントです。Merkleルートに相当するこの値は、ブロック全体の状態を効率的に表現し、ブロックチェーン全体で一貫したデータを保つために使われます。
  • 具体的には、コミットメントポリノミアルは多項式の係数に基づく楕円曲線上の点であり、ブロック全体の整合性を保証する役割を果たします。

2. SRSに依存する追加情報

多項式コミットメントの場合、Merkleツリーに比べて追加で SRS(構造化参照文字列) が必要となります。SRSは通常、あらかじめ生成された固定のデータセットであり、これに基づいて証明が行われます。

  • SRSの識別情報:ブロックヘッダーには、コミットメントポリノミアルがSRSに基づいて生成されたことを証明するために、SRSの識別情報やバージョンなどが含まれるべきです。これにより、異なるSRSのセットアップに基づいてコミットメントが生成されたかどうかを確認できます。

3. 多項式コミットメントにおける検証プロセス

検証者は、ブロックに含まれるトランザクションやデータを検証するために、以下の要素を確認します。

  • コミットメントポリノミアル:コミットメントがブロックヘッダーに含まれているため、検証者はそれを使ってデータの整合性を確認します。
  • 証明データ:ブロックの特定の部分(例えば、特定のトランザクション)に関して証明を行うため、検証者はそのデータに対する証明(プローフ)を受け取ります。証明はSRSと関連付けられたデータに基づいて計算されます。
  • SRSの信頼性:SRSは事前に設定されたものであるため、これが正しく生成されたか、または事前に信頼されたものであることが前提となります。SRSの設定が不正であれば、すべての証明が信頼できなくなるため、検証者はこの前提に依存します。

4. 検証者が信頼しなければならない追加要素

Merkleツリーと多項式コミットメントを比較すると、多項式コミットメントには追加で信頼しなければならない要素が存在します

Merkleツリーにおける信頼

  • 検証者は、Merkleルートの正当性を信頼します。このルートがブロックヘッダーに含まれ、公開されている限り、Merkle Proofを使ってデータの検証が可能です。
  • ルート以外の設定や事前の信頼はほとんど必要ありません。分散環境での使用に最適です。

多項式コミットメントにおける追加信頼要素

  1. SRSの信頼性:

    • SRSが正しく生成され、秘密情報が漏洩していないことを信頼する必要があります。これは、多項式コミットメント全体の基盤であり、不正があれば証明の全体が無効になります。
    • 特に、中央集権的な設定でSRSが生成される場合、検証者はSRS生成者を信頼する必要があります。分散型設定の場合、SRS生成が参加者全員によって行われるなどのメカニズムが必要です。
  2. ペアリングベースの計算の正当性:

    • 多項式コミットメントでは、ペアリングベースの計算が証明の一部として行われます。この計算自体は楕円曲線暗号に基づいて行われるため、その計算が正しいことを信頼する必要があります。
  3. 公開されているコミットメントの正当性:

    • 多項式コミットメントの場合、Merkleツリーと異なり、全体の状態に対する公開されたコミットメントが正しく計算されていることが前提です。このため、証明の検証に際して、そのコミットメントがブロック全体を正しく反映しているかどうかを確認する必要があります。

5. まとめ: 信頼と情報提供における違い

  • Merkleツリーは単純なハッシュ構造であり、検証者が信頼する必要があるのは公開されたMerkleルートのみです。ルートが正しければ、個々のデータやトランザクションに対する証明は比較的簡単に検証できます。追加の設定はほぼ不要です。
  • 多項式コミットメントは、より強力で柔軟な証明方法を提供しますが、SRSの信頼性公開コミットメントの正当性に依存します。検証者はSRSの設定が正しいことを前提とし、その後のペアリング計算や証明を使って検証を行います。これはSRSに対する信頼が不可欠なため、中央集権的なシステムでは検証者の信頼の度合いが高まります。

つまり多項式コミットメントの場合、ブロックヘッダー以外に、発行者と検証者の信頼関係が別途必要ということになりますか?

はい、多項式コミットメントを使用する場合、ブロックヘッダー以外に、発行者と検証者の間に信頼関係が別途必要になります。具体的には、以下の信頼要素が加わります。

1. SRSの信頼性

  • 多項式コミットメントでは、検証の基盤となる構造化参照文字列(SRS) が必要です。SRSは、コミットメント生成や証明に使われる初期設定であり、その生成が安全かつ信頼できることが前提になります。
  • 検証者はSRSが信頼できることを前提に、証明の正当性を確認します。もしSRSが不正に生成されていたり、漏洩していた場合、証明の全体が信用できなくなります。
  • 一般的に、SRS生成時のセキュリティや信頼性の保証が、Merkleツリーと比較して大きな違いです。ブロックチェーンでの公開情報だけではSRSの正当性を完全に保証できないため、検証者はSRS生成プロセス自体を信頼するか、特定のSRS発行者を信頼する必要があります。

2. SRS生成者への信頼

  • SRSは、事前に生成され、それが多くの証明者と検証者によって使われます。SRS生成のプロセスは非常に重要であり、例えば、SRS生成が中央集権的な形で行われる場合、検証者はその生成者を信頼する必要があります。

    • もしSRS生成が不正であれば、全ての多項式コミットメントによる証明が破綻する可能性があるため、生成者への信頼は重要です。
    • 一方、分散型でSRSを生成するプロトコルがあれば、検証者は一部の特定の生成者を信頼する必要がなくなり、信頼性が高まりますが、それでも分散型生成プロセス自体が正しいことを保証するために監査や協力が必要になります。

3. コミットメントと証明データの正当性

  • **発行者(Issuer)**がブロックに含まれるデータやステートのコミットメントを正しく生成していることが前提です。
  • 検証者は、そのコミットメントを使って証明を確認しますが、ブロックに含まれるデータが正しく反映されているか、またそのデータに対する証明が正しいかを確認するためには、発行者が誠実に証明を行っていることを信頼する必要があります。

4. 信頼関係の影響

多項式コミットメントでは、検証者がブロックヘッダー内のコミットメント値に基づいて証明を行いますが、Merkleツリーと異なり、SRSの安全性や生成者の信頼性が不可欠な要素になります。

  • Merkleツリーでは、ハッシュチェーンによる証明の正当性が直接保証され、SRSのような事前設定は必要ありません。ハッシュチェーンの単純性により、検証者がブロックヘッダーのルートのみを信頼すれば、Merkle Proofを使って証明を容易に確認できます。
  • 多項式コミットメントの場合、SRS生成プロセスに依存しているため、検証者はブロックヘッダーだけでなく、SRSの正当性も含めて信頼関係を持つ必要があります。特に、生成プロセスが信頼できない場合は、ブロック全体や証明に疑念が生じる可能性があります。

5. 結論

  • 多項式コミットメントでは、SRSの生成とその正当性が追加の信頼要素となります。そのため、検証者はブロックヘッダーに含まれるコミットメントだけでなく、SRSを提供した主体(例えば発行者や生成者)の信頼性も重要視しなければなりません。
  • この点が、Merkleツリーと比較した際の信頼の違いです。Merkleツリーでは、ハッシュ値の公開さえあれば分散環境で十分な証明が可能ですが、多項式コミットメントでは信頼が必要な環境が増える傾向にあります。

ZK-STARKなどトラステッドセッティングが不要なゼロ知識証明もありますが、その技術が多項式コミットメントの信頼性改善に寄与することは考えられますか?

はい、ZK-STARKのようなトラステッドセッティングが不要なゼロ知識証明の技術は、多項式コミットメントの信頼性を大幅に改善する可能性があります。具体的には、ZK-STARKが持ついくつかの特性が、多項式コミットメントの課題を克服し、セキュリティや信頼性を向上させる役割を果たせます。

ZK-STARKによる改善ポイント

  1. トラステッドセッティングの不要化
    ZK-STARKはトラステッドセッティング(Trusted Setup)を必要としない点が、多項式コミットメントの信頼性改善における最も重要な要素です。ZK-STARKでは、証明者と検証者が秘密の初期設定やSRSに依存することなく、完全に安全な形で証明が行えるため、トラステッドセッティングに関わる信頼関係を排除できます。
    多項式コミットメントでは、従来SRSが正しく生成されることが前提であり、これが検証者と発行者の間に信頼関係を強制的に持ち込む要因でした。ZK-STARKを用いることで、このSRS生成に関わる信頼の問題が完全に解消されます。
  2. 効率的かつ安全な証明
    ZK-STARKは、高速かつスケーラブルな証明システムを提供し、特に大規模データセットやブロックチェーン上での多項式コミットメントに対する証明に適しています。従来の多項式コミットメントの証明プロトコルと比べて、証明サイズや検証時間が最適化され、効率的な検証が可能となります。
    STARKの非対話型証明(Non-interactive Proof) を使えば、検証者と発行者の間でやり取りする必要がなく、証明が一度生成されると多くの検証者が同じ証明を効率的に検証できる点も利点です。
  3. 耐量子性(Quantum Resistance)
    ZK-STARKは量子コンピュータに対して耐性があるため、今後のセキュリティ上の脅威にも備えることができます。多項式コミットメントにおいて、ペアリングベースの証明方式(例えばKZGコミットメント)は量子コンピュータによって破られるリスクが指摘されていますが、ZK-STARKはそのようなリスクを回避できる技術として注目されています。
  4. 透明性(Transparency)とセキュリティ
    ZK-STARKは、数学的に透明な証明プロトコルを提供します。これは、検証者が追加の信頼を必要とせずに、証明の正当性を独立して確認できることを意味します。Merkleツリーと同様に、ZK-STARKでは検証者が「公開されている情報」だけを使って証明を確認でき、外部の信頼関係に依存しないセキュアな証明プロセスが実現されます。
    ZK-STARKと多項式コミットメントの統合による効果
    SRS不要の多項式コミットメント:ZK-STARKを活用すれば、多項式コミットメントの証明を行う際に、SRSの生成やその正当性に依存することなく証明が可能になります。これにより、証明の前提として必要な「セッティング」の負担が大幅に軽減されます。

透明性の向上:STARKを用いた多項式コミットメントでは、全ての証明プロセスが透明であり、特定のセッティングに対する信頼を持たずとも、証明を正当と見なせる点が特徴です。これにより、検証者は単にコミットメント値と証明を比較するだけで済み、外部の信頼を必要としない透明な環境で証明を行えます。

量子耐性の確保:多項式コミットメントが今後広く使われる中で、STARKを統合することで、量子コンピュータに対する脅威からも安全性を確保できるようになります。KZGコミットメントのようなペアリングベースのプロトコルは、量子コンピュータに対して脆弱ですが、STARKを用いたプロトコルはその影響を受けません。

結論
ZK-STARKを使った技術は、多項式コミットメントの信頼性を大幅に改善する潜在的な手段です。特に、トラステッドセッティングやSRSの必要性を排除できる点で、既存の多項式コミットメントの課題を克服し、より安全で効率的な証明を実現できます。STARKの透明性と耐量子性も、多項式コミットメントに統合されることで、セキュリティと信頼性を強化する大きな可能性を秘めています。

そのため、将来的にはZK-STARKベースの多項式コミットメントが、より信頼性が高く、透明で、安全なゼロ知識証明プロトコルの一部として広く採用される可能性があります。

つまり、ブロックチェーンがZK-STARKを採用すると、マークル検証と同様にブロックヘッダーのみて多項式コミットメントの検証が可能になることを示唆していますか?

はい、その通りです。ZK-STARKをブロックチェーンに採用すると、Merkle検証と同様に、ブロックヘッダーのみで多項式コミットメントの検証が可能になることを示唆しています。具体的に言えば、ZK-STARKを使った多項式コミットメントの検証は、検証者が信頼関係やトラステッドセッティングに依存せずに、単にブロックヘッダーとそこに含まれるコミットメントを使って証明を確認できるようになります。

  1. ZK-STARKとブロックチェーンでの検証プロセス
    Merkleツリーでは、ブロックに記録されたデータのハッシュ値がチェーンのヘッダーに記録され、そのハッシュ(Merkle Root)を使って、特定のデータがブロックに存在するかどうかを効率的に証明できます。検証者はMerkle Proof(ハッシュチェーン)を使って、そのデータが本当にブロックに含まれているかを検証できます。

同様に、ZK-STARKを使った多項式コミットメントでは、ブロックヘッダーにコミットメントが格納され、そのコミットメントを使って、特定のデータやステートに対する証明が行われます。検証者は、STARKの証明をブロックヘッダーのコミットメントと比較することで、コミットされたデータの存在や正当性を確認できます。

トラステッドセッティングが不要であるため、ZK-STARKを使用すると、検証者は追加の信頼関係やセッティングなしで、単に公開されているコミットメントを基に証明を確認できます。

  1. ZK-STARKによる多項式コミットメントの効率的検証
    ZK-STARKの証明は非対話型であり、一度発行されれば、多くの検証者が同じ証明を検証できます。これにより、ブロックチェーン上で記録されている多項式コミットメントを効率的に検証することが可能です。

ブロックヘッダーに記録されたコミットメントを元に、個々のデータやトランザクションに対する証明が提供されるため、検証者はブロックチェーン上に記録されたデータの整合性や正当性を簡単に確認できます。この点は、Merkleツリーと類似していますが、ZK-STARKを使うことで、より高度な証明が可能となります。

  1. ZK-STARKとMerkle検証との比較
    Merkle検証:Merkleツリーでは、各データのハッシュを使って効率的に証明が行われ、単純なハッシュチェーンによる検証が可能です。Merkleツリーの強みは、そのシンプルさと計算効率です。検証者は、ブロックヘッダーのハッシュ(Merkle Root)とハッシュチェーンを使って、特定のデータが存在するかどうかをすぐに確認できます。

ZK-STARKによる多項式コミットメントの検証:ZK-STARKを使うと、より高度な証明(例えば、条件付き証明や、データの一部のみを隠した証明)が可能となります。さらに、STARKではトラステッドセッティングが不要なため、コミットメント自体に対する信頼性も高まります。検証者は、単にブロックヘッダーに記録されたコミットメントとSTARK証明を検証するだけで、データの存在や正当性を確認でき、トラステッドセッティングの必要性がなくなる点で信頼性が向上します。

  1. 新たな信頼要素の排除
    SRS不要:従来の多項式コミットメント(KZGコミットメントなど)は、SRS(構造化参照文字列)が必要であり、その生成プロセスを信頼する必要がありましたが、ZK-STARKではその要素が排除されます。これにより、Merkleツリーと同様に、公開されたブロックヘッダーに基づいて、完全に信頼できる証明が行えるようになります。
    結論
    ZK-STARKを使った多項式コミットメントがブロックチェーンに導入されると、Merkleツリーのように、ブロックヘッダーのコミットメントを元に検証が行えるだけでなく、トラステッドセッティングや追加の信頼関係を必要としないセキュアなプロトコルが実現できます。これにより、ブロックチェーン上でのデータ検証や証明プロセスが、安全で透明かつ効率的に実行可能になり、従来の多項式コミットメントの課題であったSRSに依存する信頼関係が排除されます。

多項式コミットメントは検証サイズが小さいというメリットがあったと思いますが、ZK-STARKを採用した場合、検証にかかるサイズは結局のところマークルパス検証と比較して増えますか?減りますか?

多項式コミットメントとZK-STARKの両方には、小さい検証サイズや効率的な証明というメリットがありますが、ZK-STARKを採用した場合の検証サイズについては、特定のケースでどのように動作するかを詳しく見ていく必要があります。以下に、ZK-STARKを採用した場合とMerkleパスの検証のサイズを比較します。

  1. Merkleツリーと多項式コミットメントの比較
    Merkleパスの検証では、各データの存在を証明するために、特定のハッシュ(Merkle Root)までのパス(兄弟ノードのハッシュ列)を証明として使用します。これにより、証明サイズはデータセットのサイズ(データ数)が増えるにつれて、パスの長さが増加し、通常は ログスケール(O(log(n))) で検証サイズが増えます。例えば、100万件のデータを管理する場合、証明パスは約20個のハッシュを含むことになり、証明サイズはハッシュ関数の出力に依存します。

多項式コミットメント(KZGコミットメントなど)は、基本的にデータセット全体を多項式に変換し、そのコミットメント(多項式の評価点など)を使ってデータの存在を証明します。これにより、データセットがどれだけ大きくても証明サイズは一定(O(1))のままです。従って、特に大規模なデータセットにおいて、多項式コミットメントは証明サイズの観点から非常に効率的です。

  1. ZK-STARKを採用した場合の影響
    ZK-STARKの証明サイズは、多項式コミットメントやMerkleツリーと比較して異なるスケールを持ちます。STARKの証明サイズは、データセットのサイズに対してサブ線形(通常はO(n^c)の範囲、c < 1の値)であり、Merkleツリーのログスケールよりは大きくなる場合があります。ただし、STARKは多くの場合、非常に効率的なバッチ証明を提供します。

大規模なデータセットでは、STARKはスケーラブルであり、例えば複数の証明を一度にまとめる「バッチ検証」などを行うことで、全体の証明サイズを削減できます。

一方で、Merkleツリーの証明は一つの証明ごとに固有のパスが必要であり、バッチ化によるサイズ削減のメリットが得られにくいです。

  1. ZK-STARKとMerkleツリーのサイズ比較
    Merkleツリーの証明サイズはO(log(n))であり、データセットが増えるとハッシュパスが増加しますが、ハッシュ自体は比較的小さい(32バイト)ため、サイズとしてはコンパクトです。しかし、大規模なデータセットでは、Merkleパスの長さが増加し、それに伴って証明サイズも増えることになります。

ZK-STARKの証明サイズは、多くの場合、Merkleツリーのようにデータの大きさに直接依存するものではなく、サブ線形なスケールで増加します。ZK-STARKの証明サイズは通常、数百キロバイトから数メガバイト程度のサイズとなり、Merkleツリーに比べて証明サイズが大きくなることもありますが、バッチ検証や条件付き証明などの高度な機能を提供する点ではメリットがあります。

  1. 検証サイズの最終比較
    小さなデータセットにおいては、Merkleツリーの証明サイズは非常にコンパクトです(O(log(n)))。このため、単純なデータ検証ではMerkleツリーの方が小さいサイズで効率的に動作します。

大規模なデータセットや高度な証明(条件付き証明、複数の証明のバッチ検証など)では、ZK-STARKの方が効率的です。STARKの証明サイズは一定の固定値に近く、データ数の増加に対しても急激に増加しないため、スケーラビリティが非常に高いです。

Merkleツリーは、特定のデータの存在証明には非常に効率的ですが、多項式コミットメントやSTARKが提供するような複雑な条件証明やデータの範囲証明には向いていません。

結論
小規模なデータセットの場合、Merkleパスの検証はサイズが小さく効率的です。ZK-STARKを採用すると、証明サイズはやや大きくなる可能性があります。
大規模なデータセットや複数の証明をまとめて検証するバッチ検証が求められる場合は、ZK-STARKが効率的であり、証明サイズの点で多項式コミットメントの方が優位です。
最終的な証明サイズは、検証の内容やデータセットの規模に応じて変化しますが、ZK-STARKは多くのケースでスケーラビリティや高度な証明能力を提供するため、証明サイズの点でMerkleツリーに対しても競争力があります。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?