User Signature

[Previous << Provable Authn](https://qiita.com/flowcadence/items/a6e223893ba142f54df6)
[Next >> ブロックチェーンゲームの作り方1 - 基本編Part1](https://qiita.com/flowcadence/items/8cc25249cda37364cac1)

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

<h1>Status</h1>

* Last Updated: June 1st 2021
* Stable: Yes
* Risk of Breaking Change: Low
* Compatibility: `>= @onflow/fcl@0.0.71`


<h1>Overview and Introduction</h1>

**FCL対応ウォレットでデータを個人的に署名する**

**FCL**は現在、`signUserMessage()`が新たに追加されおり、接続されたウォレットプロバイダーやユーザーのプライベートキーで署名されるサービスに対し、暗号化されていないメッセージデータを送信することができます。

アプリケーションまたはサービスは、**Flow Blockchain**上のユーザーの公開キーに対して署名を検証し、ユーザーがアカウントのプライベートキーを管理していることを証明することができます。

**Use Cases**
* **Authentication**: Cryptographically verify the ownership of a Flow account by signing a piece of data using a private key
* **Improved Application Login**
  * **Increased security**: Arguably more secure than proof of ownership by email/password
  * **Simplified UX**: No application password required
  * **Increased privacy**: No email or third party authentication service needed
* **Message Validation**: Assuring that a message sent or received has not been tampered with
* **Multisig contracts**
* **Decentralised exchanges**
* **Meta transactions**

<h1>Config and Authentication</h1>

前提条件として、**FCL**はWallet Provider's Authentication Endpointを指すように設定されています。追加の設定は必要ありません。
> 開発中（およびメインネット上で）は、**Wallet Discovery Url**をウォレットプロバイダーの**Authentication Endpoint**に設定することで、FCLに直接ウォレットを使用するように設定できます。fclを次のように設定します。
`config().put("discovery.wallet", "https://my-awesome-wallet-provider.com/fcl/authenticate")`

Common Configuration Keysと追加情報は、[How to Configure FCL](https://qiita.com/flowcadence/items/b85a6df60a980c8e1dc1)でご覧いただけます。
1. ユーザーがアプリケーションのUIを介してウォレットプロバイダーとの認証を開始する
1. ウォレットがユーザーの識別情報を確認し、アプリケーション内で将来のユーザーの操作のために**FCL**に設定するのに使用する情報を返信します
1. 認証レスポンスには、`signUserMessage()`で使用する`user-signature`サービスを含むプロバイダーのKey Servicesを含める必要があります

<h1>User Signature Service</h1>

[ユーザー署名サービス](https://github.com/onflow/fcl-js/blob/master/packages/fcl-core/src/normalizers/service/user-signature.js)は標準サービスであり、**IFRAME/RPC**または**HTTP/POST**のメソッドを使用します。

`user-signature`サービスは**FCL**から署名可能なメッセージを受け取り、[CompositeSignatures](https://github.com/onflow/fcl-js/blob/8e53ac59636e28cdcfa2494de6cb278e71bc14c2/packages/fcl/src/current-user/normalize/composite-signature.js#L4)の配列または`null`をデータとして含む標準の[PollingResponse](https://github.com/onflow/fcl-js/blob/8e53ac59636e28cdcfa2494de6cb278e71bc14c2/packages/fcl/src/current-user/normalize/polling-response.js#L5)を返します。

**Approved**のステータスは、複合署名の配列をdataとし持つ要があります。

**Declined**のステータスは、その理由を含む必要があります。

**Pending**のステータスは、updatesサービスを含める必要があり、localを含めることができます。 `IFRAME/RPC` メソッドを使用するサービスは、iframe ではpendingが有効ではないため、approvedかdeclinedのレスポンスのみ可能です。

`signUserMessage()`がアプリケーションによって呼び出されると、**FCL**はサービスメソッドを使用して、署名可能メッセージをウォレットに送信する方法を決定します。

ウォレットは、正しい`UserDomainTag`を署名可能メッセージの先頭に追加し、メッセージをハッシュ化し、署名する役割を担います。
<h1>Signing Sequence</h1>

1. アプリケーションが署名サービスにメッセージを送信します。**FCLは16進数文字列を期待しています**
1. Wallet/Serviceは、必要な`UserDomainTag`（下記参照）とハッシュをメッセージにタグ付けし、アカウントキー上で指定された`signatureAlgorithm`を使用して署名します
1. Walletは、`addr`、`keyId`、`signature`から構成される、利用できる複合署名を**16進数文字列として**作成します
<h3>UserDomainTag</h3>

`UserDomainTag`は、署名されたユーザースペースのペイロードのすべてのプレフィックスです。

メッセージをハッシュ化および署名する前に、ウォレットは指定のDOMAIN TAGを追加しなければなりません。
> 現在は "FLOW-V0.0-user"

ドメインタグは**UTF-8バイトとしてエンコードされ、32バイトの合計長になるよう右にパディングされ**、メッセージの先頭に追加されます。

これで署名は、Flowブロックチェーン上で検証することができます。以下は、`fcl.verifyUserSignatures`の使用例を示しています。
```ruby
/**
 * Verify a valid signatures for an account on Flow.
 *
 * @param {string} msg - A message string in hexadecimal format
 * @param {Array} compSigs - An array of Composite Signatures
 * @param {string} compSigs[].addr - The account address
 * @param {number} compSigs[].keyId - The account keyId
 * @param {string} compSigs[].signature - The signature to verify
 * @return {bool}
 *
 * @example
 *
 *  const isValid = await fcl.verifyUserSignatures(
 *    Buffer.from('FOO').toString("hex"),
 *    [{f_type: "CompositeSignature", f_vsn: "1.0.0", addr: "0x123", keyId: 0, signature: "abc123"}]
 *  )
 */
```

<h1>TL;DR Wallet Provider</h1>

* **FCL** に登録し、署名サービスエンドポイントを提供します。それ以上の設定は必要ありません。
* メッセージを受け取ると、ユーザーに承認または拒否を促します
* `UserDomainTag` をメッセージの先頭に追加し、ユーザーのキー上で指定された signatureAlgorithm を使用してメッセージをハッシュ化および署名します
* dataとして `CompositeSignatures` の配列と一緒に、もしくは拒否の場合は dataに`null`を、そして `reason`と一緒に、標準の `PollingResponse` を返します。

*Last updated on **Dec 2, 2024** by **Brian Doyle***

翻訳元

https://developers.flow.com/tools/wallet-provider-spec/user-signature

***
<b>[Previous << Provable Authn](https://qiita.com/flowcadence/items/a6e223893ba142f54df6)
</b>

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

<b>[Next >> ブロックチェーンゲームの作り方1 - 基本編Part1](https://qiita.com/flowcadence/items/8cc25249cda37364cac1)</b>