📖

[Astar]エラー備忘録16( Shibuyaから「get」関数などを行うとエラーが出る)

2023/03/11に公開

次のエラーが出たため、備忘録として残します。

1 結論

エラー発生状況: Shibuyaから「get」関数などを行うとエラーが出る(error { Err: { Module: { index: 70 error: 0x02000000 } } })

結論:gasLimitの設定を修正する。

2 内容

「flipper」コントラクトをshibuyaにデプロイし、get()を実行したところ、下のエラーが出ました。

error { Err: { Module: { index: 70 error: 0x02000000 } } }

まさに同じ内容がこちらにありました。

https://substrate.stackexchange.com/questions/6401/smart-contract-function-call-error

まずは、こちらをインポートします。
「@polkadot/util」と「@pplkadot/types/interfaces」を利用します。

import { BN, BN_ONE } from "@polkadot/util";
import type { WeightV2 } from '@polkadot/types/interfaces'

今回特に大事なのが、トランザクションの重みを表す型である、「WeightV2」です。

そして、それを利用するために、「BN」(Big Number)を利用しています。

chatGPT

下のように、定数として、「MAX_CALL_WEIGHT」と「PROOFSIZE」を定義しています。

const MAX_CALL_WEIGHT = new BN(5_000_000_000_000).isub(BN_ONE);
const PROOFSIZE = new BN(1_000_000);

こちらにあるように、「MAX_CALL_WEIGHT」はスマートコントラクトが使用できる、最大のトランザクションの重みを、「PROOFSIZE」は証明のサイズを示します。

それらを下のように設定します。

const storageDepositLimit = null;

const { gasRequired } = await contract.query.flip(
  account.address,
  {
    gasLimit: api?.registry.createType('WeightV2', {
      refTime: MAX_CALL_WEIGHT,
      proofSize: PROOFSIZE,
    }) as WeightV2,
    storageDepositLimit,
  }
);

ここで大事なのが、gasLimitが「WeightV2」型であるということです。

この型は、「refTime」と「proofSize」をプロパティに持ち、先ほどの「MAX_CALL_WEIGHT」と「PROOFSIZE」を設定します。

これでできると思います。

参考までに、該当箇所を下に貼ります。

以上です

import { ApiPromise, WsProvider } from '@polkadot/api';
import { ContractPromise } from '@polkadot/api-contract';
import { BN, BN_ONE } from "@polkadot/util";
import type { WeightV2 } from '@polkadot/types/interfaces'
import '@polkadot/api-augment'

import metadata from "./metadata.json";

const inter = Inter({ subsets: ['latin'] })
const ALICE = "5D2MwJP4v1TeauSooBvJ8ueUyxtmrqpq6FpJTXbENwWSzn8M"

const MAX_CALL_WEIGHT = new BN(5_000_000_000_000).isub(BN_ONE);
const PROOFSIZE = new BN(1_000_000);
const storageDepositLimit = null;

async function main () {
  // Initialise the provider to connect to the local node
  const provider = new WsProvider('wss://rpc.shibuya.astar.network');

  const api = await ApiPromise.create({ provider});

  const contract = new ContractPromise(api, metadata, "YWkppgzx5oZAHLWRDymDnftRBt64okRqNCdufdifFgfjmSH")

  console.log("contract", contract.address.toString())

  const { gasRequired, storageDeposit, result, output }  = await contract.query.get(ALICE,
    {
      gasLimit: api?.registry.createType('WeightV2', {
        refTime: MAX_CALL_WEIGHT,
        proofSize: PROOFSIZE,
      }) as WeightV2,
      storageDepositLimit,
    },)

  console.log("output", output)

  // The actual result from RPC as `ContractExecResult`
  console.log(result.toHuman());

  // the gas consumed for contract execution
  console.log(gasRequired.toHuman());

  }

main().catch(console.error);

Discussion