-
Notifications
You must be signed in to change notification settings - Fork 18
/
Copy pathPrng.sol
86 lines (72 loc) · 2.39 KB
/
Prng.sol
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
/*
Copyright 2019-2022 StarkWare Industries Ltd.
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
https://www.starkware.co/open-source-license/
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.
*/
// SPDX-License-Identifier: Apache-2.0.
pragma solidity ^0.6.12;
import "./PrimeFieldElement0.sol";
contract Prng is PrimeFieldElement0 {
function storePrng(
uint256 prngPtr,
bytes32 digest,
uint256 counter
) internal pure {
assembly {
mstore(prngPtr, digest)
mstore(add(prngPtr, 0x20), counter)
}
}
function loadPrng(uint256 prngPtr) internal pure returns (bytes32, uint256) {
bytes32 digest;
uint256 counter;
assembly {
digest := mload(prngPtr)
counter := mload(add(prngPtr, 0x20))
}
return (digest, counter);
}
function initPrng(uint256 prngPtr, bytes32 publicInputHash) internal pure {
storePrng(
prngPtr,
// keccak256(publicInput)
publicInputHash,
0
);
}
/*
Auxiliary function for getRandomBytes.
*/
function getRandomBytesInner(bytes32 digest, uint256 counter)
private
pure
returns (
bytes32,
uint256,
bytes32
)
{
// returns 32 bytes (for random field elements or four queries at a time).
bytes32 randomBytes = keccak256(abi.encodePacked(digest, counter));
return (digest, counter + 1, randomBytes);
}
/*
Returns 32 bytes. Used for a random field element, or for 4 query indices.
*/
function getRandomBytes(uint256 prngPtr) internal pure returns (bytes32 randomBytes) {
bytes32 digest;
uint256 counter;
(digest, counter) = loadPrng(prngPtr);
// returns 32 bytes (for random field elements or four queries at a time).
(digest, counter, randomBytes) = getRandomBytesInner(digest, counter);
storePrng(prngPtr, digest, counter);
return randomBytes;
}
}