Web3を使用したトランザクションの送信
これは、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. 「署名者(signer)」とは何ですか?
- 署名者は、あなたの秘密鍵を使用してあなたに代わってトランザクションに署名します。このチュートリアルでは、トランザクションに署名するためにAlchemy Web3 (opens in a new tab)を使用しますが、他のWeb3ライブラリを使用することもできます。
- フロントエンドにおける署名者の良い例はメタマスク (opens in a new tab)です。これはあなたに代わってトランザクションに署名し、送信します。
3. なぜトランザクションに署名する必要があるのですか?
- イーサリアムのネットワークでトランザクションを送信したいすべてのユーザーは、トランザクションの送信元が主張する本人であることを検証するために、(秘密鍵を使用して)トランザクションに署名する必要があります。
- 秘密鍵にアクセスできると、イーサリアムのアカウントを完全に制御できるようになり、あなた(またはアクセスできる人)に代わってトランザクションを実行できるようになるため、この秘密鍵を保護することは非常に重要です。
4. 秘密鍵を保護するにはどうすればよいですか?
- 秘密鍵を保護し、それを使用してトランザクションを送信する方法はたくさんあります。このチュートリアルでは、
.envファイルを使用します。ただし、秘密鍵を保存する別のプロバイダーを使用したり、キーストアファイルを使用したり、その他のオプションを使用することもできます。
5. eth_sendTransactionとeth_sendRawTransactionの違いは何ですか?
eth_sendTransactionとeth_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_sendRawTransactionにはweb3.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)などの他のオプションはこちらで確認できます。
さて、いくつかの疑問が解消されたところで、チュートリアルに進みましょう。質問があれば、いつでもAlchemyのディスコード (opens in a new tab)で気軽に聞いてください!
7. 安全でガスが最適化されたプライベートなトランザクションを送信するにはどうすればよいですか?
- Alchemyにはトランザクションに関する一連のリソースがあります (opens in a new tab)。これらを使用して、トランザクションの送信、実行前のトランザクションのシミュレーション、プライベートなトランザクションの送信、およびガスが最適化されたトランザクションの送信を行うことができます。
- また、AlchemyのWebhook (opens in a new tab)を使用すると、トランザクションがメンプールから取り出されてチェーンに追加されたときにアラートを受け取ることができます。
注: このガイドでは、Alchemyアカウント、イーサリアムのアドレスまたはメタマスクのウォレット、Node.js、およびnpmがインストールされている必要があります。インストールされていない場合は、次の手順に従ってください。
- 無料のAlchemyアカウントを作成する (opens in a new tab)
- メタマスクのアカウントを作成する (opens in a new tab)(またはイーサリアムのアドレスを取得する)
- 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のイーサリアムのアドレス(メタマスクから)を含めるようにしてください。指示に従った後、ウォレットにETHを受け取ったことを再確認してください。
3. 新しいプロジェクトディレクトリを作成し、そこにcdする
コマンドライン(Macの場合はターミナル)から新しいプロジェクトディレクトリを作成し、そこに移動します。
mkdir sendtx-example
cd sendtx-example
4. Alchemy Web3(または任意のWeb3ライブラリ)をインストールする
プロジェクトディレクトリで次のコマンドを実行して、Alchemy Web3 (opens in a new tab)をインストールします。
Ethers.jsライブラリを使用したい場合は、こちらの手順に従ってください (opens in a new tab)。
npm install @alch/alchemy-web3
5. dotenvをインストールする
APIキーと秘密鍵を安全に保存するために、.envファイルを使用します。
npm install dotenv --save
6. .envファイルを作成する
プロジェクトディレクトリに.envファイルを作成し、以下を追加します(「your-api-url」と「your-private-key」を置き換えます)。
- AlchemyのAPI URLを見つけるには、ダッシュボードで作成したばかりのアプリの詳細ページに移動し、右上隅の「View Key」をクリックして、HTTP URLを取得します。
- メタマスクを使用して秘密鍵を見つけるには、このガイド (opens in a new tab)を確認してください。
API_URL = "your-api-url"
PRIVATE_KEY = "your-private-key"
.envをコミットしないでください!.envファイルを誰かと共有したり公開したりすると、シークレットが漏洩することになるため、絶対にしないようにしてください。バージョン管理を使用している場合は、.envをgitignoreファイルに追加してください。7. sendTx.jsファイルを作成する
素晴らしいです。機密データを.envファイルで保護できたので、コーディングを始めましょう。トランザクション送信の例として、SepoliaフォーセットにETHを送金して返します。
sendTx.jsファイルを作成します。ここでサンプルのトランザクションを設定して送信します。ファイルに次のコード行を追加してください。
async function main() {
require('dotenv').config();
const { API_URL, PRIVATE_KEY } = process.env;
const { createAlchemyWeb3 } = require("@alch/alchemy-web3");
const web3 = createAlchemyWeb3(API_URL);
const myAddress = '0x610Ae88399fc1687FA7530Aac28eC2539c7d6d63' //TODO: このアドレスをあなた自身のパブリックアドレスに置き換えてください
const nonce = await web3.eth.getTransactionCount(myAddress, 'latest'); // ナンスは0からカウントを開始します
const transaction = {
'to': '0x31B98D14007bDEe637298086988A0bBd31184523', // ETHを返すフォーセットのアドレス
'value': 1000000000000000000, // 1 ETH
'gas': 30000,
'nonce': nonce,
// メッセージを送信したりスマート・コントラクトを実行したりするためのオプションのデータフィールド
};
const signedTx = await web3.eth.accounts.signTransaction(transaction, PRIVATE_KEY);
web3.eth.sendSignedTransaction(signedTx.rawTransaction, function(error, hash) {
if (!error) {
console.log("🎉 The hash of your transaction is: ", hash, "\n Check Alchemy's Mempool to view the status of your transaction!");
} else {
console.log("❗Something went wrong while submitting your transaction:", error)
}
});
}
main();
6行目のアドレスを必ずあなた自身のパブリックアドレスに置き換えてください。
さて、このコードを実行する前に、ここにあるいくつかのコンポーネントについて説明しましょう。
nonce: ナンスの指定は、あなたのアドレスから送信されたトランザクションの数を追跡するために使用されます。これはセキュリティ上の目的と、リプレイ攻撃を防ぐために必要です。あなたのアドレスから送信されたトランザクションの数を取得するには、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は、オンチェーンのアクティビティについて通知できるWebhook (opens in a new tab)をサポートしています。メインネットのトランザクションの場合、現在のガスの状況を確認して、含める適切なガス量を決定することをお勧めします。21000はイーサリアムでの操作が使用する最小のガス量であるため、トランザクションが確実に実行されるように、ここでは30000を指定します。nonce: 上記のナンスの定義を参照してください。ナンスは0からカウントを開始します。- [オプション] data: 送金と一緒に追加情報を送信したり、スマート・コントラクトを呼び出したりするために使用されます。残高の送金には必須ではありません。以下の注記を確認してください。
signedTx: トランザクションオブジェクトに署名するには、PRIVATE_KEYとともにsignTransactionメソッドを使用します。sendSignedTransaction: 署名されたトランザクションを取得したら、sendSignedTransactionを使用して、後続のブロックに含めるために送信できます。
データに関する注記 イーサリアムで送信できるトランザクションには、主に2つのタイプがあります。
- 残高の送金: あるアドレスから別のアドレスへETHを送金します。データフィールドは必要ありませんが、トランザクションと一緒に追加情報を送信したい場合は、このフィールドにHEX形式でその情報を含めることができます。
- たとえば、IPFSドキュメントのハッシュをイーサリアムのチェーンに書き込んで、イミュータブルなタイムスタンプを付与したいとします。その場合、データフィールドは
data: web3.utils.toHex(‘IPFS hash‘)のようになります。これにより、誰でもチェーンをクエリして、そのドキュメントがいつ追加されたかを確認できるようになります。
- たとえば、IPFSドキュメントのハッシュをイーサリアムのチェーンに書き込んで、イミュータブルなタイムスタンプを付与したいとします。その場合、データフィールドは
- スマート・コントラクトのトランザクション: チェーン上でスマート・コントラクトのコードを実行します。この場合、データフィールドには、実行したいスマート関数とパラメータを含める必要があります。
- 実践的な例については、Hello Worldスマート・コントラクトのチュートリアルを確認してください。
8. node sendTx.jsを使用してコードを実行する
ターミナルまたはコマンドラインに戻り、次を実行します。
node sendTx.js
9. メンプールでトランザクションを確認する
Alchemyダッシュボードのメンプールページ (opens in a new tab)を開き、作成したアプリでフィルタリングしてトランザクションを見つけます。ここでは、トランザクションが保留中の状態から、マイニングされた状態(成功した場合)、またはドロップされた状態(失敗した場合)に移行するのを確認できます。「mined(マイニング済み)」、「pending(保留中)」、「dropped(ドロップ)」のトランザクションをすべてキャプチャできるように、必ず「All」のままにしておいてください。また、アドレス0x31b98d14007bdee637298086988a0bbd31184523に送信されたトランザクションを探すことで、トランザクションを検索することもできます。
トランザクションを見つけたら、txハッシュを選択して詳細を表示します。次のようなビューが表示されるはずです。
そこから、赤丸で囲まれたアイコンをクリックすると、Etherscanでトランザクションを表示できます!
やりました!Alchemyを使用して初めてのイーサリアムのトランザクションを送信しました 🎉
このガイドに関するフィードバックや提案については、Alchemyのディスコード (opens in a new tab)でElanにメッセージを送ってください!
元々はAlchemyによって公開されました。
