An implementation of Plutus in pure Go.
This package aims to only support Untyped Plutus Core because that is all that is needed for a full node. The other stuff like Typed Plutus Core and Plutus IR is for Plinth.
plutigo implements the following Cardano Improvement Proposals (CIPs) related to Plutus Core:
serialiseData builtin for CBOR serialization of Plutus Datakeccak_256 hash functionexpModInteger for modular exponentiationripemd_160 hash functiondropList builtinlengthOfArray, listToArray, indexArray)insertCoin, lookupCoin, scaleValue, unionValue, valueContains)multiIndexArray builtin for batch array indexingAll implemented CIPs include comprehensive conformance tests ensuring correct behavior and cost modeling.
plutigo is optimized for high-performance Plutus script evaluation:
Evaluates complex smart contracts in milliseconds with accurate cost modeling. Go 1.26 delivers ~10% faster full-script execution vs Go 1.25 across all Plutus test scripts.
cek/): Optimized evaluation engine with object pooling and memory-efficient state managementsyn/): Parser, pretty-printer, and AST transformations with De Bruijn conversionbuiltin/): Complete Plutus builtin function implementationsdata/): CBOR encoding/decoding for Plutus data typesgo get github.com/blinklabs-io/plutigo
package main
import (
"fmt"
"github.com/blinklabs-io/plutigo/cek"
"github.com/blinklabs-io/plutigo/syn"
)
func main() {
input := `
(program 1.2.0
[
[
(builtin addInteger)
(con integer 1)
]
(con integer 1)
]
)
`
pprogram, _ := syn.Parse(input)
program, _ := syn.NameToDeBruijn(pprogram)
// Create a machine using the default cost model at protocol major 200.
ctx := cek.NewDefaultEvalContext(program.Version, cek.ProtoVersion{Major: 200})
machine := cek.NewMachine[syn.DeBruijn](program.Version, 0, ctx)
term, _ := machine.Run(program.Term)
prettyTerm := syn.PrettyTerm[syn.DeBruijn](term)
fmt.Println(prettyTerm) // Output: (con integer 2)
}
plutigo supports all major Plutus protocol versions:
The library automatically selects appropriate cost models and builtin behavior based on the program version.
git clone https://github.com/blinklabs-io/plutigo.git
cd plutigo
go mod tidy
# Run all tests
make test
# Run benchmarks
make bench
# Run fuzz tests
make fuzz
The project maintains high code quality standards:
We welcome contributions! Please see our Development Guide for setup, workflow, and contribution guidelines.
For organization-wide policies, see the Blink Labs Contributing Guide.
$ claude mcp add plutigo \
-- python -m otcore.mcp_server <graph>