新着:HeliusがLight Protocolを買収
Solanaスマートウォレットとは
ブログ/開発

Solanaスマートウォレットとは?比較・実装ガイド

Crossmintのグロース担当XのDwight TorculasLinkedInのDwight Torculas
読了時間:8分

埋め込み型スマートウォレット(アカウント抽象化ウォレットとも呼ばれます)が、Solanaの開発者にも利用可能になりました。これにより、アプリはユーザーにより簡単なオンボーディングとユーザー体験を提供できます。

同時に、開発者は柔軟性、セキュリティ、コンプライアンスを向上でき、最終的にはより安全で使いやすいオンチェーン体験を実現できます。 

非実行可能アカウント(データアカウント)や従来の埋め込み型ウォレットとは異なり、スマートウォレットはプログラム可能です。これにより、ガス代のスポンサー、ウォレットごとの複数署名者、利用上限など、まったく新しい世代の機能が利用可能になります。

この記事では、Solanaの埋め込み型スマートウォレットとその他のウォレットソリューションとの主な違いを学びます。

また、Solana上でスマートウォレットがどのように機能するか、埋め込み型スマートウォレットをアプリケーションへ実装する方法も理解できます。

スマートウォレットとは?

スマートウォレットは、実行可能なコードを含む実行可能プログラムアカウントです。単一の秘密鍵で制御される単純なキーペアである従来のウォレットとは異なり、Solanaのスマートウォレットは、特別なロジックと機能を備えたプログラムとして実装されます。  

スマートウォレットにはどのようなメリットがありますか?

スマートウォレットでは、シードフレーズが不要になり、それに伴う紛失リスクも解消されます。代わりに、ユーザーはウォレットを制御する1つ以上の「署名者」または鍵を指定できます。

この柔軟性により、生体認証(Face ID、Touch ID、パスキーなど)を利用した、より使いやすい鍵管理に加え、高度なセキュリティ方式(マルチシグなど)やエンタープライズレベルの制御(サーバー側の管理者鍵など)が可能になります。

スマートウォレットでは、開発者がSOLやUSDCなどの他のSPLトークンで手数料を負担し、エンドユーザーから手数料を簡単に抽象化できます。これにより、手数料無料のトランザクションが可能になり、より馴染みのあるWeb2のようなユーザー体験を実現できます。  

つまり、トランザクションの承認プロンプトがなく、紛失する可能性のあるシードや秘密鍵もなく、プログラム(スマートコントラクト)によって適用されるプログラム可能なセキュリティを備えたアプリを構築できます。

埋め込み型スマートウォレット、埋め込み型ウォレット、非実行可能アカウントの比較

埋め込み型スマートウォレット埋め込み型ウォレット非実行可能アカウント
実装カスタムロジックを備えたスマートコントラクトアプリに埋め込まれた、スマートコントラクトではないアカウントスタンドアロンアプリケーションまたはブラウザ拡張機能
アカウント制御柔軟です。ユーザーは、PhantomなどのEOAからパスキーやソーシャルログインウォレットまで、1人または複数の署名者を指定でき、任意でプログラムによるルールも設定できますソーシャルログインで保護されたキーペア(通常はTEEまたはMPCクラスター内)ユーザーが所有するキーペアで直接制御します
カストディモデル柔軟です。ユーザーによるセルフカストディ、開発者によるカストディ、または両方のモードを組み合わせたハイブリッドに設定できます通常は非カストディ型ですが、一部の復旧方法によってカストディ型へ変わる場合がありますエンドユーザーによるセルフカストディ
鍵管理複数の認証方法(MPC、ソーシャルリカバリーなど)通常はアプリケーションが管理しますユーザーが管理するシードフレーズ/秘密鍵
トランザクション認証カスタム検証ロジック(マルチシグ、タイムロック、上限)アプリケーションが埋め込み秘密鍵で署名しますユーザーが各トランザクションを明示的に承認します
手数料の支払い手数料の抽象化とスポンサーに対応し、USDCやUSDTなど他のSPLトークンで支払えますユーザーがすべてのトランザクション手数料を支払います。アプリごとにオンランプが必要ですユーザーがすべてのトランザクション手数料を支払います
セキュリティモデルオープンソースのスマートコントラクトコードでセキュリティを適用し、任意でプログラム可能な制約を設定できますセキュリティは埋め込み型ウォレットプロバイダーのクローズドソースコードに依存しますセキュリティはクライアント側のクローズドソースコードに依存します
復旧オプションプログラム可能な復旧(ソーシャル、ガーディアンキー)アプリケーションが提供する復旧方法シードフレーズによる復旧のみ
支出管理プログラム可能な利用上限、承認ワークフロー一部の埋め込み型ウォレットはサーバー側のトランザクションポリシーに対応しています(注意:実装が不適切な場合、カストディ型アーキテクチャになる可能性があります)なし
規制上の考慮事項柔軟です。カストディをプログラムでき、変化する規制に合わせてウォレットを調整できます個別のウォレットプロバイダーにご確認ください審査は比較的緩やかです。ユーザーが制御します
エンタープライズ機能ロールベースのアクセス制御、承認ワークフロー一部の埋め込み型ウォレットには、限定的なサーバー側制御がありますなし
ベンダーロックイン低いです。スマートウォレットはオープンソースプログラムを基盤としています。アドレスを変更せずに、インフラプロバイダーからユーザーを移行できます高いです。埋め込み型ウォレットから離れる唯一の方法は、各ユーザーが秘密鍵を復旧することです。これは安全でない可能性があり、ユーザーによる手動操作が必要になる場合があります低いです。ユーザーに依存します

