📝

Safe Study

2023/05/09に公開

ERC-4337(AccountAbstraction) 等のライブラリを提供しているSafeについて理解を深めるため、下記のドキュメントを要約していきたいとおもいます。

https://docs.safe.global/

What is Smart Account, Things you can do with safe

Safeは、ブロックチェーン上のアカウントを簡単に作成・使用できるようにするツールです。スマートアカウント(スマートコントラクトアカウント)は、完全にカスタマイズ可能なアカウントで、マルチシグアカウントなどのルールを作成できます。これにより、複数の署名者が必要なトランザクションや、一定額以下の引き出しに対してのみ承認が必要な場合など、様々な設定が可能です。また、トランザクション手数料をERC-20トークンで支払うこともできます。Safeアカウントは完全にカスタマイズ可能であり、これらのアカウントで何ができるかは想像力によってのみ制限されます。

Why Safe

Safeのスマートコントラクトアカウント標準を使用してアプリケーションを構築することで、セキュリティの向上、ユーザーエクスペリエンスの改善、柔軟性と統合性の向上など、多くの利点が得られます。

  1. 高いセキュリティ: Safeのマルチシグネチャ機能は、所有者アカウントのリストとトランザクションを確認するために必要な閾値を設定できます。
  2. 高度な実行ロジック: Safeライブラリコントラクトを使用して、複雑なトランザクションを実行できます。例えば、バッチトランザクションでは、複数のシンプルなEthereumトランザクションをまとめて実行できます。
  3. 高度なアクセス管理: Safeモジュールを追加することで、より詳細なアクセス管理が可能になります。例えば、特定の状況下でのアクセス回復を行うモジュールを定義できます。
  4. トークンコールバックサポート: 多くの新しいトークンでは、ウォレットコントラクトがコールバックを実装することが求められます。ERC721やERC1155のようなトークン標準は、これらを通じてトークンの受け取りに対して直ちに反応させることができ、さらにトランザクション全体を拒否することも可能にします。
  5. Ether不要なアカウント: Safeでは、ERC20トークンでトランザクション手数料を支払うことができます。これは、トークンを受け入れ、トランザクションをブロックチェーンに送信し、ETHでガス手数料を支払うトランザクション Relay サービスを利用して実現されます。

これらの理由から、Safeを活用してアプリケーションを構築することは、新しい保護管理、所有権、アイデンティティ実現の幅広い可能性を提供します。

Safe{Core} AccountAbstraction SDK

  • Protocol Kit (aka Safe Core SDK)
    • カスタマイズ可能なスマートコントラクトアカウントを作成および設定
    • 安全で監査済みのスマートコントラクトを利用
    • トランザクションバッチングで一度に複数のトランザクションを実行
  • Auth Kit
    • ソーシャルメディアアカウントやメールを使ったオンボーディング
    • Web3Authを使用した簡単なオンボーディング
  • Relay Kit
    • ERC-20トークンでガス料金を支払う
    • 他者のためにトランザクション手数料をスポンサー
    • Gelatoを使用したガスレスな体験
  • Onramp Kit
    • クレジットカードで暗号通貨を購入
    • Fiat on-ramping (入り口の認可) using Stripe

AuthKit

Auth KitはEthereumアドレスを作成し、メールアドレス、ソーシャルメディアアカウント、またはMetamaskのような伝統的な暗号ウォレットを使用して、ブロックチェーンアカウントを認証します。Safe Smartアカウントと相互作用するために、Eメールやソーシャルメディアアカウントを使用して署名アカウントを作成する方法を示すクイックスタートガイド

  1. 必要な依存関係をインストールします。
  2. SafeAuthKitインスタンスを作成します。
  3. Ethereumアカウントにサインインします。
  4. イベントのリスニングをサポートするメソッドがあります。
  5. Auth KitとProtocol Kitを組み合わせて、現在の認証済みアカウントのプロバイダーと署名者を使用してSafeに接続できます。
  6. お気に入りのWeb3ライブラリを使って任意のメッセージやトランザクションに署名することができます。

Auth Kitを使用すると、アプリケーションが安全にアクセスし、Ethereumアカウントとやり取りできるようになります。

Onramp Kit

