Skip to content

Commit

Permalink
Nweso2wjb (#55)
Browse files Browse the repository at this point in the history
* more C improvements--still same time, but probably better for larger n weso. also fixed arvid's comment

* remove intermediate vectors

* switched ints to int32_t

* simplify return
  • Loading branch information
wjblanke authored Jan 5, 2021
1 parent 8a798df commit ae25614
Show file tree
Hide file tree
Showing 2 changed files with 22 additions and 54 deletions.
74 changes: 21 additions & 53 deletions src/verifier.h
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@
void VerifyWesolowskiProof(integer &D, form x, form y, form proof, uint64_t iters, bool &is_valid)
{
PulmarkReducer reducer;
int int_size = (D.num_bits() + 16) >> 4;
int32_t int_size = (D.num_bits() + 16) >> 4;
integer L = root(-D, 4);
integer B = GetB(D, x, y);
integer r = FastPow(2, iters, B);
Expand All @@ -28,15 +28,13 @@ void VerifyWesolowskiProof(integer &D, form x, form y, form proof, uint64_t iter
}
}

// Used only to verify 'Proof' objects in tests. This is not used by chia-blockchain.

integer ConvertBytesToInt(const uint8_t* bytes, int start_index, int end_index)
integer ConvertBytesToInt(const uint8_t* bytes, int32_t start_index, int32_t end_index)
{
integer res(0);
bool negative = false;
if (bytes[start_index] & (1 << 7))
negative = true;
for (int i = start_index; i < end_index; i++)
for (int32_t i = start_index; i < end_index; i++)
{
res = res * integer(256);
if (!negative)
Expand All @@ -52,74 +50,44 @@ integer ConvertBytesToInt(const uint8_t* bytes, int start_index, int end_index)
return res;
}

form DeserializeForm(integer &d, const uint8_t* bytes, int int_size)
form DeserializeForm(integer &d, const uint8_t* bytes, int32_t int_size)
{
integer a = ConvertBytesToInt(bytes, 0, int_size);
integer b = ConvertBytesToInt(bytes, int_size, 2 * int_size);
form f = form::from_abd(a, b, d);
return f;
}

std::vector<form> DeserializeProof(const uint8_t* proof_bytes, int proof_len, int int_size, integer &D)
{
std::vector<form> proof;
for (int i = 0; i < proof_len; i += 2 * int_size)
{
proof.emplace_back(DeserializeForm(D, &(proof_bytes[i]), int_size));
}
return proof;
}

bool CheckProofOfTimeNWesolowski(integer D, integer a, integer b, const uint8_t* proof_blob, int proof_blob_len, uint64_t iterations, uint64 disc_size_bits, int depth)
bool CheckProofOfTimeNWesolowski(integer D, integer a, integer b, const uint8_t* proof_blob, int32_t proof_blob_len, uint64_t iterations, uint64 disc_size_bits, int32_t depth)
{
form x = form::from_abd(a,b,D);
int int_size = (disc_size_bits + 16) >> 4;
int32_t int_size = (disc_size_bits + 16) >> 4;

if (proof_blob_len != 4 * int_size + depth * (8 + 4 * int_size))
return false;

uint8_t* new_proof_blob = new uint8_t[proof_blob_len];
memcpy(new_proof_blob, proof_blob, 4 * int_size);
int blob_len=4 * int_size;
std::vector<uint64_t> iter_list;
for (int i = 4 * int_size; i < proof_blob_len; i += 4 * int_size + 8)
// Loop depth times
bool is_valid = false;
for (int32_t i = proof_blob_len - 4 * int_size - 8; i >= 4 * int_size; i -= 4 * int_size + 8)
{
auto iter_vector = ConvertBytesToInt(proof_blob, i, i + 8).to_vector();
iter_list.push_back(iter_vector[0]);
memcpy(&(new_proof_blob[blob_len]), proof_blob + i + 8, 4 * int_size);
blob_len+=4 * int_size;
}
uint8_t* result_bytes = new uint8_t[2 * int_size];
uint8_t* proof_bytes = new uint8_t[blob_len - 2 * int_size];
memcpy(result_bytes, new_proof_blob, 2 * int_size);
memcpy(proof_bytes, new_proof_blob + 2 * int_size, blob_len - 2 * int_size);
delete[] new_proof_blob;
form y = DeserializeForm(D, result_bytes, int_size);
delete[] result_bytes;
std::vector<form> proof = DeserializeProof(proof_bytes, blob_len - 2 * int_size, int_size, D);
delete[] proof_bytes;

if (depth * 2 + 1 != proof.size())
return false;

bool is_valid;
for (int i=0; i < depth; i++) {
uint64_t iterations_1=iter_list[iter_list.size()-1];
VerifyWesolowskiProof(D, x, proof[proof.size()-2], proof[proof.size()-1], iterations_1, is_valid);
form xnew = DeserializeForm(D, &(proof_blob[i + 8]), int_size);
VerifyWesolowskiProof(D, x,
xnew,
DeserializeForm(D, &(proof_blob[i + 8 + 2 * int_size]), int_size),
iter_vector[0], is_valid);
if(!is_valid)
return false;
x=proof[proof.size()-2];
iterations=iterations-iterations_1;
proof.pop_back();
proof.pop_back();
iter_list.pop_back();
x=xnew;
iterations=iterations - iter_vector[0];
}

VerifyWesolowskiProof(D, x, y, proof[proof.size()-1], iterations, is_valid);
if(!is_valid)
return false;
VerifyWesolowskiProof(D, x,
DeserializeForm(D, proof_blob, int_size),
DeserializeForm(D, &(proof_blob[2 * int_size]), int_size),
iterations, is_valid);

return true;
return is_valid;
}

#endif // VERIFIER_H
2 changes: 1 addition & 1 deletion src/verifier_test.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ std::vector<uint8_t> HexToBytes(const char *hex_proof) {
int main()
{
uint8_t arr[10000];
std::vector<uint8_t> result=HexToBytes((const char *)"003f360be667de706fe886f766fe20240de04fe2c2f91207f1bbdddf20c554ab8d168b2ce9664d75f4613375a0ab12bf8158983574c9f5cd61c6b8a905fd3fa6bbffc5401b4ccedbe093b560293263a226e46302e720726586251116bc689ef09dc70d99e0a090c4409f928e218e85032fdbee02fedd563073be555b75a70a2d6a430033bc7a4926e3504e87698a0ace0dee6364cced2e9142b4e4cbe55a6371aab41e501ceed21d79d3a0dbbd82ce913c5de40b13eb7c59b1b52b6ef270ee603bd5e7fffcc9f5fae6dbd5aeec394181af130c0fdd195b22be745449b7a584ac80fc75ed49acfdb4d650f5cd344f86377ebbbaef5b19a0af3ae08101d1697f5656a52193000000000071c6f40024c342868a0c2a201b1b26a5d52c5d2f92a106c19ff926deb3fba1e74a444ecee3f8f507c062b949a2eaadd442b049417f82e8811526fa83c6d099d75323e068ffeca9dcd163761000c65d21dede72787ac350f25bdd3d29db6e9cb0e22c8124c724db33660c88784e2871b62ecf816846db7b469c71cad9a5dcfc5548ed2dd781006fa15b968facf4d79219646267eb187a670306d1ff1a59fc28ae00d36bb5a1cba659f48aa64a9022711a66105ef14401ff3948add265240aaad329ee76ba4c2300496746b86bcccacff5947c3fcb956cde2cffae10435960d7097f989aac742cf1047887f11584d20297958385e1715fe0f9b69141750c20d8134420eafec68fd10000000001555540006958aabfe4cc5d870e61fef82bcf1f2c3859e2bd8b1177e8a8872376b5cabace5dcb59b6fecada7e522d05f6f0e352939a6bfdf8c454fbe822cfa5ce97d17be0ffde44a4812cde9d04ec5c08dce6f9146586fdc8e081e05ec690b7effe24ea756f3d300f361203b61e1a39220c6eafa7852842674e317dcae5549c78c7144296ff004a6d0d2854c55e4c1de2f17dc4480b81652cfec37124ef41560a28c853482732434d1c006763b2e341528ae0bcc29fb76f1a4dafd99ade4fd75ec9cc9ca3f3d7001bcb6eb71e43eb22169ab721637551a8ec93838eb0825e9ecba9175297a00b146e9fdd244c5b722f29d3c46ec38840ba18f1f06ddec3dea844867386c2e1ac95");
std::vector<uint8_t> result=HexToBytes("003f360be667de706fe886f766fe20240de04fe2c2f91207f1bbdddf20c554ab8d168b2ce9664d75f4613375a0ab12bf8158983574c9f5cd61c6b8a905fd3fa6bbffc5401b4ccedbe093b560293263a226e46302e720726586251116bc689ef09dc70d99e0a090c4409f928e218e85032fdbee02fedd563073be555b75a70a2d6a430033bc7a4926e3504e87698a0ace0dee6364cced2e9142b4e4cbe55a6371aab41e501ceed21d79d3a0dbbd82ce913c5de40b13eb7c59b1b52b6ef270ee603bd5e7fffcc9f5fae6dbd5aeec394181af130c0fdd195b22be745449b7a584ac80fc75ed49acfdb4d650f5cd344f86377ebbbaef5b19a0af3ae08101d1697f5656a52193000000000071c6f40024c342868a0c2a201b1b26a5d52c5d2f92a106c19ff926deb3fba1e74a444ecee3f8f507c062b949a2eaadd442b049417f82e8811526fa83c6d099d75323e068ffeca9dcd163761000c65d21dede72787ac350f25bdd3d29db6e9cb0e22c8124c724db33660c88784e2871b62ecf816846db7b469c71cad9a5dcfc5548ed2dd781006fa15b968facf4d79219646267eb187a670306d1ff1a59fc28ae00d36bb5a1cba659f48aa64a9022711a66105ef14401ff3948add265240aaad329ee76ba4c2300496746b86bcccacff5947c3fcb956cde2cffae10435960d7097f989aac742cf1047887f11584d20297958385e1715fe0f9b69141750c20d8134420eafec68fd10000000001555540006958aabfe4cc5d870e61fef82bcf1f2c3859e2bd8b1177e8a8872376b5cabace5dcb59b6fecada7e522d05f6f0e352939a6bfdf8c454fbe822cfa5ce97d17be0ffde44a4812cde9d04ec5c08dce6f9146586fdc8e081e05ec690b7effe24ea756f3d300f361203b61e1a39220c6eafa7852842674e317dcae5549c78c7144296ff004a6d0d2854c55e4c1de2f17dc4480b81652cfec37124ef41560a28c853482732434d1c006763b2e341528ae0bcc29fb76f1a4dafd99ade4fd75ec9cc9ca3f3d7001bcb6eb71e43eb22169ab721637551a8ec93838eb0825e9ecba9175297a00b146e9fdd244c5b722f29d3c46ec38840ba18f1f06ddec3dea844867386c2e1ac95");
std::copy(result.begin(), result.end(), arr);

bool is_valid = CheckProofOfTimeNWesolowski(
Expand Down

0 comments on commit ae25614

Please sign in to comment.