ビットコインのVanity Addressと、Silent Payments
本稿では過去にも何度かバニティアドレス(Vanity Address)について触れたことがあります。ライトニングノードのID、ビットコインアドレスなどの文脈でも触れたかもしれませんが、Split-key Vanity Address Generationについての記事が一番に思い出されます。
【2021/6/3】バニティアドレスをトラストレスに生成してもらう

今日なぜこのテーマを掘り起こしたかというと、Wintermuteというマーケットメイカーが脆弱なバニティアドレス生成ソフトを使用していたために(おそらくブルートフォース攻撃によって)$160Mもの資金を盗難されるという事件が起こったためです。どうも、使用していたツールが鍵生成に使用したエントロピーがわずか32ビット(2^32)だったためにブルートフォース攻撃されてしまったようです。
Wintermuteがバニティアドレスを使用した目的は一般的な用途とは異なり、アドレスのデータ容量を圧縮して手数料を節約するというものだったようですが、ビットコインの世界でもVanity Addressが少なからず存在します。今日はビットコイン上のバニティアドレスについて基本的な解説を行い、最後にSilent Paymentsとバニティアドレスの相性を検討してみます。
本稿ではバニティアドレスの生成に使用できるソフトウェアも紹介しますが、Wintermuteの件同様、詳細な生成方法が安全性に関わるので、安心できない場合は生成をして楽しむことにとどめて、生成したアドレスへの入金はやめるか、少額にとどめておきましょう。バニティアドレスの利用はプライバシー面でも褒められたものではありません。
バニティアドレスとは
バニティアドレスとは、特定の文字列を含むように意図的に生成・選択されたアドレスのことを言います。おそらく一番多くの人口が触れたのはBitMEXの入金用のアドレスがすべて3BMEX~から始まっていたことかと思います。今はbc1qmex~から始まるようです。多数あるアドレスの中から見つけやすいため、ユーザーにとって利便性があったり、ブランディングや宣伝効果があります。バニティアドレスの使用はこのあたりが目的・メリットとなります。
いまどきビットコインアドレスの生成にはまずニモニックを生成し、そこからシード→マスター鍵→秘密鍵→公開鍵→アドレスのように階層的に多数生成するのが通常の流れですが、バニティアドレスは単一のアドレスを生成したいだけなので、一般的には秘密鍵を直接生成します。大量の秘密鍵から生まれるアドレスの中にお目当てのアドレスがあれば、それに対応する秘密鍵を保存します。
当然、長い文字列を指定すると条件を満たすアドレスが指数関数的に見つかりにくくなるため、普通にCPUで生成すると遅いので並列処理が得意なGPUをぶん回す、クラウドで大量のGPUを並行してぶん回すなどして所要時間を短縮します。バニティアドレスの生成を代行してくれる事業者もおり、ユーザー側が予め秘密鍵を1つ生成し、その対の公開鍵を業者に渡すことで鍵加算して条件を満たすアドレスができる秘密鍵を見つけてもらうトラストレスな方式(Split-key方式)が利用できます。(冒頭で紹介した以前の記事で解説しました)
逆にそれなのに秘密鍵の扱いに関してトラストを求めてくる業者は怠慢なので絶対に避けましょう。実際、2020年には少なくとも2014年から営業していたbitcoinvanitygenという業者が過去の客の資産をごっそり持ち逃げしたようです。
このように、バニティアドレスの生成はProof of Workと同じようなプロセスでコストがかかります。それにも関わらず、Twitter上のGiveaway詐欺でバニティアドレスの使用で信憑性を高くすることを目指した形跡のあるものも発見されました。1ELonMUSK...などといった生成コストがある程度高いバニティアドレスが使用されている場合があるそうです。詐欺師はこの取り組みに十分な費用対効果がありそうだと判断したのでしょう。

