アプリケーション開発ポータルサイト
ServerNote.NET
カテゴリー【JavaScript仮想通貨
【MetaMask】window.ethereumのeth_callで任意のコントラクト関数を呼ぶ
POSTED BY
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エンコードで作成する

※本記事は当サイト管理人の個人的な備忘録です。本記事の参照又は付随ソースコード利用後にいかなる損害が発生しても当サイト及び管理人は一切責任を負いません。
※本記事内容の無断転載を禁じます。
【WEBMASTER/管理人】
自営業プログラマーです。お仕事ください!
ご連絡は以下アドレスまでお願いします★

【キーワード検索】