NFT」カテゴリーアーカイブ

絵の勉強中

昨年末からですが、絵の勉強を始めました。

NinjaDAO内で開校されている忍者美術スクールと言うチャンネルで、デッサンを教えてもらっているんですよ。

絵心は正直ない。
でも、無いからこそ、うまく書けたらいいな、って思うんですよね

第5回「顔のデッサン」

お題は各自でモノクロの写真を探してくるということで、色々と探したもののいいものが思いつかず、アインシュタインを選別。

しかし、この選択が結果として悲惨な自体を生みました。

まず、シワが多すぎ。
でもまぁ、それは書き込めばいいだけなんだけど、白髪がどう表現して良いのかがよくわからない。

とりあえず、ざっと背景をある程度黒く塗りつぶして、その状態から練り消しを使って白髪を表現していく方法を取ってみたものの、練り消しを細く使うことがうまくいかず、それでいてすぐに黒くなってしまうので、白髪みたいな細い白い線を描くことがうまくできませんでした。

いつもデッサンを描く際に、全体のバランスが取れていないので今回は結構気をつけたいたのですが、それでも横に並べてみると少し面長になってしまっていますね。

講評

指摘を受けた点としては、以下の内容

  • モチーフの選択が難易度高すぎ
  • 背景をティッシュや布などでこするなどしてぼかしを入れ、グラデーションつけるといい
  • 背景を適当に書かない
  • 顔の側面など、もっとパースを意識する
  • 首と顔の部分がつながってしまっているので、その色の違い、グラデーションを意識する

背景をもっとしっかり描くというのは、たしかにその通りで、結構雑に書いてしまっていました。
全体として考えるということで、しっかり絵を全体として考える。こだわるということが必要なんだな、と。

首と顔の部分に関しては、ちょっとむずかしい。。。
注意して書いていかないといけない。

パースが取れている・取れていないの問題は、正直難しすぎますね。
このあたりは、線を引いてみるともうちょっと分かるのかもしれませんが、、、

締め切りギリギリ

毎回、大体2週間位の課題提出までの猶予があるのですが、絵を描くのには結構まとまった時間が必要になってしまっているので、いつも締め切りギリギリになってしまっています。

特に、ここのところはリモート勤務ではなく出社しているので、平日はほぼ時間が取れない。
週末は家族で出かけたりもするし、ランニングもしたりする。。。となると本当に厳しいです。

それでも、何とか書いて繋いでいます。

なかなか上達しないですが、それでもしっかりと観察して行くと、なんだか少しずつマシになっている気がするんですよね。

一緒に講義を受けている方々は皆さん上手なので、比べてしまうと正直がっかりしてしまうのですが、あくまで比較対象は過去の自分ということで続けていってます。

何かしら新しい事を学ぶということは面白いものの、これ、どこに帰結するんだろうw

手持ちNFTの現状整理2

昨日に続いての整理となります。
昨日はこちら

手持ちNFTの現状整理(CNP関係)
https://kaerugekogeko.com/wp/%e6%89%8b%e6%8c%81%e3%81%a1nft%e3%81%ae%e7%8f%be%e7%8a%b6%e6%95%b4%e7%90%86%ef%bc%88cnp%e9%96%a2%e4%bf%82%ef%bc%89/

ちなみに現在価値としては1ETH = 166160.49で計算しています

Aopanda Party

https://opensea.io/ja/collection/aopanda-party

TimeEvent TypeTitle個数価格(ETH)手数料(ETH)合計金額(ETH)合計金額(JPY)
2022/10/30 13:39:59MintAopanda-Cheeks-whirlpool#90990.00100.000880.0019431.077984
2022/10/30 12:00:59MintAopanda-Cheeks-original#27932.00000.00200.002740.00471086.866832

合計取得金額(JPY):1517.944816
平均取得単価(JPY):505.9816053

現在フロア単価(ETH):1.48
現在フロア単価(JPY):245917.5252
推定保有金額:737,752.58

収支:736,234.63

アニメータでもあるaoさんがファウンダーを務めるAopandaParty。こちらはいずれもALを頂いての取得となっているので、当然ならがプラスになっており、保有し続けています。

青ぱんだは、正直言って絵柄的には可愛すぎるので、40代おっさんがこれを持っているのはどうなんだ??という、よくわからない思いが頭によぎってしまったために買い増しをしていませんでした。。。

年末にはアプリもリリースされましたね

@aopanda_ao

『あおぱんだmove』DLして遊んでみてね!🐼 #あおぱんだ #APP #PANDAO #アプリ紹介 #アプリ

♬ –

インストールはしたものの、遊び方をまだ確認できていません。。。

青ぱんだ自体、そもそもNFT以前からaoさんが活動されていたので知名度はあるので、キャラクターの可愛さもあるのでIPとしてはいいのですが、それらにつられてNFTの価格まで上がるのかな?というのが気になるところです。

このあたりのNFTの価値に関しては難しいところですね。
NFT以外で楽しめるのであれば、その人達はそちらで満足するでしょうし。オリジナルがNFTにないIPに対して、わざわざNFTを持つ意味は考えさせられるものです。

ShikibuWorld

https://opensea.io/ja/collection/shikibu-world

TimeEvent TypeTitle個数価格(ETH)手数料(ETH)合計金額(ETH)合計金額(JPY)
2022/12/12 15:54:47SafeTransferFromShikibuWorld #89650.00000.000870.0009150.28293
2022/12/11 16:45:47BuyShikibuWorld #89650.42000.002890.422973026.08303
2022/12/11 11:01:35MintShikibuWorld #46820.00100.002150.0032543.95271

