『How to Send an EIP-1559 Transaction』の翻訳
QuickNode公式ブログに投稿されたHow to Send an EIP-1559 Transactionの邦訳です。
How to Send an EIP-1559 Transaction / EIP-1559トランザクションの送信方法
Overview / 概要
イーサリアムは規模を拡大しようとする一方で、ガス価格の問題に遭遇してきました。この問題を解決するために多くのレイヤー2ソリューションやサイドチェーンが誕生しましたが、イーサリアムはメインチェーンであり、どこかの時点で改善される必要があります。EIP-1559は、オンチェーンでのガス価格の変動を軽減するために導入されました。このガイドでは、ethers.jsを使用してEIP-1559トランザクションを送信する方法を学びます。
前提条件
- イーサリアムのテストネットノード。
- イーサリアムのウォレット。
- Node.js のインストール。
- コードエディタとCLI。
- 水、おいしいから。
What is EIP-1559? / EIP-1559とは何ですか?
EIP-1559とは何ですか?
EIPとは、Ethereum Improvement Proposalsの略で、イーサリアムプロトコル周りの標準規格を定義するものです。イーサリアムはオープンソースであるため、誰でもEIPを提案することができます。提案後、これらのEIPは承認プロセスを経て、コアプロトコルに統合されることができます。
EIP-1559以前は、ブロックが常に最高額の取引で埋め尽くされていたため、イーサリアムのチェーン上でガス料金の安い取引は長い間保留されたままとなることも少なくありませんでした。
これを解消するため、EIP-1559では、"base fee per block"(「ブロックごとの基本料金」)とマイナーへの「チップ」という、より高度で公平なガス料金のシステムが導入されました。base fee
はブロックにトランザクションが含まれるようにするもので、「チップ」はマイナーにインセンティブを与えるためのものです。EIP-1559では、ブロックの"gas limit"(「ガス上限」)が2倍になりました。EIP-1559以前の100%フルブロックは、EIP-1559後は50%フルにしかならないので、追加トランザクションのための余地が増えたことになります。
では、1559年以降のガスの新しい変数/メカニズムを理解しましょう。
-
baseFeePerGas
: プロトコルによってブロックヘッダごとに生成されるガスあたりの基本料金である。baseFeePerGas
はブロックに追加されるトランザクションのgasUsed
属性の最小倍率を要求します。例えば、トランザクションのガスはbaseFeePerGas * gasUsed.
となります。これはブロックごとにバーンされる"transaction fee"(「トランザクション料金」)の部分となります。各ブロックのbaseFeePerGas
は、前のブロックと比べたブロックのフル度によって12.5%増減することができます。例えば、100%フルであればbaseFeePerGas
は+12.5%、50%フルであればそのまま、0%フルであれば-12.5%になります。 -
maxPriorityFeePerGas
:ユーザが設定します。これはガスのうち、マイナーに渡る部分です。ユーザーはmaxPriorityFeePerGas
を用いて、優先度の高いトランザクションに対してプレミアム料金を支払うことができます。ブロックが100%埋まるたびに、EIP-1559導入以前までと同じように、この値がトランザクション優先度の決め手となります。 -
maxFeePerGas
:ユーザーにより設定されます。maxFeePerGas
は、ユーザーがトランザクションに支払うガス料金の上限(baseFeePerGas
+maxPriorityFeePerGas
を含む)を表します。トランザクションの確定後、maxFeePerGas
とbaseFeePerGas
+maxPriorityFeePerGas
の差額がユーザー/sender
(「トランザクションの送信者」に返金されます。
EIP-1559について理解を深めたところで、実際にEIP-1559のトランザクションを送信して、その動作を確認するのが良いでしょう。
Booting our node / ノードの起動
Ethereum Mainnetでトランザクションを送信すると本物のETHがかかるため、Kovan Testnetを使用してトランザクションを行うことにします。便宜上、QuickNodeから無料トライアルのKovan Nodeを起動することにします。
HTTPのURLは後で使うので、保存しておいてください。
Getting funds in the wallet / ウォレットに資金を入れる
トランザクションでいくらか送信し、ガス代を支払うために、ウォレットにある KovanのテストETHが必要です。いくつか手に入れるには、Kovanのfaucetに行き、サインインしてルームに参加し、ウォレットアドレスをチャットに貼り付けてください。これらの手順を正常に完了すると、KovanテストETHがあなたのウォレットに送信されます。
Installing required libraries / 必要なライブラリのインストール
ここでは、ethers.jsライブラリを使用してトランザクションを送信し、log-timestampライブラリを使用してスクリプトの実行の各ステップの時間を記録します。
プロジェクトディレクトリを作成し、そこに cd
コマンドで移動します。
mkdir eipDemo
cd eipDemo
これらのライブラリをインストールするために、node.jsのパッケージマネージャであるnpmを使用することにします。
npm install log-timestamp ethers
これで、プロジェクトディレクトリにライブラリがインストールされたはずです。
Making an EIP-1559 transaction / EIP-1559のトランザクションを行う
index.jsという名前のjavascriptファイルを作成し、そこに以下のコードを貼り付けます。
require("log-timestamp");
const ethers = require("ethers");
const privateKey = ("ADD_YOUR_PRIVATE_KEY_HERE").toString('hex');
const wallet = new ethers.Wallet(privateKey);
const address = wallet.address;
console.log("Public Address:", address);
const httpsUrl = "ADD_YOUR_HTTP_URL_HERE";
console.log("HTTPS Target", httpsUrl);
const init = async function () {
const httpsProvider = new ethers.providers.JsonRpcProvider(httpsurl);
let nonce = await httpsProvider.getTransactionCount(address);
console.log("Nonce:", nonce);
let feeData = await httpsProvider.getFeeData();
console.log("Fee Data:", feeData);
const tx = {
type: 2,
nonce: nonce,
to: "0x8D97689C9818892B700e27F316cc3E41e17fBeb9", // Address to send to
maxPriorityFeePerGas: feeData["maxPriorityFeePerGas"], // Recommended maxPriorityFeePerGas
maxFeePerGas: feeData["maxFeePerGas"], // Recommended maxFeePerGas
value: ethers.utils.parseEther("0.01"), // .01 ETH
gasLimit: "21000", // basic transaction costs exactly 21000
chainId: 42, // Ethereum network id
};
console.log("Transaction Data:", tx);
const signedTx = await wallet.signTransaction(tx);
console.log("Signed Transaction:", signedTx);
const txHash = ethers.utils.keccak256(signedTx);
console.log("Precomputed txHash:", txHash);
console.log(`https://kovan.etherscan.io/tx/${txHash}`);
httpsProvider.sendTransaction(signedTx).then(console.log);
};
init();
4行目の ADD_YOUR_PRIVATE_KEY_HERE
をウォレットの秘密鍵に、10行目の ADD_YOUR_HTTP_URL_HERE
を先ほど取得した自分のノードのHTTP URLに置き換えてください。
上記コードの説明:
1-2行目:log-timestampとethersのライブラリをインポートしています。
4-5行目: priavteKey
変数に秘密鍵を保存し、privateKey
を使用してウォレットを初期化します。
7-8行目: ウォレットのアドレスを取得し、コンソールに表示します。
10-11行目:ノードのHTTP URLを httpUrl 変数に保存し、コンソールに出力しています。
13行目:非同期の init 関数を開始します。
14行目:プロバイダーを初期化し、変数 httpsProvider
に保存します。
16-17行目: プロバイダーからnonce
を取得し、コンソールに出力しています。
19-20行目: ノードから料金データ(gasPrice
, maxPriorityFeePerGas
, maxFeePerGas
)を取得し、feedData
変数に保存し、コンソールに出力しています。
22-30行目: トランザクションオブジェクト tx
:EIP-1559トランザクションであるType 2としてトランザクションに言及、nonce
パラメータに言及、受信者のアドレスに言及、maxPriorityFeePerGas
パラメータと feeData
変数から情報を取得、maxFeePerGas
パラメータと feeData
変数からデータを取得、値パラメータは送信する"amount of ETH"(「ETHの額」)、gasLimit
、chainId
を保持しています。チェーンはKovanなのでchainId
は42が指定されています。
32行目: トランザクションオブジェクトを出力しています。
34-35行目: 私たちのウォレットを使用してトランザクションに署名し、署名されたトランザクションのraw データをコンソールに出力しています。
37行目: トランザクションハッシュを得るためにrawトランザクションにkeccak256を適用し、それをtxHash 変数に保存しています。
38-39行目: Kovan etherscanへのリンクとともに、トランザクションのハッシュをコンソールに出力しています。
41行目: 私たちのノードを使用してトランザクションを送信します。
ファイルを保存して、このスクリプトを実行します:
node index
正常に実行されると、次のような出力が得られます。
Conclusion / まとめ
このガイドでは、EIP-1559について、そしてEIP-1559トランザクションの送信方法について学んだので、EIP-1559についてより深く理解していただけたと思います。
イーサリアムに関する記事やガイドをもっと知りたい方は、ニュースレターをご購読ください。フィードバックがあれば、Twitterでお気軽にご連絡ください。また、私たちのDiscordコミュニティサーバーでは、クールな開発者たちといつでもチャットすることができます :)
Discussion