メインコンテンツまでスキップ

zkLogin による摩擦のないオンランプ

· 約 9 分
Dora Noda
Software Engineer

ウォレットの摩擦を解消し、ユーザーの流入を維持し、成長の可能性を予測する方法

Web3 アプリが現代の Web2 サービスと同じようにシームレスなサインアップフローを持っていたらどうでしょうか?それが Sui ブロックチェーンにおける zkLogin の核となる約束です。これは Sui のための OAuth のように機能し、ユーザーは Google 、 Apple 、 X などの使い慣れたアカウントでサインインできます。その後、ゼロ知識証明(ZKP)によって、その Web2 の ID がオンチェーンの Sui アドレスに安全に紐付けられます。ウォレットのポップアップ、シードフレーズ、ユーザーの離脱はもうありません。

その影響は現実的かつ即座に現れます。すでに数十万の zkLogin アカウントが稼働しており、ケーススタディでは、従来のウォレットの障壁を取り除いた後、ユーザーのコンバージョン率がわずか 17% から 42% へと大幅に向上したことが報告されています。これがどのように機能し、あなたのプロジェクトに何をもたらすのかを詳しく見ていきましょう。


なぜウォレットが初回コンバージョンを妨げるのか

あなたは画期的な dApp を構築しましたが、ユーザー獲得のファネルからユーザーが流出しています。その原因のほとんどは常に同じ、「ウォレットを接続(Connect Wallet)」ボタンです。標準的な Web3 のオンボーディングは、拡張機能のインストール、シードフレーズの警告、そして暗号資産の専門用語のクイズといった迷路のようなものです。

これは初心者にとって非常に大きな障壁です。UX 研究者によると、ウォレットのプロンプトが表示された瞬間に 87% という驚異的な離脱 が観察されました。ある興味深い実験では、そのプロンプトをチェックアウトプロセスの後の段階に移動させるだけで、完了率が 94% に跳ね上がりました。暗号資産に興味があるユーザーでさえ、主な恐怖は「間違ったボタンをクリックすると資金を失うかもしれない」というものです。このたった一つの威圧的なステップを取り除くことが、飛躍的な成長を解き放つ鍵となります。


zkLogin の仕組み(わかりやすい解説)

zkLogin は、すべてのインターネットユーザーがすでに信頼している技術を使用することで、ウォレットの問題をエレガントに回避します。その魔法は、舞台裏でいくつかの迅速なステップによって行われます:

  1. 一時的なキーペア(Ephemeral Key Pair): ユーザーがサインインしようとすると、ブラウザ内でローカルに一時的なシングルセッションキーペアが生成されます。これは、このセッションの間だけ有効な一時的なパスキーのようなものだと考えてください。
  2. OAuth のプロセス: ユーザーは Google 、 Apple 、またはその他のソーシャルアカウントでサインインします。アプリはこのログインリクエストに、一意の値(ナンス / nonce)を巧みに埋め込みます。
  3. ZKP サービス: ログインに成功すると、ZKP(ゼロ知識証明)サービスが暗号化された証明を生成します。この証明は、ユーザーの個人的な身元をオンチェーンで明かすことなく、「この OAuth トークンは一時的なパスキーの所有者を認証するものである」ことを確認します。
  4. アドレスの導出: OAuth プロバイダーからのユーザーの JWT(JSON Web Token)と一意の ソルト(salt) を組み合わせて、永続的な Sui アドレスを決定論的に生成します。ソルトはクライアント側または安全なバックエンドで秘密に保持されます。
  5. トランザクションの送信: アプリは一時的なキーでトランザクションに署名し、ZK 証明を添付します。Sui のバリデータはオンチェーンで証明を検証し、ユーザーが従来のウォレットを必要とすることなく、トランザクションの正当性を確認します。

ステップバイステップ導入ガイド

準備はできましたか?ここでは TypeScript SDK を使用したクイックガイドを紹介します。原理は Rust や Python でも同じです。

1. SDK のインストール

@mysten/sui パッケージには、必要なすべての zklogin ヘルパーが含まれています。

pnpm add @mysten/sui

2. キーとナンスの生成

まず、一時的なキーペアと、Sui ネットワーク上の現在のエポック(epoch)に関連付けられたナンスを作成します。

const keypair = new Ed25519Keypair();
const { epoch } = await suiClient.getLatestSuiSystemState();
const nonce = generateNonce(keypair.getPublicKey(), Number(epoch) + 2, generateRandomness());

3. OAuth へのリダイレクト

使用しているプロバイダー(Google 、 Facebook 、 Apple など)に適した OAuth ログイン URL を構築し、ユーザーをリダイレクトします。

4. JWT のデコードとユーザーソルトの取得

