Accounts

[Previous << Imports](https://qiita.com/flowcadence/items/72c88b02cfc21fd71983)
[Next >> Paths](https://qiita.com/flowcadence/items/9767ec3f9b8d757d75bf)

https://qiita.com/flowcadence/items/3073d69c6e9895e68b5a#cadenceの言語仕様を学ぶ

`Account`型はアカウントへのアクセスを提供します。アカウントは参照([reference](https://qiita.com/flowcadence/items/115d12a5deafc732636d))を通じてのみアクセスされます。その参照は[承認されたもの](https://qiita.com/flowcadence/items/115d12a5deafc732636d#authorized-references)の場合があります。

Accountオブジェクトはアカウントのさまざまな情報を提供し、[アカウントストレージ](https://qiita.com/flowcadence/items/129d58ae7cb962056c6c)、[keys](https://qiita.com/flowcadence/items/19710392d7fb55545db4)、[スマートコントラクト](https://qiita.com/flowcadence/items/c8661fbf9eae32ce5926)、[Capability]()などの管理を可能にします。

```ruby
access(all)
struct Account {

    /* The address of the account. */
    access(all)
    let address: Address

    /* The FLOW balance of the default vault of this account. */
    access(all)
    let balance: UFix64

    /* The FLOW balance of the default vault of this account that is available to be moved. */
    access(all)
    let availableBalance: UFix64

    /* The storage of the account. */
    access(mapping AccountMapping)
    let storage: Account.Storage

    /* The contracts deployed to the account. */
    access(mapping AccountMapping)
    let contracts: Account.Contracts

    /* The keys assigned to the account. */
    access(mapping AccountMapping)
    let keys: Account.Keys

    /* The inbox allows bootstrapping (sending and receiving) capabilities. */
    access(mapping AccountMapping)
    let inbox: Account.Inbox

    /* The capabilities of the account. */
    access(mapping AccountMapping)
    let capabilities: Account.Capabilities
}

entitlement mapping AccountMapping {
    include Identity

    Storage -> SaveValue
    Storage -> LoadValue
    Storage -> CopyValue
    Storage -> BorrowValue

    Contracts -> AddContract
    Contracts -> UpdateContract
    Contracts -> RemoveContract

    Keys -> AddKey
    Keys -> RevokeKey

    Inbox -> PublishInboxCapability
    Inbox -> UnpublishInboxCapability
    Inbox -> ClaimInboxCapability

    Capabilities -> StorageCapabilities
    Capabilities -> AccountCapabilities
}
```

<h1 id="Account-access">Account access</h1>
<h2 id="Performing-read-operations">Performing read operations</h2>

`&Account`に対するアクセスは、それに対する読み取り権限を持つことを意味します。例えば、`address`および`balance`フィールドは`access(all)`修飾子がある為常にアクセスが可能ですが、これは安全です。なぜなら、この情報はpublic且つ読み取り専用だからです。

また、どこからでも(全てのコードは)Built-in関数の`getAccount`を使って、引数にaddressを渡して読み取り専用の`&Account`参照を得ることが出来ます。
```ruby
view fun getAccount(_ address: Address): &Account
```

<h2 id="Performing-write-operations">Performing write operations</h2>

承認されたアカウント参照(`auth(...) &Account`)へのアクセスは、アカウントへの書き込権限を持つことを意味します。

[Entitlement(権限)](https://qiita.com/flowcadence/items/572df270135946f5290e#entitlements)はアカウントの機能へのアクセスを承認します。Cadenceは大まかな粒度と細かな粒度双方のEntitlementを提供しており、これらはアカウントのどの管理機能に対してアクセスを許可するかを決定します。

例えば、大まかな粒度のEntitlementである`Storage`は、ストレージに関する全ての関数(ストレージに値を保存する`save`やストレージから値を取り出す`load`など)に対するアクセスを許可します。

細かな粒度のEntitlementは例えば、`AddKey`は`Account.Keys`の(アカウントにkeyを追加する)`add`関数に対してのみアクセスを許可します。

それゆえ`auth(Storage, AddKey) &Account`といった承認済みのアカウント参照があった場合、それはストレージに対するread accessとwrite accessおよび、アカウントに対して新しいkeyを追加する権限を提供することになります。

[署名済みトランザクション](https://qiita.com/flowcadence/items/0d73ce09c9da04d8b697)において、トランザクションの署名者は承認済みのアカウント参照が取得出来ます。トランザクションの`prepare`フェーズでは、トランザクション内での処理を実行するために必要なEntitlementを正確に明記することが出来ます。

例えば、アカウントにスマートコントラクトをデプロイしようとするトランザクションの場合は以下のように記述します。
```ruby
transaction {
    prepare(signer: auth(AddContract) &Account) {
        signer.contracts.add(name: "MyContract", code: [/* code */])
    }
}
```
ここにおいて、このトランザクションは`AddContract`Entitlementを持つ承認済みの参照をリクエストしています。つまり、このトランザクションはアカウントにスマートコントラクトを追加する事は出来ますが、例えばアカウントに別のキーを追加することはできないということです。

スクリプト(補足: 値の変更が行われないブロックチェーン上の関数呼び出し)の場合は`getAuthAccount`というBuilt-in関数を使用することで、あらゆるアカウントにあらゆるアクセスを行うことが出来ます(補足: 書き換え権限はないのでwrite accessの関数実行は無効になります。ただbalanceなどはアドレスさえ分かれば何処からでも知る事が出来る事を意味します)。

```ruby
view fun getAuthAccount<T: &Account>(_ address: Address): T
```
この`getAuthAccount`関数はスクリプト内でのみ利用できます。スクリプトは書き込み処理を呼び出せますが、処理完了時に変更が破棄されます。スクリプト外でこの関数を利用しようとする、例えばトランザクション内で利用しようとすると型エラーが発生します。

<h1 id="Creating-an-account">Creating an account</h1>

`Account`のコンストラクタは、新しいアカウントを作成します。この関数は*payer*アカウントへの参照を必要とします。(補足: アカウント作成はトランザクションの一つですのでトランザクションフィーが発生します。それを他のアカウントが支払う必要があります)

payerアカウントは、アカウントを作成するのに十分な資金(FLOW)が必要です。アカウントに必要な資金がない場合、プログラムは中止します。

このコンストラクタは新しいアカウントの参照を返し、それは全てのアカウントEntitlement(権限)を持っています。(型は`auth(Storage, Contracts, Keys, Inbox, Capabilities) &Account`です。) これは新しいアカウントに対する全てのwrite accessを提供します。例えばストレージ、スマートコントラクト、キーなどへの書き込み権限を提供してくれます。
```ruby
fun Account(payer: auth(BorrowValue | Storage) &Account):
	auth(Storage, Contracts, Keys, Inbox, Capabilities) &Account
```
例えば、以下のトランザクションでは、新しいアカウントが作成されます。このトランザクションの署名者(signer)がトランザクションフィーを支払っています。

```ruby
transaction {
    prepare(signer: auth(BorrowValue) &Account) {
        let account = Account(payer: signer)
    }
}
```

翻訳元

https://cadence-lang.org/docs/language/accounts/

***
<b>[Previous << Imports](https://qiita.com/flowcadence/items/72c88b02cfc21fd71983)
</b>

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

<b>[Next >> Paths](https://qiita.com/flowcadence/items/9767ec3f9b8d757d75bf)</b>