スマートウォレットの代表的なユースケース

Solanaスマートウォレットは、次のように柔軟なカストディアーキテクチャが必要な場合に役立ちます。

  • 複数の従業員が管理する企業のトレジャリーウォレット
  • エージェント型金融のユースケースにおけるAIエージェントウォレット。エージェントの所有者とエージェント自体に、それぞれ鍵が必要です
  • ユーザーがセルフカストディを維持しながら、銀行による資金の引き落とし(定期支払いなど)を許可できるネオバンクや金融アプリ

委任された署名者の重要な特徴は、支出や資産クラスの制限など、ウォレットに対する権限の範囲を限定できることです。

Solanaではスマートウォレットは具体的にどのように機能しますか?

Solanaのスマートウォレットは、オンチェーンプログラムとオフチェーンインフラを組み合わせ、Solana固有の特徴を活用して動作します。

プログラムベースのアーキテクチャ

非実行可能アカウント(データアカウント)とは異なり、Solanaスマートウォレット(実行可能プログラムアカウント)は通常、1つ以上のアカウント(PDA)を制御するオンチェーンプログラムとして実装されます。

トランザクション認証

スマートウォレットは、単一の秘密鍵ではなく、カスタム認証ロジックを使用します。

  • 複数の署名者を必須にできます(マルチシグ機能)
  • さまざまな認証方法に対応できます(鍵、生体認証、ソーシャル)
  • タイムロックと利用上限をプログラムで適用できます

アカウントの委任

ユーザーは特定の権限を異なるアドレスに委任できるため、各鍵やデバイスで実行できる操作をより細かく制御できます。

バージョン付きトランザクションへの対応

スマートウォレットは、Solana標準のバージョン付きトランザクション形式を使用します。

アカウント抽象化とは?

アカウント抽象化(AA)により、開発者は単一のキーペアに紐づく非実行可能アカウントを超えた、カスタマイズ可能なスマートコントラクトアカウントを作成でき、より柔軟なユーザー体験を提供できます。

AAではカスタム検証ロジックを使用できるため、ブロックチェーンのデフォルトルールに依存せず、ソーシャルリカバリー、マルチシグ要件、利用上限などのセキュリティ機能をアカウントに実装できます。 

AAの主な目的は、セルフカストディのメリットを維持しながら、トランザクション手数料やシードフレーズなどの技術的な障壁を取り除き、ユーザーからブロックチェーン技術を意識させないことです。

Solanaで手数料無料のトランザクションはどのように機能しますか?

手数料無料のトランザクションにおけるスマートウォレットの主な利点は、dApp固有の実装を必要とせず、アカウントレベルで抽象化が行われることです。これにより、ユーザーがトランザクション手数料の存在すら意識しない、よりシームレスな体験を実現できます。

つまり、開発者は次の機能を実装できます。

組み込みの手数料抽象化

スマートウォレットは、アーキテクチャに手数料スポンサー機能を直接組み込めます。ウォレットコントラクト自体で、誰がどのような状況で手数料を支払うかを定義できます。

柔軟な手数料通貨

ユーザーのトランザクション手数料を負担しない場合、ユーザーはSOL、またはUSDCやUSDTなどのトークンで支払えます。

承認メカニズム

スマートウォレットには、レート制限や特定アプリへの限定など、スポンサー付きトランザクションを許可する条件を決定するカスタム検証ロジックを実装できます。

