メインコンテンツへスキップ

初心者向けHello Worldスマート・コントラクト

Solidity
Hardhat
Alchemy
スマート・コントラクト
デプロイ
初級
elanh
2021年3月31日
20 分で読めます

ブロックチェーン開発が初めてでどこから始めればよいかわからない場合や、スマート・コントラクトのデプロイ方法と対話方法を理解したいだけの場合、このガイドはあなたのためのものです。仮想ウォレットのメタマスク (opens in a new tab)Solidity (opens in a new tab)Hardhat (opens in a new tab)、およびAlchemy (opens in a new tab)を使用して、Sepoliaテストネットワーク上にシンプルなスマート・コントラクトを作成し、デプロイする手順を説明します(これらの意味がまだわからなくても心配しないでください。後で説明します)。

このチュートリアルのパート2では、デプロイされたスマート・コントラクトと対話する方法について説明し、パート3では、Etherscanで公開する方法について説明します。

途中で質問がある場合は、Alchemyのディスコード (opens in a new tab)でお気軽にお問い合わせください!

ステップ1: イーサリアムネットワークに接続する

イーサリアムチェーンにリクエストを送信する方法はたくさんあります。ここでは簡単にするために、独自のノードを実行せずにイーサリアムチェーンと通信できるブロックチェーン開発者プラットフォームおよびAPIであるAlchemyの無料アカウントを使用します。このプラットフォームには、監視と分析のための開発者ツールも用意されており、このチュートリアルではこれらを活用して、スマート・コントラクトのデプロイの内部で何が起こっているかを理解します。まだAlchemyアカウントをお持ちでない場合は、こちらから無料でサインアップできます (opens in a new tab)

ステップ2: アプリ(およびAPIキー)を作成する

Alchemyアカウントを作成したら、アプリを作成してAPIキーを生成できます。これにより、Sepoliaテストネットワークにリクエストを送信できるようになります。テストネットに馴染みがない場合は、こちらのページを確認してください。

  1. ナビゲーションバーの「Select an app」を選択し、「Create new app」をクリックして、Alchemyダッシュボードの「Create new app」ページに移動します。

Hello world create app

  1. アプリに「Hello World」という名前を付け、簡単な説明を入力し、「Infra & Tooling」などのユースケースを選択します。次に、「Ethereum」を検索してネットワークを選択します。

create app view hello world

  1. 「Next」をクリックして進み、「Create app」をクリックすれば完了です!ナビゲーションバーのドロップダウンメニューにアプリが表示され、APIキーをコピーできるようになります。

ステップ3: イーサリアムアカウント(アドレス)を作成する

トランザクションを送受信するには、イーサリアムアカウントが必要です。このチュートリアルでは、イーサリアムアカウントのアドレスを管理するためにブラウザで使用する仮想ウォレットであるメタマスクを使用します。トランザクションの詳細はこちら。

こちら (opens in a new tab)からメタマスクをダウンロードし、無料でイーサリアムアカウントを作成できます。アカウントを作成する際、またはすでにアカウントをお持ちの場合は、ネットワークのドロップダウンメニューを使用して「Sepolia」テストネットワークに切り替えてください(実際の資金を扱わないようにするためです)。

Sepoliaが表示されない場合は、メニューから「Advanced」に進み、下にスクロールして「Show test networks」をオンに切り替えます。ネットワーク選択メニューで「Custom」タブを選択してテストネットのリストを見つけ、「Sepolia」を選択します。

metamask sepolia example

ステップ4: フォーセットからイーサを追加する

スマート・コントラクトをテストネットワークにデプロイするには、テスト用のETHが必要です。Sepolia ETHを取得するには、Sepoliaネットワークの詳細にアクセスして、さまざまなフォーセットのリストを表示します。枯渇していることもあるため、1つが機能しない場合は別のものを試してください。ネットワークのトラフィックによっては、テスト用のETHを受け取るまでに時間がかかる場合があります。しばらくすると、メタマスクのアカウントにETHが表示されるはずです!

ステップ5: 残高を確認する

残高があることを再確認するために、Alchemyのコンポーザーツール (opens in a new tab)を使用してeth_getBalanceリクエストを送信してみましょう。これにより、ウォレット内のETHの量が返されます。メタマスクのアカウントアドレスを入力して「Send Request」をクリックすると、次のようなレスポンスが表示されるはずです。

{ "jsonrpc": "2.0", "id": 0, "result": "0x2B5E3AF16B1880000" }

注: この結果はETHではなくWeiで表示されています。Weiはイーサの最小単位として使用されます。WeiからETHへの変換は、1 ETH = 1018 Weiです。したがって、0x2B5E3AF16B1880000を10進数に変換すると5*10¹⁸となり、5 ETHに等しくなります。

