2022-07-28


の補足。
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でコントラクト関数を引数つきでコールしプロパティを取得する
を参照されたい。以下ページも参考になる。
※本記事内容の無断転載を禁じます。

激安!家電のタンタンショップ販売プログラム3

オシャレなホームページがすぐに手に入る!【ホームページ作成ソフト | とりあえずHP】

一人暮らし向けおしゃれインテリア家具通販サイト【6JOHAN】

精霊のように愛らしいフィギュアがあなたの日常に物語を提供します【spiritale公式】

TVや雑誌で人気♪1万人超の喜びの声★創業40年【パワーストーン ヒラオカ宝石】

サロン開業を支援!業務用エステ機器「ハイパーナイフ」

超簡単!自分で「凄いバナー」が作れる!【バナープラス】

CBDブランド【GREEN BULLDOG】低価格・高濃度・品揃え豊富

オルビスの大人気無油分クレンジング『クレンジングリキッド』販売

bitcoinjs-lib、bip32、bip39を使ってビットコインアドレスを生成する
Cannot read property makeRandom of undefinedと言われた場合
web3.jsとwindow.ethereumでコントラクト関数を引数つきでコールしプロパティを取得する
JavaScriptで外部URLのファイルをダウンロードしてデータを取得する
【MetaMask】window.ethereumのeth_callで任意のコントラクト関数を呼ぶ
window.ethereum.requestに渡すdataフィールドをABIエンコードで作成する
【Solidity】Remix IDEを使用してサーバー不要のコントラクト開発&デバッグ【Ethereum】
【Windows】Googleフォトからダウンロードした動画が音声のみで映像が再生されない場合
PostgreSQLをソースコードからインストールしてsystemdのサービスとして動かす
5chブラウザJane Styleの板一覧にゲーム板等が表示されない場合
Windows版Google Driveが使用中と言われアンインストールできない場合
【Windows10】リモートデスクトップ間のコピー&ペーストができなくなった場合の対処法
Googleスプレッドシートを編集したら自動で更新日時を入れる
【Javascript】JSON配列内にある特定要素の取得法【Node.js】
Ubuntuで固定IPアドレスを使う設定をする
Googleファミリーリンクで子供の端末の現在地がエラーで取得できない場合
【Hackintosh】組立PCにWindowsとmacOSを同居させる場合の注意点
Google ColaboratoryのTensorFlowバージョンを変更する(1.X←→2.X)