支払いページが5秒フリーズして、手が震えてもう一度タップしてしまいました。通常の支払いなら2件の明細を確認できますが、プライバシー取引では金額や参加者まで隠してしまいます。では、ネットワークはなぜ「同じお金を2回使っていない」と分かるのでしょう?
私はこの疑問をもとに、@Dusk のPhoenixを改めて分解しました。Phoenixは資金を公開残高として記録するのではなく、暗号化されたnoteに分割し、そのnoteの約束(コミットメント)を書き込んで Merkle 木に組み込みます。支出の際には、ゼロ知識証明が「このnoteが実際に存在し、ユーザーが制御しており、入出力の整合が守られている」ことを証明しますが、具体的な金額や対応するnoteは公開しません。
本当に「ダブルスペンド」を捕まえるのは nullifier です。これは、noteを使った後に残る唯一の無効化(取り消し)マーカーだと理解できます。外部はそこから元のnoteを逆算できませんが、ネットワークはそのマーカーがすでに登場していないかを確認できます。同じnoteから2つの取引が構成されると、同一のnullifierで衝突し、両方が同時に成立することはできません。
Duskの現行ドキュメントにはさらにこうも書かれています。Phoenixの取引がメモリプール内でnullifierの衝突を起こした場合、古い取引を置き換えられるのは、Gas価格が「厳密に」より高い新しい取引だけです。手数料を上げて再送するのは、追加の支払いというより「置き換え」を狙ったものの可能性があります。ですが、取引が受理済みブロックに入り実行された後は、たとえコントラクトがエラーを返しても、関連するnoteとGasは消費されます。さらに、finalizedされるのを待って初めて、真の終局になります。
つまり暗号学が解決するのは「資産を複製できない」ことですが、ウォレット側はそれでも“処理待ち”“置き換え済み”“実行失敗”“最終確定”を説明しなければなりません。「失敗」とだけ表示してしまうと、ユーザーは同じことを繰り返し再試行してしまうかもしれません。
$DUSKはGasとステーキング資産ですが、プロダクト体験を裏付けるものではありません。私はもっと、ウォレットが置き換え関係、noteの消費理由、そして最終性ステータスを表示できるかを見たいです。プライバシーは細部を隠せても、取引が発生したかどうかまで隠せません。
#dusk $DUSK