Skip to main content

Solana: How to prevent signature replay when using Ed25519 Native Program

By February 6, 2025CRYPTOCURRENCY

Preventing Signature Replays on Solana with Ed25519 Native Programs

If you are using Solana’s native Ed25519 program to verify message signatures, it is essential to implement measures to prevent replay attacks. One common technique is to add a pre-instruction that contains the sender’s signature, message, and public key. In this article, we will look at how you can achieve this security feature in your custom program.

Why prevent signature replays?

Signature replay attacks occur when an attacker captures and reuses a previously verified signature. This can be devastating for Solana-based systems, as it allows attackers to impersonate legitimate users and perform malicious transactions without consequences.

Ed25519 Implementing Native Programs on Solana

To prevent signature replay, we use the “Solana-program” library, which provides native program implementations on the Solana blockchain. We will focus on creating a pre-instruction that contains the sender’s signature, message, and public key.

Here is an example of how to create a pre-instruction using TypeScript:

import { Program } from: '@solana-program/spl-program';

import { solanaProgram } from: '../src';

const programId = 'program_id'; // Replace with your program ID

class SignatureReplayPreInstruction extends Program {

async getProgramData(programId: string): Promise {

const signature = 'your_signature_here'; // Replace with the actual signature

const message = 'your_message_here'; // Replace with the actual message

const publicKey = 'your_public_key_here'; // Replace with the actual public key

return JSON.stringify({

signature,

message

publicKey,

});

}

async execute(programId: string, data: string): Promise {

if (data.startsWith('pre_instruction')) {

const preInstruction = JSON.parse(data.substring(9));

console.log(Preinstruction received with signature ${preInstruction.signature}, message ${preInstruction.message}, and public key ${preInstruction.publicKey});

}

}

}

// Initialize the program

const program = new solanaProgram(programId, SignatureReplayPreInstruction);

In this example, we define a class “SignatureReplayPreInstruction” that extends the class “Program”. The method “getProgramData” returns a string containing the sender’s signature, message, and public key.

The method “execute” checks if the received data starts with “pre_instruction”. If so, it parses the data as JSON and logs the contents to the console.

Using pre_instruction in Ed25519 native programs

Solana: How to prevent signature replay when using Ed25519 Native Program

To use pre_instruction in Ed25519 native programs, you need to modify the “nativeScript” function to extract the signature, message, and public key from the received data. Here is an example of how to do this:

“` typescript

import { Program } from: ‘@solana-program/spl-program’;

import { ed25519NativeScript } from ‘../src’;

const programId = ‘programId’; // Replace with your programId

class SignatureReplayPreInstruction extends Program {

async getProgramData(programId: string): Promise {

const signature = ‘your_signature_here’; // Replace with the actual signature

const message = ‘your_message_here’; // Replace with the actual message

const publicKey = ‘your_public_key_here’; // Replace with the actual public key

return JSON.stringify({

signature,

message

publicKey,

});

}

async execute(programId: string, data: string): Promise {

if (data.startsWith(‘pre_instruction’)) {

const preInstructionData = data.substring(9);

const [signature, message, publicKey] = preInstructionData.split(‘,’);

console.

DUMP FIAT GOVERNANCE

Leave a Reply