Menu

【徹底解説】NFTを動かすためのプログラミング言語とは?

解説系記事

ここ近年「NFT」「ブロックチェーン」などWeb3.0に関する技術が注目されています。もちろん、NFTやブロックチェーンは、プログラミング言語によって開発・運用が行われます。本記事を読めば、NFTやブロックチェーンの知識・開発言語について理解することができます!

NFTが稼働する場所とは?

引用元 : NFT

NFTという言葉は、昨年あたりから世間に浸透しつつあります。
2017年に登場したブロックチェーン上でのゲーム、「CryptoKitties」により、NFTという概念が端を発したものの、NFTはあまり注目を浴びない期間が続いていました。

しかし、2021年にTwitter創業者であるジャック・ドッシー氏の出品したNFT「自分の初ツイート」が約3億円で落札されたり、テスラのイーロン・マスク氏が出品した音楽作品のNFTに約1億円の値がついたりと、著名人たちが発行したNFTが高値をつけていることが話題になり、2021年にNFTは一気に注目を集めたのです。

引用元 : jack氏の初ツイートが約3億で落札

そのような背景から、NFTに興味をもったものの、

  • NFTってどういう仕組みで動いているのかよく分からない…
  • IT系の事業を打ち出すなら、NFTに関連した方がいいのかな?
  • NFTってプログラミングで作ることができるの?

といった意見が多く見られます。
たしかに、NFTまわりの概念は抽象度が高く、なかなか理解しづらいのは間違いありません。

そういった意見から、本章ではNFTが稼働する場所についての解説を行い、次章ではNFTのもととなっている技術である「ブロックチェーン」および「スマートコントラクト」についての解説を行います。

「イーサリアム」と呼ばれるプラットフォームで稼働する

引用元 : イーサリアム

まずは、NFTの売買や取引を行うプラットフォームとして著名な「イーサリアム(Ethereum)」について簡単に説明します。

イーサリアムはブロックチェーンの一種で、ヴィタリック・ブテリン氏によって開発されましたす。

イーサリアムでは、「イーサ(ETH)」と呼ばれる単位の仮想通貨によってNFTの売買が行われます。
イーサは現実の通貨に換金することが可能で、2022年8月現在、1イーサに対して約23万円のレートで交換が行われています。

以下の画像では、「Megami」と呼ばれるサイトで、イーサを用いてアート系NFTの売買が行われています。
それの第一号NFTである「Megami #00001」に対して2022年8月現在で、50イーサ(約115万円)もの価値がついていることが確認できます。

引用元 : Megami #00001

NFT稼働のためのイーサリアム標準規格

NFTが取引される場所としてマーケットプレイスがある、というのはご存知だと思います。
しかしここで1つ疑問が生まれます。それは、

  • 仮想通貨であるETHに対して、なぜ数十万もの価値をつけることができるのか?

ということです。

これには「ERC標準」というイーサリアム上での規格によって、イーサとしての価値が付けられ、そのイーサはNFTの取引に適した性質を持っている、という前提が大きく関係しています。

引用元 : ERC標準

実在する円やドルなどの通貨と同様の性質をもってはじめて価値が生まれます。
現実の性質として、例えば

  • 安定性(価値が比較的安定している)
  • 互換性(他の通貨と交換することができる)
  • 流動性(素早く換金ができる)

といったものがあります。

これらの性質を決定する規格こそが「ERC721」となっている、ということです。

NFTってそもそもどういう仕組みになっているの?

前章では、NFTの取引を行うプラットフォームとしてイーサリアムがあり、イーサリアム上でNFTを取引する規格としてERCがあることを紹介しました。

本章では、そもそもイーサリアムの根幹である「ブロックチェーン」および「スマートコントラクト」、それらとNFTの関係性について解説します。

もととなる技術である「ブロックチェーン」

引用元 : ブロックチェーン

NFTおよびWeb3.0の領域において、その全ての根幹となっている技術が「ブロックチェーン」です。

ブロックチェーン技術によって、これまでのWeb2.0の時代ではなかなか実現が難しかった課題を解決できるようになりました。

ブロックチェーンがもたらしたメリットを3つ紹介します。

データの分散性

引用元 : P2P ネットワーク

ブロックチェーンにおけるデータ管理は、Web2.0までの「サーバーの管理を中央集権的に行っている」というものではありません。

上の画像に示すように、個人個人が独立してデータの管理を行うことができる「P2P(Peer to Peer)ネットワーク」という構造となっています。

これによって、データを個人レベルにまで分散することが可能になりました。

万が一、第三者のサーバーに問題が発生したとしても、Aさんのデータが消失するといった被害が発生する可能性がないため、リスクの少ない取引を行うことができます。

