
2024年2月11日、SSP Connectは閲覧と身元確認のためのプロトコルから、支払いのためのプロトコルへと進化しました。SSP Wallet v1.1.0 はSSP Connect に pay メソッドを追加し、任意の dApp やウェブサイトが SSP ユーザーに対して、本物のオンチェーン支払いをリクエストできるようにします。ウォレットの配管を再実装する必要はありません。リクエストの形は意図的に小さく保たれています。三つのパラメータがあり、そのうちの一つは敢えて文字列です。
TL;DR
- SSP Connect は、既存の身元フローに加え、
payアクションを公開しました。 - 支払いリクエストは正確に三つのパラメータを受け取ります:
chain、address、amount。 amountは敢えて文字列です。伝送上で小数の精度を保つためです。- 署名フローは引き続きユーザーの二台のデバイス間でエンドツーエンドで動作し、dApp は鍵を見ません。
- 統合者は送信前に
amountをBigNumber.toFixed()(または等価物)でフォーマットすべきです。
SSP Connect とは
SSP Connect は SSP Wallet ユーザーと外の世界をつなぐ橋です。これはSSP Wallet のローンチとともに導入された、同じ軽量なセッションプロトコルです。そこではウォレット自体が、ブラウザ拡張機能と電話上に常駐する SSP Key の間で分割された、真の 2-of-2 マルチシグになっています。このリリースより前、Connect は主に読み取り専用のリクエストに使われていました。セッションをペアリングする、アドレスを共有する、あるアカウントを特定のユーザーが管理していることを検証するといった用途です。重要な点は、秘密がユーザーの二台のデバイスを決して離れないことです。Connect は意図と応答を、デバイスと依拠当事者の間で運ぶだけです。
pay アクションが行うこと
pay メソッドは Connect を「あなたが誰か教えてくれ」から「あなたに支払いをお願いさせてくれ」へと拡張します。dApp は pay リクエストを構築して Connect に渡し、ユーザーは自分のウォレット UI でそのリクエストの承認、編集、または拒否を求められます。ユーザーが承認すれば、マルチシグの署名フローはいつも通り走り——拡張機能が準備し、電話が共同署名し——結果として得られたトランザクションがブロードキャストされます。dApp が受け取るのは綺麗な確認か綺麗な拒否のいずれかで、秘密鍵に触れることは決してありません。
三つのパラメータ
chain は支払いに使う SSP 対応資産を指定する文字列で、例えば 'flux' のような値です。これは必須です。値は SSP が内部で既に用いている資産識別子と一致するため、統合者が新しい命名規則を学ぶ必要はありません。
address は支払いの宛先で、選ばれたチェーンが期待するアドレス形式の素の文字列です。これも必須です。SSP はリクエストをユーザーに見せる前に、受信側で通常通り形式とチェックサムの検証を行います。
amount は送る額で、そのチェーンの主単位で表現されます。例えば '4.56' は 4.56 FLUX を意味し、4.56 個の最小不可分単位ではありません。これは必須で、しかも重要なことに、数値ではなく文字列として型付けされています。
なぜ「amount」は文字列なのか
JavaScript の数値は IEEE-754 倍精度浮動小数で、これはお金にとってはまさに誤った表現です。0.1 + 0.2 は 0.3 ではなく、小数 18 桁のトークン額は黙って丸められずに double に収まりません。amount を文字列に強制することで、この種の精度バグはプロトコル境界で丸ごと回避されます。dApp が内部で——典型的には big-decimal ライブラリで——計算した値は、ウォレットへの旅路を変わらず生き延びます。リリースノートは送信前に BigNumber.toFixed() で値をフォーマットすることを推奨しています。これは big-decimal を指数表記なしの正確な文字列として描画する標準的な方法です。
次にやること
身元確認のために既に SSP Connect を使っている dApp やウェブサイトを運用しているなら、アップグレードの道筋は短いです。既存のセッションは保ったまま、以前ならユーザーにアドレスをコピーしてもらっていた場所に pay リクエストを置きます。chain は本当に受け入れたい SSP 対応資産のリストと照合し、address はクライアント側で検証してユーザーがウォレットに届く前にエラーを見られるようにし、amount は常に自分の big-decimal ライブラリの toFixed()(または等価物)を通してフォーマットしてください。送る文字列が計算した値と完全に一致するためです。残りの確認、署名、ブロードキャストはウォレットが担い、鍵をオリジンに晒すことはありません。
Source: SSP Wallet v1.1.0 リリースノート.