Sur cette page
Solana
Types de registre UR pour la signature Solana hors ligne.
Types de données
- UR de requête :
sol-sign-request(octets de transaction/message + chemin BIP-44) - UR de réponse :
sol-signature
Processus
- Préparer les octets de la transaction ou du message Solana et le chemin de dérivation
- Construire
sol-sign-requestet afficher sous forme de QR code animé - Scanner la réponse de l’appareil → décoder
sol-signature→ associer à la transaction - Soumettre au réseau Solana
Exemples
Installez @keystonehq/bc-ur-registry-sol et @ngraveio/bc-ur. Les exemples nécessitent une implémentation de Buffer. L’encodage du registre ne suffit pas à établir la prise en charge sur un appareil ; vérifiez les types UR acceptés par le micrologiciel cible.
Le portefeuille fournit les données de transaction non signée ainsi que le chemin réel du compte et l’empreinte maîtresse exportés par l’appareil. Le moteur de rendu QR doit appeler nextFrame() à intervalles réguliers et s’arrêter lorsque la boîte de dialogue de signature se ferme. Ces extraits encodent et décodent le transport ; ils ne soumettent aucune transaction.
Construire une demande de signature Solana (UR)
import { SolSignRequest, SignType, CryptoKeypath, PathComponent } from '@keystonehq/bc-ur-registry-sol';
// BIP44: m/44'/501'/0'
const keypath = new CryptoKeypath([
new PathComponent({ index: 44, hardened: true }),
new PathComponent({ index: 501, hardened: true }),
new PathComponent({ index: 0, hardened: true }),
], Buffer.from(masterFingerprintHex, 'hex'));
const requestId = globalThis.crypto.randomUUID();
const requestIdBytes = Buffer.from(requestId.replace(/-/g, ''), 'hex');
const req = new SolSignRequest({
requestId: requestIdBytes,
signData: Buffer.from(rawTxBytes), // transaction or message bytes
derivationPath: keypath,
signType: SignType.Transaction, // or SignType.Message
});
const encoder = req.toUREncoder(200);
const nextFrame = () => encoder.nextPart(); // Call from your QR animation timer.Décoder une signature Solana (UR)
import { URDecoder } from '@ngraveio/bc-ur';
import { SolSignature } from '@keystonehq/bc-ur-registry-sol';
const dec = new URDecoder();
// dec.receivePart(frameString) for each scanned frame
if (dec.isError()) throw new Error('QR decoding failed');
if (dec.isSuccess()) {
const ur = dec.resultUR();
if (ur.type !== 'sol-signature') throw new Error('Expected sol-signature');
const sig = SolSignature.fromCBOR(ur.cbor);
const returnedId = sig.getRequestId();
if (!returnedId || !returnedId.equals(requestIdBytes)) {
throw new Error('Signature request ID does not match');
}
const signature = sig.getSignature();
// Verify the signer and signature against the original payload before use.
// Attach transaction signatures to the original transaction; return message signatures to the caller.
}Dernière mise à jour le