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>
This commit is contained in:
Ivan Boldyrev
2023-03-21 19:12:04 +07:00
committed by GitHub
parent 631abd4ec4
commit d5028942e4
56 changed files with 2965 additions and 1302 deletions

View File

@ -287,8 +287,19 @@ mod tests {
assert_eq!(
trace,
ExecutionTrace::from(vec![
scalar(json!([{"p":"peer2","v":2},{"p":"peer3","v":3},])),
scalar_number(12),
scalar!(
json!([{"p":"peer2","v":2},{"p":"peer3","v":3}]),
peer = "peer1",
service = "service..0",
function = "func"
),
scalar!(
12,
peer = "peer2",
service = "service..1",
function = "func",
args = vec![json!({"p":"peer2","v":2}), json!(1)]
),
request_sent_by("peer2"),
])
);
@ -305,8 +316,19 @@ mod tests {
assert_eq!(
trace,
ExecutionTrace::from(vec![
scalar(json!([{"p":"peer2","v":2},{"p":"peer3","v":3},])),
scalar_number(12),
scalar!(
json!([{"p":"peer2","v":2},{"p":"peer3","v":3}]),
peer = "peer1",
service = "service..0",
function = "func"
),
scalar!(
12,
peer = "peer2",
service = "service..1",
function = "func",
args = vec![json!({"p":"peer2","v":2}), json!(1)]
),
request_sent_by("peer2"),
])
);
@ -360,9 +382,19 @@ mod tests {
assert_eq!(
&*trace,
vec![
executed_state::scalar(json!(["peer2", "peer3"])),
executed_state::scalar(json!(42)),
executed_state::scalar(json!(43)),
scalar!(json!(["peer2", "peer3"]), peer = "peer1", service = "..0"),
unused!(
json!(42),
peer = "peer2",
service = "..1",
args = vec!["peer2"]
),
unused!(
json!(43),
peer = "peer3",
service = "..1",
args = vec!["peer3"]
),
]
);
}
@ -432,8 +464,19 @@ mod tests {
assert_eq!(
trace,
ExecutionTrace::from(vec![
scalar(json!([{"p":"peer2","v":2},{"p":"peer3","v":3},{"p":"peer4"}])),
scalar_number(12),
scalar!(
json!([{"p":"peer2","v":2},{"p":"peer3","v":3},{"p":"peer4"}]),
peer = "peer1",
service = "service..0",
function = "func"
),
scalar!(
12,
peer = "peer2",
service = "service..1",
function = "func",
args = vec![2, 1]
),
request_sent_by("peer2"),
])
);
@ -451,8 +494,19 @@ mod tests {
assert_eq!(
trace,
ExecutionTrace::from(vec![
scalar(json!([{"p":"peer2","v":2},{"p":"peer3","v":3},{"p":"peer4"}])),
scalar_number(12),
scalar!(
json!([{"p":"peer2","v":2},{"p":"peer3","v":3},{"p":"peer4"}]),
peer = "peer1",
service = "service..0",
function = "func"
),
scalar!(
12,
peer = "peer2",
service = "service..1",
function = "func",
args = vec![2, 1]
),
request_sent_by("peer2"),
])
);
@ -489,7 +543,16 @@ mod tests {
assert_eq!(
trace_from_result(outcome1),
ExecutionTrace::from(vec![scalar_number(1), request_sent_by("peer1"),]),
ExecutionTrace::from(vec![
scalar!(
1,
peer = "peer1",
service = "service..0",
function = "func",
args = vec![1, 22]
),
request_sent_by("peer1"),
]),
)
}
@ -525,11 +588,21 @@ mod tests {
assert_eq!(
trace_from_result(&trace1),
ExecutionTrace::from(vec![scalar_number(42)]),
ExecutionTrace::from(vec![unused!(
42,
peer = peer,
service = "service..0",
function = "function"
)]),
);
assert_eq!(
trace_from_result(&trace2),
ExecutionTrace::from(vec![scalar_number(24)]),
ExecutionTrace::from(vec![unused!(
24,
peer = peer,
service = "service..1",
function = "function"
)]),
);
}
@ -571,11 +644,21 @@ mod tests {
assert_eq!(
trace_from_result(&trace1),
ExecutionTrace::from(vec![scalar_number(42)]),
ExecutionTrace::from(vec![unused!(
42,
peer = peer,
service = "service",
function = "function"
),]),
);
assert_eq!(
trace_from_result(&trace2),
ExecutionTrace::from(vec![scalar_number(24)]),
ExecutionTrace::from(vec![unused!(
24,
peer = peer,
service = "service",
function = "function"
),]),
);
}
@ -624,7 +707,13 @@ mod tests {
assert_eq!(
trace_from_result(outcome),
ExecutionTrace::from(vec![scalar_string("service"),]),
ExecutionTrace::from(vec![scalar!(
"service",
peer = "peer1",
service = "service..0",
function = "func",
args = vec![1, 22]
),]),
)
}
@ -648,7 +737,13 @@ mod tests {
assert_eq!(
trace_from_result(outcome),
ExecutionTrace::from(vec![scalar_string("func"),]),
ExecutionTrace::from(vec![scalar!(
"func",
peer = "peer1",
service = "service..0",
function = "func",
args = vec![1, 22]
),]),
)
}
@ -672,7 +767,13 @@ mod tests {
assert_eq!(
trace_from_result(outcome),
ExecutionTrace::from(vec![scalar_number(22),]),
ExecutionTrace::from(vec![scalar!(
22,
peer = "peer1",
service = "service..0",
function = "func",
args = vec![1, 22]
),]),
)
}
@ -696,17 +797,23 @@ mod tests {
assert_eq!(
trace_from_result(outcome),
ExecutionTrace::from(vec![scalar(json!([[{
"function_name": "",
"json_path": "",
"peer_pk": "peer1",
"service_id": "",
}], [{
"function_name": "",
"json_path": "",
"peer_pk": "peer1",
"service_id": "",
}]]))]),
ExecutionTrace::from(vec![scalar!(
json!([[{
"function_name": "",
"json_path": "",
"peer_pk": "peer1",
"service_id": "",
}], [{
"function_name": "",
"json_path": "",
"peer_pk": "peer1",
"service_id": "",
}]]),
peer = peer,
service = "service..0",
function = "func",
args = vec![1, 22]
)]),
)
}
}