2025-06-26

MetaMask公式ドキュメント
https://docs.metamask.io/guide/
によると、もうWeb3.js(web3.eth)は古いものであり、順次window.ethereumへ置き換えられ、すでに置き換えが完了している機能はweb3.ethでは動かない。
以前の記事ブラウザのJavaScriptのみでMetaMaskと連携しトランザクションを実行するでは、window.ethereumのみを用いて、任意のアドレスにトランザクション送金を行った。
トランザクションは、window.ethereum.request eth_sendTransactionで行え、他サイトのサンプルも豊富にある。
var send_params = {
nonce: '0x00',
gasPrice: '',
gas: '',
to: $("#to_address_txt").val(),
from: window.ethereum.selectedAddress,
value: send_wei_str,
data: to_data_txt,
chainId: '',
};
var transaction_id = await window.ethereum.request({
method: 'eth_sendTransaction',
params: [send_params],
});
しかしトランザクションeth_sendTransactionはコントラクトへお金を送りトークンをもらうなど、「状態を書き換える関数を呼ぶ時」しか使用しない。
コントラクトの状態のみを取得する場合はトランザクションは不要であり、単発の関数を呼ぶだけである。これはつまりeth_sendTransactionではなくeth_callを使うことに他ならない。が、
windows.ethereumにてeth_callを使うサンプルが絶望的に出回っておらず苦労した。ものすごく良く使うであろうに、何故だろうか?
色々調べた結果、答えは以下のようになる。
var send_params = {
to: $("#to_address_txt").val(),
data: to_data_txt,
};
var return_value = await window.ethereum.request({
method: 'eth_call',
params: [send_params, "latest"],
});
toに取得先コントラクトアドレス文字列、dataにABIエンコードされた関数名およびパラメータ文字列を指定し、eth_callとする。
ハマった最大のポイントは[send_params, "latest"],とすることである。latestが無いと、
RPC Error: missing value for required argument 1
というエラーで処理してもらえない。
コントラクトの状態データを取得する関数であるので、戻り値はドランザクションIDでなく状態データそのものとなる。たとえば以下ページで作成した、
【Solidity】Remix IDEを使用してサーバー不要のコントラクト開発&デバッグ【Ethereum】
Storageコントラクトのretrieve関数を呼んだ場合、戻りはコントラクト変数のnumber数値になる。
ところで、eth_sendTransactionやeth_callで指定するdataフィールド=ABIエンコードされた関数名およびパラメータ文字列=を作る機能はまだwindow.ethereumには未実装である。
よって、これはWeb3.jsの機能を使って作ることになる。別ページにまとめたので参照されたい。
window.etereum.requestに渡すdataフィールドをABIエンコードで作成する
※本記事内容の無断転載を禁じます。
ご連絡は以下アドレスまでお願いします★
マイクで喋った日本語をテキスト変換+音声合成しOBS Studioで配信する
マイクで喋った日本語をテキスト変換してOBS Studioにリアルタイムで表示する【3】
マイクで喋った日本語をテキスト変換してOBS Studioにリアルタイムで表示する【2】
マイクで喋った日本語をテキスト変換してOBS Studioにリアルタイムで表示する【1】
Raspberry PI 2 bookworm 32bitでCanon IP4300プリンタ印刷する
【VMware】Apple silicon M2 MacでWindows11を無償で動かす
A4用紙タテ2ページ分をA3用紙ヨコ1ページに印刷するには
【Android】apkのインストールができたのにアプリ一覧に出ない場合
【Node.js】chrono-nodeを使用して自然言語を日付に変換する
【Windows10】リモートデスクトップ間のコピー&ペーストができなくなった場合の対処法
Googleファミリーリンクで子供の端末の現在地がエラーで取得できない場合
Windows11+WSL2でUbuntuを使う【2】ブリッジ接続+固定IPの設定
CUDA13環境下でGPU使用版のPyTorchを導入する
DebianにウェブサーバーApache2をセットアップ
Windows版Google Driveが使用中と言われアンインストールできない場合
【Apache】サーバーに同時接続可能なクライアント数を調整する
Intel MacBookAir2020にWindows10→Windows11をインストールする
LinuxからWindowsの共有フォルダをマウントする