Skip to main content

Chia vdf verification (wraps C++)

Project description

Chia VDF

Build PyPI PyPI - Format GitHub

Total alerts Language grade: Python Language grade: C/C++

Building a wheel

Compiling chiavdf requires cmake, boost and GMP/MPIR.

python3 -m venv venv
source venv/bin/activate

pip install wheel setuptools_scm pybind11
pip wheel .

The primary build process for this repository is to use GitHub Actions to build binary wheels for MacOS, Linux (x64 and aarch64), and Windows and publish them with a source wheel on PyPi. See .github/workflows/build.yml. CMake uses FetchContent to download pybind11. Building is then managed by cibuildwheel. Further installation is then available via pip install chiavdf e.g.

Building Timelord and related binaries

In addition to building the required binary and source wheels for Windows, MacOS and Linux, chiavdf can be used to compile vdf_client and vdf_bench. vdf_client is the core VDF process that completes the Proof of Time submitted to it by the Timelord. The repo also includes a benchmarking tool to get a sense of the iterations per second of a given CPU called vdf_bench. Try ./vdf_bench square_asm 250000 for an ips estimate.

To build vdf_client set the environment variable BUILD_VDF_CLIENT to "Y". export BUILD_VDF_CLIENT=Y.

Similarly, to build vdf_bench set the environment variable BUILD_VDF_BENCH to "Y". export BUILD_VDF_BENCH=Y.

This is currently automated via pip in the install-timelord.sh script in the chia-blockchain repository which depends on this repository.

If you're running a timelord, the following tests are available, depending of which type of timelord you are running:

./1weso_test, in case you're running in sanitizer_mode.

./2weso_test, in case you're running a timelord that extends the chain and you're running the slow algorithm.

./prover_test, in case you're running a timelord that extends the chain and you're running the fast algorithm.

Those tests will simulate the vdf_client and verify for correctness the produced proofs.

Contributing and workflow

Contributions are welcome and more details are available in chia-blockchain's CONTRIBUTING.md.

The master branch is the currently released latest version on PyPI. Note that at times chiavdf will be ahead of the release version that chia-blockchain requires in it's master/release version in preparation for a new chia-blockchain release. Please branch or fork master and then create a pull request to the master branch. Linear merging is enforced on master and merging requires a completed review. PRs will kick off a ci build and analysis of chiavdf at lgtm.com. Please make sure your build is passing and that it does not increase alerts at lgtm.

Background from prior VDF competitions

Copyright 2018 Ilya Gorodetskov generic@sundersoft.com

Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at

http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.

Our VDF construction is described in classgroup.pdf. The implementation details about squaring and proving phrases are described below.

Main VDF Loop

The main VDF loop produces repeated squarings of the generator form (i.e. calculates y(n) = g^(2^n)) as fast as possible, until the program is interrupted. Sundersoft's entry from Chia's 2nd VDF contest is used, together with the fast reducer used in Pulmark's entry. This approach is described below:

The NUDUPL algorithm is used. The equations are based on cryptoslava's equations from the 1st contest. They were modified slightly to increase the level of parallelism.

The GCD is a custom implementation with scalar integers. There are two base cases: one uses a lookup table with continued fractions and the other uses the euclidean algorithm with a division table. The division table algorithm is slightly faster even though it has about 2x as many iterations.

After the base case, there is a 128 bit GCD that generates 64 bit cofactor matricies with Lehmer's algorithm. This is required to make the long integer multiplications efficient (Flint's implementation doesn't do this).

The GCD also implements Flint's partial xgcd function, but the output is slightly different. This implementation will always return an A value which is > the threshold and a B value which is <= the threshold. For a normal GCD, the threshold is 0, B is 0, and A is the GCD. Also the interfaces are slightly different.

Scalar integers are used for the GCD. I don't expect any speedup for the SIMD integers that were used in the last implementation since the GCD only uses 64x1024 multiplications, which are too small and have too high of a carry overhead for the SIMD version to be faster. In either case, most of the time seems to be spent in the base case so it shouldn't matter too much.

