Previous << Transactions
Next >> Fees
スクリプトは、ブロックチェーンのデータを照会するための軽量なメソッドを提供しています。
これは実行が可能なCadenceコードであり、Flow実行状態のデータ(Flow execution state data)を照会することはできますが、それを変更することはできません。
Flowのトランザクションとは異なり、スクリプトは署名されず、トランザクション手数料も必要ありません。また、トランザクションとは異なり、スクリプトは呼び出し元に値を返すことができます。スクリプトの実行は、読み取り専用操作であり、Ethereumのeth_call
RPCメソッドと非常に似ていると考えることができます。
スクリプトは現在、アクセスノードの設定に基づいて、アクセスノードまたは実行ノードのどちらかで実行されます。
スクリプトは、Cadenceコードで次のように定義されます:
/* The 'main' function is the entry point function and every script needs to have one.*/
access(all) fun main() {
/* Cadence statements to be executed go here */
}
スクリプトは型付けられた値を返すことができます。
access(all) fun main(): Int {
return 1 + 2
}
スクリプトは引数も受け取ることができます。
access(all) fun main(arg: String): String {
return "Hello ".concat(arg)
}
スクリプトはコントラクト関数を呼び出し、コントラクトのステートをクエリーすることができます。他のコントラクト上の関数を呼び出すには、それをそのアドレスからインポートし、そして関数を呼び出します。
import World from 0x01
access(all) fun main(): String {
return World.hello()
}
スクリプトは過去のブロックに対しても実行でき、Flowネットワークから過去のデータを照会することができます。これは、スマートコントラクトの過去のステータスを取得したり、時間の経過に伴う変更を追跡したりする際に特に便利です。
When to use a script?
スクリプトは、以下の用途に使用できます。
- トランザクションを送信する前に検証する。例えば、支払者に十分な残高があるか、受信者のアカウントがトークンやNFTなどを受信するために正しく設定されているかなどを確認する。
- 長期間にわたってオンチェーンデータを収集する。
- バックグラウンドジョブを通じて継続的にアカウントを検証する。例えば、Discordのボットを使ってユーザーをFlowアカウントで検証する。
- コアコントラクトのクエリー(例えば、ステーキングやエポック関連の情報を問い合わせについてはStaking Scripts and Eventsを参照してください、他のコアコントラクト関連のスクリプトについては、core contract transactionsの各スクリプトディレクトリを参照してください)。
Executing Scripts
Access API
スクリプトはアクセスノードが提供するアクセスAPIに送信することで実行できます。現在、(最新のブロック、以前のブロック高さ、または以前のブロックIDで)スクリプトを実行できる3つのAPIエンドポイントがあります。それらに関する詳細な情報は、こちらでご確認ください:
上記APIを実装した複数のSDKが、さまざまな言語向けに提供されています。
Find a list of all SDKs here
Flow CLI
Flow CLI を使用してスクリプトを実行することもできます。
flow scripts execute ./helloWorld.cdc
ユーザーは独自のスクリプトを定義することも、FLIXサービスを使用して、コントラクト作者によって既に定義済みのスクリプトを使用することもできます。
Best Practices
効率的なスクリプトの書き方に関するいくつかの推奨事項を以下に示します。
- よりシンプルで短いスクリプト:スクリプトはトランザクションと同様に、計算制限(computation limits)の対象となります(limitationsを参照)。より短い、よりシンプルなスクリプトを実行し、時間複雑性が低い状態にすることで、より迅速なレスポンスが得られます。複数のネストされたループ、長い反復処理、または多くのオンチェーンフィールドを照会するスクリプトがある場合は、スクリプトロジックを簡素化することを検討してください。
- ステートの読み取りを少なくする:スクリプトは実行状態(execution state)を読み取ります。より高速なレスポンスを得るには、スクリプトが読み取るステートの量を制限することが最善です。
- 配列またはディクショナリ型の引数の長さを短くする:スクリプトが配列または辞書を引数として必要とし、各要素がステートの参照を引き起こす場合、長いリストを渡して1回のスクリプト呼び出しを行うのではなく、配列またはディクショナリのより小さいサブセットで複数回呼び出します。
-
NFTCatalog: スクリプトでNFTCatalog関数を使用している場合は、最新の関数を使用し、
getCatalog()
などの非推奨(deprecated)関数は使用しないようにしてください。
Limitations
- レート制限 - スクリプトの実行は、アクセスノードおよび実行ノードによって課されるAPIレート制限に従う必要があります。QuickNodeがホストするパブリックアクセスノードのレート制限については、こちらに概要が記載されています。
- Computation limit(計算リミット) - トランザクションと同様に、各スクリプトは計算リミットにも従う必要があります。 具体的な値は、個々のアクセスノードおよび実行ノードのオペレーターによって設定することができます。 現在、スクリプトのデフォルトの計算(ガス)リミットは100,000です。
-
Historic block data limit(過去ブロックデータのリミット)
ⅰ. 実行ノード上でのスクリプトの実行は、直近の約100ブロックに制限されています。 過去のブロック(ブロックIDまたはブロック高さで指定)の実行ノード上でのスクリプト実行をリクエストしても、そのブロックが100ブロック以上前のものである場合は失敗します。
ⅱ. アクセスノード上でのスクリプトの実行は、直近の100ブロックをはるかに超えることも可能ですが、直近のネットワークアップグレード(HCUまたはspork)が発生した時点までの高さに制限されます。
Last updated on Dec 11, 2024 by Chase Fleming
翻訳元
Flow BlockchainのCadence version1.0ドキュメント (Scripts)
Flow BlockchainのCadence version1.0ドキュメント (Flow Fees)