Example #1
0
        public IActionResult SignHashes(int cycleId, string channelId, [FromBody] SignaturesRequest sigReq)
        {
            var session = GetPromiseServerSession(cycleId, channelId, CyclePhase.TumblerChannelEstablishment);
            var hashes  = session.SignHashes(sigReq);

            Repository.Save(cycleId, session);
            return(Json(hashes));
        }
        public PuzzlePromise.ServerCommitment[] SignHashes(
            [ModelBinder(BinderType = typeof(TumblerParametersModelBinder))]
            ClassicTumblerParameters tumblerId,
            int cycleId, string channelId, [FromBody] SignaturesRequest sigReq)
        {
            if (tumblerId == null)
            {
                throw new ArgumentNullException("tumblerId");
            }
            var session = GetPromiseServerSession(cycleId, channelId, CyclePhase.TumblerChannelEstablishment);
            var hashes  = session.SignHashes(sigReq);

            Repository.Save(cycleId, session);
            return(hashes);
        }
Example #3
0
        /// <inheritdoc />
        public async Task <PuzzlePromise.ServerCommitment[]> SignHashesAsync(int cycleId, string channelId, SignaturesRequest sigReq)
        {
            PuzzlePromise.ServerCommitment[] result = await this.serverAddress.AppendPathSegment($"api/v1/tumblers/0/channels/{cycleId}/{channelId}/signhashes").PostJsonAsync(sigReq).ReceiveJson <PuzzlePromise.ServerCommitment[]>();

            return(result);
        }
Example #4
0
        public void TestPuzzlePromise()
        {
            RsaKey key = TestKeys.Default;

            Key serverEscrow = new Key();
            Key clientEscrow = new Key();

            var parameters = new PromiseParameters(key.PubKey)
            {
                FakeTransactionCount = 5,
                RealTransactionCount = 5
            };

            var client = new PromiseClientSession(parameters);
            var server = new PromiseServerSession(parameters);

            var coin = CreateEscrowCoin(serverEscrow.PubKey, clientEscrow.PubKey);

            client.ConfigureEscrowedCoin(coin, clientEscrow);
            SignaturesRequest request = client.CreateSignatureRequest(clientEscrow.PubKey.Hash, FeeRate);

            RoundTrip(ref client, parameters);
            RoundTrip(ref request);

            server.ConfigureEscrowedCoin(coin, serverEscrow, new Key().ScriptPubKey);
            PuzzlePromise.ServerCommitment[] commitments = server.SignHashes(request);
            RoundTrip(ref server, parameters);
            RoundTrip(ref commitments);

            PuzzlePromise.ClientRevelation revelation = client.Reveal(commitments);
            RoundTrip(ref client, parameters);
            RoundTrip(ref revelation);

            ServerCommitmentsProof proof = server.CheckRevelation(revelation);

            RoundTrip(ref server, parameters);
            RoundTrip(ref proof);

            var puzzleToSolve = client.CheckCommitmentProof(proof);

            RoundTrip(ref client, parameters);
            Assert.NotNull(puzzleToSolve);

            var solution     = key.SolvePuzzle(puzzleToSolve);
            var transactions = client.GetSignedTransactions(solution).ToArray();

            RoundTrip(ref client, parameters);
            Assert.True(transactions.Length == parameters.RealTransactionCount);


            var escrow = server.GetInternalState().EscrowedCoin;
            // In case things do not go well and timeout is hit...
            var redeemTransaction = server.CreateRedeemTransaction(FeeRate);
            var resigned          = redeemTransaction.ReSign(escrow);
            TransactionBuilder bb = new TransactionBuilder();

            bb.AddCoins(server.GetInternalState().EscrowedCoin);
            Assert.True(bb.Verify(resigned));

            //Check can ve reclaimed if malleated
            bb = new TransactionBuilder();
            escrow.Outpoint = new OutPoint(escrow.Outpoint.Hash, 10);
            bb.AddCoins(escrow);
            resigned = redeemTransaction.ReSign(escrow);
            Assert.False(bb.Verify(redeemTransaction.Transaction));
            Assert.True(bb.Verify(resigned));
        }
Example #5
0
 public PuzzlePromise.ServerCommitment[] SignHashes(string channelId, SignaturesRequest sigReq)
 {
     return(SignHashesAsync(channelId, sigReq).GetAwaiter().GetResult());
 }
