Account Linking

[Previous << FLIX (Flow Interaction Templates)](https://qiita.com/flowcadence/items/e99d6da94296950204e2)
[Next >> Building Walletless Applications Using Child Accounts](https://qiita.com/flowcadence/items/aa94c0ba2cdf670dab5d)

https://qiita.com/flowcadence/items/3073d69c6e9895e68b5a#flow-developers

Account Linkingは、[アカウント](https://qiita.com/flowcadence/items/83d778f84f462cb43318)の所有権(Ownership)を共有することを可能にするFlow独自のコンセプトです。私達がこれを実現する方法を理解するには、まずFlowのアカウントへのアクセス方法を理解する必要があります。

Flowのアカウントは、Cadenceから`PublicAccount`と`Account`の2つの型を通じてアクセスできます。名前が示すように、`PublicAccount`型では、アドレス、残高、ストレージ容量などのすべての公開アカウント情報にアクセスできますが、アカウント情報の変更は許可されていません。`Account`型（より正確には、[entitled](https://qiita.com/flowcadence/items/572df270135946f5290e#entitlements) `&Account`）は、`PublicAccount`と同様のアクセスができるだけでなく、アカウント情報の変更もできます。これには、アカウントキーの追加/削除、デプロイされたコントラクトの管理、およびCapabilitiesのlinkingとpublishingが含まれます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3912821/bc6e48de-41ea-5d7c-69fa-54b8ad4c344b.png)

<h1>Accessing Account</h1>

`Account`にアクセスできると、アカウントストレージ内容の変更が可能になるため、アクセスするアカウントによる署名を義務付けることにより、このアクセスを保護することが不可欠です。`Account`にアクセスできると、アカウントストレージ内容の変更が可能になるため、アクセスするアカウントによる署名を義務付けることにより、このアクセスを保護することが不可欠です。 [Account entitlements](https://qiita.com/flowcadence/items/5ddbb79fe8438850cf57#performing-write-operations)により、署名済みトランザクション内からアクセス可能なアカウントに対して、より粒度の細かいアクセス制御が可能になります。 トランザクションは、アクセスを希望する複数の承認アカウントをリスト化して、トランザクションの`prepare`セクションに渡すことができます。 トランザクション署名の詳細については、[トランザクションのドキュメント](https://qiita.com/flowcadence/items/6393a2af33f82475a7ca)を参照してください。

`Account`オブジェクトへのアクセスは、ステート変更を可能にするため、アカウント所有権(ownership)という考えは、実際にはその下位にある(underlying)アカウントに対するアクセス権を意味します。従来は、これがアカウント上のキーへのアクセス権であるとみなすこともありましたが、[Capabilities on Flow](https://qiita.com/flowcadence/items/85e1aaf7e41d1134fa6c)を使った所有権レベルのアクセス権がプログラムによってどう解除されるかについては、すぐに説明します。

<h1>Account Capabilities</h1>

このセクションを理解するには、読者は[Cadence capabilities](https://qiita.com/flowcadence/items/85e1aaf7e41d1134fa6c)についての明確な理解が必要です。Account Capabilitiesなどの高度な機能は強力ですが、誤って使用すると、あなたのアプリケーションやユーザーにリスクをもたらす可能性があります。

Cadenceでは、アカウントストレージへのアクセスを委任することが出来るCapabilitiesを作成することができます。つまり、有効なCapabilityを有していれば、別のアカウントのストレージ内のオブジェクトに対してアクセスできるということです。これはそれ自体が強力な機能であり、アクセス可能なアカウント上でアクティブキーを必要とせずに、プログラム的に別のアカウントにアクセスできます。オブジェクトに対するアクセスは、Capabilityを作成する時にに制限を設けることができるため、意図した関数やフィールドのみにアクセスさせることができます。

Account Linking は、`Account`オブジェクト自体のCapabilityを拡張することによって可能になります。ストレージCapabilityが、アカウントのストレージに保存された値へのアクセスを可能にするのと同じ様に、`&Account`Capabilityは、`Account`への委任されたアクセスが可能になります。これらのCapabilitiesにより、委任元の`Account`に対するキー割り当て、コントラクトのデプロイ、その他の特権的な操作へのアクセスが可能になります。つまり、キーを追加したり共有したりすることなく、アカウントの所有権を効果的に共有できるのです。もちろん、このCapabilityは委任元のアカウントによっていつでも取り消すことができます。

<h3>Creating Account Links</h3>

'account linking'とは、`&Account` Capabilityが親アカウントによって作成され、別のアカウントに公開される(published)ことを意味します。別のアカウントに公開した、`&Account` Capabilityを保持されたアカウントは、そのアカウントの子アカウントです。子アカウントから与えられたCapabilityを保持するアカウントが、そのアカウントの親アカウントとなります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3912821/76b2a626-f3ba-5168-d820-476f189a64f2.png)

Flow上の2つの既存アカウント間のリンク(link)は、次の2つのステップで作成できます。
1. 子アカウントが`&Account` Capabilityを作成し、親アカウントに公開します。
1. 親アカウントは、そのCapabilityを主張(claim)し、それを通じて子アカウントにアクセスできます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3912821/140b1437-81f5-2253-09b4-ca65a6c0d628.png)

<h3>These two steps are implemented in Cadence as two transactions:</h3>

**Create capability**
アカウントBは、`0x01`アドレスのアカウントAに`&Account` Capabilityを公開する。
```ruby
#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)する。
```ruby
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()!
    }
}
```

<h1>What is account linking most useful for?</h1>

Account linkingは、ウォレットを所有していなくても、ユーザーをスムーズかつシームレスにFlowベースのアプリケーションにオンボーディングできるように特別に設計されています。このパターンは、技術的なハードルと、ウォレットをインストールすることにユーザーが消極的であるという両方の問題を克服し、Flowアプリケーションへのアクセスをすべてのユーザーに開放します。ユーザーは、自分で管理する所有権へのパスが残されしつつも、遅延なくアプリを体験することができます。

当然ながら、ユーザーは自分のアカウントを他のアプリケーションで使用したり、あるいはそのアカウントに保管されている資産を他の場所に移したりすることを期待するでしょう。少なくとも、ウォレットからは移すことができます。アプリがAccount Linkingを活用する場合、アプリはユーザーに代わってアカウントを作成し、そのアカウントに対して、そのユーザー固有のステートを保存します。その後、ユーザーは完全な[Flowアカウント](https://qiita.com/flowcadence/items/83d778f84f462cb43318)を所有することで、通常はウォレットアプリをインストールすることで、アプリのアカウントの所有権を取得することができます。

Account linkingは、ユーザーが異なるアプリからリンクされた複数の子アカウントを持つことができるようになります。子アカウントへのアクセスに関連する複雑性が、親アカウントを通じた子アカウントへのアクセスを抽象化することで排除されています。

:::note info
INFO
簡単に言えば、子アカウントは親アカウントにとってシームレスな部分として、アクセスしたり取り扱うことが可能になります。
:::
アプリのアカウント内のすべてのアセット(資産)は、壁で囲まれた庭を飛び越えて、Flowエコシステム内の他のサービスで利用できるようになりました。親アカウントはすでに子アカウント内の資産にアクセスできるため、ユーザーは子アカウントから資産を移動させるトランザクションを実行する際に、カストディアルアプリに頼る必要がなくなりました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3912821/6f67d1a3-3515-ec12-7166-1796ce69bec3.png)

アプリ内アカウントのこのデジタルアイテムに対する共有管理により、ユーザーはアプリの枠を超えてアイテムの真の所有権を確立することができます。親アカウントを使用して資産を表示し、アイテムをマーケットプレイスやゲームなどのエコシステム内の他のアプリに移動させることができます。

最も重要なのは、ユーザーがアカウント間でデジタルアイテムを転送する必要なく、元のアプリをシームレスに使い続けながら、他のコンテキストで自分の資産を楽しむことができる点です。
<h1>Security Considerations</h1>

Account Linkingは*非常に*強力なCadenceの機能であるため、慎重に扱う必要があります。この文書ではこれまでのところ、Account Linkingを2つのアカウント間について、子アカウントがサードパーティのアプリケーションで管理された場合についても、説明してきました。しかし、現実の世界では、カストディアル・アカウントに関して同じ信頼の前提を置くことはできません。

`&Account` Capabilityを作成し、且つ所有していないアカウントにそれを公開することは、そのアカウントに自分たちのアカウントへのフルアクセス権を与えることを意味します。これはアンチ(やってはいけない)パターンと見なすべきです。

:::note warn
WARNING
`&Account` Capabilityを作成し、且つそれをサードパーティのアカウントと共有することは、実質的に、その人に自分のアカウントの秘密鍵を渡すことと同じです。
:::

素のままのAccount Linkingは危険であるため、Flowでは、[`HybridCustody` コントラクト](https://qiita.com/flowcadence/items/e9a3fc97d60bb007b878)を導入し、親アカウントが多数の子アカウントとその中の資産を管理できるようにしながら、カストディアル・アプリケーションによるアクセスの制御を可能にしています。

<h1>Hybrid Custody and Account Linking</h1>

アプリは、悪意のある者から自身のリソースが安全であるという保証を必要としているため、完全なアクセス権を与えることが必ずしも望ましい形であるとは限りません。Hybrid Custodyコントラクトを使用することで、アプリは管理されたアカウントの管理権限を維持しながら、以下を行うことができます。
1. ヘルパー・コントラクト（`CapabilityFactory`、`CapabilityFilter`）を介して親アカウントから取得できるCapabilitiesの型を超えて、いくつかのビルトインの制御能力を備えつつ、自由にCapabilityを共有できます。
1. `CapabilityDelegator` リソースを介して親アカウントと、追加したCapability（パブリックまたはプライベート）を共有できます

詳細は[Hybrid Custodyのドキュメント](https://qiita.com/flowcadence/items/e9a3fc97d60bb007b878)をご参照ください。
<h3>Guides</h3>

* [Building Walletless Applications Using Child Accounts](https://qiita.com/flowcadence/items/aa94c0ba2cdf670dab5d) covers how apps can leverage Account Linking to create a seamless user experience and enable future self-custody.
* [Working With Parent Accounts](https://qiita.com/flowcadence/items/e9a3fc97d60bb007b878) 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.
<h3>Resources</h3>

* [Forum Post](https://forum.flow.com/t/hybrid-custody/4016) where core concepts were introduced and discussed.
* [GitHub repository](https://github.com/onflow/hybrid-custody) where `HybridCustody` core contracts and scripts are maintained. Check out the repository for more advanced script or transaction examples.
* [Example](https://github.com/jribbink/magic-link-hc-sample/) Account Linking project with [Magic](https://magic.link/).
* [Starter template](https://github.com/Niftory/niftory-samples/tree/main/walletless-onboarding) for [Niftory](https://niftory.com/) Account Linking API.


*Last updated on **Dec 9, 2024** by **Alex***

翻訳元

https://developers.flow.com/build/guides/account-linking

***

<b>[Previous << FLIX (Flow Interaction Templates)](https://qiita.com/flowcadence/items/e99d6da94296950204e2)
</b>

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

<b>[Next >> Building Walletless Applications Using Child Accounts](https://qiita.com/flowcadence/items/aa94c0ba2cdf670dab5d)</b>