ブロックチェーン手品で学ぶNFTのデータ

# 自己紹介
みなさんこんにちは。なんでもトークンです。
『目標：世界のすべてをトークン化』として日々トークンの開発をしています。
ブロックチェーンエンジニアとして活動しています

趣味はブロックチェーンを使った手品、ブロックチェーンマジックです。
最近は仮想通貨を持っているだけでお金が減る手品が得意です。
暴落しとる…orz  
![LUKSO.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/533970/b56b67e0-9940-c3f2-3262-105423fb19e0.png)

# ブロックチェーンマジシャン
…気をとりなおしていきましょう。
マジックと言えばキーワードは『消失』
あるはずのアレが消えてビックリするやつです
ビックリすることを目指して、消える手品を作ってみましょう。



# 手品の開発
何を消してみましょうか？
ブロックチェーン上のNFTで、消してはいけないものを消してみる手品はどうでしょう……？

………今回は『サーバ』を消します！
NFTにおける画像や動画などが保存されている装置
下の図の右側ですね！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/533970/8f6ac7d2-ed5c-2907-f270-576b9b8404f4.png)

# 手品のネタを仕込む
さて、手品のためのネタを構築していきましょう。
まず、さきほどの図の右側のサーバを構築していきます
ひとまず、ざっくりとConohaVPSでサーバをデプロイしてみます
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/533970/d679b76b-08c6-87d6-2d28-d4a51f5d1253.png)

サーバはUbuntuにしました。
(もちろん、お仕事の場合はもっと真面目に構築してください)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/533970/0c65162b-9fdd-2f2b-7595-5a0296557947.png)

ログインしました
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/533970/626d8786-e8a9-da34-3f93-4a1a0b732aa0.png)

apacheをインストールして

```
sudo apt update
sudo apt install -y apache2
```

NFT用の画像ファイルをアップロードしました

```
# ls /var/www/html/
image.png
```

そのあと、NFT用のjsonファイル(メタデータ)を作成しましょう

```
vim /var/www/html/nft.json
{"name":"Server Destroy Magic!",
"description":"The Server of this NFT is destroyed!",
"image":"http://118.27.108.98/image.png"}
```
ファイルを確認します

```
# ls /var/www/html/
image.png  nft.json
```

ブラウザで中身も見ておきます
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/533970/d20c1ef8-c3a9-2136-c60c-b209dfe83f4d.png)


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/533970/dc2dac35-4317-dde4-e56d-70cd51a4e485.png)



# NFTとしてデプロイ
こちらもRemixを使ってざっくりとデプロイしてしまいましょう
https://remix.ethereum.org/
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/533970/f66c2798-0872-b688-b292-c05adc8dfb1b.png)

中に記載したコードはこちら。
ポイントはtokenURI関数の戻り値が、先程作成したJSONファイルになっていることです。

```
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.2;
import "@openzeppelin/contracts/token/ERC721/ERC721.sol";
import "@openzeppelin/contracts/token/ERC721/extensions/ERC721URIStorage.sol";

contract MyToken is ERC721, ERC721URIStorage {
    constructor() ERC721("MagicalNFT", "MGC") {
        _safeMint(msg.sender , 1);
    }
    function _burn(uint256 tokenId) internal override(ERC721, ERC721URIStorage) {
        super._burn(tokenId);
    }
    function tokenURI(uint256 tokenId)
        public
        view
        override(ERC721, ERC721URIStorage)
        returns (string memory)
    {
        return "http://118.27.108.98/nft.json";
    }
}
```

さあ、デプロイしましょう(今回はRinkebyテストネットを利用)
赤色で囲ったところを選択して、オレンジのデプロイボタンを押します
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/533970/841969db-6f5e-4ed1-84da-bc2daebc7245.png)

1分ほど待つと、右下に🦊が出て、左下にスマートコントラクトができました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/533970/1c38341e-177b-4374-4cb6-2218668e816f.png)

このボタンを押すと、スマートコントラクトのアドレスを確認できます
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/533970/49de4e24-da56-18c1-5bf0-7f6eb8c8412a.png)

# NFTを確認しよう
次のURLでNFTを確認できます。
Ethereumメインネットの場合
http://opensea.io/assets/スマートコントラクトのアドレス/1

Rinkebyテストネットの場合
http://testnets.opensea.io/assets/スマートコントラクトのアドレス/1

なので、今回の確認に使うURLはこちらになります
http://testnets.opensea.io/assets/0xE059fD294F4C354FC1c070C77923A16414DB78b9/1
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/533970/c3fad0db-be6f-393e-5915-ed6e15b25ed9.png)



# サーバを消そう
サーバを消すのは簡単です。

クラウドであれば削除ボタンを押すだけ。
他にも管理者がクラウド会社へのクレジットカード支払いを忘れる、
運営会社の倒産など、様々な理由でサーバは消えます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/533970/9d428e08-4a20-f054-2541-64c75344d2bf.png)

消しましょう
サーバ削除ボタンを押します…
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/533970/14d537e2-77ca-180c-bd43-0e3d6267548a.png)




サーバがなくなりました。JSONファイルや画像のデータも参照できなくなっています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/533970/4210a31f-64a5-a394-9280-6fdd253f9ce5.png)


# 何が起こる…？
NFTが……
消え…
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/533970/485b73f6-20fd-164a-4ca9-ecf6489277b6.png)
消えない…！

もう画像データも、JSONファイルも、もうサーバ上に存在しないのに、なぜでしょう？
まさにマジックです！

# たねあかし
OpenSeaで表示されるデータの場合…
基本的に1度読み取られた後は、
OpenSea側でキャッシュされるのです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/533970/25444935-2a97-1db7-8934-10ebcf9ca03d.png)

なので、NFTのデータが無くなってしまった後でも、
OpenSeaがひとまずバックアップを取ってくれるのですね。
さすがOpenSea、世界トップのNFT企業です！！

……もちろん、NFT事業者とOpenSeaが両方とも倒産したときには、
このような、データをサーバに保存する方式のNFTは、データが本当に見られなくなってしまいます


# OpenSeaの寿命を超えるには
OpenSeaの寿命を超えるには、データの保存先をしっかりと検討しないといけません。
[Pinata](https://www.pinata.cloud/)などを使ってIPFSネットワークに保存する、
[Arweave](https://www.arweave.org/)ストレージに保存するなどの方法があります。
そして、さまざまな仕組みを組み合わせながら、どこかの企業が倒産したり装置が故障した際に、データが消えないような仕組み作りを、しっかりと行う必要があります。

このあたりのテーマは一晩語れるぐらい沢山の論点があるのですが、この記事では省略します。
なぜなら、これは手品の記事ですので…


# おわりに

ブロックチェーンマジシャンでは、ブロックチェーンを利用した手品を開発しています。
もしも、面白い手品のネタを思いついたら、この記事のコメントで教えて下さい。
![ブロックチェーンマジシャンs.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/533970/e4d9d1d7-bc15-158f-bbe7-545b0bef8c9c.jpeg)
それでは…
Let's Blockchain Magic!