はじめに
『DApps開発入門』という本や色々記事を書いているかるでねです。
今回は、ユーザーが自分のトークンの所有したまま、第三者がガス代を負担して安全にトークン送金を代行できる仕組みを提案しているERC7968についてまとめていきます!
以下にまとめられているものを翻訳・要約・補足しながらまとめていきます。
他にも様々なEIP・BIP・SLIP・CAIP・ENSIP・RFC・ACPについてまとめています。
概要
ERC7968は、第三者がEthereum上で発行されるトークン(例:ERC20)を安全かつスムーズに利用できるようにする、新しいトークン送付処理モデルを提案しています。
この仕組みにより、仮想通貨に詳しくない利用者でも、第三者(決済代行者)を通じてトークンの送金を行うことができます。
特に特徴的なのは、ユーザーがトークンの所有権を常に保持したまま、第三者が手数料(ガス代)を負担してトランザクションを代行できる点です。
トークン送付の2段階プロセス
このモデルのトークン送付は、次の2段階で進行します。
- 提案(Initiation)
決済代行者がスマートコントラクトを通じてトークン送付を提案します。
この提案はブロックチェーン上でイベントとして発行され、以下の情報が含まれます。
- 送金に関する詳細情報(送信者、受信者、金額など)
- トランザクションを識別するためのユニークなハッシュ値(「提案ハッシュ」)
- 承認(Approval)
提案を受けたトークンの所有者は、ブロックチェーン外(オフチェーン)で提案内容を確認します。
内容に同意した場合、提案ハッシュに自分の秘密鍵で署名し、その署名データを決済代行者に送ります。
代行者はその署名をスマートコントラクトに提出し、契約内で署名が有効であることが確認されると、コントラクトがユーザーの名義でトークン転送を実行します。
有効期限と安全性
各提案には「有効期限(expiration time)」が設定されており、この期間内に署名が送信・検証されない場合、提案は無効になります。
これにより、古い提案や悪意のある再利用を防ぐことができます。
さらに、ユーザー保護のために、以下のような機能も用意されています。
- 万が一、決済代行者が応答しない、または不正な行動を取った場合
- あるいは、トランザクション手数料などの外部条件が急変した場合
そのような状況でも、ユーザーが自分のトークンを直接自分のアドレスへ引き出せる「緊急退避機能」が提供されます。
メリット
このモデルにより、企業やサービス提供者はブロックチェーン上での支払いを自社業務に組み込みやすくなります。
ユーザーは仮想通貨やウォレットの管理を直接行う必要がなく、トークンの移動には常に本人の明確な承認が必要なため、安全性と透明性が保たれます。
一方で、決済代行者はオフチェーン(ブロックチェーン外)で報酬を受け取り、ガス代も負担します。
報酬は現行の金融システム(法定通貨など)を通じて行えるため、既存のビジネスモデルや会計システムに自然に組み込むことができます。
結果として、ユーザーから見たブロックチェーンの煩雑さが取り除かれ、企業や組織にとっても導入しやすい環境が整います。
動機
企業や一般的なビジネスの現場で、ブロックチェーンを使った決済やトークン資産を導入する時に大きな障壁となるのが、「仮想通貨の管理」と「オンチェーン手数料の負担」です。
ユーザーやビジネスパートナーが自らウォレットを管理し、トランザクション手数料を支払う必要がある現状は、多くの企業にとって技術的・運用的・規制的な負担となっています。
ERC7968は、そうした障壁を取り除くために考案された仕組みです。
狙い
信頼できる第三者(決済代行者)が、ユーザーの代わりにブロックチェーン上の操作を行い、トランザクション手数料も支払うことで、企業はトークンベースの取引を自社のビジネスプロセスに統合できます。
それでも、ユーザーは資産の完全な所有権を保持し、送金の最終承認は常に本人の暗号署名によって行われます。
さらに、決済代行者への報酬はオフチェーンで支払われるため、従来の銀行取引や法定通貨決済の枠組みにも適合します。
これにより、ブロックチェーン特有の煩雑な管理作業を不要にしながら、セキュリティとコンプライアンスを維持できます。
安全性と信頼性の確保
このモデルでは、決済代行者が不在になった場合や、手数料が極端に変動するなどの外的要因が発生した場合でも、ユーザーが自ら資産を直接取り戻すことができる「フェイルセーフ(安全装置)」を用意しています。
これにより、信頼関係が崩れた場合でも、資産を完全に保護することができます。
仕様
ERC7968では、トークンを保持するスマートコントラクト(ITokenStorage.sol)が中核となります。
主な機能は以下の3つです。
-
トークン送付の提案 (
proposeTransaction)
決済代行者が転送を提案する。 -
送付の完了 (
completeTransaction)
ユーザーの署名によって送付を確定する。 -
安全な資産引き出し (
sendFundsToOwner)
決済代行者が不在などの緊急時に、ユーザーがトークンを自分のアドレスへ戻す。
さらに、ユーザーの署名を検証するためのverifySignature関数も用意されています。
イベント
TransactionProposed
event TransactionProposed(uint256 hash);
トークン送付が提案された時に発行されるイベント。
決済代行者がproposeTransactionを実行した時に発行されます。
このイベントは、提案が正常に受け付けられたことを示し、提案に対応する一意のハッシュ値を提供します。
パラメータ
-
hash- 提案されたトランザクションを一意に識別するハッシュ値。
TransactionCompleted
event TransactionCompleted(uint256 hash);
トークン送付が完了した時に発行されるイベント。
所有者の署名が正しく検証され、提案されたトランザクションが正常に完了したときに発行されます。
このイベントによって、送付完了がブロックチェーン上で確認できます。
パラメータ
-
hash- 完了したトランザクションのハッシュ値。
FallbackScenarioExecuted
event FallbackScenarioExecuted(address tokenAddress);
ユーザーが緊急時に自分のトークンを回収した際に発行されるイベント。
決済代行者が不在、もしくはトランザクション手数料が大幅に変化したなどの状況で、ユーザーが資産を自分のウォレットに戻すためにsendFundsToOwnerを実行したときに発行されます。
パラメータ
-
tokenAddress- 回収対象となるトークンのコントラクトアドレス。
関数
proposeTransaction
function proposeTransaction(address tokenAddress, uint256 amountToSent, address destinationAddress) external;
トークン送付を提案する関数。
決済代行者(paymentProcessor)がこの関数を呼び出し、特定のトークンを指定したアドレスに送る提案を作成します。
この提案はコントラクト内に保存され、一意のハッシュ値(提案ハッシュ)が生成されます。
このハッシュ値は、後の署名承認プロセスで使用されます。
提案が行われるとTransactionProposedイベントが発行されます。
引数
-
tokenAddress- 送付対象となるトークンのアドレス。
-
amountToSent- 送金したいトークンの数量。
-
destinationAddress- トークンの受取先アドレス。
completeTransaction
function completeTransaction(uint256 hash, bytes memory signature) external;
トークン送付を完了させる関数。
決済代行者がこの関数を呼び出して、提案済みのトランザクションを完了させます。
引数で渡されたhashとsignatureをもとに、ユーザー(所有者)が実際に承認したことをコントラクトが検証します。
署名が正しい場合のみ、コントラクトがトークンの転送を実行します。
成功時にはTransactionCompletedイベントが発行されます。
引数
-
hash- 提案を識別するためのハッシュ値。
-
signature- 所有者が署名したメッセージ。ハッシュのみを含む。
sendFundsToOwner
function sendFundsToOwner(address tokenAddress) external;
所有者が緊急時にすべてのトークンを自分のアドレスへ戻すための関数。
決済代行者が応答しない、または不正な行為を行った場合に、所有者が自分の資産を守るために使用します。
この関数を呼ぶと、指定されたトークンの全残高が所有者のアドレスに送られます。
実行時にFallbackScenarioExecutedイベントが発行されます。
引数
-
tokenAddress- 送付対象のトークンアドレス。
verifySignature
function verifySignature(
address _signer,
address tokenAddress,
uint256 amountToSent,
address destinationAddress,
bytes memory signature
) public pure returns (bool);
所有者の署名を検証する関数。
この関数は、所有者が送信した署名が有効であり、提案内容と一致することを確認します。
コントラクト外でユーザーが事前に検証する用途でも利用できますが、completeTransaction内でも必ず呼び出され、トークン送付を実行する前に署名が正しいことを確認します。
これにより、不正な署名による送金を防ぐことができます。
引数
-
_signer- 提案に署名した所有者のアドレス。
-
tokenAddress- 対象となるトークンのアドレス。
-
amountToSent- 送付額。
-
destinationAddress- 送金先のアドレス。
-
signature- 提案ハッシュを含む署名データ。
戻り値
-
bool- 署名が有効であれば
true、無効であればfalseを返します。
- 署名が有効であれば
ITokenStorage
interface ITokenStorage {
event TransactionProposed(uint256 hash);
event TransactionCompleted(uint256 hash);
event FallbackScenarioExecuted(address tokenAddress);
function proposeTransaction(address tokenAddress, uint256 amountToSent, address destinationAddress) external;
function completeTransaction(uint256 hash, bytes memory signature) external;
function sendFundsToOwner(address tokenAddress) external;
}
引用
Julius Lauterbach (@Julius278), "ERC-7968: Owner-Authorized Token Transfer Protocol [DRAFT]," Ethereum Improvement Proposals, no. 7968, June 2025. [Online serial]. Available: https://eips.ethereum.org/EIPS/eip-7968.
最後に
今回は「ユーザーが自分のトークンの所有したまま、第三者がガス代を負担して安全にトークン送金を代行できる仕組みを提案しているERC7968」についてまとめてきました!
いかがだったでしょうか?
質問などがある方は以下のTwitterのDMなどからお気軽に質問してください!
他の媒体でも情報発信しているのでぜひ他も見ていってください!