Thumbnail_Image.png

NFTアートの基礎知識 | ブロックチェーン・NFT・コントラクト

NFTアート作成に必要な前提知識の習得を目的とした記事です。ブロックチェーン・FT・NFT・コントラクトに関する基礎知識を速習することができます。NFTアートの作りたいと思っているクリエイターやエンジニア向けに情報を整理しました。
公開日2022.06.05
更新日2022.06.06

はじめに

この記事では、NFTアートを理解するにあたり、「前提知識」となる下記の用語を整理してみました。NFTプロジェクトに関わる事になり、知識が必要になったため、学習をかねて整理しています。
  • ブロックチェーン
  • FTとNFT
  • コントラクト

NFTの世間一般のイメージ

世間一般のNFTのイメージは 「似たようなパターンの絵が並んだ、値段がつく画像コレクション」 といったところでしょうか。
5_000-01.png
この認識でも良いのですが、NFTをプロジェクトを進めるにあたり何かと不都合が多いです。 今後NFTアートプロジェクトを進める人に向けて、この記事では必須となる前提知識を解説していきます。

基礎知識①:ブロックチェーン

ブロックチェーンは、 複数のコンピュータで状態を分散的に蓄積し続ける仕組み です。
5_001 (1).png
世界中のコンピュータで状態を管理するので、どこかのコンピュータが故障したり間違った取引を扱ったとしても、残りの複数のコンピュータが状態を検証し、正しい状態を保存し続けます。
ブロックチェーンでは、チェーンが始まって以来の 「状態遷移の履歴」をすべて保存 しています。Ethereumチェーンの場合は15秒に一度、その時点の状態履歴が保存されていきます。
5_001 (1).png
状態の遷移をつど検証し、正しい状態を維持し続けることで参加コンピュータが報酬がもらえる仕組みになっているため、正しい状態が維持されつづけています。
その性質を利用して我々は価値を保存しています。 例えば「誰が何のトークンをいくつ持っているのか」「誰が何のNFTを持っているのか」という世界中の参加者の状態を世界中のコンピュータで確認し、保存しています。
Ethereumは15秒ごとに1回、新しい状態を保存します。保存間隔はブロックチェーンの種類によって異なります。
ウォレットアプリは、ウォレットアプリが参照するブロックチェーンのサーバーの一つに問い合わせる事によって実現されています。
ブロックチェーンは世界中の参加者の状態を保存し、保証する仕組みであります。 だからこそ、誰が通貨をもっているか、誰がNFTを持っているかという保有の状態を保証することができる、というわけです。

前提知識②:FTとNFT

FTとは

通貨のような枚数で表現されるトークンは 「Fungible Token(以下FT)」 と表現されます。一般的な暗号資産、いわゆるBATSANDUNIといった通貨は、FTにあたります。
Fungibilityとは
FTのFにあたる「Fungible」は 「代替可能性」 という意味です。
FTであるBATを1枚持っていた場合、他の人が所有する1BATと交換できます。1BATは誰がどこで保有していようが同じ1BATであることには変わりありません。通貨の交換可能なこの性質のことを代替可能性、 「Fungibility」 と呼びます。経済学の概念です。
5_002-01.png
普通の数字で保有数を表現する暗号資産は、だいたいこのFTである、と覚えておいて間違いはありません。

NFTとは

「NFT」はFTに否定接頭辞がついた言葉です。「NFT」の正式名称は「Non Fungible Token」です。つまり代替可能性をもたないトークンです。
「NFT」は、FTとは違い、発行されるトークン1枚1枚がすべて異なるもの であるように設計されています。そのため「NFT-Aのトークン番号1のトークン」と「NFT-Aのトークン番号2のトークン」とあったとした場合、それぞれ異なるものでかつ、等価であることはわからないので、等価で交換することはできないもの、とみなされます。 つまり代替可能性のないトークンとなっています。
5_002-02.png

データ構造で理解するブロックチェーン上のFungibility

