Previous << Contracts
Next >> Attachments
Accountにはインボックス(Inbox)があり、特定のアカウントにCapabilityを利用可能にすることができます。インボックスは2つのアカウント間の初期接続(initial connection)をセットアップし、アカウント間でのデータ転送や処理の実行に利用できる、Capabilityを”自給(bootstrap)”する便利な方法を提供します。
アカウントは、Account.Inbox型のinboxフィールドを通じてこのインボックス機能を提供しています。
Account.Inbox
access(all)
struct Inbox {
/* Publishes a new Capability under the given name,
to be claimed by the specified recipient. */
access(Inbox | PublishInboxCapability)
fun publish(_ value: Capability, name: String, recipient: Address)
/** Unpublishes a Capability previously published by this account.
*
* Returns `nil` if no Capability is published under the given name.
*
* Errors if the Capability under that name does not match the provided type.
*/
access(Inbox | UnpublishInboxCapability)
fun unpublish<T: &Any>(_ name: String): Capability<T>?
/** Claims a Capability previously published by the specified provider.
*
* Returns `nil` if no Capability is published under the given name,
* or if this account is not its intended recipient.
*
* Errors if the Capability under that name does not match the provided type.
*/
access(Inbox | ClaimInboxCapability)
fun claim<T: &Any>(_ name: String, provider: Address): Capability<T>?
}
entitlement Inbox
entitlement PublishInboxCapability
entitlement UnpublishInboxCapability
entitlement ClaimInboxCapability
Publishing a capability to the account inbox
あるアカウント(提供者)が別のアカウント(受領者)にCapabilityを提供したい場合、publish関数を使用してこれを行うことができます。
access(Inbox | PublishInboxCapability)
fun publish(_ value: Capability, name: String, recipient: Address)
publish関数を使用するにはEntitlement(権限)で承認された参照(reference)を通じてアカウントにアクセスする必要があります。それは、大まかな粒度のInboxEntitlementであるauth(Inbox) &Accountか、細かな粒度のPublishInboxCapabilityEntitlementであるauth(PublishInboxCapability) &Accountです。
この関数は、引数の文字列を識別子(ID)にして、指定されたCapabilityを、後で受領者のアカウントに要求されることによって、渡します。しかし、受領者がCapabilityを要求するまでは提供者のアカウントに保存され、そのCapabilityは提供者側のアカウントのストレージ使用量に影響します。
この関数を呼び出すとInboxValuePublishedイベントが発行され、そのイベントには提供者と受領者側のアドレス、渡される予定のCapabilityの名前と型が含まれています。このイベントの詳細については、Core Eventsページを参照してください。
Claiming a capability from the account inbox
Capabilityの受領予定者はclaim関数を使用して、提供者側に対してCapabilityを要求することができます。
access(Inbox | ClaimInboxCapability)
fun claim<T: &Any>(_ name: String, provider: Address): Capability<T>?
claim関数を使用するにはEntitlement(権限)で承認された参照(reference)を通じてアカウントにアクセスする必要があります。それは、大まかな粒度のInboxEntitlementであるauth(Inbox) &Accountか、細かな粒度のClaimInboxCapabilityEntitlementであるauth(ClaimInboxCapability) &Accountです。
もし、指定された名前でCapabilityが提供者側のInboxに保存されてあり、呼び出し元の受領者側が意図した受領者であり、引数の型が合致する場合、この関数は提供者側のInboxからそのCapabilityを取り除き、それを返します。
提供者側のInboxに指定された名前でCapabilityが保存されていない場合、またはこの関数を実行した受領予定者が意図した受領者でない場合、この関数はnilを返します。もしCapabilityの型が引数の型のサブタイプでない場合、プログラムは中断します。
💡TIP
Capabilityは一度しかclaimできません。
claim関数を実行すると、InboxValueClaimedというイベントが発行されます。このイベントには、提供者と受領者の両方のアドレス、および要求されたCapabilityの名前が含まれます。このイベントの詳細については、Core Eventページを参照してください。
Unpublishing a capability from the account inbox
もし、何らかの理由で提供者が受領者にCapabilityを貸すことを望まなくなった場合、unpublish関数を使用してCapabilityを非公開にすることができます。
access(Inbox | UnpublishInboxCapability)
fun unpublish<T: &Any>(_ name: String): Capability<T>?
unpublish関数を実行するにはEntitlement(権限)で承認された参照(reference)を通じてアカウントにアクセスする必要があります。それは、大まかな粒度のInboxEntitlementであるauth(Inbox) &Accountか、細かな粒度のUnpublishInboxCapabilityEntitlementであるauth(UnpublishInboxCapability) &Accountです。
もし、提供者のInboxに指定された名前で保存されたCapabilityがあり、それが指定された引数の型に適合する場合、この関数はInboxからそのCapabilityを取り除いて返します。
もし、提供者のInboxに指定された名前で保存されたCapabilityがない場合、この関数はnilを返します。Capabilityの型が指定された引数の型のサブタイプでない場合、プログラムは中断します。
unpublish関数を実行すると、提供者側のアドレスと非公開化されたCapabilityの名前を含むイベントInboxValueUnpublishedが発行されます。このイベントの詳細については、Core Eventsページを参照してください。
翻訳元