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

Web3を使用してトランザクションを送信する

トランザクションweb3.jsAlchemy
初級
Elan Halpern
Alchemy ドキュメント(opens in a new tab)
2020年11月4日
17 分の読書 minute read

このガイドでは、初心者向けに、Web3を使ってイーサリアムのトランザクションを送信する方法を学びます。 イーサリアムのブロックチェーンでは、作成、署名、およびブロードキャストという主に3つのステップを通じてトランザクションを送信します。 これら3つのステップを説明することで、皆さんの疑問が氷解することを願っています! 以下のチュートリアルでは、 Alchemy(opens in a new tab)を使って、イーサリアムチェーンにトランザクションを送信します。 こちらで、Alchemyの無料アカウントを作成してください(opens in a new tab)

注意: このガイドでは、アプリの バックエンド におけるトランザクションの署名について扱っています。 フロントエンドでトランザクションの署名を統合したい場合は、 Web3とブラウザプロバイダ(opens in a new tab)の連携を確認してください。

基本事項

ブロックチェーンの開発を始めたばかりの皆さんは、トランザクションの送信(ごくシンプルな操作であるはずです)についてリサーチをした結果、ありとあらゆるガイドに遭遇し、それぞれが違うことを述べているために、圧倒され、混乱してしまったかもしれません。 今のあなたがそうだとしても、心配は要りません。誰しもその経験があるのです! それではまず、いくつかの基本的な事項を確認しておきましょう:

1. Alchemyは、あなたの秘密鍵を保存しません

  • 言い換えれば、Alchemyはあなたの代理として署名やトランザクションの送信を実行できません。 これは、セキュリティ保護のための仕様です。 Alchemyがあなたの秘密鍵を入力するように要求することはありませんので、ホスティングされたノード(あるいは、あらゆる他人)に対して、あなたの秘密鍵を教えないでください。
  • AlchemyのコアAPIを使ってブロックチェーンから読み込むことは可能ですが、ブロックチェーンに書き出すためには、Alchemyを通じてトランザクションを送信する事前に、他のユーザーがあなたのトランザクションに署名する必要があります(これは、その他すべてのノード向けサービスの場合も同様です)。

2. 「署名者」とは何か

  • 署名者とは、あなたの秘密鍵を用いて、あなたのためにトランザクションに署名するユーザーです。 このチュートリアルでは、トランザクションの署名に Alchemy web3(opens in a new tab)を使用しますが、他のweb3ライブラリも使用できます。
  • フロントエンドにおける署名者の例としては、MetaMask(opens in a new tab)が挙げられます。MetaMaskは、あなたの代理としてトランザクションに署名して送信します。

3. 私のトランザクションに署名が必要なのはなぜですか?

  • イーサリアムのネットワーク上でトランザクションを送信したいユーザーは、トランザクションの送信元が本人であることを証明するために、常に(秘密鍵を用いて)トランザクションに署名する必要があります。
  • この秘密鍵は、あなたのイーサリアムアカウントに対する完全な管理権限を与え、あなた(あるいはアクセス権限を持つすべてのユーザー)に対して、あなたの代理としてトランザクションを実行することを許可するものですから、厳重に保護することが非常に重要です。

4. 秘密鍵を保護するには、どうすればよいですか?

  • 秘密鍵の保護や、トランザクションの送信のために秘密鍵を使用するには、多くの方法があります。 このチュートリアルでは、 .env ファイルを使用します。 この他にも、秘密鍵を保存するために別のプロバイダーを利用したり、キーストア・ファイルを活用するなど、様々なオプションがあります。

5. eth_sendTransactioneth_sendRawTransactionの違いは何ですか?

eth_sendTransactioneth_sendRawTransactionはどちらも、トランザクションをイーサリアムのネットワークにブロードキャストし、将来のブロックに追加するためのイーサリアムAPIの関数です。 ただし、トランザクションの署名については、以下のような違いがあります:

  • eth_sendTransaction(opens in a new tab)は、 未署名のトランザクションを送信するために使用します。 つまり、送信先のノードがあなたの秘密鍵を管理し、チェーンに対してブロードキャストする前にトランザクションに署名する必要があります。 Alchemyはユーザーの秘密鍵を保持しないため、このメソッドはサポートしていません。
  • eth_sendRawTransaction(opens in a new tab)はすでに署名済みのトランザクションをブロードキャストするために使用されます。 これは最初に signTransaction(tx, private_key)(opens in a new tab)を使用し、 eth_sendRawTransaction に結果を渡すことを意味します。

Web3を使用する場合、 eth_sendRawTransactionweb3.eth.sendSignedTransaction(opens in a new tab)の関数を呼び出すことでアクセスできます。

このチュートリアルでは、これを使用します。

