ブロックチェーンの開発プロセスにおいて、自分自身のブロックチェーンを開発することや、特定のパブリックチェーンやフレームワークに基づいて開発することに加えて、デジタル暗号資産を迅速に生成し取引できるツールを提供するサードパーティプラットフォームもいくつか存在します。例えば、海外の Opensea(ウェブサイト:http://opensea.io)や RareBits(ウェブサイト:https://rarebits.io/)、国内の BIGE(ウェブサイト:http://bige.game/)などがあります。
3 つの開発事例には、Ethereum クエリ分析システムの開発事例、ERC20 トークンの開発事例、OpenSea プラットフォームに基づくデジタル暗号資産の開発事例が含まれます。
●Ethereum テストネット Ropsten を理解する。
●web3.py ライブラリの機能を習得する。
●Ethereum データの基本的なクエリと分析方法を習得する。
●ERC20 トークンの開発を理解する。
●暗号資産の開発プロセスを学ぶ。
●OpenSea 取引プラットフォームを理解する。
Ethereum の DApp 開発実践では、Ethereum のローカルテスト環境を構築しましたが、ローカルテスト環境のデータは少なく、実際の Ethereum ネットワークのデータ状況を反映できません。そのため、Ethereum の公開テストネット Ropsten をテスト環境として選択します。
Ropsten は 2016 年 11 月に立ち上げられた Ethereum テストネットで、ストックホルム(スウェーデンの首都)の地下鉄駅にちなんで名付けられました。Ropsten はプルーフ・オブ・ワークのコンセンサス機構を採用しており、Ethereum の既存の生産環境を最もよく模倣しており、Ethereum メインネットのシステムやネットワーク状態などにおいてもかなり類似しています。また、Ropsten テストネット上の Ether は無料であり、Ropsten テストネットに接続することで Ethereum のさまざまなテストと開発を非常に低コストで行うことができるため、Ropsten テストネットはコストパフォーマンスが非常に理想的です。以下では、前の第 5 章で紹介した MetaMask プラグインを使用して Ropsten テストネットに接続します。
(1)Ropsten テストネットに接続
MetaMask プラグインをクリックしてオプション画面を開き、ネットワークオプションをクリックして接続ネットワークを Ropsten テストネットに変更します。図 8-1 を参照してください。
(2)テストアカウントを作成
ネットワークの切り替えが成功したら、ユーザーアイコンをクリックし、Ropsten テストネットで新しいアカウントを生成するためにユーザーを作成を選択します。
ポップアップ画面にユーザー名を入力し、「CREATE」ボタンをクリックして作成します。図 8-3 を参照してください。
(3)アカウント残高を確認
作成が完了したら、アカウント詳細ページに移動し、新しいアカウントの残高は 0 Ether です。図 8-4 を参照してください。
(4)Ether を取得
接続テストを行うために、Ropsten テストネットで一定量の Ether を取得することが望ましいです(Ethereum ネットワークでの更新操作には Ether が消費されます)。Ropsten テストネットで Ether を取得する方法は主に以下の 3 つです。
●友人に送金してもらう。
●自分でマイニングする。
間違いなく、最初の方法が最も便利で迅速です。以下で申請操作を行います。
- Ether を申請
Ether を申請するには、アカウントアドレスを入力する必要があります。
(1)アカウントアドレスをコピー
アカウントの左上隅のメニューをクリックするとアカウント詳細が表示され、アドレスの右側にコピーボタンがあります。クリックしてアドレス情報をコピーします。
(2)Ropsten で申請
アカウントアドレスを得たら、ブラウザでhttp://faucet.ropsten.be:3001 / にアクセスし、開いたページに先ほどコピーしたアカウントアドレスを入力します。図を参照してください。
(3)申請成功
「Send me test Ether」ボタンをクリックしてテスト Ether を申請します。申請が成功すると、ページの下部に申請成功情報と送金取引記録のハッシュ値が表示されます。図を参照してください。
注意:申請した Ether は Ropsten ネットワーク内の他のノードによって確認される必要があるため、申請成功後、一般的には MetaMask で申請した Ether 情報を見るまでに約半日ほどかかります。
すでに MetaMask プラグインを使用して Ropsten テストネットのテストアカウントを作成しました。このテストネットのインターフェースに接続してデータをクエリし取得するために、ここでは web3.py ライブラリを使用して Ropsten テストネットに接続します。
- web3.py の紹介
web3.py は Ethereum インターフェースの Python ラッパーで、JSON-RPC を介して Ethereum ネットワークと対話します。web3.py は web3.js に似ており、web3.js は主にブラウザ側の Dapp 開発に適しているのに対し、web3.py は Python に基づいて開発されており、サーバーでの使用により適しています。
- web3.py のインストールと使用
web3.py は Python のパッケージ管理ツール pip を使用してインストールできます。まず、新しい仮想環境を作成します。
(1)仮想環境を新規作成
ここでは、ch8 という名前の Python 仮想環境を新しく作成します(web3.py は Python3.5 以上のバージョンをサポートしています)。コマンドは次のとおりです。
virtualenv venv -p python3
(2)web3.py をインストール
作成後、この仮想環境をアクティブにし、次に pip install web3 コマンドを使用して web3.py をインストールします。このコマンドは依存ライブラリを自動的にダウンロードしてインストール情報を表示します。図を参照してください。
web3.py はデータフィルタリングインターフェース、サービスプロバイダー、Ethereum ネーミングサービス、ネットワーク情報、アカウント情報、ブロック情報などの主要な機能インターフェースを提供しています。詳細は web3.py の公式ウェブサイトhttps://web3py.readthedocs.io/en/stable/index.html で確認できます。
(3)テストノードを申請
web3.py をインストールした後、Ropsten テストネットに接続するためのテストノードを申請する必要があります。ここでは Infura を使用します。Infura は Ethereum ノードサービスプロバイダーで、公開された Ethereum メインネットとテストネットノードを提供しており、開発者は Infura の公式ウェブサイトで申請できます。ブラウザでhttps://infura.io/ を開くと Infura のページが表示されます。図を参照してください。
ページ上の「GET STARTED FOR FREE」ボタンをクリックして無料申請を開始します。無料申請には名前、メールアドレス、パスワードなどの基本情報を入力する必要があります。情報を入力したら、「SIGN UP」ボタンをクリックして登録します。登録後、確認メールが入力したメールアドレスに送信されたことが通知されます。受信していない場合は、「RE-SEND VERIFICATION EMAIL」ボタンをクリックして確認メールを再送信できます。
メール内の確認リンクをクリックすると、自動的に登録アカウントにログインします。スムーズにログインすると、ユーザーに新しいプロジェクトを追加するように促されます。プロジェクト名は任意で、ここでは「自学区块链」と名付け、「CREATE PROJECT」ボタンをクリックしてプロジェクトを作成します。図を参照してください。
プロジェクト作成後、プロジェクト詳細ページに移動します。詳細ページには、Ethereum ネットワークに接続するための API KEY、API SECRET、接続可能なノードアドレス ENDPOINT、およびこのノード上のスマートコントラクトのホワイトリストが表示されます。ここでは Ropsten テストネットのノードを選択します。図を参照してください。
- web3.py を使用してネットワークに接続
上記で得た Ropsten テストネットの接続ノードを使用して web3.py で接続できます。まず、web3.py から Web3 と HTTPProvider をインポートし、次にプロジェクト内の Ropsten テストノードに接続します。接続後、isConnected メソッドを使用して接続状態を確認し、True が返されれば接続成功です。図を参照してください。
接続が成功したら、web3.py が提供する getTransaction などのメソッドを使用して Ropsten ネットワークデータをクエリできます。
(3)アプリケーションを作成
プロジェクトを初期化した後、機能コードの実装を開始できます。まず、Flask アプリケーションを新規作成し、Web3 を初期化して接続します。app.py に以下のコードを記述します。
完了後、python app.py コマンドを実行すると、このアプリケーションを起動できます。起動したアプリケーションはデフォルトで 5000 ポートでリッスンし、リクエストを処理して結果を返します。
(4)基本テンプレートを実装
アプリケーションを作成した後、ページの作成を開始します。Flask ではデフォルトで Jinja2 テンプレート言語を使用してテンプレート機能を実現しています(Jinja2 には強力な機能であるテンプレート継承機能があります。テンプレート継承により、開発者は基本的な骨格テンプレートを作成でき、このテンプレートにはウェブサイトの共通要素が含まれ、子テンプレートはこの基本テンプレートを継承することでこれらの共通要素を持つことができます。異なるページ要素はオーバーロードを通じて実現でき、Python クラスの継承とオーバーロードと同じくらい簡単です)。したがって、まず基本テンプレートを作成し、ページの共通部分をこの基本テンプレートに配置し、他のページがこのテンプレートを継承することでこれらの共通部分を持ち、ページに必要なカスタマイズ内容を追加し、bootstrap を使用してページスタイルを美化することで迅速にページを実現できます。このようにすることで、重複した内容を記述することを避け、開発効率を向上させることができます。具体的な操作は、現在のディレクトリの templates フォルダに layout.html というファイルを新規作成し、このファイルに bootstrap 関連の css と js をインポートします。コードは以下の通りです。
「{% block ×××%}{% endblock %}」のような内容は、子テンプレートでオーバーロードされる領域を提供します。子テンプレートはオーバーロードを通じてカスタマイズされた内容を追加できます。次に、最初の機能を実装します。最初の機能は Ropsten テストネットの最新ブロックをクエリして表示することです。
Ropsten テストネットの最新ブロック情報をクエリするには、web3.py の getBlock 関数を使用します。この関数が返す形式は Json 文字列で、フロントエンドの HTML ページがこの Json 文字列を表示する役割を担います。app.py に get_last_block という名前の関数を実装し、その中で getBlock(“latest”)関数を呼び出し、返されたブロック情報から主要な内容を抽出してテンプレートに渡して表示します。コードは以下の通りです。
上記のコードは、取得したブロック情報から主要なブロック情報を抽出し、これらの情報を辞書に封装してテンプレート block.html に渡します。block.html テンプレートはまず layout.html テンプレートを継承し、次に jquery.json-browse の jquery プラグインを使用して表示します。jquery.json-browse の役割は Json データの表示を美化し、Json データを展開および折りたたむ処理を行うことです。block.html のコードは以下の通りです。
最新ブロックのクエリコードが完成した後、アプリケーションを起動して効果を確認できます。ブラウザでhttp://127.0.0.1:5000 にアクセスすると、最新ブロックの情報が表示されます。図 8-16 を参照してください。最新ブロックの情報には、マイナーアドレス(miner)、ハッシュ値(hash)などが含まれています。
- ブロックの取引データをクエリ
1 つのブロックには多くの取引記録が保存されることがよくあります。図 8-16 のブロック情報には transactions フィールドがあり、そこには一連のハッシュ値が含まれており、それぞれのハッシュ値は 1 つの取引記録に対応しています。このセクションで実装する機能は、web3.py の getTransaction 関数を使用してハッシュ値に対応する取引情報をクエリし、その取引情報を HTML に表示することです。app.py に handle_transaction 関数を実装し、この関数は GET および POST の 2 つのリクエスト方式を受け取ります。GET リクエストは入力ボックスとボタンを含む HTML ページを返し、POST リクエストは取引情報のハッシュ値を渡し、関数内で web3.py の getTransaction 関数を呼び出して対応する取引をクエリし、結果を返します。コードは以下の通りです。
app.py を更新した後、新しい transaction.html テンプレートファイルを作成します。このテンプレートファイルも layout.html から継承されます。テンプレートには入力ボックスとボタンが表示され、入力ボックスに取引ハッシュ値を入力し、「検索取引」ボタンをクリックすると、取引ハッシュ値のリクエストデータがアプリケーションに送信され、アプリケーションから取引データを取得した後、jquery.json-browse コマンドを使用して Json データを表示します。コードは以下の通りです。
完成後、アプリケーションを再起動してページの効果を確認できます。取引を検索するためのページが表示されます。ブラウザでhttp://127.0.0.1:5000/transaction にアクセスし、そのページを開いて、入力ボックスに取引 ID を入力し、「検索取引」ボタンをクリックすると、取引の詳細が表示されます。図を参照してください。
ブロックと取引データのクエリ機能が完成した後、アカウント残高のクエリ機能を実装します。アカウント残高のクエリの実装ロジックは、取引データのクエリと似ています。app.py に get_balance 関数を実装し、GET および POST の 2 つのリクエスト方式を受け取ります。GET リクエストは入力ボックスとボタンを含む HTML ページを返し、POST リクエストはアカウントアドレス情報を受け取り、web3.py の getBalance 関数を使用してアカウント残高を取得します。コードは「2. ブロックの取引データをクエリ」セクションに基づいて少し修正すれば良いです。完成後、ブラウザでhttp://127.0.0.1:5000/balance を開き、アカウントアドレスを入力すると、対応するアカウントの残高をクエリできます。図を参照してください。
ブロック情報分析#
Ropsten テストネットのブロック情報を簡単に分析します。まず、Python スクリプトを作成して Ropsten テストネットの最初の 10000 ブロックをダウンロードし、pickle モジュールを使用してこれらのデータを保存します。pickle は Python オブジェクトをファイルに保存するためのモジュールで、pickle を使用すると Python オブジェクトを簡単に保存および読み取ることができます。
(1)ブロックデータをダウンロード
新しい eth_helper.py ファイルを作成し、このファイル内に download_blocks 関数を新規作成してブロックデータをループしてダウンロードします。ダウンロードが完了したら、pickle を使用してこれらのブロックデータを block.pkl という名前のファイルに保存します。コードは以下の通りです。
python eth_helper.py コマンドを実行してスクリプトを実行します。スクリプトがブロックデータをダウンロードするにはしばらく時間がかかります。ダウンロードが完了すると、ローカルに block.pkl というファイルが自動的に生成され、その中には 10000 個のブロックデータが含まれています。図を参照してください。
(2)ブロックデータを読み込む
app.py に visualization という名前の関数を新規作成し、すでにダウンロードしたブロックデータを読み込み、その中のブロック難易度を抽出してリストに格納し、HTML ページ(visualization.html)に渡して表示します。コードは以下の通りです。
ここではブロック難易度を抽出して分析処理を行います。興味のある読者は他のフィールドを抽出して分析することもできます。HTML ページで表示するために、ブロックシーケンス番号とブロック難易度をそれぞれ独立したリストに格納します。
(3)データを可視化する
最後のステップはデータを可視化して表示することです。ここでは ECharts を使用して可視化操作を行います。ECharts は、百度のフロントエンド技術部が開発した JavaScript ベースのデータ可視化チャートライブラリで、直感的で生き生きとした、インタラクティブでカスタマイズ可能なデータ可視化チャートを提供します。ECharts を使用してデータを可視化する方法も非常に簡単で、HTML ページに ECharts の js ライブラリファイルを含め、一定のサイズの div 要素を新規作成し、データを読み込むための js コードを記述するだけで、データの可視化表示が可能です。
新しい visualization.html ファイルを作成し、ここでは折れ線グラフの形式でブロック難易度データを可視化します。コードは以下の通りです。
コードが完成したら Flask アプリケーションを再起動し、http://127.0.0.1:5000/visualization にアクセスすると、可視化効果が表示されます。図を参照してください。
図から、Ropsten テストネットにおけるブロック難易度の値が直線的に上昇していることがわかります。これは、ブロックチェーンが延長されるにつれて、ブロック生成の難易度がますます高くなっていることを示しています。
以上がシンプルな Ethereum クエリ分析システムです。興味のある読者は、Ethereum の他のデータ(ブロック生成速度、1 日に生成されるブロック数、確認待ちのブロック数など)をさらに分析することができます。実際の環境で Ethereum を分析するには、上記の Ropsten テストノードアドレス(http://ropsten.infura.io/v3/×××)を正式なノードアドレスに置き換えるだけです。
ERC20 は Ethereum 上のトークンプロトコルとして簡単に理解できます。すべての Ethereum に基づいて開発されたトークンコントラクトは、このプロトコルに従います。このプロトコルに従うトークンは ERC20 トークンと呼ばれます。本ケースでは、「Mini Token」という名前の ERC20 トークンを開発します。
暗号通貨の種類は多岐にわたり、ビットコイン、リップル、小蚁コインなどの多くの古典的なコインはそれぞれ独自のチェーンを持ち、そのチェーン上で独自の暗号通貨を運営しています。これらの他に、Ethereum に依存して作成されたプラットフォーム型トークンもあります。これらは独自のチェーンを持たず、Ethereum 上で運営されています。現在、市場に出回っているほとんどの暗号通貨はプラットフォーム型トークンに属します。これらのトークンはすべて ERC20 トークンプロトコルに従い、標準化されたトークンです。これらの標準化されたトークンはさまざまな Ethereum ウォレットでサポートされます。Ethereum ウォレットでサポートされているトークンは、さまざまなプロジェクトの開発に使用でき、さまざまな取引所で取引することもできます。
ERC20 トークンと呼ばれる理由は、ERC20 が 2015 年 11 月に Ethereum コミュニティによって提案されたコードネーム 20 の標準であり、この標準に準拠するものはすべて ERC20 トークンです。ERC20 標準が登場する前は、トークンの標準が統一されておらず、トークンを発行することは非常に面倒でした。開発者にとっては、個別にスマートコントラクトを開発する必要があり、さまざまなウォレットとの互換性を確保することもできませんでした。ERC20 標準が登場した後、ERC20 標準に基づくトークンの発行は非常に簡単になり、ERC20 トークンを開発するのに基本的に 10 分もかからず、50 行のコードで実現できます。
ERC20 はさまざまなトークンの標準インターフェースであり、開発者はこれらの標準インターフェースをスマートコントラクトに統合する必要があります。これにより、次の操作を実行できるようになります。
●トークンの総供給量を取得する。
●アカウント残高を取得する。
●トークンを転送する。
●トークンの支出を承認する。
ERC20 は Ethereum ブロックチェーン上の他のスマートコントラクトや分散型アプリケーション間でシームレスな相互作用を実現しました。ERC20 標準のインターフェースファイルは以下の通りです。
その意味は以下の通りです。
●name は指定された名前で、例えば MyToken と呼ぶことができます。
●symbol はトークンのシンボルで、一般的な BTC、ETH などに似ています。
●decimal はトークンの最小取引単位で、小数点の桁数を示します。1 に設定すると、最小で 0.1 トークンを取引できます。
●totalSupply は総発行量を指します。
●balanceOf は特定のアドレス(アカウント)の残高を返します。
●transfer は一定数量(_value)のトークンをターゲットアドレス(_to)に転送します。成功したかどうかを示す戻り値を提供し、Transfer イベントをトリガーします。
●transferFrom はあるアドレス(_from)から一定数量(_value)のトークンをターゲットアドレス(_to)に転送します。成功したかどうかを示す戻り値を提供し、同様に Transfer イベントをトリガーします。
●approve は第三者(_spender)に送信者アカウントから一定量(最大で_value 数量)のトークンを移動することを承認します。第三者は通常、特定のスマートコントラクトであり、transferFrom()関数を介して具体的な移動操作を実行できます。
●allowance は_spender が_owner から引き出すことが許可されている金額を返します。
●Transfer および Approval イベントはログを記録するために使用されます。前者はトークンが転送されたときにトリガーされ、後者は approve メソッドが呼び出されたときにトリガーされます。
ERC20 トークンは DApp ではなく、スマートコントラクトの重要なアプリケーションの 1 つです。ERC20 トークンも Solidity 言語で開発され、開発環境として一般的に Remix(Remix は Ethereum スマートコントラクトを開発するためのオンライン IDE で、アドレスはhttp://remix.ethereum.org です)を選択します。
ここで「Mini Token」という名前のトークンを実装し、シンボルは「MT」、総発行量は 1000 枚とします。実装方法は ERC20 標準インターフェースの該当関数の内容を変更することです。例えば、name を「Mini Token」に、symbol を「MT」に変更します。完全なコードは以下の通りです。
上記のコードを Remix のエディタにコピー&ペーストし、コンパイルを実行し、ローカルテスト環境にデプロイすると、Mini Token が正常に発行されます。コントラクトの詳細から Mini Token の名前、シンボル、総発行量などの情報を確認できます。図を参照してください。
コントラクトの右側にあるコピーボタンをクリックして、Mini Token のアドレスをクリップボードにコピーします。次に、MetaMask のアカウントオプションを開き、「ADD TOKEN」を選択します。図 8-22 を参照してください。
Add Tokens ダイアログボックスで「Custom Token」を選択し、「Token Address」テキストボックスに先ほどコピーした Mini Token のアドレスを入力します。すると、下のシンボル欄と精度欄が自動的に補充されます。その後、「Next」ボタンをクリックして続行します。図を参照してください。
最後に、「ADD TOKENS」ボタンをクリックして Mini Token をアカウントに追加します。図 8-24 を参照してください。
完了後、アカウント画面で新しく作成したトークンを確認でき、これらのトークンを取引または送金することができます。
2017 年末、Ethereum 上で人気のあるミニゲーム「CryptoKitties」がリリースされました。これは、暗号猫の育成と繁殖ゲームで、Ether を唯一の取引通貨として利用しています。2 匹の暗号猫が交配して生まれた子孫は、親の遺伝子から新しい遺伝子を取得します。これらの遺伝子は外観、性格、特徴などを決定します。各猫はユニークであり、100% 所有者に帰属します。暗号猫はコピー、持ち去り、破壊することはできませんが、購入または販売することができます。暗号猫はコレクションとしても機能し、ブロックチェーンに安全に記録されます。暗号猫の作者 Axion Zen は、その後、開発者がこの標準に基づいてデジタル資産を発行できる ERC721 というトークン標準を定義しました。ERC20 では、すべての ERC20 に準拠するトークンは同じであり、任意の 2 つの ERC20 トークンの間には違いがありません。一方、ERC721 では、各デジタル資産には独自の識別子があり、ERC721 標準に準拠する 2 つのデジタル資産が完全に同じであることはありません。これは ERC20 とは明らかに異なります。
ERC721 の公式の簡単な説明は「Non-Fungible Tokens」であり、翻訳すると「不可互換のトークン」となります。英語の略称は「NFT」であり、簡単に理解すると、各トークンはユニークであるということです。暗号猫を例にすると、各暗号猫は独立したトークンであり、各暗号猫には独自の特徴があり、相互に置き換えることはできません。ERC721 は、このような暗号資産を実現するための標準を定義しています。
このセクションの例は、暗号猫に似たデジタル資産「暗号豚」を実現することです。このようなデジタル資産を開発するには、ERC721 標準に準拠したスマートコントラクトを実装し、そのスマートコントラクトに基づいて開発したデジタル資産を表示するユーザーインターフェースを実装する必要があります。
暗号猫のようなデジタル資産が増えるにつれて、これらの暗号資産を取引するための専用プラットフォームを作成する人々が現れました。その中で OpenSea は、世界最大の暗号資産取引プラットフォームです。開発者は、ゼロから自分で開発する必要はなく、OpenSea プラットフォーム上で手順に従って操作するだけで、迅速に ERC721 デジタル資産を開発できます。このセクションでは、まず OpenSea を紹介し、その後 OpenSea 上でデジタル資産を開発および取引する方法を説明します。このケースを通じて、ERC721 標準に準拠したデジタル資産を開発する方法と、このような資産を取引する方法を学ぶことができます。
OpenSea は、ブロックチェーンに基づく暗号資産取引プラットフォームで、ユーザーに暗号資産の購入や販売などのサービスを提供します。OpenSea のホームページは以下の通りです。
OpenSea は開発者が数分で自分の店舗を開発できるようにする開発文書を提供しています。https://docs.opensea.io/docs で確認できます。OpenSea が提供する例は、さまざまな海洋生物の暗号資産を取引するものです。
ここでは、この海洋生物の暗号資産の開発プロセスを参考にして、自分の暗号資産「暗号豚」を開発します。暗号豚は Ethereum ERC721 標準に準拠し、権限管理機能を追加します。開発手順は、暗号豚のスマートコントラクトを作成して実装し、暗号豚の表示ページとユーザーインターフェースを作成し、暗号豚の取引機能を実装することです。
この例は Truffle フレームワークに基づいて開発され、開発プロセスでは NodeJS パッケージ管理ツール npm を使用して依存ライブラリをインストールする必要があります。開発前にシステム内の npm ツールが使用可能であることを確認し、一般的なテキストエディタ(VScode、Sublime など)を選択してこの暗号豚を開発します。
ここでのスマートコントラクトの開発は OpenZeppelin ライブラリに基づいています。OpenZeppelin は Solidity 言語で実装されたオープンソースライブラリで、既知のスマートコントラクトのベストプラクティスが含まれています。OpenZeppelin は、スマートコントラクトを開発するために必要なさまざまな重要な機能を提供し、私たちがそれに基づいてより少ない時間でより安全なスマートコントラクトを作成できるようにします。ここから正式にスマートコントラクトの開発を開始します。
(1)スマートコントラクトを初期化
ここでは、ローカルの任意のディレクトリに LittlePig というフォルダを新規作成し、作成後にそのフォルダに入り、truffle init コマンドを使用して Truffle プロジェクトを初期化します。図を参照してください。
プロジェクトを初期化します。
初期化後、OpenZeppelin ライブラリをインストールします。インストールコマンドは以下の通りです。
npm install openzeppelin-solidity
インストールが完了したら、スマートコントラクトの機能を実装し始めます。
(2)LittlePig スマートコントラクトを実装
LittlePig スマートコントラクトの機能実装は比較的簡単で、openzeppelin-solidity ライブラリに基づいて二次開発を行うだけです。現在のディレクトリの contracts フォルダに LittlePig.sol というファイルを新規作成します。このファイル内に LittlePig クラスを記述し、このクラスは ERC721Token と Ownable の 2 つの基本クラスを継承します。ERC721Token は ERC721 標準の基本クラスであり、Ownable は権限管理機能を提供します。継承後、クラスの主体部分で tokenURI、baseTokenURI、isApprovedForAll などの関数を実装する必要があります。注意すべき点は 2 つあります。1 つは tokenURI 関数で、この関数は URI アドレスを返します。ここではhttps://little-pig-api.herokuapp.com/api/pig/ を指定します。この URI をリクエストすると、各 ERC721 資産の属性(名前、説明、画像など)が返され、これらの属性は OpenSea プラットフォーム上で表示されます。もう 1 つは isApprovedForAll 関数で、これは OpenSea データのホワイトリストを制御するために使用されます。具体的なコードは以下の通りです。
スマートコントラクトコードを実装した後、スマートコントラクトを公開する準備が整います。
(3)スマートコントラクトを公開
ここでは、以前に登録した Infura アカウント(パラメータ 8.1.2 節で Ethereum インターフェースに接続する際に申請したテストノード部分)を使用して Ropsten テストネットに公開します。公開方法も比較的簡単で、HDWalletProvider を使用して Ropsten テストネットに接続し、公開操作を行います。接続プロセスでは、ウォレットの助記詞(ウォレット情報を推算するための十数個の英単語)と Infura のインターフェースアドレスを設定する必要があります。truffle.js ファイルに以下のように設定します。
設定が完了したら、truffle deploy --network ropsten コマンドを使用してスマートコントラクトを Ropsten テストネットにデプロイします。デプロイが成功すると、取引ハッシュ値(transaction hash)やコントラクトアドレス(contract address)などの情報が表示されます。
4)暗号資産を生成
スマートコントラクトの公開が成功したら、自分の暗号資産を生成するためにスマートコントラクトを呼び出すことができます。生成方法は、HDWalletProvider を使用して Ropsten テストネットに接続し、スマートコントラクトをロードして mintTo 関数を呼び出して暗号デジタル資産を生成します。ここでは新しい mint.js ファイルを作成し、以下のコードを記述します。
mint.js を完成させたら、ターミナルで node mint.js を実行すると、暗号資産が生成されます。上記のコードでは、12 匹の暗号豚を生成するように設定されています。ターミナルで生成された 12 のハッシュ値、つまり 12 匹の暗号豚を確認できます。図を参照してください。
生成された暗号豚のハッシュ値
このように生成された暗号豚は自分の暗号資産に属し、取引や転送が可能です。これらの暗号豚をより直感的で魅力的に見せるために、各暗号豚に属性データを追加することができます。これにより、OpenSea 上で各暗号豚が異なる外観を表示します。
前述のスマートコントラクトでは tokenURI()メソッドが実装されており、このメソッドは各トークンに対してユニークな URI を返します。この URI をリクエストすると、そのトークンに対応する属性データが返されます。例えば、ID が 1 のトークンの URI はhttps://little-pig-api.herokuapp.com/api/creature/1 です。この URI をリクエストすると、以下のような Json データが返されます。
ここで、description フィールドは暗号豚の説明、external_url フィールドは暗号豚の外部リンク、image は暗号豚の画像アドレス、name は暗号豚の名前、attributes は暗号豚のカスタム属性リストです。
属性データを追加した後、OpenSea プラットフォームでその暗号資産の情報を確認できます。確認リンクはhttps://ropsten.opensea.io/assets/ コントラクトアドレス /tokenId です。例えば、暗号豚の token Id が 1 の場合、リンクアドレスはhttps://ropsten.opensea.io/assets/0x×××/1 です。効果は以下の通りです。
暗号豚の取引には 2 つの方法があります。1 つは定価販売(Fixed Price)、もう 1 つは一定の価格範囲内でのオークション(Auction)です。
以上が暗号豚の取引機能です。#
完