FTとNFTのデータ構造の概要を理解すると、 FTのどうFungibilityが実装されているか、逆にNFTにはなぜFungibilityがないかを直感しやすいです。
少し遠回りになりますが、両者の保有を表現するデータ構造をみていきましょう。
FTのデータ構造
ブロックチェーン上で、誰がいくつのFTを持っているかを、どう表現しているのでしょうか。
ブロックチェーンにはコントラクトという概念があります。コントラクトは状態変更のルールと状態の保存を行なっている機構です。トークンひとつにつき、一つのコントラクトが存在します。まずここでは、トークンごとに用意された箱のようなものだと認識してください。
誰がいくつのトークンを持っているかは、このコントラクトに保存されています。 保存方法は以下の通りです。アドレスが、いくつののFTを持つかが、列挙されて保存されています。
5_002-03.png
FTトークンは1枚1枚同じもので、区別をつけませんので、FT1枚1枚を区別するようなデータの持ち方がされていません。あくまでFTトークンは数量でしか表現されていません。
NFTのデータ構造
NFTもFTと同様に、トークン1つに対して1つのコントラクトが対応しています。
ところがNFTのデータは、別な手法で表現されます。NFTは1枚1枚ユニークなトークン番号が割り振られていて、番号ごとにどのウォレットが所有しているかの状態を保存しています。
5_002-05.png
データ構造から見ても、Aさんが保有する101番のトークンと、Bさんが保有する102番のトークンを交換しようとした場合、数字を入れ替えるだけではできないな、というのは直感できます。
フェアに価値を評価して交換をする場合、外部から両者の価格を判定するような仕組みを注入して、両者の価格を一度なにかしらのトークンの数量に判定して交換、価格が高い方はおつりももらえる、といったことをしないと交換は実現しなそうです。
注 - 補足
NFTにもFTのようにウォレットごとに何個持っているかを示す保存機構(_balances)があります。NFTでは、これに加えて、直前で解説したトークン番号とウォレットの組み合わせを保存する機構(_owners)を持っているという構造です。_ownersはFTにはありません。
FTとNFTのデータ構造まとめ
  • FTでは、「誰がいくつの数量をもっているか」のみで表現されています。
  • NFTでは、「何を誰が所有しているか」を表現します。
これがFTとNFTのデータの持ち方の違いで、このデータの持ち方の違いをみると、ブロックチェーンにおけるそれぞれのFungibilityの有無を、実感することができます。
NFTはトークン番号しか保存していない
NFT「を誰が所有しているか」と書きました。 とは、トークン番号の事です。
NFTの保存状態を理解するために、先ほど下記の図を示しました。
5_002-05.png
NFTというと画像を保有しているイメージがありますが、ブロックチェーンで表現される実態は、ただの数字、トークン番号だけです。
上記の図は、説明するための誇張でもなく、実態です。ブロックチェーン上ではユーザー(ウォレット)は、数字の保有しか表現されていません。
でもNFTというと、さまざまな種類の画像に溢れていて彩り豊かなイメージがあります。画像を保有している、という感覚があります。
次の項目では、この認識ギャップを埋めるべく、実際の仕組みと照らし合わせながら説明していきます。

NFTの実態

