早くも第4回。
今回はNFTを使って音楽の視聴権とか漫画の閲覧権ってどうやって管理してるのかとか、その辺の概論+実際にNFTを作ってみようの前編です。
なかなか必要なソフトがインストールできずに四苦八苦しています。
////////////////////////////////////////////////////////////////////////////
@ZAP よろしくお願いします
よろしくお願いします。
NFTでのコンテンツ管理について疑問をお持ちのようだったので、まずはこちらからご説明します。
前提のお話ですが、NFTには、一つ一つのアセットにメタデータといって、何らかの情報をブロックチェーンに保存することができます。
はい。
例えば、CryptoKittiesでは「遺伝情報」をMetadataに含んでいるようです。猫を交配するとそれぞれのNFTのMetadataに含まれる遺伝情報を交叉させて(特定の数字でmodをとったりして親の遺伝情報を何らかの方法で反映させつつ)新たな猫のNFTを生み出します。
ただ、猫の画像の情報などはブロックチェーンに保存するには重たすぎるので、そういうものはCryptoKittiesのサーバ上に保管してあり、NFTの情報を元に参照して表示、みたいなことが行われます。
猫の画像は別管理なんですね。
そうです。猫の画像は改ざんされてはいけない情報、というわけでもないですしね。
むしろ、あとでデザインを変えたりしたいかもしれません
そういうとき、あえて情報をブロックチェーンの外で管理するという手段が取られます
画像へのリンクだけブロックチェーンに保存したりします
つまりキティーのサーバが飛ぶと、画像が表示できなくなると。
そうです
サービス終了してもトークンは残るってのは正しいけど正しくないですね。
画像に重きを置くなら、そうですね。全て完全に残るわけではないです。
ブロックチェーンは保存したデータを改ざんできないようにする耐性を持っていますが、保存できる情報の容量はそれほど大きくないです。大きなデータを書き込んだり書き換えたりするには、それだけ多くのgas(手数料)が必要になるので、どの情報を含めるか、その大きさはどのくらいかをしっかり設計して定義する必要があります。(クリプトゾンビとかやっていただくと、この辺りの話が少し出てきます)
なるほど。
で、NFTを持っている人だけが音楽を聞けたり漫画が読めたり、というのはNFTと認証のシステムを組み合わせることによって初めて実現します。
そういうことですね。
一例ですが、 ユーザーがアプリにログイン(METAMASK連携)
↓
アプリがユーザーの保有NFTを確認
↓
NFTの保有を確認できたら、アプリがユーザーにコンテンツ閲覧の許可を与える
↓
ユーザーがコンテンツを閲覧できる
というようなフローにすると、NFTを持っている人だけがコンテンツを閲覧できる、といったことが可能になります。
認証の鍵の役割をNFTが担ってる感じです。
また、他の例として、「複数の人に一つのNFTに対するアクセス権を与えたい」場合には、上のやり方だとダメなので、「NFTに紐ついた認証鍵」を別のトークンとしてつくるやり方があります。
ERC621という規格がありまして、これはトークンの供給量を自由に設定できる(Re-Fungible Token: RFT)ので、RFTをNFTに紐づけておいて、特定のRFTをもつユーザーだけにNFTに紐づいたコンテンツを開示することを許可する、といったやり方をすることで、複数の人かNFTに紐づく情報(画像とか、動画とか、なんでも良いですが)にアクセスできる、ということを実現することができます。
ほう。RFTに権限を紐づかせると問題があるんですか?
この場合、権限が紐づいているのはRFTです。(なので売り買いするのはRFTです)
NFTとコンテンツが紐づいていますが、NFTそのものを売り買いするわけではありません
NFTの所有権をRFTで売り買いするイメージです
NFTと紐づける必要があるものなんですか?
そのRFTがどのNFTに紐づいているかをはっきりさせないと、なんに対する所有権を売り買いしているのかわからなくなってしまいますので
あ、というより、「NFTを複数の人で所有することにしたい」というニーズがあって初めてNFTとRFTを紐づける必要がありますね
ユーザーがアプリにログイン(METAMASK連携)
↓
アプリがユーザーの保有RFTを確認
↓
RFTの保有を確認できたら、アプリがユーザーにコンテンツ閲覧の許可を与える
↓
ユーザーがコンテンツを閲覧できる
でもいいってことですか?
それでもOKです!
納得です。
NFTによる管理については私からは以上ですが、よろしいでしょうか?
マルチなVIPチケットみたいな使い道のRFTを作って、複数のNFTに紐づけるみたいなことができそうですね。
そうですね、その辺りは色々できて自由度が高いと思います
OKです。考え方はわかりました。
はい、それでは今日はNFTを作成するところをOpenSeaのチュートリアルを使って一緒に体験するということで進めさせていただきます。
実際、Liberate liteの開発ではNFTを作成する必要はありません。が、他のサービスのNFTを参照する必要がありますので、一通りの動きは理解しておいた方が良いかと思います。
了解です。
https://docs.opensea.io/docs/getting-started
OpenSea
OpenSea ERC721 Developer Tutorial
Simple tutorial for a customizable marketplace for buying and selling on OpenSea
まず、このチュートリアルですが、OpenSeaで取引が可能な、クリーチャーと呼ばれるNFTを生成する方法について学べます。チュートリアルにはOpenSea上での取引関係の内容もあるんですが、Liberate liteではそこまでは必要ではないので、まずはNFTそのものの理解を深めるために、このチュートリアルのうち、NFTの生成までを行ないます。(編集済)
はい。
ご準備ありがとうございます^^
まず、こちらのページから進めていきましょう。 https://docs.opensea.io/docs/1-structuring-your-smart-contract
OpenSea
1. Structuring your smart contract
Leveraging the ERC721 standard to make your items instantly tradeable on OpenSea
まずは、必要なファイルをダウンロードします。
https://github.com/ProjectOpenSea/opensea-creatures
GitHub
ProjectOpenSea/opensea-creatures
Example non-fungible collectible, to demonstrate OpenSea integration - ProjectOpenSea/opensea-creatures
GitHubは、みたことがあるかもしれませんが、ソースコードを管理できるサイトです。
このサイトから”リポジトリ”と呼ばれる、ソースコードの塊をダウンロードする必要があります。
これsign upいるんですか?
いえ、いらないです
Visual studio codeでターミナルを開きましょう。
15.50 KB
右下の、このバツと三角のビックリマークがあるところをクリックします。
8.75 KB
こんなバーが出てきますでしょうか。
はい。
Shellを使ったことがあるとのことでしたが、cdやls、mkdirなどの基本的な使い方はご存知でしょうか?
大丈夫です。
では適当なフォルダを作りましょう。 場所はどこでもいいですが、 mkdir opensea とかにしましょうか。あとで変更しても良いです。
できたら、 cd opensea でディレクトリに入ります
次に、 git clone https://github.com/ProjectOpenSea/opensea-creatures でダウンロードを行います
どうでしょうか
git : 用語 'git' は、コマンドレット、関数、スクリプト ファイル、または操作可能なプログラムの名前として認識されません。名 前が正しく記述されていることを確認し、パスが含まれている場合はそのパスが正しいことを確認してから、再試行してください。 発生場所 行:1 文字:1
おっと、確か以前 git --version をして頂いたと思ってましたが
あ、ちょっと待ってください。
あ、WSLへの接続ですかね
そうです。
了解です。お待ちします
この後を忘れました。
33.64 KB
バツと三角のビックリマークがあるところをクリックして、ターミナルを出しましょう
8.75 KB
バーが出たら、この一番右のTERMINALをクリックします
zap@DESKTOP-H0FTP1L:~/opensea$ https://github.com/ProjectOpenSea/opensea-creatures bash: https://github.com/ProjectOpenSea/opensea-creatures: No such file or directory zap@DESKTOP-H0FTP1L:~/opensea$
GitHub
ProjectOpenSea/opensea-creatures
Example non-fungible collectible, to demonstrate OpenSea integration - ProjectOpenSea/opensea-creatures
git clone https://github.com/ProjectOpenSea/opensea-creatures 頭にgit cloneが必要です
あ、全部1行なんですね。
あ、はいそうです
できました。
zap@DESKTOP-H0FTP1L:~/opensea$ git clone https://github.com/ProjectOpenSea/opensea-creatures Cloning into 'opensea-creatures'... remote: Enumerating objects: 24, done. remote: Counting objects: 100% (24/24), done. remote: Compressing objects: 100% (23/23), done. remote: Total 424 (delta 12), reused 4 (delta 1), pack-reused 400 Receiving objects: 100% (424/424), 3.75 MiB | 3.20 MiB/s, done. Resolving deltas: 100% (199/199), done. zap@DESKTOP-H0FTP1L:~/opensea$
GitHub
ProjectOpenSea/opensea-creatures
Example non-fungible collectible, to demonstrate OpenSea integration - ProjectOpenSea/opensea-creatures
OKです。 cd opensea-creatures(編集済)
ここで一旦ドキュメントに戻りましょう。
https://docs.opensea.io/docs/1-structuring-your-smart-contract
OpenSea
1. Structuring your smart contract
Leveraging the ERC721 standard to make your items instantly tradeable on OpenSea
ここではまず、OpenSeaクリーチャーの定義を行うスマコンを登録します。Liberate liteの開発ではSolidityを書く必要はないので、とりあえずcontractの中身とかは省略して良いです。
pragma solidity ^0.5.0; import "./TradeableERC721Token.sol"; import "openzeppelin-solidity/contracts/ownership/Ownable.sol"; /** * @title Creature * Creature - a contract for my non-fungible creatures. */ contract Creature is TradeableERC721Token { constructor(address _proxyRegistryAddress) TradeableERC721Token("Creature", "OSC", _proxyRegistryAddress) public { } function baseTokenURI() public view returns (string memory) { return "https://opensea-creatures-api.herokuapp.com/api/creature/"; } }
cd opensea-creatures
であってます?
はい、あってます
あ、すみません私のコマンド間違ってました
Solidityの方に戻りますと
最低限のポイントとしては、ERC721を使うときは基本的にはすでにあるERC721の定義を”継承”して使うことで、ERC721を満たすように自分でわざわざ全部書かなくても、必要部分だけ修正してオリジナルのERC721トークンの定義を作ることができる、ということです。
なるほど。
TradableERC721Token.sol というのが、すでに定義されているERC721の定義(solはsolidityの拡張子)で、 contract Creature is TradeableERC721Token とすることで、TradeableERC721Tokenを “継承”した”Creature”という自分のスマコンを作ることができます。
function baseTokenURI() public view returns (string memory) { return "https://opensea-creatures-api.herokuapp.com/api/creature/"; } というのは画像のリンク先(のベースとなるURL)で、これはopenseaクリーチャーで独自に追加する必要があるので、ここで定義してます。
では、スマコンを登録していきましょう
Visual studio codeのターミナルに戻ります
はい。
今opensea-creaturesディレクトリにいると思うので、 npm install というコマンドを打ちます
これによって、このリポジトリで使っているnode(というJavaScriptの言語)の関連パッケージをまとめてインストールすることができます。
ここは少し時間がかかります
そうですね。
ERRとか出たら教えてください
私の時は、npmのバージョンが新しすぎてエラーになりました
ただ、先日ZAPさんからお送りいただいた node --version が、v8系だったので、おそらく問題ないかとは思います(編集済)
エラーがいくつか。
yes/noのあとyesって打ってみましたでしょうか?
今止めてます。
全てyesとやると、ダウンロードできるとは思います
なるほど。 npm --version はv3系でしたかね
あ、ダウンロードが止まってる感じですかね
止まってると思います。
左のぐるぐる回っているのが止まってしまったので。
一旦、コントロールとCを同時押しして、切ってしまいましょう
きりました。
先ほどgithub のサインアップしなくてもと申し上げましたが、エラーにgithubの接続関係が出ているのがきになるので、そこからやっていきましょう
githubってアカウント持っていますでしょうか
ないですね。
では作ってくださいませ
どうもアカウントがあったようです。
ログインできました。
OKです。それではログインをお願いします
はい
それでは、ssh接続というのができるように設定していきます
はい。
VSCodeのターミナルで、以下を打ちます
あ、ちなみに今私がみているのはこのページになります https://help.github.com/en/github/authenticating-to-github/generating-a-new-ssh-key-and-adding-it-to-the-ssh-agent
Generating a new SSH key and adding it to the ssh-agent - GitHub Help
After you've checked for existing SSH keys, you can generate a new SSH key to use for authentication, then add it to the ssh-agent.
ssh-keygen -t rsa -b 4096 -C "your_email@example.com"
1行です
emailのところは適当に。。
そのままうってしまった。
あ、それでも問題ないです
あと、質問が出たと思いますが
全てエンターで良いです
OKでしょうか
OKです!
それでは、「公開鍵」ってやつをgithubに登録していきます。
はい。
code ~/.ssh/id_rsa.pub
これでひらけますでしょうか
codeはVSCodeで開くコマンドです
あ、それは無視で大丈夫です
ひらけましたかね?
反応がないのでよくわからないです。
ちなみに、右側のは、拡張子に対して今VSCodeが適切な拡張機能を持ってないことをワーニングしてくれてます
あ、よく見るとタブにid_rsa.pubありますね
ちょっと広げていただいて、、
中身をコピーします
ターミナルをちょっと小さくすると良いです
コピーしました。
はい、ではそれを
Githubの右上のアイコンクリックすると、設定って出てきますかね
63.46 KB
私の英語ですが、日本語かもです
67.39 KB
左にこういうのが出たら、SSH and GPG keysをクリックします
で、NEW SSH KEYをクリック
10.26 KB
72.90 KB
この、Keyってとこに貼り付けます
Titleは適当にどうぞ
多分末尾に"your_email@example.com"がついてると思いますが、それもそのままでOKです
たぶんできました。
OKです!それでは npm install に戻りましょう(編集済)
なんか途中から進んでいる感じですね。
途中までダウンロードした分は残ってます
key verification failedまだ出てますね
動かないです?
動いてないですね。
https://qiita.com/turmericN/items/e519199bde9b7f37b249
Qiita
npm installした際に、fetchMetadataで止まった際の解決...
# はじめに `vue create`した際にfetchMetadataで止まってしまった際の解決方法の備忘録です。 ## 解決方法 下記を参考にして、設定変更しましたが解決しなかったです。 最終的にネットワーク(wifi)を変更し...
うーん
source とかしなくても大丈夫でしたっけ?
source..なんのpathでしょう?
npm config set registry http://registry.npmjs.org/
これやったらいいって言ってる人いますね。。
http://blog.higty.xyz/post/npm-install-does-not-end/
Uragami
Linux上でnpm installがいつまでたっても終わらない場合の対処法。
特に何か確信があるわけではないのでbashrcかbash_proflleあたりを…(と書いている間に他の…)
一回ctrl+cでキャンセル?
一旦キャンセルしましょ
ちょっとお試し程度ですが、 npm config set registry http://registry.npmjs.org/ 1行です
あとは、npmのバージョンかな。。 https://stackoverflow.com/questions/45433130/npm-install-gets-stuck-at-fetchmetadata
Stack Overflow
npm install gets stuck at fetchMetadata
I'm currently unable to run npm install in any project since today. I'm running node v8.2.1 & npm 5.3.0 (installed via nvm). When typing npm install it gets stuck on fetchMetadata everytime: ⸨...
25.96 KB
ssh-addとやらが必要? https://qiita.com/asam316/items/583a3aab9826ae4cf5b8
Qiita
GitHubをこれまでに触ったことがなかったので、 「[GitHub実践入門](http://www.amazon.co.jp/GitHub%E5%AE%9F%E8%B7%B5%E5%85%A5%E9%96%80-~Pull-Requ...
とりあえず同じところで止まりました。
21.70 KB
今回パスフレーズ入れてないんですよね
なのでこれはしなくて良いかと思うんです
npmバージョン変えてみましょう
ふむふむ。
nvm ls-remote
これって何が出ますかね
nvmはnpmのバージョン管理ソフトです
Command 'nvm' not found, did you mean: command 'num' from deb quickcal command 'nm' from deb binutils command 'lvm' from deb lvm2 command 'nam' from deb nam command 'nvim' from deb neovim command 'nim' from deb nim command 'kvm' from deb qemu-kvm command 'nvme' from deb nvme-cli command 'vm' from deb mgetty-voice command 'pvm' from deb pvm command 'nvi' from deb nvi command 'npm' from deb npm Try: sudo apt install <deb name> zap@DESKTOP-H0FTP1L:~/opensea/opensea-creatures$
おkです。まずはnvm入れます
git clone https://github.com/creationix/nvm.git ~/.nvm
これは一人でやったらきついっすね。
1行です
ですねw
打ちました。
source ~/.nvm/nvm.sh
N/A: version "8.11.2 -> N/A" is not yet installed. You need to run "nvm install 8.11.2" to install it before using it.
nvm help
なんか出ます?
めっちゃでました
OKです
nvm install 8.11.2
これで8.11.2のnodeを入れます
インストールされたみたいです。
npm --version
これ今何になってます?
5.6.0
前3.5.2だったので上がってますね
ではこれでやりましょう。ちょっと一旦今までダウンロードしたやつ削除したいので
rm -r node_modules
zap@DESKTOP-H0FTP1L:~/opensea/opensea-creatures$ ls -l total 844 -rw-rw-rw- 1 zap zap 3264 Dec 25 21:03 README.md drwxrwxrwx 1 zap zap 512 Dec 25 21:03 contracts -rwxrwxrwx 1 zap zap 286 Dec 25 21:03 flatten.sh drwxrwxrwx 1 zap zap 512 Dec 25 21:03 metadata-api drwxrwxrwx 1 zap zap 512 Dec 25 21:03 migrations -rw-rw-rw- 1 zap zap 641251 Dec 25 21:03 package-lock.json -rw-rw-rw- 1 zap zap 904 Dec 25 21:03 package.json drwxrwxrwx 1 zap zap 512 Dec 25 21:03 scripts -rw-rw-rw- 1 zap zap 1100 Dec 25 21:03 truffle.js
あ、あと nvm use 8.11.2 も必要でした
OKです
rmエラーだったんですよ。
あれ
node_modulesなかったですか
まだインストールできてなかった?
そうかもです
僕同じことやっててなかったです
なるです。ではもう一度 npm install してみましょうか
zap@DESKTOP-H0FTP1L:~/opensea/opensea-creatures$ nvm use 8.11.2 Now using node v8.11.2 (npm v5.6.0)
ちなみに学士さんもインストール失敗しました?
してました
今は動いてます
nodeのバージョンは8.11.2?
そす
あざます
怪しいエラーがいくつか出てるんですが、完走しました。
お
ERRですか?WARNではなく?
fatal errって致命的なエラーってことですよね?
なるほど、コンパイルエラー
ですねー
fatal error: libudev.h: No such file or directory
ここぽいですね
そんなのないよって言われてますね。
sudo apt-get install libudev-dev
あ、sudo使えるのかな
通りました。
お
ではもう一度 npm install
ワーニングだけだったのでイケてる気がします。
おお
お疲れ様でした
よかった。
今日はここまでにしましょうw
そうですね。
私電車乗らなきゃいけないので笑