見出し画像

Python, Solidityを使った独自Smart ContractでPolygonにMintしたNFTをOpenSeaで公開する

はじめに

@yutakikuchi_です。

NFTがこの1年ほど流行っており、このNoteを書いている僕自身の事業でもWeb3技術を用いた取り組みを行っております。そんな時代の流れにもついていくために、本NoteではOpenseaの外の世界でMintされたコンテンツをOpenseaで公開するということをやってみたいと思います。OpenseaでコンテンツのMintもできますので、そちらでOKという方はこのドキュメントは無視してください。

尚、Openseaは2022.02現在ETH、PolygonのBlockchainをsupportしているので、どちらかのBlockchainを選択する必要があり、とりあえずお試し公開なので、ここではPolygon(Mumbai)を選択します。

https://mumbai.polygonscan.com/

2022.02現在、Openseaも機能拡張を図っているということで、今後はSolanaなどの追加Blockchainの対応も期待ができそうです。

本記事で達成したいこと

世間で公開されている無料の範囲内での独自コントラクトによるNFT mintの方法は様々なツールやライブラリを導入しないと実現できないものが多く、それらに依存したスクリプト実行もたくさん行う必要があります。もしくはすでに出来上がったWebツールを利用してNFT mintを操作すると、BlockChainとOpenSea上でのデータの流れや仕組みの説明についてBlackBoxになっております。

本Noteの内容では、PythonとSolidity関連のライブラリの導入だけでJavascriptを触ることがありません。(Hardhatの必要なし。)実行するスクリプトもPython1個だけになります。更にはBlockChain、OpenSea上でのデータの流れの全体像を示し、皆さんにも理解いただくことを目指します。

やること

やろうとしていることの全体像は下記になります。

画像3


上の全体像のうち、Polygon上にNFTをMintするところだけを下記では詳しく説明します。上はあくまでも全体像把握のためであり、ところどころ先の向き先や理解が怪しい箇所がありますので、参考にする程度までに...(笑)

独自Contractを使ってPolygon(Mumbai)にMintするためには事前にいくつかの作業を必要とします。また本Noteについては「6」の作業について焦点を当てているため、0〜5については外部リンクのReferenceを貼っています。

0. NFTコンテンツをHTTPで接続できる環境にホストし、そのURLを示すToken URIを準備します。(Token URLはMetadata URLなどとも呼ばれる。)本Noteで説明してるのはすべてBlockChain上にTxを記載する、いわゆるフルオンチェーンではないので、外部のToken URIを必要とします。
Ref: https://cam-inc.co.jp/p/techblog/603394496142509097

1. Polygon上にNFTコンテンツを保有することを示すための、トランザクションを受けるためのアドレス。(Openseaと接続するためのPolygon上の公開アドレス)こちらはMetamask上で作成可能。またこちらのアドレスをOpenSeaのアカウントから利用するBlockChainアドレスとして利用します。以降、User Addressと記載します。
Ref : https://docs.polygon.technology/docs/develop/metamask/config-polygon-on-metamask/

2. 1のUser Addressに対して通貨Tokenを入れておく必要があります。PolygonのテストネットであるMumbaiの場合は下記FaucetからTokenの発行ができるので、User Addressを入力します。
Ref : https://faucet.polygon.technology/

3. 1と接続するための秘密鍵(Metamaskの秘密鍵)
Ref : https://metamask.zendesk.com/hc/en-us/articles/360015289632-How-to-Export-an-Account-Private-Key

4. MFTをMintするContract用のPolygon上のアドレス。(持ち合わせていなければ6で実行するmint_nft.pyスクリプト内で自動的に作成)。いわゆるContractをDeployするためのアドレスとなります。
Ref : https://ethereum.org/en/developers/docs/smart-contracts/deploying/

5. Polygonに接続するためのInfura URL。主にPolygon Networkの詰まりを解消。下記URLからSignupして、Polygonへの接続を有効にします。2022年2月現在はPolygonへの接続addonを0円へのディスカウントで提供されていますが、Infuraの利用にはクレジットカードが必要であり、いつ有償になるかわからないので注意が必要です。
Ref: https://infura.io/

6. 本Noteに記載されているNFT mintを実行できる環境を整え、yamlファイルに上記1〜5のパラメータを追加し、mintスクリプトの実行。下記のgithub URLにソースコードを公開しています。
Ref : https://github.com/yutakikuchi/mint-nft-python

$ git clone git@github.com:yutakikuchi/mint-nft-python.git
$ npm install --prefix=./ @openzeppelin/contracts
$ pip install -r requirements.txt
$ <nft_config.yamlファイルを修正>
$ python mint_nft.py

requirements.txtの中に記載されているものとして、web3, py-solc-xというものがあり、web3はBlockChainクライアント、py-solc-xは独自コントラクトがSolidityをpython上でコンパイルするものになります。ここでの独自コントラクトであるSolidityは下記Refからのコピペとなっており、必要であればsolidity/MyNFT.solのConstructor内のコントラクト名、シンボル名を修正してください。
Ref : https://ethereum.org/en/developers/tutorials/how-to-write-and-deploy-an-nft/#write-contract
MyNFT.sol : https://github.com/yutakikuchi/mint-nft-python/blob/main/solidity/MyNFT.sol#L15-L16

また上記mint_nft.pyの実行の際に、installされたsolc versionとopenzeppelinのpathに注意してください。githubに登録したソースコードではsolc versionを0.8.10、openzeppelinのinstallをlocalとし、pythonからbase_pathを設定することで、python内のsolidity compile関数からopenzeppelinの各種importファイルを読み取っています。それぞれ、各々の実行環境にあわせて、mint_nft.pyの中を修正してください。

OpenSea上での公開

MintされたNFTをOpenSea上で公開する方法としてはいくつかありそうです。

パターン1 : OpenSeaのアカウント登録ができていれば、OpenSea上のProfileからBlockChain上のUser Addressに自然とアクセスができるので、自身のCollectedの中にmintされたNFTコンテンツが掲載されると思います。

パターン2 : 上で独自コントラクトに利用したContract AddressをOpenSeaの下記URLから入力します。ここでの登録はMintされたTxを所有するUser Addressの方ではなく、Contract Addressの方なので注意が必要です。

Mumbai : https://testnets.opensea.io/get-listed/step-two
MainNet : https://opensea.io/get-listed/step-two

画像2

どちらのパターンでもOpenSea上でNFTコンテンツが掲載されており、所有者が自身である「Owned by you」という文字が詳細ページに書かれていれば「Sell」することが出来ます。

画像1

Mintの仕組みはGithubで公開しています

Python, Web3.py, py-solc-x, openzeppelinを活用したPolygonへのNFT mintのスクリプトは下記で公開しておりますので、READMEを読みながら実行してみてください。

以上です。疑問点などあれば、コメントなどお願いいたします。

この記事が気に入ったらサポートをしてみませんか?