Ivan Boldyrev d5028942e4
feat(interpreter-data)!: New data format for calls (#501)
BREAKING CHANGE:
1. Call values in the trace have CID references to structures that have call arguments' hash and CID references to values and tetraplets.
2. If call value is unused, it is serialized with `Unused` variant, and CID references are not stored.

Previous data scheme was (Scalar as an example, other cases are similar):

```
Scalar(CID<JValue>) ---<value_store>----> JValue
```

New data scheme is much more sophisticated:

```
Scalar(CID<ServiceResultAggregate>) ---+
                                       |
  +----<service_result_store>----------+
  |
  +-------> ServiceResultAggregate:
               value_cid ------------<value_store>----> JValue
               tetraplet_cid --------<tetraplet_store>----> SecurityTetraplet
               argument_hash: String
```
`Stream` variant is similar, however, `Unused` is different: it has value CID only, but the value is not stored into the `value_store`:

```
Unused(Rc<CID<JValue>>) ---> X
```

Co-authored-by: Mike Voronov <michail.vms@gmail.com>
2023-03-21 19:12:04 +07:00
..
2023-03-15 17:32:29 +02:00
2022-05-17 15:53:33 +03:00

AIR trace handler

This crate contains implementation of the CRDT-based merging data algorithm. It exposes the TraceHandler struct that based on the visitor pattern and has public methods that should be called in certain places of AIR instructions execution. Internally TraceHandler contains several FSM and each of such public methods does state transitioning of one or more these FSMs. Below are state transition sequences for all instructions that caller must follow.

Ap instruction

Expected sequence of TraceHandler calls for the ap instruction:

meet_ap_start
    -> meet_ap_end

Call instruction

Expected sequence of TraceHandler calls for the call instruction:

meet_call_start
    -> meet_call_end

Par instruction

Expected sequence of TraceHandler calls for the par instruction:

meet_par_start
    -> meet_par_subgraph_end(..., SubgraphType::Left)
    -> meet_par_subgraph_end(..., SubgraphType::Right)

Fold instruction

Expected sequence of TraceHandler calls for the fold instruction:

meet_fold_start.1 ->
    meet_generation_start.N ->
        meet_next.M ->
        meet_prev.M ->
    meet_generation_end.N ->
meet_fold_end.1

where .T means that this function should be called exactly T times.