2024-07-28


【MetaMask】window.ethereumのeth_callで任意のコントラクト関数を呼ぶ
の補足。
Web3.js = web3.ethの機能は順次window.etereumへ移行しているが、ABIエンコード・デコードの機能はまだなので、そこはWeb3.jsを使って行う。公式ドキュメントは以下。
https://web3js.readthedocs.io/en/v1.2.11/web3-eth-abi.html
たとえば、
【Solidity】Remix IDEを使用してサーバー不要のコントラクト開発&デバッグ【Ethereum】
のページで作ったStorageコントラクトをRinkeByテストネットワークへデプロイし、そのアドレスが0xf4d827a0199F09Ae010025541e8B5600fE346d37であるとして話を進める。
ここで、Remix IDEのデプロイ画面にて、メンバ変数を書き換える関数storeを呼んで、値を「12345」にセットしておく。
そして、別サイトのJavaScriptからこのコントラクトをロードして、retrieve関数を呼んで、値を取得し、それが12345なら成功、ということになる。
根幹の呼び出し部分はwindow.ethereumでコールするが、ABI関係はWeb3.jsを使用するので、ロードする。
<script src="https://cdn.jsdelivr.net/gh/ethereum/web3.js/dist/web3.min.js"></script> <script>//<![CDATA[ var contract_address = '0xf4d827a0199F09Ae010025541e8B5600fE346d37'; var web3js = null; $(window).on('pageshow',function(){ if (typeof window.ethereum !== 'undefined' && typeof web3 !== 'undefined') { web3js = new Web3(); console.log('window.ethereum and web3.js ok'); } else { console.log('window.ethereum or web3.js ng'); } }); //]]></script>
Remixでコンパイルしたコントラクトは下部に「ABI」リンクができており、これをクリックすると関数定義のJSONがコピーできる。Storageコントラクトの、retrieve関数は以下のはずである。
{ "inputs": [], "name": "retrieve", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "view", "type": "function" },
これをJavaScript変数で定義しておく。
var retrieve_abi = { "inputs": [], "name": "retrieve", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "view", "type": "function" };
retrieveは現在のnumber値を取得するプロパティ関数であるので、トランザクションは不要。よってeth_callを使えば事足りる。それに渡すデータフィールドはweb3js.eth.abi.encodeFunctionCallを使って作成する。
var data_txt = web3js.eth.abi.encodeFunctionCall(retrieve_abi, []); console.log(data_txt); var send_params = { to: contract_address, data: data_txt, }; var return_value = await window.ethereum.request({ method: 'eth_call', params: [send_params, "latest"], }); console.log(return_value);
data_txtは0x2e64cec1、return_valueは0x3039=12345が返るはずである。paramsにlatestを加えるのがポイントで、これが無いとRPC Error: missing value for required argument 1が発生する。
引数のある場合のencodeFunctionCallは
web3.jsとwindow.ethereumでコントラクト関数を引数つきでコールしプロパティを取得する
を参照されたい。以下ページも参考になる。
※本記事内容の無断転載を禁じます。
ご連絡は以下アドレスまでお願いします★
オープンソースリップシンクエンジン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のコマンドプロンプトでテキストをコピーする