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

トランザクション

最終更新: 2026年2月23日

イーサリアムにおける「トランザクション」とは、アカウントから暗号的に署名された一連の指示です。 アカウントはトランザクションを開始し、イーサリアムネットワークの状態を更新します。 最も単純なトランザクションは、あるアカウントから別のアカウントにETHを転送することです。

前提条件

このページをより良く理解するために、まずアカウントイーサリアム入門を読むことをお勧めします。

トランザクションとは

イーサリアムトランザクションとは、コントラクトではなく人間によって管理されたアカウントである外部所有アカウント(EOA)によって開始されたアクションを指します。 例えば、BobがAliceに1 ETHを送信するとしましょう。Bobのアカウントから1 ETH引き落とされ、Aliceのアカウントに振り込みされなければなりません。 この状態の変更はトランザクション内で実行されます。

トランザクションによる状態変化を示す図 図はEthereum EVM illustratedopens in a new tabより引用

EVMの状態を変更するトランザクションは、ネットワーク全体にブロードキャストされる必要があります。 すべてのノードは、EVMで実行されるトランザクションのリクエストをブロードキャストできます。 この後、バリデータがトランザクションを実行し、結果の状態の変更をネットワークに伝播します。

トランザクションにはフィー(手数料)が必要で、検証されたブロックに含まれる必要があります。 この概要を簡単にするために、ガス代と検証については別のページで取り上げます。

送信されたトランザクションには次の情報が含まれます。

  • from – 送信者のアドレス。トランザクションに署名します。 コントラクトアカウントはトランザクションを送信できないため、これは外部所有アカウントになります
  • to – 受信アドレス(外部所有アカウントの場合、トランザクションは値を転送します。 コントラクトアカウントの場合、トランザクションはコントラクトコードを実行します。)
  • signature – 送信者の識別子。 送信者の秘密鍵がトランザクションに署名し、送信者がこのトランザクションを承認したときに生成されます。
  • nonce - アカウントからのトランザクション番号を示す、連続的にインクリメントされるカウンター
  • value – 送信者から受信者へ転送するETHの量(WEI単位、1ETHは1e+18weiに相当します)
  • input data – 任意のデータを含めるためのオプションフィールド
  • gasLimit – トランザクションで消費できるガスユニットの最大量。 EVMは、各計算ステップで必要とされるガスユニットを指定します
  • maxPriorityFeePerGas - バリデータへのチップとして含めるために消費されるガスの最大価格
  • maxFeePerGas - トランザクションに対して支払う用意があるガス単位あたりの最大手数料(baseFeePerGasmaxPriorityFeePerGasを含む)

ガスとは、バリデータのトランザクションに必要な計算を意味します。 ユーザーはこの計算に手数料を支払う必要があります。 gasLimitmaxPriorityFeePerGasは、バリデータに支払われる最大トランザクション手数料を決定します。 ガスに関する詳細

トランザクションオブジェクトは次のようになります。

1{
2 from: "0xEA674fdDe714fd979de3EdF0F56AA9716B898ec8",
3 to: "0xac03bb73b6a9e108530aff4df5077c2b3d481e5a",
4 gasLimit: "21000",
5 maxFeePerGas: "300",
6 maxPriorityFeePerGas: "10",
7 nonce: "0",
8 value: "10000000000"
9}
すべて表示

しかし、トランザクションオブジェクトは送信者の秘密鍵を使って署名する必要があります。 これは、トランザクションが送信者からのみ行われ、不正に送信されなかったことを証明するものです。

Gethのようなイーサリアムクライアントは、この署名プロセスを処理します。

JSON-RPCコールの例:

1{
2 "id": 2,
3 "jsonrpc": "2.0",
4 "method": "account_signTransaction",
5 "params": [
6 {
7 "from": "0x1923f626bb8dc025849e00f99c25fe2b2f7fb0db",
8 "gas": "0x55555",
9 "maxFeePerGas": "0x1234",
10 "maxPriorityFeePerGas": "0x1234",
11 "input": "0xabcd",
12 "nonce": "0x0",
13 "to": "0x07a565b7ed7d7a678680a4c162885bedbb695fe0",
14 "value": "0x1234"
15 }
16 ]
17}
すべて表示

応答例:

