zkSync EraのAccount Abstraction簡易実装ガイド
zkSync Eraのスマートアカウントを理解し、実装するための開発者向けガイドです
Antoine Sparenberg | 元記事
zkSyncの各コンテンツにご参加ください。
学びながら参加できるCrew3クエストも実施中です。
Account Abstraction(アカウントの抽象化/アカウント・アブストラクション:以下AA)が大きな注目を集めているのには理由があります。
簡単に言うと、「ユーザー体験を簡素化し、暗号の普及を促進する可能性がある」からです。まずは理解するために過去の記事「Account Abstraction(アカウント抽象化)とは?」をご覧ください。
スマートアカウントのネイティブサポートを導入したzkSync Eraのローンチによって、開発者は自身のアプリケーションがスマートアカウントと互換性があることを確認することが重要になりました。
スマートアカウントのネイティブサポートが重要な理由
スマートアカウントのネイティブサポート(プロトコルレベル)がなければ、完全なAAを実装して、メリットを享受してユーザー体験を向上させて、普及を促進することは困難となります。
L1のイーサリアムとEVMチェーンはスマートアカウントをネイティブにサポートしておらず、コントラクトアカウントは任意のロジックを実装できる唯一のアカウントですが、EOAはこれらのチェーン上で取引を開始できる唯一のタイプのアカウントとなっています。
zkSync Eraのスマートアカウントは、EOAの取引を開始することができますが、スマートコントラクトのように任意のロジックの実装も可能です。
Argentのようなスマートアカウントウォレットは、ユーザーにシームレスで安全かつ効率的な体験を提供します。そして、さらに世界中のあらゆる層のユーザーを取り込むためには、Dappsがスマートアカウントとの互換性を確保する必要があります。
スマートアカウントとの連携は簡単で、確認すべき条件は2つだけです。
では、さっそく見ていきましょう!
アプリの互換性を確保する方法
スマートアカウントとの互換性の確保は、とても簡単です:
- ecrecoverを直接使うのではなく、スマートコントラクト(Solidity)とフロントエンド(JavaScript)でEIP-1271署名検証を使用する。
スマートコントラクトの署名検証には、OpenZeppelinのSignatureCheckerを使用することをお勧めします:
import {SignatureChecker} from "@openzeppelin/contracts/utils/cryptography/SignatureChecker.sol";
// ...
using SignatureChecker for address;
// ...
bool isValid = someAddress.isValidSignatureNow(messageHash, signature);
フロントエンドから署名を検証するには、Matter Labsのライブラリを使用してロジックを抽象化することをお勧めします:
import * as zksync from "zksync-web3";
// for signed messages:
const isValid = await zksync.utils.isMessageSignatureCorrect(provider, address, message, signature);
// for typed data:
const promise = await zksync.utils.isTypedDataSignatureCorrect(provider, address, domain, types, value, signature);
2. セキュリティ上の脅威、スマートアカウントでの取引失敗の引き金となるtx.originの使用は避けてください。
これだけです!これでスマートアカウントに対応しました 🎉
次は何?
スマートアカウントに対応したことで、zkSync EraのAAのパワーを十分に活用し、UXを10倍にすることができます!
ここで、いくつかのことを始めていきましょう:
Argent Loginを実装し、アクティブなzkSyncコミュニティの力を利用する
zkSync Eraのウェイティングリストには35万人以上のユーザーがおり、Argentモバイルウォレットは、zkSyncエコシステムへのゲートウェイとして機能します。Argent Loginを使うことで、あなたのDappsとArgentのウォレット間で最高の相互作用を保証することができます。
マルチコールによるAAを活用して、dappのUXを向上させる
今日、イーサリアム上でDappsを使用するには、オンチェーンでのやり取りに新たなトランザクションを承認する必要があり、特にガス代が高い場合には、時間のかかる高価なプロセスとなることがあります。
スマートアカウントは、複数のトランザクションをグループ化して一度に実行する機能を持ち、DappsのUXを大幅に改善します(例えば、DEXで承認+スワップのために2トランザクションを送信しなければならない場合など)。
ArgentにはSDKがあり、ユーザーがArgentのような互換性のあるアカウントで接続されている場合、マルチトランザクションフローを1つのトランザクションに束ね、マルチコールがサポートされていない場合は複数のトランザクションを送信するように最適化されます。
import { multicall } from "@argent/era-multicall";
const calls = [
await dai.populateTransaction.approve(pool.address, daiAmount),
await usdc.populateTransaction.approve(pool.address, usdcAmount),
await pool.populateTransaction.depositPair(dai.address, daiAmount, usdc.address, usdcAmount),
];
const results = await multicall(signer, calls);
ペイマスターを使用してユーザーの取引を補助する
ペイマスターは、ユーザーのトランザクションを補助するスマートコントラクトで「ガス料金を抽象化」することができます。Dappsはペイマスターを使って手数料を補助したり、ユーザーがネイティブでないトークン(例:プロトコル独自のガバナンストークン)で手数料を支払うことを可能にしたり、特定のトランザクションをスポンサーしたりすることができます。
トランザクションフローにペイマスターを実装する方法については、Matter Labsのドキュメントを参照してください。
セッションキー
セッションキーは、ユーザーがDappsとのやり取りを管理するルールを事前に承認することで、取引のたびに署名を必要とせずにプラットフォームの利用を可能にする、UXの大きなブレークスルーとなるものです。
セッションキーを利用することで、ユーザーはDappsとのやり取りを効率化し、セキュリティを犠牲にすることなくシームレスな体験を享受することができます。最終的には、より多くのユーザーが安全で効率的な方法でDappsとやり取りできるようになり、Dappsの普及に貢献することにつながるものとなります。
あなたのDappsにセッションキーを導入したい方は、ぜひArgent( dapps@argent.xyz )までご連絡ください。
ArgentとzkSyncを使ったワークショップ
あなたのDappsをスマートアカウントに対応させるためのステップバイステップのガイドとして、こちらのチュートリアルをご覧ください。
今後のzkSyncエコシステムの発展にご期待ください!