ふぅ!テスト用の資金はすべて揃っています

ステップ6: プロジェクトを初期化する

まず、プロジェクト用のフォルダを作成する必要があります。コマンドラインに移動して次のように入力します。

mkdir hello-world
cd hello-world

プロジェクトフォルダ内に移動したので、npm initを使用してプロジェクトを初期化します。npmをまだインストールしていない場合は、Node.jsのインストール手順 (opens in a new tab)に従ってください(このチュートリアルではNode.jsとnpmが必要です)。

npm init

インストールの質問にどのように答えても問題ありませんが、参考までに私たちの回答を以下に示します。

package.jsonを承認すれば、準備完了です!

ステップ7: Hardhat (opens in a new tab)をダウンロードする

Hardhatは、イーサリアムソフトウェアをコンパイル、デプロイ、テスト、およびデバッグするための開発環境です。ライブチェーンにデプロイする前に、ローカルでスマート・コントラクトや分散型アプリケーション (dapp) を構築する際に開発者を支援します。

hello-worldプロジェクト内で以下を実行します。

npm install --save-dev hardhat

インストール手順 (opens in a new tab)の詳細については、こちらのページを確認してください。

ステップ8: Hardhatプロジェクトを作成する

プロジェクトフォルダ内で以下を実行します。

npx hardhat

すると、ウェルカムメッセージと実行したい操作を選択するオプションが表示されます。「create an empty hardhat.config.js」を選択します。

これにより、hardhat.config.jsファイルが生成されます。ここでプロジェクトのすべての設定を指定します(ステップ13)。

ステップ9: プロジェクトフォルダを追加する

プロジェクトを整理するために、2つの新しいフォルダを作成します。コマンドラインでプロジェクトのルートディレクトリに移動し、次のように入力します。

mkdir contracts
mkdir scripts
  • contracts/は、Hello Worldスマート・コントラクトのコードファイルを保存する場所です。
  • scripts/は、コントラクトをデプロイし、対話するためのスクリプトを保存する場所です。

ステップ10: コントラクトを記述する

いったいいつになったらコードを書くのかと疑問に思っているかもしれませんね。お待たせしました、ステップ10です。

お気に入りのエディタ(私たちはVSCode (opens in a new tab)が好きです)でhello-worldプロジェクトを開きます。スマート・コントラクトはSolidityと呼ばれる言語で記述されており、これを使用してHelloWorld.solスマート・コントラクトを記述します。‌

  1. 「contracts」フォルダに移動し、HelloWorld.solという新しいファイルを作成します。
  2. 以下は、このチュートリアルで使用するイーサリアム財団のサンプルHello Worldスマート・コントラクトです。以下の内容をコピーしてHelloWorld.solファイルに貼り付け、コメントを読んでこのコントラクトが何を行うかを理解してください。

これは、作成時にメッセージを保存し、update関数を呼び出すことで更新できる、非常にシンプルなスマート・コントラクトです。

ステップ11: メタマスクとAlchemyをプロジェクトに接続する

メタマスクウォレット、Alchemyアカウントを作成し、スマート・コントラクトを記述しました。次はこれら3つを接続します。

仮想ウォレットから送信されるすべてのトランザクションには、固有の秘密鍵を使用した署名が必要です。プログラムにこの権限を提供するために、秘密鍵(およびAlchemy APIキー)を環境ファイルに安全に保存できます。

トランザクションの送信について詳しくは、Web3を使用したトランザクションの送信に関するこちらのチュートリアルを確認してください。

まず、プロジェクトディレクトリにdotenvパッケージをインストールします。

npm install dotenv --save

次に、プロジェクトのルートディレクトリに.envファイルを作成し、メタマスクの秘密鍵とHTTP Alchemy API URLを追加します。

get alchemy api key

Alchemy API URLをコピーする

.envは次のようになります。

API_URL = "https://eth-sepolia.g.alchemy.com/v2/your-api-key"
PRIVATE_KEY = "your-metamask-private-key"

これらを実際にコードに接続するために、ステップ13でhardhat.config.jsファイル内のこれらの変数を参照します。

.envをコミットしないでください!.envファイルを誰かと共有したり公開したりすると、シークレットが漏洩することになるため、絶対にしないでください。バージョン管理を使用している場合は、.envgitignoreファイルに追加してください。

ステップ12: Ethers.jsをインストールする

Ethers.jsは、標準のJSON-RPCメソッドをよりユーザーフレンドリーなメソッドでラップすることで、イーサリアムとの対話やリクエストの送信を容易にするライブラリです。

