Ethereumの基本
アカウント
EOA(Externally Owned Account)
ユーザーが直接管理するアカウントであり、秘密鍵と公開鍵のペアによって制御される。EOAは、イーサリアムネットワーク上でのトランザクションの送信や、スマートコントラクトとのインタラクションに使用される。
EOAの役割
ユーザーインターフェース:
EOAはユーザーがイーサリアムネットワークとインタラクションするための主要なインターフェースである。ユーザーは秘密鍵を使用して自分のアカウントを管理し、トランザクションを送信する。
トランザクションの承認:
EOAはトランザクションに署名することで、その有効性を保証する。署名されたトランザクションはネットワークによって検証され、ブロックチェーンに記録される。
デジタル資産の管理:
EOAはETHやERC-20トークンなどのデジタル資産を保有し、管理する。ユーザーはこれらの資産を送受信し、スマートコントラクトに預けることができる。
CA(Contract Account)
スマートコントラクトが展開されるアカウントで、EOA(Externally Owned Account、外部所有アカウント)と異なり、人間によって直接管理されるのではなく、コードによって制御される。
CAの役割
スマートコントラクトのホスティング:
CAはスマートコントラクトをホストし、そのコードを実行する。これにより、分散型アプリケーション(dApps)の基本機能が提供される。
例:トークンの発行、デジタル資産の管理、デジタル契約の実行。
自動化されたアクション:
CAは事前に定義されたロジックに基づいて自動的にアクションを実行する。これにより、信頼性と透明性の高い処理が可能となる。
例:自動的に資産を分配する、投票システムを運用する。
データの管理と操作:
CAはデータを保存し、そのデータを操作するための機能を提供する。これは特に複雑なビジネスロジックを実装する際に重要となる。
例:ユーザー情報の管理、取引履歴の保存。
共通属性
バランス(Balance):
EOAとCAの両方に存在する属性であり、アカウントが保有するETHの量を示す。このバランスはトランザクション手数料(ガス)の支払いに使用される。
ノンス(Nonce):
トランザクションの一意性を保証するためのカウンター。EOAでは、アカウントから送信されたトランザクションの数を追跡する。CAでは、各トランザクションによって生成された内部トランザクションの数を管理する。
CAの特有属性
コードハッシュ(Code Hash):
コントラクトアカウントにのみ存在する属性。これはスマートコントラクトのバイトコードのハッシュ値であり、コントラクトコードの一貫性と変更がないことを保証する。EOAにはコードがないため、この属性は存在しない。
ストレージルート(Storage Root):
こちらもコントラクトアカウントにのみ存在する属性。スマートコントラクトの内部ストレージデータを効率的に管理するためのMerkle Patricia Trieのルートハッシュを指す。EOAは内部ストレージを持たないため、この属性は存在しない。
トランザクション
Ethereumのトランザクションには大きく分けてMessage CallとContract Creationがある。
Message Call
Message Callは、既存のアカウント(EOAまたはCA)に対してメッセージ(トランザクション)を送信するプロセス。
ETHの送金:
最もシンプルなMessage Callは、EOAから別のEOAにETHを送金するトランザクション。
スマートコントラクトの呼び出し:
EOAまたは別のスマートコントラクトから、特定のスマートコントラクトの関数を呼び出すことができる。
呼び出し時に関数のパラメータや送信するETHの量を指定する。
Message Callのトランザクションデータ構造
{
"nonce": "0x15", // トランザクションカウンター。アカウントのトランザクション数をカウントする
"gasPrice": "0x09184e72a000", // ガス単価(wei)。トランザクションの実行コストを指定
"gasLimit": "0x2710", // ガスの上限。トランザクションが使用できる最大ガス量
"to": "0xRecipientAddress", // 受信者のアドレス。ETHの送信先またはスマートコントラクトのアドレス
"value": "0x10", // 送金するETHの量(wei)
"data": "0x", // データフィールド。スマートコントラクトの関数呼び出しやパラメータ
"v": "0x1c", // 署名のリカバリID
"r": "0xSignaturePart1", // 署名の一部(r値)
"s": "0xSignaturePart2" // 署名の一部(s値)
}
Contract Creation
Contract Creationは、新しいスマートコントラクトをデプロイ(作成)するプロセス。
スマートコントラクトのコンパイル:
開発者はSolidityなどのスマートコントラクト言語でコードを記述し、それをコンパイルしてバイトコードを生成する。
デプロイトランザクションの送信:
EOAがコンパイルされたバイトコードを含むトランザクションを送信し、これにより新しいコントラクトアカウント(CA)が作成される。
トランザクションのデータフィールドにスマートコントラクトのバイトコードが含まれる。
コントラクトアドレスの生成:
コントラクトのアドレスは、送信者のアドレスとそのアカウントからのトランザクションのナンスを元に計算される。
トランザクションレシート
トランザクションが完了した後に「トランザクションレシート(Transaction Receipt)」が発行される。これは、トランザクションの結果を記録するものであり、トランザクションの状態やイベントログ、ガスの使用量などの情報が含まれる。
トランザクションハッシュ:
トランザクションの一意の識別子。
ステータス:
トランザクションの成功または失敗を示す。
ブロック番号:
トランザクションが含まれたブロックの番号。
ガスの使用量:
トランザクションの実行に使用されたガスの量。
ログ:
スマートコントラクトが生成したイベントログ。
トランザクションのインデックス:
ブロック内でのトランザクションの位置。
トランザクションの発行者と受信者のアドレス:
トランザクションの送信元と送信先のアドレス。
トランザクションレシートの取得方法
Web3.jsを使用した例
const Web3 = require('web3');
const web3 = new Web3('https://mainnet.infura.io/v3/YOUR_INFURA_PROJECT_ID');
const txHash = '0x1234567890abcdef...'; // トランザクションハッシュを指定
web3.eth.getTransactionReceipt(txHash)
.then(receipt => {
console.log(receipt);
})
.catch(err => {
console.error('Error fetching transaction receipt:', err);
});
トランザクションレシートのデータ構造
{
"transactionHash": "0x1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef",
"transactionIndex": "0x1", // ブロック内でのトランザクションのインデックス
"blockHash": "0xabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdef",
"blockNumber": "0x10d4f", // ブロック番号
"from": "0xSenderAddress", // 送信者のアドレス
"to": "0xRecipientAddress", // 受信者のアドレス(スマートコントラクトの場合はnull)
"cumulativeGasUsed": "0x5208", // このブロックで消費されたガスの累計量
"gasUsed": "0x5208", // トランザクションの実行に使用されたガスの量
"contractAddress": "0xContractAddress", // スマートコントラクトのアドレス(コントラクト作成トランザクションの場合)
"logs": [ // イベントログ
{
"logIndex": "0x1",
"blockNumber": "0x10d4f",
"blockHash": "0xabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdef",
"transactionHash": "0x1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef",
"transactionIndex": "0x1",
"address": "0xContractAddress",
"data": "0x...",
"topics": [
"0xTopic1",
"0xTopic2"
]
}
],
"status": "0x1", // トランザクションの成功(1)または失敗(0)を示す
"logsBloom": "0x...", // ログのブルームフィルター
"root": "0x..." // トランザクションルート(古いトランザクションレシートの形式)
}
ステートの保持
ブロックチェーン上でスマートコントラクトやアカウントの現在の状態を管理することを指す。これは、全ノードが共有するグローバルなデータ構造を通じて行われ、アカウントバランス、スマートコントラクトのストレージ、トランザクション履歴などが含まれる。
ステートは、各トランザクションの実行により更新され、分散型ネットワーク全体で一貫性を保つように設計されている。
Bitcoinとの比較
アカウントベース vs UTXOベース:
Ethereum: アカウントベースのモデルを使用。各アカウントのバランスが直接管理され、トランザクションごとにステートが更新される。
Bitcoin: UTXO(Unspent Transaction Output)モデルを使用。トランザクションアウトプットが次のトランザクションのインプットとして消費される。
スマートコントラクトのサポート:
Ethereum: スマートコントラクトをサポートし、複雑なロジックをブロックチェーン上で実行できる。スマートコントラクトの状態もステートに含まれる。
Bitcoin: スクリプト言語を使用して簡単な条件付きトランザクションを実行できるが、Ethereumほど強力でない。
データ構造:
Ethereum: 各アカウントのデータを保持するためにMerkle Patricia Trieを使用し、効率的なデータ検索と更新が可能。
Bitcoin: UTXOセットを管理するために、単純なハッシュマップを使用し、トランザクションのアウトプットを追跡する。
状態の変化の管理:
Ethereum: 各トランザクションごとにアカウントの状態を直接変更し、グローバルステートが更新される。
Bitcoin: トランザクションアウトプットが消費されるたびにUTXOセットが更新される。
具体例での違い
Ethereum: ユーザーがスマートコントラクトを呼び出してトークンを転送する場合、アカウントのバランスやスマートコントラクトのストレージが更新される。
Bitcoin: ユーザーがビットコインを転送する場合、UTXOが消費され、新しいUTXOが生成される。
UTXO
UTXOは、トランザクションの出力のうち、まだ次のトランザクションに使用されていない部分を指す。つまり、あるトランザクションの結果として受け取ったコインで、まだ消費されていないもの。
トランザクションの仕組み:
Bitcoinのトランザクションは、入力と出力から構成される。入力は既存のUTXOを参照し、出力は新しいUTXOを生成する。
トランザクションの入力部分には、送金に使用するUTXOの情報と、それに対応する秘密鍵による署名が含まれる。
出力部分には、送金先アドレスと送金額が記載される。
トランザクションの検証:
ノードは、入力のUTXOが有効かどうか(すなわち、まだ使用されていないか)を確認する。
これにより、二重支払いを防ぐことができる。
Gasについて
Ethereumの「Gas」は、トランザクションの実行やスマートコントラクトの操作に必要な計算資源を測定し、ネットワークの健全性を維持するために使用される仕組み。Gasは、Ethereumネットワーク上のリソース使用に対して支払う手数料の単位として機能する。
Gasの基本概念
Gas Limit:
トランザクションで消費するGasの上限を設定する。この上限を超えるとトランザクションは失敗し、消費されたGasは返却されない。手数料が増え続けないようにする。
Gas Price:
トランザクションを実行するために支払うGasの単価(通常はGweiで表される)。高いGas Priceを設定することで、トランザクションの優先度を上げることができる。
Gas Used:
・トランザクションの実行に実際に消費されたGasの量。これはトランザクションが成功または失敗したかに関わらず、リソースを消費した分だけのGasを示す。Base Fee:
EIP-1559により導入された新しいFeeモデル。Base Feeはブロックごとに自動的に調整され、ネットワークの混雑に応じて変動する。
Tip(Priority Fee):
ユーザーがマイナーに支払う追加のインセンティブ。高いPriority Feeを設定することで、トランザクションの処理を優先させることができる。
マイナーはPriority Fee(Tip)として支払われる部分を直接受け取り、Base Feeは焼却(Burn)される。これにより、ETHの供給量が減少し、ネットワークの価値が保たれる。
Gas LimitとGas Priceの設定
トランザクションを送信する際、ユーザーはGas LimitとGas Priceを設定する必要がある。これらの設定に基づいて、トランザクションの最大費用が計算される:
最大費用=Gas Limit×Gas Price最大費用=Gas Limit×Gas Price
例えば、Gas Limitが21,000で、Gas Priceが50 Gweiの場合、最大費用は:
21,000×50 Gwei=1,050,000 Gwei=0.00105 ETH21,000×50 Gwei=1,050,000 Gwei=0.00105 ETH
トランザクションの実行
トランザクション送信: ユーザーはトランザクションを送信し、Gas LimitとGas Priceを指定する。トランザクションはネットワークにブロードキャストされ、マイナーによって処理される。
Gasの消費: EVM(Ethereum Virtual Machine)は、各命令の実行に対してGasを消費する。複雑な命令や計算ほど多くのGasを消費する。
Gasの返却: トランザクションがGas Limitを超えずに成功した場合、未使用のGasはユーザーに返却される。しかし、トランザクションが失敗した場合、消費されたGasは返却されない。