2023-03-29
Ubuntu Server 21.10でイーサリアムブロックチェーン【その1】 Ubuntu Server 21.10でイーサリアムブロックチェーン【その2】 Ubuntu Server 21.10でイーサリアムブロックチェーン【その3】 Ubuntu Server 21.10でイーサリアムブロックチェーン【その4】 Ubuntu Server 21.10でイーサリアムブロックチェーン【その5】 Ubuntu Server 21.10でイーサリアムブロックチェーン【その6】 Ubuntu Server 21.10でイーサリアムブロックチェーン【その7】
続きです。前々回、truffle developでNFT購入トランザクション実行後TransactionRevertedWithoutReasonErrorになってしまったので、環境を変えてリトライします。
オンラインでコード開発、デプロイ、別アカウントからのコントラクト呼び出しができるRemix IDEがあるので、そちらを使い、パブリックネットワークのRinkebyで実行します。
1、接続、ワークスペース準備
を開きます。デフォルトのワークスペースが出てるのでこれを変えてもいいんですが、とりあえずWorkspacesにある+ボタンで新規ワークスペースを作成します。
contracts, scripts, tests のなかに、デフォルトのファイルが設置されていますが、不要なので、右クリックですべて削除します。
2、ソースコードの設置と修正
contractsフォルダを右クリックして「New File」で、NFT_Test.sol を作成します。
import "openzeppelin-solidity/contracts/token/ERC721/ERC721.sol"; import "openzeppelin-solidity/contracts/token/ERC721/extensions/ERC721URIStorage.sol"; import "openzeppelin-solidity/contracts/utils/Counters.sol";
を、
import "@openzeppelin/contracts@4.4.2/token/ERC721/ERC721.sol"; import "@openzeppelin/contracts@4.4.2/token/ERC721/extensions/ERC721URIStorage.sol"; import "@openzeppelin/contracts@4.4.2/utils/Counters.sol";
に変更します。
3、コンパイル
SOLIDITY COMPILER タブを開いて、Compile NFT_Test.solをクリックしてコンパイルします。
コンパイルが成功すると、下のタブにCONTRACTのプルダウンリストができるので、NFT_Test(NFT_Test.sol)を選択したうえで、
その下の「ABI」や「Bytecode」ボタンで、コマンドラインコンパイラsolcが出力するようなABI JSONファイルやバイナリコードをダウンロードできます。
4、デプロイ
DEPLOY & RUN TRANSACTIONS タブを開きます。Rinkebyネットワークにデプロイしたいので、ENVIRONMENTでInjected Web3を選択します。
するとMETAMASKが反応して接続許可ダイアログが出ます。接続させたい=トランザクションの発行元アカウント=を選択して、ネットワークがRinkebyが選択されていることを確認し接続許可をします。
ここでは、デプロイは代表アカウントであるAccount 1に行わせますので、METAMASKでAccount 1を選択してDEPLOYタブのACCOUNTに反映させます。
CONTRACTプルダウンでNFT_Test - contracts/NFT_Test.sol を選択して「Deploy」します。METAMASKがガス代見積もり確認してくるので、払って良ければ承認します。
デプロイトランザクションの状況は右下タブのコンソール画面で確認できます。成功したらview on etherscanをクリックして、Etherscanで確認してみましょう。
デプロイが成功すると、Deployed Contractsにコントラクトのアドレスが表示され、関数群がリストアップされます。引数を入力して関数ボタンを押せば実行できる仕組みです。
5、別アカウントからNFTを購入=mintする
RinkebyネットワークにNFT_Testが登録されたので、別人として、METAMASKのAccount 2から購入してみましょう。
同じDEPLOY & RUN TRANSACTIONSタブで、METAMASKを開き、Account 2に切り替えます。まだ所有ETHは0.1持っているはずです。
タブのACCOUNTがAccount 2のアドレスに切り替わったことを確認して、コントラクトに送るお金=VALUEに10 Finneyを設定します。10Finneyは約0.01ETHです。
したらば、関数群の「mint」をクリックします。METAMASKが相手に送金するVALUE=0.01ETHと、ガス代見積もり確認してくるので、払って良ければ承認します。
NFT_Test.mint()が呼ばれて、0.01ETH送ってきているなら、Account 2にトークン1のNFTをくれるはずです。そのトランザクションの様子は右下タブで確認できます。
もしも0.01ETHより少ないVALUE支払いで呼んでしまうと、Error encountered during contract execution [execution reverted] などとなりトランザクションは失敗します。
無事成功すると、METAMASKはSuccessダイアログを出し、右下コンソールも緑色でSuccessがでます。成功も失敗も、トランザクション内容がview on etherscanで見れます。
6、トークン所有の確認
トークン番号1のNFTはAccount 2に渡ったはずなので、関数群のbalanceOfにAccount2のアドレスをペーストし呼んでみましょう。
uint256: 1
と表示されるはずです。また、ownerOfに1を入力して呼んでみましょう。トークン1の所有者は誰か?=Account 2のアドレスが表示されるはずです。
7、OpenSeaでのNFTコンテンツ確認
【前々回の先頭で作成したテストNFTデータ】があり、_setTokenURIで設定したトークンURIに正しくJSONが設定されていれば、OpenSeaのテストネットで確認できます。
にアクセスして、WalletにMETAMASKを選択して、トークンを所有しているAccount 2に切り替えて、Collectedにコンテンツが表示されていれば成功です。
8、購入したNFTを返して換金する=burnする
NFT_Testには発行したトークンを半額で買い取ってNULL ADDRESSに捨てる関数burnも書いていますので、呼んでみましょう。
まず、失敗例として、METAMASKでAccount 1に切り替えて、burnに1を入れて呼んでみます。すると、当然ながら、このトークンの所有者ではないので、トランザクションは失敗してはじかれます。
では、所有者であるAccount 2に戻して、ふたたびburnに1を入れて呼んでみます。今度は成功します。Account 2のETH残高にいくらか返金されているのがMETAMASKで確認できます。
また、balanceOfにAccount 2のアドレスを貼って呼ぶと、さきほど1だったのが、0になってます。そしてownerOfに1を入れて呼ぶと、所有者がNULL ADDRESS(BURN ADDRESS)に変わっています。正常に償却されたということです。
更に、Etherscanでコントラクトのアドレスを打って情報を見ると、balance: 0.005 Etherになっているのが確認できます。0.01ETH持ってましたが、返金したため半分に減ったということです。
Etherscanではトークンの履歴も確認できるので、どこでどうなったか追うことができます。
※本記事内容の無断転載を禁じます。
ご連絡は以下アドレスまでお願いします★
Windowsのデスクトップ画面をそのまま配信するための下準備
WindowsでGPUの状態を確認するには(ASUS系監視ソフトの自動起動を停止する)
CORESERVER v1プランからさくらインターネットスタンダートプランへ引っ越しメモ
さくらインターネットでPython MecabをCGIから使う
さくらインターネットのPHPでAnalytics-G4 APIを使う
インクルードパスの調べ方
【Git】特定ファイルを除外する.gitignore
【Ubuntu/Debian】NVIDIA関係のドライバを自動アップデートさせない
【Python】Spacyを使用して文章から出発地と目的地を抜き出す
【Windows10】リモートデスクトップ間のコピー&ペーストができなくなった場合の対処法
Windows11+WSL2でUbuntuを使う【2】ブリッジ接続+固定IPの設定
Windows版Google Driveが使用中と言われアンインストールできない場合
VirtualBoxの仮想マシンをWindows起動時に自動起動し終了時に自動サスペンドする
【Apache】サーバーに同時接続可能なクライアント数を調整する
【C/C++】小数点以下の切り捨て・切り上げ・四捨五入
Googleファミリーリンクで子供の端末の現在地がエラーで取得できない場合
【Linux】iconv/libiconvをソースコードからインストール
Ubuntu Server 21.10でイーサリアムブロックチェーン【その5】