Previous << FLIX (Flow Interaction Templates)
Next >> Building Walletless Applications Using Child Accounts
Account Linkingは、アカウントの所有権(Ownership)を共有することを可能にするFlow独自のコンセプトです。私達がこれを実現する方法を理解するには、まずFlowのアカウントへのアクセス方法を理解する必要があります。
Flowのアカウントは、CadenceからPublicAccount
とAccount
の2つの型を通じてアクセスできます。名前が示すように、PublicAccount
型では、アドレス、残高、ストレージ容量などのすべての公開アカウント情報にアクセスできますが、アカウント情報の変更は許可されていません。Account
型(より正確には、entitled &Account
)は、PublicAccount
と同様のアクセスができるだけでなく、アカウント情報の変更もできます。これには、アカウントキーの追加/削除、デプロイされたコントラクトの管理、およびCapabilitiesのlinkingとpublishingが含まれます。
Accessing Account
Account
にアクセスできると、アカウントストレージ内容の変更が可能になるため、アクセスするアカウントによる署名を義務付けることにより、このアクセスを保護することが不可欠です。Account
にアクセスできると、アカウントストレージ内容の変更が可能になるため、アクセスするアカウントによる署名を義務付けることにより、このアクセスを保護することが不可欠です。 Account entitlementsにより、署名済みトランザクション内からアクセス可能なアカウントに対して、より粒度の細かいアクセス制御が可能になります。 トランザクションは、アクセスを希望する複数の承認アカウントをリスト化して、トランザクションのprepare
セクションに渡すことができます。 トランザクション署名の詳細については、トランザクションのドキュメントを参照してください。
Account
オブジェクトへのアクセスは、ステート変更を可能にするため、アカウント所有権(ownership)という考えは、実際にはその下位にある(underlying)アカウントに対するアクセス権を意味します。従来は、これがアカウント上のキーへのアクセス権であるとみなすこともありましたが、Capabilities on Flowを使った所有権レベルのアクセス権がプログラムによってどう解除されるかについては、すぐに説明します。
Account Capabilities
このセクションを理解するには、読者はCadence capabilitiesについての明確な理解が必要です。Account Capabilitiesなどの高度な機能は強力ですが、誤って使用すると、あなたのアプリケーションやユーザーにリスクをもたらす可能性があります。
Cadenceでは、アカウントストレージへのアクセスを委任することが出来るCapabilitiesを作成することができます。つまり、有効なCapabilityを有していれば、別のアカウントのストレージ内のオブジェクトに対してアクセスできるということです。これはそれ自体が強力な機能であり、アクセス可能なアカウント上でアクティブキーを必要とせずに、プログラム的に別のアカウントにアクセスできます。オブジェクトに対するアクセスは、Capabilityを作成する時にに制限を設けることができるため、意図した関数やフィールドのみにアクセスさせることができます。
Account Linking は、Account
オブジェクト自体のCapabilityを拡張することによって可能になります。ストレージCapabilityが、アカウントのストレージに保存された値へのアクセスを可能にするのと同じ様に、&Account
Capabilityは、Account
への委任されたアクセスが可能になります。これらのCapabilitiesにより、委任元のAccount
に対するキー割り当て、コントラクトのデプロイ、その他の特権的な操作へのアクセスが可能になります。つまり、キーを追加したり共有したりすることなく、アカウントの所有権を効果的に共有できるのです。もちろん、このCapabilityは委任元のアカウントによっていつでも取り消すことができます。
Creating Account Links
'account linking'とは、&Account
Capabilityが親アカウントによって作成され、別のアカウントに公開される(published)ことを意味します。別のアカウントに公開した、&Account
Capabilityを保持されたアカウントは、そのアカウントの子アカウントです。子アカウントから与えられたCapabilityを保持するアカウントが、そのアカウントの親アカウントとなります。
Flow上の2つの既存アカウント間のリンク(link)は、次の2つのステップで作成できます。
- 子アカウントが
&Account
Capabilityを作成し、親アカウントに公開します。 - 親アカウントは、そのCapabilityを主張(claim)し、それを通じて子アカウントにアクセスできます。
These two steps are implemented in Cadence as two transactions:
Create capability
アカウントBは、0x01
アドレスのアカウントAに&Account
Capabilityを公開する。
#allowAccountLinking
transaction {
prepare(signer: auth(IssueAccountCapabilityController, PublishInboxCapability) &Account) {
/* Issue a fully-entitled account capability */
let capability = signer.capabilities
.account
.issue<auth(Storage, Contracts, Keys, Inbox, Capabilities) &Account>()
/* Publish the capability for the specified recipient */
signer.inbox.publish(capability, name: "accountCapA", recipient: 0x1)
}
}
Claim capability
アカウントAは、アカウントBが公開したCapabilityを主張(claim)する。
transaction {
prepare(signer: auth(ClaimInboxCapability) &Account) {
let capabilityName = "accountCapB"
let providerAddress = 0x2
/* Claim the capability published by the account 0x2 */
let capability = signer.inbox
.claim<auth(Storage, Contracts, Keys, Inbox, Capabilities) &Account>(
capabilityName,
provider: providerAddress
) ?? panic(
"Capability with name ".concat(capabilityName)
.concat(" from provider ").concat(providerAddress.toString())
.concat(" not found")
)
/* Simply borrowing an Account reference here for demonstration purposes */
let accountRef = capability.borrow()!
}
}
What is account linking most useful for?
Account linkingは、ウォレットを所有していなくても、ユーザーをスムーズかつシームレスにFlowベースのアプリケーションにオンボーディングできるように特別に設計されています。このパターンは、技術的なハードルと、ウォレットをインストールすることにユーザーが消極的であるという両方の問題を克服し、Flowアプリケーションへのアクセスをすべてのユーザーに開放します。ユーザーは、自分で管理する所有権へのパスが残されしつつも、遅延なくアプリを体験することができます。
当然ながら、ユーザーは自分のアカウントを他のアプリケーションで使用したり、あるいはそのアカウントに保管されている資産を他の場所に移したりすることを期待するでしょう。少なくとも、ウォレットからは移すことができます。アプリがAccount Linkingを活用する場合、アプリはユーザーに代わってアカウントを作成し、そのアカウントに対して、そのユーザー固有のステートを保存します。その後、ユーザーは完全なFlowアカウントを所有することで、通常はウォレットアプリをインストールすることで、アプリのアカウントの所有権を取得することができます。
Account linkingは、ユーザーが異なるアプリからリンクされた複数の子アカウントを持つことができるようになります。子アカウントへのアクセスに関連する複雑性が、親アカウントを通じた子アカウントへのアクセスを抽象化することで排除されています。
INFO
簡単に言えば、子アカウントは親アカウントにとってシームレスな部分として、アクセスしたり取り扱うことが可能になります。
アプリのアカウント内のすべてのアセット(資産)は、壁で囲まれた庭を飛び越えて、Flowエコシステム内の他のサービスで利用できるようになりました。親アカウントはすでに子アカウント内の資産にアクセスできるため、ユーザーは子アカウントから資産を移動させるトランザクションを実行する際に、カストディアルアプリに頼る必要がなくなりました。
アプリ内アカウントのこのデジタルアイテムに対する共有管理により、ユーザーはアプリの枠を超えてアイテムの真の所有権を確立することができます。親アカウントを使用して資産を表示し、アイテムをマーケットプレイスやゲームなどのエコシステム内の他のアプリに移動させることができます。
最も重要なのは、ユーザーがアカウント間でデジタルアイテムを転送する必要なく、元のアプリをシームレスに使い続けながら、他のコンテキストで自分の資産を楽しむことができる点です。
Security Considerations
Account Linkingは非常に強力なCadenceの機能であるため、慎重に扱う必要があります。この文書ではこれまでのところ、Account Linkingを2つのアカウント間について、子アカウントがサードパーティのアプリケーションで管理された場合についても、説明してきました。しかし、現実の世界では、カストディアル・アカウントに関して同じ信頼の前提を置くことはできません。
&Account
Capabilityを作成し、且つ所有していないアカウントにそれを公開することは、そのアカウントに自分たちのアカウントへのフルアクセス権を与えることを意味します。これはアンチ(やってはいけない)パターンと見なすべきです。
WARNING
&Account
Capabilityを作成し、且つそれをサードパーティのアカウントと共有することは、実質的に、その人に自分のアカウントの秘密鍵を渡すことと同じです。
素のままのAccount Linkingは危険であるため、Flowでは、HybridCustody
コントラクトを導入し、親アカウントが多数の子アカウントとその中の資産を管理できるようにしながら、カストディアル・アプリケーションによるアクセスの制御を可能にしています。
Hybrid Custody and Account Linking
アプリは、悪意のある者から自身のリソースが安全であるという保証を必要としているため、完全なアクセス権を与えることが必ずしも望ましい形であるとは限りません。Hybrid Custodyコントラクトを使用することで、アプリは管理されたアカウントの管理権限を維持しながら、以下を行うことができます。
- ヘルパー・コントラクト(
CapabilityFactory
、CapabilityFilter
)を介して親アカウントから取得できるCapabilitiesの型を超えて、いくつかのビルトインの制御能力を備えつつ、自由にCapabilityを共有できます。 -
CapabilityDelegator
リソースを介して親アカウントと、追加したCapability(パブリックまたはプライベート)を共有できます
詳細はHybrid Custodyのドキュメントをご参照ください。
Guides
- Building Walletless Applications Using Child Accounts covers how apps can leverage Account Linking to create a seamless user experience and enable future self-custody.
-
Working With Parent Accounts covers features enabled by the core
HybridCustody
contract to access child account assets from parent accounts. This is useful for apps like marketplaces or wallets that are working with accounts that have potential child accounts.
Resources
- Forum Post where core concepts were introduced and discussed.
-
GitHub repository where
HybridCustody
core contracts and scripts are maintained. Check out the repository for more advanced script or transaction examples. - Example Account Linking project with Magic.
- Starter template for Niftory Account Linking API.
Last updated on Dec 9, 2024 by Alex
翻訳元
Previous << FLIX (Flow Interaction Templates)
Flow BlockchainのCadence version1.0ドキュメント (Account Linking)
Next >> Building Walletless Applications Using Child Accounts