本文へ移動

Ed25519

署名権限を分割しながら、標準的なシード由来のEd25519識別情報を維持します。

Ed25519 ​

Seamsは、標準的なシード由来のEd25519識別情報を維持します。 明示的にエクスポートした鍵は、登録済みの公開鍵を再現します。

text
d = LE32(y_client + y_server mod 2^256)
h = SHA-512(d)
a = clamp(h[0..32]) mod l

ライフサイクルプロトコルは、Streaming Yao A/Bでこの関係を計算します。 Deriver AとBは、分離したクライアントとサーバーの寄与を受け取ります。 どちらのロールも、結合したd、a、クライアント署名出力、サーバー署名出力を知りません。

ライフサイクルと署名 ​

登録、復元、署名シェア更新、SigningWorkerの有効化、承認済みエクスポート、新しい受信者用のシェア準備は、ライフサイクルプロトコルを使います。 通常のトランザクション、メッセージ、委任アクションの署名は、有効化済みのしきい値セッションを使います。

text
クライアント -> Router -> SigningWorker -> Router -> クライアント

通常署名は、Yao処理もDeriver呼び出しも行いません。 事前署名プールに該当項目があれば、クライアントとRouter間の1往復で処理します。 なければ、準備要求の後に最終署名要求を送ります。

エクスポートの不変条件 ​

エクスポートは、新たな承認を伴う独立した手順です。 クライアントは、自身宛てに暗号化した2つのシードシェアを受け取ります。 dを再構成し、Ed25519公開鍵を導出します。 登録済み公開鍵との一致を確認してから、ウォレットオリジンのビューアーへ鍵を表示する必要があります。 アプリは、エクスポートの操作結果だけを受け取ります。

通常の有効化回路には、シード出力の分岐がありません。復元で、エクスポート要求の形式を再利用することはできません。

NEARトランザクションに署名する ​

アプリは、正確なウォレットセッション、NEARアカウント、宛先、アクションを渡します。 SDKは、有効なEd25519署名レーンを通じて要求を送ります。

実行可能なReact・TypeScriptの実装例
tsx
import {
  functionCall,
  logWalletEvents,
  TxExecutionStatus,
  useSeams,
  type BoundNearSigner,
} from '@seams/wallet/react';

async function signGreeting(near: BoundNearSigner): Promise<void> {
  await near.signAndSendTransaction({
    receiverId: 'guest-book.testnet',
    actions: [functionCall({ method: 'set_greeting', args: { greeting: 'Hello from Seams' } })],
    options: {
      waitUntil: TxExecutionStatus.EXECUTED_OPTIMISTIC,
      onEvent: logWalletEvents(),
    },
  });
}

export function SetGreetingButton() {
  const { wallet } = useSeams();
  if (wallet?.access !== 'wallet' || !wallet.near) return null;

  // Each request opens wallet confirmation for this transaction.
  return <button onClick={signGreeting.bind(null, wallet.near)}>Sign transaction</button>;
}