コンテンツへスキップ

ガスレスDappの構築方法

このブログでは、Permissionless.jsとERC-4337カスタムペイマスタースマートコントラクトを使用して、ガスレスdappを作成する方法を解説します。

6分で読める
ガスレスDappの構築方法

ブロックチェーン上で取引を行う際、舞台裏では多くのプロセスが発生しています。これらのプロセスにはそれぞれコストが伴い、これを「ガスコスト」と呼びます。では、ガスとは何でしょうか?

ガスとは、Ethereumなどのブロックチェーンネットワーク上でトランザクションを実行したり、スマートコントラクトを動かしたりするために必要な計算作業量を測る単位です。ガスはネットワーク内のトランザクションを調整・優先順位付けするために不可欠な存在です。ブロックチェーンネットワークの処理能力には限りがあるため、ガス手数料には2つの重要な役割があります。

  • バリデーターまたはマイナーへのインセンティブ:ガス手数料は、トランザクションを処理・承認するバリデーターやマイナーへの報酬となり、ネットワークの安全性と稼働を維持します。

  • システムの悪用防止:すべての操作にコストを課すことで、スパム攻撃や計算リソースの悪意ある利用を抑止し、ネットワークを潜在的な悪用から守ります。

ガスがブロックチェーンを動かす「燃料」であることを考えると、ガスレスdappという概念は矛盾しているように思えるかもしれません——燃料なしで車を走らせようとするようなものです。では、ブロックチェーンはどのようにしてガスなしで動作できるのでしょうか?

実際には、ガスが消えてなくなるわけではありません。代わりに、ガス手数料を支払う責任がユーザーから別の主体——サービスプロバイダーまたはdapp自体——へと移行します。このアプローチにより、ユーザーはガスコストを直接負担することなくdappを利用でき、ユーザー体験とアクセシビリティが向上します。

ERC-4337とPaymasterスマートコントラクトによるガスレストランザクションの実装

通常、ユーザーはガス手数料の支払いを担いますが、これはガス価格に基づいてトランザクションコストを増加させる可能性があります。しかしガスレスdappでは、ガス手数料は第三者によって負担され、その第三者がユーザーに代わってトランザクションに署名し、支払いを行います。この第三者は多くの場合リレイヤーですが、場合によってはアカウントアブストラクションの仕組みが使われることもあります。

ガスレスdappを実現するために使われる標準規格には2種類あります:ERC-4337とERC-2771です。それぞれを詳しく見ていきましょう。

  • ERC-4337:この標準はアカウントアブストラクションを導入し、Ethereumアカウントがスマートコントラクトのようにふるまうことを可能にします。特に、従来の外部所有アカウント(EOA)からトランザクション開始を切り離すことで、トランザクションの開始・承認方法に大きな柔軟性をもたらします。これにより、複数のアクションを1つのトランザクションにまとめたり、プログラマブルウォレットを実現したりといった、より複雑なトランザクションワークフローが可能になります。

  • ERC-2771:この標準はメタトランザクションのフレームワークを導入し、ユーザーがガス手数料の支払いにETHを必要とせずにdappを利用できるようにします。信頼できるフォワーダーがユーザーに代わってトランザクションを処理し、dappがフォワーダーにガスコストを払い戻します。これにより、ウォレットにETHを持っていないがdappを利用したい新規ユーザーのオンボーディングが簡素化されます。

今回は、permissionless.jsとERC-4337を使用して、クライアント(パブリッククライアントおよびPimlico paymasterクライアント)の作成、スマートアカウントのセットアップ、paymasterのカスタムロジックの定義をカバーするカスタムpaymasterを作成します。まず、paymasterとは何かを理解しましょう。

Paymasterとは、Ethereumのアカウントアブストラクションシステム(ERC-4337など)における特殊なスマートコントラクトです。トランザクションのガス手数料のスポンサーとして機能し、ユーザーがETH以外のトークンで支払ったり、手数料を完全に肩代わりしてもらったりすることを可能にします。Paymasterはカスタムロジックに基づいてガスコストをスポンサーするかどうかを判断します。これにより、dappに大きな柔軟性が生まれ、トランザクションコストを第三者が負担できるようになり、ユーザーがETHを保有しなくても利用しやすくなります。

  1. まず、コードを格納するutils/index.tsファイルを作成しましょう。

  2. パブリッククライアントの作成(任意):これはSimpleSmartAccountとのやり取りに使用されるPimlico paymasterクライアントです。

import { createPublicClient, http } from "viem";
import { createPimlicoClient } from "permissionless/clients/pimlico";
import { lineaSepolia } from "viem/chains";

export const publicClient = createPublicClient({
	chain: lineaSepolia,
	transport: http("<https://rpc.ankr.com/eth_sepolia>"),
})

const pimlicoUrl = <https://api.pimlico.io/v2/sepolia/rpc?apikey=${apiKey}>

export const pimlicoClient = createPimlicoClient({
	transport: http(pimlicoUrl),
	entryPoint: {
		address: entryPoint07Address,
		version: "0.7",
	},
})
コピー
  1. アカウントの作成:permissionless.jsがサポートするアカウント、またはインターフェースに準拠したカスタムアカウントを使用できます。この例ではSimpleSmartAccountを使用します。

