Scripts

[Previous << Proving Ownership of a Flow Account](https://qiita.com/flowcadence/items/6032594d047c635939c3)
[Next >> Transactions](https://qiita.com/flowcadence/items/318a428e8c006dc2497f)

https://qiita.com/flowcadence/items/3073d69c6e9895e68b5a#reference-2020832ebee1810a325a

スクリプトは、Flowブロックチェーン上で非永続的なCadenceスクリプトを実行できます。スクリプトはデータを返すことができます。

スクリプトは、常に`access(all) fun main()`関数をエントリーポイントとする必要があります。

`fcl.query`は、Cadence scriptsをブロックチェーンに送信し、デコードされたレスポンスを受けとる関数です。

`query`関数に送信されるオブジェクト内の`cadence`のキーは、Cadenceコードを渡すことができる[JavaScript Tagged Template Literal](https://styled-components.com/docs/advanced#tagged-template-literals)です。

<h1>Sending your first Script</h1>

次のコードでは、Flowブロックチェーンにスクリプトを送信します。このスクリプトは2つの数値を足し算し、その結果を返します。
```ruby
import * as fcl from "@onflow/fcl"

const response = await fcl.query({
  cadence: `
    access(all) fun main(): Int {
      return 1 + 2
    }
  `
})

console.log(response) // 3
```

<h1>A more complicated Script</h1>

[Resource](https://qiita.com/flowcadence/items/f9b95df70c80a90d3a20)や[Struct](https://qiita.com/flowcadence/items/d15aeb14b6bbddd9e717#structures)のようなものは、Cadenceではかなり一般的です。
次のコード・スニペットでは、スクリプトが`Point`というStructを定義し、そのリストを返します。

JavaScriptでStructに最も近いものはobjectです。この場合、このレスポンスをデコードすると、オブジェクトの配列が返されることが期待されます。オブジェクトには`x`および`y`の値があります。
```ruby
import * as fcl from "@onflow/fcl"

const response = await fcl.query({
  cadence: `
    access(all) struct Point {
      access(all) var x: Int
      access(all) var y: Int

      init(x: Int, y: Int) {
        self.x = x
        self.y = y
      }
    }

    access(all) fun main(): [Point] {
      return [Point(x: 1, y: 1), Point(x: 2, y: 2)]
    }
  `
})

console.log(response)
/* [{x:1, y:1}, {x:2, y:2}] */
```
<h1>Transforming the data we get back with custom decoders.</h1>

私たちのdappでは、おそらくこれらCadenceの値を内部で表現する方法を持っているでしょう。上記の例では、それは`Point`クラスに該当するかもしれません。

FCLにより、私たちはカスタムデコーダーを提供することが可能であり、エッジでFlowブロックチェーンから受け取ったデータを、dappがそれを見る前に変換することができます。

私たちはこれらのカスタムデコーダーを、[FCLの設定](https://qiita.com/flowcadence/items/b85a6df60a980c8e1dc1)で追加します。これにより、dappの起動時に一度設定するだけで、dappの残りの部分では正規化されたデータを使用することができます。

以下の例では、`Point`の概念を再び使用します。しかし今回は、カスタムデコーダーを追加し、`fcl.decode`がそれをカスタムJavaScriptの `Point` classに変換できるようにします。

```ruby
import * as fcl from "@onflow/fcl"

class Point {
  constructor({ x, y }) {
    this.x = x
    this.y = y
  }
}

fcl.config()
  .put("decoder.Point", point => new Point(point))
  /* この部分がobjectをclassに変換しています */

const response = await fcl.query({
  cadence: `
    access(all) struct Point {
      access(all) var x: Int
      access(all) var y: Int

      init(x: Int, y: Int) {
        self.x = x
        self.y = y
      }
    }

    access(all) fun main(): [Point] {
      return [Point(x: 1, y: 1), Point(x: 2, y: 2)]
    }
  `
})

console.log(response)
/* [Point{x:1, y:1}, Point{x:2, y:2}] */
```
To learn more about `query`, check out the [API documentation](https://qiita.com/flowcadence/items/82c4e2d91df09051b1de#query%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%97%E3%83%88).

*Last updated on **Nov 21, 2024** by **Jordan Ribbink***

翻訳元

https://developers.flow.com/tools/clients/fcl-js/scripts

***
<b>[Previous << Proving Ownership of a Flow Account](https://qiita.com/flowcadence/items/6032594d047c635939c3)
</b>

[Flow blockchain / Cadence version1.0ドキュメント](https://qiita.com/flowcadence/items/3073d69c6e9895e68b5a) (Scripts)

<b>[Next >> Transactions](https://qiita.com/flowcadence/items/318a428e8c006dc2497f)</b>