たとえば、Aさんの発行したNFTに関する暗号鍵などのデータ類は、Aさんのみが知っているため、安全性の高い取引ができるのです。ただし、マルウェアへの感染や偽サイトへのパスワード漏えいなどの危険性があることも知っておくようにしましょう。

なお、一般的なブロックチェーンには一公開鍵および秘密鍵を用いた暗号化の技術が用いられています。
公開鍵は一般公開される鍵、秘密鍵は本人にしか分からない鍵のことです。

データの検証可能性

引用元 : ハッシュ関数

ブロックチェーンは、その名前の通り、ブロックと呼ばれるデータ集合がチェーン状に連鎖していく構造になっています。

各ブロックは時系列に沿って連続しており、新しいブロックにデータを格納する時の値のひとつとして前のブロックを参照する、という仕組みを取っています。

その技術として使用するのが「ハッシュ関数」というもので、これによってデータの時系列的な唯一性が担保されるのです。

これには、ハッシュ関数が持つ性質が大きく関係しています。
ハッシュ関数は主に以下の性質を有しています。

  • 入力データに対して、ハッシュ値(出力データ)が唯一に定まる
  • 入力から出力を求めるのはカンタンだが、出力から入力を特定するのはほぼ不可能

1つ目の性質を「単射性」といい、2つ目の性質を「不可逆性」といいます。
2つの性質を合わせるハッシュ関数を用い、時系列につないでいくことで、改ざんがほぼ不可能なシステムとなっているのです。

クラッキング耐性

引用元 : 楕円曲線暗号

ブロックチェーンの内部的な暗号化技術で採用されているのが「楕円曲線暗号(ECC)」です。
楕円曲線暗号を簡単に説明すると、「楕円曲線」と呼ばれる数式上で点の移動を行う演算を繰り返すことで、暗号を生成するアルゴリズムです。
これを用いることで、秘密鍵から公開鍵を生成する際に、ハッシュ関数と同様の「不可逆性」を実現できます。

他の暗号化技術でよく用いられる「RSA」にも不可逆性はありますが、RSAよりも楕円曲線暗号の方が負荷が軽く、実用性が高いことが知られています。

楕円曲線暗号は、他の暗号化技術と比較して、数学的に複雑な分、実用性および秘匿性の高いアルゴリズムなのです。

「スマートコントラクト」とは何か

引用元 : スマートコントラクト

そういった安定性のあるブロックチェーン上で、データをブロックに書き込んで、設定した取引操作を自動的に実行する仕組みのことを「スマートコントラクト」といいます。

売買や送金といった取引契約のことをコントラクトといい、あらかじめ「いつ、だれに、どうやって」といった条件を設定していくことで、条件を満たすコントラクトを自動で効率よく実行するシステムになっています。

自動的に契約が行われるので、これまで当事者間で必要だった契約の締結が省け、人為的なミスでトラブルになることがなくなりました。

「スマートコントラクト」と「イーサリアム」の関係性

引用元 : NFTバナー

スマートコントラクトを用いて、分散型で自動的なNFTおよび仮想通貨の取引を行うプラットフォームの中で、最も有名なものが「イーサリアム」なのです。

「イーサリアム」が登場することで、誰でも簡単にスマートコントラクトを利用できるようになりました。

これによって、現在NFTに関する様々な事業の急速な拡大がもたらされたといっても過言ではありません。

スマートコントラクトによるNFT取引のプラットフォームには、イーサリアムの他に「Polygon」「WETH」「FLOW」などがありますが、市場規模ではイーサリアムが圧倒的です。

スマートコントラクトをデプロイするための言語「Solidity」

本章では、「スマートコントラクト」を実装するために用いられるプログラミング言語である「Solidity」に関する解説を行います。
「Solidity」の特徴や共通点のあるプログラミング言語、Solidityエンジニアの需要や収入について紹介します。

プログラミング言語「Solidity」の特徴3選

引用元 : bitcoinwiki

「Solidity」はスマートコントラクト開発以外ではマイナーな言語であるため、初めて名前を知ったという方も多いのではないでしょうか。

実際国内にSolidityのエンジニアは少なく、まだまだ言語自体が浸透していない印象です。
まずは、「Solidity」の主な特徴を知るところからスタートしましょう。

コントラクト指向言語

はじめにSolidityの大きな特徴として挙げられるのが、「コントラクト指向言語である」という点です。

コントラクト指向言語とは、サプライヤーとクライアント間の取引を設計するときに、ソフトウェアの正確性と安全性を高めるためのプログラミング言語のことを指します。

では、コントラクト指向言語の仕様にはどのようなものがあるのか、具体的に紹介します。

