6.1 KiB
Lyng as a Common Platform for Smart Contracts and Distributed Execution
Executive Summary
This proposal describes Lyng as a shared execution layer for:
- smart contracts across different blockchain networks,
- distributed compute workflows,
- decentralized application logic.
The goal is simple: write business logic once in Lyng, then run it consistently across chains, trusted execution nodes, and off-chain workers.
Why a Common Lyng Layer
A unified language and runtime reduces fragmentation between contract code, off-chain services, and automation scripts.
Key benefits:
- One language across environments: the same Lyng code can be reused in contracts, validators, and distributed tasks.
- Capability-safe by default: no filesystem, process, or host access unless explicitly exposed by the host platform.
- Async-first execution model: lightweight concurrent tasks are natural, and host runtimes can schedule them efficiently.
- Strong typing with inference: concise source code without sacrificing type safety.
- Deterministic execution options: instruction/gas counting can be enabled for metered environments.
- Broad platform support: JVM, JS/Wasm, and native targets enable consistent tooling and deployment.
Where It Fits
Lyng is a strong fit for:
- contract logic that must also run in simulation or off-chain verification,
- distributed orchestration and rule-based automations,
- cross-network shared libraries (validation, accounting rules, policy checks),
- deterministic business logic that should be portable between operators.
Proposed Architecture
- Primary runtime: Lyng VM/JIT for high-throughput trusted execution.
- Metered runtime: Lyng VM mode with instruction counting and gas limits for blockchain execution.
- Standard API surface:
- core Lyng standard library,
- storage contract (
key/value/tags) shared across network adapters.
- Developer sandbox:
- local deterministic sandbox for test/debug,
- optional feature-rich sandbox profile for integration testing.
Strong Parts of the Lyng Approach
- Code portability: contract logic and off-chain logic remain aligned.
- Lower maintenance: fewer language/runtime rewrites across components.
- Faster onboarding: modern, readable syntax and concise constructs.
- Safer host integration: explicit capability injection limits accidental exposure.
- Operational flexibility: same package can run in metered or non-metered mode.
Example: Deterministic Ledger Transfer
class Ledger(storage) {
fun transfer(from: Int, to: Int, amount: Int) {
require(amount > 0)
val fromKey = "bal:$from"
val toKey = "bal:$to"
val fromBal = storage[fromKey] ?: 0
require(fromBal >= amount)
storage[fromKey] = fromBal - amount
storage[toKey] = (storage[toKey] ?: 0) + amount
}
}
The same logic can run:
- in a gas-metered contract runtime,
- in off-chain simulation,
- in distributed batch reconciliation.
Example: Parallel Verification Workflow
fun verifyBatch(items, verifier) {
val jobs = []
for (item in items) {
jobs += launch { verifier(item) }
}
val results = []
for (job in jobs) {
results += await(job)
}
results
}
This model is useful for distributed validation, scoring, and pre-consensus checks.
Feature Showcases
1. Runtime generics with bounds (non-erased behavior)
fun square<T: Int | Real>(x: T) = x * x
fun describeValue<T: Int | Real>(x: T): String = when (T) {
Int -> "Int value=$x"
Real -> "Real value=$x"
else -> "Numeric value=$x"
}
fun sameType<T>(x: T, y: Object): Bool = y is T
This enables practical runtime type-aware logic in generic code without JVM-style erasure limitations.
2. Multiple inheritance with lifted enums
class Payable(val accountId: Int) {
fun channel() = "onchain"
}
class Audited {
fun mark() = "audited"
}
class Payment(accountId: Int) : Payable(accountId), Audited() {
enum Status* { Pending, Settled }
}
val p = Payment(42)
assertEquals("onchain", p.channel())
assertEquals("audited", p.mark())
assertEquals(Payment.Pending, Payment.Status.Pending)
This combines reusable behavior composition with concise domain modeling.
3. Unified delegation model (val, var, fun)
val state = { "owner": "alice", "limit": 10 }
val owner by state
var limit by state
object RpcDelegate {
fun invoke(thisRef, name, args...) = "$name:${args.size}"
}
fun remoteCall by RpcDelegate
limit = 25
assertEquals(25, state["limit"])
assertEquals("remoteCall:2", remoteCall("alice", 10))
Delegation helps build compact, extensible models with minimal boilerplate.
Rollout Strategy
- Define the minimal portable storage API (
get/put/find by tags) as a stable contract. - Publish a compatibility profile for metered execution (determinism + gas accounting).
- Provide chain adapters that map Lyng storage/API calls to each target network.
- Ship a reference sandbox and conformance tests for runtime parity.
- Build shared Lyng libraries for common contract and compute patterns.
- Launch a Lyng package manager and registry (NPM/Maven-style) with first-class support for unified scripts:
- package metadata for runtime profile (metered/off-chain), storage API version, and capability requirements,
- deterministic dependency resolution and lockfiles,
- signed package publishing and verification for supply-chain integrity.
Existing Resources
- Lyng project repository: https://github.com/sergeych/lyng
- Lyng docs home: https://lynglang.com
- Lyng tutorial: https://lynglang.com/#/docs/tutorial.md
- Embedding Lyng: https://lynglang.com/#/docs/embedding.md
Conclusion
Lyng can serve as a practical common platform for blockchain contracts and distributed execution by combining:
- portable language semantics,
- safe-by-default host interaction,
- metered deterministic execution when required,
- and reusable code across on-chain and off-chain environments.
This reduces duplication, improves consistency, and shortens delivery cycles for decentralized systems.