Example #6
0
 public Task <PuzzlePromise.ServerCommitment[]> SignHashesAsync(string channelId, SignaturesRequest sigReq)
 {
     return(SendAsync <PuzzlePromise.ServerCommitment[]>(HttpMethod.Post, sigReq, $"channels/{cycleId}/{channelId}/signhashes"));
 }
Example #7
0
        public async Task <PuzzlePromise.ServerCommitment[]> SignHashesAsync(uint160 channelId, SignaturesRequest sigReq)
        {
            var result = await SendAsync <ArrayWrapper <PuzzlePromise.ServerCommitment> >(HttpMethod.Post, sigReq, $"channels/{cycleId}/{channelId}/signhashes").ConfigureAwait(false);

            return(result.Elements);
        }
Example #8
0
        public void TestPuzzlePromise()
        {
            RsaKey key = TestKeys.Default;

            Key serverEscrow = new Key();
            Key clientEscrow = new Key();

            var parameters = new PromiseParameters(key.PubKey)
            {
                FakeTransactionCountPerLevel = 5,
                RealTransactionCountPerLevel = 5,
                PaymentsCount = 5 //Not sure if this is the way to go.
            };

            var client = new PromiseClientSession(parameters);
            var server = new PromiseServerSession(parameters);

            var coin = CreateEscrowCoin(serverEscrow.PubKey, clientEscrow.PubKey);

            client.ConfigureEscrowedCoin(coin, clientEscrow);
            SignaturesRequest request = client.CreateSignatureRequest(clientEscrow.PubKey.Hash, FeeRate);

            RoundTrip(ref client, parameters);
            RoundTrip(ref request);

            server.ConfigureEscrowedCoin(uint160.Zero, coin, serverEscrow, new Key().ScriptPubKey);
            PuzzlePromise.ServerCommitment[][] commitments = server.SignHashes(request);
            RoundTrip(ref server, parameters);
            RoundTrip(ref commitments);

            PuzzlePromise.ClientRevelation revelation = client.Reveal(commitments);
            RoundTrip(ref client, parameters);
            RoundTrip(ref revelation);

            ServerCommitmentsProof proof = server.CheckRevelation(revelation, clientEscrow.PubKey.Hash, FeeRate);

            RoundTrip(ref server, parameters);
            RoundTrip(ref proof);

            var puzzlesToSolve = client.CheckCommitmentProof(proof);

            RoundTrip(ref client, parameters);
            foreach (var puzzle in puzzlesToSolve)
            {
                Assert.NotNull(puzzle);
            }

            for (int i = 0; i < puzzlesToSolve.Length; i++)
            {
                // Doesn't work for now! Need to figure how Bob will be spending the puzzles.
                var solution = key.SolvePuzzle(puzzlesToSolve[i]);
                // I'm not sure if GetSignedTransactions should handle all payments or only one payment at a time.
                var transactions = client.GetSignedTransactions(solution, i).ToArray();
                RoundTrip(ref client, parameters);
                Assert.True(transactions.Length == parameters.RealTransactionCountPerLevel);
            }


            var escrow = server.GetInternalState().EscrowedCoin;
            // In case things do not go well and timeout is hit...
            var redeemTransaction = server.CreateRedeemTransaction(FeeRate);
            var resigned          = redeemTransaction.ReSign(escrow);
            TransactionBuilder bb = new TransactionBuilder();

            bb.AddCoins(server.GetInternalState().EscrowedCoin);
            Assert.True(bb.Verify(resigned));

            //Check can ve reclaimed if malleated
            bb = new TransactionBuilder();
            escrow.Outpoint = new OutPoint(escrow.Outpoint.Hash, 10);
            bb.AddCoins(escrow);
            resigned = redeemTransaction.ReSign(escrow);
            Assert.False(bb.Verify(redeemTransaction.Transaction));
            Assert.True(bb.Verify(resigned));
        }
Example #9
0
 public Task <PuzzlePromise.ServerCommitment[]> SignHashesAsync(int cycleId, string channelId, SignaturesRequest sigReq)
 {
     return(SendAsync <PuzzlePromise.ServerCommitment[]>(HttpMethod.Post, sigReq, "api/v1/tumblers/0/channels/{0}/{1}/signhashes", cycleId, channelId));
 }