ブロックチェーンの開発プロセスにおいて、自分自身のブロックチェーンを開発することや、特定のパブリックチェーンやフレームワークに基づいて開発することに加えて、デジタル暗号資産を迅速に生成し取引するためのツールを提供するサードパーティプラットフォームもいくつかあります。例えば、海外の Opensea(ウェブサイト:http://opensea.io)や RareBits(ウェブサイト:https://rarebits.io/)、国内の BIGE(ウェブサイト:http://bige.game/)などです。
3 つの開発事例には、1 つのイーサリアムクエリ分析システムの開発事例、1 つの ERC20 トークンの開発事例、そして OpenSea プラットフォームに基づくデジタル暗号資産の開発事例が含まれます。
●イーサリアムテストネット Ropsten を理解する。
●web3.py ライブラリの機能を習得する。
●イーサリアムデータの基本的なクエリと分析方法を習得する。
●ERC20 トークンの開発を理解する。
●暗号資産の開発プロセスを学ぶ。
●OpenSea 取引プラットフォームを理解する。
イーサリアムの DApp 開発実戦では、イーサリアムのローカルテスト環境を構築しましたが、ローカルテスト環境のデータは少なく、実際のイーサリアムネットワークのデータ状況を反映できません。そのため、イーサリアムの公開テストネット Ropsten をテスト環境として選択します。
Ropsten は 2016 年 11 月に立ち上げられたイーサリアムテストネットで、ストックホルム(スウェーデンの首都)のある地下鉄駅にちなんで名付けられました。Ropsten はプルーフ・オブ・ワークのコンセンサスメカニズムを採用しており、イーサリアムの既存の生産環境を最もよく模擬したもので、イーサリアムメインネットのシステムやネットワークの状態などにおいてもかなり類似しています。また、Ropsten テストネット上のイーサは無料であり、Ropsten テストネットに接続することでイーサリアムに対するさまざまなテストや開発のコストが非常に低いため、Ropsten テストネットはコストパフォーマンスが非常に理想的です。以下では、第 5 章で紹介した MetaMask プラグインを使用して Ropsten テストネットに接続します。
(1)Ropsten テストネットに接続
MetaMask プラグインをクリックしてオプションインターフェースを開き、ネットワークオプションをクリックして接続ネットワークを Ropsten テストネットに変更します。図 8-1 を参照してください。
(2)テストアカウントを作成
ネットワークの切り替えが成功したら、ユーザーアイコンをクリックして、Ropsten テストネットで新しいアカウントを生成するためにユーザーを作成します。
ポップアップインターフェースにユーザー名を入力し、「CREATE」ボタンをクリックして作成します。図 8-3 を参照してください。
(3)アカウント残高を確認
作成が完了したら、アカウント詳細ページに移動します。新しいアカウントの残高は 0 イーサです。図 8-4 を参照してください。
(4)イーサを取得
テストを行うためには、Ropsten テストネットで一定量のイーサを取得することが望ましいです(イーサリアムネットワークでの更新操作にはイーサが消費されます)。Ropsten テストネットでイーサを取得する方法は主に以下の通りです。
●友人に送金してもらう。
●自分でマイニングする。
疑いなく、最初の方法が最も便利で迅速です。以下で申請操作を行います。
2. イーサを申請
イーサを申請するには、アカウントアドレスを入力する必要があります。
(1)アカウントアドレスをコピー
アカウントの左上隅のメニューをクリックするとアカウント詳細が表示され、アドレスの右側にコピーボタンがあります。クリックしてアドレス情報をコピーします。
(2)Ropsten で申請
アカウントアドレスを得たら、ブラウザでhttp://faucet.ropsten.be:3001 / にアクセスし、開いたページに先ほどコピーしたアカウントアドレスを入力します。図を参照してください。
(3)申請成功
「Send me test Ether」ボタンをクリックしてテストイーサを申請します。申請が成功すると、ページの下部に申請成功のメッセージと送金取引記録のハッシュ値が表示されます。図を参照してください。
注意:申請したイーサは Ropsten ネットワークの他のノードによって確認される必要があるため、申請成功後、一般的には MetaMask で申請したイーサの情報を見るまでに約半日ほどかかります。
すでに MetaMask プラグインを使用して Ropsten テストネットのテストアカウントを作成しました。このテストネットのインターフェースに接続してデータをクエリし取得するために、ここでは web3.py ライブラリを使用して Ropsten テストネットに接続します。
1. web3.py の紹介
web3.py はイーサリアムインターフェースの Python ラッパーで、JSON-RPC を通じてイーサリアムネットワークとインタラクションします。web3.py は web3.js に似ており、web3.js は主にブラウザ側の Dapp 開発に適しているのに対し、web3.py は Python に基づいて開発されており、サーバーでの使用により適しています。
2. 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 はデータフィルタリングインターフェース、サービスプロバイダー、イーサリアムネーミングサービス、ネットワーク情報、アカウント情報、ブロック情報などの主要な機能インターフェースを提供しています。詳細は web3.py の公式ウェブサイトhttps://web3py.readthedocs.io/en/stable/index.html を訪れて確認できます。
(3)テストノードを申請
web3.py をインストールした後、Ropsten テストネットに接続するためのテストノードを申請する必要があります。ここでは Infura を使用します。Infura はイーサリアムノードサービスプロバイダーで、公開の Ethereum メインネットとテストネットノードを提供しており、開発者は Infura の公式ウェブサイトで申請できます。ブラウザでhttps://infura.io/ を開くと Infura のページが表示されます。図を参照してください。
ページ上の「GET STARTED FOR FREE」ボタンをクリックして無料申請を開始します。無料申請には名前、メールアドレス、パスワードなどの基本情報を入力する必要があります。情報を入力したら、「SIGN UP」ボタンをクリックして登録します。登録後、確認メールが入力したメールアドレスに送信されたことが通知されます。受信していない場合は、「RE-SEND VERIFICATION EMAIL」ボタンをクリックして確認メールを再送信できます。
メール内の確認リンクをクリックすると、自動的に登録アカウントにログインします。順調にログインすると、新しいプロジェクトを追加するように促されます。プロジェクト名は任意で、ここでは「自学区块链」と名付け、プロジェクトを作成するために「CREATE PROJECT」ボタンをクリックします。図を参照してください。
プロジェクトが作成されると、プロジェクト詳細ページに移動します。詳細ページには、イーサリアムネットワークに接続するための API KEY、API SECRET、接続可能なノードアドレス ENDPOINT、そしてこのノード上のスマートコントラクトのホワイトリストが表示されます。ここでは Ropsten テストネットのノードを選択します。図 8-13 を参照してください。
3. web3.py を使用してネットワークに接続
上記で得た Ropsten テストネットの接続ノードを使用して web3.py で接続できます。まず、web3.py から Web3 と HTTPProvider をインポートし、次にプロジェクト内の Ropsten テストノードに接続します。接続後、isConnected メソッドを使用して接続状態を確認し、True が返されれば接続成功です。図 8-14 を参照してください。
接続が成功したら、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)などが含まれています。
2. ブロックの取引データをクエリ
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 テストネットにおけるブロックの難易度の値は直線的に上昇しており、ブロックチェーンが延長されるにつれて、ブロック生成の難易度がますます高くなっていることを示しています。
以上が簡単なイーサリアムクエリ分析システムです。興味のある読者は、イーサリアムの他のデータ、例えばブロック生成速度、1 日に生成されるブロックの数、確認待ちのブロック数などをさらに分析することができます。実際の環境でイーサリアムを分析するには、上記の Ropsten テストノードアドレス(http://ropsten.infura.io/v3/×××)を正式なノードアドレスに置き換えればよいだけです。
ERC20 は、イーサリアム上のトークンプロトコルとして簡単に理解できます。イーサリアムに基づいて開発されたすべてのトークンコントラクトは、このプロトコルに従います。このプロトコルに従うトークンは ERC20 トークンと呼ばれます。本ケースでは、「Mini Token」という名前の ERC20 トークンを開発します。
暗号通貨の種類は多岐にわたり、ビットコイン、リップル、小蚁コインなどの多くの古参コインは、それぞれ独自のチェーンを持ち、そのチェーン上で独自の暗号通貨を運営しています。これらに加えて、プラットフォーム型トークンもあり、これらはイーサリアムに依存して作成されており、独自のチェーンを持たず、イーサリアム上で運営されています。現在、市場に出回っているほとんどの暗号通貨はプラットフォーム型トークンに該当します。これらのトークンはすべて ERC20 トークンプロトコルに従い、標準化されたトークンであり、さまざまなイーサリアムウォレットでサポートされています。イーサリアムウォレットでサポートされているトークンは、さまざまなプロジェクトの開発に使用でき、さまざまな取引所に提出して取引することもできます。
ERC20 トークンと呼ばれる理由は、ERC20 が 2015 年 11 月にイーサリアムコミュニティによって提案されたコード名 20 の標準であり、この標準に適合するものはすべて ERC20 トークンです。ERC20 標準が登場する前は、トークンの標準が統一されておらず、トークンを発行することは非常に面倒な作業でした。開発者にとっては、個別にスマートコントラクトを開発する必要があり、さまざまなウォレットとの互換性を確保することもできませんでした。ERC20 標準が登場した後、ERC20 標準に基づくトークンを発行することが非常に簡単になり、ERC20 トークンを開発するのにかかる時間は基本的に 10 分を超えず、50 行のコードで実現できます。
ERC20 はさまざまなトークンの標準インターフェースであり、開発者はこれらの標準インターフェースをスマートコントラクトに統合する必要があります。これにより、以下の操作を実行できるようになります。
●トークンの総供給量を取得する。
●アカウント残高を取得する。
●トークンを転送する。
●トークンの消費を承認する。
ERC20 は、イーサリアムブロックチェーン上の他のスマートコントラクトや分散型アプリケーション間でシームレスな相互作用を実現しました。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 はオンラインでイーサリアムスマートコントラクトを開発するための 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 年末、イーサリアム上で大ヒットしたミニゲーム「CryptoKitties」がリリースされました。これは、暗号猫の育成と繁殖ゲームであり、イーサを唯一の取引通貨として利用しています。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 が提供する例は、さまざまな海洋生物の暗号資産を取引することです。
ここでは、この海洋生物の暗号資産の開発プロセスを参考にして、自分の暗号資産「暗号豚」を開発します。暗号豚はイーサリアム 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 節でイーサリアムインターフェースに接続するためにテストノードを申請した部分)を使用して、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)です。
以上が暗号豚の取引機能です。#
完