2023-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でコントラクト関数を引数つきでコールしプロパティを取得する
を参照されたい。以下ページも参考になる。
※本記事内容の無断転載を禁じます。
ご連絡は以下アドレスまでお願いします★
Windowsのデスクトップ画面をそのまま配信するための下準備
WindowsでGPUの状態を確認するには(ASUS系監視ソフトの自動起動を停止する)
CORESERVER v1プランからさくらインターネットスタンダートプランへ引っ越しメモ
さくらインターネットでPython MecabをCGIから使う
さくらインターネットのPHPでAnalytics-G4 APIを使う
インクルードパスの調べ方
【Git】特定ファイルを除外する.gitignore
【Ubuntu/Debian】NVIDIA関係のドライバを自動アップデートさせない
【Python】Spacyを使用して文章から出発地と目的地を抜き出す
【Windows10】リモートデスクトップ間のコピー&ペーストができなくなった場合の対処法
Windows11+WSL2でUbuntuを使う【2】ブリッジ接続+固定IPの設定
Windows版Google Driveが使用中と言われアンインストールできない場合
VirtualBoxの仮想マシンをWindows起動時に自動起動し終了時に自動サスペンドする
【Apache】サーバーに同時接続可能なクライアント数を調整する
【C/C++】小数点以下の切り捨て・切り上げ・四捨五入
Googleファミリーリンクで子供の端末の現在地がエラーで取得できない場合
【Linux】iconv/libiconvをソースコードからインストール
Ubuntu Server 21.10でイーサリアムブロックチェーン【その5】