要約:
- メタマスクなどの仮想通貨ウォレットでは、さまざまなメッセージが表示されます。
- メッセージには、接続(コネクト)や解除(ディスコネクト)、承認(アプルーブ)、取消(リボーク)、確認(コンファーム)、許可(パーミット)、署名(サイン)などがあります。
- あまり利用しないスマートコントラクトへの承認は、定期的に取消したほうが安全です。
接続(コネクト)
接続(コネクト)は、dAppsのトップページなどで求められる操作です。一度コネクトを完了させると、そのウォレットはコネクト済みとなり、次回はコネクト操作をしなくてよくなります。
イメージを深めるために、より具体的に見てみたいと思います。
まず、コネクト操作を進めるには、dAppsにアクセスして「Connect Wallet」や「Connect to dApps」といったボタンを押します。

出典:Lido Finance
より具体的には、dAppsのコネクトボタンをクリックすると、ウォレット選択画面になります。その後、ウォレットを選ぶと「接続」ボタンが表示されます。


ちなみに接続にはガス代は不要です。
コネクトすると、dApps側がウォレットアドレスとそこに紐づくトークンを確認できるようになります。そして画面上には、接続したウォレットアドレスとそこに紐づく残高が表示されます。
またコネクトをすることで、dAppsはユーザーに対して、トランザクションの「承認」をしてもらうよう要求できるようになります。
コネクトしても大丈夫?
コネクトしても特に危険なことはありません。dApps側はウォレットアドレスを確認できますが、ウォレットアドレスはメールアドレスのようなもので、他人に知られても特に危険ではありません。
また、コネクトすることでdApps側は、ユーザーにトランザクションを「承認」するように要求できるようになりますが、承認を要求されてもウォレット保有者が承認しなければ何も起こりません。例えば、トークンを勝手に送信することはできません。
接続解除(ディスコネクト)
コネクト状態は解除することもでき、解除のために行う操作は「接続解除(ディスコネクト)」と言います。解除は接続済みのdAppsページからできます。

出典:Lido Finance
また、ウォレット側からもできます。

出典:MetaMask
コネクト状態のままでも大きく困ることはなさそうですが、使わないサイトとの接続解除はプライバシー保護につながります。

接続解除にもガス代はかかりません。
承認の取り消しはできない
dAppsのスマートコントラクトにバグが見つかった際などは、よくTwitterで「スマートコントラクトへの承認をリボーク(取消)しましょう」と注意喚起がされます。スマートコントラクトを承認した状態の場合、トークンを盗まれる可能性もあるためです。
詳細は後述したいと思いますが、この「リボーク(取消)」とディスコネクトは異なります。ディスコネクトをしてもリボークはされないので、スマートコントラクトに危険性が見つかった際は、ディスコネクトではなくリボークしないといけません。
ちなみに、コネクト(接続)とアプルーブ(承認)も異なる操作です。(詳細は後述)
承認(アプルーブ)
承認(アプルーブ)とは、そのdAppsのスマートコントラクトに、選択したトークンへのアクセス権限を付与することです。より具体的には、選択したトークンを用いてアクションを起こすこと(送金など)を、そのスマートコントラクトに承認することです。
例えば、Uniswap上でUSDCの承認を行うと、そのウォレット内のUSDCはUniswapのスマートコントラクトからアクセスされるようになります。
例として、UniswapでUSDC(ポリゴン上)のアプルーブをやってみたいと思います。
Uniswapにアクセスして、USDCを別の仮想通貨に交換しようとすると、「Approve use of USDC」と表示されます。この英語の文言は、「Uniswapのスマートコントラクトが、あなたのUSDCにアクセスできるようにしてください」という意味です。
承認するにはクリックします。

メタマスクの場合、以下のような画面になります。「(3)」の使用上限を入力して「次へ」をクリックすれば処理を進められますが、その他にもいろいろな項目があります。