ところで、1111111111111111111114oLvT2や1BitcoinEaterAddressDontSendf59kuE、1CounterpartyXXXXXXXXXXXXXXXUWLpVrなど、ビットコインをバーンするのに使用されたことのあるアドレスがあります。これらは対応する秘密鍵が生成されたわけではなく、単にチェックサムが通るアドレスを探し出しただけなので一般的にバニティアドレスには含まれず、Bogus Addressと呼ばれたりします。スパムに使用されることもあります。(データだけを書き残すOP_RETURNと異なりUTXO setの肥大に貢献するので迷惑です)
バニティアドレスの問題点
プライバシー面ではアドレスの使い回しを助長することが問題となります。秘密鍵の持ち主が途中で入れ替わるケースは非常に稀なので、同じアドレス=同じユーザーという非常に強固な観測ができてしまいます。そのため、オンチェーン分析の対象となったときに分析者に余計な情報を与えてしまうことになります。
毎回新しいアドレスを使っていれば他人かもしれない可能性が残るため、特にリアルタイムでは分析の精度が落ちやすいです。ただし、他にもテクニックが多数あり、それを生業としている人たちがいるので、プライバシーは難しい問題です。
また、バニティアドレスの生成にはPoWが必要なため、送金者が油断して最初の数文字しかアドレスを確認しないようになる可能性があります。攻撃者は十分なPoWを行うことでその油断につけ込むことができてしまいます(バニティ部分しか確認しないユーザーの誤送金を狙う)。特にバニティ部分が3文字の英単語などであれば生成コストが非常に安いため、標的型攻撃でない通常のアドレスすり替え攻撃でも事前に用意されている可能性があります。(3BMEX~などの広く普及したものは尚更です)
鍵自体の安全性は適切に生成されていれば一般的なビットコインアドレスと何ら変わりません。
バニティアドレスの生成に使えるソフトウェア例
繰り返しますが、詳細な生成方法が安全性に関わるので、コードを確認して安心できない場合は生成をして楽しむことにとどめて、生成したアドレスへの入金はやめておくか、少額にとどめましょう。また仮想通貨関連のソフトウェアなので、動作環境もできる限り仮想マシンなど安全なものを用意することをおすすめします。
Vanitygen (2011) https://bitcointalk.org/index.php?topic=25804.0 (1から始まるLegacy P2PKHアドレスのみ、元祖バニティアドレス生成ソフト)
Vanitysearch (2019) https://bitcointalk.org/index.php?topic=5144752.msg51114479#msg51114479 (1で始まるP2PKHアドレス、3で始まるP2WPKH-P2SHアドレスに加え、bc1qで始まるNative Segwit P2WPKHアドレスにも対応、GPUも使用可能)
ちなみにTor Onion V3 Hidden Service用のバニティアドレス生成に使うものは以下のものがおすすめです。狙われがちな仮想通貨と関係ないので、試してみる心理的ハードルも少し低いかもしれません。注意点として、少なくとも4文字は指定しないと非常に短時間に大量のフォルダと鍵が生成されてしまいます。
mkp224o (2018) https://www.jamieweb.net/blog/onionv3-vanity-address/#mkp224o GPU非対応
おまけ:Silent Paymentsとの相性バッチリ?
Silent Paymentsでは受け手はビットコインアドレスではなく「サイレントアドレス」(固定の公開鍵)を公開し、送金者はその公開鍵と自身の使うUTXOの秘密鍵で改変し生成したアドレスに送金します。第三者はたとえサイレントアドレスを監視してもトランザクションを検知できません。
詳しくは以下の記事よりご確認ください。

個人的にはSilent Paymentsで公開する「サイレントアドレス」とバニティアドレスの相性がとても良さそうだと感じます。サイレントアドレスは固定かつサービスやユーザーと強く結びついたものなので、プライバシーよりブランディングを優先する場合があるでしょう。これをVanity化したところでトランザクションと結びつかないので、プライバシー面でのデメリットがほとんどない使い方ができそうです。
またサイレントアドレスは通常の公開鍵なので、生成対象がビットコインアドレスなのか公開鍵なのかという違いでしかありません。というわけで、既存のバニティアドレス生成ソフトは簡単に対応できるでしょう。
次の記事
読者になる
一緒に新しい世界を探求していきましょう。


ディスカッション