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でコントラクト関数を引数つきでコールしプロパティを取得する
を参照されたい。以下ページも参考になる。
※本記事内容の無断転載を禁じます。
ご連絡は以下アドレスまでお願いします★
CUDA13環境下でGPU使用版のllama-cpp-pythonを導入する
CUDA13環境下でGPU使用版のPyTorchを導入する
LetsEncrypt/certbotの証明書自動更新がエラーになる場合
Wav2Lipのオープンソース版を改造して外部から呼べるAPI化する
Wav2Lipのオープンソース版で静止画の口元のみを動かして喋らせる
【iOS】アプリアイコン・ロゴ画像の作成・設定方法
オープンソースリップシンクエンジンSadTalkerをAPI化してアプリから呼ぶ【2】
オープンソースリップシンクエンジンSadTalkerをAPI化してアプリから呼ぶ【1】
【Xcode】iPhone is not available because it is unpairedの対処法
【Windows10】リモートデスクトップ間のコピー&ペーストができなくなった場合の対処法
Windows11+WSL2でUbuntuを使う【2】ブリッジ接続+固定IPの設定
CUDA13環境下でGPU使用版のPyTorchを導入する
【Apache】サーバーに同時接続可能なクライアント数を調整する
LinuxからWindowsの共有フォルダをマウントする
【C/C++】小数点以下の切り捨て・切り上げ・四捨五入
CUDA13環境下でGPU使用版のllama-cpp-pythonを導入する
size_tとssize_tを使い分けてSegmentation Faultを予防する
Ubuntuでapt updateが404 Note Foundなどでエラーになる場合