import { toSimpleSmartAccount } from "permissionless/accounts";
import { privateKeyToAccount } from "viem/accounts";

const simpleAccount = await toSimpleSmartAccount({
	client: publicClient,
	owner: privateKeyToAccount("YOUR_PRIVATE_KEY"),
	entryPoint: {
		address: entryPoint07Address,
		version: "0.7",
	}
})
コピー
  1. カスタムpaymasterロジックを持つSmart Accountクライアントの作成:smartAccountClientを作成する際、ユーザーオペレーションが署名・送信される前に呼び出されるsponsorUserOperation関数を渡すことができます。この関数はpaymasterAndData、preVerificationGas、verificationGasLimit、callGasLimitフィールドを返す必要があります。

import { createSmartAccountClient } from "permissionless";
import { lineaSepolia } from "viem/chains";

const smartAccountClient = createSmartAccountClient({
	account,
	chain: lineaSepolia,
	bundlerTransport: http(pimlicoUrl),
	paymaster: pimlicoClient,
	userOperation: {
		estimateFeesPerGas: async () => {
			return (await pimlicoClient.getUserOperationGasPrice()).fast
		},
	}
})
コピー
  1. トランザクションの送信:通常通りトランザクションを送信できます。各トランザクションが署名・送信される前にsponsorUserOperation関数が呼び出され、設定したカスタムpaymasterロジックが適用されます。

const txHash = await smartAccountClient.sendTransaction({
	to: "YOUR_CONTRACT_ADDRESS",
	value: parseEther("0.1")
});
コピー

permissionless.jsとPimlicoクライアントを使用して、カスタムpaymasterロジックと統合されたスマートアカウントをセットアップしました。このセットアップにより、paymasterを通じてガス手数料とトランザクション管理を自動化しながら、ブロックチェーンとシームレスにやり取りできます。ぜひ実際に試してみてください。

ガスレスdappのセキュリティに関する考慮事項

1. 信頼できるリレイヤーとpaymaster:ガスレスdappはユーザーに代わってトランザクションを処理するために第三者のリレイヤーやpaymasterに依存しているため、これらの主体が信頼でき、安全であることを確認することが重要です。悪意のある、または侵害されたリレイヤーはトランザクションを改ざんしたりブロックしたりする可能性があります。信頼性の高いサービスを使用し、リレイヤーに障害が発生した場合のフォールバックメカニズムを実装してください。

2. トランザクションの整合性:リレイヤーを使用する場合、トランザクションはリレイヤーによってユーザーに代わって署名される可能性があります。リレイヤーがブロックチェーンに送信する前にトランザクションを悪意ある方法で改ざんしないよう確認してください。スマートコントラクトまたはロジックが、トランザクションの詳細(送信先アドレス、金額など)がユーザーの意図と一致していることを検証するようにしてください。

3. Paymasterロジックのセキュリティ:Paymasterはカスタムロジックに基づいてガス手数料をスポンサーするかどうかを決定するため、このロジックが安全であり、意図しない第三者がpaymasterを悪用して無料でトランザクションを実行できないようにしてください。悪用や意図しないトランザクションのスポンサーを防ぐために、堅牢なルールとチェックを実装してください。

4. スマートコントラクトの監査:ガスレスdappは、アカウントアブストラクションやメタトランザクションのために複雑なスマートコントラクトを伴うことが多くあります。これらのコントラクトはトランザクションフローと手数料を管理しているため、セキュリティの脆弱性について定期的に監査を行ってください。コントラクトの脆弱性は、攻撃者がトランザクションフローを操作する潜在的なエクスプロイトにつながる可能性があります。

5. ガス価格の操作:Paymasterがガス手数料を負担するガスレスdappでは、攻撃者がpaymasterの負担コストを増加させるためにガス価格を操作しようとする可能性があります。Paymasterロジックにガス手数料の上限を設け、過度にコストのかかる操作を拒否するセーフガードを組み込んでください。

6. 秘密鍵の安全な保管:permissionless.jsやPimlicoなどのソリューションを使用する場合、トランザクションの署名に使用する秘密鍵が安全に保管されていることを確認してください。アプリケーションに秘密鍵をハードコードすることは絶対に避け、鍵管理にはハードウェアウォレットやセキュアエンクレーブなどの安全な環境の使用を検討してください。

ガスレスdappの可能性を解き放つ

ガスレスdappは、ガス手数料を第三者に肩代わりさせることでdappのユーザー体験を向上させる革新的な手法です。ERC-4337などの標準規格を活用することで、開発者は新規ユーザーの参入障壁を下げる、より柔軟でユーザーフレンドリーなアプリケーションを構築できます。

提供されたコードスニペットは、permissionless.js、Pimlicoクライアント、カスタムpaymasterロジックを使用してガスレストランザクションを実装する方法を示しています。これらの手順に従うことで、ブロックチェーンとのやり取りを簡素化し、より幅広いユーザーがアクセスしやすいdappを構築できます。さあ、ガスレスdappの可能性を構築・探求する番です!

AIによる翻訳です。エラーが含まれている可能性があります。常に情報を確認してください。

翻訳を評価する

この記事の執筆者: