[ERC7580] オンチェーンでのユーザーアクションと広告報酬を追跡する仕組みを理解しよう！

# はじめに

初めまして。
**CryptoGames**というブロックチェーンゲーム企業でエンジニアをしている **cardene（かるでね）** です！
スマートコントラクトを書いたり、フロントエンド・バックエンド・インフラと幅広く触れています。

https://cryptogames.co.jp/

代表的なゲームは**クリプトスペルズ**というブロックチェーンゲームです。

https://cryptospells.jp/

今回は、ユーザーのアクションを追跡し、アクションに比例した報酬を分配できる広告クライアントインターフェースの仕組みを提案している**ERC7580**についてまとめていきます！

:::note info
以下にまとめられているものを翻訳・要約・補足しながらまとめていきます。
:::

https://eips.ethereum.org/EIPS/eip-7580

他にも様々なEIPについてまとめています。

https://cardene.notion.site/ERC-EIP-2a03fa3ea33d43baa9ed82288f98d4a9?pvs=4

# 概要

この規格では、広告クライアントがコントラクト内のユーザーアクションを追跡し、広告プロトコルからの報酬を確認するための標準インターフェースを提案しています。
この規格で提案されているインターフェースを実装するコントラクトは、イベントを使用してユーザーの情報を追跡します。
Dappsはこのインターフェースを実装して広告プロトコルに参加でき、ユーザーが特定のアクションをすることでプロジェクトから資金を受け取ることができます。
また、Dappsもプロトコルに参加することで比例報酬を受け取ることができます。

# 動機

Dappsが普及するにつれてオンチェーン広告の需要が急増します。
Web2の広告に比べて、Web3の広告は以下の点で優位性があります。

- トレーサビリティ
    - ブロックチェーン上のアクションはすべて追跡可能。
- 透明性
    - すべての取引が公開されているため、信頼性が高い。
- 直接的なインセンティブ
    - ユーザーに直接ボーナスやエアドロップを提供できる。

このインターフェースは、ユーザーのアクションを追跡して広告に基づいて報酬を分配する標準インターフェースを提供し、以下の流れで機能します。

1. **プロジェクトがプロモーション側からシードID（ハッシュ）を取得**
    - 広告キャンペーンの開始時に、プロジェクトがシードIDを取得します。
2. **プロモーションアクション開始前の通知**
    - プロジェクトのスマートコントラクトが`onTrackStart`インターフェースを呼び出し、ID、コントラクトアドレス、関数ハッシュを渡します。
    
    ```js
    function onTrackStart(bytes32 id, address contract_address, bytes4 function_hash) external;
    ```

3. **プロモーションアクション終了後の通知**
    - プロジェクトのスマートコントラクトが`onTrackEnd`インターフェースを呼び出し、同じID、コントラクトアドレス、関数ハッシュを渡します。
    
    ```js
    function onTrackEnd(bytes32 id, address contract_address, bytes4 function_hash) external;
    ```

4. **プロモーションコントラクトがアクション情報を収集して報酬を分配**
    - 広告キャンペーンが終了した後、プロモーションコントラクトが収集したデータに基づいて報酬を分配します。

以下のようなシナリオでの使用が想定されます。

- **コントラクトA**
    - ユーザーにボーナスやエアドロップを提供する広告キャンペーンを実施。
- **コントラクトB**
    - 特定のアクションを実行したユーザーにインセンティブを提供。

1. **ユーザーがコントラクトBで特定のアクションを実行**
    - コントラクトBが`onTrackStart`と`onTrackEnd`を呼び出し、アクションを追跡。

2. **コントラクトAがユーザーに報酬を提供**
    - コントラクトAがコントラクトBから受け取ったトラッキング情報に基づいてユーザーに報酬を分配。

このトラッキングメカニズムを導入することで、広告キャンペーンの効果を正確に測定して適切なインセンティブを提供することが可能になります。

# 仕様

## インターフェース

このプロトコルはアプリ間でのアクションを追跡する方法を標準化し、`onTrackStart`と`onTrackEnd`の2つの主要メソッドを定義しています。

