Accounts

[Previous << Collections](https://qiita.com/flowcadence/items/a3f85e924b5aec3e2624)
[Next >> Transactions](https://qiita.com/flowcadence/items/6393a2af33f82475a7ca)

https://qiita.com/flowcadence/items/3073d69c6e9895e68b5a#flow-developers

:::note info
INFO
Flow上のEVM Accountsに関する情報を探しているEVM開発者の方ですか?  その場合は、EVM固有のドキュメントを[こちら](https://developers.flow.com/evm/accounts)でご確認ください。
:::

Flowのアカウントは、チェーン状態(chain state)の中のレコードであり、以下の情報を保持しています。
* Address：アカウントの固有識別子
* Public Keys：アカウントで認証された公開鍵
* Code：アカウントにデプロイされたCadenceコントラクト
* Storage：アカウントのリソース資産を保存する領域。

アカウントとその鍵は、Flowブロックチェーンの状態(ステート)を変更するトランザクションを署名するために必要です。トランザクションを実行するには、"[Fee](https://qiita.com/flowcadence/items/c4c24a01ec3d6b7429e2)" と呼ばれる少量のFlow(トークン)を、アカウントから支払うか、ウォレットまたはサービスから支払いが補助される必要があります。Flowは、データ構造やリソースを保存するために、各アカウントに[固定量のストレージ](https://qiita.com/flowcadence/items/c4c24a01ec3d6b7429e2#storage)を割り当てています。アカウントには、スマートコントラクトのコードを含めることで、トランザクションやスクリプトがブロックチェーンの状態(ステート)を照会したり変更したりするために使用することができます。

アカウントの簡単な表現図：
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3912821/1c8454f7-2d52-0935-1691-2b5585124876.png)

<h1>Address</h1>

Flowアドレスは(16桁の)16進数文字列で表されます（通常は16進数であることを示すために`0x`が頭に付けられます）。ビットコインやイーサリアムとは異なり、Flowアドレスは暗号化公開鍵から派生したものではありません。代わりに、各Flowアドレスはオンチェーンの決定論的シーケンスを使用して、Flowプロトコルによって割り当てられます。このシーケンスではエラー検出コードを使用しており、すべてのアドレスが少なくとも2桁の16進数文字で異なることを保証しています。これにより、タイプミスによる資産の偶発的な損失は発生しません。

この(アドレスと公開鍵の)分離はFlow独自の利点であり、1つのアカウントに複数の公開鍵を関連付けることや、1つの公開鍵を複数のアカウントで使用することが可能です。

<h1>Balance</h1>

Mainnetで作成された各Flowアカウントは、デフォルトで[残高を保持する(FungibleToken標準の一部の)Flow金庫を保有](https://developers.flow.com/build/basics/flow-token)します。この残高は、[トランザクション手数料やストレージ費用](https://qiita.com/flowcadence/items/c4c24a01ec3d6b7429e2)の支払いに使用されます。詳細は手数料に関する文書をご覧ください。
(補足: ストレージ費用は実際には支払いません。ある程度残高がないとストレージを持てず、それ以下には残高を減らせない、が正しいです)

:::note warn
WARNING
アカウントに設定できる最小のFLOW額は**0.001**です。 (補足: **0.001**=ストレージ費用)
:::

この最低ストレージ料金はアカウント作成者によって提供され、100kBまでのデータを永久に保存する費用をカバーします。この料金は一度だけ適用され、アカウントに追加のストレージを追加するために「上乗せ」することができます。最低アカウント保有分は、誰かがアカウントに（NFTなど）何かを預け入れた場合でも、ほとんどのアカウントでストレージ容量が不足することはありません。

<h3>Maximum available balance</h3>

ストレージの制限により、ユーザーがウォレットから引き出せる残高には上限があります。コアコントラクトである[`FlowStorageFees`](https://qiita.com/flowcadence/items/0f41148ca231a09d1efb#flowstoragefees)は、その値を取得する関数を提供しています。
```ruby
import "FlowStorageFees"

access(all) fun main(accountAddress: Address): UFix64 {
  return FlowStorageFees.defaultTokenAvailableBalance(accountAddress)
}
```
あるいは、開発者は`Account`の`availableBalance`プロパティを使用することもできます。
```ruby
access(all) fun main(address: Address): UFix64 {
  let acc = getAccount(address)
  let balance = acc.availableBalance

  return balance
}
```
<h1>Contracts</h1>

アカウントには、オプションで複数の[Cadenceスマートコントラクト](https://qiita.com/flowcadence/items/91a5ecb5812af1f98bef)を保存できます。コードは、人間が読めるUTF-8エンコード文字列として保存されるため、誰でも簡単に内容を検査できます。

<h1>Storage</h1>

各Flowアカウントには、関連するストレージと容量があります。アカウントのストレージ使用量は、アカウントのストレージに保存されているすべてのデータのバイトサイズです。アカウントの[ストレージ容量は、アカウントが保有するFlowトークンの残高に直接関連しています](https://qiita.com/flowcadence/items/c4c24a01ec3d6b7429e2#storage)。アカウントは、追加費用なしで、ストレージ容量までのストレージを任意の量使用することができます。トランザクションによりアカウントのストレージ容量を超過した場合、またはアカウントの残高が最低0.001 Flowトークンを下回った場合、そのトランザクションは失敗し、取り消されます。

<h1>Account Keys</h1>

Flowアカウントは、アクセスを制御するために使用される複数の公開鍵で構成することができます。それに一致する秘密鍵の所有者は、アカウントの状態(ステート)を変更するためにトランザクションに署名することができます。

アカウント作成時に、アカウントとのやり取りに使用する公開鍵を指定することができます。アカウントの鍵は、トランザクションを送信することで追加、削除、または無効にすることができます。これは、アカウントが単一の公開鍵/秘密鍵のペアに紐づけられているイーサリアムのようなブロックチェーンとは根本的に異なります。

各アカウントの鍵には、署名のパワーを決定する重みがあります(a weight that determines the signing power)。

:::note warn
WARNING
署名の重みが合計で、閾値である**1000**(weight threshold)以上でなければ、アカウントにアクセスするトランザクションは認証されません。
:::
例えば、アカウントには3つのキーを持っており、それぞれに500の重みがあるかもしれません。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3912821/a9012d30-c2f3-091c-353e-ad74c86c0e8b.png)

これは、3分の2のマルチシグの定足とする数を表しており、3つの鍵のうち*少なくとも*2つから署名を受け取れば、そのトランザクションはアカウントへのアクセスが許可されます。

アカウントキーには以下の属性が含まれます。
* **ID**アカウント内のキーを識別します
* **公開鍵** （バイトとしてエンコードされた）生の公開キー
* **署名アルゴリズム** (下記参照)
* **ハッシュアルゴリズム** (下記参照)
* **重み** 0～1000の間の整数
* **Revoked** キーが無効化されているか、有効であるか
* **シーケンス番号** このキーで署名されるトランザクションが送信されるごとに増加する番号

<h3>Signature and Hash Algorithms</h3>

署名とハッシュのアルゴリズムは、署名プロセス中に使用され、特定の定義しておいた値に設定することができます。

ECDSAアルゴリズムで一般的に使用される曲線は2つあり、secp256r1（[OID 1.2.840.10045.3.1.7](https://oid-rep.orange-labs.fr/get/1.2.840.10045.3.1.7)、別名「NIST P-256」でこのカーブはモバイルの安全な飛地サポートに一般的です）とsecp256k1（[OID 1.3.132.0.10](https://oid-rep.orange-labs.fr/get/1.3.132.0.10)、 「ビットコイン」で使用されている曲線）です。鍵を登録する前に、使用するパラメータを必ず再確認(double-check)してください。コードやフォーマットが別の曲線を使用している鍵を提示するとエラーが発生します。

| Algorithm | Curve | ID | Code |
|:-:|:-:|:-:|:-:|
| ECDSA | P-256 | ECDSA_P256 | 2 |
| ECDSA | secp256k1 | ECDSA_secp256k1 | 3 |

*ここに記載されているコードは、ノードAPIで使用される署名アルゴリズム用のものです。[Cadenceで定義されている](https://qiita.com/flowcadence/items/1bdc645b097a5efbb9cf)ものとは異なりますのでご注意ください。*

| Algorithm | Output Size | ID | Code |
|:-:|:-:|:-:|:-:|
| SHA-2 | 256 | SHA2_256 | 1 |
| SHA-3 | 256 | SHA3_256 | 3 |

ハッシュアルゴリズムと署名アルゴリズムは互換性があるため、そのセットの中から自由に選択できます。

<h3>Locked / Keyless Accounts</h3>

Flow上のアカウントは、存在するためにキーを必要としませんが、そうしてしまうと、アカウントを変更できるトランザクションに一切署名できない為、そのアカウントは不変となります。これは、アカウントのスマートコントラクトコードを凍結したい(一切変更出来なくする)場合に有用であり、また、複数のアカウントタイプを持つ（Ethereumの場合のように）という問題をエレガントに解決します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3912821/343eb34e-a9f0-0aed-e2d2-96c9e587f484.png)

キーレスアカウントは、(同じキーで署名された)アカウントから既存の公開鍵を削除し、アカウントのキーがすべてなくなるまでその操作を繰り返すか、キーを割り当てない新しいアカウントを作成することで作成できます。Account Linkingでは、キーを持たない子アカウントを親アカウントで管理することも可能です。

:::note alert
DANGER
既存のアカウントからキーを削除する際には注意が必要です。アカウントの総キー重量が1000未満になると、それ以上変更できなくなるためです。
:::

<h3>Multi-Sig Accounts</h3>

マルチシグネチャのアカウント作成は、アカウントキーとその重み付けを管理することで簡単に実現できます。繰り返しになりますが、トランザクションに署名するには、署名に使用するキーの重み付けの合計が少なくとも1000以上でなければなりません。この情報を使用すれば、以下のケースをどのように実現できるかを簡単に確認できます。

**2-of-3 multi-sig quorum**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3912821/1f9253cb-3c80-d7dc-51c2-2fb605cf9f34.png)

**3-of-3 multi-sig quorum**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3912821/844b0498-4352-5f70-b950-2fde1c5b2747.png)

**1-of-2 signature**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3912821/22d63b2a-1712-018f-3ee7-8af3263bb18f.png)

<h3>Key Format</h3>

Flowは、`P-256`と`secp256k1`曲線のECDSAをサポートしています。これらの曲線では、公開鍵は64バイトにエンコードされ、`X||Y`として表されます。ここで`||`は結合演算子です。
* `X`は32バイトであり、公開鍵の`x`座標のビッグエンディアンバイトエンコーディングです。すなわち、`X=x_31||x_30||...||x_0` つまり、`X = x_31*256^31 + ... + x_i*256^i + ... + x_0`です。
* `Y`は32バイトであり、公開鍵の`y`座標のビッグエンディアンバイトエンコーディングです。すなわち、`Y=y_31||y_30||...||y_0` つまり、`Y = y_31*256^31 + ... + y_i*256^i + ... + y_0`です。
* 
<h1>Account Creation</h1>

Flowブロックチェーン上に、特別な[アカウント作成Cadence関数](https://qiita.com/flowcadence/items/5ddbb79fe8438850cf57#creating-an-account)を呼び出すことで、アカウントが作成されます。アカウントが作成されると、私達はそのアカウントに新しいキーを関連付けることができます。もちろん、これらすべては単一のトランザクション内で実行できます。アカウント作成には手数料がかかることにご注意ください。アカウント作成手数料は比較的安価であり、ユーザーが初めて法定通貨を($FLOW)暗号通貨に交換する際に、ウォレットプロバイダーや取引所がその費用を負担すると予想されます。

開発目的の場合、[Flow CLI を使用して、エミュレーターやテストネット、メインネットのアカウントを簡単に作成することができます](https://qiita.com/flowcadence/items/4348fc03cefc88920920)。アカウント作成料は、資金管理ウォレット(a funding wallet)によって支払われるため、アカウントを作成する際に既存のアカウントは必要ありません。

<h3>Key Generation</h3>

鍵は安全なやり方で生成されるべきです。鍵の用途に応じて、異なるレベルの注意意識が必要となります。

:::note warn
WARNING
秘密鍵にアクセスできる人は誰でも、その鍵に紐付けられているアカウントの情報を変更することができます（十分な重み(weight)がある場合）。鍵の保存には十分注意してください。
:::
本番キーを安全に管理することについては、[Google key management](https://cloud.google.com/security/products/security-key-management)や[Amazon KMS](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/Overview.Encryption.Keys.html)などのキー管理サービスのご利用をお勧めします。これらのサービスは、Flowの CLI および SDK でもサポートされています。これらのサービスは、アプリケーションに統合すると非常に便利です。ただし、個人利用の場合は、[既存のウォレット](https://developers.flow.com/ecosystem/wallets)や[ハードウェアの Ledger ウォレット](https://developers.flow.com/ecosystem/wallets)を使って安全を確保できます。

<h1>Service Accounts</h1>

<h3>Flow Service Account</h3>

サービスアカウントは、Flowの特別なアカウントで、システムコントラクトを管理するための特別な権限が与えられています。それは、トークンを発行し、手数料を設定し、ネットワークレベルのコントラクトを更新することができます。

<h3>Tokens & Fees</h3>

サービスアカウントはFLOWトークンのスマートコントラクトに管理者としてアクセスできるため、トークンの発行と焼却の権限があります。また、トランザクション手数料スマートコントラクトにもアクセスでき、Flowでのトランザクション実行時に課される手数料を調整することができます。

<h3>Network Management</h3>

サービスアカウントは、エポックや（将来的には）バリデータのステーキングのオークションなど、Flowネットワークのさまざまな側面を管理するその他のスマートコントラクトを管理します。
<h3>Governance</h3>

特別な権限の他は、サービスアカウントはFlowにおける他のアカウントと同じです。サービスアカウントは現在、Flowコミュニティが管理するスマートコントラクトによって制御されています。サービスアカウントからのトランザクションを一方的に実行できる権限を持つ主体は存在しません。これは、管理するキーによる4つの署名が必要なためです。Flow財団は管理するキーのうち3つを管理しており、残りの管理キーは信頼のおけるコミュニティのメンバーや組織によって管理されています。

<h1>Accounts Retrieval</h1>

Flow CLI を使用して、次のコマンドを実行することでアカウントのデータを取得できます。
```ruby
flow accounts get 0xf919ee77447b7497 -n mainnet
```
コマンドの詳細については、[CLI ドキュメントで確認してください](https://qiita.com/flowcadence/items/aa31ec968844f6f79ad6)。

アカウントの情報はアクセスノード API から取得できます。現在、gRPC と REST API の 2 種類があります。それらに関する詳細情報は、こちらでご確認ください：

**gRPC API** [building-on-flow/nodes/access-api#accounts](https://developers.flow.com/networks/node-ops/access-onchain-data/access-nodes/accessing-data/access-api#accounts)

**REST API** [http-api#tag/Accounts](https://developers.flow.com/http-api#tag/Accounts)

上記APIを実装した複数のSDKが、さまざまな言語向けに提供されています。

**Javascript SDK** [tools/clients/fcl-js](https://qiita.com/flowcadence/items/4174cc0ae785b1ddb1d6)

**Go SDK** [tools/clients/flow-go-sdk](https://qiita.com/flowcadence/items/3616deed7fbb2d69f91e)

すべての SDK の一覧は、こちらを参照してください：[tools/clients](https://qiita.com/flowcadence/items/4d0e75b7f49d02f75445)

*Last updated on **Dec 9, 2024** by **Alex***

翻訳元

https://developers.flow.com/build/basics/accounts

***

<b>[Previous << Collections](https://qiita.com/flowcadence/items/a3f85e924b5aec3e2624)
</b>

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

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