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は例えば、AddKey
はAccount.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 */])
}
}
ここにおいて、このトランザクションはAddContract
Entitlementを持つ承認済みの参照をリクエストしています。つまり、このトランザクションはアカウントにスマートコントラクトを追加する事は出来ますが、例えばアカウントに別のキーを追加することはできないということです。
スクリプト(補足: 値の変更が行われないブロックチェーン上の関数呼び出し)の場合は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/
Flow BlockchainのCadence version1.0ドキュメント (Accounts)