Rust Example
Learn how to write a simple Rust program that delegates and increments a counter on Solana
This guide will walk you through the process of writing a simple native Rust program (without Anchor dependencies) that increments a counter. You’ll learn how to deploy this program on Solana and interact with it using a Typescript test script.
Software Packages
This program is developed and tested with the following software packages. Other sofware may also be compatible.
Software | Version | Installation Guide |
---|---|---|
Solana | 2.0.21 | Install Solana |
Rust | 1.82.0 | Install Rust |
Quick Access
If you prefer to dive straight into the code:
Core Functionality
The program implements two main instructions:
InitializeCounter
: Initialize and sets the counter to 0 (called on Base Layer)IncreaseCounter
: Increments the initialized counter by X amount (called on Base Layer or ER)
The program implements three instructions for delegating and undelegating the counter:
Delegate
: Delegates counter from Base Layer to ER (called on Base Layer)CommitAndUndelegate
: Schedules sync of counter from ER to Base Layer, and undelegates counter on ER (called on ER)Commit
: Schedules sync of counter from ER to Base Layer (called on ER)Undelegate
: Undelegates counter on the Base Layer (called on Base Layer through validator CPI)
Here’s the core structure of our program:
Your “Undelegate” instruction must have the exact discriminator. It is never called by you, instead the validator on the Base Layer will callback with a CPI into your program after undelegating your account on ER.
Delegating the Counter PDA
In order to delegate the counter PDA, and make it writable in an Ephemeral Rollup session, we need to add an instruction which
internally calls the delegate_account
function. delegate_account
will CPI to the delegation program, which upon validation will gain ownership of the account.
After this step, an ephemeral validator can start processing transactions on the counter PDA and propose state diff trough the delegation program.
Transaction (Base Layer): Delegate
Committing while the PDA is delegated
The ephemeral runtime allow to commit the state of the PDA while it is delegated. This is done by calling the commit_accounts
function.
Transaction (ER): Commit
Inspect transaction details on Solana Explorer
Transaction (Base layer): Commit
Inspect transaction details on Solana Explorer
Undelegating the PDA
Undelegating the PDA is done by calling the commit_and_undelegate_accounts
as part of some instruction.
Undelegation commit the latest state and give back the ownership of the PDA to the owner program. After undelegating and finalizing the state, the validator will create a callback CPI into “undelegate” on the Base Layer.
Transaction (ER): Undelegate
Inspect transaction details on Solana Explorer
Transaction (Base layer): Undelegate
Inspect transaction details on Solana Explorer
Testing the program
Build valid transactions that calls your program instructions for delegation and undelegation. The complete test for this project can be found in the Typescript Test Script.
Test delegation
transaction
Create a instruction with the right order and attributes of accounts, and the instruction discriminator for delegation
of your program. Send the transaction with the instruction to Base Layer (Solana) network.
Transaction (Base Layer): Delegate
Inspect transactions details on Solana Explorer
Test commit
transaction
Create a instruction with the right order and attributes of accounts, and the instruction discriminator for commit
of your program. Send the transaction with the instruction to ER network.
Transaction (ER): Commit
Inspect transaction details on Solana Explorer
Transaction (Base layer): Commit
Inspect transaction details on Solana Explorer
Test undelegation
transaction
Create a instruction with the right order and attributes of accounts, and the instruction discriminator for undelegation
of your program. Send the transaction with the instruction to ER network.
Transaction (ER): Undelegate
Inspect transaction details on Solana Explorer
Transaction (Base layer): Undelegate
Inspect transaction details on Solana Explorer
Ephemeral Endpoint Configuration
To interact with the Ephemeral Rollup session, you need to configure the appropriate endpoint:
-
For devnet, use the following ephemeral endpoint:
-
For mainnet, please reach out to the MagicBlock team to receive the appropriate endpoint.
Make sure to update your client configuration to use the correct endpoint based on your development or production environment.
Currently the routing to different endpoints needs to be done manually. These
public RPC endpoints are currently free and supported for development:
Solana Devnet: https://api.devnet.solana.com
ER Devnet: https://devnet.magicblock.app
A smart RPC router for
automatic routing is under development.
Was this page helpful?