丸の内で働くブロックチェーンエンジニアのブログ

丸の内やその他でフリーのブロックチェーンエンジニアとして働いています。勉強している技術情報やニュースを紹介します。

Coinhiveで採掘される匿名性通貨Moneroはどの程度匿名か、仕様を調べてみた

最近話題になっているCoinhiveというスクリプトがあります。サイトの運営者が、閲覧者に仮想通貨をマイニングさせて、その収益を受け取るというもので、JavaScriptで動きます。

話題の「Coinhive」とは? 仮想通貨の新たな可能性か、迷惑なマルウェアか

広告収入の代替手段になりうるかもしれないと言われており、勝手に閲覧者のCPUパワーを使うのはともかく、仕組み的には面白いものだと思います。Wikipediaなど広告に頼らないサービスが、閲覧者のCPUパワーを借りて通貨をマイニング、収益を確保するという手段も考えられるのではないか、と思います。

ここで気になったのが、マイニング対象が匿名性通貨Moneroであるという事です。CPUで十分マイニングできるということで選ばれていますが、マイニング後の動き、収益の確保状況も完全に匿名化できそうです。動きが見えないという意味では、現金でも同じかもしれませんが。。

気になった勢いでMoneroの匿名性の仕組み、どの程度Moneroに匿名性があるのか、Moneroの匿名性による不都合をカバーする仕組みについて調べてみました。

Moneroとは

2014年4月に出た匿名性を謳った通貨です。Bitcoinは全ての取引、残高が透明性が高く見えてしまうのに対して問題提起を行い、匿名性を打ち出した通貨になります。

Bitcoinの取引、アドレス残高は全てブロックチェーンに記録され、誰でも閲覧することができます。エクスプローラーを使えばなおさら簡単に見ることができます。直感的には、昔作った以下の画像がわかりやすいかもしれません。画像はEthereumですが、原理的には取引とアドレスとをネットワーク図で可視化する事ができます。

f:id:naomasabit:20170828002842p:plain
Ethereumの取引ネットワーク図

BitcoinやEthereumはブロックチェーンに改ざん不能な取引として記録されるので、透明性の高い通貨として流通されています。世間一般的なイメージとは異なり、Bitcoinは現金よりも実は追いやすくマネーロンダリングのリスクは低いとする言説もあります。

しかし、ここがプライバシー面で問題であるとMoneroは異を唱え、匿名性を打ち出しています。

なぜMoneroは匿名性を押し出すのか

Bitcoinを取引に使った場合、アドレスが取引相手にわかります。そのアドレスをブロックチェーンから抽出すれば(簡単にはエクスプローラーで検索すれば)取引相手に残高がわかることになります。Moneroはこのプライバシー問題が重要となるシナリオを以下のように例示しています。

  1. もしも犯罪率の高い国を旅行しており、Bitcoinを利用しようとする場合、Bitcoin Walletの残高が知られることになる。残高を狙った人間に襲われるかもしれない。
  2. ビジネスを営んでおり、業者から支払いを受ける場合、業者は受取アドレスからどれくらいの金額があるかを見ることができ、交渉材料にすることができる。また、Bitcoinのアドレスで今までに受け取ったすべての他の支払いを見ることができるので、他業者との価格交渉を見ることができ、交渉を有利に進められる。
  3. オンライン事業者は、消費者の支払能力をみてサービスの価格を決定するのが一般的である。Bitcoinを使っていると、オンライン事業者に消費者の支払能力を見られて、「足元を見られる」可能性がある。
  4. 自分がビジネスで何かを販売しており、相手からBitcoinを受け取り、相手がたまたま犯罪活動に関わっていた場合、犯罪者への資金提供といういわれのない疑いを受ける可能性がある。

Moneroのトランザクションエクスプローラーを使っても、キャプチャのようにほとんど見ることができません。具体的に匿名性を実現している仕組みについてまとめていきます。

f:id:naomasabit:20171012015523p:plain
Moneroのエクスプローラーのトランザクション参照画像

(参考)https://www.monero.how/why-monero-vs-bitcoin

Moneroの取引の匿名性を保証する「ステルスアドレス」

