ペイメントポイント
ライトニングネットワークは高速送金・低手数料を可能とするビットコインのセカンドレイヤー技術であり、その中核をなすのがペイメントチャネルとマルチホップペイメントと呼ばれる仕組みです。このマルチホップペイメントは、HTLCと呼ばれるコントラクトを使うことで複数ノードを中継してコインを送金することができます。しかし、このHTLCを使ったマルチホップペイメントにもいくつか問題があります。通常、ライトニングでの送金では、コインの受取り時にシークレットと呼ばれるレシートを渡します。そのため複数ノードを中継してコインを送金する場合、シークレットは最終受信者から送金経路とは逆向きに順繰りと渡されていきます。もしシークレットを中継ノード間で共有すると、送金経路が分かってしまう可能性があります。またこれによって複数の中継ノードが結託することで他の中継ノードのルーティング手数料を中抜きにする攻撃、ワームホール攻撃(wormhole攻撃)ができてしまいます。実際に以下の例を見てみましょう。
ここではボブとトムが結託して不正をしようとしています。今、トムは後続のHj+2へ1.00コインを転送してシークレットを受取りました。本来ならトムの直前のHjへシークレットを渡し、それと引き換えにコインを受け取ります。しかし、ここでトムはそのシークレットをボブへ渡します。ボブはそのシークレットを直前のノードHk-2へ渡し、それと引き換えに1.10コインを受け取ります。ここでボブとトムの合計は0.1コイン(1.10 - 1.00)となり、これがルーティング手数料として獲得したコインです。さて、本来ならトムは直前のHjへシークレットを渡し、それと引き換えに1.02コインを受け取るはずでした。そのため通常時の二人の合計ルーティング手数料はボブ(1.10 - 1.08) +トム(1.02 - 1.00) = 0.04コインとなります。このようにマルチホップペイメントではシークレットが中継者全員へ行き渡るため、このような不正が可能となってしまいます。
しかし、実はこの問題を解決する方法が存在しており、それはシークレットとそのハッシュ値の替わりに、スカラーとペイメントポイントを使うことです。これの何が嬉しいのかというと、演算操作(加算と減算)が可能となることです。例えば、HTLCではハッシュ関数が使われますが、H(a)+H(b)とH(a+b)は異なる値になります。一方、スカラーとそのベースポイントを使うと、a*G+b*Gと(a+b)*Gは等しい関係となります。
H(a) + H(b) ≠ H(a+b)
a*G + b*G = (a+b)*G (所謂、スカラー倍算)
この特性を活かすことでマルチホップペイメントで使われるシークレットを送金経路の中継者ごとに異なったものを使わせることが可能となります。実際に以下の例を見てみましょう。(本稿では、シークレット、スカラー、秘密鍵は同義として扱っています)
セットアップ
- キャロルは秘密鍵aを生成し、その公開鍵aGをアリスへ渡す。
- アリスはb,cを生成し、
- ボブへはcと公開鍵(a+b)Gを渡す。この公開鍵でBTCをロックしており、受け取るにはそれに対応する秘密鍵(a+b)が必要。
- キャロルへは(b+c)を渡す。
- ボブは(a+b)Gとcから公開鍵(a+b+c)Gを計算し、キャロルへ渡す。この公開鍵にもBTCがロックされており、受け取るには対応する秘密鍵(a+b+c)が必要。
公開フェーズ
- キャロルはa+(b+c)を使ってボブが作った公開鍵(a+b+c)GのBTCを受け取る。
- ボブはキャロルが公開した秘密鍵a+(b+c)と秘密鍵cから(a+b)を求め、その鍵を使ってアリスが作った公開鍵(a+b)GのBTCを受け取る。
- アリスは(a+b)-bからaを求めることで、aがProof of Payment(レシート)となる。ここで注目されたいのは、ボブはシークレットにあたる秘密鍵aを知らないことである。
以上のようにペイメントポイントを使うことで、送金経路を中継者が結託しても分からないようにすることが可能となります。また、ペイメントポイントを使うことで他にも色々なことができるので、以下に記載した仕組みについて次回以降の記事で紹介したいと思います。