Transactions

[Previous << Scripts](https://qiita.com/flowcadence/items/ef8373ed9471362f7132)
[Next >> Signing and Verifying Arbitrary Data](https://qiita.com/flowcadence/items/81b6d0b7dfce0ad452ff)

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

トランザクションにより、FlowブロックチェーンにCadenceコードを送信して、その状態を恒久的に変更することができます。

トランザクションはスクリプトの一種ですが、より多くの要件があるため、ここの前に[スクリプトのドキュメント](https://qiita.com/flowcadence/items/ef8373ed9471362f7132)をお読みいただいたものとします。

`query`はチェーンにスクリプトを送信するために使用されますが、`mutate`はトランザクションを構築して送信するために使用されます。[スクリプト](https://qiita.com/flowcadence/items/ef8373ed9471362f7132)と同様に、`fcl.mutate`はCadenceコードを渡すことができる[JavaScript Tagged Template Literal](https://styled-components.com/docs/advanced#tagged-template-literals)です。

スクリプトとは異なり、提案者、承認者、支払者などの追加情報を必要とします。そのため、少し混乱するかもしれません。

<h1>Sending your first Transaction</h1>

以下のコード・スニペットには、多くの内容が含まれています。これは、トランザクションをFlowブロックチェーンに送信します。このトランザクションでは、現在のユーザーが`proposer`および`payer`として承認しています。Flowに特有の点として、トランザクションの支払者は、必ずしもトランザクションの実行者である必要はありません。ProposersとPayersは、トランザクションに必ず必要な特別な種類の承認処理です。`proposer`は、Ethereum トランザクションにおける `nonce`と類似した動作をし、繰り返し攻撃を防止するのに役立ちます。`payer`は、トランザクション料の支払者となります。これらの設定がない場合、FCL はすべてのロールに対し現在のユーザーを使うデフォルト設定をします。


`fcl.mutate` は `transactionId` を返します。私たちはこのレスポンスを直接 `fcl.tx` に渡し、そして`onceSealed`メソッドを使用することで、トランザクションがsealedになったときにそのpromiseがresolveされることを確認できます。
```ruby
import * as fcl from "@onflow/fcl"

const transactionId = await fcl.mutate({
  cadence: `
    transaction {
      execute {
        log("Hello from execute")
      }
    }
  `,
  proposer: fcl.currentUser,
  payer: fcl.currentUser,
  limit: 50
})

const transaction = await fcl.tx(transactionId).onceSealed()
console.log(transaction)
/* The transactions status and events after being sealed */
```

<h1>Authorizing a transaction</h1>

以下のコード・スニペットは、1つの非常に重要な違いを除いて、上記のものと同一です。今回のCadenceコードにはprepareステートメントがあり、トランザクションを構築する際に`fcl.currentUser`を使用しています。

`prepare`ステートメントの引数は、`authorizations`配列の中のauthorizationsの順番に直接対応しています。4つのauthorizationsは、`prepare`に渡される引数として4つの`&Account`を持つことを意味します。しかし、この場合、引数は1つだけで、それは`currentUser`です。

これらのauthorizationsは重要です。なぜなら、アカウントのauthorizationを持っている場合のみ、アカウントのストレージにアクセス/変更を行うことができるからです。
```ruby
import * as fcl from "@onflow/fcl"

const transactionId = await fcl.mutate({
  cadence: `
    transaction {
      prepare(acct: &Account) {
        log("Hello from prepare")
      }
      execute {
        log("Hello from execute")
      }
    }
  `,
  proposer: fcl.currentUser,
  payer: fcl.currentUser,
  authorizations: [fcl.currentUser],
  limit: 50
})

const transaction = await fcl.tx(transactionId).onceSealed()
console.log(transaction)
/* The transactions status and events after being sealed */
```
To learn more about `mutate`, check out the [API documentation](https://qiita.com/flowcadence/items/82c4e2d91df09051b1de#mutate%E3%83%88%E3%83%A9%E3%83%B3%E3%82%B6%E3%82%AF%E3%82%B7%E3%83%A7%E3%83%B3).

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

翻訳元

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

***
<b>[Previous << Scripts](https://qiita.com/flowcadence/items/ef8373ed9471362f7132)
</b>

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

<b>[Next >> Signing and Verifying Arbitrary Data](https://qiita.com/flowcadence/items/81b6d0b7dfce0ad452ff)</b>