NFTの実態は単なる番号
NFTは、前出の通り、トークン番号とウォレットアドレスをペアを保存する事によって、ウォレットによるトークンの所有を示しています。 実はウォレットのNFT所有については、これしか保存されていません。保存されているのはこれだけです。
NFTに画像データは含まれていません(ただし、フルオンチェーンのNFTは除く)。
世間一般からすると NFT= 画像 というイメージがあるかと思うので、 ここで、もしかしたら「あれ?」と思う方もいるかもしれません。
実は、画像は外部のストレージに保管されています。
NFTの画像は外部のストレージに保存されている。
5_003-00.png
外部のストレージと繋ぐのが、コントラクトに入っているbaseURIです。 NFTを発行するコントラクトがbaseURI(ベースとなるURI)を持ち、トークンのコントラクトが、外部ストレージを特定する大元のURLを持っていて、それを組み合わせる事によって、画像にアクセスします。
5_003-01.png
ブロックチェーンのトークン番号と、ブロックチェーン外のストレージを組み合わせる事によって画像の所有を表現しています。ブロックチェーンで完結していない点、ここがポイントです。ただ、フルオンチェーンNFTは除きます。フルオンチェーンはブロックチェーン内で完結するようにできていますが、話がかなりややこしくなるので、ここでの紹介は省きます。
要はNFTはアンカリング
要はNFTがやっていることは、番号の所有を全世界のコンピュータで保証しつつ、その番号に紐づく外部ストレージのデータのアンカリングをしている、ということとなります。
要は、僕はこのURLを持っています!ということをブロックチェーンの世界で表現しているのが、NFT、ということになります。
💡余談:画像保存先の外部ストレージの永続性について
外部ストレージのデータがもし消えてしまったら、NFTの参照先は失われます。つまり画像は消えます。
例えばWeb2的なサービス、AWSやGoogleCloud上など参照させたとした場合、サービス改変による消失リスクや、料金未払いによるストレージ消失リスク等をかかえることになります。つまり永続性がない、という状態とも言えます。
なので、永続性をある程度担保するために、IPFSと呼ばれる分散ストレージを利用するという手もあります。世の中的にはこちらが推奨されている手段となっています。
ですがIPFS自体も、永続的に保管を補償されているものではない点に注意です。サーバー運営者が、当該画像を保存するインセンティブがないと、サーバー保有者が保存し続ける理由がないので、消えてしまいます。
IPFSそれ自体は維持インセンティブを設計に含んでいないので、インセンティブを与える仕組みをもつIPFS外のサービスを経由しデータをアップロードすることにより、永続性をある程度担保していくアプローチが必要です。
例えば、Pinataや、Arweaveといったサービスを使うことは一つの手です。

まとめ

FTとNFTについて、保有者との対応づけをどう保存するか、そのデータ構造を確認しながら、 それぞれのトークンの「Fungibility」の違いについて解説していきました。
次のコントラクトの章では、トークンごとがどういう単位で区分けされていて、保存されているのか、実際のデータをみながら理解を深めていきます。

基礎知識③:コントラクト

ブロックチェーンは、複数のコンピュータで状態を分散的に蓄積し続ける仕組み と書きました。 十数秒に一度、ブロックチェーンは状態変化を記録していきますが、誰もが自由に状態を変更できるわけではありません。

コントラクトが担っていること

状態の変更のルールは「コントラクト」(Contract Account)によって定義されています。 コントラクトは、状態の変更のルールの他に、状態の保存や、第三者への状態の提示を担っています。
5_004-02 (2).png

トークンごとに独立したコントラクトがある。

FT や NFT は、これらひとつずつに、独立した「コントラクト」があります。
5_004-02 (1).png
下記はFTやNFTが保存している実データの実例です。(22年6月5日時点) このように、コントラクトごとに独立してデータを保存します。
5_004-02.png

コントラクトに何が保存されているのか

それぞれのコントラクトに、誰が何を持っているのかが保存されています。 FT であれば、アドレスごとに保有枚数が記録されており、 NFT であれば、トークン番号ごとに保有者のアドレスが記録されています。
5_005-01.png
5_005-02.png

NFT の URL はコントラクト内に保存されている。

NFT のコントラクトは、内部に ベースとなる URL を保持しています。 例えば有名なNFTであるBAYCの場合「 ipfs://QmeSjSinHpPnmXmspMjwiXyN6zS4E9zccariGR3jxcaWtq/ 」といったものです。 このベースとなるURL がトークンの画像の置き場所を示します。
5_005-02-1.png
トークン番号に対応したいURLを取得したい場合は、コントラクトにトークン番号を問い合わせれば、このベースとなるURLユーザーが持つトークン番号を組み合わせ、トークンがアンカリングする URL を導出します。
5_006.png

コントラクトごとにデータは独立している

トークンごとにコントラクトは独立しています。NFTはコントラクトごとにそれぞれ独自のbaseURIが保存されています。
5_007.png

コントラクトには「規格」がある

コントラクトには「規格」があります。
ネジ等の部品には規格があります。規格を統一する事によって、だれがパーツを作ったとしても組み合わせられるといったメリットを得ることができます。ネジに限らず、世の中のあらゆる製品や部品には規格が定められています。
コントラクトも同様に規格があります。規格があることにより、コントラクトを利用するアプリケーションが、どのコントラクトでも同じような手法で操作ができるようになっています。
  • FT ...「ERC20」
  • NFT ...「ERC721」「ERC1155」
