【Opensea】NFTに無限に「いいね❤」押せるHack
Openseaが意外とガバガバだった話。
Openseaは世界最大級のNFTマーケットプレイスです。
はじめに
@LostMyCode: 日々なんかhackできることないか探すのに勤しんでいます(謎精神)
なぜこんなものを作ったのか?
どんな意味があるのか?
そんな疑問もあるでしょうが、作ったのは「いいね」が欲しいからではないです。
ただ、そこにいいねを無限に増やせそうなOpenseaがあったからです😋
Openseaのいいね機能
Openseaは世界最大のNFTマーケットプレイスで、NFTごとに「いいね」を押せる機能があります。
そこで気づいたんですけど、Openseaってウォレットさえ用意すればアカウント作れるから無限にアカウント作り放題なんですね。
つまり、「いいね」も付け放題の状態です。
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で見たことある人も多いハズ)
このメッセージに対して自分のウォレットで署名して送り返す必要があります。
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に押せるようになります。
さいごに
いいね増やして「何の意味があるのか?」と思うかもしれませんが、
冒頭でもお話したように意味はないですし「いいね」が欲しいわけでもなく、ただそこにいいね押す機能があったからです。
ただ、あなたのNFTが普通の無名NFTより「なんでこんないいね付いてるんだ?」って注目を集めることはできると思います。
他のOpensea関連ツール紹介
NFTを無限にMintしてプレゼントするツール
【自動】手数料無料で数万人のユーザーにNFTを送るツール
Hacked by @LostMyCode
Discussion