Rust has become one of the defining languages of modern systems programming, and Solana is one of its most ambitious production deployments. But the decision to build Solana in Rust was far from obvious. Its founders considered C and Haskell as well, weighing raw performance and ecosystem maturity against type safety, developer experience, and the ability to reason about complex distributed systems.
In this interview, we speak with Solana cofounder Greg Fitzgerald about why Rust ultimately proved to be the right fit. We discuss how his background in C++, LLVM, and Haskell shaped Solana’s architecture, what functional programming contributed to the design of a high-performance blockchain runtime, and why Rust’s combination of strong types, memory safety, and low-level control worked particularly well for BPF and virtual-machine development.
We also explore where Rust still differs from the functional-programming ideal, how algebraic data types and zero-cost abstractions are used in production Solana code, and what Haskell engineers can bring to blockchain, consensus, and systems programming, provided they learn to think not only about what their data means, but also about who owns it.

You have a strong programming-language background, and Solana became one of the most prominent large-scale Rust systems in production. Looking back at the early architecture, what made Rust feel like the right language for Solana specifically, not just in terms of memory safety, but in terms of expressing a high-performance distributed runtime?
My cofounder Anatoly and I were weighing C, Rust, and Haskell early on. We had plenty of experience with C and Haskell, but both had real trade-offs. Coming from Qualcomm’s LLVM team, where I spent a lot of time helping the Chrome team debug memory issues in their enormous C++ codebase, I knew how much those bugs kill productivity, even with the best tools. We really wanted to use Haskell for the developer experience, but the ecosystem just wasn’t big enough for what we needed: a high-performance runtime, which is a classic systems engineering challenge. Then we found Rust. It offered memory safety and no garbage collection, plus a strong type system. Since I knew C/C++ and Haskell, the learning curve was pretty smooth—the documentation was excellent. Maturity was the only real question mark. I was worried a compiler bug might block us, but I figured that given my background with LLVM (which powers Rust), I could jump in and fix the compiler myself if I had to. Off to the races.
Haskell and Rust both attract engineers who care about correctness, types, and explicit reasoning, but they make very different tradeoffs: Haskell leans on purity, laziness, and high-level abstraction, while Rust leans on ownership, lifetimes, and predictable low-level control. In the kind of systems Solana had to build, where did Rust’s model help more than a Haskell-like model would have?
It’s really about finding that middle ground—thinking in Haskell, but coding in Rust. Honestly, I don’t think the Solana runtime would look the way it does today without those years I spent living in functional programming and property-based testing. In my head, the code is basically Haskell, but I’m manually translating it into Rust. It gives us the best of both worlds: the clean logic of functional design, with the total control over memory layout and allocations that you need for high-performance systems.
Solana programs are written mostly in Rust, compiled through LLVM to Solana’s bytecode format, and executed in a constrained VM. From a language-design perspective, what parts of Rust map especially well to that environment, and what parts of the language or ecosystem had to be adapted, restricted, or worked around?
Rust and BPF are a perfect match. When you attempt to target BPF from C, memory errors show up as obscure runtime errors in the BPF interpreter. Because Rust is memory-safe, once the code compiles, it pretty much just works. The main hurdles are just standard embedded constraints—using no_std and being disciplined about stack usage. One detail that really helped us bridge the gap was Rust’s ability to define precise memory layouts with #[repr©]; it was critical for the interface between the VM and the runtime, giving us that predictable, low-level control we needed.
Haskell developers often think in terms of algebraic data types, strong invariants, and making invalid states unrepresentable. Rust also supports this style, but in a very different operational setting. In Solana’s core code or program model, are there examples where type-level modeling directly improved reliability, performance, or security?
Absolutely. We use a compact binary format for network messages to minimize bandwidth, but it’s dense and difficult to work with. Algebraic data types were the perfect way to abstract that complexity away without adding runtime overhead. We built a zero-cost abstraction for it—our team created an encoder/decoder called ‘wincode.’ It implements the popular ‘bincode’ format but uses Google’s ZeroCopy to keep memory allocations to a minimum. Check out the code at https://docs.rs/wincode/latest/wincode/.
Rust is sometimes described as bringing “some functional-programming discipline” into systems programming, while staying close to the metal. Do you think Rust took the right subset of ideas from languages like Haskell and ML, or are there functional ideas you still wish Rust had adopted more deeply?
That’s a tough one. Rust does a remarkable job balancing being accessible to systems programmers while absorbing some of the most powerful features of modern programming languages, like using affine types for memory management. But I also appreciate Haskell’s top-down, point-free style where you can reason about programs mathematically. Lowering that into Rust’s more verbose syntax, you inevitably lose some of that conciseness. I don’t know if there’s a sensible way to allow for both styles, but how great would it be if you could provide the compiler a function definition in each style and have the compiler prove that two are observably equivalent? I’d “comment” low-level code with a purely functional implementation. That said, I’m genuinely grateful for the trade-offs the community has made—my C/C++ team probably wouldn’t have been as successful if Rust had gone too far down the pure functional rabbit hole.
If a senior Haskell engineer wanted to become effective in Rust for blockchain, consensus, or virtual-machine work, what mental models would they need to change first? Conversely, what Haskell habits would you encourage them to keep?
For Haskell developers moving into systems work, the biggest hurdle isn’t the syntax; it’s the shift from ‘everything is data’ to ‘everything has an owner.’ You have to internalize the borrow checker. But keep your Haskell instincts: property-based testing and the obsession with making invalid states unrepresentable are exactly what we need here.
The Alpenglow protocol is the perfect sandbox for these skills. The Anza team just wrapped up a 50,000 SOL bug bounty program for it, which really put the implementation to the test. If you want to see how theory holds up in production, you can check out the Alpenglow whitepaper at https://www.anza.xyz/blog/alpenglow-a-new-consensus-for-solana or explore the project details at https://alpenglow.anza.xyz/. Modeling something like this in Lean or Haskell is the ultimate audit—it’s the best way to see how those theoretical models hold up when the rubber meets the road.
.png)

