2022-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
☆お仲間ブログ↓
一人社長の不動産業務日誌
【Swift UI】Cannot assign value of type Bindingエラーの対処法
【Swift UI】Extra argument in callの対処法
【Swift UI】navigationBarBackButtonHiddenはしたいがスワイプ操作で戻るは有効にしたい場合
【Swift UI】GeometryReader内のViewの位置が左にずれてしまう場合
XcodeでSwift UIアプリ実行時EXC_BAD_ACCESSエラーが出た場合
【Swift UI】右から登場し右へ消えるアニメーションボタンビュー
【Xcode】無償デベロッパで実機テストするまでのメモ
【Swift UI】アニメーションとトランジションの種類
【Swift UI】Hello Worldをフェードイン・アウトさせる
進研ゼミチャレンジタッチをAndroid端末化する
Googleスプレッドシートを編集したら自動で更新日時を入れる
Windows版Google Driveが使用中と言われアンインストールできない場合
Androidホームで左にスワイプすると出てくるニュース共を一切表示させない方法
【C/C++】小数点以下の切り捨て・切り上げ・四捨五入
【Javascript】JSON配列内にある特定要素の取得法【Node.js】
【Apache】サーバーに同時接続可能なクライアント数を調整する
Googleファミリーリンクで子供の端末の現在地がエラーで取得できない場合
LinuxからWindowsの共有フォルダをマウントする