😎

【Opensea】NFTに無限に「いいね❤」押せるHack

2022/08/11に公開

Openseaが意外とガバガバだった話。


Openseaは世界最大級のNFTマーケットプレイスです。

はじめに

@LostMyCode: 日々なんかhackできることないか探すのに勤しんでいます(謎精神)

なぜこんなものを作ったのか?

どんな意味があるのか?

そんな疑問もあるでしょうが、作ったのは「いいね」が欲しいからではないです。

ただ、そこにいいねを無限に増やせそうなOpenseaがあったからです😋

Openseaのいいね機能

Openseaは世界最大のNFTマーケットプレイスで、NFTごとに「いいね」を押せる機能があります。

そこで気づいたんですけど、Openseaってウォレットさえ用意すればアカウント作れるから無限にアカウント作り放題なんですね。

つまり、「いいね」も付け放題の状態です。

image.png

1日くらいほったらかしにしてたら1万8000いいね付いてました(証拠

実現するまでの流れ

言語: node.js

おおまかな流れとしては

  • ウォレットを作成
  • Openseaのアカウント作成
  • アカウントのAuthトークンを取得
  • 「ターゲットのNFTにいいねをつける」メッセージを送信

までをプログラムで自動化する。

ウォレット作成

イーサリアムのウォレットを作成します。

これはnode.jsなら ethereumjs-walletとかを使えば可能です。

const ethWallet = require("ethereumjs-wallet");

...


const privateKeyBuffer = Buffer.from(privateKey, "hex");
const wallet = ethWallet.default.fromPrivateKey(this.privateKeyBuffer);
const address = this.wallet.getAddressString();

Openseaアカウントを作成

作成したウォレットを用いてOpenseaアカウントを作成します。

OpenseaのAPIに対して
challengeLoginMessageQueryというリクエストを自分のウォレットアドレスを添えて送るとメッセージが届きます。

以下のようなメッセージ(Metamaskで見たことある人も多いハズ)
image.png

このメッセージに対して自分のウォレットで署名して送り返す必要があります。

Authトークン取得

ウォレットでメッセージに署名してAPIに送ることでAuthトークンを取得することができます。

署名は node.jsですと、 eth-sig-util が使えます。

const ethSigUtil = require("eth-sig-util");

...


// dataがメッセージstring
const signature = ethSigUtil.personalSign(privateKeyBuffer, { data });

これで署名を得られます。
これをOpenseaAPIに対してauthLoginMutationでリクエストします。
送るのは 自分のウォレットアドレス、受け取ったメッセージ、メッセージに対する署名

するとAPIからtokenがレスポンスで返ってきます。

auth token

eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1c2VyX2lkIjoiVlhObGNsUjVjR1U2TXpVMU5UWTJNams9IiwidXNlcm5hbWUiOiJTWU5LLXMxbXI4M2pkIiwiYWRkcmVzcyI6IjB4MDMyYzVmYWJmYzkxZDcyNTg1M2NlOGE2MTY5NDMxYTEzNDRmMDQxNiIsImlzcyI6Ik9wZW5TZWEiLCJleHAiOjE2NTczNzk0OTQsIm9yaWdJYXQiOjE2NTcyOTMwOTQsImFwaUFjY2VzcyI6Im5vbmUifQ.N82VH95yDa9V31PoHJw6nnFG7CVKkfMtpcOePTh7foo

いいね付けたいNFTに「いいね」リクエスト送信

またまたAPIにリクエストを送ります。
今回はさきほど受け取ったAuth tokenをAuthorizationヘッダにセットします。

headers: { authorization: "JWT " + authToken }

いいねをつけるときは useAssetFavoriteMutationリクエストを送信します。

送るリクエスト内容は以下のようになっています。

        let res = await OSP.requestAPI(
            {
                "id": "useAssetFavoriteMutation",
                "query": "mutation useAssetFavoriteMutation(\n  $asset: AssetRelayID!\n  $isFavorite: Boolean!\n) {\n  assets {\n    updateFavorite(asset: $asset, isFavorite: $isFavorite)\n  }\n}\n",
                "variables": {
                    "asset": assetId,
                    "isFavorite": true
                }
            },
            {
                headers: {
                    "authorization": "JWT " + authToken
                }
            }
        );

assetIdが対象のNFTのIDです。
このIDの取得方法は今回は省略します。
(簡単な説明:NFTのページにハードコードされているのでスクレイプするだけで大丈夫です)

一連の処理を無限ループ化

あとはwhileするなり、いいね押したい数だけforループするなりで好きなだけ「いいね」をNFTに押せるようになります。

image.png
https://opensea.io/assets/matic/0x2953399124f0cbb46d2cbacd8a89cf0599974963/18787915268332924190917742420012866093351266449183228028156090440355409821697

さいごに

いいね増やして「何の意味があるのか?」と思うかもしれませんが、
冒頭でもお話したように意味はないですし「いいね」が欲しいわけでもなく、ただそこにいいね押す機能があったからです。

ただ、あなたのNFTが普通の無名NFTより「なんでこんないいね付いてるんだ?」って注目を集めることはできると思います。

他のOpensea関連ツール紹介


NFTを無限にMintしてプレゼントするツール


【自動】手数料無料で数万人のユーザーにNFTを送るツール


Hacked by @LostMyCode

Discussion