合計取得金額(JPY):73720.31867
平均取得単価(JPY):36860.15933

現在フロア単価(ETH):0.52
現在フロア単価(JPY):86403.4548
推定保有金額:172,806.91

収支:99,086.59

BUSONさんがファウンダーを務めるキャラDAOのしきぶちゃん。
じゃがりこの一部パッケージにも使われているので見たことがある人もいるのではないでしょうか

「じゃがりこ」が8人のクリエイターと期間限定コラボレーション!
『あげりこ』を楽しくするキャラクターパッケージが登場!
2022年9月下旬頃から、全国で順次切り替え
https://www.calbee.co.jp/newsrelease/220926.php

ミント当日は、子供の部活送迎でバタバタしながらミントしたり購入したりしていました。

ShikibuWorldは、脆弱性をつかれたお陰でミント当日は結構荒れていました。
私も早押しMint権を持っていたものの、そもそも早押しMint自体が急遽取りやめになったためにMintとしては1体。
当日に、ハッカーにまけんな!って感じで勢いだけで1体2次流通で購入しています。

結果的には2次流通で取得した価格は直近の上げでなんとか超えてくれたものの、完全に勢いだけの高値掴みでした。
まぁ、ある意味しょうがないですし、そういうものだと思うしか無いですね。
1体はALをいただけたので、欲を言えば・・・というところですが、あまり”たられば”を言っていてもしょうがないので。

あまりフロア価格を追いかけていませんでしたが、12/19, 12/24 に大きくフロア価格を下げているのがグラフから見て取れます。

何があったのかな?とキャラDAOを見てみると、ちょうどこのタイミングで、セール時にミントできなかった確定AL持ちの人+早押しミント権を持っていた人に対してのプライベートセールの案内が出ているんですよね。

これらの人に関しては、ミントはすることできたものの、パブリックセール時に取得できなかったことから不満が溜まっていたのかもしれません。本当のところはわかりませんが。
ちなみに私はと言うと、当然のことながら抽選に落ちてます・・・。

今思えば、抽選に落ちた時点で買いに走ればよかったのか!!
結果的にはイレギュラーなケースでの2次販売みたいな状態になっているので、他のプロジェクトで2次販売を行うケースとの類似性はあまり無いのではと思いますが、そのタイミングでのフロア価格はちょっと見ておいても面白そうですね。

Live Like A Cat-neko no youni ikiru-

https://opensea.io/ja/collection/live-like-a-cat-nekonoyouniikiru

TimeEvent TypeTitle個数価格(ETH)手数料(ETH)合計金額(ETH)合計金額(JPY)
2022/12/28 12:01:59MintMuimi #1430820.0010.004170.00517841.719945

合計取得金額(JPY):841.719945
平均取得単価(JPY):420.8599725

現在フロア単価(ETH):4.4
現在フロア単価(JPY):731106.156
推定保有金額:731106.156

収支:730,264.44

年末にローンチされたLLAC。ありがたいことに1つALを頂いたのでMintしています。
というか、価格が高すぎてちょっと今の手持ちでは2次流通で獲得するのはためらわれるところ・・・。
しかしここ数日でもフロア価格が倍増しており、このビッグウェーブに乗るしか無いのか?と思わなくもないけれど、それでうまくいった試しがないので今のところは我慢する。
そして、大体私の行動は外れるので今はまだ買いどきなのかもしれない。

そもそも期間が短すぎるので、値動きとしてはあまりグラフを見る意味はないのかな、と思わなくもない。

履歴を見ると、個数が2となっている。
事前に聞いていた話として、SBTが配られるのでおそらくそれだと思われるがOpensea上ではSBTが見ることができない。

Ethherscanでトランザクションを見てみると、たしかにSBTがMintされていることが分かるので、Opensea側で対象外としてしまっているんだろう。

Openseaが何を持って対象としたり、非表示扱いしたりするのかは結構よくわからないな。。。

CryptoNinja Children

https://opensea.io/ja/collection/cryptoninja-children

TimeEvent TypeTitle個数価格(ETH)手数料(ETH)合計金額(ETH)合計金額(JPY)
2022/12/25 12:12:47MintOto-Red #01582.00000.00200.001740.0037606.12871

合計取得金額(JPY):606.12871
平均取得単価(JPY):303.064355

現在フロア単価(ETH):0.159
現在フロア単価(JPY):26419.51791
推定保有金額:52,839.04

収支:52,232.91

CNCを取り上げるの忘れていた。
CNCに関しては、忍者寺子屋というフリースクールの応援的位置づけとのことで、格安Mintということもあって購入してそのままだったけど、思った以上にフロア価格が上がっていますね。

1月、3が日を過ぎてから急に値上がりしたのか。。。
プロジェクト側から特に新しい材料が出たわけでもないので、完全に外部要因なんでしょうね。
どこかで買い増しをするのも有りなのですが、こちらも絵柄が可愛すぎるww

CryptoAnime Labs – CryptoNinja – ShurikenNFT –

TimeEvent TypeTitle個数価格(ETH)手数料(ETH)合計金額(ETH)合計金額(JPY)
2022/11/5 11:59:35Mint#58151.00000.42000.004970.425096538.31005

合計取得金額(JPY):96538.31005
平均取得単価(JPY):1892.90804

CryptoNinjaのアニメ応援クラファンです。
こちらは、市場価値は無いのでどういう扱いにするのか?は非常に難しいところですが、支出はしているので記録としてはとどめておこうかと。

