linera-io/linera-protocol
Main repository for the Linera protocol
Backblaze Generative Media Hackathon
Build the next generation of AI media apps with Genblaze, stored on Backblaze B2. $10,000 in prizes.
Loading star history...
Use Cases & Benefits
- Linera Protocol is a decentralized blockchain infrastructure designed for scalable, secure, low-latency Web3 applications.
- Built in Rust, it features modular crates for cryptography, chain management, RPC, client libraries, and Wasm-based app development.
- Strengths include high scalability, modular design, and active maintenance; limitations may include complexity for new users and Rust ecosystem dependency.
- Organizations can deploy Linera for building and running secure blockchain apps with cross-chain messaging and client-server synchronization in production.
- Ideal use cases are Web3 applications requiring fast, scalable blockchain infrastructure with multi-chain support and Rust/Wasm development environments.
About linera-protocol
Linera is a decentralized blockchain infrastructure designed for highly scalable, secure, low-latency Web3 applications.
Documentation
Visit our developer page and read our whitepaper to learn more about the Linera protocol.
Repository Structure
The main crates and directories of this repository can be summarized as follows: (listed from low to high levels in the dependency graph)
-
linera-baseBase definitions, including cryptography. -
linera-versionA library to manage version info in binaries and services. -
linera-viewsA library mapping complex data structures onto a key-value store. The corresponding procedural macros are implemented inlinera-views-derive. -
linera-executionPersistent data and the corresponding logic for runtime and execution of Linera applications. -
linera-chainPersistent data and the corresponding logic for chains of blocks, certificates, and cross-chain messaging. -
linera-storageDefines the storage abstractions for the protocol on top oflinera-chain. -
linera-coreThe core Linera protocol, including client and server logic, node synchronization, etc. -
linera-rpcDefines the data-type for RPC messages (currently all client ↔ proxy ↔ chain ↔ chain interactions), and track the corresponding data schemas. -
linera-clientLibrary for writing Linera clients. Used for the command-line client and the node service inlinera-service, as well as the Web client inlinera-web. -
linera-serviceExecutable for clients (aka CLI wallets), proxy (aka validator frontend) and servers. -
linera-sdkThe library to develop Linera applications written in Rust for the Wasm virtual machine. The corresponding procedural macros are implemented inlinera-sdk-derive. -
examplesExamples of Linera applications written in Rust.
Prerequisites
See INSTALL.md for software requirements to develop in this repo.
Quickstart with the Linera CLI tool
The following commands set up a local test network and run some transfers between the microchains owned by a single wallet.
# Make sure to compile the Linera binaries and add them in the $PATH.
# cargo build -p linera-storage-service -p linera-service --bins
export PATH="$PWD/target/debug:$PATH"
# Import the optional helper function `linera_spawn`.
source /dev/stdin <<<"$(linera net helper 2>/dev/null)"
# Run a local test network with the default parameters and a number of microchains
# owned by the default wallet. This also defines `LINERA_TMP_DIR`.
linera_spawn \
linera net up --with-faucet --faucet-port 8080
# Remember the URL of the faucet.
FAUCET_URL=http://localhost:8080
# If you're using a testnet, start here and run this instead:
# LINERA_TMP_DIR=$(mktemp -d)
# FAUCET_URL=https://faucet.testnet-XXX.linera.net # for some value XXX
Enable logs for user applications:
export LINERA_APPLICATION_LOGS=true
Set the path of the future wallet:
export LINERA_WALLET="$LINERA_TMP_DIR/wallet.json"
export LINERA_KEYSTORE="$LINERA_TMP_DIR/keystore.json"
export LINERA_STORAGE="rocksdb:$LINERA_TMP_DIR/client.db"
# Initialize a new user wallet.
linera wallet init --faucet $FAUCET_URL
# Request chains.
INFO1=($(linera wallet request-chain --faucet $FAUCET_URL))
INFO2=($(linera wallet request-chain --faucet $FAUCET_URL))
CHAIN1="${INFO1[0]}"
ACCOUNT1="${INFO1[1]}"
CHAIN2="${INFO2[0]}"
ACCOUNT2="${INFO2[1]}"
# Show the different chains tracked by the wallet.
linera wallet show
# Query the chain balance of some of the chains.
linera query-balance "$CHAIN1"
linera query-balance "$CHAIN2"
# Transfer 10 units then 5 back.
linera transfer 10 --from "$CHAIN1" --to "$CHAIN2"
linera transfer 5 --from "$CHAIN2" --to "$CHAIN1"
# Query balances again.
linera query-balance "$CHAIN1"
linera query-balance "$CHAIN2"
# Now let's fund the user balances.
linera transfer 5 --from "$CHAIN1" --to "$ACCOUNT1@$CHAIN1"
linera transfer 2 --from "$ACCOUNT1@$CHAIN1" --to "$ACCOUNT2@$CHAIN2"
# Query user balances again.
linera query-balance "$ACCOUNT1@$CHAIN1"
linera query-balance "$ACCOUNT2@$CHAIN2"
More complex examples may be found in our developer manual as well as the example applications in this repository.
Contributing
We welcome contributions from the community! If you'd like to contribute to the Linera protocol:
- Fork the repository
- Create a feature branch (
git checkout -b feature/amazing-feature) - Commit your changes (
git commit -m 'Add some amazing feature') - Push to the branch (
git push origin feature/amazing-feature) - Open a Pull Request
For detailed guidelines, see our contribution guide.
Discover Repositories
Search across tracked repositories by name or description