0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Accounts

Last updated at Posted at 2024-10-26

Account型はアカウントへのアクセスを提供します。アカウントは参照(reference)を通じてのみアクセスされます。その参照は承認されたものの場合があります。

Accountオブジェクトはアカウントのさまざまな情報を提供し、アカウントストレージkeysスマートコントラクトCapabilityなどの管理を可能にします。

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
}

Account access

Performing read operations

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

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

view fun getAccount(_ address: Address): &Account

Performing write operations

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

Entitlement(権限)はアカウントの機能へのアクセスを承認します。Cadenceは大まかな粒度と細かな粒度双方のEntitlementを提供しており、これらはアカウントのどの管理機能に対してアクセスを許可するかを決定します。

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

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

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

署名済みトランザクションにおいて、トランザクションの署名者は承認済みのアカウント参照が取得出来ます。トランザクションのprepareフェーズでは、トランザクション内での処理を実行するために必要なEntitlementを正確に明記することが出来ます。

例えば、アカウントにスマートコントラクトをデプロイしようとするトランザクションの場合は以下のように記述します。

transaction {
    prepare(signer: auth(AddContract) &Account) {
        signer.contracts.add(name: "MyContract", code: [/* code */])
    }
}

ここにおいて、このトランザクションはAddContractEntitlementを持つ承認済みの参照をリクエストしています。つまり、このトランザクションはアカウントにスマートコントラクトを追加する事は出来ますが、例えばアカウントに別のキーを追加することはできないということです。

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

view fun getAuthAccount<T: &Account>(_ address: Address): T

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

Creating an account

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

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

このコンストラクタは新しいアカウントの参照を返し、それは全てのアカウントEntitlement(権限)を持っています。(型はauth(Storage, Contracts, Keys, Inbox, Capabilities) &Accountです。) これは新しいアカウントに対する全てのwrite accessを提供します。例えばストレージ、スマートコントラクト、キーなどへの書き込み権限を提供してくれます。

fun Account(payer: auth(BorrowValue | Storage) &Account):
	auth(Storage, Contracts, Keys, Inbox, Capabilities) &Account

例えば、以下のトランザクションでは、新しいアカウントが作成されます。このトランザクションの署名者(signer)がトランザクションフィーを支払っています。

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

翻訳元->https://cadence-lang.org/docs/language/accounts/


Previous << Imports

Flow BlockchainのCadence version1.0ドキュメント (Accounts)

Next >> Paths

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?