Ed25519
Seamsは、標準的なシード由来のEd25519識別情報を維持します。 明示的にエクスポートした鍵は、登録済みの公開鍵を再現します。
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の有効化、承認済みエクスポート、新しい受信者用のシェア準備は、ライフサイクルプロトコルを使います。 通常のトランザクション、メッセージ、委任アクションの署名は、有効化済みのしきい値セッションを使います。
クライアント -> Router -> SigningWorker -> Router -> クライアント通常署名は、Yao処理もDeriver呼び出しも行いません。 事前署名プールに該当項目があれば、クライアントとRouter間の1往復で処理します。 なければ、準備要求の後に最終署名要求を送ります。
エクスポートの不変条件
エクスポートは、新たな承認を伴う独立した手順です。 クライアントは、自身宛てに暗号化した2つのシードシェアを受け取ります。 dを再構成し、Ed25519公開鍵を導出します。 登録済み公開鍵との一致を確認してから、ウォレットオリジンのビューアーへ鍵を表示する必要があります。 アプリは、エクスポートの操作結果だけを受け取ります。
通常の有効化回路には、シード出力の分岐がありません。復元で、エクスポート要求の形式を再利用することはできません。
NEARトランザクションに署名する
アプリは、正確なウォレットセッション、NEARアカウント、宛先、アクションを渡します。 SDKは、有効なEd25519署名レーンを通じて要求を送ります。
実行可能なReact・TypeScriptの実装例
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>;
}