https://github.com/blinklabs-io/plutigo
Untyped Plutus Core in Go
https://github.com/blinklabs-io/plutigo
blockchain cardano go golang plutus
Last synced: 3 months ago
JSON representation
Untyped Plutus Core in Go
- Host: GitHub
- URL: https://github.com/blinklabs-io/plutigo
- Owner: blinklabs-io
- License: apache-2.0
- Created: 2023-04-25T20:39:40.000Z (about 3 years ago)
- Default Branch: main
- Last Pushed: 2026-02-07T04:01:18.000Z (5 months ago)
- Last Synced: 2026-02-07T14:25:10.042Z (5 months ago)
- Topics: blockchain, cardano, go, golang, plutus
- Language: Go
- Homepage:
- Size: 1.06 MB
- Stars: 37
- Watchers: 1
- Forks: 3
- Open Issues: 1
-
Metadata Files:
- Readme: README.md
- License: LICENSE
- Codeowners: .github/CODEOWNERS
- Agents: AGENTS.md
Awesome Lists containing this project
README
# plutigo
An implementation of [Plutus](https://github.com/IntersectMBO/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.
## Features
- Complete Plutus Support: Implements Untyped Plutus Core (UPLC) evaluation
- Multi-Version Support: Compatible with Plutus V1, V2, V3, and initial Plutus V4 support
- Cost Model Integration: Automatic cost model selection based on Plutus version (Plutus V4 cost models are placeholders)
- High Performance: Optimized CEK machine implementation in pure Go
- Cryptographic Operations: Full BLS12-381 support using gnark-crypto
- Comprehensive Testing: 49.9% test coverage with fuzz testing and property-based testing
## Supported CIPs
plutigo implements the following Cardano Improvement Proposals (CIPs) related to Plutus Core:
- [CIP-0042](https://cips.cardano.org/cips/cip42/): `serialiseData` builtin for CBOR serialization of Plutus Data
- [CIP-0049](https://cips.cardano.org/cips/cip49/): ECDSA and Schnorr signature verification builtins
- [CIP-0058](https://cips.cardano.org/cips/cip58/): Bitwise primitives for integers
- [CIP-0085](https://cips.cardano.org/cips/cip85/): Sums-of-products (constructor and case expressions)
- [CIP-0091](https://cips.cardano.org/cips/cip91/): Optimized builtin evaluation (no forced evaluation for saturated calls)
- [CIP-0101](https://cips.cardano.org/cips/cip101/): `keccak_256` hash function
- [CIP-0109](https://cips.cardano.org/cips/cip109/): `expModInteger` for modular exponentiation
- [CIP-0121](https://cips.cardano.org/cips/cip121/): Integer to ByteString conversions
- [CIP-0122](https://cips.cardano.org/cips/cip122/): Logical operations on ByteString
- [CIP-0123](https://cips.cardano.org/cips/cip123/): Bitwise operations on ByteString
- [CIP-0127](https://cips.cardano.org/cips/cip127/): `ripemd_160` hash function
- [CIP-0132](https://cips.cardano.org/cips/cip132/): `dropList` builtin
- [CIP-0133](https://cips.cardano.org/cips/cip133/): BLS12-381 multi-scalar multiplication
- [CIP-0138](https://cips.cardano.org/cips/cip138/): Array type and operations (`lengthOfArray`, `listToArray`, `indexArray`)
- [CIP-0153](https://cips.cardano.org/cips/cip153/): Mary-era Value builtins (`insertCoin`, `lookupCoin`, `scaleValue`, `unionValue`, `valueContains`)
- [CIP-0156](https://cips.cardano.org/cips/cip156/): `multiIndexArray` builtin for batch array indexing
- [CIP-0381](https://cips.cardano.org/cips/cip381/): BLS12-381 pairing operations
### Testing and Conformance
All implemented CIPs include comprehensive conformance tests ensuring correct behavior and cost modeling.
## Performance
plutigo is optimized for high-performance Plutus script evaluation:
### Cryptographic Operations (Go 1.24, ARM64)
- SHA256: 96 ns/op
- Blake2b-256: 331 ns/op
- Ed25519 Verify: 251 μs/op
- ECDSA Verify: 379 μs/op
- BLS12-381 G1 Add: 3.5 μs/op
- BLS12-381 Pairing: 3.3 ms/op
### Plutus Script Evaluation
Evaluates complex smart contracts (Uniswap, vesting, etc.) in milliseconds with accurate cost modeling.
## Architecture
### Core Components
- CEK Machine (`cek/`): Optimized evaluation engine with object pooling and memory-efficient state management
- Syntax Layer (`syn/`): Parser, pretty-printer, and AST transformations with De Bruijn conversion
- Builtin Functions (`builtin/`): Complete Plutus builtin function implementations
- Data Layer (`data/`): CBOR encoding/decoding for Plutus data types
### Design Decisions
- Pure Go: No CGO dependencies for better portability and security
- Memory Safety: Comprehensive nil-pointer analysis and bounds checking
- Version Compatibility: Automatic cost model and builtin selection by Plutus version
- Testing First: Property-based testing and fuzzing ensure correctness
## Usage
### Install
```sh
go get github.com/blinklabs-io/plutigo
```
### Example
```go
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)
}
```
## Plutus Version Support
plutigo supports all major Plutus protocol versions:
- Plutus V1 (1.0.0): Alonzo era - Basic builtin functions
- Plutus V2 (1.1.0): Vasil era - Additional crypto builtins
- Plutus V3 (1.2.0+): Chang+ era - Latest features and optimizations
- Plutus V4 (1.3.0+): Initial support with placeholder cost models
The library automatically selects appropriate cost models and builtin behavior based on the program version.
## Development
### Prerequisites
- Go 1.24+
- make
### Setup
```sh
git clone https://github.com/blinklabs-io/plutigo.git
cd plutigo
go mod tidy
```
### Testing
```sh
# Run all tests
make test
# Run benchmarks
make bench
# Run fuzz tests
make fuzz
```
### Code Quality
The project maintains high code quality standards:
- Linting: Passes golangci-lint with zero issues
- Nil Safety: Passes nilaway static analysis
- Test Coverage: 49.9% coverage across all packages
- Fuzz Testing: Continuous fuzzing for parsing and evaluation
## Contributing
We welcome contributions! Please see our [Development Guide](DEVELOPMENT.md) for setup, workflow, and contribution guidelines.
For organization-wide policies, see the [Blink Labs Contributing Guide](https://github.com/blinklabs-io/.github/blob/main/CONTRIBUTING.md).