Beispiel #1
0
        public async Task <BlockTemplate> GetBlockTemplate()
        {
            var httpClient = _httpClientFactory.BuildClient();
            var jObj       = new JObject();

            jObj.Add("id", Guid.NewGuid().ToString());
            jObj.Add("method", Constants.RpcOperations.Getblocktemplate);
            var content = new StringContent(jObj.ToString(), System.Text.Encoding.UTF8, ContentType);
            var request = new HttpRequestMessage
            {
                Method     = HttpMethod.Post,
                Content    = content,
                RequestUri = GetUri()
            };

            var response = await httpClient.SendAsync(request).ConfigureAwait(false);

            var json = await response.Content.ReadAsStringAsync().ConfigureAwait(false);

            string errorCode = null;
            var    jsonObj   = JObject.Parse(json);

            if (TryGetError(jsonObj, out errorCode))
            {
                throw new RpcException(errorCode);
            }

            var resultObj = jsonObj.GetValue("result") as JObject;

            if (resultObj == null)
            {
                return(null);
            }

            return(BlockTemplate.Deserialize(resultObj));
        }
        public static BlockTemplate Deserialize(JObject jObj)
        {
            if (jObj == null)
            {
                throw new ArgumentNullException(nameof(jObj));
            }

            var result      = new BlockTemplate();
            var coinBaseTxn = jObj.SelectToken("coinbasetxn");

            if (coinBaseTxn != null)
            {
                var coinBaseTxnDataObj = coinBaseTxn as JObject;
                if (coinBaseTxnDataObj != null)
                {
                    JToken coinBaseTxnDataToken = null;
                    if (coinBaseTxnDataObj.TryGetValue("data", out coinBaseTxnDataToken))
                    {
                        var data = coinBaseTxnDataToken.ToString().FromHexString();
                        result.CoinBaseTx = BaseTransaction.Deserialize(data).Key as BcBaseTransaction;
                    }
                }
            }

            JToken previousBlockHashToken = null;

            if (jObj.TryGetValue("previousblockhash", out previousBlockHashToken))
            {
                result.PreviousBlockHash = previousBlockHashToken.ToString().FromHexString();
            }

            JToken transactionsToken = null;

            if (jObj.TryGetValue("transactions", out transactionsToken))
            {
                var transactionsArr = transactionsToken as JArray;
                if (transactionsArr != null)
                {
                    var transactions = new List <BaseTransaction>();
                    foreach (var transactionObj in transactionsArr)
                    {
                        transactions.Add(BaseTransaction.Deserialize(transactionObj.ToString().FromHexString()).Key);
                    }

                    result.Transactions = transactions;
                }
            }

            JToken heightToken = null;

            if (jObj.TryGetValue("height", out heightToken))
            {
                result.Height = int.Parse(heightToken.ToString());
            }

            JToken versionToken = null;

            if (jObj.TryGetValue("version", out versionToken))
            {
                result.Version = int.Parse(versionToken.ToString());
            }

            JToken curTimeToken = null;

            if (jObj.TryGetValue("curtime", out curTimeToken))
            {
                result.CurrentTime = uint.Parse(curTimeToken.ToString());
            }

            JToken bitsToken = null;

            if (jObj.TryGetValue("bits", out bitsToken))
            {
                result.Bits = uint.Parse(bitsToken.ToString());
            }

            JToken targetToken = null;

            if (jObj.TryGetValue("target", out targetToken))
            {
                result.Target = targetToken.ToString().FromHexString().ToArray();
            }

            JToken expiresToken = null;

            if (jObj.TryGetValue("expires", out expiresToken))
            {
                result.Expires = double.Parse(expiresToken.ToString());
            }

            return(result);
        }