3 unstable releases
0.2.1 | Sep 5, 2024 |
---|---|
0.2.0 | Sep 5, 2024 |
0.1.0 | Sep 1, 2024 |
#10 in #instruction
Used in solana-transaction-intros…
7KB
Ed25519 Signature Readme
Overview
This Rust module provides a structured way to deserialize and work with Ed25519 signatures in the context of Solana's BPF programs. It allows for deserialization of signature data, extraction of public keys (signers), and retrieval of signed data, making it easier to validate and work with Ed25519 signatures on the Solana blockchain.
Features
- Ed25519 Signature Handling: Provides a structured representation of Ed25519 signature data, including multiple signatures and their associated offsets.
- Borsh Deserialization: Implements the
BorshDeserialize
trait for easy deserialization from byte streams, making it compatible with the Borsh serialization format commonly used in Solana programs. - Efficient Access: Provides methods to extract public keys (signers), signatures, and signed data directly from the deserialized data without additional allocations.
Example Usage
Deserialize Ed25519Signature from Bytes
use solana_program::pubkey::Pubkey;
use borsh::BorshDeserialize;
let mut input = /* some byte array containing Ed25519 signature data */;
let signature = Ed25519Signature::deserialize_reader(&mut input).unwrap();
Extract Signers and Signatures
let signer_pubkey: &Pubkey = signature.0[0].get_signer(&input_data);
let signature_data: &[u8; 64] = signature.0[0].get_signature(&input_data);
Retrieve Signed Data
let signed_data = signature.0[0].get_data(&input_data);
Details
Ed25519Signature Structure
The Ed25519Signature
struct is a wrapper around a Vec<Ed25519SignatureOffsets>
, where each Ed25519SignatureOffsets
struct represents a single signature and its associated offsets within the instruction data.
Borsh Integration
The Ed25519Signature
and related structs implement the BorshDeserialize
trait, allowing them to be deserialized from a byte stream using the Borsh serialization format. This makes it easy to work with Solana programs that utilize Borsh for data serialization.
Methods
- get_signer(&self, data: &[u8]) -> &Pubkey: Retrieves the public key (signer) associated with the signature.
- get_signature(&self, data: &[u8]) -> &[u8; 64]: Retrieves the signature data.
- get_data(&self, data: &[u8]) -> Vec: Retrieves the signed data.
Testing
To ensure the correctness of the deserialization and data extraction, it is recommended to write unit tests that validate the behavior of these methods with known inputs.
Example Test
#[test]
fn test_signature_extraction() {
let mut input = /* byte array containing Ed25519 signature data */;
let signature = Ed25519Signature::deserialize_reader(&mut input).unwrap();
let signer = signature.0[0].get_signer(&input_data);
assert_eq!(signer, &expected_pubkey);
}
License
This project is licensed under the MIT License. See the LICENSE file for details.
Dependencies
~12–20MB
~313K SLoC