Skip to main content
Sign, verify, and aggregate signatures for beacon chain attestations.
import { Bls12381Service, Bls12381Live } from 'voltaire-effect/crypto'
import { Effect } from 'effect'

const result = await Effect.runPromise(
  Effect.gen(function* () {
    const bls = yield* Bls12381Service
    const signature = yield* bls.sign(message, privateKey)
    const isValid = yield* bls.verify(signature, message, publicKey)
    const aggregated = yield* bls.aggregate([sig1, sig2, sig3])
    return { signature, isValid, aggregated }
  }).pipe(Effect.provide(Bls12381Live))
)

Error Handling

program.pipe(
  Effect.catchTag('InvalidScalarError', (e) => ...),
  Effect.catchTag('SignatureError', (e) => ...)
)

Testing

import { Bls12381Test } from 'voltaire-effect/crypto'
myProgram.pipe(Effect.provide(Bls12381Test))

Interface

interface Bls12381ServiceShape {
  readonly sign: (message: Uint8Array, privateKey: Uint8Array) => Effect.Effect<Uint8Array, InvalidScalarError | SignatureError>
  readonly verify: (signature: Uint8Array, message: Uint8Array, publicKey: Uint8Array) => Effect.Effect<boolean, SignatureError>
  readonly aggregate: (signatures: Uint8Array[]) => Effect.Effect<Uint8Array, SignatureError>
}