・事前条件
コントラクト指向言語を用いたコントラクトにおいて、クライアントの義務およびサプライヤの利益は事前に条件として決まっています。
「この契約はこういった条件を満たした場合に行われますよ」という一種の表明が事前に行われ、それが両者に共有されるということです。

・事後条件
コントラクト後にサプライヤはどういう状態になるか、またクライアントは何を受け取るか、といった要素も明確に決定されています。

・不変条件
コントラクトの前後で不変な要素も記述されています。
例えばコントラクト後にコントラクトアドレスやログが変わってしまっては、ブロックチェーンの安定性に逆らうことになってしまい良くありません。

このように、Solidityは制約や束縛が大きい言語である半面、正確性や強固性といった面で優秀な、コントラクトに適した仕様になっています。

比較的シンプルな文法

Solidityは、他のプログラミング言語とくらべて、比較的シンプルな文法で記述されます。

コントラクト指向をもつ言語は文法が厳密で複雑なのが一般的です。
実際、他のコントラクト指向言語である「Kotlin」「D言語」などは、値参照や引数・継承などの文法が難解で、直感的に理解しづらいものがあります。

そういった「コントラクト指向言語 = 難しい」といったイメージを払拭すべく、できる限りシンプルな文法で扱えるように設計されたのが、Solidityという言語なのです。

Solidityは「JavaScript」というメジャーなプログラミング言語を参考にして文法が設計されています。

JavaScriptはプログラミング言語の中では最も基本的なもので、「プログラミング言語といえばJavaScript」「エンジニアになりたいのならJavaScriptは勉強すべき」と言われるほどです。

それだけメジャーな言語であるのには理由があり、その中の1つが「文法が明快で理解しやすい」という点。
Solidityもうまくその恩恵を受け、直感的に理解しやすいコントラクト指向言語としての地位を確立しました。

ただ唯一の難点が「ライブラリの種類が多い」ということです。

プログラム自体の内部的な要素をシンプルにすることを追求した分だけ、外部的な要素であるライブラリが増えてしまうのは仕方ないことですが、文法以外に学ぶことが多いというのは、開発者にとって負担になります。

チューリング完全言語

チューリング完全言語であるとは、簡単にいうと「自動計算器と同様の数学的モデルを実装した言語」ということです。

要するに、ブロックチェーンの処理で求められるような、ハッシュの計算をはじめとした複雑な演算を問題なく処理することができるという性質を、Solidityは持っているのです。

ただし理論的には実装可能な演算であっても、それが実際に実装できるかどうかはエンジニアの腕前次第であることは留意すべき点となります。

「Solidity」と共通点のある、他のプログラミング言語3選

次に、「Solidity」の特徴と類似している他のプログラミング言語を3つ紹介します。

C++

SolidityはJavaScriptを参考にしたと述べましたが、それ以外にも参考にされたプログラミング言語があります。

そのうちの1つが「C++」です。
C++はオブジェクト指向のプログラミング言語なので、その根本的性質自体は異なるのですが、両者の構文はかなり似ています。

以下の画像は、C++およびSolidityでスマートコントラクトの開発を行っているときのソースコードの一部です。
上がC++、下がSolidityとなっています。

細かい変数型や記述方式はもちろん異なっていますが、全体的な構文自体は共通している部分があります。

  • コントラクトのクラスをカッコ括りで宣言し、その中にモジュールとして関数や変数をもっている。構造体としての文法に共通点がある。
  • 呼び出しの範囲をpublicで管理している。

といった点が、画像からうかがえる共通点になります。

引用元 : eosio developers

引用元 : QuickNode

Python

SolidityとPythonでは、文法および構文自体で共通点はあまり見られませんが、根本の性質の部分で共通点があります。

・チューリング完全
Pythonはデータサイエンスでよく用いられるように、大規模なデータを処理するのが得意です。
例えばアドレスのような長い数値列であっても桁数に依存しない演算が可能ですし、行列計算・微分演算などの数学的な計算も難なく処理することができます。

・シンプルな文法
Pythonは見た目が非常にシンプルなプログラミング言語です。その分柔軟性が豊富で、長いコードの開発に長けています。
また、外部ライブラリの種類が多いことも、Solidityとの共通点です。

JavaScript

JavaScriptは、Solidityが最も影響を受けている言語です。

下の画像で、JavaScriptとSolidityの構文を比較することができます。
両者は全く違うものを作っているのにも関わらず、かなり類似した文法になっていることが分かります。

引用元 : JavaScript Tutorial

引用元 : QuickNode

なぜスマートコントラクトの開発に「Solidity」が使われるのか

Solidityの3つの主な特徴によって、ブロックチェーン上でスマートコントラクトの開発を容易に行うことができる、というのが主な理由です。

改めてSolidityの特徴を挙げ、それぞれどういった風にスマートコントラクト開発における恩恵をもたらすのか、解説します。