```js
// SPDX-License-Identifier: CC0-1.0
pragma solidity ^0.8.10;

interface IERCXXX {
    // Events

    /// @dev Emits when track starts.
    /// @param track_id track id
    /// @param contract_address the address of tracking contract
    /// @param function_hash the hash of tracking function with params
    event onTrackStartRecorded(uint256 track_id, address contract_address, bytes32 function_hash);

    /// @dev Emits when track starts.
    /// @param track_id track id
    /// @param contract_address the address of tracking contract
    /// @param function_hash the hash of tracking function with params
    event onTrackEndRecorded(uint256 track_id, address contract_address, bytes32 function_hash);

    // Functions

    /// @dev Track a specified contract function start move.
    /// @param track_id track id
    /// @param contract_address the address of tracking contract
    /// @param function_hash the hash of tracking function with params
    function onTrackStart(uint256 track_id, address contract_address, bytes32 function_hash) external;

    /// @dev Track a specified contract function end move.
    /// @param track_id track id
    /// @param contract_address the address of tracking contract
    /// @param function_hash the hash of tracking function with params
    function onTrackEnd(uint256 track_id, address contract_address, bytes32 function_hash);
}
```

### イベント

#### `onTrackStartRecorded`
トラッキングが開始されたときに発行されるイベント。
- `track_id`
    - トラッキングID（追跡する一意の識別子）。
- `contract_address`
    - トラッキング対象のコントラクトアドレス。
- `function_hash`
    - トラッキング対象の関数とパラメータのハッシュ値。

#### `onTrackEndRecorded`
トラッキングが終了したときに発行されるイベント。
- `track_id`
    - トラッキングID（追跡する一意の識別子）。
- `contract_address`
    - トラッキング対象のコントラクトアドレス。
- `function_hash`
    - トラッキング対象の関数とパラメータのハッシュ値。

### 関数

#### `onTrackStart`
トラッキングが開始されたことを記録する関数。
- `track_id`
    - トラッキングID。
- `contract_address`
    - トラッキング対象のコントラクトアドレス。
- `function_hash`
    - トラッキング対象の関数とパラメータのハッシュ値。

#### `onTrackEnd`
トラッキングが終了したことを記録する関数。
- `track_id`
    - トラッキングID。
- `contract_address`
    - トラッキング対象のコントラクトアドレス。
- `function_hash`
    - トラッキング対象の関数とパラメータのハッシュ値。

# 補足

この提案のコアメカニズムは、複数のDapps間で共有されるトラッキングインターフェースを提供し、Dapp間のアクションを効率的に追跡できるようにすることです。
これにより、各プロジェクトが独自のトラッキングシステムを構築する必要がなくなり、開発コストと時間を節約できます。
トラッキング情報を収集して分析することで、広告キャンペーンやプロモーションの効果を正確に測定できます。
さらに、このデータに基づいて、ユーザーやプロジェクトに適切な報酬を分配することができます。
この規格で提案されているインターフェースは基本的なトラッキング機能を提供しているため、将来的により複雑なトラッキングが必要な時は拡張が可能です。

# 互換性

この規格によって互換性の問題は発生しません。

# 引用

wart (@wartstone), "ERC-7580: Advertisement Tracking Interface [DRAFT]," Ethereum Improvement Proposals, no. 7580, December 2023. [Online serial]. Available: https://eips.ethereum.org/EIPS/eip-7580.

# 最後に

今回は「ユーザーのアクションを追跡し、アクションに比例した報酬を分配できる広告クライアントインターフェースの仕組みを提案している**ERC7580**」についてまとめてきました！
いかがだったでしょうか？

質問などがある方は以下のTwitterのDMなどからお気軽に質問してください！

[Twitter @cardene777](https://twitter.com/cardene777)

他の媒体でも情報発信しているのでぜひ他も見ていってください！

https://chaldene.net/

https://zenn.dev/heku

https://cardene.substack.com/

https://mirror.xyz/0xcE77b9fCd390847627c84359fC1Bc02fC78f0e58

https://cardene.notion.site/ERC-EIP-2a03fa3ea33d43baa9ed82288f98d4a9?pvs=4