![見出し画像](https://assets.st-note.com/production/uploads/images/73279948/rectangle_large_type_2_523c5a2a00fcf54cd33baf23e045ec41.png?width=1200)
Python, SolidityによるFull On ChainでNFTをMintする
はじめに
@yutakikuchi_です。
以前にPython, Solidityを使った独自ContractでのMintの記事を書きましたが、その仕組はOn Chain, Off Chainの組み合わせによるMint方法でした。以前のものは特にMetadataと言われるコンテンツの管理がOff Chainで実行されているものでしたが、このNoteではOn Chainの技術のみを使ったMint方法について紹介します。利用するのはOn Chainの技術のみなので、Full On Chainという呼び方をします。
尚、ここで利用するBlockChainはPolygonであり、Test用のMumbaiを使った例になります。実行テストはしていませんが、InfuraのURLをETHにすれば、ETHでも利用可能だと思います。
やることの全体像
本Noteでやることの全体像を下記画像で記します。NFTを独自mintするためにはSmart Contractとそれに対して操作を行うaddressの2つが必要とします。下記ではそれらをContract address, your addressという記載をしています。
詳細は後ほど出てきますが、githubに登録したmint_nft_onchain.pyを実行するとSmart ContractのDeployとmint NFTの両方をPolygon上で実行します。OpenSeaからはContract address, your addressの両方を参照して、最終的にNFTのコンテンツをPolygonから取得しています。
事前準備として
下記で記載した「やること」の1〜6の準備内容がそのままここでも必要になります。尚、以前必要としたToken URIの準備は不要になります。今回はそれをToken URIの仕組みをOnChain化しています。
https://note.com/yutakikuchi/n/n03dc50bc5935
Full On Chainのmintを実行
上のgithub repositoryをcloneします。Solidityのライブラリであるopenzeppelinを必要としますが、それ以外は基本pythonで実行が可能です。実行のための様々な設定値が必要で、それらはnft_config.yamlに記載します。(注)your addressの秘密鍵を必要とするため、ご自身のlocal環境だけでの実行だけにとどめてください。また実行は全て自己責任でお願いします。
$ 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_onchain.py test.svg
上のコマンドをterminalで実行します。まずはSmart ContractのDeploy Stepになります。nft_config.yamlのuser_address, private_keyは必ず必要なものなので記載します。contract_addressについては初回の実行時には記載は不要で、空であればmint_nft_onchain.pyでSmart ContractをDeployし、Contract addressを取得します。2回目以降の実行では初回実行時に取得したContract addressを記載します。
dev:
infura_url: <infura_url>
user_address: <user_address>
private_key: <private_key>
contract_address: <contract_address>
Mint Stepとして、mint_nft_onchain.pyでは引数にsvgファイルを必要とするため、mintしたい画像をsvg形式で保存しておきます。mint_nft_onchain.pyではsvgファイルを読み取り、xml形式に変換した上でSolidityのSmart Contractにデータを渡します。それをSolidity側でbase64に変換し、BlockChain上に書き込む仕組みになっています。
Mint後、OpenSeaに対してSmart Contractのaddressを渡して上げればNFT ContentsをOpenSea上で確認できると思います。その実行内容も下記のURLに記載されています。
https://note.com/yutakikuchi/n/n03dc50bc5935
最後に
いくらLocalの実行と言っても秘密鍵をMetamaskから取得するのは嫌だという方もいると思うので、そのうち秘密鍵は取り出さずにMetamask経由でBlockChainにFull On ChainでMintできるWeb版も公開する予定です。