Paladin Logo

Paladin - P3 Runbook

Paladin is a Solana validator client that protects validators from sandwiching while helping them earn more in block rewards. Here's how to get started:

1. Get your validator whitelisted

While Paladin is in beta, access to receive p3 transactions requires getting whitelisted. This ensures you'll be able to receive P3 transactions and earn additional block rewards.

Please fill out the validator whitelisting request form:

After submitting the form, our team will review your request and follow up with next steps. You can proceed with the steps below in parallel.

2. Download and build paladin-solana

To run Paladin, you need to build the paladin-solana client from source. It's based on jito-solana.

You run it with your usual validator setup like you'd run jito-solanano additional flags are necessary.

The latest version of paladin-solana is v2.1.16-paladin, which is rebased to jito-v2.1.16.

Building from source

Important: Always build from the latest release source code, not from the master branch. The master branch should not be considered production-ready.

Download the release source code:

# Clone the repository with submodules

$ git clone --recursive https://github.com/paladin-bladesmith/paladin-solana.git
$ cd paladin-solana
$ git checkout v2.1.16-paladin # Check out the latest release tag
$ git submodule update --init --recursive # Ensure all submodules are initialized

# Build the release version

$ ./cargo build --release

The build process requires a standard Rust toolchain and Solana build dependencies. Make sure you have these installed before building.

Note: Like jito-solana, the binary that's built is called agave-validator.

When you check the client name you're running through solana --version, you'll see "Jito-solana". This is expected behavior.

3. Spin up your node with paladin-solana

Most validators have their own way of running Solana validator clients. If you run jito-solana, you can swap paladin-solana into your standard DevOps process.

Note: paladin-solana does not require any special flags when starting up relative to jito-solana. You should be able to apply the same flags you do in your typical setup.

4. Share your validator identity public key

Reach out to @edgarpavlovsky on telegram with your validator identity public key.

5. Open and whitelist required ports

While Paladin is in beta, access to transaction sending ports is IP-whitelisted. In production, these ports will be token-gated through locking $PAL.

Important: Port 4818 has been deprecated in favor of ports 4819 and 4820. Please ensure port 4818 is closed.

For P3 to work properly on your machine, you'll need to open and whitelist the following UDP ports for trusted IPs that are sending high priority transactions:

  • 4819: QUIC port for P3 transactions (include on revert)
  • 4820: QUIC port for "MEV" P3 transactions (fail on revert)

Please reach out to @edgarpavlovsky on telegram for the current list of IPs to whitelist.

Example commands:

To whitelist on Ubuntu/Debian machines, ufw is a popular choice:

# Enable UFW if not already enabled
$ sudo ufw enable

# Allow specific IP address to access required ports
$ sudo ufw allow proto UDP from WHITELISTED_ADDRESS to any port 4819
$ sudo ufw allow proto UDP from WHITELISTED_ADDRESS to any port 4820
# Verify the rules
$ sudo ufw status

NOTE: This port will not be listening until your validator catches up with the chain. Once caught up, you should see this port listening for its respective protocols.

6. How can I check if I'm receiving P3 transactions?

P3 implements the same datapoint_info! tracking macro that's used throughout the rest of the agave client. When receiving P3 transactions, metrics will be logged like:

datapoint_info!(
    "p3_quic",
    ("age_ms", age_ms as i64, i64),
    ("regular_packets_forwarded", self.reg_forwarded as i64, i64),
    ("regular_packets_dropped", self.reg_dropped as i64, i64),
    ("mev_packets_forwarded", self.mev_forwarded as i64, i64),
    ("mev_packets_dropped", self.mev_dropped as i64, i64),
    ("staked_nodes_us", self.staked_nodes_us as i64, i64),
);

You can monitor these metrics in your logs to confirm that your node is successfully receiving and processing P3 transactions. Note that "regular_packets" refers to non-revert packets sent to port 4819, while "mev_packets" refers to revert-on-fail packets sent to port 4820.