配送拠点の受け取りコードは毎回違う。たとえ同じ受取人であっても、システムは「この2回は同一人物が受け取った」とは教えてくれない。

少し前に隣人の代わりに宅配便を受け取ったとき、拠点のシステムがなかなか面白いことに気づいた——同じ人が2回受け取りに来ているのに、受け取りコードは完全に別物。店員がバーコードを読み取っても「今回は誰のものを受け取るのか」は分かるが、「この人が前回来たかどうか」は判別できない。あとでDuskのPhoenixの取引モデルを調べてみて初めて、この「毎回新しいコードに変えるので、外部からはつながらない」というロジックが、チェーン上でも使われていて、しかもより徹底されていることが分かった。

Phoenixでは、各取引の支払い受取人が受け取るのは固定アドレスではなく、使い捂ての「note public key」(npk)だ。送信者は受取人の長期公開鍵に乱数を加えて、この一度限りのnpkを算出する。受取人は自分のview keyで取引ごとに検証でき、npkを計算できれば、その取引が自分宛てだと分かる。ポイントは——このnpkは毎回必ず違うこと。仮に同じ人物が10回分の支払いを受け取っても、外部がチェーン上のデータを見て、これら10件が同一の受取人なのかは判別できない。そもそも紐づけに使える固定の住所が重複して登場しないからだ。

この設計が解決しようとしているのは「unlinkability(非関連付け可能性)」——「あなたがお金を受け取った」という事実が見られることを防ぐだけでなく、「その10回のお金が結局同じあなたから来ている」という関連関係が組み立てられること自体を防ぐ。さらにこの方式は委任にも対応している。ユーザーはview keyだけを第三者に渡して、相手に「どの取引が自分宛てか」をスキャンしてもらうことはできるが、「支払う(送金する)権限」までは渡さない。この分割がかなり細かい。

使い捨てアドレスは安全そうに見えるが、それは同時に、1件ごとの検証計算量が固定アドレスモデルより大きいことも意味する。規模が大きくなったとき、そのスキャン効率が耐えられるかどうかは、実際のデータ次第だ。
$DUSK
#dusk @Dusk