Skip to content

BLS12-381 Plutus scripts fail with native Yaci Store on Scalus evaluator (missing blst JNI config) #183

Description

@beanbot-gh

Summary

Yaci DevKit runs the native Yaci Store binary by default (yaci.store.mode=native in both applications/cli/config/application.properties and applications/cli/docker/application.properties), and the default transaction evaluator is scalus.

Scalus reaches the blst native library for BLS12-381 primitives, and the GraalVM native-image build of Yaci Store has no JNI/resource configuration for it. So under store.submit.tx-evaluator-mode=scalus, Plutus scripts that use BLS12-381 builtins fail to evaluate in the native Store binary that DevKit ships.

All other Plutus scripts are unaffected — the failure is confined to the code paths that touch the blst JNI binding.

Upstream root cause: bloxbean/yaci-store#1045 (to be fixed on release/2.0.1_devkit).

This issue tracks the DevKit-side impact and follow-up.

Why DevKit is affected

DevKit picks the evaluator at devnet start in YaciStoreService.resolveTxEvaluatorMode(): it uses ogmios when Ogmios is enabled and running, and otherwise falls back to scalus. The mode is passed to the Store both as STORE_SUBMIT_TX_EVALUATOR_MODE and via the generated store.submit.tx-evaluator-mode.

So whether a BLS12-381 contract can be evaluated depends on which evaluator is active:

Distribution / platform Ogmios available BLS12-381 scripts Other Plutus scripts
Docker linux/amd64 ✅ with Ogmios, ❌ on Scalus
Docker linux/arm64 ✅ (native binaries) ✅ with Ogmios, ❌ on Scalus
Zip on Linux (x86_64 / arm64) ✅ when enabled ✅ with Ogmios, ❌ on Scalus
Zip on macOS ❌ no usable upstream build cannot be evaluated at all

The macOS zip row is the notable one. Ogmios publishes no self-contained macOS build — the aarch64-macos artifact is dynamically linked against Nix store paths and fails with dyld: Library not loaded: /nix/store/...libffi.8.dylib — so on a native macOS install Scalus is the only available evaluator, and BLS12-381 contracts cannot be evaluated there until the upstream fix lands.

Follow-up in DevKit

  • Track Scalus: BLS12-381 builtins fail in GraalVM native image — missing JNI/resource config for blst yaci-store#1045 and bump yaci.store.tag / yaci.store.version in applications/cli/config/download.properties once the fix lands on release/2.0.1_devkit.
  • Rebuild the bundled native Store binaries (applications/store-build/Earthfile, STORE_NATIVE_BRANCH) after the upstream fix.
  • Document the limitation: with the Scalus evaluator, BLS12-381 contracts do not evaluate on the native Store binary. Recommend enabling Ogmios (or the Docker distribution on macOS) for those contracts in the meantime.
  • Add an e2e check that submits a Plutus transaction using BLS12-381 builtins and asserts successful script cost evaluation, run against both evaluator modes and against the native Store binary — the build succeeds and only fails at runtime on a path ordinary tests never reach, which is why this went unnoticed.

Related work

This surfaced while implementing ADR-0016 (upgrade to CardanoSolutions Ogmios v7.0.0 / Kupo v2.12, restore native arm64, and make Ogmios the default tx evaluator). Enabling Ogmios by default in the Docker distribution incidentally makes BLS12-381 contract evaluation work out of the box there, since the ogmios evaluator does not go through blst.

Notes

The missing configuration has been verified as absent across main, release/2.0.x and release/2.0.1_devkit in yaci-store, and across the full history of all refs (details in bloxbean/yaci-store#1045).

Metadata

Metadata

Assignees

Labels

No labels
No labels

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions