はじめに
今月からブロックチェーンの勉強を始めまして、色々検索していると「no plan inc. からの挑戦状」という記事を見つけました。
Twitter上で面白いみたいなコメントが多数ありましたが、超初心者の僕はどのように問題を進めるのかもわかりませんでした。
この記事では、僕と同じような超初心者の方に向けて、問題に取り組む方法を調べてまとめようと思います。
※ 他にもっといい方法があるかもしれませんが、「とりあえず出来る状態」を目指します。
今の自分のブロックチェーンに関するレベル感
- CryptoZombiesのlesson1-6をやり、Solidityの基本的な読み書きはできる
- ブロックチェーンの本を数冊読み、記事を読み漁り、概要をなんとなく把握している
- Dappsを実際に考えて実装したり、デプロイした経験はない
- NFTを扱った経験はない
- MetaMaskを使った経験はある
- PancakeSwapやVenusなどのDeFiを少しだけ触ってみた経験はある
問題
問題は以下の引用文の通りです。
Polygon上のコントラクト 0xcf4498ec517904def6d96f578c10de4538f53c30 から3つのNFTを奪ってください!!
https://zenn.dev/no_plan/articles/d9ef3b9075ec9e
流れ
- コントラクトを見てみる
- MetaMaskにPolygonのネットワークを追加する
- PolygonscanとMetaMaskを接続する
- Polygonscanから関数を実行する
コントラクトを見てみる
Polygonscanからコントラクトを確認することができました。
Polygonscanでは、トランザクション、ブロック、ウォレットアドレス、スマートコントラクトなどチェーン上の情報を検索できるようです。
(Ethereumネットワーク用はEtherscanで、EtherscanのPolygonバージョンがPolygonscan)
Polygonscanを開き、問題のコントラクトのアドレスを入力して検索すると、コントラクトに関する情報が表示されます。
Contractタブを開いて下にスクロールすることで、実際のコントラクトの内容を見ることができます。
Contractタブを開く | コントラクトのコードを確認 |
---|---|
![]() |
![]() |
1つ目の問題の部分はこんな感じで書かれていました。
function q1(uint _year) external {
require(_year == 2021, "This year is 2021");
require(!q1Minted[msg.sender], "Your account has already minted.");
q1Minted[msg.sender] = true;
q1NFT.mint(msg.sender);
}
これで、問題を解くためのコードを確認することが出来ました。
q1の関数に条件を満たす引数を渡して実行することで、NFTを手に入れることができるみたいです。
今回は、引数の_yearが2021だとrequireの条件がtrueになって、NFTを手に入れることができますね!
問題を作成した方が解説記事も書いてくださっているようなので、詳しい解説はこちらの記事をご覧ください。
NFTを用いたCTFを開催したので問題作成者が解説してみる
これで、以下のことが分かりました。
- コントラクトの内容
- コントラクトの関数を実行することで、NFTを手に入れる(問題を解く)ことが出来ること
Polygonscanから関数を実行しようとしてみる
Polygonscanを使うと関数を実行することもできるみたいです。
開いてみると先程コードの中で見つけた関数であるq1があります。
_yearという引数を入力する場所もあります。
引数の数値を入力して、Writeをクリックすることで関数が実行できます。
これで、関数を実行する方法が分かりました。
しかし、これだけでは関数は実行できず、実行するためには自分のウォレットを接続する必要があります。
写真の「Connect to Web3」が接続のためのボタンです。
接続のためには、MetaMaskにPolygonのネットワークを追加し、PolygonscanとMetaMaskを接続する必要があります。
以下で方法を解説します。
MetaMaskにPolygonのネットワークを追加する
まずは、MetaMaskにPolygonのネットワークを追加します。
追加せずに「Connect to Web3」をすると「metamask RPC Error: Unrecognized chain ID "0x89". Try adding the chain using wallet_addEthereumChain first」とエラー文がconsoleに表示されました。
MetaMaskを開き、登録してあるネットワークの一覧部分から「ネットワークを追加」をクリックし、以下の情報を入力して保存することでMetaMaskにPolygonのネットワークを追加することが出来ます。
ネットワーク名:Polygon Mainnet
新しいRPC URL:https://polygon-rpc.com
チェーンID:137
通貨記号:MATIC
ブロックエクスプローラーのURL:https://polygonscan.com
新しいRPC URL部分が「https://rpc-mainnet.maticvigil.com
」と解説されている記事もありますが、これは古いものみたいです。
参照:MetaMask(メタマスク)とPolygonScanがうまく接続されない問題を解決します!
MetaMaskにPolygonのネットワークを追加する詳しい手順は以下の記事で解説されています。
MetaMask(メタマスク)をPolygon(ポリゴン)に接続する方法|画像たっぷりでわかりやすく解説!
PolygonscanとMetaMaskを接続する
MetaMaskにPolygonのネットワークを追加することが出来たら、「Connect to Web3」をクリックしてMetaMaskを選ぶことでPolygonscanとMetaMaskを接続することが出来ます。
※この時、Braveでは上手くいきませんでしたがChromeを使うことで出来ました。Braveをお使いの皆さんはChromeで試してみてください。
Polygonscanから関数を実行する
先程は、PolygonscanとMetaMaskが接続できていなかったので実行できませんでしたが、PolygonscanとMetaMaskの接続が出来たので、再度関数を実行してみます。
実行することが出来ました!
関数を実行するためには、だいぶ安いですが、少しのGas代がかかります。僕の場合は、0.004683MATIC(=0.53円)でした。
僕は勉強代だと思って、以下の記事の方法でMATICを買ってみました。
超簡単!JPYCからPolygonへSwap(スワップ)する画期的方法を解説!
トランザクションのStatusがSuccessになったので、OpenSeaのProfileページを確認してみます
無事に、NFTを手に入れることが出来ました!!
これで1問、問題を解くことが出来ました👏
終わりに
このようにコントラクトから直接コントラクトの関数を呼び出すことを「直コン」というみたいです。
「直コン」すら分からず、色々試しながらだったのでたったこれだけの事をするのにぼちぼち時間かかりました笑
これから初めてやるって方の参考になったら嬉しいです。
これで問題の進め方が分かったので、今後同じような問題を見つけたときには自分も参加してみようと思います。
自少しずつブロックチェーンの概要が分かってきた気がします。これからももっともっと学んでいきます!
皆さんも一緒に頑張りましょ〜〜〜
参考
zenn - no plan inc. からの挑戦状
zenn - NFTを用いたCTFを開催したので問題作成者が解説してみる
Polygonscan
Etherscan
MetaMask(メタマスク)をPolygon(ポリゴン)に接続する方法|画像たっぷりでわかりやすく解説!
MetaMask(メタマスク)とPolygonScanがうまく接続されない問題を解決します!
超簡単!JPYCからPolygonへSwap(スワップ)する画期的方法を解説!