@counterfactual/machine

This is the TypeScript implementation of the Counterfactual protocol. It is responsible for executing the Counterfactual protocols specified here and producing correctly constructed signed commitments that correspond to state transitions of the users' state channels.

Usage no npm install needed!

<script type="module">
  import counterfactualMachine from 'https://cdn.skypack.dev/@counterfactual/machine';
</script>

README

@counterfactual/machine

This is the TypeScript implementation of the Counterfactual protocol. It is responsible for executing the Counterfactual protocols specified here and producing correctly constructed signed commitments that correspond to state transitions of the users' state channels.

The specific design philosophy it adopts is the middleware pattern. That is, all of these protocols are naturally broken down into steps, for each of which there is a middleware responsible for executing that step.

Given this design, it's easy to extend the machine to support additional protocols, replace a default middleware with an alternative implementation, and for the machine to rely on yet delegate more advanced logic to external services.

Some specific examples of this include:

  • delegating to a signing module that verifies whether a given action is safe to sign & countersign
  • storing state commitments (delegating to an arbitrary, possibly non-local service implementing a desired interface)
  • implementing a custom Write-Ahead-Log to tweak performance/security properties

Note that because of this architecture, the machine becomes embeddable and its surrounding context can decide how to implement/extend needed functionality/services.

Usage

Make sure you have Yarn v1.10.1 installed or higher. Refer to Yarn's installation guide for setup instructions for your operating system.

To install the dependencies:

yarn

Building the package

To build the machine package:

yarn build

Tests

To run all tests:

yarn test

To run only specific tests:

yarn test <pattern that jest can recognize>

will run tests in files whose filename matches <pattern> (see Jest's CLI reference).