Skip to content
This repository has been archived by the owner on May 23, 2021. It is now read-only.

Add ForkWatchJob #4

Open
wants to merge 9 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 3 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -277,4 +277,6 @@ __pycache__/
errorlogs.txt
version.txt
*launchSettings.json
AuditZips/
AuditZips/

.vscode
21 changes: 21 additions & 0 deletions CheckerApi/Jobs/ForkWatchJob.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
using CheckerApi.Services.Interfaces;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Quartz;
using System;

namespace CheckerApi.Jobs
{
[DisallowConcurrentExecution]
public class ForkWatchJob : Job
{
public override void Execute(JobDataMap data, IServiceProvider serviceProvider)
{
var config = serviceProvider.GetService<IConfiguration>();
var watchService = serviceProvider.GetService<IForkWatchService>();

var rpcConfig = this.GetNodeRpcConfig(config);
watchService.Execute(rpcConfig);
}
}
}
17 changes: 17 additions & 0 deletions CheckerApi/Jobs/Job.cs
Original file line number Diff line number Diff line change
@@ -1,7 +1,10 @@
using System;
using System.Diagnostics;
using System.Net;
using System.Threading.Tasks;
using CheckerApi.Models.Config;
using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging;
using Quartz;
Expand Down Expand Up @@ -40,5 +43,19 @@ public Task Execute(IJobExecutionContext context)
}
});
}

public RpcConfig GetNodeRpcConfig(IConfiguration config)
{
return new RpcConfig()
{
Url = config.GetValue<string>("Node:Url"),
Port = config.GetValue<int>("Node:RpcPort"),
Credentials = new NetworkCredential()
{
UserName = config.GetValue<string>("Node:RpcUser"),
Password = config.GetValue<string>("Node:RpcPass")
}
};
}
}
}
11 changes: 1 addition & 10 deletions CheckerApi/Jobs/NodeJob.cs
Original file line number Diff line number Diff line change
Expand Up @@ -28,16 +28,7 @@ public override void Execute(JobDataMap data, IServiceProvider serviceProvider)
var logger = serviceProvider.GetService<ILogger<NodeJob>>();
var mapper = serviceProvider.GetService<IMapper>();

var rpcConfig = new RpcConfig()
{
Url = config.GetValue<string>("Node:Url"),
Port = config.GetValue<int>("Node:RpcPort"),
Credentials = new NetworkCredential()
{
UserName = config.GetValue<string>("Node:RpcUser"),
Password = config.GetValue<string>("Node:RpcPass")
}
};
var rpcConfig = GetNodeRpcConfig(config);

var cache = serviceProvider.GetService<IMemoryCache>();
var difficultyResult = dataExtractor.RpcCall(rpcConfig, "getdifficulty");
Expand Down
8 changes: 8 additions & 0 deletions CheckerApi/Models/DTO/VirtualCheckpointDTO.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
namespace CheckerApi.Models.DTO
{
public class VirtualCheckpointDTO
{
public int Height { get; set; }
public string Hash { get; set; }
}
}
25 changes: 25 additions & 0 deletions CheckerApi/Models/Rpc/GetChainTipsResult.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
using Newtonsoft.Json;

