「不授权」は果たして安全なのか:Moveの背後にあるデザイン思想

ジョースター
2022-10-21 16:53:22
コレクション
ユーザーとMoveスマートコントラクトのインタラクションにおいて、承認(Approve)なしはより安全か、それともより安全でないか?

原文作者:@jolestar

最近、ユーザーと Move スマートコントラクトのインタラクションに関して、承認(Approve)が不要であることがより安全か、それともより危険かについての議論が多くあります。ここでは、両者の背後にある違いと、Move の設計思想についてわかりやすく説明してみます。

まず、ユーザーとスマートコントラクトのインタラクションの方法を理解しましょう。取引に署名して、チェーン上のスマートコントラクトを呼び出すことは、物理世界からスマートコントラクトのデジタル世界に入るようなものです。このデジタル世界にはユーザーの分身が存在し、その分身が何をするかはスマートコントラクトによって定義されています。

EVM では、各コントラクトは独立した小さな世界に相当します。分身がこの世界に入ると、ユーザーが現在のコントラクトの世界で持っている状態(資産)しか操作できません。

例えば、スワップの世界に入って、自分の USDT を他の資産と交換したい場合、USDT は USDT を定義するコントラクトの世界に存在しているため、直接スワップの中で自分の身分で USDT コントラクトから資産を引き出すことはできません。したがって、ユーザーはまず USDT のコントラクトの世界で承認を実行し、USDT コントラクトに対してスワップが自分の資産を引き出すことができると伝え、その後スワップの世界に入って操作を行います。

操作が完了した後、再び USDT の方で承認を取り消します(revoke)。しかし、ここでの承認と取り消しの操作は独立した取引が必要であり、ユーザーはしばしばガス代を節約するために取り消しを行わず、その結果、スワップコントラクトに安全上の問題が発生した場合、ユーザーの資産が知らないうちに盗まれる可能性があります。

一方、Move では、すべてのコントラクトが大きなデジタル世界で動作しています。ユーザーのデジタル分身はコントラクト間を自由に移動し、あらゆる操作を実行できる一方で、ユーザーの状態(資産)はユーザー自身のストレージスペースに存在します。

ユーザーはスワップの入り口から入り、自分の残高から USDT を引き出し、交換し、ストレージは同じ取引内で原子的に完了できます。このようなモデルは、コントラクトにより自由な組み合わせのパターンをもたらし、EVM 上では実現が難しい多くの組み合わせの遊び方を可能にします。これが EVM 上のアカウント抽象化の提案が実現しようとしているモデルでもあります。当然、これには新たな安全上の課題も伴います。

では、EVM において、コントラクト間の呼び出しがユーザーの身分を直接持ち運ぶことができる機能を追加することは可能でしょうか?技術的には実現可能ですが、EVM では動的呼び出しがサポートされており、任意のアドレスのコントラクトを呼び出すことができるため、このような操作のリスクを測定することが非常に難しくなります。また、EVM の状態変更はユーザーやウォレットにとって不親切であり、ウォレットは状態の変化を通じてユーザーに通知するのが難しいです。

Move では、この安全上の課題を解決するために二つの方法があります:

  1. 事前にコントラクトを実行する際に、コントラクト実行後の状態変更をユーザーに通知し、ユーザーがこの取引でどの重要な資産が操作されたか、及び実行後の結果を知ることができるようにします。この方法は StarMask で既に実装されています。リンクと添付画像を参照してください https://starcoin.medium.com/starmask-v4-6-

  1. 一部のコントラクトは条件を設定することで、一部のユーザーが事前実行時に状態変更を発見できないようにすることができます。@0xmetazen の分析 https://twitter.com/0xmetazen/status/1582581013972414465 ですが、Move には動的呼び出しがないため、コントラクトがデプロイされると、その実行ロジックは確定的です。バイトコードを静的分析することで、コントラクトのすべての可能なパス上の操作の状態を取得し、ブロックエクスプローラーやウォレットでユーザーに通知することができます。

EVM と Move の二つのアプローチは、もたらす安全リスクが異なります。承認のアプローチの安全リスクは、即時の承認を長期的な承認に変えることです。そのリスクはすぐには発生しません。例えば、コントラクトの脆弱性が発見されていない場合や、悪意のあるコントラクトが長期的に大物を釣るために仕掛けられている場合です。一旦発生すると、ユーザーは非常に受動的になり、多くのユーザーはどのコントラクトに承認を与えたかを忘れてしまう可能性があります。

一方、Move のアプローチはコントラクトにより大きな自由を与え、悪意のあるコントラクトに遭遇した場合には大きなリスクがありますが、このリスクは即座に発生し、技術的手段で検出可能です。最悪のシナリオでは、少なくとも前に進んだ人が落とし穴に落ちた場合、後の人に警告を与えることができ、悪意のあるコントラクトは迅速に露呈します。

最後に、世の中に銀の弾丸は存在せず、特定の技術を使ったからといってすべての安全問題が解決されるわけではありません。チェーン、ツール、ユーザーが共に努力する必要があります。

Move ユーザーへの安全に関するアドバイス:

  1. 状態変更の通知がより充実したウォレットを選び、ウォレットの通知を理解するよう努めてください。

  2. 出所が不明またはオープンソースでない DApp と安易にインタラクションしないでください。

  3. 上記の二点ができない場合は、他の人が先に落とし穴を試すのを待つことができます。

Move における安全上の課題と改善策はこれだけではありません。『なぜ Move なのか』シリーズの安全編で詳述する予定ですので、興味のある方はぜひフォローしてください。

ChainCatcherは、広大な読者の皆様に対し、ブロックチェーンを理性的に見るよう呼びかけ、リスク意識を向上させ、各種仮想トークンの発行や投機に注意することを提唱します。当サイト内の全てのコンテンツは市場情報や関係者の見解であり、何らかの投資助言として扱われるものではありません。万が一不適切な内容が含まれていた場合は「通報」することができます。私たちは迅速に対処いたします。
チェーンキャッチャー イノベーターとともにWeb3の世界を構築する