・コントラクト指向言語である

オブジェクト指向言語でもスマートコントラクトの開発を行うことは可能ですが、安全性および正確性の面でコントラクト指向言語の方が優位です。

特にNFTのような高値水準で取引が行われるようなコントラクトにおいて、コントラクト指向言語であることの恩恵を大きく受けることができます。

・文法が他のコントラクト指向言語よりも容易である

複雑なコントラクト指向言語を用いるよりも、できるだけシンプルな言語で実装した方が、運用など長期的な目線で見た際にメリットが多いです。

また、Solidity文法が容易であることは、Solidityエンジニアの増加につながり、将来的にNFT市場が更に活性化することが期待できます。

・チューリング完全言語である

ブロックチェーン上で行われる演算は複雑な処理を行うものが多く、それらの演算を十分高速に動作するように実装する必要があります。

チューリング完全言語であるSolidityを用いることで、これらの問題を解決できます。

「Solidity」エンジニアの需要・年収

Solidityエンジニアの需要は世界各国で急速に高まっています。

そもそもバックエンド開発言語であるSolidityは、他のRustやC++、JavaScriptなどの他のバックエンド開発言語と比べて、NFTが台頭する前は圧倒的にマイナーな言語でした。

それが急に2021年になって「NFT市場が今アツいから、Solidityエンジニアを集めよう」という動きに転向しても、人手不足になるのは当然のことです。

それを裏付けるかのように、Solidityのエンジニアの年収は、他の一般エンジニアの約2倍となっています。

ソース : web3.career

上の画像は、2022年8月現在での、「Solidityを使ってスマートコントラクトなどバックエンド開発を行うエンジニアの平均年収」のデータです。

注目すべきデータは「Remote」の部分です。
一見すると明らかなように、Solidityエンジニアの年収はかなり高水準になっています。

最低でも年収が6万ドル(約780万円)、平均年収に至っては12万ドル(約1,560万円)です。
さらに技術力があるならば最高年収の75万ドル(約1億円)を目指すこともできる可能性は十分にあります。

このように、高い技術力が求められ、なおかつ経験者が少ないSolidityのエンジニアはどこの国であっても給料はかなり高水準になっています。

Web3・NFT開発に用いられる他のプログラミング言語4選

この章では、Solidityの他に、NFT開発で主に用いられる他の言語を3つ紹介します。

C++

C++はバックエンド開発でよく用いられる言語です。

プログラミング言語の中で一二を争うくらいには高速で、なおかつメモリ効率もよく、またチューリング完全言語としての特性も持ち合わせています。

文法も比較的単純なので、実際に仮想通貨開発に用いられました。

  • Bitcoin
  • Ripple
  • Litecoin

といった仮想通貨は、C++をベースに構築されています。

Rust

Rustは近年バックエンド開発において、かなり注目を集めている言語で、実際にRustエンジニアの需要は多いです。

Rustは高速でメモリ効率が高く、静的に型付けされたプログラミング言語のため、数々の現場で重宝されています。

また、Rustは厳密さと正確性を重視するという特性を持っているため、エラーが許されないNFT開発に適している言語といえます。
デバッグを全自動で行ってくれるため、長期的に運用保守を見据えた場合にはさらにメリットが大きいです。

実際に最速のブロックチェーンとして名高い「Solana」は、Rustを中心として構築が行われました。

Vyper

Vyperはイーサリアム仮想マシン(EVM)をターゲットとした、コントラクト指向言語です。

もともとSolidityのセキュリティ的な問題に対処するために開発されたのがVyperだったという側面もあり、Solidityの補完をするために用いられることが多いです。

Solidityよりもできることが少ない反面、安全性の強固さや監査の容易さを手に入れることができました。

まとめ : NFT開発にはSolidityが用いられる

引用元 : NFT

今回はNFT周りの技術の説明や、NFT開発に用いられるプログラミング言語について解説しました。

簡単に今回の記事の要点をまとめておきましょう。

  • NFTが取引されるプラットフォーム … イーサリアム
  • イーサリアム上でNFTを取引する自動化の仕組み … スマートコントラクト
  • スマートコントラクト開発に用いられる言語 … Solidity
  • Solidityの他にWeb3.0で用いられる言語 … C++, Rust, Vyper

NFT開発はまだまだ発展途上で、これからどんどん新しい技術・プログラミング言語が登場してくる可能性が高いです。今後の動きに注目です。

AMEHARE

AMEHARE

ITの最新トレンドを発信しはじめて十余年。Web2から3の時代の変革もいち早く察知し、2012年ごろから仮想通貨に注目をし始める。次世代の文化やテクノロジーを情報を掴みつつ、NFT・メタバース・DAOなどの領域であらゆる情報を発信中。
Author