예제 #1
0
        public CommitMessage StartKeygen()
        {
            var biVarPoly  = BiVarSymmetricPolynomial.Random(Faulty);
            var commitment = biVarPoly.Commit();
            var rows       = Enumerable.Range(1, Players)
                             .Select(i => biVarPoly.Evaluate(i))
                             .Select((row, i) => EncryptRow(row, _publicKeys[i]))
                             .ToArray();

            return(new CommitMessage
            {
                Commitment = commitment,
                EncryptedRows = rows
            });
        }
예제 #2
0
        public void SymmetricPolynomialIsSymmetric()
        {
            var rnd = new Random();
            var p = BiVarSymmetricPolynomial.Random(5);
            int x = rnd.Next(), y = rnd.Next();
            var vxy = Eval(p, x, y);
            var vyx = Eval(p, y, x);

            Assert.AreEqual(vxy, vyx);

            var c   = p.Commit();
            var cxy = c.Evaluate(x, y);
            var cyx = c.Evaluate(y, x);

            Assert.AreEqual(cxy, cyx);
        }
예제 #3
0
        private TransactionReceipt MakeCommitTransaction()
        {
            var biVarPoly  = BiVarSymmetricPolynomial.Random(0);
            var commitment = biVarPoly.Commit().ToBytes();
            var row        = new Byte[0];
            var tx         = _transactionBuilder.InvokeTransactionWithGasPrice(
                _wallet.EcdsaKeyPair.PublicKey.GetAddress(),
                ContractRegisterer.GovernanceContract,
                Money.Zero,
                GovernanceInterface.MethodKeygenCommit,
                0,
                UInt256Utils.ToUInt256(GovernanceContract.GetCycleByBlockNumber(_stateManager.LastApprovedSnapshot.Blocks.GetTotalBlockHeight())),
                commitment,
                new byte[][] { row }
                );

            var res = Signer.Sign(tx, _wallet.EcdsaKeyPair, true);

            Assert.False(_eventData.ContainsKey(res.Hash));
            _eventData.Add(res.Hash,
                           ByteString.CopyFrom(ContractEncoder.Encode(GovernanceInterface.EventKeygenCommit,
                                                                      commitment, new byte[][] { row })));
            return(res);
        }
예제 #4
0
        private static Fr Eval(BiVarSymmetricPolynomial p, int x, int y)
        {
            var t = p.Evaluate(x).ToArray();

            return(MclBls12381.EvaluatePolynomial(t, Fr.FromInt(y)));
        }