例えば NFT の ERC721 には、トークンに紐づく URL を出力する機能が定義されています。これはtokenURIと呼ばれる機能です。
この機能がどのコントラクトでも定義されているからこそ、アプリケーションは、NFTの画像を簡単に取得することができます。これは共通化されているからこそできることです。
仮に NFTのURL 取得方法がコントラクトごとに違って入れば、アプリケーションが1つ1つコントラクトに合わせて画像の取得を実装せねばならず、コストがかかりすぎてしまい、現実アプリケーション側は実装できません。
今日の Opensea のようなマーケットプレイスも存在しなかったと言えます。これは規格があるからこそ、です。
💡 NFTの規格ってどんなもの?
すこし専門的な内容になりますが、NFT の ERC721(+ERC721Metadata)では下記の機能をお約束として持ちましょうと定められています。
name()
  • トークンの名前を教えてくれる機能
symbol()
  • トークンの単位名を教えてくれる機能
tokenURI(tokenId)
  • トークン番号に対応した URL を教えてくれる機能
baseURI()
  • コントラクトのベースとなる URL を教えてくれる機能
balanceOf(address owner)
  • 特定のウォレットのアドレスの人の、このコントラクトの NFT の保有数を教えてくれる機能
ownerOf(uint256 tokenId)
  • トークン番号は、誰のものかを教えてくれる機能
approve(address to, uint256 tokenId)
  • トークン番号保持者が、指定したウォレットに指定したトークン番号を転送することを、許可する機能
getApproved(tokenId)
  • トークン番号の転送を許可された先のアドレスを取得する機能
setApprovalForAll(address operator, bool approved)
  • ウォレットが持つトークンの全てを、指定したウォレットアドレスに転送許可・不許可する機能
isApprovedForAll(address owner, address operator)
  • オーナーが持つすべてのトークンが、転送先に転送を許可されているかどうかを確認できる機能
transferFrom(from, to, tokenId)
  • 特定のトークン番号を自分が保有していれば、特定のアドレスに転送できる機能
safeTransferFrom(address from, address to, uint256 tokenId, bytes data)
  • 事前に、転送先の存在や、承認が取れているかどうかを確認した上で
  • 特定のトークン番号を、転送先へのウォレットが許可がされていれば、指定したアドレスに転送する機能
👀合わせて確認したい参考事例
(エンジニア向け) より実態を確認したいのならば、NFTのコントラクトの作成に使われる、ライブラリのコード参照すると良いです。
ソースコードの実例
I/Fの個別解説

まとめ

以上、この記事ではNFTアートの理解に必要な前提知識を解説しました。 簡単にまとめると、下記です。
  • ブロックチェーン
    • 複数のコンピュータで状態を分散的に蓄積し続ける仕組みである。
    • 上記の仕組みを利用し、価値の保存をおこなっている。
  • NFT
    • ブロックチェーンに記録されている所有データである。
    • ひとつひとつが独立しているトークンである。
    • ブロックチェーンでは単なる番号の所有しか意味しない。画像はブロックチェーン外部にある。
    • トークン番号と、ベースとなるURLを組み合わせる事によって、外部のデータをアンカリングしている。
  • コントラクト 
    • 状態の保存方法と状態変更のルールを定義したものである。
    • NFTやFTごとに、コントラクトは独立している。
    • NFTのコントラクトごとに、ベースとなるURLが定義されている。
    • NFTやFTには共通規格が定められている。
picture
hanzochang
代表取締役 半澤勇大
慶應義塾大学卒業後、AOI Pro.にてWebプランナーとして勤務。ナショナルクライアントのキャンペーンサイトの企画・演出を担当。その後開発会社に創業メンバーとして参加。Fintech案件や大手企業のDXプロジェクトに関わり、その後個人事業主として独立。2023年にWeb3に特化した開発会社として法人化。

2017年ごろより匿名アカウントでCryptoの調査等を行い、ブロックチェーンメディアやSNSでビットコイン論文等の図解等を発信。
hanzochangはフリーランスのエンジニアです
スキルセットや特徴は下記よりご確認いただけます
fixed
© 2023 hanzochang