示例#1
0
        public async Task <RPCResponse <RPCGetBlockTemplateResult> > GetBlockTemplate()
        {
            RPCRequest request;

            if (lastLongPollId == null)
            {
                request = new RPCRequest
                {
                    ClientId    = this.appConfiguration.ClientId,
                    RequestJson = InitialGbtJson
                };
            }
            else
            {
                request = new RPCRequest
                {
                    ClientId    = this.appConfiguration.ClientId,
                    RequestJson = GbtWithLongPollIdJson(lastLongPollId)
                };
            }

            var response = await Post <RPCGetBlockTemplateResult>(request);

            lastLongPollId = response.Status == 200 ? response.Result.result.longpollid : null;

            return(response);
        }
示例#2
0
        public async Task <RPCResponse <RPCSubmitBlockResult> > SubmitBlock(string hexBlock)
        {
            var request = new RPCRequest {
                ClientId = this.appConfiguration.ClientId, RequestJson = SubmitBlockJson(hexBlock)
            };

            return(await Post <RPCSubmitBlockResult>(request));
        }
示例#3
0
        public async Task <RPCResponse <RPCListUnspentResult> > GetUnspentOutputs()
        {
            var request = new RPCRequest
            {
                ClientId    = this.appConfiguration.ClientId,
                RequestJson = GetUnspentOutputsJson
            };

            return(await Post <RPCListUnspentResult>(request));
        }
示例#4
0
        public async Task <RPCResponse <RPCDumpWalletResult> > DumpWallet(string absoluteFilePath)
        {
            if (File.Exists(absoluteFilePath))
            {
                File.Delete(absoluteFilePath);
            }

            var dir = Path.GetDirectoryName(absoluteFilePath);

            if (!Directory.Exists(dir))
            {
                Directory.CreateDirectory(dir);
            }

            var request = new RPCRequest
            {
                ClientId    = this.appConfiguration.ClientId,
                RequestJson = DumpWalletJson(absoluteFilePath)
            };

            return(await Post <RPCDumpWalletResult>(request));
        }
示例#5
0
        public async Task <RPCResponse <T> > PostBlock <T>(RPCRequest request, [CallerMemberName] string method = null) where T : class
        {
            this.stopwatch.Restart();

            var signalResponse = new RPCResponse <T> {
                Status = -1, StatusText = $"Error in method {nameof(Post)}."
            };

            int submitblockport = 48333;

            try
            {
                var credentialCache = new CredentialCache();
                credentialCache.Add(new Uri($"{this.appConfiguration.RPCHost}:{submitblockport}"), "Basic", new NetworkCredential(this.appConfiguration.RPCUser, this.appConfiguration.RPCPassword));
                this.httpWebRequest                  = WebRequest.CreateHttp($"{this.appConfiguration.RPCHost}:{submitblockport}");
                this.httpWebRequest.Timeout          = (int)TimeSpan.FromMinutes(20).TotalMilliseconds;
                this.httpWebRequest.ReadWriteTimeout = (int)TimeSpan.FromMinutes(20).TotalMilliseconds;
                this.httpWebRequest.Method           = "Post";
                this.httpWebRequest.ContentType      = "application/json";
                this.httpWebRequest.Credentials      = credentialCache;

                var requestUtf8Bytes = Encoding.ASCII.GetBytes(request.RequestJson);
                //var requestUtf8Bytes = Serializer.Instance.Serialize(request);
                using (var requestStream = await httpWebRequest.GetRequestStreamAsync())
                {
                    requestStream.Write(requestUtf8Bytes, 0, requestUtf8Bytes.Length);
                }

                using (var webResponse = await this.httpWebRequest.GetResponseAsync())
                {
                    var response = (HttpWebResponse)webResponse;
                    signalResponse.Status     = (int)response.StatusCode;
                    signalResponse.StatusText = response.StatusDescription;

                    if (response.StatusCode == HttpStatusCode.OK)
                    {
                        // assume the request body has valid utf8
                        using (Stream receiveStream = response.GetResponseStream())
                        {
                            // Pipes the stream to a higher level stream reader with the required encoding format.
                            StreamReader readStream = new StreamReader(receiveStream, Encoding.UTF8);
                            var          text       = readStream.ReadToEnd();
                            this.logger.LogWarning($"Submit block returned: {text}");
                            signalResponse.Result = JsonSerializer.Deserialize <T>(text);
                        }
                    }
                }
            }
            catch (Exception e)
            {
                if (e is WebException webException)
                {
                    if (webException.InnerException is System.Net.Http.HttpRequestException httpRequestException)
                    {
                        signalResponse.Status     = httpRequestException.HResult;
                        signalResponse.StatusText = httpRequestException.Message;
                    }
                    else
                    {
                        signalResponse.Status     = (int)webException.Status;
                        signalResponse.StatusText = webException.Message;
                    }
                }
                else
                {
                    signalResponse.StatusText = e.Message;
                    signalResponse.Status     = 0;
                }
            }

            if (signalResponse.Status != 200)
            {
                this.logger.LogWarning($"{method}: {signalResponse.Status} - {signalResponse.StatusText} - {stopwatch.ElapsedMilliseconds} ms");
            }
            else
            {
                this.logger.LogInformation($"{method}: {signalResponse.Status} - {signalResponse.StatusText} - {stopwatch.ElapsedMilliseconds} ms");
            }

            return(signalResponse);
        }