「ステルスアドレス」(Sthealth address)という仕組みを使って、Moneroは匿名性を保証しています。誰かが送金時に、Moneroは着金者のアドレスを宛先としてパブリックに記録せず、匿名ワンタイムアドレスを作成し、そこに送金を行います。その後、匿名ワンタイムアドレスから着金者に送金を行って匿名性を保証します。

(参考)https://getmonero.org/resources/moneropedia/stealthaddress.html

所有権の匿名性を高める「リング署名」

暗号通貨の暗号署名方式は情報の所有権を証明するために存在しています。Moneroは、リング署名(Ring Signature)という署名方式を取り入れることで、公開鍵から所有者を推測できないようにしています。リング署名は、グループで署名を実現する技術です。

リング署名においては、署名者自身の秘密鍵と、グループメンバーの複数の公開鍵を利用して、署名を生成します。署名の正当性は、グループメンバーの複数の公開鍵により検証されます。署名者を特定することは原理的にできない、と言われています。

グループに属する誰かの署名であることは間違いなく確認できても、グループの中で署名を特定することはできず、さらに所有権の匿名性を高められます。

このような特徴から、リング署名は内部通報などにも応用が利く技術として知られています。通報者を匿名化できるが、組織の一員であることは保証できるからです。

(参考)https://getmonero.org/resources/moneropedia/ringsignatures.html

匿名性を保ちつつ、取引を実施した事を証明する仕組み

送金者が送金したことを証明する、paymentIDによる「割印方式」

通常、Moneroでは着金者が送金者を知ることができません。送金者の立場で考えると、自分がMoneroを支払ったことを証明するための仕組みがなければ不都合な場合があります。例えば、もしビジネスで債権者にMoneroを支払った場合、自分が支払った事を証明できないと、債権者がMoneroの着金について知らない顔をされてしまう可能性があります。

それを防止するために、送金時にPaymentIDを指定することができます。ため、PaymentIDは着金者に対して送金者を知らせるために使用するIDです。送金先に対してPaymentIDを事前に取り決めておけば、トランザクションを見て、送金者が送金したことを保証する事ができます。取引の契約書に「割印」を推しておくことと似ているように思えます。ちなみに、アドレスにPaymentIDをつなげることもでき、それをIntegrated payment addressと言います。

(参考)https://getmonero.org/resources/moneropedia/paymentid.html

送金者が第三者へ送金証明をしたい場合に使う、「トランザクションキー(TXKEY)」

先ほどの例のように、ビジネスで債権者にMoneroを支払ったとして、場合によっては第三者にも支払った事を証明する必要があります。(債権者の債権者、公的機関など)

Moneroのウォレットの設定によっては、TXKEY(トランザクションキー)というトランザクション毎の秘密鍵を設定することができます。トランザクション秘密鍵であるTXKEY、トランザクションを同定するTXID、送金元アドレスがあれば、送金トランザクションをチェックできるようです。

トランザクションごとの秘密鍵を供給することによって、その当事者はそのトランザクションがその特定のアドレスにモノを送信したかどうかを知ることができます。

(参考)https://getmonero.org/resources/user-guides/prove-payment.html

着金者が着金トランザクションを参照するView Key

Moneroには、View KeyとSpend Keyという鍵が2つあります。各々に秘密鍵、公開鍵が紐づいており、View Keyの秘密鍵を使うと着金トランザクションを参照できます。

View Key Spend Key
Private Key 着金トランザクションを閲覧できる
送金トランザクションは2017年6月現在では信頼性をもって表示できない
資金送金のために利用される
Public Key 上記の署名の検証用公開鍵 上記の署名の検証用公開鍵

View keyを使用して、着金トランザクションを閲覧できます。

"However, outgoing transactions cannot be reliably viewed as of June 2017."とMoneropediaのViewKeyページには書いてありますので、もしかすると送金トランザクションも閲覧できるようにするのかもしれません。

(参考)

まとめ

調べた感じですと、Moneroの匿名性はかなり堅牢なように思えます。Moneroのエクスプローラーからですと、トランザクションの中身も秘匿されています。ただし、paymentID、トランザクションキー、View Keyなどを共有する事で特定の誰かに情報を共有ができる仕組みになっているようです。設定次第で透明性を高められる世界観としての設計は目指しているように思えます。今後、そのような設定を強制するような規制が検討されるかもしれません。