Spaces:
Sleeping
Sleeping
| """ | |
| Ethereum-compatible commitment helpers for the Quantum Randomness Oracle. | |
| The on-chain contract verifies: | |
| keccak256(abi.encodePacked(uint256 randomness)) == commitment | |
| abi.encodePacked(uint256) produces the value as 32 bytes (big-endian, | |
| zero-padded). We replicate this exactly so commitments computed | |
| off-chain match what Solidity expects. | |
| """ | |
| from Crypto.Hash import keccak | |
| def compute_commitment(randomness_bytes: bytes) -> bytes: | |
| """Return keccak256(abi.encodePacked(uint256(randomness))) as raw bytes. | |
| ``randomness_bytes`` is the raw quantum output (typically 32 bytes). | |
| It is first interpreted as a big-endian unsigned integer and then | |
| re-encoded as a 32-byte big-endian value so the hash matches what | |
| Solidity's ``abi.encodePacked(uint256)`` would produce. | |
| """ | |
| randomness_int = int.from_bytes(randomness_bytes, "big") | |
| encoded = randomness_int.to_bytes(32, "big") | |
| k = keccak.new(digest_bits=256, data=encoded) | |
| return k.digest() | |
| def compute_commitment_hex(randomness_bytes: bytes) -> str: | |
| """Same as ``compute_commitment`` but returns a ``0x``-prefixed hex string.""" | |
| return "0x" + compute_commitment(randomness_bytes).hex() | |
| def compute_vrf_output(seed_bytes: bytes, alpha: str) -> bytes: | |
| """Compute VRF output: keccak256(seed_bytes || alpha_bytes). | |
| This is a deterministic function of (seed, alpha) that can be | |
| independently reproduced by anyone who knows the seed. | |
| """ | |
| alpha_bytes = alpha.encode("utf-8") | |
| k = keccak.new(digest_bits=256, data=seed_bytes + alpha_bytes) | |
| return k.digest() | |
| def compute_vrf_output_hex(seed_bytes: bytes, alpha: str) -> str: | |
| """Same as ``compute_vrf_output`` but returns a ``0x``-prefixed hex string.""" | |
| return "0x" + compute_vrf_output(seed_bytes, alpha).hex() | |