J.D Nicholls
Founding Full-Stack Web3 Engineer at @baxusco | Digital nomad 🎒 | Mentor 👨🏫 | Speaker 🗣️ | Developer 👨💻 | Creator of @proyecto26 #opensource #developer
- Open Source Contributor 👨💻
- Game developer (Hobby) 🎮
- Developer who loves UX 💫
- Chocolate lover 🍫
- Founding Full-Stack Engineer 👷
AT
Solana has low gas fees, it's really fast...
- Scales natively with Moore's Law
- Great Nakamoto Coefficient of decentralization
Smart contracts on Solana, referred to as "programs", are stateless - meaning they don't store anything except code. Everything happens in accounts, so they're central to Solana, they're used for storage, contracts, and for native blockchain programs.
The program itself doesn't hold a user's data. The program just talks to "accounts" that hold the user's data.
These accounts store data:
These accounts store executable programs (AKA smart contracts).
These accounts are for core blockchain functions like Stake, Vote, etc.
Non-executable Accounts
STORE DATA
Executable Accounts
STORE USER PROGRAMS
STORE NATIVE PROGRAMS
User programs are created by us, and they can be updated by the authority of the program.
(State of a Program)
FIELD | DESCRIPTION |
---|---|
lamports | The # of lamports owned by this account |
owner | The program owner of this account |
executable | Whether this account can process instructions (is executable) |
data | The raw data byte array stored by this account |
rent_epoch | The next epoch that this account will owe rent |
Iamports are the smallest unit of Solana:
1 Iamport = 0.000000001 SOL
{
key: number, // The address of the account
lamports: number, // Lamports currently held
data: Uint8Array, // Data stored in the account
is_executable: boolean, // Is this data a program?
owner: PublicKey, // The program with write access
rent_epoch: number, // System checks whether an account needs to pay rent
}
Iamports defines how much SOL the account has 💰
lamports |
---|
owner |
executable |
data |
rent_epoch |
AccountInfo
Public Key (Address) |
---|
Account
Each account is identifiable by its unique address (Public Key). Based on the size of that arbitrary data (Max 10 mb), a user is required to pay some value of SOL for what’s called "Rent".
Smart contracts on Solana are called programs;
A Solana program is just a piece of code that lives on the blockchain. The blockchain is a place where anyone can run code for a fee and it's being run by miners, in the world of Solana we actually call them validators.
Programs characteristics:
- Special kind of account
- Data is eBPF bytecode
- Written in Rust, C/C++, Python
ON-CHAIN
PROGRAMS
NATIVE
PROGRAMS
- Can only be updated by the authorized account.
- Developed by users
- Can only be updated through network upgrades.
- Integrated into Solana's core.
Native programs are integral to effectively managing accounts and deploying executable code on the Solana blockchain.
On-chain programs are custom programs deployed on the Solana Network through executable accounts.
BPF LOADER
SYSTEM PROGRAM
- Create accounts
- Transfer funds
- Assign Account Ownership
- Allocate Space for Data Accounts
- Account Closure
Basic account management operations:
Deploying and managing executable programs:
- Deploy Programs
- Execute Programs
- Upgrade Programs
- Initialize Program Data
Initial owner of new accounts
Manage programs created by users
data |
---|
owner: BPF Loader |
executable: true |
lamports |
AccountInfo
Public Key (Address) |
---|
Program ID
Account Data
Program Code |
---|
A Solana program uses a unique identifier (Program ID) for invocation and interactions. AccountInfo contains metadata about interacting accounts, and the Account Data stores various types of state information crucial to the program's logic.
data |
---|
owner: BPF Loader |
executable: true |
lamports |
AccountInfo
BPF Loader |
---|
Account Data
Program Code |
---|
Program Account |
---|
owner
Address
data |
---|
owner: Program |
executable: false |
lamports |
Program State |
---|
Data Account |
---|
owner
Address
Instructions
Memory (variables and configurations)
When a executable program is created, two default accounts are involved
{
program_id: number, // The program this instruction is for
keys: Array<{ // Accounts involved in the instruction
key: PublicKey,
is_mutable: boolean, // Defines if the account is mutable
is_signer: boolean,
}>,
data: Uint8Array, // Serialized code (action to perform) + args
}
Program Instructions are the commands that tell a program what actions to perform. They define what operations need to be performed, which accounts are involved and what specific data is required to execute the program logic.
Transactions allows to send an instruction to a Solana program. Transactions send a package of "instructions" to an RPC client, which then forwards it to the network
{
message: {
instructions: Array<Instruction>,
recent_blockhash: number,
fee_payer: PublicKey,
...
},
signers: Array<Uint8Array>,
}
The Metadata Standard on Solana introduces countless ways to customize NFTs and the user’s experience.
Token standard used for creating custom (fungible and non-fungible) tokens like USDC, USDT, etc with a supply and use those tokens in our programs.
SPL tokens simply need instructions sent to the Token Program to create and mint tokens, making the process more efficient and cost-effective compared to Ethereum's ERC-20 tokens.
# Verify installed versions
solana --version
solana-keygen --version
Verify Installed versions
# Verify current configuration
solana config get
# Change RPC url to connect to different clusters in Solana ecosystem
solana config set --url https://api.devnet.solana.com
solana config set --url https://api.mainnet-beta.solana.com
# Local machine
solana config set --url localhost
Change Current Configuration
- devnet: playground for developers and validators to use the same release of mainnet
- testnet: for solana core contributors to test recent releases and features
Solana Clusters
# Generate a new wallet (key-pair)
solana-keygen new
# saved from $HOME/.config/solana/id.json
# Override current key-pair
solana-keygen new --force
# Get the pubkey of the current wallet
solana-keygen pubkey
Manage Authentication (cryptographic key pairs)
# Check the balance of solana tokens of the current wallet
solana balance
# Request new tokens to the current wallet (try a lower amount if fails)
solana airdrop 0.5
# Transfer tokens to a different wallet with a custom amount
solana transfer "TARGET WALLET ADDRESS" 0.2
# if the target wallet is new (not funded yet), you can use the below command
solana transfer "TARGET WALLET ADDRESS" 0.2 --allow-unfunded-recipients
Save the seed phrase and BIP39 passphrase to recover your new keypair 🔐 (ProtonPass, 1Password, etc)
Manage Tokens
# Starts a full-featured, single-node cluster on the developer's workstation
solana-test-validator
# Configure cli tool suite to target the local cluster
solana config set --url http://127.0.0.1:8899
# Verify the cli tool suite config
solana genesis-hash
# Disable runtime features
solana-test-validator --deactivate-feature <FEATURE_PUBKEY_1>
Manage Anchor projects
# Create and initialize a new project with Anchor
anchor init <project-name>
# Compile your project (use the same anchor version of the project in your machine)
anchor build
# Get the list of IDs (addresses) of your programs in your Anchor project
anchor keys list
# Run program tests
anchor test
What mechanism does Solana use to synchronize local virtual clocks on all nodes?
Proof-of-History (PoH)
What's the nature of PoH for production and verification?
PoH is difficult to produce but easy to verify.
When considering TBFT in Solana, what is the approximate time duration for one slot?
Every 400ms, a new potential rollback point occurs in the Solana network due to the slot duration
In the context of Solana's TBFT, what action takes place when a leader seems to have failed?
Another node attempts to take his place by initiating an election process
What does Turbine aim to reduce by utilizing a smart block propagation protocol?
Time needed for block propagation
How are nodes in the network organized in the Turbine protocol?
Into neighborhoods; nodes within a particular neighborhood in the Turbine protocol are responsible for sharing received data with other nodes in the same neighborhood.
How is propagation priority determined in Turbine?
Stake-weighted selection algorithm. This algorithm prioritizes propagation based on the amount of stake validators hold in the network. Validators with higher stakes are placed closer to the current leader for efficient data sharing.
What does Gulf Stream serve as in Solana?
A mempool-less solution for forwarding and storing transactions before processing.
What is the primary role of the mempool in traditional blockchains?
Store transactions being broadcasted but not yet processed.
Why can Solana execute transactions in parallel?
Each Solana transaction describes all the states required to read and write to, enabling non-overlapping instructions to be executed simultaneously.
Why did the Solana team develop the Transaction Processing Unit (TPU)?
To validate and execute transactions quickly before receiving another block. It ensures efficient processing of transactions to maintain the network's speed and performance.
What are the pipeline stages of the TPU?
- Data fetch in kernel space via network card (I/O).
- Signature verification using GPU
- Change of the state using CPU (banking).
- Write to the disk in kernel space and send out via network card (I/O).
What becomes a bottleneck after achieving fast computation in blockchain systems?
The memory becomes a bottleneck due to the limitations of storing everything in RAM
How does Cloudbreak handle data storage?
It makes use of memory-mapped files.
How is data integrity ensured among the specialized network nodes?
By splitting into small pieces and replicating the data multiple times.
- Shyft, full-suite Solana Development Experience
By J.D Nicholls
A brief presentation about Solana
Founding Full-Stack Web3 Engineer at @baxusco | Digital nomad 🎒 | Mentor 👨🏫 | Speaker 🗣️ | Developer 👨💻 | Creator of @proyecto26 #opensource #developer