4
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

no plan inc.Advent Calendar 2022

Day 11

NFTの所有情報を使ったプロダクト「ReCone」について

Last updated at Posted at 2022-12-11

これはno plan inc.の Advent Calendar 2022の11日目の記事です。

no plan株式会社ではNFTホルダー限定のコミュニティサイト「ReCone」を開発しています!
今日はその中身の技術の話しなどさせていただきます!

ReConeとは

A2CD8425-2C1D-45A4-AF8F-DDDD4B003ED4.png

ReCone(リコーン)とは、NFTホルダー限定の半クローズコミュニティプラットフォームです。
NFTを持っている人が世界中から集まり、限定ライブや限定投稿、限定チャットなどによって、クリエイターやファン同士の交流が促進され、NFTの価値を向上することができます。

FireShot Capture 023 - 投稿一覧 - ReCone🦄 - www.recone.app.png

このように、NFTを持っている人に特別な情報を届けることができます。

NFTの所有判定について

ReConeでは、あらゆるNFT規格、あらゆるNFTのネットワークに対応するべく、NFTの所有判定の実装を行なっています。

現在対応しているNFTの規格としては

  • ERC-721
  • ERC-1155

また対応しているネットワークとしては

  • Ethereum
  • Polygon
  • Shiden

になります。しかしながら、
NFTの所有者情報を使ったサービスで特有のつらみが発生することがわかりました

NFTの所有者情報を使ったサービスでのつらみ

1: ERC-721でNFT所有者を把握する

以前ReConeでは、「Alchemy」というサービスでノードをレンタルしNFTのOwnerOf関数を叩いてこのNFT誰が持っているのかを実装していました。

2: ERC-1155にはownerOf関数がないことに気づく

ERC-1155のドキュメントを見るとownerOf関数がありませんでした。

3: 2の解決案としてownerOf関数の代わりにbalanceOf関数 と balanceOfBatch関数を利用

  • balanceOf関数は誰が何個持っているかがわかる関数になります
  • しかしbalanceOf関数は引数にウォレットアドレスを取るため、目的であるNFT所有者を把握したい場合には使用できません
  • 対策としては、BatchTransferとSingleTransferという関数を呼び出し、Transaction履歴を追跡すると所有者情報を取得するようにしました

4: 3の解決策をしても、SingleとBatchの2つを気にする必要がある

  • 目的のNFTがBatchでTransferされたのかSingleでTransferされたのかを意識する必要がありました

5: 4の解決策をしてもメモリに乗り切れない

  • OpenSeaなどの巨大NFTコントラクト(1コントラクトにたくさんのTransaction履歴がある)場合、大体のサーバーではメモリに乗り切れずクラッシュが発生します
  • 解決策としては、サーバーで処理できる数でページネーションを行い、分けて処理を記述しましょう

6: 5が解決してもマルチチェーン対応でつまる

  • 別のネットワークのNFTの情報も欲しくなってバッチが終わらなくなってきます

7: 6を解決してもデータ、CPUとメモリを圧迫が激しい

  • めちゃめちゃ圧迫されました

どう解決すべきか

弊社の見解としては、
「NFTの所有者情報の実装をサービスごとに独自実装するべきでない」
という見解になりました

no plan株式会社ではこのつらみを解決するAPIを公開しています

TIUS APIについて

このAPIではNFTの判定にこの呼び出しのコードだけで実現でき、上記のつらみを解決することができます

.ts
import {createClient} from "@urql/core";
import fetch from 'cross-fetch';

const client = createClient({
    url: GRAPHQL_ENDPOINT,
    fetch,
    requestPolicy: 'network-only',
    fetchOptions: () => {
        return { headers: { 'X-API-KEY': GRAPHQL_API_KEY } };
    },
});

const getOwner = async () => {
    const results = await client.query<
    GetOwnerQuery,
    GetOwnerQueryVariables
    >(GetOwnerDocument,
       {
        address: "0xC52d9642260830055c986a97794B7b27393Edf5e"
      }).toPromise();

    results?.data?.erc721ByContractAddress?.tokens
    .forEach(token => {
        console.log(token.tokenId);
        console.log(token.ownerAddress)
    });
}

まとめ

  • ReConeはNFTホルダー向けのプラットフォームです
  • NFTの所有者情報を使ったプロダクトはつらみがあります
  • NFTの所有者情報はTIUS APIで簡単に実現できます

no plan株式会社について

4
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?