2023-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エンコードで作成する
※本記事内容の無断転載を禁じます。
ご連絡は以下アドレスまでお願いします★
☆ServerNote.NETショッピング↓
ShoppingNote / Amazon.co.jp
☆お仲間ブログ↓
一人社長の不動産業務日誌
nvidia-smiを1秒ごとに実行してGPU使用率をモニタリング
TSUKUMOのマルチGPUパソコンWA9J-X211/XTのUbuntu Server 22.04でMYCOEIROINK作成コードを実行し音声合成モデルをトレーニングする
TSUKUMOのマルチGPUパソコンWA9J-X211/XTにUbuntu Server 22.04とCOEIROINK Engineを導入する
Python venv(仮想環境作成)でError: Command returned non-zero exit status 1のエラー対処法
【Ubuntu】プロジェクトごとに複数のPythonバージョンを使い分ける
【PHP】フォーム入力を受け取り出力する
【Ubuntu】aptでインストールしたapache2にソースコンパイルしたphpをマルチスレッドモードで組み込む
【PHP】HTMLファイルを読み込んで文字列変換して出力する
TSUKUMOのマルチGPUパソコンWA9J-X211/XTにUbuntu Server 22.04とVOICEVOX Engineを導入する
Windows版Google Driveが使用中と言われアンインストールできない場合
Googleファミリーリンクで子供の端末の現在地がエラーで取得できない場合
Androidホームで左にスワイプすると出てくるニュース共を一切表示させない方法
【Windows10】リモートデスクトップ間のコピー&ペーストができなくなった場合の対処法
【C/C++】小数点以下の切り捨て・切り上げ・四捨五入
Googleスプレッドシートを編集したら自動で更新日時を入れる
【Apache】サーバーに同時接続可能なクライアント数を調整する
Windows11でMacのキーボードを使うには
Gmailのプロモーションメールをすべて削除する方法