Random Number Generation
Here we will demonstrate generating uniform random shared secrets of any shape using AdditiveProtocolSuite. We use an instance of numpy.random.Generator to seed the process. After each secret is generated, we reveal it to the players and log it.
We will initialize the protocol suite with a custom order (251) and a FixedPoint encoding with 4 fractional bits so that the random secrets are small and easy to read in the output.
[1]:
import logging
import sys
import numpy
from cicada.additive import AdditiveProtocolSuite
from cicada.communicator import SocketCommunicator
from cicada.encoding import FixedPoint
from cicada.logger import Logger
logging.basicConfig(level=logging.INFO)
def main(communicator):
log = Logger(logging.getLogger(), communicator)
protocol = AdditiveProtocolSuite(communicator, order=251, encoding=FixedPoint(precision=4))
generator = numpy.random.default_rng(seed=1234)
for shape in [(), (1,), (2,), (3,)]:
log.info("*" * 40, src=0)
random_share = protocol.field_uniform(generator=generator, shape=shape)
random = protocol.reveal(random_share)
log.info(f"Player {communicator.rank} random values: {random}")
SocketCommunicator.run(world_size=3, fn=main);
INFO:root:****************************************
INFO:root:Player 0 random values: 3.5
INFO:root:Player 1 random values: 3.5
INFO:root:Player 2 random values: 3.5
INFO:root:****************************************
INFO:root:Player 0 random values: [-1.5]
INFO:root:Player 1 random values: [-1.5]
INFO:root:Player 2 random values: [-1.5]
INFO:root:****************************************
INFO:root:Player 0 random values: [-7.1875 0.875 ]
INFO:root:Player 1 random values: [-7.1875 0.875 ]
INFO:root:Player 2 random values: [-7.1875 0.875 ]
INFO:root:****************************************
INFO:root:Player 0 random values: [-0.75 -7.1875 0.0625]
INFO:root:Player 1 random values: [-0.75 -7.1875 0.0625]
INFO:root:Player 2 random values: [-0.75 -7.1875 0.0625]
See also