Skip to content

Commit 32319db

Browse files
authored
cancellation file support for bluebox (#212)
* cancellation file support for bluebox * filter out EINTR thanks arvid
1 parent 5349251 commit 32319db

File tree

5 files changed

+23
-7
lines changed

5 files changed

+23
-7
lines changed

src/c_bindings/c_wrapper.cpp

+1-1
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ extern "C" {
2222
std::vector<uint8_t> challenge_hash_bytes(challenge_hash, challenge_hash + challenge_size);
2323
integer discriminant = CreateDiscriminant(challenge_hash_bytes, discriminant_size_bits);
2424
form x = DeserializeForm(discriminant, x_s, x_s_size);
25-
std::vector<uint8_t> result = ProveSlow(discriminant, x, num_iterations);
25+
std::vector<uint8_t> result = ProveSlow(discriminant, x, num_iterations, "");
2626

2727
// Allocate memory for the result and copy data
2828
uint8_t* resultData = new uint8_t[result.size()];

src/prover_slow.h

+16-1
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
#include "nucomp.h"
66
#include "picosha2.h"
77
#include "proof_common.h"
8+
#include <sys/stat.h>
89

910

1011
// TODO: Refactor to use 'Prover' class once new_vdf is merged in.
@@ -78,7 +79,7 @@ form GenerateWesolowski(form &y, form &x_init,
7879
return x;
7980
}
8081

81-
std::vector<uint8_t> ProveSlow(integer& D, form& x, uint64_t num_iterations) {
82+
std::vector<uint8_t> ProveSlow(integer& D, form& x, uint64_t num_iterations, std::string shutdown_file_path) {
8283
integer L = root(-D, 4);
8384
PulmarkReducer reducer;
8485
form y = form::from_abd(x.a, x.b, D);
@@ -100,6 +101,20 @@ std::vector<uint8_t> ProveSlow(integer& D, form& x, uint64_t num_iterations) {
100101
}
101102
nudupl_form(y, y, D, L);
102103
reducer.reduce(y);
104+
105+
// Check for cancellation every 65535 interations
106+
if ((i&0xffff)==0) {
107+
// Only if we have a shutdown path
108+
if (shutdown_file_path!="") {
109+
struct stat buffer;
110+
111+
int statrst = stat(shutdown_file_path.c_str(), &buffer);
112+
if ((statrst != 0) && (errno != EINTR)) {
113+
// shutdown file doesn't exist, abort out
114+
return {};
115+
}
116+
}
117+
}
103118
}
104119

105120
form proof = GenerateWesolowski(y, x, D, reducer, intermediates, num_iterations, k, l);

src/python_bindings/fastvdf.cpp

+2-2
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,7 @@ PYBIND11_MODULE(chiavdf, m) {
5454
return CheckProofOfTimeNWesolowski(integer(discriminant_copy), (const uint8_t *)x_s_copy.data(), proof_blob_ptr, proof_blob_size, num_iterations, disc_size_bits, recursion);
5555
});
5656

57-
m.def("prove", [] (const py::bytes& challenge_hash, const string& x_s, int discriminant_size_bits, uint64_t num_iterations) {
57+
m.def("prove", [] (const py::bytes& challenge_hash, const string& x_s, int discriminant_size_bits, uint64_t num_iterations, const string& shutdown_file_path) {
5858
std::string challenge_hash_str(challenge_hash);
5959
std::string x_s_copy(x_s);
6060
std::vector<uint8_t> result;
@@ -66,7 +66,7 @@ PYBIND11_MODULE(chiavdf, m) {
6666
discriminant_size_bits
6767
);
6868
form x = DeserializeForm(D, (const uint8_t *) x_s_copy.data(), x_s_copy.size());
69-
result = ProveSlow(D, x, num_iterations);
69+
result = ProveSlow(D, x, num_iterations, shutdown_file_path);
7070
}
7171
py::bytes ret = py::bytes(reinterpret_cast<char*>(result.data()), result.size());
7272
return ret;

tests/test_n_weso_verifier.py

+2-2
Original file line numberDiff line numberDiff line change
@@ -15,13 +15,13 @@ def prove_n_weso(discriminant_challenge, x, discriminant_size, form_size, iters,
1515
partials = []
1616
discriminant = create_discriminant(discriminant_challenge, discriminant_size)
1717
for _ in range(witness):
18-
result = prove(discriminant_challenge, x, discriminant_size, iters_chunk)
18+
result = prove(discriminant_challenge, x, discriminant_size, iters_chunk, "")
1919
y = result[:form_size]
2020
proof = result[form_size : 2 * form_size]
2121
partials.append((x, y, proof))
2222
x = y
2323
iters -= iters_chunk * witness
24-
result = prove(discriminant_challenge, x, discriminant_size, iters)
24+
result = prove(discriminant_challenge, x, discriminant_size, iters, "")
2525
y_result = result[:form_size]
2626
y_proof = result[form_size : 2 * form_size]
2727
assert verify_wesolowski(discriminant, x, y_result, y_proof, iters)

tests/test_verifier.py

+2-1
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ def test_prove_and_verify():
1313

1414
iters = 1000000
1515
t1 = time.time()
16-
result = prove(discriminant_challenge, initial_el, discriminant_size, iters)
16+
result = prove(discriminant_challenge, initial_el, discriminant_size, iters, "")
1717
t2 = time.time()
1818
print(f"IPS: {iters / (t2 - t1)}")
1919
result_y = result[:form_size]
@@ -36,6 +36,7 @@ def test_prove_and_verify():
3636
result_y,
3737
discriminant_size,
3838
iters_2,
39+
""
3940
)
4041
t2 = time.time()
4142
print(f"IPS: {iters_2 / (t2 - t1)}")

0 commit comments

Comments
 (0)