ちなみに、購入個数が51となっているのは、パスポートSBTが1つと手裏剣NFTを50個の内訳になります。
SBTのように売買ができないものの購入に対しての、NFTの市場価値に関しての考え方ってどうなんでしょうね。。。

実際問題で言えば、これを持っていることでALを獲得する可能性が上がる、情報を入手することができる。
また、アニメが実際に出来上がった段階で先行してなにかの権利が得られるとかそういう期待はあります。

それが取得総額の当時約10万以上の価値を出してくれると期待する形でしょうね。

全体感

他にもちょこちょこと買ってはいるものの、SBTであったり遊び企画だったりなのでそれらは除外とします。

ETH自体が購入時の価格で考えると対円で値下がりしているので、それらを踏まえても全体的にやっちまった取引をしている割には善戦しているのではないでしょうか。
実際の収支は、更にETHをいくらで購入したのかなどのパラメータも入ってくるので本当にこのあたりの計算は複雑です。

NFTの価値基準に関しては難しいところですが、株と異なり、所有しているNFTに対して関わりを持ち、価値があがるような活動を行うことで手持ちのNFTの価値を上げていくという動きが健全なように思えます。

一方で、Discordを主戦場としてプロジェクトが動いているわけですが流れが早く、複数のプロジェクトに対して価値を上げる活動に関わっていくというのは少し現実的ではない気もしています。

自分自身の時間の使い方含め、あまり無理が来てNFT疲れを起こさないように関わっていきたいものです。
そういう意味では、定期的にこういう形で振り返りの時間を設けることで手持ちの各プロジェクトチャンネルを確認に行くことができるのは良いかもしれません。

まぁ、なんか結果的に「お前、取引下手くそ杉wwwww」って思われているだけな気もしますが、気にしません。

手持ちNFTの現状整理(CNP関係)

2021年末から仮想通貨市場に対してちょっかいを掛け始め、2022年はNFT市場にも参加しました。
ただ、お祭り相場に踊らされたり遊びでミントしたりと、ちゃんとした資産としての管理をこれまでやってこなかったので、正直、手持ちがどういう状況なのか?に関してはぼんやりとしか認識していないのが現状です。

これではだめだろうということで、一旦整理を行います

CyrptoNinjaPartners

https://opensea.io/ja/collection/cryptoninjapartners

TimeEvent TypeTitle個数価格(ETH)手数料(ETH)合計金額(ETH)合計金額(JPY)
2022/10/21 22:46:59BuyLuna-Pipe #235322.12000.004832.1248408,939
2022/6/18 5:45:44BuyOrochi-Gold(scroll) #166620.48000.007580.487669,004
2022/6/18 5:25:03BuyMitama-Transparent(scroll) #078630.48000.005650.485768,731
2022/5/30 10:29:21BuyLeelee-Scroll #199590.30000.005340.305369,824
2022/5/29 18:17:40BuyLeelee-Polar bear(dango) #221400.28000.002590.282661,968
2022/5/15 10:19:58BuyNarukami-Light brown(pipe) #205350.00480.006550.01142,947

合計取得金額(JPY): 681,413
平均取得単価(JPY):113,568.8333

現在フロア単価(ETH):2.7
現在フロア単価(JPY):452,033.919
推定保有金額:2,712,203.514

収支:2,030,790.514

CNPは初期Mintには参戦したのですが、そもそもどうして良いのかもわからず右往左往して買えず。Openseaにてすべて2次流通を拾っています。

購入したタイミングと金額を大体ですがプロットしてみました。

タイミングとしてはセール直後だったりしますが、見てわかる通り、すべからくそのタイミングでの高値づかみをしています。
特に、10月のルナ公開タイミングでは大きく平均フロアから逸脱した価格で手に入れています。。。
これは、平均がCNP全体のフロアであって、ルナのフロアではないことも一因ですが、高値づかみには違いないですね。

実際のところは、これにヤーマの形代とかバーニンとかしているのでもうちょっと費用がかかる計算ですが、それらを合わせても200万近くプラスになっていそうです。

この糞下手くそなトレードでも利益が出ているのは、ひとえに持ち続けていることと、しっかりと価格が上昇していってくれているからなので、頭が上がらないですね。

ファウンダーのRoadさんが積極的にビジネス展開をされているので、価格が上がるかどうかは市場次第なところはありますが、イベント毎には事欠かなそう。
特に、先日発表されたSoftbankとの協業はどういう形になっていくのかは楽しみです

Bucket、NFT発のIP「CNP」を活用したデジタルマーケティング支援についてソフトバンクと基本合意を締結
https://prtimes.jp/main/html/rd/p/000000057.000012092.html

ただ、CNPは価格が上がっていておいそれと買いましすることが難しくなっているのも現状。
しかし、現状はさらなる値上がりの途中段階とも見れなくはなく、私が買うと価格が下がるという市場原理(?)と言うか呪いが発動しそうで怖くてしょうがないです。

一方で、売り時は悩みそう。
基本的にNFTを購入し続けていて、出費しかないお財布事情なので、どこかで資金が尽きる前に調整売をかけないといけなくなるかもしれない。

このあたり、株であれば持ち続けることで配当を得られるので、同様の仕組みがNFTでもセキュリティをちゃんと担保してくれればいいですね。
まだ、ちょっとレンディングに預けるのはためらわれるところ。ぐぬう

CNP Jobs

https://opensea.io/ja/collection/cnp-jobs