ユーザーがログインしてリダイレクトで戻ってきた後、URL から id_token を取得します。それを使用してバックエンドからユーザー固有のソルトを取得し、Sui アドレスを導出します。

const jwt = new URLSearchParams(window.location.search).get('id_token')!;
const salt = await fetch('/api/salt?jwt=' + jwt).then(r => r.text());
const address = jwtToAddress(jwt, salt);

5. ZK 証明のリクエスト

JWT をプルーバー(prover)サービスに送信して ZK 証明を取得します。開発用には Mysten の公開プルーバーを使用できます。本番環境では、独自にホストするか、Enoki のようなサービスを使用する必要があります。

const proof = await fetch('/api/prove', {
method:'POST',
body: JSON.stringify({ jwt, ... })
}).then(r => r.json());

6. 署名と送信

次に、トランザクションを構築し、送信者をユーザーの zkLogin アドレスに設定して実行します。SDK が zkLoginInputs(証明)の添付を自動的に処理します。 ✨

const tx = new TransactionBlock();
tx.moveCall({ target:'0x2::example::touch_grass' }); // 任意の Move 呼び出し
tx.setSender(address);
tx.setGasBudget(5_000_000);

await suiClient.signAndExecuteTransactionBlock({
transactionBlock: tx,
zkLoginInputs: proof // ここで魔法が起こります
});

7. セッションの維持

よりスムーズなユーザー体験のために、キーペアとソルトを暗号化して IndexedDB やローカルストレージに保存します。セキュリティ向上のため、数エポックごとにこれらをローテーションすることを忘れないでください。


KPI 予測テンプレート

zkLogin がもたらす違いは、単なる質的なものではなく、数値化できるものです。一般的なオンボーディング・ファネルと、zkLogin を活用したファネルを比較してみましょう。

ファネルの段階一般的なウォレットポップアップzkLogin 利用時差分
ランディング → サインイン100 %100 %
サインイン → ウォレットの準備完了15 % (インストール、シードフレーズ)55 % (ソーシャルログイン)+40 pp
ウォレットの準備完了 → 初回トランザクション~23 %~90 %+67 pp
全体的なトランザクション・コンバージョン率~3 %≈ 25-40 %~8-13 倍

👉 この数値が意味すること: 10,000 人のユニークビジターを誘導するキャンペーンにおいて、初日のオンチェーンアクションが 300 件にとどまるか、2,500 件を超えるかの違いになります。


ベストプラクティスと注意点

さらにシームレスな体験を提供するために、以下のプロのヒントを参考にしてください。

  • スポンサー付きトランザクション (Sponsored Transactions) を活用する: ユーザーの最初の数回のトランザクション手数料を肩代わりしましょう。これにより、あらゆる摩擦が取り除かれ、驚くほどスムーズな「アハ体験」を提供できます。
  • ソルト (Salts) の扱いに注意する: ユーザーのソルトを変更すると、新しいアドレスが生成されます。信頼できるリカバリパスを管理している場合にのみ行ってください。
  • Sui アドレスを表示する: サインアップ後、ユーザーにオンチェーンアドレスを表示しましょう。これにより、上級ユーザーが後で必要に応じて、従来のウォレットにアドレスをインポートできるようになります。
  • リフレッシュループを防止する: JWT と一時的なキーペア (ephemeral keypair) を有効期限が切れるまでキャッシュし、ユーザーに繰り返しログインを求めないようにします。
  • プルーバーのレイテンシを監視する: 証明生成 (proof-generation) の往復時間に注意してください。2 秒を超える場合は、レスポンスを速く保つために、リージョンごとのプルーバーのホスティングを検討してください。

BlockEden.xyz が提供する価値

zkLogin はユーザー向けのフローを最適化しますが、それをスケールさせるにはバックエンドの新たな課題が生じます。そこで BlockEden.xyz の出番です。

  • API レイヤー: 当社の高スループットで地理的にルーティングされた RPC ノードは、ユーザーの場所に関係なく、zkLogin トランザクションを最小限のレイテンシで処理することを保証します。
  • オブザーバビリティ (観測可能性): 証明のレイテンシ、成功/失敗の比率、コンバージョンファネルの健全性などの主要な指標を追跡するための、標準搭載のダッシュボードを提供します。
  • コンプライアンス: 法定通貨へのブリッジを行うアプリ向けに、オプションの KYC モジュールを提供しており、ユーザーの確認済み ID から直接コンプライアンスに準拠したオンランプ (入金) が可能です。

リリースの準備はいいですか?

扱いにくく、威圧的なウォレットフローの時代は終わりました。zkLogin サンドボックスを立ち上げ、BlockEden のフルノードエンドポイントを接続して、ユーザーに「ウォレット」という言葉を一切意識させることなく、サインアップのグラフが右肩上がりに伸びていく様子を見守りましょう。 😉