1{
2 "jsonrpc": "2.0",
3 "id": 2,
4 "result": {
5 "raw": "0xf88380018203339407a565b7ed7d7a678680a4c162885bedbb695fe080a44401a6e4000000000000000000000000000000000000000000000000000000000000001226a0223a7c9bcf5531c99be5ea7082183816eb20cfe0bbc322e97cc5c7f71ab8b20ea02aadee6b34b45bb15bc42d9c09de4a6754e7000908da72d48cc7704971491663",
6 "tx": {
7 "nonce": "0x0",
8 "maxFeePerGas": "0x1234",
9 "maxPriorityFeePerGas": "0x1234",
10 "gas": "0x55555",
11 "to": "0x07a565b7ed7d7a678680a4c162885bedbb695fe0",
12 "value": "0x1234",
13 "input": "0xabcd",
14 "v": "0x26",
15 "r": "0x223a7c9bcf5531c99be5ea7082183816eb20cfe0bbc322e97cc5c7f71ab8b20e",
16 "s": "0x2aadee6b34b45bb15bc42d9c09de4a6754e7000908da72d48cc7704971491663",
17 "hash": "0xeba2df809e7a612a0a0d444ccfa5c839624bdc00dd29e3340d46df3870f8a30e"
18 }
19 }
20}
すべて表示
  • rawは、再帰長プレフィックス(RLP)でエンコードされた署名済みトランザクションです
  • txはJSON形式の署名済みトランザクションです

署名ハッシュでトランザクションが送信者から送信され、ネットワークに送信されたことを暗号的に証明することができます。

データフィールド

大多数のトランザクションは、外部所有アカウントからコントラクトにアクセスします。 ほとんどのコントラクトはSolidityで記述されており、に従ってデータフィールドを解釈します。

最初の4バイトは、関数の名前と引数のハッシュを使用して、どの関数を呼び出すかを指定します。 このデータベースopens in a new tabを使用して、セレクターから関数を特定できる場合があります。

calldataの残りの部分は引数であり、ABI仕様で規定されている通りにエンコードopens in a new tabされています。

例えば、このトランザクションopens in a new tabを見てみましょう。 詳細をクリックしてcalldataを表示します。

関数セレクターは0xa9059cbbです。 このシグネチャを持つ既知の関数opens in a new tabがいくつかあります。 この場合、コントラクトのソースコードopens in a new tabがEtherscanにアップロードされているため、関数がtransfer(address,uint256)であることがわかります。

残りのデータは以下の通りです。

10000000000000000000000004f6742badb049791cd9a37ea913f2bac38d01279
2000000000000000000000000000000000000000000000000000000003b0559f4

ABIの仕様により、整数値(20バイトの整数であるアドレスなど)が、ABIに32バイトのワードとして表示され、先頭はゼロで埋めらます。 したがって、toアドレスは4f6742badb049791cd9a37ea913f2bac38d01279opens in a new tabであることがわかります。 valueは0x3b0559f4 = 990206452です。

トランザクションの種類

イーサリアムでは、いくつかの異なる形式のトランザクションがあります。

  • 通常のトランザクション: あるアカウントから別のアカウントへのトランザクション。
  • コントラクト・デプロイ・トランザクション: 「to」のないトランザクションで、データフィールドがコントラクトコードに使用されているもの。
  • コントラクトの実行: デプロイされたスマートコントラクトと相互作用するトランザクション。 この場合、「to」アドレスはスマートコントラクトアドレス。

ガスについて

前述のように、トランザクションの実行にはガスがかかります。 単純な送金トランザクションには、21,000ユニットのガスが必要です。

したがって、BobがAliceに1 ETHをbaseFeePerGas 190 gwei、maxPriorityFeePerGas 10 gweiで送信するには、Bobは次の手数料を支払う必要があります。

1(190 + 10) * 21000 = 4,200,000 gwei
2--or--
30.0042 ETH

Bobのアカウントから**-1.0042 ETH**(Aliceへの1 ETH + ガス手数料0.0042 ETH)が引き落とされます。

Aliceのアカウントに**+1.0 ETH**が加算されます。

ベースフィーは**-0.00399 ETH**がバーン(焼却)されます。

バリデータはチップとして**+0.000210 ETH**を受け取ります。

未使用のガスが返金される仕組みを示す図 図はEthereum EVM illustratedopens in a new tabより引用

トランザクションで使用されなかったガス代は、ユーザーアカウントに返金されます。

スマートコントラクトのインタラクション

スマートコントラクトが関わるトランザクションにはガスが必要です。

スマートコントラクトには、コントラクトの状態を変更しないviewopens in a new tab関数やpureopens in a new tab関数として知られる関数も含まれることがあります。 そのため、EOAからこれらの関数を呼び出す際にはガスは不要です。 このシナリオの基礎となるRPCコールはeth_callです。

eth_callを使用してアクセスする場合とは異なり、これらのviewまたはpure関数は内部的にも(つまり、コントラクト自体や別のコントラクトから)一般的に呼び出され、その場合はガスがかかります。

トランザクションのライフサイクル

トランザクションが送信されると、次のことが実行されます。

  1. トランザクションハッシュは暗号学的に生成されます: 0x97d99bc7729211111a21b12c933c949d4f31684f1d6954ff477d0477538ff017
  2. 次に、トランザクションはネットワークにブロードキャストされ、保留している他のすべてのネットワークトランザクションで構成されるトランザクションプールに追加される。
  3. バリデータはトランザクションを検証し、それを「成功」とみなすには、トランザクションをブロックに追加する必要がある。
  4. 時間と経過とともに、トランザクションを含むブロックは「正当 (justified)」にアップグレードされ、その後「ファイナライズ (finalized) 」になる。 これらのアップグレードにより、トランザクションが成功し、決して変更されないことがより確実になります。 ブロックが「ファイナライズ」されると、数十億ドルものコストがかかるネットワークレベルの攻撃によってのみ変更可能となります。