TimeEvent TypeTitle個数価格(ETH)手数料(ETH)合計金額(ETH)合計金額(JPY)
2022/10/16 12:29:35BurnMintNarukami-NEET-Black eagle #117730.00000.001600.0016308.8456
2022/7/17 9:17:49MintOrochi-Teacher-Glow stick #108702.00000.00200.003120.0051875.870208

合計取得金額(JPY):1184.715808
平均取得単価(JPY):592.357904

現在フロア単価(ETH):0.425
現在フロア単価(JPY):70,618.20825
推定保有金額:141,236.42

収支:140,644.06

CNP Jobsは初期MintのALをいただけたので費用はほぼかかっていませんので当然黒字です。単価よりもむしろ手数料のほうがかかってますね。。。

CNP Jobs はMint時に応援的に購入したものの、ほぼほぼ放置状態です。

実際問題、それほど情報を追いかけていないということもありますが、何かしらの今後の展開があまり想像できていないので、CNPと比較すると価格的に買えないこともないですが、この先の値動きがわかりません。

11/11にファウンダーであるうじゅうなさんが本を出版されました

そのあたりで、値動きがあるかな?と見てましたが、一瞬上がって同じところにまで戻ってきています。

とは言え、初期で頂いたものなので、積極的に売る理由はあまりないかな?というところが正直なところです。

KunoichiGakuen-Origin

TimeEvent TypeTitle個数価格(ETH)手数料(ETH)合計金額(ETH)合計金額(JPY)
2022/12/13 22:01:11MintKunoichiGakuen#297310.00000.30000.00289
2022/12/13 21:05:23MintKunoichiGakuen#10882.00000.06000.00213

合計取得金額(JPY):60,651.90206
平均取得単価(JPY):5,054.325172

現在フロア単価(ETH):0.027
現在フロア単価(JPY):4486.33323
推定保有金額:53,836.00

収支:-6,815.90

ブロックチェーンゲームを作るプロジェクトで販売されたNFTです。
ALを頂いてミントしたものの、そもそものミント価格が0.03ETHということもあって、残念ながら現状は赤字です。
格安ミントに慣れていたので、ミント時に思った以上に金額が高くてびっくりした事を覚えています。

とは言っても、単価で考えれば数百円。
そもそもまだゲーム出ていないということもあるので、まだ慌てる段階でもないのかな、と。

ゲームがちゃんと出て、それが面白いかどうか?ですかね。
デザイナーの方が体調を崩されたりしてリビールが遅れていましたが、無事にそちらも完了しています。
あとはゲームそのものですね。

予定では2023年の1Qには!ってところですが、このあたりは長い目で見守ったほうが良い気もしています

その他

忍者関連はその他にメタバッチとかお遊びNFTがあったりしますが、いずれも格安ミントなので一旦ここでは除外。

思った以上に整理するのに時間かかっているので続きはまた今度。。。

Invalid number of parameters for “mint”. Got 1 expected 2

ジェネラティブNFTの画像生成、スマートコントラクト、Mintサイト作成をする上で、HashLipsが提供しているコードは最初の題材、テンプレートとしてよく出てくる。

HashLips
https://github.com/HashLips

エンジニアのむなかたさんが提供している、「誰でもできる!ジェネラティブNFT開発」を見ながら進めていたのですが、Mintサイトでmint実行時に表題のエラーが出てしまいました

誰でもできる!ジェネラティブNFT開発
https://crypto-code.jp/materials/create-generative-nft

エラー詳細

Error: Invalid number of parameters for "mint". Got 1 expected 2!
▼ 2 stack frames were expanded.
InvalidNumberOfParams
c:/Dev/darejene/hashlips_nft_minting_dapp/node_modules/web3-core-helpers/lib/errors.js:33
_createTxObject
c:/Dev/darejene/hashlips_nft_minting_dapp/node_modules/web3-eth-contract/lib/index.js:669
▲ 2 stack frames were expanded.
claimNFTs
c:/Dev/darejene/hashlips_nft_minting_dapp/src/App.js:132
  129 | console.log("Gas limit: ", totalGasLimit);
  130 | setFeedback(`Minting your ${CONFIG.NFT_NAME}...`);
  131 | setClaimingNft(true);