Hardhatを使用すると、追加のツールや拡張機能のためのプラグイン (opens in a new tab)を非常に簡単に統合できます。コントラクトのデプロイにはEthersプラグイン (opens in a new tab)を活用します(Ethers.js (opens in a new tab)には非常に洗練されたコントラクトデプロイメソッドがいくつかあります)。

プロジェクトディレクトリで次のように入力します。

npm install --save-dev @nomiclabs/hardhat-ethers "ethers@^5.0.0"

次のステップで、hardhat.config.jsにethersをリクワイアします。

ステップ13: hardhat.config.jsを更新する

これまでにいくつかの依存関係とプラグインを追加しました。次に、プロジェクトがそれらすべてを認識できるようにhardhat.config.jsを更新する必要があります。

hardhat.config.jsを次のように更新します。

ステップ14: コントラクトをコンパイルする

ここまでがすべて機能していることを確認するために、コントラクトをコンパイルしてみましょう。compileタスクは、組み込みのHardhatタスクの1つです。

コマンドラインから以下を実行します。

npx hardhat compile

SPDX license identifier not provided in source fileに関する警告が表示されるかもしれませんが、心配する必要はありません。他はすべて問題ないはずです!もし問題がある場合は、いつでもAlchemyのディスコード (opens in a new tab)でメッセージを送ってください。

ステップ15: デプロイスクリプトを記述する

コントラクトの記述が完了し、設定ファイルの準備も整ったので、次はコントラクトのデプロイスクリプトを記述します。

scripts/フォルダに移動し、deploy.jsという新しいファイルを作成して、次の内容を追加します。

Hardhatは、コントラクトチュートリアル (opens in a new tab)でこれらのコードの各行が何を行うかを見事に説明しており、ここではその説明を採用しています。

const HelloWorld = await ethers.getContractFactory("HelloWorld");

Ethers.jsのContractFactoryは、新しいスマート・コントラクトをデプロイするために使用される抽象化であるため、ここでのHelloWorldはHello Worldコントラクトのインスタンスのファクトリです。hardhat-ethersプラグインを使用する場合、ContractFactoryおよびContractインスタンスはデフォルトで最初の署名者に接続されます。

const hello_world = await HelloWorld.deploy();

ContractFactorydeploy()を呼び出すとデプロイが開始され、Contractに解決されるPromiseが返されます。これは、スマート・コントラクトの各関数のメソッドを持つオブジェクトです。

ステップ16: コントラクトをデプロイする

ついにスマート・コントラクトをデプロイする準備が整いました!コマンドラインに移動して以下を実行します。

npx hardhat run scripts/deploy.js --network sepolia

すると、次のような出力が表示されるはずです。

Contract deployed to address: 0x6cd7d44516a20882cEa2DE9f205bF401c0d23570

SepoliaのEtherscan (opens in a new tab)にアクセスしてコントラクトアドレスを検索すると、正常にデプロイされたことが確認できるはずです。トランザクションは次のようになります。

etherscan contract

Fromアドレスはメタマスクのアカウントアドレスと一致し、Toアドレスには「Contract Creation」と表示されますが、トランザクションをクリックすると、Toフィールドにコントラクトアドレスが表示されます。

etherscan transaction

おめでとうございます!イーサリアムチェーンにスマート・コントラクトをデプロイしました 🎉

内部で何が起こっているかを理解するために、Alchemyダッシュボード (opens in a new tab)のExplorerタブに移動しましょう。複数のAlchemyアプリがある場合は、アプリでフィルタリングして「Hello World」を選択してください。 hello world explorer

ここでは、.deploy()関数を呼び出したときに、Hardhat/Ethersが内部で行ったいくつかのJSON-RPC呼び出しを確認できます。ここで注目すべき重要な2つは、Sepoliaチェーンにコントラクトを実際に書き込むためのリクエストであるeth_sendRawTransaction (opens in a new tab)と、ハッシュを指定してトランザクションに関する情報を読み取るためのリクエストであるeth_getTransactionByHash (opens in a new tab)です(トランザクションを送信する際の典型的なパターンです)。トランザクションの送信について詳しくは、Web3を使用したトランザクションの送信に関するこちらのチュートリアルを確認してください。

このチュートリアルのパート1は以上です。パート2では、初期メッセージを更新することで実際にスマート・コントラクトと対話し、パート3では、誰もが対話方法を知ることができるようにスマート・コントラクトをEtherscanで公開します。

Alchemyについてもっと知りたいですか?私たちのウェブサイト (opens in a new tab)をチェックしてください。最新情報を見逃したくないですか?こちら (opens in a new tab)からニュースレターを購読してください!ディスコード (opens in a new tab)への参加もお忘れなく。