Skip to content

Commit b3a9c34

Browse files
feat!: Pass ACIR to ACVM by reference rather than passing ownership (#2872)
Co-authored-by: Tom French <[email protected]> Co-authored-by: kevaundray <[email protected]>
1 parent cf42de8 commit b3a9c34

130 files changed

Lines changed: 183 additions & 391 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

acvm-repo/acir/codegen/acir.cpp

Lines changed: 0 additions & 197 deletions
Original file line numberDiff line numberDiff line change
@@ -674,43 +674,9 @@ namespace Circuit {
674674
static BrilligOutputs bincodeDeserialize(std::vector<uint8_t>);
675675
};
676676

677-
struct ForeignCallParam {
678-
679-
struct Single {
680-
Circuit::Value value;
681-
682-
friend bool operator==(const Single&, const Single&);
683-
std::vector<uint8_t> bincodeSerialize() const;
684-
static Single bincodeDeserialize(std::vector<uint8_t>);
685-
};
686-
687-
struct Array {
688-
std::vector<Circuit::Value> value;
689-
690-
friend bool operator==(const Array&, const Array&);
691-
std::vector<uint8_t> bincodeSerialize() const;
692-
static Array bincodeDeserialize(std::vector<uint8_t>);
693-
};
694-
695-
std::variant<Single, Array> value;
696-
697-
friend bool operator==(const ForeignCallParam&, const ForeignCallParam&);
698-
std::vector<uint8_t> bincodeSerialize() const;
699-
static ForeignCallParam bincodeDeserialize(std::vector<uint8_t>);
700-
};
701-
702-
struct ForeignCallResult {
703-
std::vector<Circuit::ForeignCallParam> values;
704-
705-
friend bool operator==(const ForeignCallResult&, const ForeignCallResult&);
706-
std::vector<uint8_t> bincodeSerialize() const;
707-
static ForeignCallResult bincodeDeserialize(std::vector<uint8_t>);
708-
};
709-
710677
struct Brillig {
711678
std::vector<Circuit::BrilligInputs> inputs;
712679
std::vector<Circuit::BrilligOutputs> outputs;
713-
std::vector<Circuit::ForeignCallResult> foreign_call_results;
714680
std::vector<Circuit::BrilligOpcode> bytecode;
715681
std::optional<Circuit::Expression> predicate;
716682

@@ -2761,7 +2727,6 @@ namespace Circuit {
27612727
inline bool operator==(const Brillig &lhs, const Brillig &rhs) {
27622728
if (!(lhs.inputs == rhs.inputs)) { return false; }
27632729
if (!(lhs.outputs == rhs.outputs)) { return false; }
2764-
if (!(lhs.foreign_call_results == rhs.foreign_call_results)) { return false; }
27652730
if (!(lhs.bytecode == rhs.bytecode)) { return false; }
27662731
if (!(lhs.predicate == rhs.predicate)) { return false; }
27672732
return true;
@@ -2790,7 +2755,6 @@ void serde::Serializable<Circuit::Brillig>::serialize(const Circuit::Brillig &ob
27902755
serializer.increase_container_depth();
27912756
serde::Serializable<decltype(obj.inputs)>::serialize(obj.inputs, serializer);
27922757
serde::Serializable<decltype(obj.outputs)>::serialize(obj.outputs, serializer);
2793-
serde::Serializable<decltype(obj.foreign_call_results)>::serialize(obj.foreign_call_results, serializer);
27942758
serde::Serializable<decltype(obj.bytecode)>::serialize(obj.bytecode, serializer);
27952759
serde::Serializable<decltype(obj.predicate)>::serialize(obj.predicate, serializer);
27962760
serializer.decrease_container_depth();
@@ -2803,7 +2767,6 @@ Circuit::Brillig serde::Deserializable<Circuit::Brillig>::deserialize(Deserializ
28032767
Circuit::Brillig obj;
28042768
obj.inputs = serde::Deserializable<decltype(obj.inputs)>::deserialize(deserializer);
28052769
obj.outputs = serde::Deserializable<decltype(obj.outputs)>::deserialize(deserializer);
2806-
obj.foreign_call_results = serde::Deserializable<decltype(obj.foreign_call_results)>::deserialize(deserializer);
28072770
obj.bytecode = serde::Deserializable<decltype(obj.bytecode)>::deserialize(deserializer);
28082771
obj.predicate = serde::Deserializable<decltype(obj.predicate)>::deserialize(deserializer);
28092772
deserializer.decrease_container_depth();
@@ -3970,166 +3933,6 @@ Circuit::Expression serde::Deserializable<Circuit::Expression>::deserialize(Dese
39703933
return obj;
39713934
}
39723935

3973-
namespace Circuit {
3974-
3975-
inline bool operator==(const ForeignCallParam &lhs, const ForeignCallParam &rhs) {
3976-
if (!(lhs.value == rhs.value)) { return false; }
3977-
return true;
3978-
}
3979-
3980-
inline std::vector<uint8_t> ForeignCallParam::bincodeSerialize() const {
3981-
auto serializer = serde::BincodeSerializer();
3982-
serde::Serializable<ForeignCallParam>::serialize(*this, serializer);
3983-
return std::move(serializer).bytes();
3984-
}
3985-
3986-
inline ForeignCallParam ForeignCallParam::bincodeDeserialize(std::vector<uint8_t> input) {
3987-
auto deserializer = serde::BincodeDeserializer(input);
3988-
auto value = serde::Deserializable<ForeignCallParam>::deserialize(deserializer);
3989-
if (deserializer.get_buffer_offset() < input.size()) {
3990-
throw serde::deserialization_error("Some input bytes were not read");
3991-
}
3992-
return value;
3993-
}
3994-
3995-
} // end of namespace Circuit
3996-
3997-
template <>
3998-
template <typename Serializer>
3999-
void serde::Serializable<Circuit::ForeignCallParam>::serialize(const Circuit::ForeignCallParam &obj, Serializer &serializer) {
4000-
serializer.increase_container_depth();
4001-
serde::Serializable<decltype(obj.value)>::serialize(obj.value, serializer);
4002-
serializer.decrease_container_depth();
4003-
}
4004-
4005-
template <>
4006-
template <typename Deserializer>
4007-
Circuit::ForeignCallParam serde::Deserializable<Circuit::ForeignCallParam>::deserialize(Deserializer &deserializer) {
4008-
deserializer.increase_container_depth();
4009-
Circuit::ForeignCallParam obj;
4010-
obj.value = serde::Deserializable<decltype(obj.value)>::deserialize(deserializer);
4011-
deserializer.decrease_container_depth();
4012-
return obj;
4013-
}
4014-
4015-
namespace Circuit {
4016-
4017-
inline bool operator==(const ForeignCallParam::Single &lhs, const ForeignCallParam::Single &rhs) {
4018-
if (!(lhs.value == rhs.value)) { return false; }
4019-
return true;
4020-
}
4021-
4022-
inline std::vector<uint8_t> ForeignCallParam::Single::bincodeSerialize() const {
4023-
auto serializer = serde::BincodeSerializer();
4024-
serde::Serializable<ForeignCallParam::Single>::serialize(*this, serializer);
4025-
return std::move(serializer).bytes();
4026-
}
4027-
4028-
inline ForeignCallParam::Single ForeignCallParam::Single::bincodeDeserialize(std::vector<uint8_t> input) {
4029-
auto deserializer = serde::BincodeDeserializer(input);
4030-
auto value = serde::Deserializable<ForeignCallParam::Single>::deserialize(deserializer);
4031-
if (deserializer.get_buffer_offset() < input.size()) {
4032-
throw serde::deserialization_error("Some input bytes were not read");
4033-
}
4034-
return value;
4035-
}
4036-
4037-
} // end of namespace Circuit
4038-
4039-
template <>
4040-
template <typename Serializer>
4041-
void serde::Serializable<Circuit::ForeignCallParam::Single>::serialize(const Circuit::ForeignCallParam::Single &obj, Serializer &serializer) {
4042-
serde::Serializable<decltype(obj.value)>::serialize(obj.value, serializer);
4043-
}
4044-
4045-
template <>
4046-
template <typename Deserializer>
4047-
Circuit::ForeignCallParam::Single serde::Deserializable<Circuit::ForeignCallParam::Single>::deserialize(Deserializer &deserializer) {
4048-
Circuit::ForeignCallParam::Single obj;
4049-
obj.value = serde::Deserializable<decltype(obj.value)>::deserialize(deserializer);
4050-
return obj;
4051-
}
4052-
4053-
namespace Circuit {
4054-
4055-
inline bool operator==(const ForeignCallParam::Array &lhs, const ForeignCallParam::Array &rhs) {
4056-
if (!(lhs.value == rhs.value)) { return false; }
4057-
return true;
4058-
}
4059-
4060-
inline std::vector<uint8_t> ForeignCallParam::Array::bincodeSerialize() const {
4061-
auto serializer = serde::BincodeSerializer();
4062-
serde::Serializable<ForeignCallParam::Array>::serialize(*this, serializer);
4063-
return std::move(serializer).bytes();
4064-
}
4065-
4066-
inline ForeignCallParam::Array ForeignCallParam::Array::bincodeDeserialize(std::vector<uint8_t> input) {
4067-
auto deserializer = serde::BincodeDeserializer(input);
4068-
auto value = serde::Deserializable<ForeignCallParam::Array>::deserialize(deserializer);
4069-
if (deserializer.get_buffer_offset() < input.size()) {
4070-
throw serde::deserialization_error("Some input bytes were not read");
4071-
}
4072-
return value;
4073-
}
4074-
4075-
} // end of namespace Circuit
4076-
4077-
template <>
4078-
template <typename Serializer>
4079-
void serde::Serializable<Circuit::ForeignCallParam::Array>::serialize(const Circuit::ForeignCallParam::Array &obj, Serializer &serializer) {
4080-
serde::Serializable<decltype(obj.value)>::serialize(obj.value, serializer);
4081-
}
4082-
4083-
template <>
4084-
template <typename Deserializer>
4085-
Circuit::ForeignCallParam::Array serde::Deserializable<Circuit::ForeignCallParam::Array>::deserialize(Deserializer &deserializer) {
4086-
Circuit::ForeignCallParam::Array obj;
4087-
obj.value = serde::Deserializable<decltype(obj.value)>::deserialize(deserializer);
4088-
return obj;
4089-
}
4090-
4091-
namespace Circuit {
4092-
4093-
inline bool operator==(const ForeignCallResult &lhs, const ForeignCallResult &rhs) {
4094-
if (!(lhs.values == rhs.values)) { return false; }
4095-
return true;
4096-
}
4097-
4098-
inline std::vector<uint8_t> ForeignCallResult::bincodeSerialize() const {
4099-
auto serializer = serde::BincodeSerializer();
4100-
serde::Serializable<ForeignCallResult>::serialize(*this, serializer);
4101-
return std::move(serializer).bytes();
4102-
}
4103-
4104-
inline ForeignCallResult ForeignCallResult::bincodeDeserialize(std::vector<uint8_t> input) {
4105-
auto deserializer = serde::BincodeDeserializer(input);
4106-
auto value = serde::Deserializable<ForeignCallResult>::deserialize(deserializer);
4107-
if (deserializer.get_buffer_offset() < input.size()) {
4108-
throw serde::deserialization_error("Some input bytes were not read");
4109-
}
4110-
return value;
4111-
}
4112-
4113-
} // end of namespace Circuit
4114-
4115-
template <>
4116-
template <typename Serializer>
4117-
void serde::Serializable<Circuit::ForeignCallResult>::serialize(const Circuit::ForeignCallResult &obj, Serializer &serializer) {
4118-
serializer.increase_container_depth();
4119-
serde::Serializable<decltype(obj.values)>::serialize(obj.values, serializer);
4120-
serializer.decrease_container_depth();
4121-
}
4122-
4123-
template <>
4124-
template <typename Deserializer>
4125-
Circuit::ForeignCallResult serde::Deserializable<Circuit::ForeignCallResult>::deserialize(Deserializer &deserializer) {
4126-
deserializer.increase_container_depth();
4127-
Circuit::ForeignCallResult obj;
4128-
obj.values = serde::Deserializable<decltype(obj.values)>::deserialize(deserializer);
4129-
deserializer.decrease_container_depth();
4130-
return obj;
4131-
}
4132-
41333936
namespace Circuit {
41343937

41353938
inline bool operator==(const FunctionInput &lhs, const FunctionInput &rhs) {

acvm-repo/acir/src/circuit/brillig.rs

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
use crate::native_types::{Expression, Witness};
2-
use brillig::ForeignCallResult;
32
use brillig::Opcode as BrilligOpcode;
43
use serde::{Deserialize, Serialize};
54

@@ -23,9 +22,6 @@ pub enum BrilligOutputs {
2322
pub struct Brillig {
2423
pub inputs: Vec<BrilligInputs>,
2524
pub outputs: Vec<BrilligOutputs>,
26-
/// Results of oracles/functions external to brillig like a database read.
27-
// Each element of this vector corresponds to a single foreign call but may contain several values.
28-
pub foreign_call_results: Vec<ForeignCallResult>,
2925
/// The Brillig VM bytecode to be executed by this ACIR opcode.
3026
pub bytecode: Vec<BrilligOpcode>,
3127
/// Predicate of the Brillig execution - indicates if it should be skipped

acvm-repo/acir/src/lib.rs

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -32,8 +32,7 @@ mod reflection {
3232
};
3333

3434
use brillig::{
35-
BinaryFieldOp, BinaryIntOp, BlackBoxOp, ForeignCallParam, ForeignCallResult,
36-
Opcode as BrilligOpcode, RegisterOrMemory,
35+
BinaryFieldOp, BinaryIntOp, BlackBoxOp, Opcode as BrilligOpcode, RegisterOrMemory,
3736
};
3837
use serde_reflection::{Tracer, TracerConfig};
3938

@@ -70,8 +69,6 @@ mod reflection {
7069
tracer.trace_simple_type::<BinaryIntOp>().unwrap();
7170
tracer.trace_simple_type::<BlackBoxOp>().unwrap();
7271
tracer.trace_simple_type::<Directive>().unwrap();
73-
tracer.trace_simple_type::<ForeignCallParam>().unwrap();
74-
tracer.trace_simple_type::<ForeignCallResult>().unwrap();
7572
tracer.trace_simple_type::<RegisterOrMemory>().unwrap();
7673

7774
let registry = tracer.registry().unwrap();

acvm-repo/acir/tests/test_program_serialization.rs

Lines changed: 11 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -181,8 +181,6 @@ fn simple_brillig_foreign_call() {
181181
outputs: vec![
182182
BrilligOutputs::Simple(w_inverted), // Output Register 1
183183
],
184-
// stack of foreign call/oracle resolutions, starts empty
185-
foreign_call_results: vec![],
186184
bytecode: vec![brillig::Opcode::ForeignCall {
187185
function: "invert".into(),
188186
destinations: vec![RegisterOrMemory::RegisterIndex(RegisterIndex::from(0))],
@@ -203,11 +201,10 @@ fn simple_brillig_foreign_call() {
203201
circuit.write(&mut bytes).unwrap();
204202

205203
let expected_serialization: Vec<u8> = vec![
206-
31, 139, 8, 0, 0, 0, 0, 0, 0, 255, 173, 143, 81, 10, 0, 16, 16, 68, 199, 42, 57, 14, 55,
207-
112, 25, 31, 126, 124, 72, 206, 79, 161, 86, 225, 135, 87, 219, 78, 187, 53, 205, 104, 0,
208-
2, 29, 201, 52, 103, 222, 220, 216, 230, 13, 43, 254, 121, 25, 158, 151, 54, 153, 117, 27,
209-
53, 116, 136, 197, 167, 124, 107, 184, 64, 236, 73, 56, 83, 1, 18, 139, 122, 157, 67, 1, 0,
210-
0,
204+
31, 139, 8, 0, 0, 0, 0, 0, 0, 255, 173, 143, 49, 10, 64, 33, 12, 67, 99, 63, 124, 60, 142,
205+
222, 192, 203, 56, 184, 56, 136, 120, 126, 5, 21, 226, 160, 139, 62, 40, 13, 45, 132, 68,
206+
3, 80, 232, 124, 164, 153, 121, 115, 99, 155, 59, 172, 122, 231, 101, 56, 175, 80, 86, 221,
207+
230, 31, 58, 196, 226, 83, 62, 53, 91, 16, 122, 10, 246, 84, 99, 243, 0, 30, 59, 1, 0, 0,
211208
];
212209

213210
assert_eq!(bytes, expected_serialization)
@@ -248,8 +245,6 @@ fn complex_brillig_foreign_call() {
248245
BrilligOutputs::Simple(a_plus_b_plus_c), // Output Register 1
249246
BrilligOutputs::Simple(a_plus_b_plus_c_times_2), // Output Register 2
250247
],
251-
// stack of foreign call/oracle resolutions, starts empty
252-
foreign_call_results: vec![],
253248
bytecode: vec![
254249
// Oracles are named 'foreign calls' in brillig
255250
brillig::Opcode::ForeignCall {
@@ -280,13 +275,13 @@ fn complex_brillig_foreign_call() {
280275
circuit.write(&mut bytes).unwrap();
281276

282277
let expected_serialization: Vec<u8> = vec![
283-
31, 139, 8, 0, 0, 0, 0, 0, 0, 255, 213, 83, 219, 10, 128, 48, 8, 245, 210, 101, 159, 179,
284-
254, 160, 127, 137, 222, 138, 122, 236, 243, 27, 228, 64, 44, 232, 33, 7, 237, 128, 56,
285-
157, 147, 131, 103, 6, 0, 64, 184, 192, 201, 72, 206, 40, 177, 70, 174, 27, 197, 199, 111,
286-
24, 208, 175, 87, 44, 197, 145, 42, 224, 200, 5, 56, 230, 255, 240, 83, 189, 61, 117, 113,
287-
157, 31, 63, 236, 79, 147, 172, 77, 214, 73, 220, 139, 15, 106, 214, 168, 114, 249, 126,
288-
218, 214, 125, 153, 15, 54, 37, 90, 26, 155, 39, 227, 95, 223, 232, 230, 4, 247, 157, 215,
289-
56, 1, 153, 86, 63, 138, 44, 4, 0, 0,
278+
31, 139, 8, 0, 0, 0, 0, 0, 0, 255, 213, 83, 219, 10, 128, 48, 8, 117, 174, 139, 159, 179,
279+
254, 160, 127, 137, 222, 138, 122, 236, 243, 19, 114, 32, 22, 244, 144, 131, 118, 64, 156,
280+
178, 29, 14, 59, 74, 0, 16, 224, 66, 228, 64, 57, 7, 169, 53, 242, 189, 81, 114, 250, 134,
281+
33, 248, 113, 165, 82, 26, 177, 2, 141, 177, 128, 198, 60, 15, 63, 245, 219, 211, 23, 215,
282+
255, 139, 15, 251, 211, 112, 180, 28, 157, 212, 189, 100, 82, 179, 64, 170, 63, 109, 235,
283+
190, 204, 135, 166, 178, 150, 216, 62, 154, 252, 250, 70, 147, 35, 220, 119, 93, 227, 4,
284+
182, 131, 81, 25, 36, 4, 0, 0,
290285
];
291286

292287
assert_eq!(bytes, expected_serialization)

acvm-repo/acvm/src/pwg/brillig.rs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
use acir::{
2-
brillig::{ForeignCallParam, RegisterIndex, Value},
2+
brillig::{ForeignCallParam, ForeignCallResult, RegisterIndex, Value},
33
circuit::{
44
brillig::{Brillig, BrilligInputs, BrilligOutputs},
55
OpcodeLocation,
@@ -20,6 +20,7 @@ impl BrilligSolver {
2020
pub(super) fn solve<B: BlackBoxFunctionSolver>(
2121
initial_witness: &mut WitnessMap,
2222
brillig: &Brillig,
23+
foreign_call_results: Vec<ForeignCallResult>,
2324
bb_solver: &B,
2425
acir_index: usize,
2526
) -> Result<Option<ForeignCallWaitInfo>, OpcodeResolutionError> {
@@ -80,7 +81,7 @@ impl BrilligSolver {
8081
input_registers,
8182
input_memory,
8283
&brillig.bytecode,
83-
brillig.foreign_call_results.clone(),
84+
foreign_call_results,
8485
bb_solver,
8586
);
8687

0 commit comments

Comments
 (0)