diff --git a/src/python_bindings/fastvdf.cpp b/src/python_bindings/fastvdf.cpp index b8c6a0a5..ead662e3 100644 --- a/src/python_bindings/fastvdf.cpp +++ b/src/python_bindings/fastvdf.cpp @@ -10,7 +10,9 @@ PYBIND11_MODULE(chiavdf, m) { // Creates discriminant. m.def("create_discriminant", [] (const py::bytes& challenge_hash, int discriminant_size_bits) { + py::gil_scoped_release release; std::string challenge_hash_str(challenge_hash); + py::gil_scoped_release release; auto challenge_hash_bits = std::vector(challenge_hash_str.begin(), challenge_hash_str.end()); integer D = CreateDiscriminant( challenge_hash_bits, @@ -24,6 +26,7 @@ PYBIND11_MODULE(chiavdf, m) { const string& x_s, const string& y_s, const string& proof_s, uint64_t num_iterations) { + py::gil_scoped_release release; integer D(discriminant); form x = DeserializeForm(D, (const uint8_t *)x_s.data(), x_s.size()); form y = DeserializeForm(D, (const uint8_t *)y_s.data(), y_s.size()); @@ -39,6 +42,7 @@ PYBIND11_MODULE(chiavdf, m) { const string& x_s, const string& proof_blob, const uint64_t num_iterations, const uint64_t disc_size_bits, const uint64_t recursion) { + py::gil_scoped_release release; std::string proof_blob_str(proof_blob); uint8_t *proof_blob_ptr = reinterpret_cast(proof_blob_str.data()); int proof_blob_size = proof_blob.size(); @@ -52,11 +56,15 @@ PYBIND11_MODULE(chiavdf, m) { const string& x_s, const string& proof_blob, const uint64_t num_iterations, const uint64_t recursion) { - std::string proof_blob_str(proof_blob); - uint8_t *proof_blob_ptr = reinterpret_cast(proof_blob_str.data()); - int proof_blob_size = proof_blob.size(); std::pair> result; - result = CheckProofOfTimeNWesolowskiWithB(integer(discriminant), integer(B), (const uint8_t *)x_s.data(), proof_blob_ptr, proof_blob_size, num_iterations, recursion); + { + py::gil_scoped_release release; + std::string proof_blob_str(proof_blob); + uint8_t *proof_blob_ptr = reinterpret_cast(proof_blob_str.data()); + int proof_blob_size = proof_blob.size(); + result = CheckProofOfTimeNWesolowskiWithB(integer(discriminant), integer(B), (const uint8_t *) x_s.data(), + proof_blob_ptr, proof_blob_size, num_iterations, recursion); + } py::bytes res_bytes = py::bytes(reinterpret_cast(result.second.data()), result.second.size()); py::tuple res_tuple = py::make_tuple(result.first, res_bytes); return res_tuple; @@ -66,6 +74,7 @@ PYBIND11_MODULE(chiavdf, m) { const string& x_s, const string& proof_blob, const uint64_t num_iterations, const uint64_t recursion) { + py::gil_scoped_release release; std::string proof_blob_str(proof_blob); uint8_t *proof_blob_ptr = reinterpret_cast(proof_blob_str.data()); int proof_blob_size = proof_blob.size(); @@ -75,13 +84,17 @@ PYBIND11_MODULE(chiavdf, m) { m.def("prove", [] (const py::bytes& challenge_hash, const string& x_s, int discriminant_size_bits, uint64_t num_iterations) { std::string challenge_hash_str(challenge_hash); - std::vector challenge_hash_bytes(challenge_hash_str.begin(), challenge_hash_str.end()); - integer D = CreateDiscriminant( - challenge_hash_bytes, - discriminant_size_bits - ); - form x = DeserializeForm(D, (const uint8_t *)x_s.data(), x_s.size()); - auto result = ProveSlow(D, x, num_iterations); + std::vector result; + { + py::gil_scoped_release release; + std::vector challenge_hash_bytes(challenge_hash_str.begin(), challenge_hash_str.end()); + integer D = CreateDiscriminant( + challenge_hash_bytes, + discriminant_size_bits + ); + form x = DeserializeForm(D, (const uint8_t *) x_s.data(), x_s.size()); + result = ProveSlow(D, x, num_iterations); + } py::bytes ret = py::bytes(reinterpret_cast(result.data()), result.size()); return ret; });