If SIMD integers are used with AVX-512, doubles have to be used because the multiplier sizes for doubles are significantly larger than for integers. There is an AVX-512 extension to support larger integer multiplications but no processor implements it yet. It should be possible to do a 50 bit multiply-add into a 100 bit accumulator with 4 fused multiply-adds if the accumulators have a special nonzero initial value and the inputs are scaled before the multiplication. This would make AVX-512 about 2.5x faster than scalar code for 1024x1024 integer multiplications (assuming the scalar code is unrolled and uses ADOX/ADCX/MULX properly, and the CPU can execute this at 1 cycle per iteration which it probably can't).

The GCD is parallelized by calculating the cofactors in a separate slave thread. The master thread will calculate the cofactor matricies and send them to the slave thread. Other calculations are also parallelized.

The VDF implementation from the first contest is still used as a fallback and is called about once every 5000 iterations. The GCD will encounter large quotients about this often and these are not implemented. This has a negligible effect on performance. Also, the NUDUPL case where A<=L is not implemented; it will fall back to the old implementation in this case (this never happens outside of the first 20 or so iterations).

There is also corruption detection by calculating C with a non-exact division and making sure the remainder is 0. This detected all injected random corruptions that I tested. No corruptions caused by bugs were observed during testing. This cannot correct for the sign of B being wrong.

GCD continued fraction lookup table

The is implemented in gcd_base_continued_fractions.h and asm_gcd_base_continued_fractions.h. The division table implementation is the same as the previous entry and was discussed there. Currently the division table is only used if AVX2 is enabled but it could be ported to SSE or scalar code easily. Both implementations have about the same performance.

The initial quotient sequence of gcd(a,b) is the same as the initial quotient sequence of gcd(a*2^n/b, 2^n) for any n. This is because the GCD quotients are the same as the continued fraction quotients of a/b, and the initial continued fraction quotients only depend on the initial bits of a/b. This makes it feasible to have a lookup table since it now only has one input.

a*2^n/b is calculated by doing a double precision division of a/b, and then truncating the lower bits. Some of the exponent bits are used in the table in addition to the fraction bits; this makes each slot of the table vary in size depending on what the exponent is. If the result is outside the table bounds, then the division result is floored to fall back to the euclidean algorithm (this is very rare).

The table is calculated by iterating all of the possible continued fractions that have a certain initial quotient sequence. Iteration ends when all of these fractions are either outside the table or they don't fully contain at least one slot of the table. Each slot that is fully contained by such a fraction is updated so that its quotient sequence equals the fraction's initial quotient sequence. Once this is complete, the cofactor matricies are calculated from the quotient sequences. Each cofactor matrix is 4 doubles.

The resulting code seems to have too many instructions so it doesn't perform very well. There might be some way to optimize it. It was written for SSE so that it would run on both processors.

This might work better on an FPGA possibly with low latency DRAM or SRAM (compared to the euclidean algorithm with a division table). There is no limit to the size of the table but doubling the latency would require the number of bits in the table to also be doubled to have the same performance.

Other GCD code

The gcd_128 function calculates a 128 bit GCD using Lehmer's algorithm. It is pretty straightforward and uses only unsigned arithmetic. Each cofactor matrix can only have two possible signs: [+ -; - +] or [- +; + -]. The gcd_unsigned function uses unsigned arithmetic and a jump table to apply the 64-bit cofactor matricies to the A and B values. It uses ADOX/ADCX/MULX if they are available and falls back to ADC/MUL otherwise. It will track the last known size of A to speed up the bit shifts required to get the top 128 bits of A.

No attempt was made to try to do the A and B long integer multiplications on a separate thread; I wouldn't expect any performance improvement from this.

Threads

There is a master thread and a slave thread. The slave thread only exists for each batch of 5000 or so squarings and is then destroyed and recreated for the next batch (this has no measurable overhead). If the original VDF is used as a fallback, the batch ends and the slave thread is destroyed.

Each thread has a 64-bit counter that only it can write to. Also, during a squaring iteration, it will not overwrite any value that it has previously written and transmitted to the other thread. Each squaring is split up into phases. Each thread will update its counter at the start of the phase (the counter can only be increased, not decreased). It can then wait on the other thread's counter to reach a certain value as part of a spin loop. If the spin loop takes too long, an error condition is raised and the batch ends; this should prevent any deadlocks from happening.

No CPU fences or atomics are required since each value can only be written to by one thread and since x86 enforces acquire/release ordering on all memory operations. Compiler memory fences are still required to prevent the compiler from caching or reordering memory operations.

The GCD master thread will increment the counter when a new cofactor matrix has been outputted. The slave thread will spin on this counter and then apply the cofactor matrix to the U or V vector to get a new U or V vector.

It was attempted to use modular arithmetic to calculate k directly but this slowed down the program due to GMP's modulo or integer multiply operations not having enough performance. This also makes the integer multiplications bigger.

The speedup isn't very high since most of the time is spent in the GCD base case and these can't be parallelized.

Generating proofs

The nested wesolowski proofs (n-wesolowski) are used to check the correctness of a VDF result. (Simple) Wesolowski proofs are described in A Survey of Two Verifiable Delay Functions. In order to prove h = g^(2^T), a n-wesolowski proof uses n intermediate simple wesolowski proofs. Given h, g, T, t1, t2, ..., tn, h1, h2, ..., hn, a correct n-wesolowski proof will verify the following:

h1 = g^(2^t1)
h2 = h1^(2^t2)
h3 = h2^(2^t3)
...
hn = h(n-1)^(2^tn)

Additionally, we must have:

t1 + t2 + ... + tn = T
hn = h

The algorithm will generate at most 64-wesolowski proofs. Some intermediates wesolowski proofs are stored in parallel with the main VDF loop. The goal is to have a n-wesolowski proof almost ready as soon as the main VDF loop finishes computing h = g^(2^T), for a T that we're interested in. We'll call a segment a tuple (y, x, T) for which we're interested in a simple wesolowski proof that y = x^(2^T). We'll call a segment finished when we've finished computing its proof.

Segmenets stored

We'll store finished segments of length 2^x for x being multiples of 2 greater than or equal to 16. The current implementation limits the maximum segment size to 2^30, but this can be increased if needed. Let P = 16+2*l. After each 2^P steps calculated by the main VDF loop, we'll store a segment proving that we've correctly done the 2^P steps. Formally, let x be the form after k*2^P steps, y be the form after (k+1)*2^P steps, for each k >= 0, for each P = 16+2*l. Then, we'll store a segment (y, x, 2^P), together with a simple wesolowski proof.

Segment threads

In order to finish a segment of length T=2^P, the number of iterations to run for is T/k + l*2^(k+1) and the intermediate storage required is T/(k*l), for some parameters k and l, as described in the paper. The squarings used to finish a segment are about 2 times as slow as the ones used by the main VDF loop. Even so, finishing a segment is much faster than producing its y value by the main VDF loop. This allows, by the time the main VDF loop finishes 2^16 more steps, to perform work on finishing multiple segments.

The parameters used in finishing segments, for T=2^16, are k=10 and l=1. Above that, parameters are k=12 and l=2^(P-18). Note that, for P >= 18, the intermediate storage needed for a segment is constant (i.e. 2^18/12 forms stored in memory).

Prover class is responsible to finish a segment. It implements pause/resume functionality, so its work can be paused, and later resumed from the point it stopped. For each unfinished segment generated by the main VDF loop, a Prover instance is created, which will eventually finish the segment.

Segment threads are responsible for deciding which Prover instance is currently running. In the current implementation, there are 3 segment threads (however the number is configurable), so at most 3 Prover instances will run at once, at different threads (other Provers will be paused). The segment threads will always pick the segments with the shortest length to run. In case of a tie, the segments received the earliest will have priority. Every time a new segment arrives, or a segment gets finished, some pausing/resuming of Provers is done, if needed. Pausing is done to have at most 3 Provers running at any time, whilst resuming is done if less than 3 Provers are working, but some Provers are paused.

All the segments of lengths 2^16, 2^18 and 2^20 will be finished relatively soon after the main VDF worker produced them, while the segments of length 2^22 and upwards will lag behind the main VDF worker a little. Eventually, all the higher size segments will be finished, the work on them being done repeatedly via pausing (when a smaller size segment arrives) and resuming (when all smaller size segments are finished).

Currently, 4 more segment threads are added after the main VDF loop finishes 500 million iterations (after about 1 hour of running). This is done to be completely sure even the very big sized segments will be finished. This optimisation is only allowed on machines supporting at least 16 concurrent threads.

Generating n-wesolowski proof

Let T an iteration we are interested in. Firstly, the main VDF Loop will need to calculate at least T iterations. Then, in order to get fast a n-wesolowski proof, we'll concatenate finished segments. We want the proof to be as short as possible, so we'll always pick finished segments of the maximum length possible. If such segments aren't finished, we'll choose lower length segments. A segment of length 2^(16 + 2*p) can always be replaced with 4 segments of length 2^(16 + 2*p - 2). The proof will be created shortly after the main VDF loop produced the result, as the 2^16 length segments will always be up to date with the main VDF loop (and, at worst case, we can always concatenate 2^16 length segments, if bigger sizes are not finished yet). It's possible after the concatenation that we'll still need to prove up to 2^16 iterations (no segment is able to cover anything less than 2^16). This last work is done in parallel with the main VDF loop, as an optimisation.

The program limits the proof size to 64-wesolowski. If number of iterations is very large, it's possible the concatenation won't fit into this. In this case, the program will attempt again to prove every minute, until there are enough large segments to fit the 64-wesolowski limit. However, almost in all cases, the concatenation will fit the 64-wesolowski limit in the first try.

Since the maximum segment size is 2^30 and we can use at most 64 segments in a concatenation, the program will prove at most 2^36 iterations. This can be increased if needed.

Intermediates storage

In order to finish segments, some intermediate values need to be stored for each segment. For each different possible segment length, we use a sliding window of length 20 to store those. Hence, for each segment length, we'll store only the intermediates values needed for the last 20 segments produced by the main VDF loop. Since finishing segments is faster than producing them by the main VDF loop, we assume the segment threads won't be behind by more than 20 segments from the main VDF loop, for each segment length. Thanks to the sliding window technique, the memory used will always be constant.

Generally, the main VDF loop performs all the storing, after computing a form we're interested in. However, since storing is very frequent and expensive (GMP operations), this will slow down the main VDF loop.

For the machines having at least 16 concurrent threads, an optimization is provided: the main VDF loop does only repeated squaring, without storing any form. After each 2^15 steps are performed, a new thread starts redoing the work for 2^15 more steps, this time storing the intermediate values as well. All the intermediates threads and the main VDF loop will work in parallel. The only purpose of the main VDF loop becomes now to produce the starting values for the intermediate threads, as fast as possible. The squarings used in the intermediates threads will be 2 times slower than the ones used in the main VDF loop. It's expected the intermediates will only lag behind the main VDF loop by 2^15 iterations, at any point: after 2^16 iterations are done by the main VDF loop, the first thread doing the first 2^15 intermediate values is already finished. Also, at that point, half of the work of the second thread doing the last 2^15 intermediates values should be already done.

Project details


Release history Release notifications | RSS feed

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

chiavdf-1.0.11.tar.gz (640.2 kB view details)

Uploaded Source

Built Distributions

chiavdf-1.0.11-cp311-cp311-win_amd64.whl (1.9 MB view details)

Uploaded CPython 3.11 Windows x86-64

chiavdf-1.0.11-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (474.5 kB view details)

Uploaded CPython 3.11 manylinux: glibc 2.17+ x86-64

chiavdf-1.0.11-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (395.6 kB view details)

Uploaded CPython 3.11 manylinux: glibc 2.17+ ARM64

chiavdf-1.0.11-cp311-cp311-macosx_11_0_x86_64.whl (343.6 kB view details)

Uploaded CPython 3.11 macOS 11.0+ x86-64

chiavdf-1.0.11-cp311-cp311-macosx_11_0_arm64.whl (317.0 kB view details)

Uploaded CPython 3.11 macOS 11.0+ ARM64

chiavdf-1.0.11-cp310-cp310-win_amd64.whl (1.9 MB view details)

Uploaded CPython 3.10 Windows x86-64

chiavdf-1.0.11-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (395.6 kB view details)

Uploaded CPython 3.10 manylinux: glibc 2.17+ ARM64

chiavdf-1.0.11-cp310-cp310-manylinux_2_12_x86_64.manylinux2010_x86_64.whl (462.3 kB view details)

Uploaded CPython 3.10 manylinux: glibc 2.12+ x86-64

chiavdf-1.0.11-cp310-cp310-macosx_11_0_x86_64.whl (343.6 kB view details)

Uploaded CPython 3.10 macOS 11.0+ x86-64

chiavdf-1.0.11-cp310-cp310-macosx_11_0_arm64.whl (317.0 kB view details)

Uploaded CPython 3.10 macOS 11.0+ ARM64

chiavdf-1.0.11-cp39-cp39-win_amd64.whl (1.9 MB view details)

Uploaded CPython 3.9 Windows x86-64

chiavdf-1.0.11-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (395.8 kB view details)

Uploaded CPython 3.9 manylinux: glibc 2.17+ ARM64

chiavdf-1.0.11-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.whl (462.3 kB view details)

Uploaded CPython 3.9 manylinux: glibc 2.12+ x86-64

chiavdf-1.0.11-cp39-cp39-macosx_11_0_x86_64.whl (343.7 kB view details)

Uploaded CPython 3.9 macOS 11.0+ x86-64

chiavdf-1.0.11-cp39-cp39-macosx_11_0_arm64.whl (317.1 kB view details)

Uploaded CPython 3.9 macOS 11.0+ ARM64

chiavdf-1.0.11-cp38-cp38-win_amd64.whl (1.9 MB view details)

Uploaded CPython 3.8 Windows x86-64

chiavdf-1.0.11-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (395.5 kB view details)

Uploaded CPython 3.8 manylinux: glibc 2.17+ ARM64

chiavdf-1.0.11-cp38-cp38-manylinux_2_12_x86_64.manylinux2010_x86_64.whl (462.2 kB view details)

Uploaded CPython 3.8 manylinux: glibc 2.12+ x86-64

chiavdf-1.0.11-cp38-cp38-macosx_11_0_x86_64.whl (343.7 kB view details)

Uploaded CPython 3.8 macOS 11.0+ x86-64

chiavdf-1.0.11-cp38-cp38-macosx_11_0_arm64.whl (317.1 kB view details)

Uploaded CPython 3.8 macOS 11.0+ ARM64

File details

Details for the file chiavdf-1.0.11.tar.gz.

File metadata

  • Download URL: chiavdf-1.0.11.tar.gz
  • Upload date:
  • Size: 640.2 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/4.0.2 CPython/3.11.5

File hashes

Hashes for chiavdf-1.0.11.tar.gz
Algorithm Hash digest
SHA256 3e3520a4c4dd58b30541d9eba5e5a69fcbc0f1294e4639aee7638373fda18af1
MD5 8a7b40bd89acc0b024d0081074e0e650
BLAKE2b-256 0944b4974182216f0043a72432c56b7a299c2ed5536a4830d48920db0665bcdc

See more details on using hashes here.

File details

Details for the file chiavdf-1.0.11-cp311-cp311-win_amd64.whl.

File metadata

File hashes

Hashes for chiavdf-1.0.11-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 74e05c99f4552215139bcfc3f90d20457514f9dfcb01e47100dbd33f8391aa3b
MD5 c1fd0dd2a9f8ccaaf786abc32d6a7d6b
BLAKE2b-256 6253563927dae616d300419b91943e8a5414c575a37ca27549a22d4efcd3f044

See more details on using hashes here.

File details

Details for the file chiavdf-1.0.11-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for chiavdf-1.0.11-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 f01e3806378620e3453d4296836f13d7923843c226fdd13a1ebd8a05f2ac9ab3
MD5 141ee6e9c5aeb8074a577fd67f7b6d82
BLAKE2b-256 47cf16692dc489efb521fad72414cc051419da6530429df299c2d3a0e005aa21

See more details on using hashes here.

File details

Details for the file chiavdf-1.0.11-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for chiavdf-1.0.11-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 e8e04d01939be2bd7c27d0e6710f43d652c8b1151317c7ad17d40480c0f68708
MD5 2b2c6f010e7fad887b675366a7f3c794
BLAKE2b-256 d47469277850d0e90d976203e6ba85a83530d0497f6bea0db9b04ef715bfe22b

See more details on using hashes here.

File details

Details for the file chiavdf-1.0.11-cp311-cp311-macosx_11_0_x86_64.whl.

File metadata

File hashes

Hashes for chiavdf-1.0.11-cp311-cp311-macosx_11_0_x86_64.whl
Algorithm Hash digest
SHA256 80f514764d5191eb8f916095e9d73d66aceb9ad757331f8fab9619732f933bab
MD5 3df80ada828c8dd62c2108b5db5ef4a0
BLAKE2b-256 1fb3e4b5d7369ee0dd19a1a3f4c13c079673c8f55781164c824e51115161b56c

See more details on using hashes here.

File details

Details for the file chiavdf-1.0.11-cp311-cp311-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for chiavdf-1.0.11-cp311-cp311-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 16fbb38c69a2cc26f4419d69bbb878196954435b7e5ae1fba9f0439367fe494f
MD5 97b5754b7d82637e6f11cc8e8084e89b
BLAKE2b-256 794a25044c3552fed580fcdec98ead75e89281b7142e2e0a897362c350d5aec4

See more details on using hashes here.

File details

Details for the file chiavdf-1.0.11-cp310-cp310-win_amd64.whl.

File metadata

File hashes

Hashes for chiavdf-1.0.11-cp310-cp310-win_amd64.whl
Algorithm Hash digest
SHA256 b47d4e8734b76e513f9b961b206f257d8dcb4cedb456d98e7f927ef925834e72
MD5 5e45dafe5ac9d71a5520dd251ade1c60
BLAKE2b-256 c250877413b30669e794c10e70b3d771204930a58068ceab855aa2d22de218d8

See more details on using hashes here.

File details

Details for the file chiavdf-1.0.11-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for chiavdf-1.0.11-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 14889ac8c05f5534bb195a9b8f3061bf6e79f9ed0cec9ab93f184411d4df251d
MD5 c2cbf309e1276d14c9c4384b14334277
BLAKE2b-256 3ec92a9ecba315f7774e366f25621a4cb2fc8532b0408781cca3a4850a893047

See more details on using hashes here.

File details

Details for the file chiavdf-1.0.11-cp310-cp310-manylinux_2_12_x86_64.manylinux2010_x86_64.whl.

File metadata

File hashes

Hashes for chiavdf-1.0.11-cp310-cp310-manylinux_2_12_x86_64.manylinux2010_x86_64.whl
Algorithm Hash digest
SHA256 2578d3c1e53b00bcd0f89d38d6a7d373126cdee75968ae33d21f2a9930cf76ab
MD5 48ea2eef45cf484a82d8586a45861e1e
BLAKE2b-256 c8d81e98a37f3abb8657b87f2c69bc618c1272bdff8772b97491c7f41f09bf2e

See more details on using hashes here.

File details

Details for the file chiavdf-1.0.11-cp310-cp310-macosx_11_0_x86_64.whl.

File metadata

File hashes

Hashes for chiavdf-1.0.11-cp310-cp310-macosx_11_0_x86_64.whl
Algorithm Hash digest
SHA256 22faa318e02600bbf069e6fd03e8e73ead757cf438c2573d03b0f46698b2391f
MD5 8e875df1433e660dd611e22832def123
BLAKE2b-256 e7f561e0f01273c6f3419d3638e0c631a211f6cee061162bd927a6b02a60caca

See more details on using hashes here.

File details

Details for the file chiavdf-1.0.11-cp310-cp310-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for chiavdf-1.0.11-cp310-cp310-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 6748b17a1679f385bf8637b4555cd10fd96d5f3645762da0cd15eb32ef9e110f
MD5 d16ae273ab0d2cb735d70e355feffc24
BLAKE2b-256 48b709dfc76d69dccbb84513c84dee9acfe6dc1f2f612af51691ee0d5f8c601b

See more details on using hashes here.

File details

Details for the file chiavdf-1.0.11-cp39-cp39-win_amd64.whl.

File metadata

  • Download URL: chiavdf-1.0.11-cp39-cp39-win_amd64.whl
  • Upload date:
  • Size: 1.9 MB
  • Tags: CPython 3.9, Windows x86-64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/4.0.2 CPython/3.11.5

File hashes

Hashes for chiavdf-1.0.11-cp39-cp39-win_amd64.whl
Algorithm Hash digest
SHA256 4d37955faad0479732ccdcb3dc0043cfb32892b3a6e0a60811dd799d5354fa30
MD5 a97909b13f3cb313a0a0d70d6662acb0
BLAKE2b-256 b5e7a4964ee08706dc1b04812c2f5f46bf3d4a2723e1fbff50bc38cfd5ded1fb

See more details on using hashes here.

File details

Details for the file chiavdf-1.0.11-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for chiavdf-1.0.11-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 22f1d17e795a38c2b589b3930c2790694c2babac81f2eedcf6f6332c2d4e7213
MD5 370b521943ed30c0be8b9696c7d54e36
BLAKE2b-256 a56046877eb47e593d52f82c99963e18c171f9e845740d3f06b371ed8a891384

See more details on using hashes here.

File details

Details for the file chiavdf-1.0.11-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.whl.

File metadata

File hashes

Hashes for chiavdf-1.0.11-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.whl
Algorithm Hash digest
SHA256 8d63270aae149d4380f8fb3cbd6537631f4838c6a3fb3cc50432bb934947d6f2
MD5 a7bbc0e6ae698634de812d7a3ca7e80c
BLAKE2b-256 49b833f592005a9b8c185e0b8110c110ce916d36893cad57dbf60b45d9072a2f

See more details on using hashes here.

File details

Details for the file chiavdf-1.0.11-cp39-cp39-macosx_11_0_x86_64.whl.

File metadata

File hashes

Hashes for chiavdf-1.0.11-cp39-cp39-macosx_11_0_x86_64.whl
Algorithm Hash digest
SHA256 bad47067848e1f7cde974bb907e8964a3aa22df652ed9fcc5d3690fbb9ce3ea1
MD5 0ce35ab69cdd20c4d5f007b3b08bb483
BLAKE2b-256 6dba27376eb7c3060cef072cecf5023a2385811c779ddcbfa8a4ad51220cf300

See more details on using hashes here.

File details

Details for the file chiavdf-1.0.11-cp39-cp39-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for chiavdf-1.0.11-cp39-cp39-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 044afbd571272545a5a6462d3ff0cb78dc6cb96315496fbf80d98071897db35d
MD5 f4cf03d36dae9a1d64d9b255e44450ca
BLAKE2b-256 91bc8c03bd2a8e5993bf8138193bb25001ea076d942e8339d71fb24624451aba

See more details on using hashes here.

File details

Details for the file chiavdf-1.0.11-cp38-cp38-win_amd64.whl.

File metadata

  • Download URL: chiavdf-1.0.11-cp38-cp38-win_amd64.whl
  • Upload date:
  • Size: 1.9 MB
  • Tags: CPython 3.8, Windows x86-64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/4.0.2 CPython/3.11.5

File hashes

Hashes for chiavdf-1.0.11-cp38-cp38-win_amd64.whl
Algorithm Hash digest
SHA256 47726f2d0ec995b65e3acaa7bb872893a847949590ddd6b8560b9ff7ac3ae73c
MD5 5b0fd50759f01e8aa53e27e78613568b
BLAKE2b-256 a96173b32963c0ccc49abf650be2da6efa63f0e1166fd43230bef9c0333ae654

See more details on using hashes here.

File details

Details for the file chiavdf-1.0.11-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for chiavdf-1.0.11-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 d781f7e82d2914d64967bc40d42f4efc2ddec763c6841627403ce8bb04e29b5e
MD5 e5e0404378bdabdbd5595c3a999e3d4c
BLAKE2b-256 0ea39a9f02ba2c06acb8db91c0299fa23557fee20f1690a04f00caa315455776

See more details on using hashes here.

File details

Details for the file chiavdf-1.0.11-cp38-cp38-manylinux_2_12_x86_64.manylinux2010_x86_64.whl.

File metadata

File hashes

Hashes for chiavdf-1.0.11-cp38-cp38-manylinux_2_12_x86_64.manylinux2010_x86_64.whl
Algorithm Hash digest
SHA256 38ab4ea453535795d01aa7c3f3fc193ff39a749f867b139582ca02f903f87b25
MD5 d59cfbb3ba600ff56d6bbc8f839167b1
BLAKE2b-256 02850ca01e2e75c1b382328f031e1685a48f03a826c7e765cf6deb58a1a21ac8

See more details on using hashes here.

File details

Details for the file chiavdf-1.0.11-cp38-cp38-macosx_11_0_x86_64.whl.

File metadata

File hashes

Hashes for chiavdf-1.0.11-cp38-cp38-macosx_11_0_x86_64.whl
Algorithm Hash digest
SHA256 be8ac3891dd21ec55d4949c3c0987029753693111bf05d5903e0244be0b60519
MD5 f4682b5413274b3213a7c93ebd824b26
BLAKE2b-256 e641dc6174ebefaaccffa32a5b448df443c5952384cfde172ef048c0ca6526f8

See more details on using hashes here.

File details

Details for the file chiavdf-1.0.11-cp38-cp38-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for chiavdf-1.0.11-cp38-cp38-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 751834c5ba9c1af987a94de9ed1bda96ac39be8f080c09b061063f54dccebb4d
MD5 1b67b47734616c48a2fb0b2b89adc441
BLAKE2b-256 763ed71c7752ce6fb9efbf6e67f2423e02e0af63d54cef27a9bdd141126f2f83

See more details on using hashes here.

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page