2024-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エンコードで作成する
※本記事内容の無断転載を禁じます。
ご連絡は以下アドレスまでお願いします★
オープンソースリップシンクエンジンSadTalkerをDebianで動かす
ファイアウォール内部のOpenAPI/FastAPIのdocsを外部からProxyPassで呼ぶ
Debian 12でsshからshutdown -h nowしても電源が切れない場合
【Windows&Mac】アプリのフルスクリーンを解除する方法
Debian 12でtsコマンドが見つからないcommand not found
Debian 12でsyslogやauth.logが出力されない場合
Debian 12で固定IPアドレスを使う設定をする
Debian 12 bookwormでNVIDIA RTX4060Ti-OC16GBを動かす
【Debian】apt updateでCD-ROMがどうのこうの言われエラーになる場合
【Windows10】リモートデスクトップ間のコピー&ペーストができなくなった場合の対処法
Windows11+WSL2でUbuntuを使う【2】ブリッジ接続+固定IPの設定
【Apache】サーバーに同時接続可能なクライアント数を調整する
GitLabにHTTPS経由でリポジトリをクローン&読み書きを行う
【C/C++】小数点以下の切り捨て・切り上げ・四捨五入
Intel Macbook2020にBootCampで入れたWindows11 Pro 23H2のBluetoothを復活させる
【PHP】Mail/mimeDecodeを使ってメールの中身を解析(準備編)
【ひかり電話+VoIPアダプタ】LANしか通ってない環境でアナログ電話とFAXを使う
Windows11のコマンドプロンプトでテキストをコピーする