画像上のオレンジ色の数字部分について補足すると、以下の通りです。
- 使用を承認するトークンのコントラクトアドレスを見れます
- クリックすると、アクセス権を与えるスマートコントラクトのアドレスが見れます
- dApps側に利用を許可する数量を入力します。
- クリックするとトランザクションの種類などが見れます
- 承認したい場合は、ここをクリックします
ちなみに、「(2)」の「コントラクトの詳細の確認」をクリックすると以下の画面になります。どのスマートコントラクトに、どのトークンへのアクセス権を付与するかが分かります。オレンジ枠をクリックすると、ブロックチェーンエクスプローラーのコントラクトアドレスのページに飛びます。

使用上限を入力して「次へ」をクリックすると、以下の画面になります。ここで「承認」をクリックすると、アプルーブのトランザクションが送信され、後に承認処理が完了します。

ここの「承認」は、後から出てくる「確認(コンファーム)」と同様の処理です。
基本的に「承認」は必要な手続き
「承認」はdApps(スマートコントラクト)を使うためには必要な処理です。基本的に承認を行わないと、dAppsでの取引やステーキングができません。

ERC20トークンの送付はスマートコントラクトによって実行されますが、「Transfer」関数を使った簡易的な処理で済むので、承認不要です。
また、そのスマートコントラクトが正常であれば、特に被害を受けることはありません。スマートコントラクトは、予め実装されたコードによって動いています。例えば「Aという条件が満たされたら、Bという取引を行う」といった具合です。正常にプログラムされたスマートコントラクトであれば、利用が承認されているからといって、勝手にそのトークンを別のアドレスに送ったりしません。
またスマートコントラクトのアドレスには、秘密鍵が存在しません。そのため秘密鍵を持つ者や秘密鍵を盗み見た者が、アカウントを操作してトークンを盗むということもありません。
詐欺やハッキング被害のきっかけにも
しかし「承認」が原因となり、詐欺やハッキングの被害に遭う可能性もあります。
承認を行うと、そのスマートコントラクトがそのトークンにアクセスし、そのトークンを移動させられるようになります。上にも書いた通り、本来ならそれでも問題はありませんが、以下のような被害を受ける可能性があります。
ハッキング
スマートコントラクトのコードに脆弱性(セキュリティ上の弱点)が見つかると、ハッカーは外部から脆弱性に付けこみ、トークンを盗もうとします。
このとき盗まれるのは、スマートコントラクトがアクセス可能なトークンです。つまり「承認」を与えられているウォレットアドレスのトークンです。
スキャム
「承認」を利用したスキャム(詐欺)の例に、なりすましがあります。なりすましとは、有名なdApps運営者になりすましてユーザーを誘導し、悪意のあるスマートコントラクトに「承認」を与えさせ、その後さらに悪意のあるトランザクションに署名させたりしてトークンを盗むといった手法です。
例えばリスティング広告を利用し、Uniswapと検索したときに、Uniswapの偽サイトが表示されるようにします。偽サイトといえども見た目はそっくりなので、本物のサイトだと思って使おうとする人もでてきます。そうなると、詐欺師にとってはしめたものです。
被害を受けないために
被害を受けない対策として、以下の3点が挙げられます。
悪意のあるサービスを使わない
まずは悪意のあるスマートコントラクトに承認を与えないことが重要です。
悪意のあるスマートコントラクトを見分ける方法として、WebサイトやSNSが信頼できるかをチェックするのも良いと思います。例えば、以下のような点をチェックします。
- WebサイトのURLに不自然な文字がある
- SNSのTwitterのフォロワーが少ない
- Twitterのフォロワーが数万人いても、投稿が極端に少ない
- Twitter以外のSNSが存在せず、ユーザーと交流していない
- 十分な開発状況の報告や学習コンテンツなどがない
コントラクトアドレスを確認する
スマートコントラクトを確認するという方法もあります。署名するスマートコントラクトは、以下の画面の「(2)」から確認できます。

コントラクトアドレスを確認したら、そのアドレスをイーサスキャンで確認してみてください。

