DeFiに関して、普段から疑問に思っていることというのは、
NFTなどのトークンって、実際のコード的には、どうなっているの。あと、そのトークンが権利を表象しているっていうけど、それは、どのような意味なの?
ということです。12月4日に情報ネットワーク法学会の研究大会で、「DAOの法承認とあるべき規制論」というセッションのモデレータ役をしました。その準備のためにちょうどいい機会なので、普段から疑問に思っていることを調べてみたいと思います。
0 スマートコントラクトのコード
スマートコントラクトについてのお題目としては
- 第三者を介さずに信用が担保されたトランザクションを処理できるという特徴がある
- 契約のスムーズな実行・執行などが行われる
などがありますがそこら辺は、省略します。でもって、実際に作ろうとしたときにどうなるのだろうか、ということになります。
1 ERC721
NFTはERC721(Ethereum Request for Comments 721)という規格で定義されています。ERC721は、このページです。
イーサリアム改良提案(Ethereum Improvement Proposals)は、こちらです。
2017年3月にERC223が誕生しました。2017年9月に誕生したのが「ERC721」です。
ERC-721は、Ethereumブロックチェーン上でnon-fungibleまたはユニークトークンを構築する方法を説明する無料のオープンスタンダードです。ほとんどのトークンがfungible(すべてのトークンが他のすべてのトークンと同じ)であるのに対し、ERC-721トークンはすべてユニークです。
あらゆるNFTは、このERC721のルールに準拠して作成されています。逆にこの規格に沿わなければイーサリアム上でアプリを起動することはできないとされます。
同一のトークンというのは、ERC20になります。
ERC721は、
- interface ERC721 /* is ERC165 *
- interface ERC165
- interface ERC721TokenReceiver
にふれています。でもって、これにしたがって、NFTを生成しようというときに使うのが、Solidityということになります。
2 Solidity
Solidityというのは、こちら。
Solidityは、Ethereum上で動作するスマートコントラクトを開発するために設計された静的型中括弧({} (curly braces))プログラミング言語です。
Solidityの基礎は、こちらです。
そのなかで、スマートコントラクトの基礎は、こちら。
興味深い概念が並んでいます。具体的には、
- 暗号資産
- ブロックチェーン
- イーサリアム仮想マシーン(ガス、取引など)
などがあります。
また、Solidityの具体例として
- 投票(voting)
- ブラインド・オークション
- 安全な遠隔購入
- マイクロペイメントチャンネル
- モジュラーコントラクト
などがあります。詳細なお勉強は次の機会にしたいと思います。
3 Truffle
ということで、スマートコントラクトがSolidityで作成されるとしても、いろんなことを簡単にやりたいよね、ということで、そのためのツールが生まれてきます。
3.1 Truffle
これの代表的なものが、Truffleです。これは、厳密には、ツールの詰め合わせになっています。詰め合わせにはTruffleとGanache,Grizzleがあります。
Ethereum Virtual Machine(EVM)を利用したブロックチェーン向けの世界最高水準の開発環境、テストフレームワーク、アセットパイプラインで、開発者としての生活をより快適にすることを目的としています。Truffleを使用すると、以下を得ることができます。
- スマートコントラクトのコンパイル、リンク、デプロイメント、バイナリ管理を内蔵。
- ブレークポイント、変数解析、ステップ機能による高度なデバッグ。
- MetaMaskによるデプロイメントとトランザクションでニーモニックを保護します。
- Truffle環境内でスクリプトを実行する外部スクリプトランナー。
- コントラクトとの直接対話のための対話型コンソール
- 迅速な開発のための自動化されたコントラクトテスト
- スクリプト可能で拡張可能なデプロイメントとマイグレーションのフレームワーク。
- 任意の数のパブリックおよびプライベートネットワークにデプロイするためのネットワーク管理。
- ERC190 標準を使用した NPM によるパッケージ管理。
- 設定可能なビルドパイプラインと緊密な統合のためのサポート
となっています。
Ganacheは、EthereumとCordaの分散アプリケーションを迅速に開発するためのパーソナルブロックチェーンです。Ganacheは開発サイクル全体にわたって使用することができ、安全で決定論的な環境でdAppsを開発、デプロイ、テストすることができます。
Drizzleは、dappのフロントエンドをより簡単に、より予測しやすく書くためのフロントエンドライブラリのコレクションです。DrizzleのコアはReduxストアをベースにしているので、Redux周辺の壮大な開発ツールにアクセスできます。コントラクトデータやトランザクションデータなどの同期は私たちが行います。何を同期させるかを決めておくことで、物事を速く進めることができます。
3.2 Truffleでのコインの鋳造
上の三つの関係や実際の動作については、「Truffleとは?Ethereumのデファクトスタンダードなフレームワーク」という記事があります。
// SPDX-License-Identifier: GPL-3.0
pragma solidity >=0.5.0 <0.9.0;
(略)
contract Token {
mapping(address => uint256) balances;
using Balances for *;
mapping(address => mapping (address => uint256)) allowed;
event Transfer(address from, address to, uint amount);
event Approval(address owner, address spender, uint amount);
function transfer(address to, uint amount) external returns (bool success) {
balances.move(msg.sender, to, amount);
emit Transfer(msg.sender, to, amount);
return true;
}
となっていて、トークンについてのコードが記載されているようです。
4 NFTトークンの作成
では、いわれているトークンを作るというのは、どういうことなのでしょうか。では、これを実際にどうするのか、ということです。
4.1 トークンの作成法
オリジナルコンテンツをNFTマーケットプレイスにアップロードし、オンチェーンになっている状態のことを「Mint(ミント)」といいます。
実際には、作品等が、そのままオンチェーンになっている場合(フルチェーンという)とオリジナルデータのURLが刻まれる場合(オフチェーン)にすぎない場合があります。
Mintの手法にしても、マーケットプレース(プロバイダ)にアップロードして、オンチェーンにする場合と自ら、MINTする場合とがあります。
これらを図示すると、以下のような感じです。(What Is Full-Stack Blockchain?より)
オフチェーンやオンチェーンとのデータが、ブロックチェーン上にリンクされていることが示されています。
なお、マーケットプレースとしては、国内だと
Coincheck NFT(β版)
Adam byGMO(β版)
海外だと
OpenSea(オープンシ―)
Rarible(ラリブル)
SuperRare(スーパーレア)
があります。
4.2 Mint
「NFT(Non-Fungible Token )の概要と発行方法を学んで実際にトークンを作ってみよう!」によると実際のコードは、こんな感じです。(「Ethereum入門 〜ERC721トークン作成とTokenURI設定方法〜」とかも参照)
/トークンの名前と最小単位を定義
constructor() public ERC721Full(“testToken”, “hoge”) {}
//トークンの情報をstructで定義
struct Token {
string name;
string description;
}
//トークンを保管するために定義
Token[] public tokens;
//mint関数でトークンを発行
function mint() external {
uint256 id = tokens.push(Token(‘name’,’description’)) – 1;
super._mint(msg.sender, id);
}
}
「Ethereum入門 〜ERC721トークン作成とTokenURI設定方法〜」をみると、設定がこのようになっていて、トークンが結局は、オフチェーンのリンクが示されているにすぎないことがわかります。
{
"name": "My token collection",
"image":"https://ipfs.io/ipfs/QmTFqBE5jVMtqTJZofR41LEKUBqTMRKvBNyGxYPkP8AixW",
"description": "Create by *** html:https://ipfs.io/ipfs/QmUGAstzt9peoUHZ4XqHAczqmrjimwetziqWttqdagAwTk"
}
5 法的な考察
5.1 テジタル資産
デジタル資産という用語を
何らかの価値があるものとして取引がなされているデータ
と定義した場合に、このデジタル資産のバースは、以下のように書けるのではないかと考えています。
この右側は、データの領域、左側が、表章されている利益を示しています。
5.2 仮想通貨(広義)
デジタルデータがそれ自体として価値があるものとして取引されるのが、仮想通貨ということになります。これの分類は、こんな感じです。
5.3 種々のトークンの法的意味
仮想通貨の除いたデジタル資産の部分を良く考えてみるとこのようになるのではないかと考えています。
5.3.1 オンチェーン・データ(図の1の部分)
これは、オンチェーン上のデータが、それ自体、汎用的な価値であるとは考えられないが(仮想通貨との違い)、唯一のオリジナルなものとして取引されるものです。これは、さらにデータの性質として、例えば、有名人の作成したオリジナルのデジタルダータのようなものや、コントラクトで自動的に生成される自利益な価値などがあるとおもわれます。
5.3.2 オフチェーンの権利(図の2の部分)
これは、オフチェーンにおいて権利者たる地位がデジタルデータの形式のトークンとして示されている場合をいうことができます。この場合、そのトークンは、権利を表示するものといえるでしょう。ここで表示しているというのはどういうことか、ということがあります。これは、通常の権利の譲渡であれば、法的には、通知もしくは承諾等の手続がとられることになりますが、当事者間の約束もしくは法律によってより簡易なものとされている場合と考えています。
このなかで、特定のものは、金融商品取引法において電子記録移転権利として、種々の権利が表示されるべき権利として整理(2条3項柱書)されています。
もっとも、基本的には、オフチェーンの権利は、上でみたようにトークン作成者の宣明によるにすぎないので、それが真実であるという保障は、法的にはなされません。
有価証券法の用語で、有因証券という用語がありますが、そのようなものではないか、と考えています。このトークンの保有者は、その表示されている債権の譲受人としての地位をもつことになりますが、状況によっては、債務者は、その権利の譲り受けを否定することとかができると考えます。
5.3.3 オフチェーンの利益(図の3の部分)
トークンとして示されているのが、権利者たる地位ではなくて事実上の地位の場合などが、これになります。これは、事実上の立場ということになるかとおもいます。
5.3.4 まとめ
結局、トークンとして、何がリンクされているのか、というのをきちんと考えないとNFTというのは、本当に詐欺師の手段にされかねない、ということが明確になったとおもいます。