📖
[Astar]エラー備忘録16( Shibuyaから「get」関数などを行うとエラーが出る)
次のエラーが出たため、備忘録として残します。
1 結論
エラー発生状況: Shibuyaから「get」関数などを行うとエラーが出る(error { Err: { Module: { index: 70 error: 0x02000000 } } })
結論:gasLimitの設定を修正する。
2 内容
「flipper」コントラクトをshibuyaにデプロイし、get()を実行したところ、下のエラーが出ました。
error { Err: { Module: { index: 70 error: 0x02000000 } } }
まさに同じ内容がこちらにありました。
まずは、こちらをインポートします。
「@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