> 132 | blockchain.smartContract.methods
      | ^  133 |   .mint(mintAmount)
  134 |   .send({
  135 |     gasLimit: String(totalGasLimit),
View compiled
onClick
c:/Dev/darejene/hashlips_nft_minting_dapp/src/App.js:360
  357 |   disabled={claimingNft ? 1 : 0}
  358 |   onClick={(e) => {
  359 |     e.preventDefault();
> 360 |     claimNFTs();
      | ^  361 |     getData();
  362 |   }}
  363 | >

この手のチュートリアルでエラーの原因はチュートリアル上の工程をすっ飛ばしてしまったり、誤字脱字によるタイポなわけです。

ただ、問題なのは、言われるがままにコードを修正する形になるので、そのあたりがつけづらいという点ですね。
特に今回のように、ゼロからコードを書くのではなく、テンプレートから作る場合はそもそも書いていないコードが多いので余計に原因にたどり着きづらいことが多いです。

質問しても良いのですが、それでは理解の助けにならないので自力で解決することを考えます。

mint関数の定義

コード内容としては、Reactで書かれたフロントエンドからスマートコントラクトの呼び出し時にエラー。
エラーメッセージからは「mint」関数の引数が、コード中では “mintAmount”一つに対して2つの引数を期待していると言われています。

というわけで確認するべきはmint関数の定義です。

mint関数の呼び出しとしては

blockchain.smartContract.methods.mint(mintAmount)

という呼び出しになっています。

スマートコントラクト上のコードとしては

// public
  function mint(uint256 _mintAmount) public payable {
    uint256 supply = totalSupply();
    require(!paused);
    require(_mintAmount > 0);
    require(_mintAmount <= maxMintAmount);
    require(supply + _mintAmount <= maxSupply);

    if (msg.sender != owner()) {
      require(msg.value >= cost * _mintAmount);
    }

    for (uint256 i = 1; i <= _mintAmount; i++) {
      _safeMint(msg.sender, supply + i);
    }

と、引数を一つで定義されているので、呼び出しの仕方が問題というよりも、Mintサイトから見たスマートコントラクト上の定義では引数は2つと判断されている、ということなのでは。

という訳で、そのあたりを参照していけば良いはずですが。。。
少なくとも blockchain や smartContract をimport してはいないので、探します。
バックエンド主体で動いてきた私にはなかなか興味深いです

追っかける

blockchain 変数は App.js 内で useSelector によって値が入っています。

function App() {
  const dispatch = useDispatch();
  const blockchain = useSelector((state) => state.blockchain);

useSelectorに関してはこちらを参照

Reac初心者でも読めば必ずわかるReactのRedux講座
https://reffect.co.jp/react/react-redux-for-beginner#useSelector_Hooks

なるほど、さっぱりわからん。

わからんが、スマートコントラクトの定義っぽいところを探すと、bockchainActions.jsに

          const SmartContractObj = new Web3EthContract(
            abi,
            CONFIG.CONTRACT_ADDRESS
          );

という記述がある。

引数として渡しているabiは誰ジェネでも説明されている

ABIとは「Application Binary Interface」の略で、Webアプリからコントラクトへアクセスするために必要な設定となり、HashLipsのWebアプリではabi.jsonというファイルで管理しています

https://crypto-code.jp/chapters/create-mint-dapp/update-setting#index_0-3-0

ん。これが原因っぽい気がする

abi.jsonを見ると、HashLipsデフォルトの記述が書かれていて、更新し忘れていることがわかった。やはりこれが原因だった

という訳で、ここを正しく更新することで問題なくMintできるところまで行けた

最後に

ABIに関しては、公式に仕様が書かれていた

Contract ABI Specification
https://solidity-jp.readthedocs.io/ja/latest/abi-spec.html

とりあえず、なんとなく進め方はわかったけど、実際のところ各工程で行っている作業に対して正しく理解できている場所は少ない気がする。

数こなしていけば自然と覚えるものもあれば、調べて納得して覚えるものもある。

これなんだっけ?となる部分を少しでも減らしていければと思う。

NFT Startup Conference by #NMO へ参加

最近の興味関心事の一つとして、Web3やNFTに関することがあります。
私自身の現在のスタンスとして、どっぷり使っているわけではありませんが、エンジニアとしての技術的側面や、投資対象。単純にコミュニティ活動と、複数の切り口で面白い可能性があるかな、と考えています。

今回の投稿では、11/19に行われた NFT Marketing Orchestra というコミュニティが主催したカンファレンスのご紹介です

NFT Startup Conference

カンファレンス自体はオンラインで開催され、事前登録者はZoomのウェビナー。当日参加はTwitterスペースで聞くことができ、Twitterのスペースはアーカイブも残されていますので、興味がある方は是非。

NFT Startup Conference by #NMO
https://twitter.com/i/spaces/1zqKVPgnLkVJB

プログラムとしては以下の内容です

13:00 ~ 14:00 エンジニア対談 syou ✕ むなかた ✕ けいすけ
14:00 ~ 15:00 対談① わふくジェネ SOLOさん
15:00 ~ 16:00 対談② しきぶちゃん BUSONさん
16:00 ~ 17:00 対談③ CryptoNinja ikehayaさん
17:00     終了

私はというと、事前登録をしておいたのでZoomで参加しましたが、ランニングしながら聞いていたのでほとんど画面は見ていません。が、多分音声のみだったのではないかと。
セミナーじゃなくて、基本的に対談でしたしね。

それぞれの対談で思うこと、考えさせられることはありましたが、せっかくなのでエンジニア対談で思うところを。

エンジニア対談で思うこと

私自身、Solidityのコードを対価を頂く形で書いたことはなく、あくまでチュートリアルレベルなので、このお三方のような界隈で活躍されている人と比較はできないので、あくまで個人的な感想となります。

NFT。特にジェネラティブNFT関係のエンジニアリングでいうと、今回の対談の中でも出てきていますが、大きく3つの工程があります。

  • 画像生成
  • スマートコントラクト
  • Mintサイトの制作

CryptoZombieをやっているときはそれほど意識しませんでしたが、HashLipsを使うと上記3つが用意されているのでこの点はすごい認識・イメージはしやすかったです。

ただ、基本的にどれもベースとなるものは存在していて、結局のところどういう「画像を生成したいのか?」と、「どういう条件で販売したいのか」が決まれば結構なんとかなりそうな印象です。

あー、でもどこに画像を置くのかとか選択肢がいくつかあって、それらの選択肢の中から何を選んでもらうのか?とか考え始めると大変なのかな。

と言うかもっと言ってしまうと、大抵はエンジニアリングが大変というよりもコミュニケーションが大変なんでしょうね。

いずれにしても、作るものとしてのサイズ感は、凝ったことをしなければ、比較的ボイラープレートがある以上はそこまで大きくならない印象です。

チーム開発と個人開発

昨今のサービスやアプリケーションはどうしてもサイズが大きくなってしまうのでチーム開発が基本だと考えています。

チーム開発では、昔ながらのウォーターフォールで進めていったり、アジャイル的にスクラムを組んでみたりと色々な試行錯誤が繰り返されてきています。

できるエンジニアが一人で組んでしまったほうが、品質的にも安定するというのはあるのでしょうが、作るものの仕様の整理だったり業務知識。また、純粋な作業ボリュームと市場に投入したいスピード感から考えるとチーム開発になる認識です。

現在のNFTのように、比較的個人やコミュニティ手動で動いている場合は、そのWeb3的な考え方からコントラクトは共有ではなく独自が思想的にも好まれます。
そして、多くのギミックを入れられるほど資金が潤沢ではないので、ちょうど個人エンジニアで受けられるサイズ感に収まるのではないかと。

これから

ただし、多くのエンジニアがこれらの技術を習得し、ジェネレラクティブNFTの構築を行うことができたとしても、それを専業でやっていくほどのNFT発行プロジェクト量やエンジニアの需要を賄えるだけの金銭的な余裕も厳しいのでは。

そう考えると、今の私のように趣味で触っているのではなく、これだけでご飯を食べていこうとする道は結構厳しそう。

あるとすれば、自分自身がプロジェクトを立ち上げることによって、エンジニアと言うよりはファウンダーとして成り立たせるのが一番可能性としては高いかもしれない、と感じた。

実際のところ、NFTと言う単独な使い道以外にもスマートコントラクトの活用幅はこれから増えていく可能性がある。
NFTはブロックチェーンやSolidityという枠組みの中のあくまで一つの活用事例として考えて、他の分野も含めた形での目線を持っていたほうがいいかな、と考えている。

もちろん、NFTの活用方法が現在主力のPFPから大きく変わることも考えられ、その際にはNFT関連だけで充分な数のエンジニアを賄える分量が出てくるかもしれない。

いずれにしても、どうなっていくか、楽しみな分野ですね。

まー、そんなこと考えているよりも、手を動かせよって意見には頭が上がらないところではあるけれど。

Goerli テストネットワークでテストする準備

以前、cryptozombies でNFTやSolidityに関してのチュートリアル的な事をしたものの、それ以来全く触っていなかったNFT周りを改めて触ってみています。

今回は、その中で開発したコントラクトをテストするテストネットワークの一つ、Goerliテストネットを使ってみた話です。

テストネットワーク

今年の9月に実施された、 Ethereum 上の The Merge。
これ以降、それまで使えていたKiln、Ropsten、Rinkebyは廃止され、現状でテストネットワークとしてはGoerliとSepoliaが用意されている形となります。

The Merge以前の学習コンテンツやチュートリアルでは、Rinkebyなどのテストネットワークを採用されているものが多いので、注意が必要となります。

といっても、基本的な扱いが変わるわけではないので簡単に説明します。

Alchemyの登録

テストネットワークでコントラクトを動かすために必要となるGoerliETHを手に入れるために、事前にAlchemyというサービスのアカウントを作成しておきます。

Alchemy
https://www.alchemy.com/

「Get started for free」から、適当に入力をしていくことでアカウントを作成可能です。

途中で、支払い情報などを入力する項目が出てきますが、特に入力せずとも問題ありません。

faucetでGoerliETHをリクエストする

GoerliETHのリクエストは下記サイトにて行います

GOERLI FAUCET
https://goerlifaucet.com/

右上にある「Alchemy Login」から、先程作成したAlchemyアカウントでログインを行うと

アドレスの入力とボタンが活性化されるので、ウォレットのアドレスを入力して「Send Me ETH」ボタンを押下します。

押した瞬間、私の場合はこんな趣味の悪いページが出てきました。。。

ほんと、なんというか変な罠を踏んでしまったかと思いました。。左上にバツボタンがあるので閉じれば問題ありません。

ウォレットで確認

無事にウォレットにGoerliETHが届いていました。

ETHの送金は、24時間に1度可能な形で、送金金額も特に変更はできませんでした。
それくらいのボリュームでテストをしなさいということなんでしょうか?
フリープランだからかな?

ガス代高すぎ?

ちなみに、試しにデプロイしてみようとしたら。。。

まさかの資金不足。

なんか随分とガス代が高い気がする?
そもそもテストネットのガス代って何で決まるんだろうか?
メインネットと同様に、テストネットワークの混雑度によって決まるのだとすると、GoerliとSepoliaでどちらが空いているかとか、考えたほうがいいのかな?

盗難対策のためにウォレットを分けた

1年ほど前から仮想通貨を触り始めています。

BitCoinやEthを始め、あれこれ勉強も兼ねて触っているのですが、少し前からNFTを触っているのですが、ウォレットからNFTが盗まれるという事例があちこち。

気持ち的に、自分が罠にかかるというのは無いんじゃないか?と思って入るものの、そう思っている人間が一番引っかかるってこともありそうだな、と思い、ウォレットを分けることにした。

Brave

Metamskのウォレットを分けるには基本的にはChromeで別プロファイルを作って、新規のMetamaskウォレットを作成する形。

私のChromeにはすでにメイン用、ゲーム用(Dai用)、テスト用みたいなプロファイルが作ってある。
どーせだったらということで、ブラウザから分けてみることにした。
というわけでBraveですよ

Brave
https://brave.com/ja/

Braveはセキュリティ。特に個人情報保護に対しての尖った機能を要しているブラウザ。ベースとしてはChroniumなのでChromeと基本的には変わらなくMetamaskも対応している。

そして、広告のブロッキング機能がデフォルトで働いているため、多くの広告が表示されないというなかなか面白い体験を提供してくれる

ChromeでYahooを表示すると右側に広告が入ってくるのだが、

Braveで表示すると

見事に広告を消してくれる。

更に面白いのが、Braveでも広告は出ることがあるのだが、それはBraveに対しての広告であり、Webページに対しての広告ではないという点。
そして、Braveを使うと、その広告料が仮想通貨としてユーザの利用度に応じて支払われる点だ。

日本ではbitFlyerと連携して仮想通貨BATを獲得することが出来ます。
どれくらい使えば、どれくらい手に入るのかな?は気になるところですが、純粋に広告がブロックされるだけでも結構いいかも。

一方で、Chromeと比べると使いづらい点もいくつか見受けられます。
特にパスワードマネージャに関してはちょっといまいちで、URLで覚えているせいなのか、パラメータがついているとうまく反応してくれません。
このあたりはもう少し試行錯誤が必要になりそう

購入用ウォレットと保管用ウォレット

さて、そんなこんなで保管用ウォレットをBraveに追加したわけですが、実際のところ運用は少し悩みどころがあります。

基本運用

購入用ウォレットにETHを入れておき、Opensea等での売買はこちらで実施。
NFTなどを購入した際には保管用ウォレットに転送します。

売却時には保管用ウォレットから購入用ウォレットにNFTを転送する形で基本的には購入用ウォレットしかサイトへの接続はしないという形ですね

ユーティリティ

トレードという観点で考えるのであれば上記運用で事足りるのですが、例えば「このNFTを持っていれば~がもらえる」とか、「Discordの特定チャネルに入るにはこのNFTが必要」のようなユーティリティNFT。

上記のような場合には、NFTが入っている保管用ウォレットをサイトに接続する必要が生じます。
こちらに関しては、基本的に権限に注意数形を取れば。。。多分、大丈夫

ウォレットのアドレスをもとにWLが配られる場合

厄介なのが、特定のNFTを持っていることを条件にWLが配られたりするパターンですね。
この場合、そのウォレットで購入する必要が生じます。
ただ、そのNFTは保管用ウォレットに入っているわけなので、WLは保管用ウォレットにひも付き、保管用ウォレットで売買をする形になってしまいます。

こればっかりは正直気をつけるという、情けない対策手段しか無いんですよね。。。

いずれにしても、注意を払っておくに越したことはないので、みなさんもお気をつけくださいませ

Hardhatを使ってNFTを触ってみる

先日会社の飲み会で、デザイナーの人とたまたま同席になったのでNFTに関して軽く聞いてみた。
結論からすると、デザイナーって言ってもWebデザインやアプリのデザインばかりでいわゆる”絵”を書いていない。”絵”を書けないからWebデザインやってる的な話をされていた。

そうは言っても、私よりセンスあるだろうしやってみればいいじゃないって感じでNFTに関して軽く話をしたんだけど、エンジニアの人たちは難しいことをやっているんだな、って感じの印象しか与えることができなかった気がする。

といっても、NFTに関しては大雑把な話しか私も把握していないわけで、直接的に話の筋とは関係ないが、独自コントラクトを書いてみて理解を深められればと思った。

Hardhat・環境作成

数年前にBlockchain関連を触ったときには、Truffle と Ganache を使って開発を行った記憶があるが、今は Hardhat という開発環境を使う形でも出来るようなので、せっかくだから試してみることにする

Hardhat
https://hardhat.org/

早速、Hardhatをnpm経由でインストールする

PS C:\dev\base-nft> npm init --yes
PS C:\dev\base-nft> npm install --save-dev hardhat
PS C:\dev\base-nft> npm install @openzeppelin/contracts web3
PS C:\dev\base-nft> npx hardhat
You are using a version of Node.js that is not supported by Hardhat, and it may work incorrectly, or not work at all.

Please, make sure you are using a supported version of Node.js.

To learn more about which versions of Node.js are supported go to https://hardhat.org/nodejs-versions
888    888                      888 888               888
888    888                      888 888               888
888    888                      888 888               888
8888888888  8888b.  888d888 .d88888 88888b.   8888b.  888888
888    888     "88b 888P"  d88" 888 888 "88b     "88b 888
888    888 .d888888 888    888  888 888  888 .d888888 888
888    888 888  888 888    Y88b 888 888  888 888  888 Y88b.
888    888 "Y888888 888     "Y88888 888  888 "Y888888  "Y888

Welcome to Hardhat v2.9.7

? What do you want to do? ...
> Create a basic sample project
  Create an advanced sample project
  Create an advanced sample project that uses TypeScript
  Create an empty hardhat.config.js
  Quit

上記のような形となり、Hardhatで何をするのか選択肢が出てくるので、「Create a basic sample project」を選択する。

ちなみにnpm install で hardhat をすると警告が出てくる

npm WARN EBADENGINE Unsupported engine {
npm WARN EBADENGINE   package: 'hardhat@2.9.7',
npm WARN EBADENGINE   required: { node: '^12.0.0 || ^14.0.0 || ^16.0.0' },
npm WARN EBADENGINE   current: { node: 'v18.1.0', npm: '8.8.0' }
npm WARN EBADENGINE }

node.js バージョン互換が取れていないということのようで、このまま突き進むとHardhat起動できないので16系に切り替えておく必要があった

ここでHardhatが問題なく起動するかを確認するためにtest実行してみる

PS C:\dev\base-nft>npx hardhat test
Error HH12: Trying to use a non-local installation of Hardhat, which is not supported.
Please install Hardhat locally using npm or Yarn, and try again.

エラーが出てきた。。。
Hardhatの公式を見てみるも特に解決せず、Stackoverflowでも同じ問題が出ていた

Can’t properly install hardhat using Powershell! Persistent Error HH12: Trying to use a non-local installation of Hardhat, which is not supported

あれこれと試してみて、結果としてはPowershellではなくコマンドプロンプトで実行したらうまくいった。謎い。

コントラクトの構築

コントラクトに関しては基本的にopenzeppelinえ用意されているものを利用する

pragma solidity ^0.8.0;

import "hardhat/console.sol";
import "@openzeppelin/contracts/token/ERC721/presets/ERC721PresetMinterPauserAutoId.sol";

contract BaseNft is ERC721PresetMinterPauserAutoId {
    constructor() ERC721PresetMinterPauserAutoId("BaseNft", "nft", "https://raw.githubusercontent.com/krote/BaseNft/main/metadata/")
    {}
}

ERC721PresetMinterPauserAutoIdに渡している第3引数にMetadataの格納先を指定する必要があって、今回はGithubを指定してみた。

ローカルネットワークへのデプロイ

まずは、Hardhatを使用してローカルネットワークのノードを立ち上げる

C:\Dev\base-nft>npx hardhat node
Started HTTP and WebSocket JSON-RPC server at http://127.0.0.1:8545/

Accounts
========

WARNING: These accounts, and their private keys, are publicly known.
Any funds sent to them on Mainnet or any other live network WILL BE LOST.

Account #0: 0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266 (10000 ETH)
Private Key: 0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80
<<略>>

起動すると、ノードのアドレスとテスト利用可能なアカウントを20個ほど作ってくれる。これが後々利用するPublicKeyとPrivateKeyとなる

下記の様にdeploy.jsを用意

const hh = require("hardhat");

async function main() {
    const BaseNft = await hh.ethers.getContractFactory("BaseNft");
    const nft = await BaseNft.deploy();

    await nft.deployed();

    console.log("Deployed at: ", nft.address);
}

main()
    .then( () => process.exit(0))
    .catch( (error) => {
        console.error(error);
        process.exit(1);
    });

nodeを起動したコマンドプロンプトとは別のコマンドプロンプトにてdeploy.jsを実行する

C:\Dev\base-nft>npx hardhat run --network localhost scripts/deploy.js
Compiled 23 Solidity files successfully
Deployed at:  0x5FbDB2315678afecb367f032d93F642f64180aa3

無事にDeploy成功して、スマートコントラクトのアドレスを入手できた。
では続いてMintだ

Mint

Mint用にscripts/mint.jsを用意する

const Web3 = require("web3");

// CONTRACTをDeployした際のnodeアドレス
const CONTRACT_ADDRESS = "0x5FbDB2315678afecb367f032d93F642f64180aa3";
// PUBLIC_KEY, PRIVATE_KEY は本来Metamaskなどを接続した際に取得可能なもの
// ここではHardhat起動時に作られたアカウントを固定で書く
const PUBLIC_KEY = "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266";
const PRIVATE_KEY = "0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80";
// Deploy時に表示されたアドレスは127.0.0.1:8545だがlocalhostとする
const PROVIDER_URL = "http://localhost:8545";


async function mintNFT() {
    const web3 = new Web3(PROVIDER_URL);
    const contract = require("../artifacts/contracts/BaseNft.sol/BaseNft.json");
    const nftContract = new web3.eth.Contract(contract.abi, CONTRACT_ADDRESS);
    const nonce = await web3.eth.getTransactionCount(PUBLIC_KEY, "latest");
    const tx = {
        from: PUBLIC_KEY,
        to: CONTRACT_ADDRESS,
        nonce: nonce,
        gas: 500000,
        data: nftContract.methods.mint(PUBLIC_KEY).encodeABI(),
    };

    const signPromise = web3.eth.accounts.signTransaction(tx, PRIVATE_KEY);
    signPromise
        .then((signedTx) => {
            const tx = signedTx.rawTransaction;
            if( tx !== undefined ){
                web3.eth.sendSignedTransaction(tx, function(err, hash) {
                    if( !err ) {
                        console.log("The hash of your transaction is:", hash);
                    } else {
                        console.log("Something went wrong when submittion your transaction:", err);
                    }
                });
            }
            console.log("row36");
        })
        .catch( (err) => {
            console.log("Promise failed:", err);
        });
}

mintNFT();

先に入手しているPublicKeyとPrivateKey。Deployしたアドレスをそれぞれ当てはめている。これを実行するとNFTを発行することが出来る

C:\Dev\base-nft>npx hardhat run --network localhost scripts/mint.js
The hash of your transaction is: 0xbdf81461a5416fe9c6903dba1d6780d576cf979b74ab87a43e1e7e0658d723fc      

これでMintされたことになるわけだけど、実際のところGithubの当該アドレスには特になにかおいているわけではないけど問題なくMintの処理自体は行われている。

そう考えると、指定したアドレスと言う文字列に対してBlockchain上のアドレスを割り当てているだけということで、色々と危うい仕組みなんだなぁということがよく分かる。

とりあえず、ここで使ったソースはGithubにおいた

https://github.com/krote/BaseNft