アプリケーション開発ポータルサイト
ServerNote.NET
カテゴリー【JavaScript仮想通貨
window.ethereum.requestに渡すdataフィールドをABIエンコードで作成する
POSTED BY
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でコントラクト関数を引数つきでコールしプロパティを取得する

を参照されたい。以下ページも参考になる。

https://javascript.hotexamples.com/jp/examples/web3-eth-abi/-/encodeFunctionCall/javascript-encodefunctioncall-function-examples.html

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

【キーワード検索】