namespace CheckerApi.Models.Rpc
{
public class GetChainTipsResult
{
[JsonProperty("result")]
public ChainTip[] Result { get; set; }
}

public class ChainTip
{
[JsonProperty("height")]
public int Height { get; set; }

[JsonProperty("hash")]
public string Hash { get; set; }

[JsonProperty("branchlen")]
public int BranchLen { get; set; }

[JsonProperty("status")]
public string Status { get; set; }
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

namespace CheckerApi.Models.Rpc
{
public class RpcBlockInfo
public class RpcBlockInfoBase
{
[JsonProperty("hash")]
public string Hash { get; set; }
Expand All @@ -15,6 +15,24 @@ public class RpcBlockInfo

[JsonProperty("previousblockhash")]
public string PreviousBlockHash { get; set; }

[JsonProperty("chainwork")]
public string ChainWork { get; set; }

[JsonProperty("confirmations")]
public int Confirmations { get; set; }
}

public class RpcBlockInfo : RpcBlockInfoBase
{
[JsonProperty("tx")]
public string[] Tx { get; set; }
}

public class RpcBlockInfoVerbose : RpcBlockInfoBase
{
[JsonProperty("tx")]
public Transaction[] Tx { get; set; }
}

public class RpcBlockResult
Expand Down
10 changes: 10 additions & 0 deletions CheckerApi/Models/Rpc/Transaction.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
using Newtonsoft.Json;

namespace CheckerApi.Models.Rpc
{
public class Transaction
{
[JsonProperty("txid")]
public string TxId { get; set; }
}
}
13 changes: 13 additions & 0 deletions CheckerApi/Program.cs
Original file line number Diff line number Diff line change
Expand Up @@ -106,6 +106,19 @@ public static void Main(string[] args)
startAt: DateTimeOffset.UtcNow.AddSeconds(2)
);
}

var forkWatchEnabled = config.GetValue<bool>("ForkWatch:Enable");
if (forkWatchEnabled)
{
scheduler.AddJob<ForkWatchJob>(
host,
tb => tb.WithSimpleSchedule(x => x
.WithIntervalInSeconds(10)
.RepeatForever()
),
startAt: DateTimeOffset.UtcNow.AddSeconds(3)
);
}
}
})
.Run();
Expand Down
34 changes: 30 additions & 4 deletions CheckerApi/Services/DataExtractorService.cs
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
using CheckerApi.Models.Rpc;
using CheckerApi.Services.Interfaces;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using RestSharp;
using System;
using System.Collections.Generic;
Expand Down Expand Up @@ -41,7 +42,7 @@ public Result<IEnumerable<string>> GetData(string url, string req, string patter
return Result<IEnumerable<string>>.Ok(match.Groups.Select(g => g.Value));
}

public Result<string> RpcCall(RpcConfig config, string method, params string[] parameters)
public Result<string> RpcCall(RpcConfig config, string method, params object[] parameters)
{
var result = this.RpcCall<RpcResult>(config, method, parameters);
if (result.IsSuccess())
Expand All @@ -52,16 +53,16 @@ public Result<string> RpcCall(RpcConfig config, string method, params string[] p
return Result<string>.Fail(result.Messages.ToArray());
}

public Result<T> RpcCall<T>(RpcConfig config, string method, params string[] parameters) where T : class
public Result<T> RpcCall<T>(RpcConfig config, string method, params object[] parameters) where T : class
{
var client = new RestClient($"{config.Url}:{config.Port}");
var request = new RestRequest(string.Empty, Method.POST)
{
Credentials = config.Credentials
};

var pars = string.Join(",", parameters.Select(p => $"\"{p}\""));
request.AddParameter("text/xml", $"{{\"jsonrpc\":\"1.0\",\"id\":\"alert-bot\",\"method\":\"{method}\",\"params\":[{pars}]}}", ParameterType.RequestBody);
var pars = ObjectToJArray(parameters).ToString();
request.AddParameter("text/xml", $"{{\"jsonrpc\":\"1.0\",\"id\":\"alert-bot\",\"method\":\"{method}\",\"params\":{pars}}}", ParameterType.RequestBody);
var response = client.Execute(request);

if (response.StatusCode != HttpStatusCode.OK)
Expand All @@ -79,5 +80,30 @@ public Result<T> RpcCall<T>(RpcConfig config, string method, params string[] par
return Result<T>.Fail($"RPC serialization fail '{method}' at '{config.Url}/{config.Port}'", $"object type: '{nameof(T)}'", $"ex: '{ex}'");
}
}

private JArray ObjectToJArray(object[] objs)
{
var a = new JArray();
foreach (var o in objs)
{
JValue val;
if (o is int)
{
val = new JValue((int)o);
}
else if (o is string)
{
val = new JValue((string)o);
}
else
{
val = new JValue(o.ToString());
}

a.Add(val);
}

return a;
}
}
}
Loading