2022-03-30



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ではトークンの履歴も確認できるので、どこでどうなったか追うことができます。



※本記事内容の無断転載を禁じます。

子供たちの成長のことなら!スクスクのっぽくん

ととのう時間に寄り添う、クラフトジン【HOLON】

持ち運べるミラバス。【どこでもミラバスポータブル】

光回線を申し込むなら特典満載の【ドコモ光×ひかりTVショッピング】

【遺品買取専門】バイセルはおかげさまで月間依頼件数10,000件突破!

まだ利息だけ返済してるの?無料相談で借金減額出来るから急げ!!

半額キャンペーン実施中!自動売買に最適なお名前.com デスクトップクラウド

自由テキスト(元祖黄色い財布 黄虎發財財布)

脱毛ラボ考案!業務用パワーを実現「Datsumo Labo Home Edition」

bitcoinjs-lib、bip32、bip39を使ってビットコインアドレスを生成する
Cannot read property makeRandom of undefinedと言われた場合
web3.jsとwindow.ethereumでコントラクト関数を引数つきでコールしプロパティを取得する
JavaScriptで外部URLのファイルをダウンロードしてデータを取得する
【MetaMask】window.ethereumのeth_callで任意のコントラクト関数を呼ぶ
window.ethereum.requestに渡すdataフィールドをABIエンコードで作成する
【Solidity】Remix IDEを使用してサーバー不要のコントラクト開発&デバッグ【Ethereum】
【Windows】Googleフォトからダウンロードした動画が音声のみで映像が再生されない場合
PostgreSQLをソースコードからインストールしてsystemdのサービスとして動かす
5chブラウザJane Styleの板一覧にゲーム板等が表示されない場合
Windows版Google Driveが使用中と言われアンインストールできない場合
【Windows10】リモートデスクトップ間のコピー&ペーストができなくなった場合の対処法
Googleスプレッドシートを編集したら自動で更新日時を入れる
【Javascript】JSON配列内にある特定要素の取得法【Node.js】
Ubuntuで固定IPアドレスを使う設定をする
Googleファミリーリンクで子供の端末の現在地がエラーで取得できない場合
【Hackintosh】組立PCにWindowsとmacOSを同居させる場合の注意点
Google ColaboratoryのTensorFlowバージョンを変更する(1.X←→2.X)