Onramp Kitは、クレジットカードやその他の支払い方法を使用して暗号通貨を購入することができるツールです。ただし、テスト目的のみで提供されており、現時点ではプロダクション環境には適していません。Stripeとのパイロットテストに参加しており、公開鍵とテストサーバーが設定されています。

このチュートリアルでは、クレジットカードを使用してEthereumアドレスに資金を供給するReactコンポーネントを作成します。完全なコード例は、GitHubリポジトリで見つけることができます。

前提条件として、Stripe APIと通信するためのデプロイされたサーバーが必要です。ただし、SafeハッカソンとStripeパイロットの期間中は、テスト目的でステップ2と3を省略できます。

Onramp Kitは、Reactjs、Vuejs、Angular、または単純なHTMLとJavascriptなど、任意のブラウザベースのノード環境で使用できます。この例では、Reactアプリで使用されています。

依存関係をインストールした後、以下のスニペットを使用して、ユーザーがアクションを実行したときにfundWalletを呼び出します。また、Stripeウィジェットを埋め込む場所のHTMLにid='stripe-root'を含めるようにしてください。

テストモードでKYCプロセスを完了するためのテストデータも用意されています。これにより、テスト環境での購入プロセスを簡単に実行できます。

Onramp Kitの使用にはいくつかの制約があります。現時点では、Stripeウィジェットは米国からの接続でのみ使用できます。また、購入金額は10通貨単位に制限されています。

Relay Kit

Relay Kitを簡単に説明すると、Relay KitはGnosis Safeを利用したトランザクションのガス代(手数料)を、ネイティブなブロックチェーントークンやERC-20トークンで支払うことができる機能を提供しています。これにより、ETHを持っていなくても、あなたのSafeにある任意のERC-20トークンを使ってガス代を支払うことができます。

このクイックスタートガイドでは、Relay Kitを使って、別のアドレスにトークンを送信し、ガス代を支払う方法を説明しています。

手順は以下の通りです。

  1. 必要な依存関係をインストールする
  2. Relay Kitのオプションを選択する(Gelato 1BalanceまたはSafeスマートコントラクトを使用)
  3. 必要なパッケージをインポートする
  4. トランザクション設定を初期化する
  5. トランザクションオブジェクトを作成する
  6. プロトコルとリレーアダプターのインスタンスを作成する
  7. トランザクションを準備する
  8. トランザクションをリレイヤーに送信する

このプロセスを通じて、ユーザーは簡単にトランザクションを送信し、ガス代を支払うことができます。

Protocol Kit

Protocol Kitは、開発者がJavascriptインターフェースを使用してSafeと対話できるようにするSDKです。Safeアカウントの作成、既存のSafeの設定更新、トランザクションの提案と実行などが可能です。

このクイックスタートガイドでは、2of3マルチシグSafeを作成し、SafeからETHを送信するためのトランザクションを提案し、実行します。依存関係のインストール、環境変数の設定、インデックスファイルの作成が行われます。

続いて、サイン、プロバイダー、EthAdapterを初期化し、Safe Api KitおよびProtocol Kitを初期化します。Safeのデプロイ、ETHの送信、トランザクションの作成および提案が行われます。

最後に、トランザクションを実行し、Safe内のETH残高が変化したことを確認します。このクイックスタートでは、Safeの作成とデプロイ、トランザクションの提案と実行を学ぶことができます。

Safe{Core} API

Safe{Core} APIは、ユーザーがSafeアカウントに関する情報を照会できるようにします。

例えば:

  • Safeコントラクトを介して送信される保留中および確定済みのトランザクション
  • SafeコントラクトへのEtherおよびERC-20トークンの送金/受取

Safe{Core} Protocol

プロトコルおよびスマートコントラクトレベルでSafeとやり取りするためのツールが含まれています。これには以下のようなツールがあります:

  • Module: スマートコントラクトに機能を追加します
  • Guards: スマートコントラクト内の機能を制限します

Signatures

Safeは、さまざまなタイプの署名をサポートし、すべての署名はトランザクションが実行される際にコントラクトに送信される単一のバイト列に結合されます。署名には固定長の65バイトが使用され、署名者のアドレスによってソートされて連結されます。

