見出し画像

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

事前準備として

下記で記載した「やること」の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版も公開する予定です。

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