本文へ移動

リンク済みデバイス

短時間の連携セッションと明示的な承認で、独立したデバイス認証情報と署名レーンを作成します。

リンク済みデバイス ​

デバイス連携は、ユーザーが管理する別のデバイス用に、独立した署名レーンを作成します。

フロー ​

  1. 新しいデバイスが、リンク用公開鍵を含むQR連携セッションを提示する。
  2. 既存の所有者デバイスが、ユーザーを認証して権限を承認する。
  3. 所有者側のWorkerが、リンクするデバイス用の独立した保持者シェアを作成する。
  4. サーバーが、そのレーンに対応するサーバーシェアを作成する。
  5. リンクするデバイスが、暗号化した保持者シェアのパッケージを受け取る。
  6. 配送とウォレットアドレスの維持を確認してから、レーンを有効化する。

リンク済みデバイスは、独自の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>
  );
}