ビジュアルデモ

トランザクション、ガス、マイニングに関するAustinの説明動画をご覧ください。

型付きトランザクションエンベロープ

イーサリアムは当初、トランザクション形式は1つのみでした。 各トランザクションには、ノンス (nonce)、ガス代、ガスリミット、toアドレス、値、データ、v、r、sがあります。 これらのフィールドはRLPエンコードされており、次のようになります:

RLP([nonce, gasPrice, gasLimit, to, value, data, v, r, s])

イーサリアムは、レガシーなトランザクション形式に影響を与えることなく、アクセスリストやEIP-1559opens in a new tabなどの新機能を実装できるように、複数のトランザクションタイプをサポートするように進化してきました。

これを可能にするのがEIP-2718opens in a new tabです。 これらのトランザクションは、次のように解釈されます。

TransactionType || TransactionPayload

フィールドは次のように定義されます。

  • TransactionType - 0から0x7fまでの数値で、合計128種類のトランザクションタイプが可能です。
  • TransactionPayload - トランザクションタイプによって定義される任意のバイト配列。

TransactionTypeの値に基づいて、トランザクションは次のように分類されます:

  1. タイプ0 (レガシー) トランザクション: イーサリアムのローンチ以来使用されているオリジナルのトランザクション形式です。 これらには、動的なガス料金計算やスマートコントラクトのアクセスリストなど、EIP-1559opens in a new tabの機能は含まれていません。 レガシートランザクションには、再帰長プレフィックス(RLP)エンコーディングを使用した場合に0xf8バイトで始まる、シリアル化された形式でそのタイプを示す特定のプレフィックスがありません。 これらのトランザクションのTransactionType値は0x0です。

  2. タイプ1トランザクション: イーサリアムのベルリン・アップグレードの一環としてEIP-2930opens in a new tabで導入されたこれらのトランザクションには、accessListパラメータが含まれています。 このリストは、トランザクションがアクセスすると想定されるアドレスとストレージキーを指定しており、スマートコントラクトが関わる複雑なトランザクションのガスコストを削減できる可能性があります。 EIP-1559の料金市場の変更はType 1トランザクションには含まれていません。 タイプ1トランザクションにはyParityパラメータも含まれており、これは0x0または0x1のいずれかを取ることができ、secp256k1署名のy値のパリティを示します。 これらはバイト0x01で始まり、そのTransactionType値は0x1です。

  3. タイプ2トランザクションは、一般にEIP-1559トランザクションと呼ばれ、イーサリアムのロンドン・アップグレードEIP-1559opens in a new tabによって導入されたトランザクションです。 これらはイーサリアムネットワークで標準のトランザクションタイプとなっています。 これらのトランザクションは、トランザクションフィーをベースフィーとプライオリティフィーに分けることで予測可能性を向上させる新しい料金市場メカニズムを導入しています。 これらはバイト0x02で始まり、maxPriorityFeePerGasmaxFeePerGasなどのフィールドを含んでいます。 Type 2トランザクションは、その柔軟性と効率性から現在のデフォルトであり、特にネットワークが混雑している期間中に、ユーザーがトランザクションフィーをより予測可能に管理できる点で好まれています。 これらのトランザクションのTransactionType値は0x2です。

  4. タイプ3(Blob)トランザクションは、イーサリアムのDencunアップグレードの一環としてEIP-4844opens in a new tabで導入されました。 これらのトランザクションは、「blob」データ(Binary Large Objects)をより効率的に処理するように設計されており、特にレイヤー2ロールアップがより低いコストでイーサリアムネットワークにデータを投稿する方法を提供することで、恩恵をもたらします。 Blobトランザクションには、blobVersionedHashesmaxFeePerBlobGasblobGasPriceなどの追加フィールドが含まれます。 これらはバイト0x03で始まり、そのTransactionType値は0x3です。 Blobトランザクションは、イーサリアムのデータ可用性とスケーリング能力における大幅な改善を表しています。

  5. タイプ4トランザクションは、イーサリアムのPectraアップグレードの一環としてEIP-7702opens in a new tabで導入されました。 これらのトランザクションは、アカウントの抽象化と前方互換性を持つように設計されています。 これにより、EOAは元の機能を損なうことなく、一時的にスマートコントラクトアカウントのように振る舞うことができます。 これらにはauthorization_listパラメータが含まれており、EOAが権限を委任するスマートコントラクトを指定します。 トランザクション後、EOAのコードフィールドには、委任されたスマートコントラクトのアドレスが格納されます。

参考リンク

役に立つコミュニティリソースを知っていますか? Edit this page and add it!

この記事は役に立ちましたか?