6. Web3 ライブラリとは?

  • Web3.jsは、イーサリアム開発で非常に一般的に使用される、標準的なJSON-RPC呼び出しのラッパーライブラリです。
  • さまざまな言語に対応した数多くのweb3ライブラリが提供されています。 このチュートリアルでは、JavaScriptで書かれたAlchemy Web3(opens in a new tab)を使用します。 ethers.js(opens in a new tab)など、他の選択肢についてはこちら(opens in a new tab)を参照してください。

さて、これらの疑問が解消できたところで、さっそくチュートリアルを始めましょう。 疑問があれば、Alchemy discord(opens in a new tab)で気軽に質問してください。

7. 安全でガス最適化されたプライベートなトランザクションを送信する方法は? {how-to-send-secure-gas-optimized-and-private-transactions}

注意:このチュートリアルには、Alchemyアカウント、イーサリアムアドレスまたはMetaMaskウォレット、NodeJs、およびnpmのインストールが必要です。 インストールが完了していない場合は、以下の手順で行ってください:

  1. 無料のAlchemyアカウントを作成する(opens in a new tab)
  2. MetaMaskアカウントを作成する(opens in a new tab)(またはイーサリアムアドレスを取得する)
  3. 次の手順に従って、Node.jsとnpmをインストールする(opens in a new tab)

トランザクションを送信する手順

1. SepoliaテストネットでAlchemyアプリを作成する

Alchemyダッシュボード(opens in a new tab)に移動し、新規のアプリを作成し、ネットワークにはSepolia(または他のテストネット)を選択します。

2. Sepoliaフォーセットに対し、ETHをリクエストする

Alchemy Sepoliaフォーセット(opens in a new tab)の指示に従って、ETHを受け取ってください。 リクエストには、他のネットワークのアドレスではなく、必ず Sepoliaのイーサリアムアドレス(MetaMaskから)を含めてください。 指示を実行した後、ウォレットにETHが届いていることを再確認してください。

3. 新規のプロジェクトディレクトリを作成し、cdでディレクトリに移動します。

コマンドライン(Macの場合はターミナル)で新規のプロジェクトディレクトリを作成し、このディレクトリに移動します:

1mkdir sendtx-example
2cd sendtx-example

4. Alchemy Web3(または任意のweb3ライブラリ)をインストールする

プロジェクトディレクトリで次のコマンドを実行し、 Alchemy Web3(opens in a new tab)をインストールします。

注意: ethers.jsライブラリを使う場合は、こちら(opens in a new tab)の手順をご覧ください。

1npm install @alch/alchemy-web3

5. dotenvをインストールする

APIキーと秘密鍵を安全に保存するために、.envファイルを使用します。

1npm install dotenv --save

6. .envファイルを作成する

プロジェクトディレクトリに.envファイルを作成し、以下を追加します("your-api-url" と "your-private-key"を置き換える)。

  • AlchemyのAPI URLを見つけるには、ダッシュボードで作成したアプリの詳細ページに移動します。 右上隅の「VIEW KEY」をクリックし、HTTP URLを選択します。
  • MetaMaskを使って秘密鍵を見つけるには、こちらのガイド(opens in a new tab)をご覧ください。
1API_URL = "your-api-url"
2PRIVATE_KEY = "your-private-key"
.envはコミットしないでください! .envは決して他人と共有したり、公開したりしないように注意してください。共有することで、あなたのアカウント情報が漏洩する可能性があります。 バージョンを管理する場合は、.envgitignore(opens in a new tab)ファイルに追加してください。

7. sendTx.jsファイルを作成する

機密データが .envファイルで保護されたので、さっそくコード作成を始めましょう。 送信トランザクションの例として、ETHをSepoliaフォーセットに送り返します。

トランザクションの設定と送信を行うsendTx.jsファイルを作成し、その中に以下のコードを追加してください。

1async function main() {
2 require('dotenv').config();
3 const { API_URL, PRIVATE_KEY } = process.env;
4 const { createAlchemyWeb3 } = require("@alch/alchemy-web3");
5 const web3 = createAlchemyWeb3(API_URL);
6 const myAddress = '0x610Ae88399fc1687FA7530Aac28eC2539c7d6d63' //TODO: replace this address with your own public address
7
8 const nonce = await web3.eth.getTransactionCount(myAddress, 'latest'); // nonce starts counting from 0
9
10 const transaction = {
11 'to': '0x31B98D14007bDEe637298086988A0bBd31184523', // faucet address to return eth
12 'value': 1000000000000000000, // 1 ETH
13 'gas': 30000,
14 'nonce': nonce,
15 // optional data field to send message or execute smart contract
16 };
17
18 const signedTx = await web3.eth.accounts.signTransaction(transaction, PRIVATE_KEY);
19
20 web3.eth.sendSignedTransaction(signedTx.rawTransaction, function(error, hash) {
21 if (!error) {
22 console.log("🎉 The hash of your transaction is: ", hash, "\n Check Alchemy's Mempool to view the status of your transaction!");
23 } else {
24 console.log("❗Something went wrong while submitting your transaction:", error)
25 }
26 });
27}
28
29main();
すべて表示