主な署名タイプには、ECDSA署名、eth_sign署名、コントラクト署名(EIP-1271)、および事前検証された署名があります。ECDSA署名とeth_sign署名は、署名者を回復するためにr、s、およびvパラメータが必要です。コントラクト署名(EIP-1271)では、署名検証器のアドレス、署名データの開始位置、および署名タイプが含まれます。事前検証された署名では、ハッシュ検証器のアドレスと署名タイプが含まれます。

例として、EOAでECDSA署名を生成する署名者、コントラクト署名を使用する署名者、および事前検証された署名を使用する署名者の3つの署名が必要なトランザクションがあるとします。それぞれの署名が生成され、署名バイトが連結されてexecTransactionに渡されます。

EIP-1271 Off-Chain Signatures

SafeコントラクトおよびインターフェースはEIP-1271オフチェーン署名`をサポートしています。これにより、EOA署名とは異なる方法でメッセージの署名と検証ができます。

オフチェーン署名を有効にするには、下記のようにカスタムRPCコールを呼び出します。

  const result = await connector.sendCustomRequest({
    method: 'safe_setSettings',
    params: [{ offChainSigning: true }],
  });

その後、EIP 191メッセージやEIP 712タイプデータのメッセージを署名することができます。

署名されたメッセージはSafeのメッセージリストで利用でき、検証するには、まずSafeメッセージハッシュを取得し、ネットワーク固有のトランザクションサービスエンドポイントからメッセージの状態を取得します。署名が正しいかどうかをオンチェーンで検証するには、EIP-1271の isValidSignature(hash, signature) 関数を使用します。この関数は、メッセージハッシュに対して署名が正しい場合、マジックバリューバイト 0x20c13b0b を返します。

これらの手順に従って、オフチェーン署名のためのメッセージを送信し、メッセージが完全に署名されるまでtxサービスをポーリングできます。ただし、Safeのバージョンが1.0.0より大きいものに限ります。また、オフチェーン署名が有効にならない場合、いくつかの理由が考えられます。たとえば、接続されたSafeにフォールバックハンドラが設定されていない場合や、Safeのバージョンが互換性がない場合です。

Modules

モジュールは、Safeコントラクトにカスタム機能を追加するもので、Safeのコアコントラクトからモジュールロジックを分離しながら、Safeの機能を実装するスマートコントラクトです。基本的なSafeにはモジュールは必要ありません。モジュールの追加や削除には、設定された閾値数のオーナーからの確認が必要です。

モジュールには、日常の支出限度額、他のオーナーの承認なしに支出できる額、定期的なトランザクションモジュール、定期的に実行される立ち入り注文(例:家賃の支払い)、およびソーシャルリカバリモジュールなどが含まれることがあります。これらはモジュールを使用する方法のいくつかの例ですが、Safeでモジュールを使用する他の方法もたくさんあります。

Safeモジュールの作成方法を理解するためには、実際に1つ作成してみることが効果的です。始めるには、公式のチュートリアルが役立ちます。ただし、モジュールは任意のトランザクションを実行できるためセキュリティリスクとなることがあります。そのため、信頼性があり監査済みのモジュールのみをSafeに追加することが重要です。悪意のあるモジュールはSafeを完全に乗っ取ることができます。

Safe Apps SDK

SDKパッケージは、Safe Appsとの統合において重要な要素で、Web3ModalやBlocknative onboard.js、web3-reactなどの一般的なパッケージと統合されています。また、新しいdAppを作成する場合は、スターターキットを利用することで、基本構造と必要な設定を迅速に構築できます。

既存のdAppをSafe Appに適応させるためには、いくつかの基本要件が必要です。これには、マニフェストファイル(manifest.json)の作成やCORSヘッダーの設定が含まれます。スターターキットを使用している場合、これらの要件はすでに含まれています。

ローカルのReact開発サーバーを使用することも可能ですが、CORSヘッダーの設定と、テストに使用するSafeインターフェイスと同じプロトコル(httpまたはhttps)を使用する必要があります。

また、独自のSafe Appをゼロから作成する場合、UIキットを提供しており、開発者がSafe Appsで独自のブランディングを使用しながら、ほぼネイティブな外観と感触を実現できる再利用可能なReactコンポーネントが利用できます。

Discussion