CrossmintでSolanaスマートウォレットをアプリに追加する方法

スマートウォレットをアプリに統合する方法は複数あります。クライアント側、サーバー側、またはAIエージェント向けのデュアルキーアーキテクチャを利用できます。

以下のチュートリアルでは、初めてのスマートウォレットをサーバー側にデプロイする方法を学びます。

前提条件

まず、Crossmint Staging Consoleで開発者アカウントを作成します。 

次に、プロジェクトの「Settings」>「General」に移動し、ウォレットタイプを「Smart Wallets」に変更します。

「Integrate」>「API Keys」に移動し、「Server-side keys」セクションで「Create new key」を選択すると、APIキーを取得できます。

Wallets APIカテゴリーで、次のスコープを選択します。

  • wallets.create
  • wallets.read
  • wallets:signatures.create
  • wallets:transactions.create
  • wallets:transactions.read
  • wallets:transactions.sign

「Create server key」をクリックし、次の手順で使用する鍵を保存します。

初めてのスマートウォレットを作成する

ファイル(例:createWallet.ts)を作成し、次のコードを入力します。

コード
const apiKey = "YOUR_API_KEY";
const walletType = "solana-smart-wallet";
const adminSigner = {
    // In production, you may want to use an MPC solution, like
    // crossmint-managed MPC keys
    type: "solana-keypair",
};

async function createWallet() {
    const response = await fetch("https://staging.crossmint.com/api/2022-06-09/wallets", {
        method: "POST",
        headers: {
            "X-API-KEY": apiKey,
            "Content-Type": "application/json",
        },
        body: JSON.stringify({
            type: walletType,
            config: {
                adminSigner,
            },
        }),
    });

    return await response.json();
}

createWallet()
    .then((json) => console.log(json))
    .catch((err) => console.error(`error: ${err}`));

実行する前に、YOUR_API_KEYへ前の手順で取得した鍵を入力します。

次に、スクリプトを実行します。

コード
npx tsx createWallet.ts

APIから、新しいウォレットの詳細を含むレスポンスが返されます。

次の手順で使用するため、ウォレットアドレスを保存します。

ウォレットを操作する

サーバー上にウォレットを設定できたので、実際に操作してみましょう。

まず、Crossmint Testnet USDXM Faucetにアクセスし、前の手順で取得したウォレットアドレスを貼り付けて、Solana上のテスト用USDXMを受け取ります。

トークンを取得したら、ウォレットの残高を確認します(checkBalance.ts)。

コード
const apiKey = "YOUR_API_KEY";
const walletAddress = "YOUR_WALLET_ADDRESS"; // From previous step
const tokens = ["sol", "usdc", "usdxm"]; // Tokens to fetch balances for
const chains = ["solana"]; // Chains to query balances from

async function getWalletBalance() {
    const url = new URL(`https://staging.crossmint.com/api/v1-alpha2/wallets/${walletAddress}/balances`);
    url.search = new URLSearchParams({
        tokens: tokens.join(','),
        chains: chains.join(',')
    }).toString();

    const response = await fetch(url, {
        method: "GET",
        headers: {
            "X-API-KEY": apiKey,
            "Content-Type": "application/json",
        },
    });

    return await response.json();
}

getWalletBalance()
    .then((json) => console.log(json))
    .catch((err) => console.error(`error: ${err}`));

おめでとうございます。これで、サーバー上にスマートウォレットをデプロイできました!

ここからドキュメントを確認して、最初のトランザクションを実行する方法や、委任された署名者を追加する方法などを学べます。

まとめ

スマートウォレットは、オンボーディング、ユーザー体験、セキュリティ、コンプライアンスを向上させる、Solana上の新世代アプリを切り拓きます。

Crossmintは、ウォレット、決済、トークン化のためのシンプルなAPIとノーコードツールを通じて、IPからロイヤルティプログラム、AIエージェントまで、幅広いユースケースを支援できることを嬉しく思います。これらのツールは数百万人のユーザーにも確実に対応できるスケーラビリティを備えており、Solana埋め込み型スマートウォレットの提供開始により、フィンテックやAIエージェントアプリも支援できるようになりました。

プロジェクト内でSolanaスマートウォレットを実装する方法について詳しく知りたい場合は、お問い合わせください。喜んでサポートいたします。

その他のリソース

Heliusを購読

Solana開発の最新情報や新しい記事の公開通知を受け取れます

拡大画像