リンク済みデバイス
デバイス連携は、ユーザーが管理する別のデバイス用に、独立した署名レーンを作成します。
フロー
- 新しいデバイスが、リンク用公開鍵を含むQR連携セッションを提示する。
- 既存の所有者デバイスが、ユーザーを認証して権限を承認する。
- 所有者側のWorkerが、リンクするデバイス用の独立した保持者シェアを作成する。
- サーバーが、そのレーンに対応するサーバーシェアを作成する。
- リンクするデバイスが、暗号化した保持者シェアのパッケージを受け取る。
- 配送とウォレットアドレスの維持を確認してから、レーンを有効化する。
リンク済みデバイスは、独自のlaneId、laneShareEpoch、保持者シェアのエンベロープ、権限ポリシー、取り消し状態、監査履歴を持ちます。
公開済みSDKは、所有者が管理するデバイスを、同じウォレットとそのホームリージョンに連携します。 選択した操作には、引き続きローカルのユーザー存在確認とサーバーの受付が必要です。 範囲を限定した委任条件によるデバイス・エージェントへの委任は、別の計画中機能です。
アプリから連携する
新しいデバイスが、短時間だけ有効なQRペイロードを表示します。 認証済みの所有者デバイスが、連携フックを通じて読み取り、承認します。
実行可能なReactの実装例
tsx
import { useState } from 'react';
import { QRScanMode, ShowQRCode, useDeviceLinking } from '@seams/wallet/react';
import type { LinkDeviceFlowEvent, QrLinkedDeviceSessionPayloadV5 } from '@seams/wallet';
function logLinkEvent(event: LinkDeviceFlowEvent): void {
console.log(event.phase, event.status, event.message);
}
// Device 2: `ShowQRCode` runs the whole start/display/expire cycle, including
// picking the target factor and cancelling an abandoned session.
export function NewDeviceLinkCode() {
const [isOpen, setIsOpen] = useState(false);
return (
<>
<button onClick={() => setIsOpen(true)}>Show link code</button>
<ShowQRCode
isOpen={isOpen}
onClose={() => setIsOpen(false)}
onEvent={logLinkEvent}
onError={(error) => console.error('Device link failed', error)}
/>
</>
);
}
// Device 1: scan the code and approve.
export function ApproveLinkedDevice(props: { qrData: QrLinkedDeviceSessionPayloadV5 }) {
const { linkDevice } = useDeviceLinking({
onEvent: logLinkEvent,
onError: (error) => console.error('Device link failed', error),
});
return (
<button onClick={() => void linkDevice(props.qrData, QRScanMode.CAMERA)}>Approve device</button>
);
}