6行目のアドレスは、あなたの公開アドレスに置き換えてください。

さて、このコードを実行する前に、ここでいくつかのコンポーネントについて説明しましょう。

  • nonce : ノンス仕様は、あなたのアドレスから送信されたトランザクション数を追跡するために使用されます。 これは、セキュリティ保護ならびにリプレイ攻撃(opens in a new tab)の防止に必要です。 あなたのアドレスから送信されたトランザクションの数を取得するには、 getTransactionCount(opens in a new tab)を使用します。
  • transaction: トランザクションオブジェクトには指定する必要があるいくつかの側面があります
    • to: ETHの送信先アドレスです。 この場合、最初にリクエストしたSepoliaフォーセット(opens in a new tab)にETHを送り返します。
    • value: Wei(10^18 Wei = 1 ETH)で指定した送金額です。
    • gas: トランザクションに含まれる適切なガス量を決定する方法はたくさんあります。 Alchemyには ガス価格ウェブフック(opens in a new tab) が含まれているので、ガス価格が一定のしきい値に達すると、警告が送信されます。 メインネット上のトランザクションの場合、ETHガスステーション(opens in a new tab)などのガス推定値をチェックして、トランザクションに含める適切なガス量を決定することをお勧めします。 イーサリアムの操作に必要なガスの最小量は21000なので、トランザクションが確実に実行されるように、ここでは30000としておきます。
    • nonce: 上記のノンスの定義を参照してください。 ノンスは、0から開始されます。
    • [OPTIONAL] data: 送金やスマートコントラクトの呼び出しにおいて追加情報を送信するために使用します。残高を送信する場合は必要ありません。以下の注記を確認してください。
  • signedTx: トランザクションオブジェクトへの署名には、 PRIVATE_KEYを伴うsignTransactionメソッドを使用します。
  • sendSignedTransaction: トランザクションの署名を取得したら、sendSignedTransactionを使って、次のブロックに含まれるように送信できるようになります。

dataに関するメモ: イーサリアムで送信できるトランザクションは主に2種類あります。

  • 残高転送:あるアドレスから別のアドレスにETHを送信します。 dataフィールドは必要ありませんが、トランザクションと一緒に追加の情報を送信したい場合はこのフィールドにHEX形式で入力してください。
    • 例えば、 不変のタイムスタンプを与えるために、IPFS文書のハッシュをイーサリアムチェーンに記録したい場合を考えてみましょう。 dataフィールドは、data: web3.utils.toHex(‘IPFSハッシュ‘) のようになります。 これにより、誰でもチェーンをクエリして、このドキュメントがいつ追加されたかを確認できるようになります。
  • スマートコントラクトのトランザクション:チェーン上でスマートコントラクトコードを実行します。 この場合、dataフィールドは、パラメータとと共に実行したいスマート関数を含む必要があります。

8. node sendTx.jsを使用してコードを実行する

ターミナルまたはコマンドラインに戻り、以下を実行します。

1node sendTx.js

9. 取引プールでトランザクションを確認する

Alchemyダッシュボードの取引プールのページ(opens in a new tab) を開き、作成したアプリで絞り込み、取引を検索します。 ここでは、トランザクション処理が保留中の状態からマイニングされた状態(成功した場合)あるいはドロップした状態(失敗した場合)に遷移するのを確認できます。 「All」の設定を変更せず、「マイニング済み」、「保留中」、および「ドロップ」のトランザクションをすべて捕捉できるようにしておきます。 また、アドレス 0x31b98d14007bdee637298086988a0bbd31184523に送信されたトランザクションを確認する方法でもあなたのトランザクションを検索できます。

あなたのトランザクションを見つけたら、当該のtxハッシュを選択してトランザクションの詳細を確認します。以下のようなビューが表示されるはずです:

Mempool watcherのスクリーンショット

赤い丸印で囲まれたアイコンをクリックすると、Etherscan上でトランザクションを確認できます!

やりましたね! Alchemyを使用して、最初のイーサリアムトランザクションの送信に成功しました🎉

このガイドに対するフィードバックや提案については、AlchemyのDiscord(opens in a new tab)からElanにメッセージを送ってください!

原文は、 https://docs.alchemyapi.io/tutorials/sending-transactions-using-web3-and-alchemy(opens in a new tab)で公開されています。

最終編集者: @shinya_blogger(opens in a new tab), 2024年4月1日

このチュートリアルは役に立ちましたか?