public override async Task OnRequestAsync(IStratumClient client, Timestamped <JsonRpcRequest> timeStampedRequest) { var request = timeStampedRequest.Value; var context = client.GetContextAs <MoneroWorkerContext>(); switch (request.Method) { case MoneroStratumMethods.Login: OnLogin(client, timeStampedRequest); break; case MoneroStratumMethods.GetJob: OnGetJob(client, timeStampedRequest); break; case MoneroStratumMethods.Submit: await OnSubmitAsync(client, timeStampedRequest); break; case MoneroStratumMethods.KeepAlive: context.LastActivity = MasterClock.Now; // recognize activity. break; default: _logger.Debug($"[{client.ConnectionId}] Unsupported RPC request: {JsonConvert.SerializeObject(request, Globals.JsonSerializerSettings)}"); client.RespondError(StratumError.Other, $"Unsupported request {request.Method}", request.Id); break; } }
public MoneroJobParams CreateWorkerJob(IStratumClient client) { var context = client.GetContextAs <MoneroWorkerContext>(); var workerJob = new MoneroWorkerJob(_workerJobCounter.GetNext(), BlockTemplate.Height, context.Difficulty, ++extraNonce); var blob = EncodeBlob(workerJob.ExtraNonce); var target = EncodeTarget(workerJob.Difficulty); return(null); }
private void OnLogin(IStratumClient client, Timestamped <JsonRpcRequest> tsRequest) { var request = tsRequest.Value; var context = client.GetContextAs <MoneroWorkerContext>(); if (request.Id == null) { client.RespondError(StratumError.MinusOne, "missing request id", request.Id); return; } var loginRequest = request.ParamsAs <MoneroLoginRequest>(); if (string.IsNullOrEmpty(loginRequest?.Login)) { client.RespondError(StratumError.MinusOne, "missing login", request.Id); return; } // extract worker & miner. var split = loginRequest.Login.Split('.'); context.MinerName = split[0]; context.WorkerName = split.Length > 1 ? split[1] : null; // set useragent. context.UserAgent = loginRequest.UserAgent; // set payment-id if any. var index = context.MinerName.IndexOf('#'); if (index != -1) { context.MinerName = context.MinerName.Substring(0, index); context.PaymentId = context.MinerName.Substring(index + 1); } var hasValidAddress = ValidateAddress(context.MinerName); context.IsAuthorized = context.IsSubscribed = hasValidAddress; if (!context.IsAuthorized) { client.RespondError(StratumError.MinusOne, "invalid login", request.Id); return; } var loginResponse = new MoneroLoginResponse { Id = client.ConnectionId, Job = ((MoneroJobManager)PoolContext.JobManager).CurrentJob.CreateWorkerJob(client) }; client.Respond(loginResponse, request.Id); // log association _logger.Information($"[{client.ConnectionId}] = {loginRequest.Login} = {client.RemoteEndpoint.Address}"); // recognize activity. context.LastActivity = MasterClock.Now; }