基礎は大事で、大事なんだけども何かができるわけではないので面白くないし、なおかつ一人で始めようとしてもトラブルが連発してなかなか進まないんですよね。
前回に引き続きNFT関連です。もう少し進めれば一人で開発できるようになるかもしれません。
ちなみにメンタリングの間は別のカードゲームを作っていたりするわけですが。
余談はさておき、メンタリングの内容です。
/////////////////////////////////////////////////////////////////////////////
はい、それでは今日もよろしくお願いします。
先日の続きです
VSCodeで、WSLへの接続をお願いします
あと、Terminalを開いて、opensea-creaturesにディレクトリ移動してください
76.21 KB
OKです!
次に、Infuraのkeyが必要になります。
事前準備として、 infura.io に登録していただいたと思います。
はい。
Ethereum API | IPFS API & Gateway | ETH Nodes as a Service | Infura
Infura's development suite provides instant, scalable API access to the Ethereum and IPFS networks. Connect your app to Ethereum and IPFS now, for free!
Infuraを使うと、サーバレスで(自分でサーバーを立てることなく)Ethereum networkにアクセスすることができるようになります。 また、テストネットがあり、ファセットでETHを入手して使うことができるのでリアルマネーを消費しないでお試しすることができます。(編集済)
ログインして、適当な名前でProjectを作りましょう。
7.35 KB
119.72 KB
OKです
VIEW PROJECTを押していただいて KEYSのところ、ENDPOINTってありますかね。 /v3/以降がkeyです。
プロジェクトの、ってとこです
OKです。
それでは、VSCodeのターミナルで、
export INFURA_KEY="<your_infura_key>" の、<your_infura_key>のところをinfura keyに入れ替えて、エンターです。
環境変数というのを設定します
いれました。
これは、今開いてるターミナルでのみ有効な変数です
echo $INFURA_KEY とすることで確認できます
次に、 export MNEMONIC=“<metamask>” ですが、これはmetamaskの秘密鍵です。この秘密鍵に紐付いたアドレスで、スマコンの登録が行われます。 なので、スマコンに関するgasの支払いはこのアカウントから行われます。
OKです。
<metamask>のところでに、METAMASKのアカウントの秘密鍵を入れます(取扱注意)
やり方は
674 bytes
ここ押して
3.37 KB
次にここ押して
秘密鍵のエクスポート→パスワード入力で表示されます。 事前準備で捨てアドレスをご準備いただいたのは万が一のためです。 秘密鍵使うので。。
いれました。
はい、では次に
export NETWORK="rinkeby"
これはこのまま入力してエンターです
はい。
rinkebyというのはテストネットの名前です
次に、Truffleを使ってrinkebyネットワークにデプロイします。 Truffleはご存知かもしれませんがSolidityの開発フレームワークで、先日のnpm installで一緒にインストールされてます。(編集済)
truffle deploy --network rinkeby
これでスマコンをデプロイします。
ネットワーク回線が遅いとエラーが出ます。。
truffle: command not found
入ってないってことですかね?
おっと
ちなみに、 npm --version は何を返します?
5.6.0
OKですね、では npm install -g truffle
で入れてしまいましょう
-gというのはグローバル環境に入れるという意味です
truffle deploy --network rinkebyが通るようになりました。
OKです
実行中・・・
ちょっと時間かかりますw
あと結構ミスります
何度かやると通ったり。。
これ、イーサのネットワークからダウンロードしてるんです?
gasがどうのとかよく出てくるので。
イーサのネットワークは、infura経由で接続してますので、ローカルにはダウンロードしていないです
gasはスマコン登録に対して払ってます
終わったみたいです。
そうしましたら、今登録したスマコンをEtherscanでみてみましょう。
RinkebyネットワークのEtherscanというのがあります。
こちらで、アカウントのアドレスを調べてみましょう。
123.83 KB
contract creationできてますね
Contract Creationってやつですか?
はい
0x27..のところクリックしてみてください
Contract 0x27.... みたいなタイトルのページひらけますでしょうか
122.45 KB
OKです〜
それが、NFTコントラクトのアドレスです。
今作ったのは、”このNFTはどんなものなのか”を定義するスマコンです
この状態では実際のNFTは一つも生成されていません。
NFTを生成するときは、このスマコンのアドレスを指定することで、このスマコンで定義されてるNFTを作ることができます。
なるほど。
ちなみに、MyCryptoHerosのヒーローのNFTのコントラクトアドレスはこれです https://etherscan.io/address/0x273f7f8e6489682df756151f5525576e322d51a3
同じく、Contract 0x27..となってるのがお分かりいただけるかと思います
次に、今作ったコントラクトを使ってNFTを生成してみましょう。
これ、このスマコン自体は誰でも使えるんですか?
いや、登録したアドレスが必要です
なるほど。
スマコン動かすのにgas払う必要あるので
他の人が使えてしまうと、他人にお金使われてしまいます
次に、VSCodeのターミナルで、以下のコマンドを打ちます。
export OWNER_ADDRESS="<my_address>" <my_address>を自分のイーサアドレスと入れ替えます
この時のアドレスは、「NFT」が付与されるアドレスです。さっきスマコン登録したアドレスでも良いですし、他のアドレスでも構いません。
もしWEBアプリ等でユーザーにNFTを付与したかったら、web3の機能でログインしているユーザーのMETAMASKのアドレスを取得できるので、その値を使って実行するとその人にNFTをあげることができます。 この辺りはLiberate liteでは使わない機能ですがご参考まで。
これは捨て垢じゃなくても、支払先だから問題ないって認識なんですかね?
そうですね、問題ないです。ですがまあ先ほどの捨て垢で良いと思います
そうしておきます。
次に、 export NFT_CONTRACT_ADDRESS="<deployed_contract_address>" で、<deployed_contract_address> を先ほど調べたNFTコントラクトのアドレス(0x27..)と入れ替えます
OKです
それではNFTを生成しましょう。 node scripts/mint.js
こちらも少々時間がかかります
上は、scriptsというディレクトリの中にmint.jsというスクリプトが入っていまして、これを実行するためのコマンドです。
これ打つと実際につくられるんですか?
作られます!
つまり、1つのNFTを作るのに1つのスマコンが必要ってことなんですかね?
ええと、先ほどのスマコンは型みたいなもので、同じスマコンから異なるパラメータを持つNFTをたくさん生成できます。
MCHのHerosも色々なキャラクターがあると思いますが、全て先ほどのスマコンが作ってます
つまり、ヒーローとエクステとランドの型があればイケるみたいな感じですかね?
そうです。ヒーローとエクステとランドはそれぞれ違うスマコンがあります
怪しい感じ・・・
162.23 KB
あ、ガス不足ですかね?
21.54 KB
ありますねw
でも止まっちゃいました。
少々お待ちを。。
VSCodeで、scriptsディレクトリの下にあるmint.js開けますか?
一回止めていいんですか?
あ、はい一旦止めましょう
2.85 KB
あ、あとtruffle.jsも開けますでしょうか
zap@DESKTOP-H0FTP1L:~/opensea/opensea-creatures$ cat truffle.js const HDWalletProvider = require("truffle-hdwallet-provider"); const MNEMONIC = process.env.MNEMONIC const INFURA_KEY = process.env.INFURA_KEY if (!MNEMONIC || !INFURA_KEY) { console.error("Please set a mnemonic and infura key.") return } module.exports = { networks: { development: { host: "localhost", port: 8545, gas: 4600000, network_id: "" // Match any network id }, rinkeby: { provider: function() { return new HDWalletProvider( MNEMONIC, "https://rinkeby.infura.io/v3/" + INFURA_KEY ); }, network_id: "", gas: 4000000 }, live: { network_id: 1, provider: function() { return new HDWalletProvider( MNEMONIC, "https://mainnet.infura.io/v3/" + INFURA_KEY ); }, gas: 4000000, gasPrice: 50000000000 }, mocha: { reporter: 'eth-gas-reporter', reporterOptions : { currency: 'USD', gasPrice: 2 } }, compilers: { solc: { version: "^0.5.0" } }, } };zap@DESKTOP-H0FTP1L:~/opensea/opensea-creatures$
うーん、同じ
もう一度走らせても同じですかね
リトライ中・・
184.98 KB
一瞬でさっきと同じエラーっぽいものが出ました。
status: falseですもんね
上手くテストネットになってないとか?
export NETWORK="rinkeby" をしてるので大丈夫だと思います。。
あ、infuraか?
?
少々お待ちを
あ、すいません関係なかったです
mainnetとrinkebyでkey違うかと思いましたが同じでした
node --version はどうでしょう
v8.11.2
そちらも問題ないですね。。
ParityのPOAプライベートネット建ててtruffleを使う...
以下のtutorialに従ってparityのpoaプライベートネットを構築してから、 ...
この辺が関係しているか
ちょっとイーサのアドレスここに貼っていただけますか?
0x05EcF5aB7a378A4eEED1ba1fC9A5d938F4fC4240
ちょっときになるのは
23.49 KB
このタブが見当たらないんですよね
正しくERC721のスマコンとして認識されてないのかな、という危惧があります
ちょっと一旦飛ばしましょう
今日APIの使い方までやりたいので
わかりました。
ちょっとこちらコピーしてどこかに保存していただけますでしょうか
ちょっとしたら消します
コピーしました
はい、ではこちら使ってAPIの使い方見ていきましょう。
先ほどのコマンドが正しく実行できると、一度にNFTトークンが12こ生成されます
生成したNFTをまずはEtherscanでみてみましょう
先ほどお送りしたアドレスをこちらで調べて見てください
ERC721 Token Txnsのところが、mintした結果NFTがたくさん生成されている履歴になっています
140.89 KB
okです
では、次にOpenseaのAPIでNFTをみてみましょう。
ここが結構ポイントです。Liberate liteでは、ユーザーのNFTを取得する必要がありますので、 この辺りのAPIを使っていく必要があります。
はい。
APIですが
https://alis.to/api/articles/recent これはALISの新着記事のapiです。
みていただくと、文字の羅列になっていますが、新着記事の情報がJSONという形式で出力されています。
JSONというのは { “key”: “value” } のように、”key”(キー)に対して”value”(値)が何か、という情報を構造的に表す形式です。
これをプログラミングで取得して、必要な情報だけ取り出して加工するイメージです。
OpenSeaのAPIのドキュメントを見てみましょう
https://docs.opensea.io/reference#account-object
OpenSea
この中に、「Retrieving a single asset」という項目があります。
233.15 KB
https://api.opensea.io/api/v1/asset/asset_contract_address/token_id/
PATH PARAMSというのが、 asset_contract_addressとtoken_idのことです。 さっきNFTのスマコン作るのに作っ
たNFT_CONTRACT_ADDRESSが、 asset_contract_addressです。
token_idというのは何番目のNFTかという意味で、 例えばNFTを12個作っていれば0から11までの数を指定できます。
https://rinkeby-api.opensea.io/asset/0x1146c33d6b898ca432bf802fedc0da3cbbee62f8/2
こんな感じで入れ替えて使います
なお、 https://api.opensea.io/api/v1/asset は、メインネットのみに有効です
さっき作ったNFTはRinkebyネットなので、
149.29 KB
ここに書いてある通り、api.opensea.ioの前に、rinkeby-をつける必要があります。
https://rinkeby-api.opensea.io/api/v1/asset/。。。 と変える必要があります
https://rinkeby-api.opensea.io/asset/0x1146c33d6b898ca432bf802fedc0da3cbbee62f8/2
ここ開けましたかね
開けました。
0x1146c33d6b898ca432bf802fedc0da3cbbee62f8 というスマコンから生成された、 2 のtoken_idをもつNFTを見ています
Liberate liteを作ることをイメージすると、 そもそもユーザーが何のNFTを持っているかを取得するのがまず先で、 そのあと、もし必要があればそのNFTの詳細な情報を取得しにいく、という順番になります。
「あるユーザーが所持しているNFTを表示する」には、こちらのAPIを使う必要があります。
228.67 KB
先ほどはPATH PARAMETERでしたが、 今度はQUERY_PARAMSとなっています。
クエリパラメータは、クエスチョンマーク「?」を後ろにつけて、パラメータを設定していきます
ownerを設定したければ
https://rinkeby-api.opensea.io/api/v1/assets?owner=0x9ba9105d4a1c2346213fq67dea928b975d729
のように後ろにつけます。 複数つけることもできます。
複数つけるときは&で区切ります。最初のパラメータの頭だけ”?”です
owner=の後ろを、先ほどお送りしたアドレスに入れ替えてアクセスして見てください
どうでしょう
115.14 KB
あ、すみません。
https://rinkeby-api.opensea.io/api/v1/assets?owner=0x9ba9105d4a1c2346213fq67dea928b975d729
こちらのowner=以降を変えてアクセスしてみてください
v1/assets というのが、所持しているアセット全てにアクセスできるAPIです(編集済)
先ほど間違って送ったcollectionsは、どのスマコンのNFTを持っているか、という情報が取れるAPIです
なお、先ほどalisのAPIにアクセスしたときはJSONだけでしたが、openseaのAPIは Django REST frameworkとなっていて、HTMLが返ってくるようになってます。
右上にGETってボタンがあると思うんですが、そこをクリックするとJSONという項目があるので、そこをクリックするとJSONになると思います。 何が違うかというと、URLの後ろをよくみていただくと、クエリパラメータでformat=jsonというのが追加されているかと思います。 このクエリパラメータがないときはデフォルトでHTMLを返すようになっており、format=jsonのパラメータが設定されたときはJSONで返す、といった実装になっています。 Liberate liteからアクセスするときは、このformat=jsonが必要になります。JSONの方がプログラミングで扱いやすいですので。(編集済)
取れたんですが、画面が固まってしまって。
あ、なるほど。重いんですよね。。
あとでお時間あるときにまたみてみてください
最後ちょっと駆け足になってしまったので、見返していただければと思います
えと、今はグーグルクロムで見てますが、これをターミナルでもできるってことなんですか?
できます!というかLiberate liteの場合には、JavaScriptで取得部分をプログラミングしていきます
ちなみにターミナルでとる場合にはcurlというコマンドを使います。
それで、変数に入れて上手いこと使うみたいな感じですかね。
ですね!次回は、JavaScriptでAPIを叩く方法について学んでいきましょう。
今日は、とりあえずNFTの生成の流れと、openseaのAPIを使ってどういう情報が取れるか、というのをお伝えしたかったので、ここまでになります
わかりました。ありがとうございました。
はい、それでは今日はこの辺りで。どうもありがとうございました
これはNFT作りたくなりますね。
ありがとうございました。