出典:MetaMask
イーサスキャンでコントラクトアドレスに名前が付与されていること(有名なコントラクトには付与される)、チェックマークがついていることは、安心材料と考えられます。
トークンコントラクトも確認する
スマートコントラクトのコントラクトアドレスに加えて、トークンコントラクト(どのトークンへのアクセスを許可するのか)も確認します。悪意のあるサイトは、ユーザーが指定したものとは別のトークンへ、承認を与えるように仕向けてくるかもしれません。
署名するスマートコントラクトは、以下の画面の「(2)」から確認できます。

上記の手順で確認できたトークンコントラクトが、自分が指定したトークンのコントラクトアドレスと一致しているかを確かめます。
具体的には、トークンコントラクトを公式ページやCoinMarketCapなどで確認しておき、確認したトークンコントラクトと、承認するトークンコントラクトが一致していることを確認します。

承認する数量を制限する
メタマスクでは、承認を与えるトークンの数量を定めることができます。以下の画像の「(3)」という部分が該当箇所です。

例えば、10 USDCをMATICに交換したいなら、「カスタム使用上限」に10 USDCなどと入力します。10 USDCと入力した場合、このUniswapのスマートコントラクトは10 USDCまでなら利用できることになります。
ウォレットの残高以上の数値も入力可能であり、100万 USDCなども入力できてしまいますが、そのときに使う数量だけ入れるのが一番安全です。dAppsを使い終わったとき、スマートコントラクトが利用できるトークン上限に達しており、不正利用できる余地がないためです。
ただし、上記の方法をとると、dAppsを使うたびに毎回「承認」をしないといけません。承認にはガス代もかかるため、時間的・資金的な効率は悪くなってしまいます。したがって、バランスが重要になりそうですね。
定期的にリボークする
「承認」は途中で取り消すことができます。承認を取り消すトランザクションをリボークと呼びます。
月に1回など、定期的に使わないスマートコントラクトへの承認をリボークすることも対策の1つです。

承認もリボークもブロックチェーン上で行われるので、どちらにもガス代はかかります。
取消(リボーク)
取消(リボーク)とは、「承認(アプルーブ)」を途中で取り消すための処理です。上にも記載した通り、リボークは定期的に行うことが推奨されています。また、dAppsがハッカーに攻撃を受けた際や、脆弱性が見つかった際などには、急いでリボークする必要があります。
リボークは、ブロックチェーンエクスプローラやその他サービスから行えます。

出典:Etherer scan
そのほか、Revoke(「https://revoke.cash/」)というサイトでは、複数のネットワーク上のdAppsのリボークができます。
確認(コンファーム)
「確認(コンファーム)」は送金やスワップなどを実行するときに表示されます。これをクリックすると、処理が実行されます。より具体的には、署名が行われて、トランザクションがネットワークに送信されます。

許可(パーミット)
「許可(パーミット)」は「アプルーブ(承認)」と似たような役割のトランザクションです。違いは、パーミットを使うほうがガス代が安くなる点です。
アプルーブを用いる場合、最初にアプルーブのトランザクションを送信し、そのあとにスマートコントラクトを利用するトランザクションを送信します。
一方でパーミットを用いる場合も、最初にコントラクトの利用許可を出し、それからスマートコントラクトを利用するトランザクションを送信します。最初に利用許可を出す点は同じですが、パーミットを介することで、ガス代が必要なトランザクションではなく、ガス代が不要なメッセージとして処理が行われます。

パーミットを利用すれば、ガス代が節約できます。しかし、全てのトークンがパーミットに対応しているわけではありません。
パーミットを可能にするには、基本的にトークンコントラクトがEIP-2612やEIP3009、EIP2771に対応している必要があり、全てのトークンコントラクトが対応可能なわけではないためです。
例えば、ERC20のUSDCはバージョンアップによりEIP3009に対応していますが、ERC20のUSDTやDAIはバージョンアップが不可とされています。
署名(サイン)
「署名(サイン)」も、「許可(パーミット)」と同じくトランザクションの数を減らしてくれる機能です。入力された任意のデータ(typed data)に対して、署名することができます。

出典:MetaMask
※「署名(サイン)」については不明点が多く、また調べてみたいと思います。
参照
メインの参照

Permitについて



Signについて
補足的な参照

コメント