From f301c61d95c0e09d7ac987af484f877a6a2319c9 Mon Sep 17 00:00:00 2001 From: minershaven <57435138+minershaven@users.noreply.github.com> Date: Tue, 27 Sep 2022 11:36:37 -0500 Subject: [PATCH 01/54] Update BitcoinJob.cs Signed-off-by: minershaven <57435138+minershaven@users.noreply.github.com> --- src/Miningcore/Blockchain/Bitcoin/BitcoinJob.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Miningcore/Blockchain/Bitcoin/BitcoinJob.cs b/src/Miningcore/Blockchain/Bitcoin/BitcoinJob.cs index b86506094..e825b116b 100644 --- a/src/Miningcore/Blockchain/Bitcoin/BitcoinJob.cs +++ b/src/Miningcore/Blockchain/Bitcoin/BitcoinJob.cs @@ -569,7 +569,7 @@ public void Init(BlockTemplate blockTemplate, string jobId, { masterNodeParameters = BlockTemplate.Extra.SafeExtensionDataAs(); - if(coin.Symbol == "RTM") + if((coin.Symbol == "RTM") || (coin.Symbol == "THOON") || (coin.Symbol == "YERB") || (coin.Symbol == "BTRM")) { if(masterNodeParameters.Extra?.ContainsKey("smartnode") == true) { From 30c252dcf846d54c5b5ba26c7b5b1952080a01e3 Mon Sep 17 00:00:00 2001 From: minershaven <57435138+minershaven@users.noreply.github.com> Date: Tue, 27 Sep 2022 12:02:31 -0500 Subject: [PATCH 02/54] Update coins.json Signed-off-by: minershaven <57435138+minershaven@users.noreply.github.com> --- src/Miningcore/coins.json | 42 ++++++++++++++++++++++++++++++++++++++- 1 file changed, 41 insertions(+), 1 deletion(-) diff --git a/src/Miningcore/coins.json b/src/Miningcore/coins.json index 62a704da4..734f21cd9 100644 --- a/src/Miningcore/coins.json +++ b/src/Miningcore/coins.json @@ -2142,12 +2142,46 @@ }, "hasFounderFee": true, "hasMasterNodes": true, + "foundersRewardAddress": [ + "RTtyQU6DoSuNWetT4WUem5qXP5jNYGpwat" + ], "shareMultiplier": 65536, "explorerBlockLink": "https://explorer.raptoreum.com/block-height/$height$", "explorerTxLink": "https://explorer.raptoreum.com/tx/{0}", "explorerAccountLink": "https://explorer.raptoreum.com/address/{0}" }, - + + "bitoreum": { + "name": "Bitoreum", + "canonicalName": "Bitoreum", + "symbol": "BTRM", + "family": "bitcoin", + "website": "https://bitoreum.org/", + "market": "https://www.coingecko.com/en/coins/bitoreum", + "twitter": "https://twitter.com/bitoreum", + "discord": "https://discord.gg/E3E9Ef3kZT", + "coinbaseHasher": { + "hash": "sha256d" + }, + "headerHasher": { + "hash": "ghostrider" + }, + "blockHasher": { + "hash": "reverse", + "args": [ { "hash": "sha256d" } ] + }, + "hasFounderFee": true, + "hasMasterNodes": true, + "foundersRewardAddress": [ + "BanxgMPcMpXnuWQ2ogfQqEkwwVtjhAhXBR" + ], + "shareMultiplier": 65536, + "explorerBlockLink": "https://explorer.bitoreum.org/block/$hash$", + "explorerTxLink": "https://explorer.bitoreum.org/tx/{0}", + "explorerAccountLink": "https://explorer.bitoreum.org/address/{0}" + + }, + "reacoin": { "name": "Reacoin", "canonicalName": "Reacoin", @@ -2639,6 +2673,9 @@ }, "hasFounderFee": true, "hasMasterNodes": true, + "foundersRewardAddress": [ + "TQ2diZWpPpnGytLVBZARsPKqYmFjBt76nb" + ], "shareMultiplier": 65536, "explorerBlockLink": "http://rtm.timyg.org:6950/block/$height$", "explorerTxLink": "http://rtm.timyg.org:6950/tx/{0}", @@ -3223,6 +3260,9 @@ }, "hasFounderFee": true, "hasMasterNodes": true, + "foundersRewardAddress": [ + "yaDfcdCupB1T5YoVRjYr8fXCvB8U5AuNX8" + ], "shareMultiplier": 65536, "explorerBlockLink": "https://explorer.yerbas.org/block/$height$", "explorerTxLink": "https://explorer.yerbas.org/tx/{0}", From d7ca2dcf3f3714f15c81c2f71e6644d45a051bc1 Mon Sep 17 00:00:00 2001 From: jon4hz Date: Wed, 5 Oct 2022 15:35:50 +0200 Subject: [PATCH 03/54] feat: improve gpdr compliance by censoring IPs in the logs --- .../Stratum/StratumConnectionBenchmarks.cs | 2 +- .../Stratum/StratumConnectionTests.cs | 6 ++-- .../IPAccessWhitelistMiddleware.cs | 9 ++++-- src/Miningcore/Configuration/ClusterConfig.cs | 1 + .../Extensions/IpAddressExtensions.cs | 31 +++++++++++++++++++ src/Miningcore/Program.cs | 2 +- src/Miningcore/Stratum/StratumConnection.cs | 11 ++++--- src/Miningcore/Stratum/StratumServer.cs | 4 +-- 8 files changed, 51 insertions(+), 15 deletions(-) diff --git a/src/Miningcore.Tests/Benchmarks/Stratum/StratumConnectionBenchmarks.cs b/src/Miningcore.Tests/Benchmarks/Stratum/StratumConnectionBenchmarks.cs index 7860c77a2..5c23c4ea3 100644 --- a/src/Miningcore.Tests/Benchmarks/Stratum/StratumConnectionBenchmarks.cs +++ b/src/Miningcore.Tests/Benchmarks/Stratum/StratumConnectionBenchmarks.cs @@ -39,7 +39,7 @@ public void Setup() clock = ModuleInitializer.Container.Resolve(); logger = new NullLogger(LogManager.LogFactory); - connection = new(logger, rmsm, clock, ConnectionId); + connection = new(logger, rmsm, clock, ConnectionId, false); wrapper = new(connection); } diff --git a/src/Miningcore.Tests/Stratum/StratumConnectionTests.cs b/src/Miningcore.Tests/Stratum/StratumConnectionTests.cs index c9e973aa5..26c331424 100644 --- a/src/Miningcore.Tests/Stratum/StratumConnectionTests.cs +++ b/src/Miningcore.Tests/Stratum/StratumConnectionTests.cs @@ -34,7 +34,7 @@ public class StratumConnectionTests : TestBase [Fact] public async Task ProcessRequest_Handle_Valid_Request() { - var connection = new StratumConnection(logger, rmsm, clock, ConnectionId); + var connection = new StratumConnection(logger, rmsm, clock, ConnectionId, false); var wrapper = new PrivateObject(connection); Task handler(StratumConnection con, JsonRpcRequest request, CancellationToken ct) @@ -61,7 +61,7 @@ public async Task ProcessRequest_Throw_On_Unparseable_Request() { const string invalidRequestString = "foo bar\\n"; - var connection = new StratumConnection(logger, rmsm, clock, ConnectionId); + var connection = new StratumConnection(logger, rmsm, clock, ConnectionId, false); var wrapper = new PrivateObject(connection); var callCount = 0; @@ -82,7 +82,7 @@ await Assert.ThrowsAnyAsync(()=> (Task) wrapper.Invoke(ProcessReq [Fact] public async Task ProcessRequest_Honor_CancellationToken() { - var connection = new StratumConnection(logger, rmsm, clock, ConnectionId); + var connection = new StratumConnection(logger, rmsm, clock, ConnectionId, false); var wrapper = new PrivateObject(connection); var callCount = 0; diff --git a/src/Miningcore/Api/Middlewares/IPAccessWhitelistMiddleware.cs b/src/Miningcore/Api/Middlewares/IPAccessWhitelistMiddleware.cs index 45181fa8d..2f4301034 100644 --- a/src/Miningcore/Api/Middlewares/IPAccessWhitelistMiddleware.cs +++ b/src/Miningcore/Api/Middlewares/IPAccessWhitelistMiddleware.cs @@ -1,32 +1,35 @@ using Microsoft.AspNetCore.Http; using NLog; using System.Net; +using Miningcore.Configuration; +using Miningcore.Extensions; namespace Miningcore.Api.Middlewares; public class IPAccessWhitelistMiddleware { - public IPAccessWhitelistMiddleware(RequestDelegate next, string[] locations, IPAddress[] whitelist) + public IPAccessWhitelistMiddleware(RequestDelegate next, string[] locations, IPAddress[] whitelist, bool gpdrCompliantLogging) { this.whitelist = whitelist; this.next = next; this.locations = locations; + this.gpdrCompliantLogging = gpdrCompliantLogging; } private readonly RequestDelegate next; private readonly ILogger logger = LogManager.GetCurrentClassLogger(); private readonly IPAddress[] whitelist; private readonly string[] locations; + private readonly bool gpdrCompliantLogging; public async Task Invoke(HttpContext context) { if(locations.Any(x => context.Request.Path.Value.StartsWith(x))) { var remoteAddress = context.Connection.RemoteIpAddress; - if(!whitelist.Any(x => x.Equals(remoteAddress))) { - logger.Info(() => $"Unauthorized request attempt to {context.Request.Path.Value} from {remoteAddress}"); + logger.Info(() => $"Unauthorized request attempt to {context.Request.Path.Value} from {remoteAddress.CensorOrReturn(gpdrCompliantLogging)}"); context.Response.StatusCode = (int) HttpStatusCode.Forbidden; await context.Response.WriteAsync("You are not in my access list. Good Bye.\n"); diff --git a/src/Miningcore/Configuration/ClusterConfig.cs b/src/Miningcore/Configuration/ClusterConfig.cs index 459a06746..d430976d1 100644 --- a/src/Miningcore/Configuration/ClusterConfig.cs +++ b/src/Miningcore/Configuration/ClusterConfig.cs @@ -531,6 +531,7 @@ public partial class ClusterLoggingConfig public string ApiLogFile { get; set; } public bool PerPoolLogFile { get; set; } public string LogBaseDirectory { get; set; } + public bool GPDRCompliant { get; set; } } public partial class NetworkEndpointConfig diff --git a/src/Miningcore/Extensions/IpAddressExtensions.cs b/src/Miningcore/Extensions/IpAddressExtensions.cs index 95f303130..c89e18c33 100644 --- a/src/Miningcore/Extensions/IpAddressExtensions.cs +++ b/src/Miningcore/Extensions/IpAddressExtensions.cs @@ -24,4 +24,35 @@ public static bool IsEqual(this IPAddress address, IPAddress other) return false; } + + public static IPAddress CensorOrReturn(this IPAddress address, bool censor) + { + Contract.RequiresNonNull(address); + + if(!censor) + return address; + + if(address.IsIPv4MappedToIPv6) + address = address.MapToIPv4(); + + var ipBytes = address.GetAddressBytes(); + + if(ipBytes.Length == 4) + { + // IPv4 + // keep the first and last part + ipBytes[2] = 0; + ipBytes[3] = 0; + } + + else if(ipBytes.Length == 16) + { + // IPv6 + // keep the first 2 and last 2 parts + for(var i = 4; i < 12; i++) + ipBytes[i] = 0; + } + + return new IPAddress(ipBytes); + } } diff --git a/src/Miningcore/Program.cs b/src/Miningcore/Program.cs index cb5581159..94f3feff0 100644 --- a/src/Miningcore/Program.cs +++ b/src/Miningcore/Program.cs @@ -945,7 +945,7 @@ private static void UseIpWhiteList(IApplicationBuilder app, bool defaultToLoopba logger.Info(() => $"API Access to {string.Join(",", locations)} restricted to {string.Join(",", ipList.Select(x => x.ToString()))}"); - app.UseMiddleware(locations, ipList.ToArray()); + app.UseMiddleware(locations, ipList.ToArray(), clusterConfig.Logging.GPDRCompliant); } } diff --git a/src/Miningcore/Stratum/StratumConnection.cs b/src/Miningcore/Stratum/StratumConnection.cs index 368ac81d4..85260bfb3 100644 --- a/src/Miningcore/Stratum/StratumConnection.cs +++ b/src/Miningcore/Stratum/StratumConnection.cs @@ -27,7 +27,7 @@ namespace Miningcore.Stratum; public class StratumConnection { - public StratumConnection(ILogger logger, RecyclableMemoryStreamManager rmsm, IMasterClock clock, string connectionId) + public StratumConnection(ILogger logger, RecyclableMemoryStreamManager rmsm, IMasterClock clock, string connectionId, bool gpdrCompliantLogging) { this.logger = logger; this.rmsm = rmsm; @@ -42,6 +42,7 @@ public StratumConnection(ILogger logger, RecyclableMemoryStreamManager rmsm, IMa this.clock = clock; ConnectionId = connectionId; IsAlive = true; + this.gpdrCompliantLogging = gpdrCompliantLogging; } private readonly ILogger logger; @@ -56,6 +57,7 @@ public StratumConnection(ILogger logger, RecyclableMemoryStreamManager rmsm, IMa private WorkerContextBase context; private readonly Subject terminated = new(); private bool expectingProxyHeader; + private bool gpdrCompliantLogging; private static readonly JsonSerializer serializer = new() { @@ -113,11 +115,10 @@ await sslStream.AuthenticateAsServerAsync(new SslServerAuthenticationOptions networkStream = sslStream; - logger.Info(() => $"[{ConnectionId}] {sslStream.SslProtocol.ToString().ToUpper()}-{sslStream.CipherAlgorithm.ToString().ToUpper()} Connection from {RemoteEndpoint.Address}:{RemoteEndpoint.Port} accepted on port {endpoint.IPEndPoint.Port}"); + logger.Info(() => $"[{ConnectionId}] {sslStream.SslProtocol.ToString().ToUpper()}-{sslStream.CipherAlgorithm.ToString().ToUpper()} Connection from {RemoteEndpoint.Address.CensorOrReturn(gpdrCompliantLogging)}:{RemoteEndpoint.Port} accepted on port {endpoint.IPEndPoint.Port}"); } - else - logger.Info(() => $"[{ConnectionId}] Connection from {RemoteEndpoint.Address}:{RemoteEndpoint.Port} accepted on port {endpoint.IPEndPoint.Port}"); + logger.Info(() => $"[{ConnectionId}] Connection from {RemoteEndpoint.Address.CensorOrReturn(gpdrCompliantLogging)}:{RemoteEndpoint.Port} accepted on port {endpoint.IPEndPoint.Port}"); // Async I/O loop(s) var tasks = new[] @@ -403,7 +404,7 @@ private bool ProcessProxyHeader(ReadOnlySequence seq, TcpProxyProtocolConf // Update client RemoteEndpoint = new IPEndPoint(IPAddress.Parse(remoteAddress), int.Parse(remotePort)); - logger.Info(() => $"Real-IP via Proxy-Protocol: {RemoteEndpoint.Address}"); + logger.Info(() => $"Real-IP via Proxy-Protocol: {RemoteEndpoint.Address.CensorOrReturn(gpdrCompliantLogging)}"); } else diff --git a/src/Miningcore/Stratum/StratumServer.cs b/src/Miningcore/Stratum/StratumServer.cs index 7d35a6439..14b690957 100644 --- a/src/Miningcore/Stratum/StratumServer.cs +++ b/src/Miningcore/Stratum/StratumServer.cs @@ -154,9 +154,9 @@ private void AcceptConnection(Socket socket, StratumEndpoint port, X509Certifica return; // init connection - var connection = new StratumConnection(logger, rmsm, clock, CorrelationIdGenerator.GetNextId()); + var connection = new StratumConnection(logger, rmsm, clock, CorrelationIdGenerator.GetNextId(), clusterConfig.Logging.GPDRCompliant); - logger.Info(() => $"[{connection.ConnectionId}] Accepting connection from {remoteEndpoint.Address}:{remoteEndpoint.Port} ..."); + logger.Info(() => $"[{connection.ConnectionId}] Accepting connection from {remoteEndpoint.Address.CensorOrReturn(clusterConfig.Logging.GPDRCompliant)}:{remoteEndpoint.Port} ..."); RegisterConnection(connection); OnConnect(connection, port.IPEndPoint); From 6aeed11a8850c98fd1b500e88d8ebea5f6635d3e Mon Sep 17 00:00:00 2001 From: jon4hz Date: Thu, 6 Oct 2022 23:50:55 +0200 Subject: [PATCH 04/54] feat: get current effort from pool --- .../Api/Controllers/PoolApiController.cs | 20 +++++++++++++++++-- .../Api/Responses/GetPoolsResponse.cs | 1 + .../Postgres/Repositories/ShareRepository.cs | 8 ++++++++ .../Repositories/IShareRepository.cs | 1 + 4 files changed, 28 insertions(+), 2 deletions(-) diff --git a/src/Miningcore/Api/Controllers/PoolApiController.cs b/src/Miningcore/Api/Controllers/PoolApiController.cs index 410213410..2649a6c94 100644 --- a/src/Miningcore/Api/Controllers/PoolApiController.cs +++ b/src/Miningcore/Api/Controllers/PoolApiController.cs @@ -68,7 +68,15 @@ public async Task Get(CancellationToken ct, [FromQuery] uint t // enrich result.TotalPaid = await cf.Run(con => statsRepo.GetTotalPoolPaymentsAsync(con, config.Id, ct)); result.TotalBlocks = await cf.Run(con => blocksRepo.GetPoolBlockCountAsync(con, config.Id, ct)); - result.LastPoolBlockTime = await cf.Run(con => blocksRepo.GetLastPoolBlockTimeAsync(con, config.Id)); + var lastBlockTime = await cf.Run(con => blocksRepo.GetLastPoolBlockTimeAsync(con, config.Id)); + result.LastPoolBlockTime = lastBlockTime; + + if(lastBlockTime.HasValue) + { + DateTime startTime = lastBlockTime.Value; + var poolEffort = await cf.Run(con => shareRepo.GetEffortBetweenCreatedAsync(con, config.Id, pool.ShareMultiplier, startTime, clock.Now)); + result.PoolEffort = poolEffort.Value; + } var from = clock.Now.AddHours(-topMinersRange); @@ -128,7 +136,15 @@ public async Task GetPoolInfoAsync(string poolId, CancellationT // enrich response.Pool.TotalPaid = await cf.Run(con => statsRepo.GetTotalPoolPaymentsAsync(con, pool.Id, ct)); response.Pool.TotalBlocks = await cf.Run(con => blocksRepo.GetPoolBlockCountAsync(con, pool.Id, ct)); - response.Pool.LastPoolBlockTime = await cf.Run(con => blocksRepo.GetLastPoolBlockTimeAsync(con, pool.Id)); + var lastBlockTime = await cf.Run(con => blocksRepo.GetLastPoolBlockTimeAsync(con, pool.Id)); + response.Pool.LastPoolBlockTime = lastBlockTime; + + if(lastBlockTime.HasValue) + { + DateTime startTime = lastBlockTime.Value; + var poolEffort = await cf.Run(con => shareRepo.GetEffortBetweenCreatedAsync(con, pool.Id, poolInstance.ShareMultiplier, startTime, clock.Now)); + response.Pool.PoolEffort = poolEffort.Value; + } var from = clock.Now.AddHours(-topMinersRange); diff --git a/src/Miningcore/Api/Responses/GetPoolsResponse.cs b/src/Miningcore/Api/Responses/GetPoolsResponse.cs index b73f53bc0..5d531ef0d 100644 --- a/src/Miningcore/Api/Responses/GetPoolsResponse.cs +++ b/src/Miningcore/Api/Responses/GetPoolsResponse.cs @@ -72,6 +72,7 @@ public partial class PoolInfo public decimal TotalPaid { get; set; } public uint TotalBlocks { get; set; } public DateTime? LastPoolBlockTime { get; set; } + public double PoolEffort { get; set; } } public class GetPoolsResponse diff --git a/src/Miningcore/Persistence/Postgres/Repositories/ShareRepository.cs b/src/Miningcore/Persistence/Postgres/Repositories/ShareRepository.cs index 76556a219..bd278d82b 100644 --- a/src/Miningcore/Persistence/Postgres/Repositories/ShareRepository.cs +++ b/src/Miningcore/Persistence/Postgres/Repositories/ShareRepository.cs @@ -75,6 +75,13 @@ public Task CountSharesByMinerAsync(IDbConnection con, IDbTransaction tx, return con.QuerySingleAsync(new CommandDefinition(query, new { poolId, miner}, tx, cancellationToken: ct)); } + public Task GetEffortBetweenCreatedAsync(IDbConnection con, string poolId, double shareConst, DateTime start, DateTime end) + { + const string query = "SELECT SUM((difficulty*@shareConst)/(networkdifficulty)) FROM shares WHERE poolid = @poolId AND created > @start AND created < @end"; + + return con.QuerySingleAsync(query, new { poolId, shareConst, start, end }); + } + public async Task DeleteSharesByMinerAsync(IDbConnection con, IDbTransaction tx, string poolId, string miner, CancellationToken ct) { const string query = "DELETE FROM shares WHERE poolid = @poolId AND miner = @miner"; @@ -137,3 +144,4 @@ public async Task GetRecentyUsedIpAddressesAsync(IDbConnection con, ID .ToArray(); } } + diff --git a/src/Miningcore/Persistence/Repositories/IShareRepository.cs b/src/Miningcore/Persistence/Repositories/IShareRepository.cs index 4be1fb976..e2357641c 100644 --- a/src/Miningcore/Persistence/Repositories/IShareRepository.cs +++ b/src/Miningcore/Persistence/Repositories/IShareRepository.cs @@ -14,6 +14,7 @@ public interface IShareRepository Task DeleteSharesByMinerAsync(IDbConnection con, IDbTransaction tx, string poolId, string miner, CancellationToken ct); Task GetAccumulatedShareDifficultyBetweenAsync(IDbConnection con, string poolId, DateTime start, DateTime end, CancellationToken ct); Task GetEffectiveAccumulatedShareDifficultyBetweenAsync(IDbConnection con, string poolId, DateTime start, DateTime end, CancellationToken ct); + Task GetEffortBetweenCreatedAsync(IDbConnection con, string poolId, double shareConst, DateTime start, DateTime end); Task GetHashAccumulationBetweenAsync(IDbConnection con, string poolId, DateTime start, DateTime end, CancellationToken ct); Task GetRecentyUsedIpAddressesAsync(IDbConnection con, IDbTransaction tx, string poolId, string miner, CancellationToken ct); From bfcdbc4d2b0c16fd4f9645f94a9ae6a4d7de6f35 Mon Sep 17 00:00:00 2001 From: minershaven <57435138+minershaven@users.noreply.github.com> Date: Thu, 6 Oct 2022 17:35:34 -0500 Subject: [PATCH 05/54] Update coins.json Signed-off-by: minershaven <57435138+minershaven@users.noreply.github.com> --- src/Miningcore/coins.json | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/src/Miningcore/coins.json b/src/Miningcore/coins.json index a0cd487df..6da170c1e 100644 --- a/src/Miningcore/coins.json +++ b/src/Miningcore/coins.json @@ -2673,10 +2673,7 @@ "args": [ { "hash": "sha256d" } ] }, "hasFounderFee": true, - "hasMasterNodes": true, - "foundersRewardAddress": [ - "TQ2diZWpPpnGytLVBZARsPKqYmFjBt76nb" - ], + "hasMasterNodes": true, "shareMultiplier": 65536, "explorerBlockLink": "http://rtm.timyg.org:6950/block/$height$", "explorerTxLink": "http://rtm.timyg.org:6950/tx/{0}", From a7e393bc639c85856ac019819ba8a46c2f5956bf Mon Sep 17 00:00:00 2001 From: minershaven <57435138+minershaven@users.noreply.github.com> Date: Thu, 6 Oct 2022 17:38:44 -0500 Subject: [PATCH 06/54] Update coins.json Signed-off-by: minershaven <57435138+minershaven@users.noreply.github.com> --- src/Miningcore/coins.json | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/src/Miningcore/coins.json b/src/Miningcore/coins.json index 6da170c1e..3a9c416e1 100644 --- a/src/Miningcore/coins.json +++ b/src/Miningcore/coins.json @@ -3257,10 +3257,7 @@ "args": [ { "hash": "sha256d" } ] }, "hasFounderFee": true, - "hasMasterNodes": true, - "foundersRewardAddress": [ - "yaDfcdCupB1T5YoVRjYr8fXCvB8U5AuNX8" - ], + "hasMasterNodes": true, "shareMultiplier": 65536, "explorerBlockLink": "https://explorer.yerbas.org/block/$height$", "explorerTxLink": "https://explorer.yerbas.org/tx/{0}", From 10831a17c2a1d866ba7c6022b8126d9ca2c9b559 Mon Sep 17 00:00:00 2001 From: minershaven <57435138+minershaven@users.noreply.github.com> Date: Fri, 7 Oct 2022 05:40:57 -0500 Subject: [PATCH 07/54] Update coins.json Signed-off-by: minershaven <57435138+minershaven@users.noreply.github.com> --- src/Miningcore/coins.json | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/src/Miningcore/coins.json b/src/Miningcore/coins.json index 3a9c416e1..bb43fc693 100644 --- a/src/Miningcore/coins.json +++ b/src/Miningcore/coins.json @@ -1564,13 +1564,12 @@ "hash": "sha256d" }, "headerHasher": { - "hash": "minotaur" + "hash": "sha256d" }, "blockHasher": { "hash": "reverse", "args": [ { "hash": "sha256d" } ] - }, - "shareMultiplier": 4096, + }, "explorerBlockLink": "https://chainz.cryptoid.info/lcc/block.dws?$height$.htm", "explorerTxLink": "https://chainz.cryptoid.info/lcc/tx.dws?{0}.htm", "explorerAccountLink": "https://chainz.cryptoid.info/lcc/address.dws?{0}.htm" @@ -1679,8 +1678,7 @@ "blockHasher": { "hash": "reverse", "args": [ { "hash": "sha256d" } ] - }, - "blockTemplateRpcExtraParams": [ "sha256d" ], + }, "explorerBlockLink": "https://mazacha.in/block/$hash$", "explorerTxLink": "https://mazacha.in/tx/{0}", "explorerAccountLink": "https://mazacha.in/address/{0}" From 8d406174f99ba750579c65d68482ef4b05f1b207 Mon Sep 17 00:00:00 2001 From: Oliver Weichhold Date: Fri, 7 Oct 2022 15:59:04 +0200 Subject: [PATCH 08/54] - Add coin template validation unit test - Throw out all the crap coins that fails basic validation such as referencing unknown hash algorithms etc. - Fix some coins referencing hash algorithm using ancient identifiers --- .../Coins/CoinTemplateValidationTest.cs | 66 +++++++++++++++++++ 1 file changed, 66 insertions(+) create mode 100644 src/Miningcore.Tests/Coins/CoinTemplateValidationTest.cs diff --git a/src/Miningcore.Tests/Coins/CoinTemplateValidationTest.cs b/src/Miningcore.Tests/Coins/CoinTemplateValidationTest.cs new file mode 100644 index 000000000..c21fcb4d2 --- /dev/null +++ b/src/Miningcore.Tests/Coins/CoinTemplateValidationTest.cs @@ -0,0 +1,66 @@ +using System.Linq; +using System.Reflection; +using System.Runtime.Serialization; +using Miningcore.Configuration; +using Xunit; +using Xunit.Abstractions; +#pragma warning disable 8974 + +namespace Miningcore.Tests.Coins; + +public class CoinTemplateValidationTest : TestBase +{ + private readonly ITestOutputHelper output; + + public CoinTemplateValidationTest(ITestOutputHelper output) + { + this.output = output; + } + + [Fact] + public void Validate_Coin_Templates() + { + var cft = typeof(CoinFamily).GetTypeInfo(); + var cryptonightHashType = typeof(CryptonightHashType).GetTypeInfo(); + + foreach(var template in ModuleInitializer.CoinTemplates) + { + var t = template.Value; + + output.WriteLine($"** Testing coin '{t.Name ?? t.Symbol ?? t.CanonicalName}' **"); + + Assert.NotEmpty(t.Name); + Assert.NotEmpty(t.Symbol); + Assert.True(CoinTemplate.Families.ContainsKey(t.Family)); + Assert.NotNull(cft.DeclaredMembers.SingleOrDefault(x => x.Name == t.Family.ToString())?.GetCustomAttribute(false)); + + switch(t) + { + case BitcoinTemplate bt when t is BitcoinTemplate: + { + if(bt.CoinbaseHasher != null) + Assert.Null(Record.Exception(() => bt.CoinbaseHasherValue)); + + if(bt.HeaderHasher != null) + Assert.Null(Record.Exception(() => bt.HeaderHasherValue)); + + if(bt.BlockHasher != null) + Assert.Null(Record.Exception(() => bt.BlockHasherValue)); + + if(bt.PoSBlockHasher != null) + Assert.Null(Record.Exception(() => bt.PoSBlockHasherValue)); + break; + } + + case CryptonoteCoinTemplate cnt when t is CryptonoteCoinTemplate: + { + Assert.NotNull(cryptonightHashType.DeclaredMembers.SingleOrDefault(x => x.Name == cnt.Hash.ToString())?.GetCustomAttribute(false)); + + break; + } + } + + Assert.NotEmpty(t.GetAlgorithmName()); + } + } +} From 9475a004c37c18026674a2c80adbb553d0475e2b Mon Sep 17 00:00:00 2001 From: Oliver Weichhold Date: Fri, 7 Oct 2022 16:07:14 +0200 Subject: [PATCH 09/54] Good riddance! --- src/Miningcore/coins.json | 1743 ++++++++++++++++++++----------------- 1 file changed, 938 insertions(+), 805 deletions(-) diff --git a/src/Miningcore/coins.json b/src/Miningcore/coins.json index bb43fc693..e631f2f8d 100644 --- a/src/Miningcore/coins.json +++ b/src/Miningcore/coins.json @@ -12,15 +12,23 @@ "hash": "sha256d" }, "headerHasher": { - "hash": "x16rv2" + "hash": "x16r-v2" }, "blockHasher": { "hash": "reverse", - "args": [ { "hash": "x16rv2" } ] + "args": [ + { + "hash": "x16r-v2" + } + ] }, "posBlockHasher": { "hash": "reverse", - "args": [ { "hash": "x16rv2" } ] + "args": [ + { + "hash": "x16r-v2" + } + ] }, "hasMasterNodes": true, "shareMultiplier": 4096, @@ -28,58 +36,6 @@ "explorerTxLink": "https://explorer.fiveg.cash/tx/{0}", "explorerAccountLink": "https://explorer.fiveg.cash/address/{0}" }, - - "actinium": { - "name": "Actinium", - "symbol": "ACM", - "family": "bitcoin", - "website": "https://actinium.org/", - "market": "", - "twitter": "https://twitter.com/ActiniumCrypto", - "telegram": "https://t.me/actiniumcrypto", - "discord": "https://discord.gg/cC5JGSv", - "coinbaseHasher": { - "hash": "sha256d" - }, - "headerHasher": { - "hash": "lyra2z" - }, - "blockHasher": { - "hash": "reverse", - "args": [ { "hash": "lyra2z" } ] - }, - "shareMultiplier": 4096, - "explorerBlockLink": "https://explorer.actinium.org/block/$hash$", - "explorerTxLink": "https://explorer.actinium.org/tx/{0}", - "explorerAccountLink": "https://explorer.actinium.org/address/{0}" - }, - - "alpscoin": { - "name": "Alpenstars", - "symbol": "ALPS", - "family": "bitcoin", - "website": "https://axerunners.com/", - "market": "", - "twitter": "https://twitter.com/search?q=$axe", - "telegram": "https://t.me/axerunners", - "discord": "https://discordapp.com/invite/BqhteaU", - "coinbaseHasher": { - "hash": "sha256d" - }, - "headerHasher": { - "hash": "lyra2z" - }, - "blockHasher": { - "hash": "reverse", - "args": [ { "hash": "lyra2z" } ] - }, - "hasMasterNodes": true, - "shareMultiplier": 4096, - "explorerBlockLink": "http://blockexplorer.alps.network/block/$hash$", - "explorerTxLink": "http://blockexplorer.alps.network/tx/{0}", - "explorerAccountLink": "http://blockexplorer.alps.network/address/{0}" - }, - "auroracoin-sha256": { "name": "Auroracoin Sha256", "canonicalName": "Auroracoin", @@ -98,14 +54,19 @@ }, "blockHasher": { "hash": "reverse", - "args": [ { "hash": "sha256d" } ] + "args": [ + { + "hash": "sha256d" + } + ] }, - "blockTemplateRpcExtraParams": [ "sha256d" ], + "blockTemplateRpcExtraParams": [ + "sha256d" + ], "explorerBlockLink": "https://chainz.cryptoid.info/aur/block.dws?$height$.htm", "explorerTxLink": "https://chainz.cryptoid.info/aur/tx.dws?{0}.htm", "explorerAccountLink": "https://chainz.cryptoid.info/aur/address.dws?{0}.htm" }, - "auroracoin-scrypt": { "name": "Auroracoin Scrypt", "canonicalName": "Auroracoin", @@ -121,19 +82,27 @@ }, "headerHasher": { "hash": "scrypt", - "args": [ 1024, 1 ] + "args": [ + 1024, + 1 + ] }, "blockHasher": { "hash": "reverse", - "args": [ { "hash": "sha256d" } ] + "args": [ + { + "hash": "sha256d" + } + ] }, - "blockTemplateRpcExtraParams": [ "scrypt" ], + "blockTemplateRpcExtraParams": [ + "scrypt" + ], "shareMultiplier": 65536, "explorerBlockLink": "https://chainz.cryptoid.info/aur/block.dws?$height$.htm", "explorerTxLink": "https://chainz.cryptoid.info/aur/tx.dws?{0}.htm", "explorerAccountLink": "https://chainz.cryptoid.info/aur/address.dws?{0}.htm" }, - "auroracoin-skein": { "name": "Auroracoin Skein", "canonicalName": "Auroracoin", @@ -152,14 +121,19 @@ }, "blockHasher": { "hash": "reverse", - "args": [ { "hash": "sha256d" } ] + "args": [ + { + "hash": "sha256d" + } + ] }, - "blockTemplateRpcExtraParams": [ "skein" ], + "blockTemplateRpcExtraParams": [ + "skein" + ], "explorerBlockLink": "https://chainz.cryptoid.info/aur/block.dws?$height$.htm", "explorerTxLink": "https://chainz.cryptoid.info/aur/tx.dws?{0}.htm", "explorerAccountLink": "https://chainz.cryptoid.info/aur/address.dws?{0}.htm" }, - "auroracoin-qubit": { "name": "Auroracoin Qubit", "canonicalName": "Auroracoin", @@ -178,14 +152,19 @@ }, "blockHasher": { "hash": "reverse", - "args": [ { "hash": "sha256d" } ] + "args": [ + { + "hash": "sha256d" + } + ] }, - "blockTemplateRpcExtraParams": [ "qubit" ], + "blockTemplateRpcExtraParams": [ + "qubit" + ], "explorerBlockLink": "https://chainz.cryptoid.info/aur/block.dws?$height$.htm", "explorerTxLink": "https://chainz.cryptoid.info/aur/tx.dws?{0}.htm", "explorerAccountLink": "https://chainz.cryptoid.info/aur/address.dws?{0}.htm" }, - "auroracoin-groestl": { "name": "Auroracoin Groestl", "canonicalName": "Auroracoin", @@ -200,45 +179,24 @@ "hash": "sha256d" }, "headerHasher": { - "hash": "groestlmyriad" + "hash": "groestl-myriad" }, "blockHasher": { "hash": "reverse", - "args": [ { "hash": "sha256d" } ] + "args": [ + { + "hash": "sha256d" + } + ] }, "shareMultiplier": 4096, - "blockTemplateRpcExtraParams": [ "groestl" ], + "blockTemplateRpcExtraParams": [ + "groestl" + ], "explorerBlockLink": "https://chainz.cryptoid.info/aur/block.dws?$height$.htm", "explorerTxLink": "https://chainz.cryptoid.info/aur/tx.dws?{0}.htm", "explorerAccountLink": "https://chainz.cryptoid.info/aur/address.dws?{0}.htm" }, - - "arowanacoin": { - "name": "Arowanacoin", - "canonicalName": "Arowanacoin", - "symbol": "ARWN", - "family": "bitcoin", - "website": "", - "market": "", - "twitter": "", - "telegram": "", - "discord": "", - "coinbaseHasher": { - "hash": "sha256d" - }, - "headerHasher": { - "hash": "yespowerarwn" - }, - "blockHasher": { - "hash": "reverse", - "args": [ { "hash": "sha256d" } ] - }, - "shareMultiplier": 4336808, - "explorerBlockLink": "http://explorer.arowanacoin.org/block/$hash$", - "explorerTxLink": "http://explorer.arowanacoin.org/tx/{0}", - "explorerAccountLink": "http://explorer.arowanacoin.org/address/{0}" - }, - "australia-cash": { "name": "Australia Cash", "canonicalName": "Australia-Cash", @@ -254,18 +212,24 @@ }, "headerHasher": { "hash": "scrypt", - "args": [ 1024, 1 ] + "args": [ + 1024, + 1 + ] }, "blockHasher": { "hash": "reverse", - "args": [ { "hash": "sha256d" } ] + "args": [ + { + "hash": "sha256d" + } + ] }, "shareMultiplier": 65536, "explorerBlockLink": "https://openchains.info/coin/australiacash/block/$height$", "explorerTxLink": "https://openchains.info/coin/australiacash/tx/{0}", "explorerAccountLink": "https://openchains.info/coin/australiacash/address/{0}" }, - "axe": { "name": "Axe", "canonicalName": "Axe", @@ -284,14 +248,17 @@ }, "blockHasher": { "hash": "reverse", - "args": [ { "hash": "x11" } ] + "args": [ + { + "hash": "x11" + } + ] }, "hasMasterNodes": true, "explorerBlockLink": "https://axe-explorer.arcpool.com/block/$hash$", "explorerTxLink": "https://axe-explorer.arcpool.com/tx/{0}", "explorerAccountLink": "https://axe-explorer.arcpool.com/address/{0}" }, - "barrelcrudecoin": { "name": "BarrelCrudeCoin", "canonicalName": "BarrelCrudeCoin", @@ -306,18 +273,24 @@ }, "headerHasher": { "hash": "scrypt", - "args": [ 1024, 1 ] + "args": [ + 1024, + 1 + ] }, "blockHasher": { "hash": "reverse", - "args": [ { "hash": "sha256d" } ] + "args": [ + { + "hash": "sha256d" + } + ] }, "shareMultiplier": 65536, "explorerBlockLink": "http://explorer.kriptokyng.com:3001/block/$height$", "explorerTxLink": "http://explorer.kriptokyng.com:3001/tx/{0}", "explorerAccountLink": "http://explorer.kriptokyng.com:3001/address/{0}" }, - "bitcoin": { "name": "Bitcoin", "canonicalName": "Bitcoin", @@ -336,14 +309,17 @@ }, "blockHasher": { "hash": "reverse", - "args": [ { "hash": "sha256d" } ] + "args": [ + { + "hash": "sha256d" + } + ] }, "coinbaseIgnoreAuxFlags": true, "explorerBlockLink": "https://btc.tokenview.com/block/$height$", "explorerTxLink": "https://btc.tokenview.com/tx/{0}", "explorerAccountLink": "https://btc.tokenview.com/address/{0}" }, - "bitcoin-cash": { "name": "Bitcoin Cash", "canonicalName": "Bitcoin-Cash", @@ -362,13 +338,16 @@ }, "blockHasher": { "hash": "reverse", - "args": [ { "hash": "sha256d" } ] + "args": [ + { + "hash": "sha256d" + } + ] }, "explorerBlockLink": "https://bch.tokenview.com/block/$height$", "explorerTxLink": "https://bch.tokenview.com/tx/{0}", "explorerAccountLink": "https://bch.tokenview.com/address/{0}" }, - "bitcoin-diamond": { "name": "Bitcoin Diamond", "canonicalName": "Bitcoin-Diamond", @@ -387,13 +366,16 @@ }, "blockHasher": { "hash": "reverse", - "args": [ { "hash": "sha256d" } ] + "args": [ + { + "hash": "sha256d" + } + ] }, "explorerBlockLink": "http://explorer.btcd.io/#/blockInfo?hash=$hash$", "explorerTxLink": "http://explorer.btcd.io/#/TX?TX={0}", "explorerAccountLink": "http://explorer.btcd.io/#/address?address={0}" }, - "bitcoin-sv": { "name": "BitcoinSV", "canonicalName": "Bitcoin-SV", @@ -412,13 +394,16 @@ }, "blockHasher": { "hash": "reverse", - "args": [ { "hash": "sha256d" } ] + "args": [ + { + "hash": "sha256d" + } + ] }, "explorerBlockLink": "https://bsv.tokenview.com/block/$height$", "explorerTxLink": "https://bsv.tokenview.com/tx/{0}", "explorerAccountLink": "https://bsv.tokenview.com/address/{0}" }, - "bitcoinnickel": { "name": "Bitcoinnickel", "canonicalName": "Bitcoinnickel", @@ -437,13 +422,16 @@ }, "blockHasher": { "hash": "reverse", - "args": [ { "hash": "sha256d" } ] + "args": [ + { + "hash": "sha256d" + } + ] }, "explorerBlockLink": "https://explorer.btcnickel.com/block/$hash$", "explorerTxLink": "https://explorer.btcnickel.com/tx/{0}", "explorerAccountLink": "https://explorer.btcnickel.com/address/{0}" }, - "bitflate": { "name": "Bitflate", "canonicalName": "Bitflate", @@ -462,13 +450,16 @@ }, "blockHasher": { "hash": "reverse", - "args": [ { "hash": "sha256d" } ] + "args": [ + { + "hash": "sha256d" + } + ] }, "explorerBlockLink": "https://explorer.bitflate.org/block/$hash$", "explorerTxLink": "https://explorer.bitflate.org/tx/{0}", "explorerAccountLink": "https://explorer.bitflate.org/address/{0}" }, - "bolivarcoin": { "name": "Bolivarcoin", "canonicalName": "Bolivarcoin", @@ -487,14 +478,17 @@ }, "blockHasher": { "hash": "reverse", - "args": [ { "hash": "x11" } ] + "args": [ + { + "hash": "x11" + } + ] }, "hasMasterNodes": true, "explorerBlockLink": "https://chainz.cryptoid.info/boli/block.dws?$height$.htm", "explorerTxLink": "https://chainz.cryptoid.info/boli/tx.dws?{0}.htm", "explorerAccountLink": "https://chainz.cryptoid.info/boli/address.dws?{0}.htm" }, - "browncoin": { "name": "Browncoin", "symbol": "BRWN", @@ -512,7 +506,11 @@ }, "blockHasher": { "hash": "reverse", - "args": [ { "hash": "sha256d" } ] + "args": [ + { + "hash": "sha256d" + } + ] }, "shareMultiplier": 256, "coinbaseMinConfimations": 1001, @@ -520,7 +518,6 @@ "explorerTxLink": "https://openchains.info/coin/browncoin/tx/{0}", "explorerAccountLink": "https://openchains.info/coin/browncoin/address/{0}" }, - "butkoin-sha256": { "name": "ButKoin Sha256", "canonicalName": "ButKoin", @@ -539,16 +536,21 @@ }, "blockHasher": { "hash": "reverse", - "args": [ { "hash": "sha256d" } ] + "args": [ + { + "hash": "sha256d" + } + ] }, - "blockTemplateRpcExtraParams": [ "sha256d" ], + "blockTemplateRpcExtraParams": [ + "sha256d" + ], "hasFounderFee": true, "hasMasterNodes": true, "explorerBlockLink": "https://blocks.butcoin.tech/block/$hash$", "explorerTxLink": "https://blocks.butcoin.tech/tx/{0}", "explorerAccountLink": "https://blocks.butcoin.tech/address/{0}" }, - "butkoin-scrypt": { "name": "ButKoin Scrypt", "canonicalName": "ButKoin", @@ -564,18 +566,28 @@ }, "headerHasher": { "hash": "scrypt", - "args": [ 1024, 1 ] + "args": [ + 1024, + 1 + ] }, "blockHasher": { "hash": "reverse", - "args": [ { "hash": "sha256d" } ] + "args": [ + { + "hash": "sha256d" + } + ] }, "posBlockHasher": { "hash": "reverse", "args": [ { "hash": "scrypt", - "args": [ 1024, 1 ] + "args": [ + 1024, + 1 + ] } ] }, @@ -586,35 +598,6 @@ "explorerTxLink": "https://blocks.butcoin.tech/tx/{0}", "explorerAccountLink": "https://blocks.butcoin.tech/address/{0}" }, - - "butkoin-yespower": { - "name": "ButKoin YesPower", - "canonicalName": "ButKoin", - "symbol": "BUTK", - "family": "bitcoin", - "website": "https://butcoin.tech/", - "market": "", - "twitter": "https://twitter.com/ButKoin", - "telegram": "", - "discord": "https://discord.com/invite/j7T82mKkrw", - "coinbaseHasher": { - "hash": "sha256d" - }, - "headerHasher": { - "hash": "yespowersugar" - }, - "blockHasher": { - "hash": "reverse", - "args": [ { "hash": "sha256d" } ] - }, - "shareMultiplier": 4194304, - "hasFounderFee": true, - "hasMasterNodes": true, - "explorerBlockLink": "https://blocks.butcoin.tech/block/$hash$", - "explorerTxLink": "https://blocks.butcoin.tech/tx/{0}", - "explorerAccountLink": "https://blocks.butcoin.tech/address/{0}" - }, - "cannabiscoin": { "name": "Cannabiscoin", "canonicalName": "Cannabiscoin", @@ -633,64 +616,16 @@ }, "blockHasher": { "hash": "reverse", - "args": [ { "hash": "x11" } ] + "args": [ + { + "hash": "x11" + } + ] }, "explorerBlockLink": "https://cann.tokenview.com/en/block/$height$", "explorerTxLink": "https://cann.tokenview.com/en/tx/{0}", "explorerAccountLink": "https://cann.tokenview.com/en/address/{0}" }, - - "combode": { - "name": "Combode", - "symbol": "CBE", - "family": "bitcoin", - "website": "", - "market": "", - "twitter": "", - "telegram": "", - "discord": "", - "coinbaseHasher": { - "hash": "sha256d" - }, - "headerHasher": { - "hash": "phi5" - }, - "blockHasher": { - "hash": "reverse", - "args": [ { "hash": "phi5" } ] - }, - "hasMasterNodes": true, - "explorerBlockLink": "https://cbe.explorer.alphax.pro/block/$hash$", - "explorerTxLink": "https://cbe.explorer.alphax.pro/tx/{0}", - "explorerAccountLink": "https://cbe.explorer.alphax.pro/address/{0}" - }, - - "cpuchain": { - "name": "CPUchain", - "canonicalName": "CPUchain", - "symbol": "CPU", - "family": "bitcoin", - "website": "", - "market": "", - "twitter": "", - "telegram": "", - "discord": "", - "coinbaseHasher": { - "hash": "sha256d" - }, - "headerHasher": { - "hash": "cpupower" - }, - "blockHasher": { - "hash": "reverse", - "args": [ { "hash": "cpupower" } ] - }, - "shareMultiplier": 65536, - "explorerBlockLink": "https://explorer.cpuchain.org/block/$height$", - "explorerTxLink": "https://explorer.cpuchain.org/{0}", - "explorerAccountLink": "https://explorer.cpuchain.org/{0}" - }, - "danecoin": { "name": "Danecoin", "canonicalName": "Danecoin", @@ -709,13 +644,16 @@ }, "blockHasher": { "hash": "reverse", - "args": [ { "hash": "sha256d" } ] + "args": [ + { + "hash": "sha256d" + } + ] }, "explorerBlockLink": "https://explorer.danecoin.org/block/$hash$", "explorerTxLink": "https://explorer.danecoin.org/tx/{0}", "explorerAccountLink": "https://explorer.danecoin.org/address/{0}" }, - "dash": { "name": "Dash", "canonicalName": "Dash", @@ -734,14 +672,17 @@ }, "blockHasher": { "hash": "reverse", - "args": [ { "hash": "x11" } ] + "args": [ + { + "hash": "x11" + } + ] }, "hasMasterNodes": true, "explorerBlockLink": "https://chainz.cryptoid.info/dash/block.dws?$height$.htm", "explorerTxLink": "https://chainz.cryptoid.info/dash/tx.dws?{0}.htm", "explorerAccountLink": "https://chainz.cryptoid.info/dash/address.dws?{0}.htm" }, - "digibyte-sha256": { "name": "Digibyte Sha256", "canonicalName": "Digibyte", @@ -760,14 +701,19 @@ }, "blockHasher": { "hash": "reverse", - "args": [ { "hash": "sha256d" } ] + "args": [ + { + "hash": "sha256d" + } + ] }, - "blockTemplateRpcExtraParams": [ "sha256d" ], + "blockTemplateRpcExtraParams": [ + "sha256d" + ], "explorerBlockLink": "https://chainz.cryptoid.info/dgb/block.dws?$height$.htm", "explorerTxLink": "https://chainz.cryptoid.info/dgb/tx.dws?{0}.htm", "explorerAccountLink": "https://chainz.cryptoid.info/dgb/address.dws?{0}.htm" }, - "digibyte-scrypt": { "name": "Digibyte Scrypt", "canonicalName": "Digibyte", @@ -783,19 +729,27 @@ }, "headerHasher": { "hash": "scrypt", - "args": [ 1024, 1 ] + "args": [ + 1024, + 1 + ] }, "blockHasher": { "hash": "reverse", - "args": [ { "hash": "sha256d" } ] + "args": [ + { + "hash": "sha256d" + } + ] }, "shareMultiplier": 65536, - "blockTemplateRpcExtraParams": [ "scrypt" ], + "blockTemplateRpcExtraParams": [ + "scrypt" + ], "explorerBlockLink": "https://chainz.cryptoid.info/dgb/block.dws?$height$.htm", "explorerTxLink": "https://chainz.cryptoid.info/dgb/tx.dws?{0}.htm", "explorerAccountLink": "https://chainz.cryptoid.info/dgb/address.dws?{0}.htm" }, - "digibyte-skein": { "name": "Digibyte Skein", "canonicalName": "Digibyte", @@ -814,14 +768,19 @@ }, "blockHasher": { "hash": "reverse", - "args": [ { "hash": "sha256d" } ] + "args": [ + { + "hash": "sha256d" + } + ] }, - "blockTemplateRpcExtraParams": [ "skein" ], + "blockTemplateRpcExtraParams": [ + "skein" + ], "explorerBlockLink": "https://chainz.cryptoid.info/dgb/block.dws?$height$.htm", "explorerTxLink": "https://chainz.cryptoid.info/dgb/tx.dws?{0}.htm", "explorerAccountLink": "https://chainz.cryptoid.info/dgb/address.dws?{0}.htm" }, - "digibyte-qubit": { "name": "Digibyte Qubit", "canonicalName": "Digibyte", @@ -840,14 +799,19 @@ }, "blockHasher": { "hash": "reverse", - "args": [ { "hash": "sha256d" } ] + "args": [ + { + "hash": "sha256d" + } + ] }, - "blockTemplateRpcExtraParams": [ "qubit" ], + "blockTemplateRpcExtraParams": [ + "qubit" + ], "explorerBlockLink": "https://chainz.cryptoid.info/dgb/block.dws?$height$.htm", "explorerTxLink": "https://chainz.cryptoid.info/dgb/tx.dws?{0}.htm", "explorerAccountLink": "https://chainz.cryptoid.info/dgb/address.dws?{0}.htm" }, - "digibyte-groestl": { "name": "Digibyte Groestl", "canonicalName": "Digibyte", @@ -862,19 +826,24 @@ "hash": "sha256s" }, "headerHasher": { - "hash": "groestlmyriad" + "hash": "groestl-myriad" }, "blockHasher": { "hash": "reverse", - "args": [ { "hash": "sha256d" } ] + "args": [ + { + "hash": "sha256d" + } + ] }, "shareMultiplier": 256, - "blockTemplateRpcExtraParams": [ "groestl" ], + "blockTemplateRpcExtraParams": [ + "groestl" + ], "explorerBlockLink": "https://chainz.cryptoid.info/dgb/block.dws?$height$.htm", "explorerTxLink": "https://chainz.cryptoid.info/dgb/tx.dws?{0}.htm", "explorerAccountLink": "https://chainz.cryptoid.info/dgb/address.dws?{0}.htm" }, - "dogecoin": { "name": "Dogecoin", "canonicalName": "Dogecoin", @@ -890,11 +859,18 @@ }, "headerHasher": { "hash": "scrypt", - "args": [ 1024, 1 ] + "args": [ + 1024, + 1 + ] }, "blockHasher": { "hash": "reverse", - "args": [ { "hash": "sha256d" } ] + "args": [ + { + "hash": "sha256d" + } + ] }, "shareMultiplier": 65536, "coinbaseMinConfimations": 251, @@ -902,7 +878,6 @@ "explorerTxLink": "https://dogechain.info/tx/{0}", "explorerAccountLink": "https://dogechain.info/address/{0}" }, - "ecash": { "name": "eCash", "canonicalName": "eCash", @@ -921,39 +896,17 @@ }, "blockHasher": { "hash": "reverse", - "args": [ { "hash": "sha256d" } ] + "args": [ + { + "hash": "sha256d" + } + ] }, "explorerBlockLink": "https://blockchair.com/ecash/block/$height$", "explorerTxLink": "https://blockchair.com/ecash/transaction/{0}", "explorerAccountLink": "https://blockchair.com/ecash/address/{0}", "hasMinerFund": true }, - - "elicoin": { - "name": "Elicoin", - "symbol": "ELI", - "family": "bitcoin", - "website": "", - "market": "", - "twitter": "", - "telegram": "", - "discord": "", - "coinbaseHasher": { - "hash": "sha256d" - }, - "headerHasher": { - "hash": "yescryptR16" - }, - "blockHasher": { - "hash": "reverse", - "args": [ { "hash": "sha256d" } ] - }, - "shareMultiplier": 1048576, - "explorerBlockLink": "http://block.elicoin.net/?page=block&hash=$hash$", - "explorerTxLink": "http://block.elicoin.net/?page=tx&id={0}", - "explorerAccountLink": "http://block.elicoin.net/?page=search&id={0}" - }, - "emark": { "name": "Deutsche eMark", "canonicalName": "Deutsche-eMark", @@ -972,7 +925,11 @@ }, "blockHasher": { "hash": "reverse", - "args": [ { "hash": "sha256d" } ] + "args": [ + { + "hash": "sha256d" + } + ] }, "coinbaseTxVersion": 2, "coinbaseTxComment": "DEM KriptoKyng", @@ -980,7 +937,6 @@ "explorerTxLink": "https://chainz.cryptoid.info/dem/tx.dws?{0}.htm", "explorerAccountLink": "https://chainz.cryptoid.info/dem/address.dws?{0}.htm" }, - "emrals": { "name": "Emrals", "canonicalName": "Emrals", @@ -999,14 +955,17 @@ }, "blockHasher": { "hash": "reverse", - "args": [ { "hash": "x11" } ] + "args": [ + { + "hash": "x11" + } + ] }, "hasMasterNodes": true, "explorerBlockLink": "http://explorer.emrals.com/block/$height$", "explorerTxLink": "http://explorer.emrals.com/tx/{0}", "explorerAccountLink": "http://explorer.emrals.com/address/{0}" }, - "ergon": { "name": "Ergon", "canonicalName": "Ergon", @@ -1025,14 +984,17 @@ }, "blockHasher": { "hash": "reverse", - "args": [ { "hash": "sha256d" } ] + "args": [ + { + "hash": "sha256d" + } + ] }, "hasCoinbasePayload": true, "explorerBlockLink": "https://explorer.ergon.network/block.dws?$height$.htm", "explorerTxLink": "https://explorer.ergon.network/tx.dws?{0}.htm", "explorerAccountLink": "https://explorer.ergon.network/address.dws?{0}.htm" }, - "etitanium": { "name": "eTitanium ", "canonicalName": "eTitanium ", @@ -1051,13 +1013,16 @@ }, "blockHasher": { "hash": "reverse", - "args": [ { "hash": "sha256d" } ] + "args": [ + { + "hash": "sha256d" + } + ] }, "explorerBlockLink": "https://explorer.etitanium.net/block/$hash$", "explorerTxLink": "https://explorer.etitanium.net/tx/{0}", "explorerAccountLink": "https://explorer.etitanium.net/address/{0}" - }, - + }, "exosis": { "name": "Exosis", "canonicalName": "Exosis", @@ -1076,7 +1041,11 @@ }, "blockHasher": { "hash": "reverse", - "args": [ { "hash": "x16r" } ] + "args": [ + { + "hash": "x16r" + } + ] }, "shareMultiplier": 256, "hasMasterNodes": true, @@ -1084,7 +1053,6 @@ "explorerTxLink": "https://www.blockseek.io/exo/tx/{0}", "explorerAccountLink": "https://www.blockseek.io/exo/address/{0}" }, - "fanaticos-cash": { "name": "Fanaticos Cash", "symbol": "FCH", @@ -1102,13 +1070,16 @@ }, "blockHasher": { "hash": "reverse", - "args": [ { "hash": "sha256d" } ] + "args": [ + { + "hash": "sha256d" + } + ] }, "explorerBlockLink": "https://explorer.fanaticoscriptos.com/block/$hash$", "explorerTxLink": "https://explorer.fanaticoscriptos.com/tx/{0}", "explorerAccountLink": "https://explorer.fanaticoscriptos.com/address/{0}" }, - "feathercoin": { "name": "Feathercoin", "symbol": "FTC", @@ -1123,14 +1094,18 @@ }, "headerHasher": { "hash": "neoscrypt", - "args": [ 0 ] + "args": [ + 0 + ] }, "blockHasher": { "hash": "reverse", "args": [ { "hash": "neoscrypt", - "args": [ 0 ] + "args": [ + 0 + ] } ] }, @@ -1139,7 +1114,6 @@ "explorerTxLink": "https://chainz.cryptoid.info/ftc/tx.dws?{0}.htm", "explorerAccountLink": "https://chainz.cryptoid.info/ftc/address.dws?{0}.htm" }, - "flapx": { "name": "Flapx Coin", "symbol": "FLAPX", @@ -1154,18 +1128,28 @@ }, "headerHasher": { "hash": "scrypt", - "args": [ 1024, 1 ] + "args": [ + 1024, + 1 + ] }, "blockHasher": { "hash": "reverse", - "args": [ { "hash": "sha256d" } ] + "args": [ + { + "hash": "sha256d" + } + ] }, "posBlockHasher": { "hash": "reverse", "args": [ { "hash": "scrypt", - "args": [ 1024, 1 ] + "args": [ + 1024, + 1 + ] } ] }, @@ -1174,7 +1158,6 @@ "explorerTxLink": "http://70.179.122.29:60000/tx/{0}", "explorerAccountLink": "http://70.179.122.29:60000/address/{0}" }, - "flo": { "name": "Florin", "canonicalName": "Flo", @@ -1190,18 +1173,28 @@ }, "headerHasher": { "hash": "scrypt", - "args": [ 1024, 1 ] + "args": [ + 1024, + 1 + ] }, "blockHasher": { "hash": "reverse", - "args": [ { "hash": "sha256d" } ] - }, + "args": [ + { + "hash": "sha256d" + } + ] + }, "posBlockHasher": { "hash": "reverse", "args": [ { "hash": "scrypt", - "args": [ 1024, 1 ] + "args": [ + 1024, + 1 + ] } ] }, @@ -1212,7 +1205,6 @@ "explorerTxLink": "https://livenet.flocha.in/tx/{0}", "explorerAccountLink": "https://livenet.flocha.in/address/{0}" }, - "foxdcoin": { "name": "FoxDcoin", "canonicalName": "FoxDcoin", @@ -1227,22 +1219,29 @@ "hash": "sha256d" }, "headerHasher": { - "hash": "x16rv2" + "hash": "x16r-v2" }, "blockHasher": { "hash": "reverse", - "args": [ { "hash": "x16rv2" } ] + "args": [ + { + "hash": "x16r-v2" + } + ] }, "posBlockHasher": { "hash": "reverse", - "args": [ { "hash": "x16rv2" } ] + "args": [ + { + "hash": "x16r-v2" + } + ] }, "shareMultiplier": 4096, "explorerBlockLink": "https://explorer.foxdcoin.com/block-height/$height$", "explorerTxLink": "https://explorer.foxdcoin.com/tx/{0}", "explorerAccountLink": "https://explorer.foxdcoin.com/address/{0}" }, - "freecash": { "name": "Free Cash", "canonicalName": "Freecash", @@ -1254,21 +1253,24 @@ "telegram": "", "discord": "", "coinbaseHasher": { - "hash": "sha256d" - }, + "hash": "sha256d" + }, "headerHasher": { "hash": "sha256d" }, "blockHasher": { - "hash": "reverse", - "args": [ { "hash": "sha256d" } ] - }, + "hash": "reverse", + "args": [ + { + "hash": "sha256d" + } + ] + }, "hasCoinbaseDevReward": true, "explorerBlockLink": "https://freecash.info/block?height=$height$", "explorerTxLink": "https://freecash.info/transaction?hash={0}", "explorerAccountLink": "https://freecash.info/address?address={0}" }, - "geekcash": { "name": "Geek Cash", "symbol": "GEEK", @@ -1286,65 +1288,17 @@ }, "blockHasher": { "hash": "reverse", - "args": [ { "hash": "geek" } ] + "args": [ + { + "hash": "geek" + } + ] }, "hasMasterNodes": true, "explorerBlockLink": "http://explorer.geekcash.org/block/$hash$", "explorerTxLink": "http://explorer.geekcash.org/tx/{0}", "explorerAccountLink": "http://explorer.geekcash.org/address/{0}" }, - - "globalboost": { - "name": "GlobalBoost", - "canonicalName": "GlobalBoost", - "symbol": "BSTY", - "family": "bitcoin", - "website": "", - "market": "", - "twitter": "", - "telegram": "", - "discord": "", - "coinbaseHasher": { - "hash": "sha256d" - }, - "headerHasher": { - "hash": "yescrypt" - }, - "blockHasher": { - "hash": "reverse", - "args": [ { "hash": "sha256d" } ] - }, - "shareMultiplier": 1048576, - "explorerBlockLink": "https://bstyexplorer.globalboost.info/block/$height$", - "explorerTxLink": "https://bstyexplorer.globalboost.info/tx/{0}", - "explorerAccountLink": "https://bstyexplorer.globalboost.info/address/{0}" - }, - - "goldcash": { - "name": "Gold Cash", - "symbol": "GOLD", - "family": "bitcoin", - "website": "", - "market": "", - "twitter": "", - "telegram": "", - "discord": "", - "coinbaseHasher": { - "hash": "sha256d" - }, - "headerHasher": { - "hash": "yescryptR16" - }, - "blockHasher": { - "hash": "reverse", - "args": [ { "hash": "sha256d" } ] - }, - "shareMultiplier": 1048576, - "explorerBlockLink": "http://www.goldcashblockexplorer.co.uk/block/$height$", - "explorerTxLink": "http://www.goldcashblockexplorer.co.uk/tx/{0}", - "explorerAccountLink": "http://www.goldcashblockexplorer.co.uk/address/{0}" - }, - "groestlcoin": { "name": "Groestlcoin", "canonicalName": "Groestlcoin", @@ -1363,14 +1317,17 @@ }, "blockHasher": { "hash": "reverse", - "args": [ { "hash": "groestl" } ] + "args": [ + { + "hash": "groestl" + } + ] }, "shareMultiplier": 4096, "explorerBlockLink": "https://groestlsight.groestlcoin.org/block/$height$", "explorerTxLink": "https://groestlsight.groestlcoin.org/tx/{0}", "explorerAccountLink": "https://groestlsight.groestlcoin.org/address/{0}" }, - "help-the-homeless": { "name": "Help The Homeless", "symbol": "HTH", @@ -1388,7 +1345,11 @@ }, "blockHasher": { "hash": "reverse", - "args": [ { "hash": "x16r" } ] + "args": [ + { + "hash": "x16r" + } + ] }, "shareMultiplier": 256, "hasMasterNodes": true, @@ -1396,7 +1357,6 @@ "explorerTxLink": "http://explorer.hthcoin.world/tx/{0}", "explorerAccountLink": "http://explorer.hthcoin.world/address/{0}" }, - "hfrcoin": { "name": "HFRcoin", "canonicalName": "HFRcoin", @@ -1412,18 +1372,28 @@ }, "headerHasher": { "hash": "scrypt", - "args": [ 1024, 1 ] + "args": [ + 1024, + 1 + ] }, "blockHasher": { "hash": "reverse", - "args": [ { "hash": "sha256d" } ] + "args": [ + { + "hash": "sha256d" + } + ] }, "posBlockHasher": { "hash": "reverse", "args": [ { "hash": "scrypt", - "args": [ 1024, 1 ] + "args": [ + 1024, + 1 + ] } ] }, @@ -1432,7 +1402,6 @@ "explorerTxLink": "http://hfrco.in/blockcrawler/tx/{0}", "explorerAccountLink": "http://hfrco.in/blockcrawler/address/{0}" }, - "indexchain": { "name": "IndexChain", "symbol": "IDX", @@ -1446,15 +1415,23 @@ "hash": "sha256d" }, "headerHasher": { - "hash": "x16rv2" + "hash": "x16r-v2" }, "blockHasher": { "hash": "reverse", - "args": [ { "hash": "x16rv2" } ] + "args": [ + { + "hash": "x16r-v2" + } + ] }, "posBlockHasher": { "hash": "reverse", - "args": [ { "hash": "x16rv2" } ] + "args": [ + { + "hash": "x16r-v2" + } + ] }, "shareMultiplier": 4096, "hasMasterNodes": true, @@ -1462,8 +1439,6 @@ "explorerTxLink": "http://157.245.248.32:3000/#/tx/{0}", "explorerAccountLink": "http://157.245.248.32:3000/#/address/{0}" }, - - "lanacoin": { "name": "Lanacoin", "canonicalName": "Lana", @@ -1482,13 +1457,16 @@ }, "blockHasher": { "hash": "reverse", - "args": [ { "hash": "sha256d" } ] + "args": [ + { + "hash": "sha256d" + } + ] }, "explorerBlockLink": "https://chainz.cryptoid.info/lana/block.dws?$height$.htm", "explorerTxLink": "https://chainz.cryptoid.info/lana/tx.dws?{0}.htm", "explorerAccountLink": "https://chainz.cryptoid.info/lana/address.dws?{0}.htm" }, - "levocoin": { "name": "Levocoin", "symbol": "LEVO", @@ -1506,14 +1484,17 @@ }, "blockHasher": { "hash": "reverse", - "args": [ { "hash": "x11" } ] + "args": [ + { + "hash": "x11" + } + ] }, "hasMasterNodes": true, "explorerBlockLink": "http://blockexplorer.levocoin.io/block/$height$", "explorerTxLink": "http://blockexplorer.levocoin.io/tx/{0}", "explorerAccountLink": "http://blockexplorer.levocoin.io/address/{0}" }, - "litecoin": { "name": "Litecoin", "canonicalName": "Litecoin", @@ -1529,18 +1510,28 @@ }, "headerHasher": { "hash": "scrypt", - "args": [ 1024, 1 ] + "args": [ + 1024, + 1 + ] }, "blockHasher": { "hash": "reverse", - "args": [ { "hash": "sha256d" } ] + "args": [ + { + "hash": "sha256d" + } + ] }, "posBlockHasher": { "hash": "reverse", "args": [ { "hash": "scrypt", - "args": [ 1024, 1 ] + "args": [ + 1024, + 1 + ] } ] }, @@ -1549,7 +1540,6 @@ "explorerTxLink": "https://chainz.cryptoid.info/ltc/tx.dws?{0}.htm", "explorerAccountLink": "https://chainz.cryptoid.info/ltc/address.dws?{0}.htm" }, - "litecoin-cash": { "name": "Litecoin Cash", "canonicalName": "Litecoin-Cash", @@ -1568,39 +1558,16 @@ }, "blockHasher": { "hash": "reverse", - "args": [ { "hash": "sha256d" } ] - }, + "args": [ + { + "hash": "sha256d" + } + ] + }, "explorerBlockLink": "https://chainz.cryptoid.info/lcc/block.dws?$height$.htm", "explorerTxLink": "https://chainz.cryptoid.info/lcc/tx.dws?{0}.htm", "explorerAccountLink": "https://chainz.cryptoid.info/lcc/address.dws?{0}.htm" }, - - "litecoin-finance": { - "name": "Litecoin Finance", - "canonicalName": "Litecoin Finance", - "symbol": "LTFN", - "family": "bitcoin", - "website": "https://axerunners.com/", - "market": "https://coinmarketcap.com/currencies/litecoin-finance/", - "twitter": "https://twitter.com/search?q=$axe", - "telegram": "https://t.me/axerunners", - "discord": "https://discordapp.com/invite/BqhteaU", - "coinbaseHasher": { - "hash": "sha256d" - }, - "headerHasher": { - "hash": "yespowerr16" - }, - "blockHasher": { - "hash": "reverse", - "args": [ { "hash": "sha256d" } ] - }, - "shareMultiplier": 65536, - "explorerBlockLink": "https://openchains.info/coin/ltfn/block/$height$", - "explorerTxLink": "https://openchains.info/coin/ltfn/tx/{0}", - "explorerAccountLink": "https://openchains.info/coin/ltfn/address/{0}" - }, - "luckybit": { "name": "Lucky Bit", "symbol": "LUCKY", @@ -1615,14 +1582,18 @@ }, "headerHasher": { "hash": "neoscrypt", - "args": [ 0 ] + "args": [ + 0 + ] }, "blockHasher": { "hash": "reverse", "args": [ { "hash": "neoscrypt", - "args": [ 0 ] + "args": [ + 0 + ] } ] }, @@ -1632,33 +1603,6 @@ "explorerTxLink": "https://openchains.info/coin/luckybit/tx/{0}", "explorerAccountLink": "https://openchains.info/coin/luckybit/address/{0}" }, - - "magpiecoin": { - "name": "MagPie Coin", - "symbol": "MGPC", - "family": "bitcoin", - "website": "", - "market": "", - "twitter": "", - "telegram": "", - "discord": "", - "coinbaseHasher": { - "hash": "sha256d" - }, - "headerHasher": { - "hash": "yespowermgpc" - }, - "blockHasher": { - "hash": "reverse", - "args": [ { "hash": "sha256d" } ] - }, - "shareMultiplier": 65536, - "coinbaseMinConfimations": 401, - "explorerBlockLink": "https://mgpc.explorer.alphax.pro/block/$hash$", - "explorerTxLink": "https://mgpc.explorer.alphax.pro/tx/{0}", - "explorerAccountLink": "https://mgpc.explorer.alphax.pro/address/{0}" - }, - "maza": { "name": "Maza", "canonicalName": "Maza", @@ -1677,13 +1621,16 @@ }, "blockHasher": { "hash": "reverse", - "args": [ { "hash": "sha256d" } ] - }, + "args": [ + { + "hash": "sha256d" + } + ] + }, "explorerBlockLink": "https://mazacha.in/block/$hash$", "explorerTxLink": "https://mazacha.in/tx/{0}", "explorerAccountLink": "https://mazacha.in/address/{0}" }, - "mincoin": { "name": "Mincoin", "canonicalName": "Mincoin", @@ -1698,18 +1645,24 @@ }, "headerHasher": { "hash": "scrypt", - "args": [ 1024, 1 ] + "args": [ + 1024, + 1 + ] }, "blockHasher": { "hash": "reverse", - "args": [ { "hash": "sha256d" } ] + "args": [ + { + "hash": "sha256d" + } + ] }, "shareMultiplier": 65536, "explorerBlockLink": "https://chainz.cryptoid.info/mnc/block.dws?$height$.htm", "explorerTxLink": "https://chainz.cryptoid.info/mnc/tx.dws?{0}.htm", "explorerAccountLink": "https://chainz.cryptoid.info/mnc/address.dws?{0}.htm" }, - "monacoin": { "name": "Monacoin", "canonicalName": "Monacoin", @@ -1724,18 +1677,21 @@ "hash": "sha256d" }, "headerHasher": { - "hash": "lyra2rev2" + "hash": "lyra2-rev2" }, "blockHasher": { "hash": "reverse", - "args": [ { "hash": "sha256d" } ] + "args": [ + { + "hash": "sha256d" + } + ] }, "shareMultiplier": 256, "explorerBlockLink": "https://bchain.info/MONA/block/$height$", "explorerTxLink": "https://bchain.info/MONA/tx/{0}", "explorerAccountLink": "https://bchain.info/MONA/addr/{0}" }, - "mooncoin": { "name": "Mooncoin", "canonicalName": "Mooncoin", @@ -1751,18 +1707,28 @@ }, "headerHasher": { "hash": "scrypt", - "args": [ 1024, 1 ] + "args": [ + 1024, + 1 + ] }, "blockHasher": { "hash": "reverse", - "args": [ { "hash": "sha256d" } ] + "args": [ + { + "hash": "sha256d" + } + ] }, "posBlockHasher": { "hash": "reverse", "args": [ { "hash": "scrypt", - "args": [ 1024, 1 ] + "args": [ + 1024, + 1 + ] } ] }, @@ -1771,7 +1737,6 @@ "explorerTxLink": "https://chainz.cryptoid.info/moon/tx.dws?{0}.htm", "explorerAccountLink": "https://chainz.cryptoid.info/moon/address.dws?{0}.htm" }, - "namecoin": { "name": "Namecoin", "canonicalName": "Namecoin", @@ -1790,13 +1755,16 @@ }, "blockHasher": { "hash": "reverse", - "args": [ { "hash": "sha256d" } ] + "args": [ + { + "hash": "sha256d" + } + ] }, "explorerBlockLink": "https://explorer.namecoin.info/b/$height$", "explorerTxLink": "https://explorer.namecoin.info/tx/{0}", "explorerAccountLink": "https://explorer.namecoin.info/a/{0}" }, - "note-blockchain": { "name": "Note Blockchain", "canonicalName": "Note-Blockchain", @@ -1812,18 +1780,28 @@ }, "headerHasher": { "hash": "scrypt", - "args": [ 1024, 1 ] + "args": [ + 1024, + 1 + ] }, "blockHasher": { "hash": "reverse", - "args": [ { "hash": "sha256d" } ] + "args": [ + { + "hash": "sha256d" + } + ] }, "posBlockHasher": { "hash": "reverse", "args": [ { "hash": "scrypt", - "args": [ 1024, 1 ] + "args": [ + 1024, + 1 + ] } ] }, @@ -1832,7 +1810,6 @@ "explorerTxLink": "https://openchains.info/coin/ntbc/tx/{0}", "explorerAccountLink": "https://openchains.info/coin/ntbc/address/{0}" }, - "opticalbitcoin": { "name": "Optical BTC", "symbol": "OBTC", @@ -1850,13 +1827,16 @@ }, "blockHasher": { "hash": "reverse", - "args": [ { "hash": "heavyhash" } ] + "args": [ + { + "hash": "heavyhash" + } + ] }, "explorerBlockLink": "https://explorer.powx.org/block/$hash$", "explorerTxLink": "https://explorer.powx.org/tx/{0}", "explorerAccountLink": "https://explorer.powx.org/address/{0}" }, - "paccoin": { "name": "Paccoin", "symbol": "PAC", @@ -1874,14 +1854,17 @@ }, "blockHasher": { "hash": "reverse", - "args": [ { "hash": "x11" } ] + "args": [ + { + "hash": "x11" + } + ] }, "hasMasterNodes": true, "explorerBlockLink": "http://explorer.paccoin.net/block/$hash$", "explorerTxLink": "http://explorer.paccoin.net/tx/{0}", "explorerAccountLink": "http://explorer.paccoin.net/address/{0}" }, - "pakcoin": { "name": "Pakcoin", "symbol": "PAK", @@ -1896,18 +1879,28 @@ }, "headerHasher": { "hash": "scrypt", - "args": [ 1024, 1 ] + "args": [ + 1024, + 1 + ] }, "blockHasher": { "hash": "reverse", - "args": [ { "hash": "sha256d" } ] + "args": [ + { + "hash": "sha256d" + } + ] }, "posBlockHasher": { "hash": "reverse", "args": [ { "hash": "scrypt", - "args": [ 1024, 1 ] + "args": [ + 1024, + 1 + ] } ] }, @@ -1916,7 +1909,6 @@ "explorerTxLink": "https://chainz.cryptoid.info/pak/tx.dws?{0}.htm", "explorerAccountLink": "https://chainz.cryptoid.info/pak/address.dws?{0}.htm" }, - "peercoin": { "name": "Peercoin", "canonicalName": "Peercoin", @@ -1935,14 +1927,17 @@ }, "blockHasher": { "hash": "reverse", - "args": [ { "hash": "sha256d" } ] + "args": [ + { + "hash": "sha256d" + } + ] }, "coinbaseMinConfimations": 501, "explorerBlockLink": "https://chainz.cryptoid.info/ppc/block.dws?$height$.htm", "explorerTxLink": "https://chainz.cryptoid.info/ppc/tx.dws?{0}.htm", "explorerAccountLink": "https://chainz.cryptoid.info/ppc/address.dws?{0}.htm" }, - "picacoin": { "name": "Picacoin", "canonicalName": "Picacoin", @@ -1961,14 +1956,16 @@ }, "blockHasher": { "hash": "reverse", - "args": [ { "hash": "sha256d" } ] + "args": [ + { + "hash": "sha256d" + } + ] }, "explorerBlockLink": "https://openchains.info/coin/picacoin/block/$height$", "explorerTxLink": "https://openchains.info/coin/picacoin/tx/{0}", "explorerAccountLink": "https://openchains.info/coin/picacoin/address/{0}" - }, - "polcoin": { "name": "Polcoin", "canonicalName": "Polcoin", @@ -1987,13 +1984,16 @@ }, "blockHasher": { "hash": "reverse", - "args": [ { "hash": "sha256d" } ] + "args": [ + { + "hash": "sha256d" + } + ] }, "explorerBlockLink": "https://eksplorator.polcoin.pl/block/$hash$", "explorerTxLink": "hhttps://eksplorator.polcoin.pl/tx/{0}", "explorerAccountLink": "https://eksplorator.polcoin.pl/address/{0}" }, - "profithunters": { "name": "Profit Hunters", "symbol": "PHC", @@ -2008,18 +2008,28 @@ }, "headerHasher": { "hash": "scrypt", - "args": [ 1024, 1 ] + "args": [ + 1024, + 1 + ] }, "blockHasher": { "hash": "reverse", - "args": [ { "hash": "sha256d" } ] + "args": [ + { + "hash": "sha256d" + } + ] }, "posBlockHasher": { "hash": "reverse", "args": [ { "hash": "scrypt", - "args": [ 1024, 1 ] + "args": [ + 1024, + 1 + ] } ] }, @@ -2029,7 +2039,6 @@ "explorerTxLink": "https://explorer.miningpower.net/index.php?transaction={0}", "explorerAccountLink": "https://explorer.miningpower.net/index.php?wallet={0}" }, - "pyrk-sha256": { "name": "Pyrk Sha256", "canonicalName": "Pyrk", @@ -2048,14 +2057,17 @@ }, "blockHasher": { "hash": "reverse", - "args": [ { "hash": "sha256d" } ] + "args": [ + { + "hash": "sha256d" + } + ] }, "hasMasterNodes": true, "explorerBlockLink": "https://explorer.pyrk.org/blockheight/$height$", "explorerTxLink": "https://explorer.pyrk.org/tx/{0}", "explorerAccountLink": "https://explorer.pyrk.org/address/{0}" }, - "pyrk-scrypt": { "name": "Pyrk Scrypt", "canonicalName": "Pyrk", @@ -2071,18 +2083,28 @@ }, "headerHasher": { "hash": "scrypt", - "args": [ 1024, 1 ] + "args": [ + 1024, + 1 + ] }, "blockHasher": { "hash": "reverse", - "args": [ { "hash": "sha256d" } ] + "args": [ + { + "hash": "sha256d" + } + ] }, "posBlockHasher": { "hash": "reverse", "args": [ { "hash": "scrypt", - "args": [ 1024, 1 ] + "args": [ + 1024, + 1 + ] } ] }, @@ -2092,7 +2114,6 @@ "explorerTxLink": "https://explorer.pyrk.org/tx/{0}", "explorerAccountLink": "https://explorer.pyrk.org/address/{0}" }, - "pyrk-x11": { "name": "Pyrk X11", "canonicalName": "Pyrk", @@ -2111,14 +2132,17 @@ }, "blockHasher": { "hash": "reverse", - "args": [ { "hash": "sha256d" } ] + "args": [ + { + "hash": "sha256d" + } + ] }, "hasMasterNodes": true, "explorerBlockLink": "https://explorer.pyrk.org/blockheight/$height$", "explorerTxLink": "https://explorer.pyrk.org/tx/{0}", "explorerAccountLink": "https://explorer.pyrk.org/address/{0}" }, - "raptoreum": { "name": "Raptoreum", "canonicalName": "Raptoreum", @@ -2137,102 +2161,55 @@ }, "blockHasher": { "hash": "reverse", - "args": [ { "hash": "sha256d" } ] + "args": [ + { + "hash": "sha256d" + } + ] }, "hasFounderFee": true, "hasMasterNodes": true, "foundersRewardAddress": [ - "RTtyQU6DoSuNWetT4WUem5qXP5jNYGpwat" + "RTtyQU6DoSuNWetT4WUem5qXP5jNYGpwat" ], "shareMultiplier": 65536, "explorerBlockLink": "https://explorer.raptoreum.com/block-height/$height$", "explorerTxLink": "https://explorer.raptoreum.com/tx/{0}", "explorerAccountLink": "https://explorer.raptoreum.com/address/{0}" }, - "bitoreum": { - "name": "Bitoreum", - "canonicalName": "Bitoreum", - "symbol": "BTRM", - "family": "bitcoin", - "website": "https://bitoreum.org/", - "market": "https://www.coingecko.com/en/coins/bitoreum", - "twitter": "https://twitter.com/bitoreum", - "discord": "https://discord.gg/E3E9Ef3kZT", - "coinbaseHasher": { - "hash": "sha256d" - }, - "headerHasher": { - "hash": "ghostrider" - }, - "blockHasher": { - "hash": "reverse", - "args": [ { "hash": "sha256d" } ] - }, - "hasFounderFee": true, - "hasMasterNodes": true, - "foundersRewardAddress": [ - "BanxgMPcMpXnuWQ2ogfQqEkwwVtjhAhXBR" - ], - "shareMultiplier": 65536, - "explorerBlockLink": "https://explorer.bitoreum.org/block/$hash$", - "explorerTxLink": "https://explorer.bitoreum.org/tx/{0}", - "explorerAccountLink": "https://explorer.bitoreum.org/address/{0}" - - }, - - "reacoin": { - "name": "Reacoin", - "canonicalName": "Reacoin", - "symbol": "REAN", - "family": "bitcoin", - "website": "https://reacoin.io/", - "market": "", - "twitter": "https://twitter.com/REABRAND1OF1", - "telegram": "https://t.me/ReacoinREA", - "discord": "https://discord.com/invite/pXPVNBW7ZB", - "coinbaseHasher": { - "hash": "sha256d" - }, - "headerHasher": { - "hash": "yescryptR16" - }, - "blockHasher": { - "hash": "reverse", - "args": [ { "hash": "sha256d" } ] - }, - "shareMultiplier": 1048576, - "explorerBlockLink": "https://explorer.reacoin.com/block-height/$height$", - "explorerTxLink": "https://explorer.reacoin.com/tx/{0}", - "explorerAccountLink": "https://explorer.reacoin.com/address/{0}" - }, - - "ring": { - "name": "Ring", - "canonicalName": "Ring", - "symbol": "RNG", + "name": "Bitoreum", + "canonicalName": "Bitoreum", + "symbol": "BTRM", "family": "bitcoin", - "website": "", - "market": "", - "twitter": "", - "telegram": "", - "discord": "", + "website": "https://bitoreum.org/", + "market": "https://www.coingecko.com/en/coins/bitoreum", + "twitter": "https://twitter.com/bitoreum", + "discord": "https://discord.gg/E3E9Ef3kZT", "coinbaseHasher": { "hash": "sha256d" }, "headerHasher": { - "hash": "minotaur" + "hash": "ghostrider" }, "blockHasher": { "hash": "reverse", - "args": [ { "hash": "sha256d" } ] + "args": [ + { + "hash": "sha256d" + } + ] }, - "shareMultiplier": 4096, - "explorerBlockLink": "https://chainz.cryptoid.info/rng/block.dws?$height$.htm", - "explorerTxLink": "https://chainz.cryptoid.info/rng/tx.dws?{0}.htm", - "explorerAccountLink": "https://chainz.cryptoid.info/rng/address.dws?{0}.htm" + "hasFounderFee": true, + "hasMasterNodes": true, + "foundersRewardAddress": [ + "BanxgMPcMpXnuWQ2ogfQqEkwwVtjhAhXBR" + ], + "shareMultiplier": 65536, + "explorerBlockLink": "https://explorer.bitoreum.org/block/$hash$", + "explorerTxLink": "https://explorer.bitoreum.org/tx/{0}", + "explorerAccountLink": "https://explorer.bitoreum.org/address/{0}" }, - "rosecoin": { "name": "Rosecoin", "symbol": "ROC", @@ -2247,18 +2224,28 @@ }, "headerHasher": { "hash": "scrypt", - "args": [ 1024, 1 ] + "args": [ + 1024, + 1 + ] }, "blockHasher": { "hash": "reverse", - "args": [ { "hash": "sha256d" } ] + "args": [ + { + "hash": "sha256d" + } + ] }, "posBlockHasher": { "hash": "reverse", "args": [ { "hash": "scrypt", - "args": [ 1024, 1 ] + "args": [ + 1024, + 1 + ] } ] }, @@ -2267,7 +2254,6 @@ "explorerTxLink": "https://be.rosebird.org/tx/{0}", "explorerAccountLink": "https://be.rosebird.org/address/{0}" }, - "shroud": { "name": "ShroudX", "symbol": "SHRX", @@ -2281,15 +2267,23 @@ "hash": "sha256d" }, "headerHasher": { - "hash": "x16rv2" + "hash": "x16r-v2" }, "blockHasher": { "hash": "reverse", - "args": [ { "hash": "x16rv2" } ] + "args": [ + { + "hash": "x16r-v2" + } + ] }, "posBlockHasher": { "hash": "reverse", - "args": [ { "hash": "x16rv2" } ] + "args": [ + { + "hash": "x16r-v2" + } + ] }, "hasMasterNodes": true, "shareMultiplier": 4096, @@ -2297,7 +2291,6 @@ "explorerTxLink": "https://explorer.shroudx.eu/tx/{0}", "explorerAccountLink": "https://explorer.shroudx.eu/address/{0}" }, - "smileycoin-sha256": { "name": "Smileycoin Sha256", "canonicalName": "Smileycoin", @@ -2316,14 +2309,19 @@ }, "blockHasher": { "hash": "reverse", - "args": [ { "hash": "sha256d" } ] + "args": [ + { + "hash": "sha256d" + } + ] }, - "blockTemplateRpcExtraParams": [ "sha256d" ], + "blockTemplateRpcExtraParams": [ + "sha256d" + ], "explorerBlockLink": "https://chainz.cryptoid.info/smly/block.dws?$height$.htm", "explorerTxLink": "https://chainz.cryptoid.info/smly/tx.dws?{0}.htm", "explorerAccountLink": "https://chainz.cryptoid.info/smly/address.dws?{0}.htm" }, - "smileycoin-scrypt": { "name": "Smileycoin Scrypt", "canonicalName": "Smileycoin", @@ -2339,19 +2337,27 @@ }, "headerHasher": { "hash": "scrypt", - "args": [ 1024, 1 ] + "args": [ + 1024, + 1 + ] }, "blockHasher": { "hash": "reverse", - "args": [ { "hash": "sha256d" } ] + "args": [ + { + "hash": "sha256d" + } + ] }, - "blockTemplateRpcExtraParams": [ "scrypt" ], + "blockTemplateRpcExtraParams": [ + "scrypt" + ], "shareMultiplier": 65536, "explorerBlockLink": "https://chainz.cryptoid.info/smly/block.dws?$height$.htm", "explorerTxLink": "https://chainz.cryptoid.info/smly/tx.dws?{0}.htm", "explorerAccountLink": "https://chainz.cryptoid.info/smly/address.dws?{0}.htm" }, - "smileycoin-skein": { "name": "Smileycoin Skein", "canonicalName": "Smileycoin", @@ -2370,14 +2376,19 @@ }, "blockHasher": { "hash": "reverse", - "args": [ { "hash": "sha256d" } ] + "args": [ + { + "hash": "sha256d" + } + ] }, - "blockTemplateRpcExtraParams": [ "skein" ], + "blockTemplateRpcExtraParams": [ + "skein" + ], "explorerBlockLink": "https://chainz.cryptoid.info/smly/block.dws?$height$.htm", "explorerTxLink": "https://chainz.cryptoid.info/smly/tx.dws?{0}.htm", "explorerAccountLink": "https://chainz.cryptoid.info/smly/address.dws?{0}.htm" }, - "smileycoin-qubit": { "name": "Smileycoin Qubit", "canonicalName": "Smileycoin", @@ -2396,14 +2407,19 @@ }, "blockHasher": { "hash": "reverse", - "args": [ { "hash": "sha256d" } ] + "args": [ + { + "hash": "sha256d" + } + ] }, - "blockTemplateRpcExtraParams": [ "qubit" ], + "blockTemplateRpcExtraParams": [ + "qubit" + ], "explorerBlockLink": "https://chainz.cryptoid.info/smly/block.dws?$height$.htm", "explorerTxLink": "https://chainz.cryptoid.info/smly/tx.dws?{0}.htm", "explorerAccountLink": "https://chainz.cryptoid.info/smly/address.dws?{0}.htm" }, - "smileycoin-groestl": { "name": "Smileycoin Groestl", "canonicalName": "Smileycoin", @@ -2418,19 +2434,24 @@ "hash": "sha256d" }, "headerHasher": { - "hash": "groestlmyriad" + "hash": "groestl-myriad" }, "blockHasher": { "hash": "reverse", - "args": [ { "hash": "sha256d" } ] + "args": [ + { + "hash": "sha256d" + } + ] }, "shareMultiplier": 4096, - "blockTemplateRpcExtraParams": [ "groestl" ], + "blockTemplateRpcExtraParams": [ + "groestl" + ], "explorerBlockLink": "https://chainz.cryptoid.info/smly/block.dws?$height$.htm", "explorerTxLink": "https://chainz.cryptoid.info/smly/tx.dws?{0}.htm", "explorerAccountLink": "https://chainz.cryptoid.info/smly/address.dws?{0}.htm" }, - "sparkspay": { "name": "SparksPay", "canonicalName": "SparkPay", @@ -2446,14 +2467,18 @@ }, "headerHasher": { "hash": "neoscrypt", - "args": [ 0 ] + "args": [ + 0 + ] }, "blockHasher": { "hash": "reverse", "args": [ { "hash": "neoscrypt", - "args": [ 0 ] + "args": [ + 0 + ] } ] }, @@ -2463,7 +2488,6 @@ "explorerTxLink": "https://chainz.cryptoid.info/spk/tx.dws?{0}.htm", "explorerAccountLink": "https://chainz.cryptoid.info/spk/address.dws?{0}.htm" }, - "stakecube": { "name": "StakeCube", "canonicalName": "Stakecube", @@ -2482,40 +2506,17 @@ }, "blockHasher": { "hash": "reverse", - "args": [ { "hash": "x11" } ] + "args": [ + { + "hash": "x11" + } + ] }, "hasMasterNodes": true, "explorerBlockLink": "https://scc.ccore.online/block/$height$", "explorerTxLink": "https://scc.ccore.online/tx/{0}", - "explorerAccountLink":"https://scc.ccore.online/address/{0}" - }, - - "sugarchain": { - "name": "Sugarchain", - "canonicalName": "Sugarchain", - "symbol": "SUGAR", - "family": "bitcoin", - "website": "https://sugarchain.org/", - "market": "https://coinmarketcap.com/currencies/sugarchain/", - "twitter": "https://twitter.com/sugarchain_dev", - "telegram": "https://t.me/sugarchain", - "discord": "", - "coinbaseHasher": { - "hash": "sha256d" - }, - "headerHasher": { - "hash": "yespowersugar" - }, - "blockHasher": { - "hash": "reverse", - "args": [ { "hash": "sha256d" } ] - }, - "shareMultiplier": 4194304, - "explorerBlockLink": "https://1explorer.sugarchain.org/block/$hash$", - "explorerTxLink": "https://1explorer.sugarchain.org/tx/{0}", - "explorerAccountLink": "https://1explorer.sugarchain.org/address/{0}" + "explorerAccountLink": "https://scc.ccore.online/address/{0}" }, - "susucoin": { "name": "Susucoin", "canonicalName": "Susucoin", @@ -2534,13 +2535,16 @@ }, "blockHasher": { "hash": "reverse", - "args": [ { "hash": "sha256d" } ] + "args": [ + { + "hash": "sha256d" + } + ] }, "explorerBlockLink": "https://explore.susukino.com//block/$hash$", "explorerTxLink": "https://explore.susukino.com/tx/{0}", "explorerAccountLink": "https://explore.susukino.com/address/{0}" }, - "swippcoin": { "name": "Swipp", "symbol": "SWP", @@ -2558,14 +2562,17 @@ }, "blockHasher": { "hash": "reverse", - "args": [ { "hash": "x11" } ] + "args": [ + { + "hash": "x11" + } + ] }, "hasMasterNodes": true, "explorerBlockLink": "http://explorer.swippcoin.com/block/$height$", "explorerTxLink": "http://explorer.swippcoin.com/tx/{0}", "explorerAccountLink": "http://explorer.swippcoin.com/address/{0}" }, - "terracoin": { "name": "Terracoin", "canonicalName": "Terracoin", @@ -2584,13 +2591,16 @@ }, "blockHasher": { "hash": "reverse", - "args": [ { "hash": "sha256d" } ] + "args": [ + { + "hash": "sha256d" + } + ] }, "explorerBlockLink": "http://insight.terracoin.io/block/$hash$", "explorerTxLink": "http://insight.terracoin.io/tx/{0}", "explorerAccountLink": "http://insight.terracoin.io/address/{0}" }, - "tdcoin": { "name": "TDCOIN", "symbol": "TDC", @@ -2608,13 +2618,16 @@ }, "blockHasher": { "hash": "reverse", - "args": [ { "hash": "sha256d" } ] + "args": [ + { + "hash": "sha256d" + } + ] }, "explorerBlockLink": "https://www.tdcoincore.org/bcexplorer/blockh/$height$", "explorerTxLink": "https://www.tdcoincore.org/bcexplorer/tx/{0}", "explorerAccountLink": "https://www.tdcoincore.org/bcexplorer/address/{0}" }, - "theholyroger": { "name": "The Holy Roger", "symbol": "ROGER", @@ -2629,18 +2642,28 @@ }, "headerHasher": { "hash": "scrypt", - "args": [ 1024, 1 ] + "args": [ + 1024, + 1 + ] }, "blockHasher": { "hash": "reverse", - "args": [ { "hash": "sha256d" } ] + "args": [ + { + "hash": "sha256d" + } + ] }, "posBlockHasher": { "hash": "reverse", "args": [ { "hash": "scrypt", - "args": [ 1024, 1 ] + "args": [ + 1024, + 1 + ] } ] }, @@ -2649,7 +2672,6 @@ "explorerTxLink": "https://explorer.theholyroger.com/tx/{0}", "explorerAccountLink": "https://explorer.theholyroger.com/address/{0}" }, - "thooneum": { "name": "Thooneum", "canonicalName": "Thooneum", @@ -2668,20 +2690,22 @@ }, "blockHasher": { "hash": "reverse", - "args": [ { "hash": "sha256d" } ] + "args": [ + { + "hash": "sha256d" + } + ] }, "hasFounderFee": true, - "hasMasterNodes": true, + "hasMasterNodes": true, "shareMultiplier": 65536, "explorerBlockLink": "http://rtm.timyg.org:6950/block/$height$", "explorerTxLink": "http://rtm.timyg.org:6950/tx/{0}", "explorerAccountLink": "http://rtm.timyg.org:6950/address/{0}" }, - - "tidecoin": { - "name": "Tidecoin", - "canonicalName": "Tidecoin", - "symbol": "TDC", + "titcoin": { + "name": "Titcoin", + "symbol": "TIT", "family": "bitcoin", "website": "", "market": "", @@ -2692,42 +2716,20 @@ "hash": "sha256d" }, "headerHasher": { - "hash": "yespowertide" + "hash": "sha256d" }, "blockHasher": { "hash": "reverse", - "args": [ { "hash": "sha256d" } ] - }, - "shareMultiplier": 3145728, - "explorerBlockLink": "http://explorer.tidecoin.org/block/$hash$", - "explorerTxLink": "http://explorer.tidecoin.org/tx/{0}", - "explorerAccountLink": "http://explorer.tidecoin.org/address/{0}" - }, - - "titcoin": { - "name": "Titcoin", - "symbol": "TIT", - "family": "bitcoin", - "website": "", - "market": "", - "twitter": "", - "telegram": "", - "discord": "", - "coinbaseHasher": { - "hash": "sha256d" + "args": [ + { + "hash": "sha256d" + } + ] }, - "headerHasher": { - "hash": "sha256d" - }, - "blockHasher": { - "hash": "reverse", - "args": [ { "hash": "sha256d" } ] - }, - "explorerBlockLink": "https://www.blockexperts.com/tit/height/$height$", - "explorerTxLink": "https://www.blockexperts.com/tit/tx/{0}", - "explorerAccountLink": "https://www.blockexperts.com/tit/address/{0}" + "explorerBlockLink": "https://www.blockexperts.com/tit/height/$height$", + "explorerTxLink": "https://www.blockexperts.com/tit/tx/{0}", + "explorerAccountLink": "https://www.blockexperts.com/tit/address/{0}" }, - "tiltcoin": { "name": "TILTCoin", "canonicalName": "TILTCoin", @@ -2743,45 +2745,24 @@ }, "headerHasher": { "hash": "scrypt", - "args": [ 1024, 1 ] + "args": [ + 1024, + 1 + ] }, "blockHasher": { "hash": "reverse", - "args": [ { "hash": "sha256d" } ] + "args": [ + { + "hash": "sha256d" + } + ] }, "shareMultiplier": 65536, "explorerBlockLink": "https://explorer.tiltcoin.io/block/$hash$", "explorerTxLink": "https://explorer.tiltcoin.io/tx/{0}", "explorerAccountLink": "https://explorer.tiltcoin.io/address/{0}" }, - - "veco": { - "name": "Veco", - "canonicalName": "Veco", - "symbol": "VECO", - "family": "bitcoin", - "website": "https://veco.to/", - "market": "https://coinmarketcap.com/currencies/veco/", - "twitter": "https://twitter.com/VECO_Community", - "telegram": "", - "discord": "https://discordapp.com/invite/Z7j9mz6", - "coinbaseHasher": { - "hash": "sha256d" - }, - "headerHasher": { - "hash": "yespower" - }, - "blockHasher": { - "hash": "reverse", - "args": [ { "hash": "yespower" } ] - }, - "hasMasterNodes": true, - "shareMultiplier": 65536, - "explorerBlockLink": "http://block.veco.to/block/$hash$", - "explorerTxLink": "http://block.veco.to/tx/{0}", - "explorerAccountLink": "http://block.veco.to/address/{0}" - }, - "veles-sha256": { "name": "Veles-Sha256", "canonicalName": "Veles", @@ -2800,14 +2781,17 @@ }, "blockHasher": { "hash": "reverse", - "args": [ { "hash": "sha256d" } ] + "args": [ + { + "hash": "sha256d" + } + ] }, "hasMasterNodes": true, "explorerBlockLink": "https://chainz.cryptoid.info/vls/block.dws?$height$.htm", "explorerTxLink": "https://chainz.cryptoid.info/vls/tx.dws?{0}.htm", "explorerAccountLink": "https://chainz.cryptoid.info/vls/address.dws?{0}.htm" - }, - + }, "veles-scrypt": { "name": "Veles Scrypt", "canonicalName": "Veles", @@ -2819,22 +2803,32 @@ "telegram": "", "discord": "", "coinbaseHasher": { - "hash": "sha256d" + "hash": "sha256d" }, "headerHasher": { "hash": "scrypt", - "args": [ 1024, 1 ] + "args": [ + 1024, + 1 + ] }, "blockHasher": { "hash": "reverse", - "args": [ { "hash": "sha256d" } ] + "args": [ + { + "hash": "sha256d" + } + ] }, "posBlockHasher": { "hash": "reverse", "args": [ { "hash": "scrypt", - "args": [ 1024, 1 ] + "args": [ + 1024, + 1 + ] } ] }, @@ -2844,7 +2838,6 @@ "explorerTxLink": "https://chainz.cryptoid.info/vls/tx.dws?{0}.htm", "explorerAccountLink": "https://chainz.cryptoid.info/vls/address.dws?{0}.htm" }, - "verge-lyra": { "name": "Verge Lyra", "canonicalName": "Verge", @@ -2859,25 +2852,29 @@ "hash": "sha256d" }, "headerHasher": { - "hash": "lyra2rev2" + "hash": "lyra2-rev2" }, "blockHasher": { "hash": "reverse", "args": [ { "hash": "scrypt", - "args": [ 1024, 1 ] + "args": [ + 1024, + 1 + ] } ] }, "isPseudoPoS": true, - "blockTemplateRpcExtraParams": [ "lyra" ], + "blockTemplateRpcExtraParams": [ + "lyra" + ], "shareMultiplier": 256, "explorerBlockLink": "https://verge-blockchain.info/block/$hash$", "explorerTxLink": "https://verge-blockchain.info/tx/{0}", "explorerAccountLink": "https://verge-blockchain.info/address/{0}" }, - "verge-scrypt": { "name": "Verge-Scrypt", "canonicalName": "Verge", @@ -2893,25 +2890,32 @@ }, "headerHasher": { "hash": "scrypt", - "args": [ 1024, 1 ] + "args": [ + 1024, + 1 + ] }, "blockHasher": { "hash": "reverse", "args": [ { "hash": "scrypt", - "args": [ 1024, 1 ] + "args": [ + 1024, + 1 + ] } ] }, "isPseudoPoS": true, - "blockTemplateRpcExtraParams": [ "scrypt" ], + "blockTemplateRpcExtraParams": [ + "scrypt" + ], "shareMultiplier": 65536, "explorerBlockLink": "https://verge-blockchain.info/block/$hash$", "explorerTxLink": "https://verge-blockchain.info/tx/{0}", "explorerAccountLink": "https://verge-blockchain.info/address/{0}" }, - "verge-x17": { "name": "Verge X17", "canonicalName": "Verge", @@ -2933,17 +2937,21 @@ "args": [ { "hash": "scrypt", - "args": [ 1024, 1 ] + "args": [ + 1024, + 1 + ] } ] }, "isPseudoPoS": true, - "blockTemplateRpcExtraParams": [ "x17" ], + "blockTemplateRpcExtraParams": [ + "x17" + ], "explorerBlockLink": "https://verge-blockchain.info/block/$hash$", "explorerTxLink": "https://verge-blockchain.info/tx/{0}", "explorerAccountLink": "https://verge-blockchain.info/address/{0}" }, - "verge-blake": { "name": "Verge Blake", "canonicalName": "Verge", @@ -2965,17 +2973,21 @@ "args": [ { "hash": "scrypt", - "args": [ 1024, 1 ] + "args": [ + 1024, + 1 + ] } ] }, "isPseudoPoS": true, - "blockTemplateRpcExtraParams": [ "blake" ], + "blockTemplateRpcExtraParams": [ + "blake" + ], "explorerBlockLink": "https://verge-blockchain.info/block/$hash$", "explorerTxLink": "https://verge-blockchain.info/tx/{0}", "explorerAccountLink": "https://verge-blockchain.info/address/{0}" }, - "verge-groestl": { "name": "Verge Groestl", "canonicalName": "Verge", @@ -2990,24 +3002,28 @@ "hash": "sha256d" }, "headerHasher": { - "hash": "groestlmyriad" + "hash": "groestl-myriad" }, "blockHasher": { "hash": "reverse", "args": [ { "hash": "scrypt", - "args": [ 1024, 1 ] + "args": [ + 1024, + 1 + ] } ] }, "isPseudoPoS": true, - "blockTemplateRpcExtraParams": [ "groestl" ], + "blockTemplateRpcExtraParams": [ + "groestl" + ], "explorerBlockLink": "https://verge-blockchain.info/block/$hash$", "explorerTxLink": "https://verge-blockchain.info/tx/{0}", "explorerAccountLink": "https://verge-blockchain.info/address/{0}" }, - "vertcoin": { "name": "Vertcoin", "symbol": "VTC", @@ -3025,14 +3041,17 @@ }, "blockHasher": { "hash": "reverse", - "args": [ { "hash": "sha256d" } ] + "args": [ + { + "hash": "sha256d" + } + ] }, "shareMultiplier": 256, "explorerBlockLink": "https://chainz.cryptoid.info/vtc/block.dws?$height$.htm", "explorerTxLink": "https://chainz.cryptoid.info/vtc/tx.dws?{0}.htm", "explorerAccountLink": "https://chainz.cryptoid.info/vtc/address.dws?{0}.htm" }, - "viacoin": { "name": "Viacoin", "canonicalName": "Viacoin", @@ -3048,18 +3067,28 @@ }, "headerHasher": { "hash": "scrypt", - "args": [ 1024, 1 ] + "args": [ + 1024, + 1 + ] }, "blockHasher": { "hash": "reverse", - "args": [ { "hash": "sha256d" } ] + "args": [ + { + "hash": "sha256d" + } + ] }, "posBlockHasher": { "hash": "reverse", "args": [ { "hash": "scrypt", - "args": [ 1024, 1 ] + "args": [ + 1024, + 1 + ] } ] }, @@ -3068,7 +3097,6 @@ "explorerTxLink": "https://chainz.cryptoid.info/via/tx.dws?{0}.htm", "explorerAccountLink": "https://chainz.cryptoid.info/via/address.dws?{0}.htm" }, - "voltpotcoin": { "name": "Volt Pot Coin", "canonicalName": "Auroracoin", @@ -3084,18 +3112,28 @@ }, "headerHasher": { "hash": "scrypt", - "args": [ 1024, 1 ] + "args": [ + 1024, + 1 + ] }, "blockHasher": { "hash": "reverse", - "args": [ { "hash": "sha256d" } ] + "args": [ + { + "hash": "sha256d" + } + ] }, "posBlockHasher": { "hash": "reverse", "args": [ { "hash": "scrypt", - "args": [ 1024, 1 ] + "args": [ + 1024, + 1 + ] } ] }, @@ -3104,7 +3142,6 @@ "explorerTxLink": "https://explorer.voltpot.org/tx/{0}", "explorerAccountLink": "https://explorer.voltpot.org/address/{0}" }, - "widecoin": { "name": "Widecoin", "canonicalName": "Widecoin", @@ -3123,13 +3160,16 @@ }, "blockHasher": { "hash": "reverse", - "args": [ { "hash": "sha256d" } ] + "args": [ + { + "hash": "sha256d" + } + ] }, "explorerBlockLink": "https://explorer.widecoin.org/block-height/$height$", "explorerTxLink": "https://explorer.widecoin.org/tx/{0}", "explorerAccountLink": "https://explorer.widecoin.org/address/{0}" }, - "worldcoin": { "name": "Worldcoin", "canonicalName": "Worldcoin", @@ -3145,18 +3185,24 @@ }, "headerHasher": { "hash": "scrypt", - "args": [ 1024, 1 ] + "args": [ + 1024, + 1 + ] }, "blockHasher": { "hash": "reverse", - "args": [ { "hash": "sha256d" } ] + "args": [ + { + "hash": "sha256d" + } + ] }, "shareMultiplier": 65536, "explorerBlockLink": "https://chainz.cryptoid.info/wdc/block.dws?$height$.htm", "explorerTxLink": "https://chainz.cryptoid.info/wdc/tx.dws?{0}.htm", "explorerAccountLink": "https://chainz.cryptoid.info/wdc/address.dws?{0}.htm" }, - "xenios": { "name": "Xenios", "canonicalName": "Xenios", @@ -3175,14 +3221,17 @@ }, "blockHasher": { "hash": "reverse", - "args": [ { "hash": "x11" } ] + "args": [ + { + "hash": "x11" + } + ] }, "hasMasterNodes": true, "explorerBlockLink": "http://blockexplorer.xenioscoin.com/block/$hash$", "explorerTxLink": "http://blockexplorer.xenioscoin.com/tx/{0}", "explorerAccountLink": "http://blockexplorer.xenioscoin.com/address/{0}" }, - "xazab": { "name": "Xazab", "canonicalName": "Xazab", @@ -3201,40 +3250,17 @@ }, "blockHasher": { "hash": "reverse", - "args": [ { "hash": "x11" } ] + "args": [ + { + "hash": "x11" + } + ] }, "hasMasterNodes": true, "explorerBlockLink": "https://explorer.xazab.xyz/insight/block/$height$", "explorerTxLink": "https://explorer.xazab.xyz/insight/tx/{0}", "explorerAccountLink": "https://explorer.xazab.xyz/insight/address/{0}" }, - - "yenten": { - "name": "Yenten", - "canonicalName": "Yenten", - "symbol": "YTN", - "family": "bitcoin", - "website": "http://yentencoin.info/", - "market": "https://coinmarketcap.com/currencies/yenten", - "twitter": "https://twitter.com/yentencoin", - "telegram": "https://t.me/yenten", - "discord": "https://discord.gg/RTbPxu3", - "coinbaseHasher": { - "hash": "sha256d" - }, - "headerHasher": { - "hash": "yespowerr16" - }, - "blockHasher": { - "hash": "reverse", - "args": [ { "hash": "yespowerr16" } ] - }, - "shareMultiplier": 65536, - "explorerBlockLink": "http://ytn.ccore.online/block/$height$", - "explorerTxLink": "http://ytn.ccore.online/transaction/{0}", - "explorerAccountLink": "http://ytn.ccore.online/address/{0}" - }, - "yerbas": { "name": "Yerbas", "canonicalName": "Yerbas", @@ -3252,16 +3278,19 @@ }, "blockHasher": { "hash": "reverse", - "args": [ { "hash": "sha256d" } ] + "args": [ + { + "hash": "sha256d" + } + ] }, "hasFounderFee": true, - "hasMasterNodes": true, + "hasMasterNodes": true, "shareMultiplier": 65536, "explorerBlockLink": "https://explorer.yerbas.org/block/$height$", "explorerTxLink": "https://explorer.yerbas.org/tx/{0}", "explorerAccountLink": "https://explorer.yerbas.org/address/{0}" }, - "zetacoin": { "name": "Zetacoin", "canonicalName": "Zetacoin", @@ -3280,13 +3309,16 @@ }, "blockHasher": { "hash": "reverse", - "args": [ { "hash": "sha256d" } ] + "args": [ + { + "hash": "sha256d" + } + ] }, "explorerBlockLink": "https://chainz.cryptoid.info/zet/block.dws?$height$.htm", "explorerTxLink": "https://chainz.cryptoid.info/zet/tx.dws?{0}.htm", "explorerAccountLink": "https://chainz.cryptoid.info/zet/address.dws?{0}.htm" }, - "bitcoin-gold": { "name": "Bitcoin Gold", "canonicalName": "Bitcoin Gold", @@ -3304,7 +3336,11 @@ "solutionPreambleSize": 1, "solver": { "hash": "equihash", - "args": [ 144, 5, "BgoldPoW" ] + "args": [ + 144, + 5, + "BgoldPoW" + ] }, "coinbaseTxNetwork": "main", "payFoundersReward": false @@ -3315,7 +3351,11 @@ "solutionPreambleSize": 1, "solver": { "hash": "equihash", - "args": [ 144, 5, "BgoldPoW" ] + "args": [ + 144, + 5, + "BgoldPoW" + ] }, "coinbaseTxNetwork": "testnet", "payFoundersReward": false @@ -3326,7 +3366,11 @@ "solutionPreambleSize": 1, "solver": { "hash": "equihash", - "args": [ 144, 5, "BgoldPoW" ] + "args": [ + 144, + 5, + "BgoldPoW" + ] }, "coinbaseTxNetwork": "regtest", "payFoundersReward": false @@ -3338,7 +3382,6 @@ "explorerTxLink": "https://explorer.bitcoingold.org/insight/tx/{0}", "explorerAccountLink": "https://explorer.bitcoingold.org/insight/address/{0}" }, - "flux": { "name": "Flux", "canonicalName": "Flux", @@ -3356,7 +3399,11 @@ "solutionPreambleSize": 1, "solver": { "hash": "equihash", - "args": [ 144, 5, "BgoldPoW" ] + "args": [ + 144, + 5, + "BgoldPoW" + ] }, "coinbaseTxNetwork": "main", "payFoundersReward": false @@ -3367,7 +3414,11 @@ "solutionPreambleSize": 1, "solver": { "hash": "equihash", - "args": [ 144, 5, "BgoldPoW" ] + "args": [ + 144, + 5, + "BgoldPoW" + ] }, "coinbaseTxNetwork": "testnet", "payFoundersReward": false @@ -3378,7 +3429,11 @@ "solutionPreambleSize": 1, "solver": { "hash": "equihash", - "args": [ 144, 5, "BgoldPoW" ] + "args": [ + 144, + 5, + "BgoldPoW" + ] }, "coinbaseTxNetwork": "regtest", "payFoundersReward": false @@ -3390,7 +3445,6 @@ "explorerTxLink": "https://explorer.bitcoingold.org/insight/tx/{0}", "explorerAccountLink": "https://explorer.bitcoingold.org/insight/address/{0}" }, - "bitcoin-private": { "name": "Bitcoin Private", "symbol": "BTCP", @@ -3407,7 +3461,11 @@ "solutionPreambleSize": 3, "solver": { "hash": "equihash", - "args": [ 200, 9, "ZcashPoW" ] + "args": [ + 200, + 9, + "ZcashPoW" + ] }, "coinbaseTxNetwork": "main", "payFoundersReward": false @@ -3418,7 +3476,11 @@ "solutionPreambleSize": 3, "solver": { "hash": "equihash", - "args": [ 200, 9, "ZcashPoW" ] + "args": [ + 200, + 9, + "ZcashPoW" + ] }, "coinbaseTxNetwork": "testnet", "payFoundersReward": false @@ -3429,7 +3491,11 @@ "solutionPreambleSize": 3, "solver": { "hash": "equihash", - "args": [ 200, 9, "ZcashPoW" ] + "args": [ + 200, + 9, + "ZcashPoW" + ] }, "coinbaseTxNetwork": "regtest", "payFoundersReward": false @@ -3441,7 +3507,6 @@ "explorerTxLink": "https://explorer.btcprivate.org/tx/{0}", "explorerAccountLink": "https://explorer.btcprivate.org/address/{0}" }, - "bithereum": { "name": "Bithereum", "symbol": "BTH", @@ -3458,7 +3523,11 @@ "solutionPreambleSize": 1, "solver": { "hash": "equihash", - "args": [ 144, 5, "BethdPoW" ] + "args": [ + 144, + 5, + "BethdPoW" + ] }, "coinbaseTxNetwork": "main", "payFoundersReward": false @@ -3469,7 +3538,11 @@ "solutionPreambleSize": 1, "solver": { "hash": "equihash", - "args": [ 144, 5, "BethdPoW" ] + "args": [ + 144, + 5, + "BethdPoW" + ] }, "coinbaseTxNetwork": "testnet", "payFoundersReward": false @@ -3480,7 +3553,11 @@ "solutionPreambleSize": 1, "solver": { "hash": "equihash", - "args": [ 144, 5, "BethdPoW" ] + "args": [ + 144, + 5, + "BethdPoW" + ] }, "coinbaseTxNetwork": "regtest", "payFoundersReward": false @@ -3492,7 +3569,6 @@ "explorerTxLink": "https://explorer.bithereum.network/tx/{0}", "explorerAccountLink": "https://explorer.bithereum.network/address/{0}" }, - "minexcoin": { "name": "Minexcoin", "symbol": "MNX", @@ -3509,7 +3585,11 @@ "solutionPreambleSize": 1, "solver": { "hash": "equihash", - "args": [ 96, 5, "ZcashPoW" ] + "args": [ + 96, + 5, + "ZcashPoW" + ] }, "coinbaseTxNetwork": "main", "payFoundersReward": false @@ -3520,7 +3600,11 @@ "solutionPreambleSize": 1, "solver": { "hash": "equihash", - "args": [ 96, 5, "ZcashPoW" ] + "args": [ + 96, + 5, + "ZcashPoW" + ] }, "coinbaseTxNetwork": "testnet", "payFoundersReward": false @@ -3531,7 +3615,11 @@ "solutionPreambleSize": 1, "solver": { "hash": "equihash", - "args": [ 96, 5, "ZcashPoW" ] + "args": [ + 96, + 5, + "ZcashPoW" + ] }, "coinbaseTxNetwork": "regtest", "payFoundersReward": false @@ -3543,7 +3631,6 @@ "explorerTxLink": "https://minexexplorer.com/transactions/view?hash={0}", "explorerAccountLink": "https://minexexplorer.com/address?hash={0}" }, - "veruscoin": { "name": "Veruscoin", "symbol": "VRSC", @@ -3560,7 +3647,11 @@ "solutionPreambleSize": 3, "solver": { "hash": "equihash", - "args": [ 200, 9, "Verushash" ] + "args": [ + 200, + 9, + "Verushash" + ] }, "coinbaseTxNetwork": "main", "payFoundersReward": false, @@ -3577,7 +3668,11 @@ "solutionPreambleSize": 3, "solver": { "hash": "equihash", - "args": [ 200, 9, "Verushash" ] + "args": [ + 200, + 9, + "Verushash" + ] }, "coinbaseTxNetwork": "testnet", "payFoundersReward": false @@ -3588,7 +3683,11 @@ "solutionPreambleSize": 3, "solver": { "hash": "equihash", - "args": [ 200, 9, "Verushash" ] + "args": [ + 200, + 9, + "Verushash" + ] }, "coinbaseTxNetwork": "regtest", "payFoundersReward": false @@ -3600,7 +3699,6 @@ "explorerTxLink": "https://explorer.veruscoin.io/tx/{0}", "explorerAccountLink": "https://explorer.veruscoin.io/address/{0}" }, - "zcash": { "name": "ZCash", "symbol": "ZEC", @@ -3617,7 +3715,11 @@ "solutionPreambleSize": 3, "solver": { "hash": "equihash", - "args": [ 200, 9, "ZcashPoW" ] + "args": [ + 200, + 9, + "ZcashPoW" + ] }, "coinbaseTxNetwork": "zcash-main", "payFoundersReward": true, @@ -3688,7 +3790,11 @@ "solutionPreambleSize": 3, "solver": { "hash": "equihash", - "args": [ 200, 9, "ZcashPoW" ] + "args": [ + 200, + 9, + "ZcashPoW" + ] }, "coinbaseTxNetwork": "zcash-test", "payFoundersReward": true, @@ -3759,12 +3865,18 @@ "solutionPreambleSize": 3, "solver": { "hash": "equihash", - "args": [ 200, 9, "ZcashPoW" ] + "args": [ + 200, + 9, + "ZcashPoW" + ] }, "coinbaseTxNetwork": "zcash-reg", "payFoundersReward": true, "percentFoundersReward": 20, - "foundersRewardAddresses": [ "t2FwcEhFdNXuFMv1tcYwaBJtYVtMj8b1uTg" ], + "foundersRewardAddresses": [ + "t2FwcEhFdNXuFMv1tcYwaBJtYVtMj8b1uTg" + ], "foundersRewardSubsidyHalvingInterval": 150 } }, @@ -3774,7 +3886,6 @@ "explorerTxLink": "https://explorer.zcha.in/transactions/{0}", "explorerAccountLink": "https://explorer.zcha.in/accounts/{0}" }, - "zclassic": { "name": "ZClassic", "symbol": "ZCL", @@ -3791,7 +3902,11 @@ "solutionPreambleSize": 3, "solver": { "hash": "equihash", - "args": [ 200, 9, "ZcashPoW" ] + "args": [ + 200, + 9, + "ZcashPoW" + ] }, "coinbaseTxNetwork": "main", "payFoundersReward": false @@ -3802,7 +3917,11 @@ "solutionPreambleSize": 3, "solver": { "hash": "equihash", - "args": [ 200, 9, "ZcashPoW" ] + "args": [ + 200, + 9, + "ZcashPoW" + ] }, "coinbaseTxNetwork": "testnet", "payFoundersReward": false @@ -3813,7 +3932,11 @@ "solutionPreambleSize": 3, "solver": { "hash": "equihash", - "args": [ 200, 9, "ZcashPoW" ] + "args": [ + 200, + 9, + "ZcashPoW" + ] }, "coinbaseTxNetwork": "regtest", "payFoundersReward": false @@ -3825,7 +3948,6 @@ "explorerTxLink": "http://explorer.zclmine.pro/transactions/{0}", "explorerAccountLink": "http://explorer.zclmine.pro/accounts/{0}" }, - "zencash": { "name": "Zencash", "symbol": "ZEN", @@ -3842,7 +3964,11 @@ "solutionPreambleSize": 3, "solver": { "hash": "equihash", - "args": [ 200, 9, "ZcashPoW" ] + "args": [ + 200, + 9, + "ZcashPoW" + ] }, "coinbaseTxNetwork": "main", "payFoundersReward": true, @@ -3915,7 +4041,11 @@ "solutionPreambleSize": 3, "solver": { "hash": "equihash", - "args": [ 200, 9, "ZcashPoW" ] + "args": [ + 200, + 9, + "ZcashPoW" + ] }, "coinbaseTxNetwork": "testnet", "payFoundersReward": true, @@ -3988,16 +4118,24 @@ "solutionPreambleSize": 3, "solver": { "hash": "equihash", - "args": [ 200, 9, "ZcashPoW" ] + "args": [ + 200, + 9, + "ZcashPoW" + ] }, "coinbaseTxNetwork": "regtest", "payFoundersReward": true, "percentFoundersReward": 8.5, - "foundersRewardAddresses": [ "zrKmSdqZKZjnARd5e8FfRg4v1m74X7twxGa" ], + "foundersRewardAddresses": [ + "zrKmSdqZKZjnARd5e8FfRg4v1m74X7twxGa" + ], "foundersRewardSubsidyHalvingInterval": 2000, "percentTreasuryReward": 12, "treasuryRewardStartBlockHeight": 139200, - "treasuryRewardAddresses": [ "zrKmSdqZKZjnARd5e8FfRg4v1m74X7twxGa" ], + "treasuryRewardAddresses": [ + "zrKmSdqZKZjnARd5e8FfRg4v1m74X7twxGa" + ], "treasuryRewardAddressChangeInterval": 100 } }, @@ -4007,7 +4145,6 @@ "explorerTxLink": "http://explorer.zensystem.io/transactions/{0}", "explorerAccountLink": "http://explorer.zensystem.io/accounts/{0}" }, - "monero": { "name": "Monero", "canonicalName": "Monero", @@ -4033,7 +4170,6 @@ "explorerBlockLink": "https://www.exploremonero.com/block/$height$", "explorerTxLink": "https://www.exploremonero.com/transaction/{0}" }, - "callisto": { "name": "Callisto Network", "canonicalName": "Callisto-Network", @@ -4051,7 +4187,6 @@ "explorerTxLink": "https://explorer.callisto.network/tx/{0}", "explorerAccountLink": "https://explorer.callisto.network/address/{0}" }, - "ethereum": { "name": "Ethereum", "canonicalName": "Ethereum", @@ -4069,7 +4204,6 @@ "explorerTxLink": "https://etherscan.io/tx/{0}", "explorerAccountLink": "https://etherscan.io/address/{0}" }, - "ethereum-pow": { "name": "EthereumPoW", "canonicalName": "EthereumPoW", @@ -4087,7 +4221,6 @@ "explorerTxLink": "https://www.oklink.com/en/ethw/tx/{0}", "explorerAccountLink": "https://www.oklink.com/en/ethw/address/{0}" }, - "ergo": { "name": "Ergo", "canonicalName": "Ergo", From 6488d5d84bed96c4198a922ece9af24018c5e903 Mon Sep 17 00:00:00 2001 From: Oliver Weichhold Date: Sat, 8 Oct 2022 12:09:40 +0200 Subject: [PATCH 10/54] Nuget package upgrade --- src/Miningcore.Tests/Miningcore.Tests.csproj | 4 ++-- src/Miningcore/Miningcore.csproj | 16 ++++++++-------- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/src/Miningcore.Tests/Miningcore.Tests.csproj b/src/Miningcore.Tests/Miningcore.Tests.csproj index 1f77735bb..885134473 100644 --- a/src/Miningcore.Tests/Miningcore.Tests.csproj +++ b/src/Miningcore.Tests/Miningcore.Tests.csproj @@ -35,10 +35,10 @@ - + - + diff --git a/src/Miningcore/Miningcore.csproj b/src/Miningcore/Miningcore.csproj index 8cbdf18b5..0dd0f1e18 100644 --- a/src/Miningcore/Miningcore.csproj +++ b/src/Miningcore/Miningcore.csproj @@ -51,21 +51,21 @@ - - + + - + all runtime; build; native; contentfiles; analyzers; buildtransitive - + - + - + - + @@ -80,7 +80,7 @@ - + From b94810a723b436029a8ee7720858d7739f64731a Mon Sep 17 00:00:00 2001 From: Oliver Weichhold Date: Sat, 8 Oct 2022 12:19:41 +0200 Subject: [PATCH 11/54] nuget --- src/Miningcore/Miningcore.csproj | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Miningcore/Miningcore.csproj b/src/Miningcore/Miningcore.csproj index 0dd0f1e18..726ba6ec9 100644 --- a/src/Miningcore/Miningcore.csproj +++ b/src/Miningcore/Miningcore.csproj @@ -53,7 +53,7 @@ - + all runtime; build; native; contentfiles; analyzers; buildtransitive From e6b7f881b354f026375ac8e1fb574264f024fb82 Mon Sep 17 00:00:00 2001 From: Oliver Weichhold Date: Sat, 8 Oct 2022 17:46:26 +0200 Subject: [PATCH 12/54] WIP --- .../Blockchain/Bitcoin/BitcoinJobTests.cs | 20 +++++++++++++++++++ .../Postgres/Repositories/ShareRepository.cs | 3 +-- src/Miningcore/Program.cs | 17 ++++++++++------ 3 files changed, 32 insertions(+), 8 deletions(-) create mode 100644 src/Miningcore.Tests/Blockchain/Bitcoin/BitcoinJobTests.cs diff --git a/src/Miningcore.Tests/Blockchain/Bitcoin/BitcoinJobTests.cs b/src/Miningcore.Tests/Blockchain/Bitcoin/BitcoinJobTests.cs new file mode 100644 index 000000000..dca0ec5b9 --- /dev/null +++ b/src/Miningcore.Tests/Blockchain/Bitcoin/BitcoinJobTests.cs @@ -0,0 +1,20 @@ +using System.Threading.Tasks; +using Miningcore.Blockchain.Bitcoin; +using Xunit; +#pragma warning disable 8974 + +namespace Miningcore.Tests.Blockchain.Bitcoin; + +public class BitcoinJobTests : TestBase +{ + [Fact] + public void Process_Valid_Share() + { + var job = new BitcoinJob(); + + // job.Init(blockTemplate, NextJobId(), + // poolConfig, extraPoolConfig, clusterConfig, clock, poolAddressDestination, network, isPoS, + // ShareMultiplier, coin.CoinbaseHasherValue, coin.HeaderHasherValue, + // !isPoS ? coin.BlockHasherValue : coin.PoSBlockHasherValue ?? coin.BlockHasherValue); + } +} diff --git a/src/Miningcore/Persistence/Postgres/Repositories/ShareRepository.cs b/src/Miningcore/Persistence/Postgres/Repositories/ShareRepository.cs index bd278d82b..f06d6ed7f 100644 --- a/src/Miningcore/Persistence/Postgres/Repositories/ShareRepository.cs +++ b/src/Miningcore/Persistence/Postgres/Repositories/ShareRepository.cs @@ -77,7 +77,7 @@ public Task CountSharesByMinerAsync(IDbConnection con, IDbTransaction tx, public Task GetEffortBetweenCreatedAsync(IDbConnection con, string poolId, double shareConst, DateTime start, DateTime end) { - const string query = "SELECT SUM((difficulty*@shareConst)/(networkdifficulty)) FROM shares WHERE poolid = @poolId AND created > @start AND created < @end"; + const string query = "SELECT SUM((difficulty * @shareConst) / networkdifficulty) FROM shares WHERE poolid = @poolId AND created > @start AND created < @end"; return con.QuerySingleAsync(query, new { poolId, shareConst, start, end }); } @@ -144,4 +144,3 @@ public async Task GetRecentyUsedIpAddressesAsync(IDbConnection con, ID .ToArray(); } } - diff --git a/src/Miningcore/Program.cs b/src/Miningcore/Program.cs index 94f3feff0..17ebc5aed 100644 --- a/src/Miningcore/Program.cs +++ b/src/Miningcore/Program.cs @@ -365,12 +365,15 @@ protected override async Task ExecuteAsync(CancellationToken ct) var coinTemplates = LoadCoinTemplates(); logger.Info($"{coinTemplates.Keys.Count} coins loaded from '{string.Join(", ", clusterConfig.CoinTemplates)}'"); - await Guard(()=> Task.WhenAll(clusterConfig.Pools + var tasks = clusterConfig.Pools .Where(config => config.Enabled) - .Select(config => RunPool(config, coinTemplates, ct))), - ex => + .Select(config => RunPool(config, coinTemplates, ct)); + + await Guard(()=> Task.WhenAll(tasks), ex => + { + switch(ex) { - if(ex is PoolStartupException pse) + case PoolStartupException pse: { var _logger = pse.PoolId != null ? LogUtil.GetPoolScopedLogger(GetType(), pse.PoolId) : logger; _logger.Error(() => $"{pse.Message}"); @@ -378,11 +381,13 @@ await Guard(()=> Task.WhenAll(clusterConfig.Pools logger.Error(() => "Cluster cannot start. Good Bye!"); hal.StopApplication(); + break; } - else + default: throw ex; - }); + } + }); } private async Task RunPool(PoolConfig poolConfig, Dictionary coinTemplates, CancellationToken ct) From 3f3e0575726c5154e5ee044234bc6cc88d0262ab Mon Sep 17 00:00:00 2001 From: kr1z1s Date: Sun, 9 Oct 2022 16:21:06 +0300 Subject: [PATCH 13/54] ETHW transactions sending fix --- src/Miningcore/Blockchain/Ethereum/EthereumPayoutHandler.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Miningcore/Blockchain/Ethereum/EthereumPayoutHandler.cs b/src/Miningcore/Blockchain/Ethereum/EthereumPayoutHandler.cs index 9f8c18992..ebd48ee9a 100644 --- a/src/Miningcore/Blockchain/Ethereum/EthereumPayoutHandler.cs +++ b/src/Miningcore/Blockchain/Ethereum/EthereumPayoutHandler.cs @@ -125,7 +125,7 @@ public async Task ClassifyBlocksAsync(IMiningPool pool, Block[] blocks, var gasUsed = blockHashResponse.Response.GasUsed; var burnedFee = (decimal) 0; - if(extraPoolConfig?.ChainTypeOverride == "Ethereum") + if(extraPoolConfig?.ChainTypeOverride == "Ethereum" || extraPoolConfig?.ChainTypeOverride == "MainPow") burnedFee = (baseGas * gasUsed / EthereumConstants.Wei); block.Hash = blockHash; @@ -393,7 +393,7 @@ private async Task PayoutAsync(Balance balance, CancellationToken ct) Value = amount.ToString("x").TrimStart('0'), }; - if(extraPoolConfig?.ChainTypeOverride == "Ethereum") + if(extraPoolConfig?.ChainTypeOverride == "Ethereum" || extraPoolConfig?.ChainTypeOverride == "MainPow") { var maxPriorityFeePerGas = await rpcClient.ExecuteAsync(logger, EC.MaxPriorityFeePerGas, ct); request.Gas = extraConfig.Gas; From 2fd7e1499d422724d30d02067cb099b03f90abde Mon Sep 17 00:00:00 2001 From: Oliver Weichhold Date: Mon, 10 Oct 2022 19:54:34 +0200 Subject: [PATCH 14/54] BitcoinJob tests --- .../Blockchain/Bitcoin/BitcoinJobTests.cs | 117 +++++++++++++++++- src/Miningcore.Tests/TestBase.cs | 9 ++ src/Miningcore.Tests/Util/MockMasterClock.cs | 8 ++ 3 files changed, 129 insertions(+), 5 deletions(-) diff --git a/src/Miningcore.Tests/Blockchain/Bitcoin/BitcoinJobTests.cs b/src/Miningcore.Tests/Blockchain/Bitcoin/BitcoinJobTests.cs index dca0ec5b9..6ad182da5 100644 --- a/src/Miningcore.Tests/Blockchain/Bitcoin/BitcoinJobTests.cs +++ b/src/Miningcore.Tests/Blockchain/Bitcoin/BitcoinJobTests.cs @@ -1,5 +1,16 @@ +using System; +using System.Diagnostics; +using System.Globalization; using System.Threading.Tasks; +using Autofac; +using Microsoft.IO; using Miningcore.Blockchain.Bitcoin; +using Miningcore.Configuration; +using Miningcore.Stratum; +using Miningcore.Tests.Util; +using NBitcoin; +using Newtonsoft.Json; +using NLog; using Xunit; #pragma warning disable 8974 @@ -8,13 +19,109 @@ namespace Miningcore.Tests.Blockchain.Bitcoin; public class BitcoinJobTests : TestBase { [Fact] - public void Process_Valid_Share() + public void Process_Valid_Block() + { + var (job, con) = CreateJob(); + + var submitParams = JsonConvert.DeserializeObject("[\"yXHmbak4AdgK5vWamwqFtEijn2NpgLvmi4\",\"00000001\",\"01000000\",\"63445774\",\"51036775\"]", jsonSerializerSettings); + + // extract params + var extraNonce2 = submitParams[2] as string; + var nTime = submitParams[3] as string; + var nonce = submitParams[4] as string; + + // validate & process + var (share, blockHex) = job.ProcessShare(con, extraNonce2, nTime, nonce); + + Assert.NotNull(share); + Assert.Equal("00000056300e9fd18624edd7eaa8bcd6c8466d7eb8cf91b4e60f9d35fa97f504", share.BlockHash); + Assert.Equal("000000204b0e40a0b523ec3d00fc1a7cee084165a111646b9b35e50936ada1861a0100000362a84c2b4b2e530ec640e2a7f85e05da2c42c8e3645a5bbc2245e74ec1ae967457446371d7011e756703510103000500010000000000000000000000000000000000000000000000000000000000000000ffffffff1d03b66a0c04745744630060000001010000000a4d696e696e67636f7265000000000241016d40000000001976a91464f2b2b84f62d68a2cd7f7f5fb2b5aa75ef716d788ac2c56f32a000000001976a9141a9cab092e161f3822af4b27f4f33051dbb7d32088ac00000000460200b66a0c00fbab6816312c05803d026cce30fec0332c059f66e421ab0bf65b96ea9efb8a22e12cfc31666208b47a006e5b74f95a4c0797b6bc620ea1cc07cb53616e547302", blockHex); + Assert.Equal(813750, share.BlockHeight); + Assert.True(share.IsBlockCandidate); + } + + [Fact] + public void Process_Duplicate_Submission() + { + var (job, con) = CreateJob(); + + var submitParams = JsonConvert.DeserializeObject("[\"yXHmbak4AdgK5vWamwqFtEijn2NpgLvmi4\",\"00000001\",\"01000000\",\"63445774\",\"51036775\"]", jsonSerializerSettings); + + // extract params + var extraNonce2 = submitParams[2] as string; + var nTime = submitParams[3] as string; + var nonce = submitParams[4] as string; + + // validate & process + var (share, blockHex) = job.ProcessShare(con, extraNonce2, nTime, nonce); + + Assert.NotNull(share); + Assert.True(share.IsBlockCandidate); + + Assert.ThrowsAny(()=> job.ProcessShare(con, extraNonce2, nTime, nonce)); + } + + [Fact] + public void Process_Invalid_Nonce() + { + var (job, con) = CreateJob(); + + var submitParams = JsonConvert.DeserializeObject("[\"yXHmbak4AdgK5vWamwqFtEijn2NpgLvmi4\",\"00000001\",\"01000000\",\"63445774\",\"61036775\"]", jsonSerializerSettings); + + // extract params + var extraNonce2 = submitParams[2] as string; + var nTime = submitParams[3] as string; + var nonce = submitParams[4] as string; + + // validate & process + Assert.ThrowsAny(()=> job.ProcessShare(con, extraNonce2, nTime, nonce)); + } + + [Fact] + public void Process_Invalid_Time() + { + var (job, con) = CreateJob(); + + var submitParams = JsonConvert.DeserializeObject("[\"yXHmbak4AdgK5vWamwqFtEijn2NpgLvmi4\",\"00000001\",\"01000000\",\"13445774\",\"51036775\"]", jsonSerializerSettings); + + // extract params + var extraNonce2 = submitParams[2] as string; + var nTime = submitParams[3] as string; + var nonce = submitParams[4] as string; + + // validate & process + Assert.ThrowsAny(()=> job.ProcessShare(con, extraNonce2, nTime, nonce)); + } + + private (BitcoinJob, StratumConnection) CreateJob() { var job = new BitcoinJob(); - // job.Init(blockTemplate, NextJobId(), - // poolConfig, extraPoolConfig, clusterConfig, clock, poolAddressDestination, network, isPoS, - // ShareMultiplier, coin.CoinbaseHasherValue, coin.HeaderHasherValue, - // !isPoS ? coin.BlockHasherValue : coin.PoSBlockHasherValue ?? coin.BlockHasherValue); + var coin = ModuleInitializer.CoinTemplates["dash"] as BitcoinTemplate; + var pc = new PoolConfig + { + Template = coin + }; + + var blockTemplate = JsonConvert.DeserializeObject("{\"version\":536870912,\"previousBlockhash\":\"0000011a86a1ad3609e5359b6b6411a1654108ee7c1afc003dec23b5a0400e4b\",\"coinbaseValue\":1801475949,\"target\":\"000001d771000000000000000000000000000000000000000000000000000000\",\"nonceRange\":\"00000000ffffffff\",\"curTime\":1665423220,\"bits\":\"1e01d771\",\"height\":813750,\"transactions\":[],\"coinbaseAux\":{\"flags\":null},\"default_witness_commitment\":null,\"capabilities\":[\"proposal\"],\"rules\":[\"csv\",\"dip0001\",\"bip147\",\"dip0003\",\"dip0008\",\"realloc\",\"dip0020\",\"dip0024\"],\"vbavailable\":{},\"vbrequired\":0,\"longpollid\":\"0000011a86a1ad3609e5359b6b6411a1654108ee7c1afc003dec23b5a0400e4b814670\",\"mintime\":1665422408,\"mutable\":[\"time\",\"transactions\",\"prevblock\"],\"sigoplimit\":40000,\"sizelimit\":2000000,\"previousbits\":\"1e01bee4\",\"masternode\":[{\"payee\":\"yVXDAM73Tg6A44Bm3qduXsMCYxzuqBCT48\",\"script\":\"76a91464f2b2b84f62d68a2cd7f7f5fb2b5aa75ef716d788ac\",\"amount\":1080885569}],\"masternode_payments_started\":true,\"masternode_payments_enforced\":true,\"superblock\":[],\"superblocks_started\":true,\"superblocks_enabled\":true,\"coinbase_payload\":\"0200b66a0c00fbab6816312c05803d026cce30fec0332c059f66e421ab0bf65b96ea9efb8a22e12cfc31666208b47a006e5b74f95a4c0797b6bc620ea1cc07cb53616e547302\"}", jsonSerializerSettings); + var clock = MockMasterClock.FromTicks(638010200200475015); + var poolAddressDestination = BitcoinUtils.AddressToDestination("yNkA6gVSPqKzW6WmJtTazRLKbSkQA5ND2h", Network.TestNet); + var network = Network.GetNetwork("testnet"); + + var context = new BitcoinWorkerContext + { + Miner = "yXHmbak4AdgK5vWamwqFtEijn2NpgLvmi4", + ExtraNonce1 = "60000001", + Difficulty = 0.01, + UserAgent = "cpuminer-multi/1.3.1" + }; + + var con = new StratumConnection(new NullLogger(LogManager.LogFactory), container.Resolve(), clock, "1", false); + con.SetContext(context); + + job.Init(blockTemplate, "1", pc, null, new ClusterConfig(), clock, poolAddressDestination, network, false, + coin.ShareMultiplier, coin.CoinbaseHasherValue, coin.HeaderHasherValue, coin.BlockHasherValue); + + return (job, con); } } diff --git a/src/Miningcore.Tests/TestBase.cs b/src/Miningcore.Tests/TestBase.cs index 1e89becd9..6c1b3dbfd 100644 --- a/src/Miningcore.Tests/TestBase.cs +++ b/src/Miningcore.Tests/TestBase.cs @@ -1,3 +1,6 @@ +using Autofac; +using Newtonsoft.Json; + namespace Miningcore.Tests; public abstract class TestBase @@ -5,5 +8,11 @@ public abstract class TestBase protected TestBase() { ModuleInitializer.Initialize(); + + container = ModuleInitializer.Container; + jsonSerializerSettings = container.Resolve(); } + + protected readonly IContainer container; + protected readonly JsonSerializerSettings jsonSerializerSettings; } diff --git a/src/Miningcore.Tests/Util/MockMasterClock.cs b/src/Miningcore.Tests/Util/MockMasterClock.cs index 705d64b75..0f1e888da 100644 --- a/src/Miningcore.Tests/Util/MockMasterClock.cs +++ b/src/Miningcore.Tests/Util/MockMasterClock.cs @@ -8,4 +8,12 @@ public class MockMasterClock : IMasterClock public DateTime CurrentTime { get; set; } public DateTime Now => CurrentTime; + + public static MockMasterClock FromTicks(long value) + { + return new MockMasterClock + { + CurrentTime = new DateTime(value, DateTimeKind.Utc) + }; + } } From 6d77d6712683408f7d0a058197bf163c239dc969 Mon Sep 17 00:00:00 2001 From: Oliver Weichhold Date: Mon, 10 Oct 2022 22:23:29 +0200 Subject: [PATCH 15/54] nuget update for NBitcoin --- appveyor.yml | 5 +---- src/Miningcore.Tests/Coins/CoinTemplateValidationTest.cs | 2 +- src/Miningcore/Miningcore.csproj | 4 ++-- 3 files changed, 4 insertions(+), 7 deletions(-) diff --git a/appveyor.yml b/appveyor.yml index 5c51ce830..995ebee25 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -22,9 +22,6 @@ build_script: - # Publish - cd Miningcore - dotnet publish -c Release --framework net6.0 - - # Publish Artifacts - - sh: (cd bin/Release/net6.0 && mkdir miningcore && cp -r publish/* miningcore && tar cf miningcore-linux-ubuntu-x64.tar.gz miningcore && appveyor PushArtifact miningcore-linux-ubuntu-x64.tar.gz) - - cmd: cd bin\Release\net6.0 && mkdir miningcore && xcopy publish\* miningcore /S && 7z a miningcore-win-x64.zip miningcore && appveyor PushArtifact miningcore-win-x64.zip && cd ..\..\.. - # Build Tests - cd ../Miningcore.Tests - dotnet build -c Release --framework net6.0 @@ -35,7 +32,7 @@ build_script: # to run tests again only selected assemblies and/or categories test_script: - - dotnet test -c Release --no-build + - dotnet test -l "console;verbosity=detailed" -c Release --no-build before_test: - sh: cp -v $APPVEYOR_BUILD_FOLDER/src/Miningcore/bin/Release/net6.0/publish/*.so $APPVEYOR_BUILD_FOLDER/src/Miningcore.Tests/bin/Release/net6.0/ diff --git a/src/Miningcore.Tests/Coins/CoinTemplateValidationTest.cs b/src/Miningcore.Tests/Coins/CoinTemplateValidationTest.cs index c21fcb4d2..db826f07e 100644 --- a/src/Miningcore.Tests/Coins/CoinTemplateValidationTest.cs +++ b/src/Miningcore.Tests/Coins/CoinTemplateValidationTest.cs @@ -27,7 +27,7 @@ public void Validate_Coin_Templates() { var t = template.Value; - output.WriteLine($"** Testing coin '{t.Name ?? t.Symbol ?? t.CanonicalName}' **"); + output.WriteLine($"* {t.Name ?? t.Symbol ?? t.CanonicalName}"); Assert.NotEmpty(t.Name); Assert.NotEmpty(t.Symbol); diff --git a/src/Miningcore/Miningcore.csproj b/src/Miningcore/Miningcore.csproj index 726ba6ec9..741b6f539 100644 --- a/src/Miningcore/Miningcore.csproj +++ b/src/Miningcore/Miningcore.csproj @@ -70,8 +70,8 @@ - - + + From 28c327acd812994037b86bed5b9e8f086994e0ff Mon Sep 17 00:00:00 2001 From: Oliver Weichhold Date: Mon, 10 Oct 2022 22:41:53 +0200 Subject: [PATCH 16/54] Refactor --- appveyor.yml | 11 +++--- .../Blockchain/Bitcoin/BitcoinJobTests.cs | 36 ++++++++----------- 2 files changed, 21 insertions(+), 26 deletions(-) diff --git a/appveyor.yml b/appveyor.yml index 995ebee25..8b4cd35b0 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -17,12 +17,12 @@ before_build: - dotnet restore build_script: - - # Install Linux build-dependencies + # Install Linux build-dependencies - sh: sudo apt-get update -y && sudo apt-get -y install cmake build-essential libssl-dev pkg-config libboost-all-dev libsodium-dev libzmq5 - - # Publish + # Publish - cd Miningcore - dotnet publish -c Release --framework net6.0 - - # Build Tests + # Build Tests - cd ../Miningcore.Tests - dotnet build -c Release --framework net6.0 @@ -32,11 +32,14 @@ build_script: # to run tests again only selected assemblies and/or categories test_script: - - dotnet test -l "console;verbosity=detailed" -c Release --no-build + - sh: dotnet test -l "console;verbosity=detailed" -c Release --no-build + - cmd: dotnet test -l "console;verbosity=detailed" -c Release --no-build before_test: - sh: cp -v $APPVEYOR_BUILD_FOLDER/src/Miningcore/bin/Release/net6.0/publish/*.so $APPVEYOR_BUILD_FOLDER/src/Miningcore.Tests/bin/Release/net6.0/ +deploy: off + #---------------------------------# # notifications # #---------------------------------# diff --git a/src/Miningcore.Tests/Blockchain/Bitcoin/BitcoinJobTests.cs b/src/Miningcore.Tests/Blockchain/Bitcoin/BitcoinJobTests.cs index 6ad182da5..a4957010c 100644 --- a/src/Miningcore.Tests/Blockchain/Bitcoin/BitcoinJobTests.cs +++ b/src/Miningcore.Tests/Blockchain/Bitcoin/BitcoinJobTests.cs @@ -1,7 +1,3 @@ -using System; -using System.Diagnostics; -using System.Globalization; -using System.Threading.Tasks; using Autofac; using Microsoft.IO; using Miningcore.Blockchain.Bitcoin; @@ -21,7 +17,7 @@ public class BitcoinJobTests : TestBase [Fact] public void Process_Valid_Block() { - var (job, con) = CreateJob(); + var (job, worker) = CreateJob(); var submitParams = JsonConvert.DeserializeObject("[\"yXHmbak4AdgK5vWamwqFtEijn2NpgLvmi4\",\"00000001\",\"01000000\",\"63445774\",\"51036775\"]", jsonSerializerSettings); @@ -31,7 +27,7 @@ public void Process_Valid_Block() var nonce = submitParams[4] as string; // validate & process - var (share, blockHex) = job.ProcessShare(con, extraNonce2, nTime, nonce); + var (share, blockHex) = job.ProcessShare(worker, extraNonce2, nTime, nonce); Assert.NotNull(share); Assert.Equal("00000056300e9fd18624edd7eaa8bcd6c8466d7eb8cf91b4e60f9d35fa97f504", share.BlockHash); @@ -43,7 +39,7 @@ public void Process_Valid_Block() [Fact] public void Process_Duplicate_Submission() { - var (job, con) = CreateJob(); + var (job, worker) = CreateJob(); var submitParams = JsonConvert.DeserializeObject("[\"yXHmbak4AdgK5vWamwqFtEijn2NpgLvmi4\",\"00000001\",\"01000000\",\"63445774\",\"51036775\"]", jsonSerializerSettings); @@ -53,18 +49,18 @@ public void Process_Duplicate_Submission() var nonce = submitParams[4] as string; // validate & process - var (share, blockHex) = job.ProcessShare(con, extraNonce2, nTime, nonce); + var (share, _) = job.ProcessShare(worker, extraNonce2, nTime, nonce); Assert.NotNull(share); Assert.True(share.IsBlockCandidate); - Assert.ThrowsAny(()=> job.ProcessShare(con, extraNonce2, nTime, nonce)); + Assert.ThrowsAny(()=> job.ProcessShare(worker, extraNonce2, nTime, nonce)); } [Fact] public void Process_Invalid_Nonce() { - var (job, con) = CreateJob(); + var (job, worker) = CreateJob(); var submitParams = JsonConvert.DeserializeObject("[\"yXHmbak4AdgK5vWamwqFtEijn2NpgLvmi4\",\"00000001\",\"01000000\",\"63445774\",\"61036775\"]", jsonSerializerSettings); @@ -74,13 +70,13 @@ public void Process_Invalid_Nonce() var nonce = submitParams[4] as string; // validate & process - Assert.ThrowsAny(()=> job.ProcessShare(con, extraNonce2, nTime, nonce)); + Assert.ThrowsAny(()=> job.ProcessShare(worker, extraNonce2, nTime, nonce)); } [Fact] public void Process_Invalid_Time() { - var (job, con) = CreateJob(); + var (job, worker) = CreateJob(); var submitParams = JsonConvert.DeserializeObject("[\"yXHmbak4AdgK5vWamwqFtEijn2NpgLvmi4\",\"00000001\",\"01000000\",\"13445774\",\"51036775\"]", jsonSerializerSettings); @@ -90,18 +86,14 @@ public void Process_Invalid_Time() var nonce = submitParams[4] as string; // validate & process - Assert.ThrowsAny(()=> job.ProcessShare(con, extraNonce2, nTime, nonce)); + Assert.ThrowsAny(()=> job.ProcessShare(worker, extraNonce2, nTime, nonce)); } private (BitcoinJob, StratumConnection) CreateJob() { var job = new BitcoinJob(); - - var coin = ModuleInitializer.CoinTemplates["dash"] as BitcoinTemplate; - var pc = new PoolConfig - { - Template = coin - }; + var coin = (BitcoinTemplate) ModuleInitializer.CoinTemplates["dash"]; + var pc = new PoolConfig { Template = coin }; var blockTemplate = JsonConvert.DeserializeObject("{\"version\":536870912,\"previousBlockhash\":\"0000011a86a1ad3609e5359b6b6411a1654108ee7c1afc003dec23b5a0400e4b\",\"coinbaseValue\":1801475949,\"target\":\"000001d771000000000000000000000000000000000000000000000000000000\",\"nonceRange\":\"00000000ffffffff\",\"curTime\":1665423220,\"bits\":\"1e01d771\",\"height\":813750,\"transactions\":[],\"coinbaseAux\":{\"flags\":null},\"default_witness_commitment\":null,\"capabilities\":[\"proposal\"],\"rules\":[\"csv\",\"dip0001\",\"bip147\",\"dip0003\",\"dip0008\",\"realloc\",\"dip0020\",\"dip0024\"],\"vbavailable\":{},\"vbrequired\":0,\"longpollid\":\"0000011a86a1ad3609e5359b6b6411a1654108ee7c1afc003dec23b5a0400e4b814670\",\"mintime\":1665422408,\"mutable\":[\"time\",\"transactions\",\"prevblock\"],\"sigoplimit\":40000,\"sizelimit\":2000000,\"previousbits\":\"1e01bee4\",\"masternode\":[{\"payee\":\"yVXDAM73Tg6A44Bm3qduXsMCYxzuqBCT48\",\"script\":\"76a91464f2b2b84f62d68a2cd7f7f5fb2b5aa75ef716d788ac\",\"amount\":1080885569}],\"masternode_payments_started\":true,\"masternode_payments_enforced\":true,\"superblock\":[],\"superblocks_started\":true,\"superblocks_enabled\":true,\"coinbase_payload\":\"0200b66a0c00fbab6816312c05803d026cce30fec0332c059f66e421ab0bf65b96ea9efb8a22e12cfc31666208b47a006e5b74f95a4c0797b6bc620ea1cc07cb53616e547302\"}", jsonSerializerSettings); var clock = MockMasterClock.FromTicks(638010200200475015); @@ -116,12 +108,12 @@ public void Process_Invalid_Time() UserAgent = "cpuminer-multi/1.3.1" }; - var con = new StratumConnection(new NullLogger(LogManager.LogFactory), container.Resolve(), clock, "1", false); - con.SetContext(context); + var worker = new StratumConnection(new NullLogger(LogManager.LogFactory), container.Resolve(), clock, "1", false); + worker.SetContext(context); job.Init(blockTemplate, "1", pc, null, new ClusterConfig(), clock, poolAddressDestination, network, false, coin.ShareMultiplier, coin.CoinbaseHasherValue, coin.HeaderHasherValue, coin.BlockHasherValue); - return (job, con); + return (job, worker); } } From 1dd7a75749e3e9c5310b31b9ccab2b9843ccac62 Mon Sep 17 00:00:00 2001 From: Oliver Weichhold Date: Mon, 10 Oct 2022 22:52:02 +0200 Subject: [PATCH 17/54] Cleanup --- .github/workflows/dotnet.yml | 2 +- appveyor.yml | 45 ------------------------------------ 2 files changed, 1 insertion(+), 46 deletions(-) delete mode 100644 appveyor.yml diff --git a/.github/workflows/dotnet.yml b/.github/workflows/dotnet.yml index 96739ceec..66467f3bc 100644 --- a/.github/workflows/dotnet.yml +++ b/.github/workflows/dotnet.yml @@ -27,4 +27,4 @@ jobs: - name: Build run: dotnet build --no-restore src - name: Test - run: dotnet test --no-build --verbosity normal src + run: dotnet test -l "console;verbosity=detailed" -c Release --no-build src diff --git a/appveyor.yml b/appveyor.yml deleted file mode 100644 index 8b4cd35b0..000000000 --- a/appveyor.yml +++ /dev/null @@ -1,45 +0,0 @@ -#---------------------------------# -# environment configuration # -#---------------------------------# - -# Build worker image (VM template) -image: -- Visual Studio 2022 -- Ubuntu2004 - -#---------------------------------# -# build configuration # -#---------------------------------# - -# scripts to run before build -before_build: - - cd src - - dotnet restore - -build_script: - # Install Linux build-dependencies - - sh: sudo apt-get update -y && sudo apt-get -y install cmake build-essential libssl-dev pkg-config libboost-all-dev libsodium-dev libzmq5 - # Publish - - cd Miningcore - - dotnet publish -c Release --framework net6.0 - # Build Tests - - cd ../Miningcore.Tests - - dotnet build -c Release --framework net6.0 - -#---------------------------------# -# tests configuration # -#---------------------------------# - -# to run tests again only selected assemblies and/or categories -test_script: - - sh: dotnet test -l "console;verbosity=detailed" -c Release --no-build - - cmd: dotnet test -l "console;verbosity=detailed" -c Release --no-build - -before_test: - - sh: cp -v $APPVEYOR_BUILD_FOLDER/src/Miningcore/bin/Release/net6.0/publish/*.so $APPVEYOR_BUILD_FOLDER/src/Miningcore.Tests/bin/Release/net6.0/ - -deploy: off - -#---------------------------------# -# notifications # -#---------------------------------# From 55cc1ffb212067e0a21201714a14105b41230f8e Mon Sep 17 00:00:00 2001 From: Oliver Weichhold Date: Mon, 10 Oct 2022 22:57:32 +0200 Subject: [PATCH 18/54] WIP --- .github/workflows/dotnet.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/dotnet.yml b/.github/workflows/dotnet.yml index 66467f3bc..681cce079 100644 --- a/.github/workflows/dotnet.yml +++ b/.github/workflows/dotnet.yml @@ -27,4 +27,4 @@ jobs: - name: Build run: dotnet build --no-restore src - name: Test - run: dotnet test -l "console;verbosity=detailed" -c Release --no-build src + run: dotnet test --no-build --verbosity detailed src From 544feda5340518b185c2fe3e588745b2d518fc45 Mon Sep 17 00:00:00 2001 From: Oliver Weichhold Date: Mon, 10 Oct 2022 23:04:45 +0200 Subject: [PATCH 19/54] WIP --- .github/workflows/dotnet.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/dotnet.yml b/.github/workflows/dotnet.yml index 681cce079..94e5e2a2f 100644 --- a/.github/workflows/dotnet.yml +++ b/.github/workflows/dotnet.yml @@ -27,4 +27,4 @@ jobs: - name: Build run: dotnet build --no-restore src - name: Test - run: dotnet test --no-build --verbosity detailed src + run: dotnet test -l console --no-build --verbosity normal src From de76fedcd27c3b6fd5f300045c6a5010d4a2de87 Mon Sep 17 00:00:00 2001 From: Oliver Weichhold Date: Mon, 10 Oct 2022 23:13:00 +0200 Subject: [PATCH 20/54] WIP --- .github/workflows/dotnet.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/dotnet.yml b/.github/workflows/dotnet.yml index 94e5e2a2f..e77066f36 100644 --- a/.github/workflows/dotnet.yml +++ b/.github/workflows/dotnet.yml @@ -27,4 +27,4 @@ jobs: - name: Build run: dotnet build --no-restore src - name: Test - run: dotnet test -l console --no-build --verbosity normal src + run: dotnet test --logger:"console;verbosity=normal" --no-build --verbosity normal src From 3d9e34a9d59f0c2084526c4ea0be015ab783f95d Mon Sep 17 00:00:00 2001 From: Oliver Weichhold Date: Mon, 10 Oct 2022 23:21:20 +0200 Subject: [PATCH 21/54] Logging --- .github/workflows/dotnet.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/dotnet.yml b/.github/workflows/dotnet.yml index e77066f36..5a20a8e1b 100644 --- a/.github/workflows/dotnet.yml +++ b/.github/workflows/dotnet.yml @@ -27,4 +27,4 @@ jobs: - name: Build run: dotnet build --no-restore src - name: Test - run: dotnet test --logger:"console;verbosity=normal" --no-build --verbosity normal src + run: dotnet test --logger:"console;verbosity=detailed" --no-build --verbosity normal src From 37d4dd6f0b44c6df98dda0d252048d9f04d1cc28 Mon Sep 17 00:00:00 2001 From: Oliver Weichhold Date: Sat, 15 Oct 2022 13:53:38 +0200 Subject: [PATCH 22/54] Refactor --- src/Miningcore/Stratum/StratumConnection.cs | 13 +++++++------ src/Miningcore/Stratum/StratumConstants.cs | 8 -------- 2 files changed, 7 insertions(+), 14 deletions(-) delete mode 100644 src/Miningcore/Stratum/StratumConstants.cs diff --git a/src/Miningcore/Stratum/StratumConnection.cs b/src/Miningcore/Stratum/StratumConnection.cs index 85260bfb3..9748d91c1 100644 --- a/src/Miningcore/Stratum/StratumConnection.cs +++ b/src/Miningcore/Stratum/StratumConnection.cs @@ -50,6 +50,7 @@ public StratumConnection(ILogger logger, RecyclableMemoryStreamManager rmsm, IMa private readonly IMasterClock clock; private const int MaxInboundRequestLength = 0x8000; + public static readonly Encoding Encoding = new UTF8Encoding(false); private Stream networkStream; private readonly Pipe receivePipe; @@ -236,7 +237,7 @@ private async Task FillReceivePipeAsync(CancellationToken ct) if(cb == 0) break; // EOF - logger.Debug(() => $"[{ConnectionId}] [NET] Received data: {StratumConstants.Encoding.GetString(memory.Slice(0, cb).Span)}"); + logger.Debug(() => $"[{ConnectionId}] [NET] Received data: {Encoding.GetString(memory.Slice(0, cb).Span)}"); LastReceive = clock.Now; @@ -265,7 +266,7 @@ private async Task ProcessReceivePipeAsync(CancellationToken ct, if(buffer.Length > MaxInboundRequestLength) throw new InvalidDataException($"Incoming data exceeds maximum of {MaxInboundRequestLength}"); - logger.Debug(() => $"[{ConnectionId}] [PIPE] Received data: {result.Buffer.AsString(StratumConstants.Encoding)}"); + logger.Debug(() => $"[{ConnectionId}] [PIPE] Received data: {result.Buffer.AsString(Encoding)}"); do { @@ -342,12 +343,12 @@ private async Task SendMessage(object msg, CancellationToken ct) await using var stream = rmsm.GetStream(nameof(StratumConnection)) as RecyclableMemoryStream; // serialize - await using (var writer = new StreamWriter(stream!, StratumConstants.Encoding, -1, true)) + await using (var writer = new StreamWriter(stream!, Encoding, -1, true)) { serializer.Serialize(writer, msg); } - logger.Debug(() => $"[{ConnectionId}] Sending: {StratumConstants.Encoding.GetString(stream.GetReadOnlySequence())}"); + logger.Debug(() => $"[{ConnectionId}] Sending: {Encoding.GetString(stream.GetReadOnlySequence())}"); // append newline stream.WriteByte((byte) '\n'); @@ -367,7 +368,7 @@ private async Task ProcessRequestAsync( ReadOnlySequence lineBuffer) { await using var stream = rmsm.GetStream(nameof(StratumConnection), lineBuffer.ToSpan()) as RecyclableMemoryStream; - using var reader = new JsonTextReader(new StreamReader(stream!, StratumConstants.Encoding)); + using var reader = new JsonTextReader(new StreamReader(stream!, Encoding)); var request = serializer.Deserialize(reader); @@ -384,7 +385,7 @@ private bool ProcessProxyHeader(ReadOnlySequence seq, TcpProxyProtocolConf { expectingProxyHeader = false; - var line = seq.AsString(StratumConstants.Encoding); + var line = seq.AsString(Encoding); var peerAddress = RemoteEndpoint.Address; if(line.StartsWith("PROXY ")) diff --git a/src/Miningcore/Stratum/StratumConstants.cs b/src/Miningcore/Stratum/StratumConstants.cs deleted file mode 100644 index aaf35b3d2..000000000 --- a/src/Miningcore/Stratum/StratumConstants.cs +++ /dev/null @@ -1,8 +0,0 @@ -using System.Text; - -namespace Miningcore.Stratum; - -public class StratumConstants -{ - public static readonly Encoding Encoding = new UTF8Encoding(false); -} From 051a22964f5522a3e27f4f03470b71591ab5e354 Mon Sep 17 00:00:00 2001 From: Oliver Weichhold Date: Sat, 15 Oct 2022 14:07:11 +0200 Subject: [PATCH 23/54] WIP --- src/Miningcore/Blockchain/Ergo/ErgoClientFactory.cs | 2 +- src/Miningcore/Rpc/RpcClient.cs | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Miningcore/Blockchain/Ergo/ErgoClientFactory.cs b/src/Miningcore/Blockchain/Ergo/ErgoClientFactory.cs index a3336c3b6..8fc42692f 100644 --- a/src/Miningcore/Blockchain/Ergo/ErgoClientFactory.cs +++ b/src/Miningcore/Blockchain/Ergo/ErgoClientFactory.cs @@ -24,7 +24,7 @@ public static ErgoClient CreateClient(PoolConfig poolConfig, ClusterConfig clust var result = new ErgoClient(baseUrl.ToString(), new HttpClient(new HttpClientHandler { - AutomaticDecompression = DecompressionMethods.Deflate | DecompressionMethods.GZip, + AutomaticDecompression = DecompressionMethods.All, ServerCertificateCustomValidationCallback = (message, cert, chain, errors) => true, })); diff --git a/src/Miningcore/Rpc/RpcClient.cs b/src/Miningcore/Rpc/RpcClient.cs index eb053cd5a..057c1fe32 100644 --- a/src/Miningcore/Rpc/RpcClient.cs +++ b/src/Miningcore/Rpc/RpcClient.cs @@ -49,7 +49,7 @@ public RpcClient(DaemonEndpointConfig endPoint, JsonSerializerSettings serialize private static readonly HttpClient httpClient = new(new HttpClientHandler { - AutomaticDecompression = DecompressionMethods.Deflate | DecompressionMethods.GZip, + AutomaticDecompression = DecompressionMethods.All, ServerCertificateCustomValidationCallback = (message, cert, chain, errors) => true, }); From d302669f2633795950c5aa934def178ba072d186 Mon Sep 17 00:00:00 2001 From: Oliver Weichhold Date: Mon, 17 Oct 2022 13:36:53 +0200 Subject: [PATCH 24/54] ENS donation address --- README.md | 8 ++++---- src/Miningcore/Program.cs | 6 +++--- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/README.md b/README.md index f2559acf1..305e9b21d 100644 --- a/README.md +++ b/README.md @@ -223,14 +223,14 @@ Once again, do not run a production pool on Windows! This is not a supported con To support this project you can become a [sponsor](https://github.com/sponsors/oliverw) or send a donation to the following accounts: -* XMR: `46S2AEwYmD9fnmZkxCpXf1T3U3DyEq3Ekb8Lg9kgUMGABn9Fp9q5nE2fBcXebrjrXfZHy5uC5HfLE6X4WLtSm35wUr9Mh46` -* BTC: `bc1quzdczlpfn3n4xvpdz0x9h79569afhg0ashwxxp` +* ETH: `miningcore.eth (ENS Address)` +* BTC: `miningcore.eth (ENS Address)` * BCH: `qrf6uhhapq7fgkjv2ce2hcjqpk8ec2zc25et4xsphv` -* LTC: `LTK6CWastkmBzGxgQhTTtCUjkjDA14kxzC` +* LTC: `miningcore.eth (ENS Address)` * DOGE: `DGDuKRhBewGP1kbUz4hszNd2p6dDzWYy9Q` -* ETH: `0xcb55abBfe361B12323eb952110cE33d5F28BeeE1` * ETC: `0xF8cCE9CE143C68d3d4A7e6bf47006f21Cfcf93c0` * DASH: `XqpBAV9QCaoLnz42uF5frSSfrJTrqHoxjp` * ZEC: `t1YHZHz2DGVMJiggD2P4fBQ2TAPgtLSUwZ7` * BTG: `GQb77ZuMCyJGZFyxpzqNfm7GB1rQreP4n6` * ERGO: `9foYU8JkoqWBSDA3ba8VHfduPXV2NaVNPPAFkdYoR9t9cPQGMv4` +* XMR: `46S2AEwYmD9fnmZkxCpXf1T3U3DyEq3Ekb8Lg9kgUMGABn9Fp9q5nE2fBcXebrjrXfZHy5uC5HfLE6X4WLtSm35wUr9Mh46` diff --git a/src/Miningcore/Program.cs b/src/Miningcore/Program.cs index 17ebc5aed..42bc7761d 100644 --- a/src/Miningcore/Program.cs +++ b/src/Miningcore/Program.cs @@ -623,12 +623,12 @@ private static void Logo() "); Console.WriteLine(" https://github.com/oliverw/miningcore\n"); Console.WriteLine(" Donate to one of these addresses to support the project:\n"); - Console.WriteLine(" BTC - 17QnVor1B6oK1rWnVVBrdX9gFzVkZZbhDm"); - Console.WriteLine(" LTC - LTK6CWastkmBzGxgQhTTtCUjkjDA14kxzC"); + Console.WriteLine(" ETH - miningcore.eth (ENS Address)"); + Console.WriteLine(" BTC - miningcore.eth (ENS Address)"); + Console.WriteLine(" LTC - miningcore.eth (ENS Address)"); Console.WriteLine(" DASH - XqpBAV9QCaoLnz42uF5frSSfrJTrqHoxjp"); Console.WriteLine(" ZEC - t1YHZHz2DGVMJiggD2P4fBQ2TAPgtLSUwZ7"); Console.WriteLine(" ZCL - t1MFU1vD3YKgsK6Uh8hW7UTY8mKAV2xVqBr"); - Console.WriteLine(" ETH - 0xcb55abBfe361B12323eb952110cE33d5F28BeeE1"); Console.WriteLine(" ETC - 0xF8cCE9CE143C68d3d4A7e6bf47006f21Cfcf93c0"); Console.WriteLine(" XMR - 475YVJbPHPedudkhrcNp1wDcLMTGYusGPF5fqE7XjnragVLPdqbCHBdZg3dF4dN9hXMjjvGbykS6a77dTAQvGrpiQqHp2eH"); Console.WriteLine(); From 603972d1a5ee0daf1a442f897c9523681ab0c9ac Mon Sep 17 00:00:00 2001 From: Oliver Weichhold Date: Mon, 17 Oct 2022 16:28:09 +0200 Subject: [PATCH 25/54] WIP --- README.md | 1 - 1 file changed, 1 deletion(-) diff --git a/README.md b/README.md index 305e9b21d..eef7db057 100644 --- a/README.md +++ b/README.md @@ -225,7 +225,6 @@ To support this project you can become a [sponsor](https://github.com/sponsors/o * ETH: `miningcore.eth (ENS Address)` * BTC: `miningcore.eth (ENS Address)` -* BCH: `qrf6uhhapq7fgkjv2ce2hcjqpk8ec2zc25et4xsphv` * LTC: `miningcore.eth (ENS Address)` * DOGE: `DGDuKRhBewGP1kbUz4hszNd2p6dDzWYy9Q` * ETC: `0xF8cCE9CE143C68d3d4A7e6bf47006f21Cfcf93c0` From ca970cec13bf2096d0fe831e337df2f8a009bda8 Mon Sep 17 00:00:00 2001 From: LoulouCrypto <68774649+LoulouCrypto@users.noreply.github.com> Date: Sun, 23 Oct 2022 20:40:05 +0200 Subject: [PATCH 26/54] Update EthereumPayoutHandler.cs Start of EthOne and PinkChain integration --- .../Blockchain/Ethereum/EthereumPayoutHandler.cs | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/src/Miningcore/Blockchain/Ethereum/EthereumPayoutHandler.cs b/src/Miningcore/Blockchain/Ethereum/EthereumPayoutHandler.cs index ebd48ee9a..0448b4b67 100644 --- a/src/Miningcore/Blockchain/Ethereum/EthereumPayoutHandler.cs +++ b/src/Miningcore/Blockchain/Ethereum/EthereumPayoutHandler.cs @@ -125,7 +125,7 @@ public async Task ClassifyBlocksAsync(IMiningPool pool, Block[] blocks, var gasUsed = blockHashResponse.Response.GasUsed; var burnedFee = (decimal) 0; - if(extraPoolConfig?.ChainTypeOverride == "Ethereum" || extraPoolConfig?.ChainTypeOverride == "MainPow") + if(extraPoolConfig?.ChainTypeOverride == "Ethereum" || extraPoolConfig?.ChainTypeOverride == "MainPow" || extraPoolConfig?.ChainTypeOverride == "EtherOne" || extraPoolConfig?.ChainTypeOverride == "Pink") burnedFee = (baseGas * gasUsed / EthereumConstants.Wei); block.Hash = blockHash; @@ -237,7 +237,7 @@ public async Task PayoutAsync(IMiningPool pool, Balance[] balances, Cancellation // ensure we have peers var infoResponse = await rpcClient.ExecuteAsync(logger, EC.GetPeerCount, ct); - if((networkType == EthereumNetworkType.Main || networkType == EthereumNetworkType.MainPow) && + if((networkType == EthereumNetworkType.Main || networkType == EthereumNetworkType.MainPow || extraPoolConfig?.ChainTypeOverride == "EtherOne" || extraPoolConfig?.ChainTypeOverride == "Pink") && (infoResponse.Error != null || string.IsNullOrEmpty(infoResponse.Response) || infoResponse.Response.IntegralFromHex() < EthereumConstants.MinPayoutPeerCount)) { @@ -314,6 +314,12 @@ internal static decimal GetBaseBlockReward(GethChainType chainType, ulong height return EthereumConstants.ByzantiumBlockReward; return EthereumConstants.HomesteadBlockReward; + + case GethChainType.EtherOne: + return EthOneConstants.BaseRewardInitial; + + case GethChainType.Pink: + return PinkConstants.BaseRewardInitial; case GethChainType.Callisto: return CallistoConstants.BaseRewardInitial * (CallistoConstants.TreasuryPercent / 100); @@ -391,9 +397,10 @@ private async Task PayoutAsync(Balance balance, CancellationToken ct) From = poolConfig.Address, To = balance.Address, Value = amount.ToString("x").TrimStart('0'), + }; - if(extraPoolConfig?.ChainTypeOverride == "Ethereum" || extraPoolConfig?.ChainTypeOverride == "MainPow") + if(extraPoolConfig?.ChainTypeOverride == "Ethereum" || extraPoolConfig?.ChainTypeOverride == "MainPow" || extraPoolConfig?.ChainTypeOverride == "EtherOne" || extraPoolConfig?.ChainTypeOverride == "Pink") { var maxPriorityFeePerGas = await rpcClient.ExecuteAsync(logger, EC.MaxPriorityFeePerGas, ct); request.Gas = extraConfig.Gas; From 44ff60f7f1dae3486e6cca75aa16bd12a4a0b0fb Mon Sep 17 00:00:00 2001 From: LoulouCrypto <68774649+LoulouCrypto@users.noreply.github.com> Date: Sun, 23 Oct 2022 20:40:51 +0200 Subject: [PATCH 27/54] Update EthereumConstants.cs Start of integration of ETHOne And PinkChain --- .../Blockchain/Ethereum/EthereumConstants.cs | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/src/Miningcore/Blockchain/Ethereum/EthereumConstants.cs b/src/Miningcore/Blockchain/Ethereum/EthereumConstants.cs index b94e1bc29..1f2b250e2 100644 --- a/src/Miningcore/Blockchain/Ethereum/EthereumConstants.cs +++ b/src/Miningcore/Blockchain/Ethereum/EthereumConstants.cs @@ -46,12 +46,24 @@ public class CallistoConstants public const decimal TreasuryPercent = 50m; } +public class EthOneConstants +{ + public const decimal BaseRewardInitial = 2.0m; +} + +public class PinkConstants +{ + public const decimal BaseRewardInitial = 1.0m; +} + public enum EthereumNetworkType { Main = 1, Ropsten = 3, Callisto = 820, MainPow = 10001, + EtherOne = 4949, + Pink = 10100, Unknown = -1, } @@ -62,7 +74,9 @@ public enum GethChainType Ropsten, Callisto, MainPow = 10001, - + EtherOne = 4949, + Pink = 10100, + Unknown = -1, } From 0e87706e71758bbd98be00771cbe548df86b8b4e Mon Sep 17 00:00:00 2001 From: LoulouCrypto <68774649+LoulouCrypto@users.noreply.github.com> Date: Sun, 23 Oct 2022 20:52:58 +0200 Subject: [PATCH 28/54] Update coins.json --- src/Miningcore/coins.json | 34 ++++++++++++++++++++++++++++++++++ 1 file changed, 34 insertions(+) diff --git a/src/Miningcore/coins.json b/src/Miningcore/coins.json index e631f2f8d..6c93abf84 100644 --- a/src/Miningcore/coins.json +++ b/src/Miningcore/coins.json @@ -4221,6 +4221,40 @@ "explorerTxLink": "https://www.oklink.com/en/ethw/tx/{0}", "explorerAccountLink": "https://www.oklink.com/en/ethw/address/{0}" }, + "etherone": { + "name": "EtherOne", + "canonicalName": "EtherOne", + "symbol": "ETHONE", + "family": "ethereum", + "website": "https://etherone.one/", + "market": "", + "twitter": "https://twitter.com/EtherOneChain", + "telegram": "https://t.me/ether_one_blockchain", + "discord": "https://discord.com/invite/vF2SDb6Yz9", + "explorerBlockLinks": { + "block": "https://www.oklink.com/en/ethw/block/$height$", + "uncle": "https://www.oklink.com/en/ethw/uncle/$height$" + }, + "explorerTxLink": "https://explorer2.etherone.one/transactions/{0}", + "explorerAccountLink": "https://explorer2.etherone.one/contracts/{0}" + }, + "pinkchain": { + "name": "PinkChain", + "canonicalName": "PinkChain", + "symbol": "PINK", + "family": "ethereum", + "website": "https://pinkchain.net/", + "market": "", + "twitter": "https://twitter.com/EtherOneChain", + "telegram": "https://t.me/PinkSmartChain", + "discord": "https://discord.gg/jzxrn5H4eQ", + "explorerBlockLinks": { + "block": "https://pinkscan.org/block/$height$", + "uncle": "https://pinkscan.org/uncle/$height$" + }, + "explorerTxLink": "https://pinkscan.org/transactions/{0}", + "explorerAccountLink": "https://pinkscan.org/contracts/{0}" + }, "ergo": { "name": "Ergo", "canonicalName": "Ergo", From 94b81471dcb8d9f28d6cbd56e23284909b2b48ed Mon Sep 17 00:00:00 2001 From: LoulouCrypto <68774649+LoulouCrypto@users.noreply.github.com> Date: Tue, 25 Oct 2022 19:50:09 +0200 Subject: [PATCH 29/54] Update EthereumPayoutHandler.cs --- .../Blockchain/Ethereum/EthereumPayoutHandler.cs | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/Miningcore/Blockchain/Ethereum/EthereumPayoutHandler.cs b/src/Miningcore/Blockchain/Ethereum/EthereumPayoutHandler.cs index 0448b4b67..a692f3e11 100644 --- a/src/Miningcore/Blockchain/Ethereum/EthereumPayoutHandler.cs +++ b/src/Miningcore/Blockchain/Ethereum/EthereumPayoutHandler.cs @@ -397,10 +397,9 @@ private async Task PayoutAsync(Balance balance, CancellationToken ct) From = poolConfig.Address, To = balance.Address, Value = amount.ToString("x").TrimStart('0'), - }; - if(extraPoolConfig?.ChainTypeOverride == "Ethereum" || extraPoolConfig?.ChainTypeOverride == "MainPow" || extraPoolConfig?.ChainTypeOverride == "EtherOne" || extraPoolConfig?.ChainTypeOverride == "Pink") + if(extraPoolConfig?.ChainTypeOverride == "Ethereum" || extraPoolConfig?.ChainTypeOverride == "MainPow" || extraPoolConfig?.ChainTypeOverride == "EtherOne" ) { var maxPriorityFeePerGas = await rpcClient.ExecuteAsync(logger, EC.MaxPriorityFeePerGas, ct); request.Gas = extraConfig.Gas; @@ -408,6 +407,11 @@ private async Task PayoutAsync(Balance balance, CancellationToken ct) request.MaxFeePerGas = extraConfig.MaxFeePerGas; } + if(extraPoolConfig?.ChainTypeOverride == "Pink") + { + request.Gas = extraConfig.Gas; + } + var response = await rpcClient.ExecuteAsync(logger, EC.SendTx, ct, new[] { request }); if(response.Error != null) From 942207ac6559a9424f26e1762d137ac86497f70a Mon Sep 17 00:00:00 2001 From: LoulouCrypto <68774649+LoulouCrypto@users.noreply.github.com> Date: Tue, 25 Oct 2022 19:56:46 +0200 Subject: [PATCH 30/54] Update coins.json --- src/Miningcore/coins.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Miningcore/coins.json b/src/Miningcore/coins.json index 6c93abf84..ad6364ba7 100644 --- a/src/Miningcore/coins.json +++ b/src/Miningcore/coins.json @@ -4253,7 +4253,7 @@ "uncle": "https://pinkscan.org/uncle/$height$" }, "explorerTxLink": "https://pinkscan.org/transactions/{0}", - "explorerAccountLink": "https://pinkscan.org/contracts/{0}" + "explorerAccountLink": "https://.pinkscan.org/contracts/{0}" }, "ergo": { "name": "Ergo", From a375c5e5cf777b0099ca3aef1d57faf0331bfa58 Mon Sep 17 00:00:00 2001 From: LoulouCrypto Date: Fri, 28 Oct 2022 14:35:47 +0200 Subject: [PATCH 31/54] maj --- .../Ethereum/EthereumPayoutHandler.cs | 15 +- .../Crypto/Hashing/Algorithms/Sha256DT.cs | 21 + .../Crypto/Hashing/Algorithms/Sha512256D.cs | 22 ++ src/Miningcore/Native/Multihash.cs | 6 + src/Miningcore/coins.json | 38 +- src/Native/libmultihash/Makefile | 2 +- src/Native/libmultihash/exports.cpp | 12 + src/Native/libmultihash/libmultihash.vcxproj | 5 +- .../libmultihash/libmultihash.vcxproj.filters | 17 +- src/Native/libmultihash/sha256dt.c | 24 ++ src/Native/libmultihash/sha256dt.h | 14 + src/Native/libmultihash/sha256t.h | 20 + src/Native/libmultihash/sha512_256.c | 365 ++++++++++++++++++ src/Native/libmultihash/sha512_256.h | 79 ++++ 14 files changed, 635 insertions(+), 5 deletions(-) create mode 100644 src/Miningcore/Crypto/Hashing/Algorithms/Sha256DT.cs create mode 100644 src/Miningcore/Crypto/Hashing/Algorithms/Sha512256D.cs create mode 100644 src/Native/libmultihash/sha256dt.c create mode 100644 src/Native/libmultihash/sha256dt.h create mode 100644 src/Native/libmultihash/sha256t.h create mode 100644 src/Native/libmultihash/sha512_256.c create mode 100644 src/Native/libmultihash/sha512_256.h diff --git a/src/Miningcore/Blockchain/Ethereum/EthereumPayoutHandler.cs b/src/Miningcore/Blockchain/Ethereum/EthereumPayoutHandler.cs index a692f3e11..c131afd57 100644 --- a/src/Miningcore/Blockchain/Ethereum/EthereumPayoutHandler.cs +++ b/src/Miningcore/Blockchain/Ethereum/EthereumPayoutHandler.cs @@ -412,7 +412,20 @@ private async Task PayoutAsync(Balance balance, CancellationToken ct) request.Gas = extraConfig.Gas; } - var response = await rpcClient.ExecuteAsync(logger, EC.SendTx, ct, new[] { request }); + var response; + if(extraPoolConfig?.ChainTypeOverride == "Pink") + { + response = await rpcClient.ExecuteAsync(logger, EC.SendTx, ct, new[] {{ + From = request.From, + To = request.Address, + Value = request.Value, + Gas = extraConfig.Gas, + }}); + } + + else { + response = await rpcClient.ExecuteAsync(logger, EC.SendTx, ct, new[] { request }); + } if(response.Error != null) throw new Exception($"{EC.SendTx} returned error: {response.Error.Message} code {response.Error.Code}"); diff --git a/src/Miningcore/Crypto/Hashing/Algorithms/Sha256DT.cs b/src/Miningcore/Crypto/Hashing/Algorithms/Sha256DT.cs new file mode 100644 index 000000000..be4824fe3 --- /dev/null +++ b/src/Miningcore/Crypto/Hashing/Algorithms/Sha256DT.cs @@ -0,0 +1,21 @@ +using Miningcore.Contracts; +using Miningcore.Native; + +namespace Miningcore.Crypto.Hashing.Algorithms; + +[Identifier("sha256dt")] +public unsafe class Sha256DT : IHashAlgorithm +{ + public void Digest(ReadOnlySpan data, Span result, params object[] extra) + { + Contract.Requires(result.Length >= 32); + + fixed (byte* input = data) + { + fixed (byte* output = result) + { + Multihash.sha256dt(input, output); + } + } + } +} diff --git a/src/Miningcore/Crypto/Hashing/Algorithms/Sha512256D.cs b/src/Miningcore/Crypto/Hashing/Algorithms/Sha512256D.cs new file mode 100644 index 000000000..678c21803 --- /dev/null +++ b/src/Miningcore/Crypto/Hashing/Algorithms/Sha512256D.cs @@ -0,0 +1,22 @@ +using Miningcore.Contracts; +using Miningcore.Native; + +namespace Miningcore.Crypto.Hashing.Algorithms; + +[Identifier("sha512/256d")] +public unsafe class Sha512256D : IHashAlgorithm +{ + public void Digest(ReadOnlySpan data, Span result, params object[] extra) + { + Contract.Requires(result.Length >= 32); + + fixed (byte* input = data) + { + fixed (byte* output = result) + { + Multihash.sha512_256(input, output, (uint) data.Length); + Multihash.sha512_256(output, output, 32); + } + } + } +} diff --git a/src/Miningcore/Native/Multihash.cs b/src/Miningcore/Native/Multihash.cs index 2febb4407..8ebb2294d 100644 --- a/src/Miningcore/Native/Multihash.cs +++ b/src/Miningcore/Native/Multihash.cs @@ -144,4 +144,10 @@ public static unsafe class Multihash [DllImport("libmultihash", EntryPoint = "equihash_verify_96_5_export", CallingConvention = CallingConvention.Cdecl)] public static extern bool equihash_verify_96_5(byte* header, int headerLength, byte* solution, int solutionLength, string personalization); + + [DllImport("libmultihash", EntryPoint = "sha512_256_export", CallingConvention = CallingConvention.Cdecl)] + public static extern void sha512_256(byte* input, void* output, uint inputLength); + + [DllImport("libmultihash", EntryPoint = "sha256dt_export", CallingConvention = CallingConvention.Cdecl)] + public static extern void sha256dt(byte* input, void* output); } diff --git a/src/Miningcore/coins.json b/src/Miningcore/coins.json index ad6364ba7..34e6dc55c 100644 --- a/src/Miningcore/coins.json +++ b/src/Miningcore/coins.json @@ -2176,6 +2176,42 @@ "explorerBlockLink": "https://explorer.raptoreum.com/block-height/$height$", "explorerTxLink": "https://explorer.raptoreum.com/tx/{0}", "explorerAccountLink": "https://explorer.raptoreum.com/address/{0}" + }, + "radiant": { + "name": "Radiant", + "symbol": "RXD", + "family": "bitcoin", + "coinbaseHasher": { + "hash": "sha256d" + }, + "headerHasher": { + "hash": "sha512/256d" + }, + "blockHasher": { + "hash": "reverse", + "args": [ { "hash": "sha512/256d" } ] + }, + "explorerBlockLink": "https://explorer.radiantblockchain.org/block-height/$height$", + "explorerTxLink": "https://explorer.radiantblockchain.org/tx/{0}", + "explorerAccountLink": "https://explorer.radiantblockchain.org/address/{0}" + }, + "novo": { + "name": "Novo", + "symbol": "NOVO", + "family": "bitcoin", + "coinbaseHasher": { + "hash": "sha256d" + }, + "headerHasher": { + "hash": "sha256dt" + }, + "blockHasher": { + "hash": "reverse", + "args": [ { "hash": "sha256dt" } ] + }, + "explorerBlockLink": "https://explorer.novochain.ovh/block/$height$", + "explorerTxLink": "https://explorer.novochain.ovh/tx/{0}", + "explorerAccountLink": "https://explorer.novochain.ovh/address/{0}" }, "bitoreum": { "name": "Bitoreum", @@ -4236,7 +4272,7 @@ "uncle": "https://www.oklink.com/en/ethw/uncle/$height$" }, "explorerTxLink": "https://explorer2.etherone.one/transactions/{0}", - "explorerAccountLink": "https://explorer2.etherone.one/contracts/{0}" + "explorerAccountLink": "https://explorer2.etherone.one/accounts/{0}" }, "pinkchain": { "name": "PinkChain", diff --git a/src/Native/libmultihash/Makefile b/src/Native/libmultihash/Makefile index 301ed134a..d7f0618c9 100644 --- a/src/Native/libmultihash/Makefile +++ b/src/Native/libmultihash/Makefile @@ -21,7 +21,7 @@ OBJECTS = bcrypt.o blake.o c11.o dcrypt.o fresh.o lane.o \ equi/uint256.o equi/arith_uint256.o equi/crypto/hmac_sha512.o \ equi/crypto/sha1.o equi/crypto/sha512.o equi/crypto/sha256.o \ equi/crypto/hmac_sha256.o equi/crypto/equihash.o equi/crypto/ripemd160.o \ - equi/equihashverify.o + equi/equihashverify.o sha512_256.o sha256dt.o all: $(TARGET) diff --git a/src/Native/libmultihash/exports.cpp b/src/Native/libmultihash/exports.cpp index 6f0b76b54..70d3260b0 100644 --- a/src/Native/libmultihash/exports.cpp +++ b/src/Native/libmultihash/exports.cpp @@ -54,6 +54,8 @@ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. #include "verthash/h2.h" #include "equi/equihashverify.h" #include "heavyhash/heavyhash.h" +#include "sha512_256.h" +#include "sha256dt.h" #ifdef _WIN32 #include "blake2/ref/blake2.h" @@ -321,3 +323,13 @@ extern "C" MODULE_API bool equihash_verify_96_5_export(const char* header, int h return verifyEH_96_5(header, vecSolution, personalization); } + +extern "C" MODULE_API void sha512_256_export(const unsigned char* input, unsigned char* output, uint32_t input_len) +{ + sha512_256(input, input_len, output); +} + +extern "C" MODULE_API void sha256dt_export(const char* input, char* output) +{ + sha256dt_hash(input, output); +} diff --git a/src/Native/libmultihash/libmultihash.vcxproj b/src/Native/libmultihash/libmultihash.vcxproj index 26ac068e3..0f2d4fd54 100644 --- a/src/Native/libmultihash/libmultihash.vcxproj +++ b/src/Native/libmultihash/libmultihash.vcxproj @@ -262,6 +262,7 @@ + @@ -312,6 +313,7 @@ + @@ -356,6 +358,7 @@ MaxSpeed + @@ -364,4 +367,4 @@ - \ No newline at end of file + diff --git a/src/Native/libmultihash/libmultihash.vcxproj.filters b/src/Native/libmultihash/libmultihash.vcxproj.filters index ab407216e..0ee5ca16d 100644 --- a/src/Native/libmultihash/libmultihash.vcxproj.filters +++ b/src/Native/libmultihash/libmultihash.vcxproj.filters @@ -98,6 +98,9 @@ Header Files + + Header Files + Header Files @@ -293,6 +296,12 @@ Header Files + + Header Files + + + Header Files + @@ -565,9 +574,15 @@ Source Files + + Source Files + + + Source Files + - \ No newline at end of file + diff --git a/src/Native/libmultihash/sha256dt.c b/src/Native/libmultihash/sha256dt.c new file mode 100644 index 000000000..dd4db085b --- /dev/null +++ b/src/Native/libmultihash/sha256dt.c @@ -0,0 +1,24 @@ +#include +#include +#include +#include + +#include "sha256.h" +#include "sha256t.h" + +#include + +void sha256dt_hash(const char* input, char* output) +{ + char temp[32]; + + SHA256_CTX ctx; + SHA256t_Init(&ctx); + SHA256_Update(&ctx, input, 80); + SHA256_Final((unsigned char*) &temp, &ctx); + + SHA256t_Init(&ctx); + SHA256_Update(&ctx, &temp, 32); + SHA256_Final((unsigned char*) output, &ctx); +} + diff --git a/src/Native/libmultihash/sha256dt.h b/src/Native/libmultihash/sha256dt.h new file mode 100644 index 000000000..44cf9d92b --- /dev/null +++ b/src/Native/libmultihash/sha256dt.h @@ -0,0 +1,14 @@ +#ifndef SHA256DT_H +#define SHA256DT_H + +#ifdef __cplusplus +extern "C" { +#endif + +void sha256dt_hash(const char* input, char* output); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/src/Native/libmultihash/sha256t.h b/src/Native/libmultihash/sha256t.h new file mode 100644 index 000000000..69234d37b --- /dev/null +++ b/src/Native/libmultihash/sha256t.h @@ -0,0 +1,20 @@ +#ifndef SHA256T_H +#define SHA256T_H + +#include "sha256.h" + +static void +SHA256t_Init(SHA256_CTX * ctx) +{ + ctx->count[0] = 0; + ctx->count[1] = 512; + ctx->state[0] = 0xDFA9BF2C; + ctx->state[1] = 0xB72074D4; + ctx->state[2] = 0x6BB01122; + ctx->state[3] = 0xD338E869; + ctx->state[4] = 0xAA3FF126; + ctx->state[5] = 0x475BBF30; + ctx->state[6] = 0x8FD52E5B; + ctx->state[7] = 0x9F75C9AD; +} +#endif diff --git a/src/Native/libmultihash/sha512_256.c b/src/Native/libmultihash/sha512_256.c new file mode 100644 index 000000000..715030bbd --- /dev/null +++ b/src/Native/libmultihash/sha512_256.c @@ -0,0 +1,365 @@ +/* + * FIPS 180-2 SHA-224/256/384/512 implementation + * Newest update: 30/05/2022 + * Last update: 02/02/2007 + * Issue date: 04/30/2005 + * + * Copyright (C) 2022, The Radiant Blockchain Developers + * Copyright (C) 2013, Con Kolivas + * Copyright (C) 2005, 2007 Olivier Gay + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the project nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ +#if 0 +#define UNROLL_LOOPS /* Enable loops unrolling */ +#endif +#include +#include + +#include "sha512_256.h" + +#define SHFR(x, n) (x >> n) +#define ROTR(x, n) ((x >> n) | (x << ((sizeof(x) << 3) - n))) +#define ROTL(x, n) ((x << n) | (x >> ((sizeof(x) << 3) - n))) +#define CH(x, y, z) ((x & y) ^ (~x & z)) +#define MAJ(x, y, z) ((x & y) ^ (x & z) ^ (y & z)) + +#define SHA512_F1(x) (ROTR(x, 28) ^ ROTR(x, 34) ^ ROTR(x, 39)) +#define SHA512_F2(x) (ROTR(x, 14) ^ ROTR(x, 18) ^ ROTR(x, 41)) +#define SHA512_F3(x) (ROTR(x, 1) ^ ROTR(x, 8) ^ SHFR(x, 7)) +#define SHA512_F4(x) (ROTR(x, 19) ^ ROTR(x, 61) ^ SHFR(x, 6)) + +#define UNPACK32(x, str) \ +{ \ + *((str) + 3) = (uint8_t) ((x) ); \ + *((str) + 2) = (uint8_t) ((x) >> 8); \ + *((str) + 1) = (uint8_t) ((x) >> 16); \ + *((str) + 0) = (uint8_t) ((x) >> 24); \ +} + +#define PACK32(str, x) \ +{ \ + *(x) = ((uint32_t) *((str) + 3) ) \ + | ((uint32_t) *((str) + 2) << 8) \ + | ((uint32_t) *((str) + 1) << 16) \ + | ((uint32_t) *((str) + 0) << 24); \ +} + +#define UNPACK64(x, str) \ +{ \ + *((str) + 7) = (uint8_t) ((x) ); \ + *((str) + 6) = (uint8_t) ((x) >> 8); \ + *((str) + 5) = (uint8_t) ((x) >> 16); \ + *((str) + 4) = (uint8_t) ((x) >> 24); \ + *((str) + 3) = (uint8_t) ((x) >> 32); \ + *((str) + 2) = (uint8_t) ((x) >> 40); \ + *((str) + 1) = (uint8_t) ((x) >> 48); \ + *((str) + 0) = (uint8_t) ((x) >> 56); \ +} + +#define PACK64(str, x) \ +{ \ + *(x) = ((uint64_t) *((str) + 7) ) \ + | ((uint64_t) *((str) + 6) << 8) \ + | ((uint64_t) *((str) + 5) << 16) \ + | ((uint64_t) *((str) + 4) << 24) \ + | ((uint64_t) *((str) + 3) << 32) \ + | ((uint64_t) *((str) + 2) << 40) \ + | ((uint64_t) *((str) + 1) << 48) \ + | ((uint64_t) *((str) + 0) << 56); \ +} + +/* Macros used for loops unrolling */ + +#define SHA512_SCR(i) \ +{ \ + w[i] = SHA512_F4(w[i - 2]) + w[i - 7] \ + + SHA512_F3(w[i - 15]) + w[i - 16]; \ +} + +#define SHA512_EXP(a, b, c, d, e, f, g ,h, j) \ +{ \ + t1 = wv[h] + SHA512_F2(wv[e]) + CH(wv[e], wv[f], wv[g]) \ + + sha512_k[j] + w[j]; \ + t2 = SHA512_F1(wv[a]) + MAJ(wv[a], wv[b], wv[c]); \ + wv[d] += t1; \ + wv[h] = t1 + t2; \ +} + +// The IV initial for sha512/256 is different than normal sha512 +uint64_t sha512_256_h0[8] = + {0x22312194FC2BF72CULL, 0x9F555FA3C84C64C2ULL, + 0x2393B86B6F53B151ULL, 0x963877195940EABDULL, + 0x96283EE2A88EFFE3ULL, 0xBE5E1E2553863992ULL, + 0x2B0199FC2C85B8AAULL, 0x0EB72DDC81C52CA2ULL}; + +uint64_t sha512_k[80] = + {0x428a2f98d728ae22ULL, 0x7137449123ef65cdULL, + 0xb5c0fbcfec4d3b2fULL, 0xe9b5dba58189dbbcULL, + 0x3956c25bf348b538ULL, 0x59f111f1b605d019ULL, + 0x923f82a4af194f9bULL, 0xab1c5ed5da6d8118ULL, + 0xd807aa98a3030242ULL, 0x12835b0145706fbeULL, + 0x243185be4ee4b28cULL, 0x550c7dc3d5ffb4e2ULL, + 0x72be5d74f27b896fULL, 0x80deb1fe3b1696b1ULL, + 0x9bdc06a725c71235ULL, 0xc19bf174cf692694ULL, + 0xe49b69c19ef14ad2ULL, 0xefbe4786384f25e3ULL, + 0x0fc19dc68b8cd5b5ULL, 0x240ca1cc77ac9c65ULL, + 0x2de92c6f592b0275ULL, 0x4a7484aa6ea6e483ULL, + 0x5cb0a9dcbd41fbd4ULL, 0x76f988da831153b5ULL, + 0x983e5152ee66dfabULL, 0xa831c66d2db43210ULL, + 0xb00327c898fb213fULL, 0xbf597fc7beef0ee4ULL, + 0xc6e00bf33da88fc2ULL, 0xd5a79147930aa725ULL, + 0x06ca6351e003826fULL, 0x142929670a0e6e70ULL, + 0x27b70a8546d22ffcULL, 0x2e1b21385c26c926ULL, + 0x4d2c6dfc5ac42aedULL, 0x53380d139d95b3dfULL, + 0x650a73548baf63deULL, 0x766a0abb3c77b2a8ULL, + 0x81c2c92e47edaee6ULL, 0x92722c851482353bULL, + 0xa2bfe8a14cf10364ULL, 0xa81a664bbc423001ULL, + 0xc24b8b70d0f89791ULL, 0xc76c51a30654be30ULL, + 0xd192e819d6ef5218ULL, 0xd69906245565a910ULL, + 0xf40e35855771202aULL, 0x106aa07032bbd1b8ULL, + 0x19a4c116b8d2d0c8ULL, 0x1e376c085141ab53ULL, + 0x2748774cdf8eeb99ULL, 0x34b0bcb5e19b48a8ULL, + 0x391c0cb3c5c95a63ULL, 0x4ed8aa4ae3418acbULL, + 0x5b9cca4f7763e373ULL, 0x682e6ff3d6b2b8a3ULL, + 0x748f82ee5defb2fcULL, 0x78a5636f43172f60ULL, + 0x84c87814a1f0ab72ULL, 0x8cc702081a6439ecULL, + 0x90befffa23631e28ULL, 0xa4506cebde82bde9ULL, + 0xbef9a3f7b2c67915ULL, 0xc67178f2e372532bULL, + 0xca273eceea26619cULL, 0xd186b8c721c0c207ULL, + 0xeada7dd6cde0eb1eULL, 0xf57d4f7fee6ed178ULL, + 0x06f067aa72176fbaULL, 0x0a637dc5a2c898a6ULL, + 0x113f9804bef90daeULL, 0x1b710b35131c471bULL, + 0x28db77f523047d84ULL, 0x32caab7b40c72493ULL, + 0x3c9ebe0a15c9bebcULL, 0x431d67c49c100d4cULL, + 0x4cc5d4becb3e42b6ULL, 0x597f299cfc657e2aULL, + 0x5fcb6fab3ad6faecULL, 0x6c44198c4a475817ULL}; + +/* SHA-512 functions */ + +void sha512_transf(sha512_ctx *ctx, const unsigned char *message, + unsigned int block_nb) +{ + uint64_t w[80]; + uint64_t wv[8]; + uint64_t t1, t2; + const unsigned char *sub_block; + int i, j; + + for (i = 0; i < (int) block_nb; i++) { + sub_block = message + (i << 7); + +#ifndef UNROLL_LOOPS + for (j = 0; j < 16; j++) { + PACK64(&sub_block[j << 3], &w[j]); + } + + for (j = 16; j < 80; j++) { + SHA512_SCR(j); + } + + for (j = 0; j < 8; j++) { + wv[j] = ctx->h[j]; + } + + for (j = 0; j < 80; j++) { + t1 = wv[7] + SHA512_F2(wv[4]) + CH(wv[4], wv[5], wv[6]) + + sha512_k[j] + w[j]; + t2 = SHA512_F1(wv[0]) + MAJ(wv[0], wv[1], wv[2]); + wv[7] = wv[6]; + wv[6] = wv[5]; + wv[5] = wv[4]; + wv[4] = wv[3] + t1; + wv[3] = wv[2]; + wv[2] = wv[1]; + wv[1] = wv[0]; + wv[0] = t1 + t2; + } + + for (j = 0; j < 8; j++) { + ctx->h[j] += wv[j]; + } +#else + PACK64(&sub_block[ 0], &w[ 0]); PACK64(&sub_block[ 8], &w[ 1]); + PACK64(&sub_block[ 16], &w[ 2]); PACK64(&sub_block[ 24], &w[ 3]); + PACK64(&sub_block[ 32], &w[ 4]); PACK64(&sub_block[ 40], &w[ 5]); + PACK64(&sub_block[ 48], &w[ 6]); PACK64(&sub_block[ 56], &w[ 7]); + PACK64(&sub_block[ 64], &w[ 8]); PACK64(&sub_block[ 72], &w[ 9]); + PACK64(&sub_block[ 80], &w[10]); PACK64(&sub_block[ 88], &w[11]); + PACK64(&sub_block[ 96], &w[12]); PACK64(&sub_block[104], &w[13]); + PACK64(&sub_block[112], &w[14]); PACK64(&sub_block[120], &w[15]); + + SHA512_SCR(16); SHA512_SCR(17); SHA512_SCR(18); SHA512_SCR(19); + SHA512_SCR(20); SHA512_SCR(21); SHA512_SCR(22); SHA512_SCR(23); + SHA512_SCR(24); SHA512_SCR(25); SHA512_SCR(26); SHA512_SCR(27); + SHA512_SCR(28); SHA512_SCR(29); SHA512_SCR(30); SHA512_SCR(31); + SHA512_SCR(32); SHA512_SCR(33); SHA512_SCR(34); SHA512_SCR(35); + SHA512_SCR(36); SHA512_SCR(37); SHA512_SCR(38); SHA512_SCR(39); + SHA512_SCR(40); SHA512_SCR(41); SHA512_SCR(42); SHA512_SCR(43); + SHA512_SCR(44); SHA512_SCR(45); SHA512_SCR(46); SHA512_SCR(47); + SHA512_SCR(48); SHA512_SCR(49); SHA512_SCR(50); SHA512_SCR(51); + SHA512_SCR(52); SHA512_SCR(53); SHA512_SCR(54); SHA512_SCR(55); + SHA512_SCR(56); SHA512_SCR(57); SHA512_SCR(58); SHA512_SCR(59); + SHA512_SCR(60); SHA512_SCR(61); SHA512_SCR(62); SHA512_SCR(63); + SHA512_SCR(64); SHA512_SCR(65); SHA512_SCR(66); SHA512_SCR(67); + SHA512_SCR(68); SHA512_SCR(69); SHA512_SCR(70); SHA512_SCR(71); + SHA512_SCR(72); SHA512_SCR(73); SHA512_SCR(74); SHA512_SCR(75); + SHA512_SCR(76); SHA512_SCR(77); SHA512_SCR(78); SHA512_SCR(79); + + wv[0] = ctx->h[0]; wv[1] = ctx->h[1]; + wv[2] = ctx->h[2]; wv[3] = ctx->h[3]; + wv[4] = ctx->h[4]; wv[5] = ctx->h[5]; + wv[6] = ctx->h[6]; wv[7] = ctx->h[7]; + + j = 0; + + do { + SHA512_EXP(0,1,2,3,4,5,6,7,j); j++; + SHA512_EXP(7,0,1,2,3,4,5,6,j); j++; + SHA512_EXP(6,7,0,1,2,3,4,5,j); j++; + SHA512_EXP(5,6,7,0,1,2,3,4,j); j++; + SHA512_EXP(4,5,6,7,0,1,2,3,j); j++; + SHA512_EXP(3,4,5,6,7,0,1,2,j); j++; + SHA512_EXP(2,3,4,5,6,7,0,1,j); j++; + SHA512_EXP(1,2,3,4,5,6,7,0,j); j++; + } while (j < 80); + + ctx->h[0] += wv[0]; ctx->h[1] += wv[1]; + ctx->h[2] += wv[2]; ctx->h[3] += wv[3]; + ctx->h[4] += wv[4]; ctx->h[5] += wv[5]; + ctx->h[6] += wv[6]; ctx->h[7] += wv[7]; +#endif /* !UNROLL_LOOPS */ + } +} + +void sha512_256(const unsigned char *message, unsigned int len, + unsigned char *digest) +{ + sha512_256_ctx ctx; + + sha512_256_init(&ctx); + sha512_256_update(&ctx, message, len); + sha512_256_final(&ctx, digest); +} + +// docker run -d --privileged --name docker -e DOCKER_TLS_CERTDIR=/certs -v docker-certs-ca:/certs/ca -v docker-certs-client:/certs/client docker:dind +void sha512_256_init(sha512_256_ctx *ctx) +{ +#ifndef UNROLL_LOOPS + int i; + for (i = 0; i < 8; i++) { + ctx->h[i] = sha512_256_h0[i]; + } +#else + ctx->h[0] = sha512_256_h0[0]; ctx->h[1] = sha512_256_h0[1]; + ctx->h[2] = sha512_256_h0[2]; ctx->h[3] = sha512_256_h0[3]; + ctx->h[4] = sha512_256_h0[4]; ctx->h[5] = sha512_256_h0[5]; + ctx->h[6] = sha512_256_h0[6]; ctx->h[7] = sha512_256_h0[7]; +#endif /* !UNROLL_LOOPS */ + + ctx->len = 0; + ctx->tot_len = 0; +} + +void sha512_256_update(sha512_256_ctx *ctx, const unsigned char *message, + unsigned int len) +{ + unsigned int block_nb; + unsigned int new_len, rem_len, tmp_len; + const unsigned char *shifted_message; + + tmp_len = SHA512_BLOCK_SIZE - ctx->len; + rem_len = len < tmp_len ? len : tmp_len; + + memcpy(&ctx->block[ctx->len], message, rem_len); + + if (ctx->len + len < SHA512_BLOCK_SIZE) { + ctx->len += len; + return; + } + + new_len = len - rem_len; + block_nb = new_len / SHA512_BLOCK_SIZE; + + shifted_message = message + rem_len; + + sha512_transf(ctx, ctx->block, 1); + sha512_transf(ctx, shifted_message, block_nb); + + rem_len = new_len % SHA512_BLOCK_SIZE; + + memcpy(ctx->block, &shifted_message[block_nb << 7], + rem_len); + + ctx->len = rem_len; + ctx->tot_len += (block_nb + 1) << 7; +} + +void sha512_256_final(sha512_256_ctx *ctx, unsigned char *digest) +{ + unsigned int block_nb; + unsigned int pm_len; + unsigned int len_b; + +#ifndef UNROLL_LOOPS + int i; +#endif + + block_nb = 1 + ((SHA512_BLOCK_SIZE - 17) + < (ctx->len % SHA512_BLOCK_SIZE)); + + len_b = (ctx->tot_len + ctx->len) << 3; + pm_len = block_nb << 7; + + memset(ctx->block + ctx->len, 0, pm_len - ctx->len); + ctx->block[ctx->len] = 0x80; + UNPACK32(len_b, ctx->block + pm_len - 4); + + sha512_transf(ctx, ctx->block, block_nb); + +// Sha512/256 is basically sha512 except we take only the left most 256 bits +// If loops are defined, then take the first 4 chunks (not 8) +#ifndef UNROLL_LOOPS + for (i = 0 ; i < 4; i++) { + UNPACK64(ctx->h[i], &digest[i << 3]); + } +#else + UNPACK64(ctx->h[0], &digest[ 0]); + UNPACK64(ctx->h[1], &digest[ 8]); + UNPACK64(ctx->h[2], &digest[16]); + UNPACK64(ctx->h[3], &digest[24]); + + // Sha512/256 is basically sha512 except we take only the left most 256 bits + // Regular sha512 takes the full 64 bits + /* + UNPACK64(ctx->h[4], &digest[32]); + UNPACK64(ctx->h[5], &digest[40]); + UNPACK64(ctx->h[6], &digest[48]); + UNPACK64(ctx->h[7], &digest[56]); + */ + +#endif /* !UNROLL_LOOPS */ +} diff --git a/src/Native/libmultihash/sha512_256.h b/src/Native/libmultihash/sha512_256.h new file mode 100644 index 000000000..01996ad2e --- /dev/null +++ b/src/Native/libmultihash/sha512_256.h @@ -0,0 +1,79 @@ +/* + * FIPS 180-2 SHA-224/256/384/512 implementation + * Last update: 02/02/2007 + * Issue date: 04/30/2005 + * + * Copyright (C) 2022, The Radiant Blockchain Developers + * Copyright (C) 2013, Con Kolivas + * Copyright (C) 2005, 2007 Olivier Gay + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the project nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#include + +#ifndef SHA2_H +#define SHA2_H + +#define SHA512_BLOCK_SIZE (1024 / 8) + +#define SHFR(x, n) (x >> n) +#define ROTR(x, n) ((x >> n) | (x << ((sizeof(x) << 3) - n))) +#define CH(x, y, z) ((x & y) ^ (~x & z)) +#define MAJ(x, y, z) ((x & y) ^ (x & z) ^ (y & z)) + +//#ifndef SHA2_TYPES +//#define SHA2_TYPES +//typedef unsigned char uint8_t; +//typedef unsigned int uint32_t; +//typedef unsigned long long uint64_t; +//#endif + +#ifdef __cplusplus +extern "C" { +#endif + +typedef struct { + unsigned int tot_len; + unsigned int len; + unsigned char block[2 * SHA512_BLOCK_SIZE]; + uint64_t h[8]; +} sha512_ctx; + +typedef sha512_ctx sha512_256_ctx; + +void sha512_256_init(sha512_ctx *ctx); +void sha512_256_update(sha512_ctx *ctx, const unsigned char *message, + unsigned int len); +void sha512_256_final(sha512_ctx *ctx, unsigned char *digest); +void sha512_256(const unsigned char *message, unsigned int len, + unsigned char *digest); + +#ifdef __cplusplus +} +#endif + +#endif /* !SHA2_H */ From 59428bca36bc59b44d38a67bef284959ffc76185 Mon Sep 17 00:00:00 2001 From: VirusPowaa Date: Fri, 28 Oct 2022 15:35:36 +0200 Subject: [PATCH 32/54] Add Pink test 1 --- .../DaemonRequests/SendTransactionRequest.cs | 40 +++++++++++++++++++ .../Ethereum/EthereumPayoutHandler.cs | 30 ++++++-------- 2 files changed, 53 insertions(+), 17 deletions(-) diff --git a/src/Miningcore/Blockchain/Ethereum/DaemonRequests/SendTransactionRequest.cs b/src/Miningcore/Blockchain/Ethereum/DaemonRequests/SendTransactionRequest.cs index 4ecf42fb8..4494b9440 100644 --- a/src/Miningcore/Blockchain/Ethereum/DaemonRequests/SendTransactionRequest.cs +++ b/src/Miningcore/Blockchain/Ethereum/DaemonRequests/SendTransactionRequest.cs @@ -53,3 +53,43 @@ public class SendTransactionRequest [JsonConverter(typeof(HexToIntegralTypeJsonConverter))] public ulong MaxFeePerGas { get; set; } } + + +public class SendTransactionRequestPink +{ + /// + /// The address the transaction is send from. + /// + public string From { get; set; } + + /// + /// The address the transaction is directed to. + /// + public string To { get; set; } + + /// + /// (Optional) (default: 90000) Integer of the gas provided for the transaction execution. It will return unused gas + /// + [JsonConverter(typeof(HexToIntegralTypeJsonConverter))] + [JsonProperty(NullValueHandling = NullValueHandling.Ignore)] + public ulong? Gas { get; set; } + + /// + /// (Optional) Integer of the gas price used for each paid gas + /// + [JsonConverter(typeof(HexToIntegralTypeJsonConverter))] + [JsonProperty(NullValueHandling = NullValueHandling.Ignore)] + public ulong? GasPrice { get; set; } + + /// + /// (Optional) Integer of the value send with this transaction + /// + [JsonConverter(typeof(HexToIntegralTypeJsonConverter))] + public string Value { get; set; } + + /// + /// The compiled code of a contract OR the hash of the invoked method signature and encoded parameters. + /// + [JsonProperty(NullValueHandling = NullValueHandling.Ignore)] + public string Data { get; set; } +} \ No newline at end of file diff --git a/src/Miningcore/Blockchain/Ethereum/EthereumPayoutHandler.cs b/src/Miningcore/Blockchain/Ethereum/EthereumPayoutHandler.cs index c131afd57..2efb7f485 100644 --- a/src/Miningcore/Blockchain/Ethereum/EthereumPayoutHandler.cs +++ b/src/Miningcore/Blockchain/Ethereum/EthereumPayoutHandler.cs @@ -314,10 +314,10 @@ internal static decimal GetBaseBlockReward(GethChainType chainType, ulong height return EthereumConstants.ByzantiumBlockReward; return EthereumConstants.HomesteadBlockReward; - + case GethChainType.EtherOne: return EthOneConstants.BaseRewardInitial; - + case GethChainType.Pink: return PinkConstants.BaseRewardInitial; @@ -392,7 +392,7 @@ private async Task PayoutAsync(Balance balance, CancellationToken ct) var amount = (BigInteger) Math.Floor(balance.Amount * EthereumConstants.Wei); - var request = new SendTransactionRequest + SendTransactionRequest request = new SendTransactionRequest { From = poolConfig.Address, To = balance.Address, @@ -407,24 +407,20 @@ private async Task PayoutAsync(Balance balance, CancellationToken ct) request.MaxFeePerGas = extraConfig.MaxFeePerGas; } + RpcResponse response; if(extraPoolConfig?.ChainTypeOverride == "Pink") { - request.Gas = extraConfig.Gas; - } - - var response; - if(extraPoolConfig?.ChainTypeOverride == "Pink") - { - response = await rpcClient.ExecuteAsync(logger, EC.SendTx, ct, new[] {{ - From = request.From, - To = request.Address, - Value = request.Value, - Gas = extraConfig.Gas, - }}); + var requestPink = new SendTransactionRequestPink + { + From = poolConfig.Address, + To = balance.Address, + Value = amount.ToString("x").TrimStart('0'), + Gas = extraConfig.Gas + }; + response = await rpcClient.ExecuteAsync(logger, EC.SendTx, ct, new[] { request }); } - else { - response = await rpcClient.ExecuteAsync(logger, EC.SendTx, ct, new[] { request }); + response = await rpcClient.ExecuteAsync(logger, EC.SendTx, ct, new[] { request }); } if(response.Error != null) From ced4e315e56859cc8177d1a569272713898b7222 Mon Sep 17 00:00:00 2001 From: LoulouCrypto Date: Fri, 28 Oct 2022 19:45:16 +0200 Subject: [PATCH 33/54] maj --- src/Miningcore/Blockchain/Ethereum/EthereumPayoutHandler.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Miningcore/Blockchain/Ethereum/EthereumPayoutHandler.cs b/src/Miningcore/Blockchain/Ethereum/EthereumPayoutHandler.cs index 2efb7f485..24e55304c 100644 --- a/src/Miningcore/Blockchain/Ethereum/EthereumPayoutHandler.cs +++ b/src/Miningcore/Blockchain/Ethereum/EthereumPayoutHandler.cs @@ -417,7 +417,7 @@ private async Task PayoutAsync(Balance balance, CancellationToken ct) Value = amount.ToString("x").TrimStart('0'), Gas = extraConfig.Gas }; - response = await rpcClient.ExecuteAsync(logger, EC.SendTx, ct, new[] { request }); + response = await rpcClient.ExecuteAsync(logger, EC.SendTx, ct, new[] { requestPink }); } else { response = await rpcClient.ExecuteAsync(logger, EC.SendTx, ct, new[] { request }); From 381644cf0249462d6cb7a00c24c491f6905b2852 Mon Sep 17 00:00:00 2001 From: LoulouCrypto Date: Fri, 28 Oct 2022 21:11:11 +0200 Subject: [PATCH 34/54] On branch dev modified: src/Miningcore/Blockchain/Ethereum/EthereumPayoutHandler.cs --- src/Miningcore/Blockchain/Ethereum/EthereumPayoutHandler.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Miningcore/Blockchain/Ethereum/EthereumPayoutHandler.cs b/src/Miningcore/Blockchain/Ethereum/EthereumPayoutHandler.cs index 24e55304c..a1590311e 100644 --- a/src/Miningcore/Blockchain/Ethereum/EthereumPayoutHandler.cs +++ b/src/Miningcore/Blockchain/Ethereum/EthereumPayoutHandler.cs @@ -125,7 +125,7 @@ public async Task ClassifyBlocksAsync(IMiningPool pool, Block[] blocks, var gasUsed = blockHashResponse.Response.GasUsed; var burnedFee = (decimal) 0; - if(extraPoolConfig?.ChainTypeOverride == "Ethereum" || extraPoolConfig?.ChainTypeOverride == "MainPow" || extraPoolConfig?.ChainTypeOverride == "EtherOne" || extraPoolConfig?.ChainTypeOverride == "Pink") + if(extraPoolConfig?.ChainTypeOverride == "Ethereum" || extraPoolConfig?.ChainTypeOverride == "Main" || extraPoolConfig?.ChainTypeOverride == "MainPow" || extraPoolConfig?.ChainTypeOverride == "EtherOne" || extraPoolConfig?.ChainTypeOverride == "Pink") burnedFee = (baseGas * gasUsed / EthereumConstants.Wei); block.Hash = blockHash; @@ -399,7 +399,7 @@ private async Task PayoutAsync(Balance balance, CancellationToken ct) Value = amount.ToString("x").TrimStart('0'), }; - if(extraPoolConfig?.ChainTypeOverride == "Ethereum" || extraPoolConfig?.ChainTypeOverride == "MainPow" || extraPoolConfig?.ChainTypeOverride == "EtherOne" ) + if(extraPoolConfig?.ChainTypeOverride == "Ethereum" || extraPoolConfig?.ChainTypeOverride == "Main" || extraPoolConfig?.ChainTypeOverride == "MainPow" || extraPoolConfig?.ChainTypeOverride == "EtherOne" ) { var maxPriorityFeePerGas = await rpcClient.ExecuteAsync(logger, EC.MaxPriorityFeePerGas, ct); request.Gas = extraConfig.Gas; From f97727a63236468187213847a8bf1af3ef542742 Mon Sep 17 00:00:00 2001 From: LoulouCrypto Date: Sat, 29 Oct 2022 23:27:38 +0200 Subject: [PATCH 35/54] maj --- src/Miningcore/coins.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Miningcore/coins.json b/src/Miningcore/coins.json index 34e6dc55c..5fd0acd1c 100644 --- a/src/Miningcore/coins.json +++ b/src/Miningcore/coins.json @@ -4288,8 +4288,8 @@ "block": "https://pinkscan.org/block/$height$", "uncle": "https://pinkscan.org/uncle/$height$" }, - "explorerTxLink": "https://pinkscan.org/transactions/{0}", - "explorerAccountLink": "https://.pinkscan.org/contracts/{0}" + "explorerTxLink": "https://pinkscan.org/tx/{0}", + "explorerAccountLink": "https://pinkscan.org/address/{0}" }, "ergo": { "name": "Ergo", From 3a850d1bdd4e70fa9c958cb0d6bebaed12f8a5ca Mon Sep 17 00:00:00 2001 From: LoulouCrypto Date: Sat, 29 Oct 2022 23:37:09 +0200 Subject: [PATCH 36/54] Pink Add --- src/Miningcore/coins.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Miningcore/coins.json b/src/Miningcore/coins.json index 5fd0acd1c..cd9866e69 100644 --- a/src/Miningcore/coins.json +++ b/src/Miningcore/coins.json @@ -4281,7 +4281,7 @@ "family": "ethereum", "website": "https://pinkchain.net/", "market": "", - "twitter": "https://twitter.com/EtherOneChain", + "twitter": "https://twitter.com/PinkchainNet", "telegram": "https://t.me/PinkSmartChain", "discord": "https://discord.gg/jzxrn5H4eQ", "explorerBlockLinks": { From eed6fa0b096295ff9a9c78d561af631e17b4d192 Mon Sep 17 00:00:00 2001 From: LoulouCrypto Date: Wed, 2 Nov 2022 19:19:47 +0100 Subject: [PATCH 37/54] Test Add --- src/Miningcore.Tests/Crypto/HashingTests.cs | 22 +++++++++++++++++++ .../Ethereum/EthereumPayoutHandler.cs | 2 +- 2 files changed, 23 insertions(+), 1 deletion(-) diff --git a/src/Miningcore.Tests/Crypto/HashingTests.cs b/src/Miningcore.Tests/Crypto/HashingTests.cs index 4613e07f4..656e167f3 100644 --- a/src/Miningcore.Tests/Crypto/HashingTests.cs +++ b/src/Miningcore.Tests/Crypto/HashingTests.cs @@ -176,6 +176,17 @@ public void Sha256D_Hash() Assert.Equal("4f4eb6dbba8198745a278997e154e8309b571259e33fce4d3a31adea39dc9173", result); } + [Fact] + public void Sha256DT_Hash() + { + var hasher = new Sha256DT(); + var hash = new byte[32]; + hasher.Digest(testValue, hash); + var result = hash.ToHexString(); + + Assert.Equal("", result); + } + [Fact] public void Sha256S_Hash() { @@ -187,6 +198,17 @@ public void Sha256S_Hash() Assert.Equal("bd75a82b9957d6d043076dea52262635042693f1fe23bcadadaecc908e1e5cc6", result); } + [Fact] + public void Sha512256D_Hash() + { + var hasher = new Sha512256D(); + var hash = new byte[32]; + hasher.Digest(testValue, hash); + var result = hash.ToHexString(); + + Assert.Equal("", result); + } + [Fact] public void X11_Hash() { diff --git a/src/Miningcore/Blockchain/Ethereum/EthereumPayoutHandler.cs b/src/Miningcore/Blockchain/Ethereum/EthereumPayoutHandler.cs index a1590311e..d9d513237 100644 --- a/src/Miningcore/Blockchain/Ethereum/EthereumPayoutHandler.cs +++ b/src/Miningcore/Blockchain/Ethereum/EthereumPayoutHandler.cs @@ -392,7 +392,7 @@ private async Task PayoutAsync(Balance balance, CancellationToken ct) var amount = (BigInteger) Math.Floor(balance.Amount * EthereumConstants.Wei); - SendTransactionRequest request = new SendTransactionRequest + var request = new SendTransactionRequest { From = poolConfig.Address, To = balance.Address, From 48225fd0dcd1ff4a50db8c9007b9c373a806cbb2 Mon Sep 17 00:00:00 2001 From: LoulouCrypto Date: Fri, 4 Nov 2022 00:34:35 +0100 Subject: [PATCH 38/54] maj --- miningcore.code-workspace | 8 ++++++++ src/Miningcore.Tests/Crypto/HashingTests.cs | 2 +- 2 files changed, 9 insertions(+), 1 deletion(-) create mode 100644 miningcore.code-workspace diff --git a/miningcore.code-workspace b/miningcore.code-workspace new file mode 100644 index 000000000..876a1499c --- /dev/null +++ b/miningcore.code-workspace @@ -0,0 +1,8 @@ +{ + "folders": [ + { + "path": "." + } + ], + "settings": {} +} \ No newline at end of file diff --git a/src/Miningcore.Tests/Crypto/HashingTests.cs b/src/Miningcore.Tests/Crypto/HashingTests.cs index 656e167f3..a1cae06c4 100644 --- a/src/Miningcore.Tests/Crypto/HashingTests.cs +++ b/src/Miningcore.Tests/Crypto/HashingTests.cs @@ -206,7 +206,7 @@ public void Sha512256D_Hash() hasher.Digest(testValue, hash); var result = hash.ToHexString(); - Assert.Equal("", result); + Assert.Equal("6b86ce4bf945d8e935d51db4e32589acf6dbcda58ca1cef7568d52f704c46d7f", result); } [Fact] From aa66f278a2dce362f6e6b312139cf5902f66ed42 Mon Sep 17 00:00:00 2001 From: LoulouCrypto Date: Fri, 4 Nov 2022 20:26:16 +0100 Subject: [PATCH 39/54] maj --- .gitignore | 2 ++ src/Miningcore.Tests/Crypto/HashingTests.cs | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index 45ea3b60e..c318eebe2 100644 --- a/.gitignore +++ b/.gitignore @@ -204,3 +204,5 @@ fabric.properties # End of https://www.toptal.com/developers/gitignore/api/rider .idea + +.fake \ No newline at end of file diff --git a/src/Miningcore.Tests/Crypto/HashingTests.cs b/src/Miningcore.Tests/Crypto/HashingTests.cs index a1cae06c4..1399086d7 100644 --- a/src/Miningcore.Tests/Crypto/HashingTests.cs +++ b/src/Miningcore.Tests/Crypto/HashingTests.cs @@ -183,7 +183,7 @@ public void Sha256DT_Hash() var hash = new byte[32]; hasher.Digest(testValue, hash); var result = hash.ToHexString(); - + Console.WriteLine(result); Assert.Equal("", result); } From 46ce63f1dd27ee80c1526c1e2943a6b6ab112bd1 Mon Sep 17 00:00:00 2001 From: LoulouCrypto Date: Fri, 4 Nov 2022 20:33:55 +0100 Subject: [PATCH 40/54] Final Tests of Sha256DT and Sha512/256 testing --- src/Miningcore.Tests/Crypto/HashingTests.cs | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/Miningcore.Tests/Crypto/HashingTests.cs b/src/Miningcore.Tests/Crypto/HashingTests.cs index 1399086d7..75b88f3f7 100644 --- a/src/Miningcore.Tests/Crypto/HashingTests.cs +++ b/src/Miningcore.Tests/Crypto/HashingTests.cs @@ -183,8 +183,7 @@ public void Sha256DT_Hash() var hash = new byte[32]; hasher.Digest(testValue, hash); var result = hash.ToHexString(); - Console.WriteLine(result); - Assert.Equal("", result); + Assert.Equal("890541c5a3d7e482d76e6b0053b1bfbe7e0c2e000b5e0126e4f03a2b8bc5d3c3", result); } [Fact] From a448485866107dc25cb6f53bf06d67896333dd30 Mon Sep 17 00:00:00 2001 From: LoulouCrypto Date: Fri, 4 Nov 2022 20:42:53 +0100 Subject: [PATCH 41/54] Final Tests of Sha256DT and Sha512/256 testing --- src/Miningcore.Tests/Crypto/HashingTests.cs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/Miningcore.Tests/Crypto/HashingTests.cs b/src/Miningcore.Tests/Crypto/HashingTests.cs index 75b88f3f7..1399086d7 100644 --- a/src/Miningcore.Tests/Crypto/HashingTests.cs +++ b/src/Miningcore.Tests/Crypto/HashingTests.cs @@ -183,7 +183,8 @@ public void Sha256DT_Hash() var hash = new byte[32]; hasher.Digest(testValue, hash); var result = hash.ToHexString(); - Assert.Equal("890541c5a3d7e482d76e6b0053b1bfbe7e0c2e000b5e0126e4f03a2b8bc5d3c3", result); + Console.WriteLine(result); + Assert.Equal("", result); } [Fact] From 95e385625c132411369a9857a52b4798284180ae Mon Sep 17 00:00:00 2001 From: LoulouCrypto Date: Fri, 4 Nov 2022 20:48:32 +0100 Subject: [PATCH 42/54] Final Tests of Sha256DT and Sha512/256 testing --- src/Miningcore.Tests/Crypto/HashingTests.cs | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/Miningcore.Tests/Crypto/HashingTests.cs b/src/Miningcore.Tests/Crypto/HashingTests.cs index 1399086d7..ae1a7b282 100644 --- a/src/Miningcore.Tests/Crypto/HashingTests.cs +++ b/src/Miningcore.Tests/Crypto/HashingTests.cs @@ -183,8 +183,7 @@ public void Sha256DT_Hash() var hash = new byte[32]; hasher.Digest(testValue, hash); var result = hash.ToHexString(); - Console.WriteLine(result); - Assert.Equal("", result); + Assert.Equal("37b09f83da42efdfc80cfdceb35fe307d8c8007cea0313feda96a22dfc4a7c37", result); } [Fact] From 579fadb590027a7bb98a162bf3a5472b64a3176c Mon Sep 17 00:00:00 2001 From: LoulouCrypto Date: Fri, 4 Nov 2022 21:22:55 +0100 Subject: [PATCH 43/54] Final Tests of Sha256DT and Sha512/256 testing ( hope this will be good ) --- src/Miningcore.Tests/Crypto/HashingTests.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Miningcore.Tests/Crypto/HashingTests.cs b/src/Miningcore.Tests/Crypto/HashingTests.cs index ae1a7b282..cefe85ae6 100644 --- a/src/Miningcore.Tests/Crypto/HashingTests.cs +++ b/src/Miningcore.Tests/Crypto/HashingTests.cs @@ -181,7 +181,7 @@ public void Sha256DT_Hash() { var hasher = new Sha256DT(); var hash = new byte[32]; - hasher.Digest(testValue, hash); + hasher.Digest(testValue2, hash); var result = hash.ToHexString(); Assert.Equal("37b09f83da42efdfc80cfdceb35fe307d8c8007cea0313feda96a22dfc4a7c37", result); } From 398dca45073f4ea9821d918bd6c311dc5857f8a3 Mon Sep 17 00:00:00 2001 From: LoulouCrypto Date: Fri, 4 Nov 2022 21:45:17 +0100 Subject: [PATCH 44/54] Final Tests of Sha256DT and Sha512/256 testing ( last try for tonight .... ) --- src/Miningcore.Tests/Crypto/HashingTests.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Miningcore.Tests/Crypto/HashingTests.cs b/src/Miningcore.Tests/Crypto/HashingTests.cs index cefe85ae6..3c89ae1bd 100644 --- a/src/Miningcore.Tests/Crypto/HashingTests.cs +++ b/src/Miningcore.Tests/Crypto/HashingTests.cs @@ -183,7 +183,7 @@ public void Sha256DT_Hash() var hash = new byte[32]; hasher.Digest(testValue2, hash); var result = hash.ToHexString(); - Assert.Equal("37b09f83da42efdfc80cfdceb35fe307d8c8007cea0313feda96a22dfc4a7c37", result); + Assert.Equal("bf4735b3a0feebe83727a7a2327f8223eec7484190e8dd52611ce75b045a2e75", result); } [Fact] From cc2d9c5d10e29401c20bea13eb268ba197b2e457 Mon Sep 17 00:00:00 2001 From: jon4hz Date: Fri, 21 Oct 2022 04:11:44 +0200 Subject: [PATCH 45/54] fix: ethereum payout bug fix: increase block search offset fix: make block search offset configurable --- ...thereumPoolPaymentProcessingConfigExtra.cs | 5 ++ .../Blockchain/Ethereum/EthereumConstants.cs | 1 + .../Ethereum/EthereumPayoutHandler.cs | 55 ++++++++++++------- src/Miningcore/Payments/PayoutManager.cs | 6 +- .../Postgres/Repositories/BlockRepository.cs | 41 ++++++++------ .../Repositories/IBlockRepository.cs | 1 + 6 files changed, 69 insertions(+), 40 deletions(-) diff --git a/src/Miningcore/Blockchain/Ethereum/Configuration/EthereumPoolPaymentProcessingConfigExtra.cs b/src/Miningcore/Blockchain/Ethereum/Configuration/EthereumPoolPaymentProcessingConfigExtra.cs index fea560afd..977eb5895 100644 --- a/src/Miningcore/Blockchain/Ethereum/Configuration/EthereumPoolPaymentProcessingConfigExtra.cs +++ b/src/Miningcore/Blockchain/Ethereum/Configuration/EthereumPoolPaymentProcessingConfigExtra.cs @@ -21,4 +21,9 @@ public class EthereumPoolPaymentProcessingConfigExtra /// maximum amount you’re willing to pay /// public ulong MaxFeePerGas { get; set; } + + /// + /// Search offset to start looking for uncles + /// + public uint BlockSearchOffset { get; set; } = 50; } diff --git a/src/Miningcore/Blockchain/Ethereum/EthereumConstants.cs b/src/Miningcore/Blockchain/Ethereum/EthereumConstants.cs index b94e1bc29..e38a5549d 100644 --- a/src/Miningcore/Blockchain/Ethereum/EthereumConstants.cs +++ b/src/Miningcore/Blockchain/Ethereum/EthereumConstants.cs @@ -17,6 +17,7 @@ public class EthereumConstants public const string EthereumStratumVersion = "EthereumStratum/1.0.0"; public const decimal StaticTransactionFeeReserve = 0.0025m; // in ETH public const string BlockTypeUncle = "uncle"; + public const string BlockTypeBlock = "block"; #if !DEBUG public const int MinPayoutPeerCount = 1; diff --git a/src/Miningcore/Blockchain/Ethereum/EthereumPayoutHandler.cs b/src/Miningcore/Blockchain/Ethereum/EthereumPayoutHandler.cs index 9f8c18992..58db63ab7 100644 --- a/src/Miningcore/Blockchain/Ethereum/EthereumPayoutHandler.cs +++ b/src/Miningcore/Blockchain/Ethereum/EthereumPayoutHandler.cs @@ -50,7 +50,6 @@ public EthereumPayoutHandler( private RpcClient rpcClient; private EthereumNetworkType networkType; private GethChainType chainType; - private const int BlockSearchOffset = 50; private EthereumPoolConfigExtra extraPoolConfig; private EthereumPoolPaymentProcessingConfigExtra extraConfig; @@ -133,7 +132,7 @@ public async Task ClassifyBlocksAsync(IMiningPool pool, Block[] blocks, block.ConfirmationProgress = 1; block.BlockHeight = (ulong) blockInfo.Height; block.Reward = GetBaseBlockReward(chainType, block.BlockHeight); // base reward - block.Type = "block"; + block.Type = EthereumConstants.BlockTypeBlock; if(extraConfig?.KeepUncles == false) block.Reward += blockInfo.Uncles.Length * (block.Reward / 32); // uncle rewards @@ -150,8 +149,8 @@ public async Task ClassifyBlocksAsync(IMiningPool pool, Block[] blocks, } // search for a block containing our block as an uncle by checking N blocks in either direction - var heightMin = block.BlockHeight - BlockSearchOffset; - var heightMax = Math.Min(block.BlockHeight + BlockSearchOffset, latestBlockHeight); + var heightMin = block.BlockHeight - extraConfig.BlockSearchOffset; + var heightMax = Math.Min(block.BlockHeight + extraConfig.BlockSearchOffset, latestBlockHeight); var range = new List(); for(var k = heightMin; k < heightMax; k++) @@ -180,30 +179,44 @@ public async Task ClassifyBlocksAsync(IMiningPool pool, Block[] blocks, .Select(x => x.Response.ToObject()) .FirstOrDefault(x => string.Equals(x.Miner, poolConfig.Address, StringComparison.OrdinalIgnoreCase)); - if(uncle != null) + if(uncle != null) + { + // mature? + if(block.Reward == 0) + block.Reward = GetUncleReward(chainType, uncle.Height.Value, blockInfo2.Height.Value); + + if(latestBlockHeight - uncle.Height.Value >= EthereumConstants.MinConfimations) { - // mature? - if(block.Reward == 0) - block.Reward = GetUncleReward(chainType, uncle.Height.Value, blockInfo2.Height.Value); - if(latestBlockHeight - uncle.Height.Value >= EthereumConstants.MinConfimations) + // make sure there is no other uncle from that block stored in the DB already. + // when there is more than 1 uncle mined by us within the BlockSearchOffset + // range, the pool automatically assumes the first found block is the correct one. + // This is not always the case, so we need to check the DB for any other + // uncles from that block and continue searching if there any others. + // Otherwise the payouter will crash and no further blocks will be unlocked. + var duplBlock = await cf.Run(con => blockRepo.GetBlockByHeightAsync(con, poolConfig.Id, Convert.ToInt64(uncle.Height.Value))); + if(duplBlock != null && duplBlock.Type == EthereumConstants.BlockTypeUncle) { - block.Reward = GetUncleReward(chainType, uncle.Height.Value, blockInfo2.Height.Value); - block.Status = BlockStatus.Confirmed; - block.ConfirmationProgress = 1; - block.BlockHeight = uncle.Height.Value; - block.Type = EthereumConstants.BlockTypeUncle; - - logger.Info(() => $"[{LogCategory}] Unlocked uncle for block {blockInfo2.Height.Value} at height {uncle.Height.Value} worth {FormatAmount(block.Reward)}"); - - messageBus.NotifyBlockUnlocked(poolConfig.Id, block, coin); + logger.Info(() => $"[{LogCategory}] Found another uncle from block {uncle.Height.Value} in the DB. Continuing search for uncle."); + continue; } - else - logger.Info(() => $"[{LogCategory}] Got immature matching uncle for block {blockInfo2.Height.Value}. Will try again."); + block.Reward = GetUncleReward(chainType, uncle.Height.Value, blockInfo2.Height.Value); + block.Status = BlockStatus.Confirmed; + block.ConfirmationProgress = 1; + block.BlockHeight = uncle.Height.Value; + block.Type = EthereumConstants.BlockTypeUncle; - break; + logger.Info(() => $"[{LogCategory}] Unlocked uncle for block {blockInfo2.Height.Value} at height {uncle.Height.Value} worth {FormatAmount(block.Reward)}"); + + messageBus.NotifyBlockUnlocked(poolConfig.Id, block, coin); } + + else + logger.Info(() => $"[{LogCategory}] Got immature matching uncle for block {blockInfo2.Height.Value}. Will try again."); + + break; + } } } diff --git a/src/Miningcore/Payments/PayoutManager.cs b/src/Miningcore/Payments/PayoutManager.cs index 727ba6ed0..95288c7c9 100644 --- a/src/Miningcore/Payments/PayoutManager.cs +++ b/src/Miningcore/Payments/PayoutManager.cs @@ -62,11 +62,11 @@ public PayoutManager(IComponentContext ctx, private readonly ClusterConfig clusterConfig; private readonly CompositeDisposable disposables = new(); - #if !DEBUG +#if !DEBUG private static readonly TimeSpan initialRunDelay = TimeSpan.FromMinutes(1); - #else +#else private static readonly TimeSpan initialRunDelay = TimeSpan.FromSeconds(15); - #endif +#endif private void AttachPool(IMiningPool pool) { diff --git a/src/Miningcore/Persistence/Postgres/Repositories/BlockRepository.cs b/src/Miningcore/Persistence/Postgres/Repositories/BlockRepository.cs index a23835c2a..beba700a1 100644 --- a/src/Miningcore/Persistence/Postgres/Repositories/BlockRepository.cs +++ b/src/Miningcore/Persistence/Postgres/Repositories/BlockRepository.cs @@ -51,12 +51,12 @@ public async Task PageBlocksAsync(IDbConnection con, string poolId, Blo ORDER BY created DESC OFFSET @offset FETCH NEXT @pageSize ROWS ONLY"; return (await con.QueryAsync(new CommandDefinition(query, new - { - poolId, - status = status.Select(x => x.ToString().ToLower()).ToArray(), - offset = page * pageSize, - pageSize - }, cancellationToken: ct))) + { + poolId, + status = status.Select(x => x.ToString().ToLower()).ToArray(), + offset = page * pageSize, + pageSize + }, cancellationToken: ct))) .Select(mapper.Map) .ToArray(); } @@ -67,11 +67,11 @@ public async Task PageBlocksAsync(IDbConnection con, BlockStatus[] stat ORDER BY created DESC OFFSET @offset FETCH NEXT @pageSize ROWS ONLY"; return (await con.QueryAsync(new CommandDefinition(query, new - { - status = status.Select(x => x.ToString().ToLower()).ToArray(), - offset = page * pageSize, - pageSize - }, cancellationToken: ct))) + { + status = status.Select(x => x.ToString().ToLower()).ToArray(), + offset = page * pageSize, + pageSize + }, cancellationToken: ct))) .Select(mapper.Map) .ToArray(); } @@ -91,11 +91,11 @@ public async Task GetBlockBeforeAsync(IDbConnection con, string poolId, B ORDER BY created DESC FETCH NEXT 1 ROWS ONLY"; return (await con.QueryAsync(query, new - { - poolId, - before, - status = status.Select(x => x.ToString().ToLower()).ToArray() - })) + { + poolId, + before, + status = status.Select(x => x.ToString().ToLower()).ToArray() + })) .Select(mapper.Map) .FirstOrDefault(); } @@ -113,4 +113,13 @@ public Task GetPoolBlockCountAsync(IDbConnection con, string poolId, Cance return con.ExecuteScalarAsync(query, new { poolId }); } + + public async Task GetBlockByHeightAsync(IDbConnection con, string poolId, long height) + { + const string query = @"SELECT * FROM blocks WHERE poolid = @poolId AND blockheight = @height"; + + var entity = await con.QuerySingleOrDefaultAsync(new CommandDefinition(query, new { poolId, height })); + + return entity == null ? null : mapper.Map(entity); + } } diff --git a/src/Miningcore/Persistence/Repositories/IBlockRepository.cs b/src/Miningcore/Persistence/Repositories/IBlockRepository.cs index 683d2b5eb..8cf1959da 100644 --- a/src/Miningcore/Persistence/Repositories/IBlockRepository.cs +++ b/src/Miningcore/Persistence/Repositories/IBlockRepository.cs @@ -15,4 +15,5 @@ public interface IBlockRepository Task GetBlockBeforeAsync(IDbConnection con, string poolId, BlockStatus[] status, DateTime before); Task GetPoolBlockCountAsync(IDbConnection con, string poolId, CancellationToken ct); Task GetLastPoolBlockTimeAsync(IDbConnection con, string poolId); + Task GetBlockByHeightAsync(IDbConnection con, string poolId, long height); } From 4be0550d2cbe7be9caa3620cac599cd795e065e2 Mon Sep 17 00:00:00 2001 From: Oliver Weichhold Date: Wed, 9 Nov 2022 23:08:48 +0100 Subject: [PATCH 46/54] - Updated nuget deps - Fix libmultihash.vcxproj --- libs/runtimes/win-x64/libmultihash.dll | Bin 1734656 -> 1745920 bytes src/Miningcore.Tests/Miningcore.Tests.csproj | 4 ++-- src/Miningcore/Miningcore.csproj | 22 ++++++++--------- src/Native/libmultihash/exports.cpp | 24 +++++++++---------- src/Native/libmultihash/libmultihash.vcxproj | 4 ++-- src/Native/libmultihash/sha256dt.c | 1 - 6 files changed, 27 insertions(+), 28 deletions(-) diff --git a/libs/runtimes/win-x64/libmultihash.dll b/libs/runtimes/win-x64/libmultihash.dll index d3d74ab9273b03dd9f5716b6df70cfd2ea3920b4..8db1c52fc3ef956c4c2875e03995891361ca5157 100644 GIT binary patch delta 259899 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

q!MJ#T5j}O66zt-Gc*i<@bN`IkpU`THl)PI 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

(O@=UK?IgK>9l{APLawCr;e2hw} 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 diff --git a/src/Miningcore.Tests/Miningcore.Tests.csproj b/src/Miningcore.Tests/Miningcore.Tests.csproj index 885134473..1da5ff8bf 100644 --- a/src/Miningcore.Tests/Miningcore.Tests.csproj +++ b/src/Miningcore.Tests/Miningcore.Tests.csproj @@ -35,9 +35,9 @@ - + - + diff --git a/src/Miningcore/Miningcore.csproj b/src/Miningcore/Miningcore.csproj index 741b6f539..4e1d428a2 100644 --- a/src/Miningcore/Miningcore.csproj +++ b/src/Miningcore/Miningcore.csproj @@ -45,7 +45,7 @@ - + all runtime; build; native; contentfiles; analyzers; buildtransitive @@ -58,29 +58,29 @@ all runtime; build; native; contentfiles; analyzers; buildtransitive - + - - + + - - + + - - + + - - - + + + diff --git a/src/Native/libmultihash/exports.cpp b/src/Native/libmultihash/exports.cpp index 70d3260b0..715aaa763 100644 --- a/src/Native/libmultihash/exports.cpp +++ b/src/Native/libmultihash/exports.cpp @@ -49,13 +49,13 @@ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. #include "x16rv2.h" #include "x21s.h" #include "sha256csm.h" +#include "sha512_256.h" +#include "sha256dt.h" #include "hmq17.h" #include "phi.h" #include "verthash/h2.h" #include "equi/equihashverify.h" #include "heavyhash/heavyhash.h" -#include "sha512_256.h" -#include "sha256dt.h" #ifdef _WIN32 #include "blake2/ref/blake2.h" @@ -271,6 +271,16 @@ extern "C" MODULE_API void x22i_export(const char* input, char* output, uint32_t x22i_hash(input, output, input_len); } +extern "C" MODULE_API void sha512_256_export(const unsigned char* input, unsigned char* output, uint32_t input_len) +{ + sha512_256(input, input_len, output); +} + +extern "C" MODULE_API void sha256dt_export(const char* input, char* output) +{ + sha256dt_hash(input, output); +} + extern "C" MODULE_API int verthash_init_export(const char* filename, int createIfMissing) { return verthash_init(filename, createIfMissing); @@ -323,13 +333,3 @@ extern "C" MODULE_API bool equihash_verify_96_5_export(const char* header, int h return verifyEH_96_5(header, vecSolution, personalization); } - -extern "C" MODULE_API void sha512_256_export(const unsigned char* input, unsigned char* output, uint32_t input_len) -{ - sha512_256(input, input_len, output); -} - -extern "C" MODULE_API void sha256dt_export(const char* input, char* output) -{ - sha256dt_hash(input, output); -} diff --git a/src/Native/libmultihash/libmultihash.vcxproj b/src/Native/libmultihash/libmultihash.vcxproj index 0f2d4fd54..c7f34bc94 100644 --- a/src/Native/libmultihash/libmultihash.vcxproj +++ b/src/Native/libmultihash/libmultihash.vcxproj @@ -313,7 +313,7 @@ - + @@ -358,7 +358,7 @@ MaxSpeed - + diff --git a/src/Native/libmultihash/sha256dt.c b/src/Native/libmultihash/sha256dt.c index dd4db085b..39d313803 100644 --- a/src/Native/libmultihash/sha256dt.c +++ b/src/Native/libmultihash/sha256dt.c @@ -21,4 +21,3 @@ void sha256dt_hash(const char* input, char* output) SHA256_Update(&ctx, &temp, 32); SHA256_Final((unsigned char*) output, &ctx); } - From cb35eeb5253f429ca0c5b683c19f87d626e09e8f Mon Sep 17 00:00:00 2001 From: LoulouCrypto Date: Sat, 12 Nov 2022 21:00:31 +0100 Subject: [PATCH 47/54] Add GSP COIN --- src/Miningcore/coins.json | 35 ++++++++++++++++++++++++++++++++++- 1 file changed, 34 insertions(+), 1 deletion(-) diff --git a/src/Miningcore/coins.json b/src/Miningcore/coins.json index cd9866e69..287f851bf 100644 --- a/src/Miningcore/coins.json +++ b/src/Miningcore/coins.json @@ -2176,7 +2176,39 @@ "explorerBlockLink": "https://explorer.raptoreum.com/block-height/$height$", "explorerTxLink": "https://explorer.raptoreum.com/tx/{0}", "explorerAccountLink": "https://explorer.raptoreum.com/address/{0}" - }, + }, + "gspcoin": { + "name": "Gsp Coin", + "canonicalName": "GspCoin", + "symbol": "GSPC", + "family": "bitcoin", + "website": "https://coin.globalsocialpost.com/", + "twitter": "https://twitter.com/gspcoin", + "discord": "https://discord.gg/Anh2sr4txV", + "coinbaseHasher": { + "hash": "sha256d" + }, + "headerHasher": { + "hash": "ghostrider" + }, + "blockHasher": { + "hash": "reverse", + "args": [ + { + "hash": "sha256d" + } + ] + }, + "hasFounderFee": true, + "hasMasterNodes": true, + "foundersRewardAddress": [ + "GZBNAiLokyYvSwNLftReXuYbvdmzNoorGj" + ], + "shareMultiplier": 65536, + "explorerBlockLink": "https://explorer.globalsocialpost.com/block/$height$", + "explorerTxLink": "https://explorer.globalsocialpost.com/tx/{0}", + "explorerAccountLink": "https://explorer.globalsocialpost.com/address/{0}" + }, "radiant": { "name": "Radiant", "symbol": "RXD", @@ -2246,6 +2278,7 @@ "explorerTxLink": "https://explorer.bitoreum.org/tx/{0}", "explorerAccountLink": "https://explorer.bitoreum.org/address/{0}" }, + "rosecoin": { "name": "Rosecoin", "symbol": "ROC", From d07a646e2fd559f57211a737edd8f08c145ac9f3 Mon Sep 17 00:00:00 2001 From: LoulouCrypto Date: Sat, 12 Nov 2022 22:22:05 +0100 Subject: [PATCH 48/54] Add GSP COIN --- src/Miningcore/coins.json | 1 + 1 file changed, 1 insertion(+) diff --git a/src/Miningcore/coins.json b/src/Miningcore/coins.json index 287f851bf..a856cc9e9 100644 --- a/src/Miningcore/coins.json +++ b/src/Miningcore/coins.json @@ -2183,6 +2183,7 @@ "symbol": "GSPC", "family": "bitcoin", "website": "https://coin.globalsocialpost.com/", + "market": "https://www.bitoreum.exchange/trading/gspcusdt", "twitter": "https://twitter.com/gspcoin", "discord": "https://discord.gg/Anh2sr4txV", "coinbaseHasher": { From 064694257e05f83a37a78d63a43cb2d9d70ffc17 Mon Sep 17 00:00:00 2001 From: LoulouCrypto <68774649+LoulouCrypto@users.noreply.github.com> Date: Tue, 15 Nov 2022 20:59:37 +0100 Subject: [PATCH 49/54] Update coins.json --- src/Miningcore/coins.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Miningcore/coins.json b/src/Miningcore/coins.json index a856cc9e9..8e5f890c3 100644 --- a/src/Miningcore/coins.json +++ b/src/Miningcore/coins.json @@ -4302,8 +4302,8 @@ "telegram": "https://t.me/ether_one_blockchain", "discord": "https://discord.com/invite/vF2SDb6Yz9", "explorerBlockLinks": { - "block": "https://www.oklink.com/en/ethw/block/$height$", - "uncle": "https://www.oklink.com/en/ethw/uncle/$height$" + "block": "https://explorer2.etherone.one/blocks/$height$", + "uncle": "https://explorer2.etherone.one/uncle/$height$" }, "explorerTxLink": "https://explorer2.etherone.one/transactions/{0}", "explorerAccountLink": "https://explorer2.etherone.one/accounts/{0}" From 9c139280b0fe676d40fa69c79679be97b11027e6 Mon Sep 17 00:00:00 2001 From: LoulouCrypto Date: Sun, 20 Nov 2022 16:28:22 +0100 Subject: [PATCH 50/54] EtherOne Blockscout explorer add --- src/Miningcore/coins.json | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/Miningcore/coins.json b/src/Miningcore/coins.json index 8e5f890c3..33b156a92 100644 --- a/src/Miningcore/coins.json +++ b/src/Miningcore/coins.json @@ -4302,11 +4302,11 @@ "telegram": "https://t.me/ether_one_blockchain", "discord": "https://discord.com/invite/vF2SDb6Yz9", "explorerBlockLinks": { - "block": "https://explorer2.etherone.one/blocks/$height$", - "uncle": "https://explorer2.etherone.one/uncle/$height$" + "block": "https://blockscout.etherone.one/block/$height$", + "uncle": "https://blockscout.etherone.one/uncles/$height$" }, - "explorerTxLink": "https://explorer2.etherone.one/transactions/{0}", - "explorerAccountLink": "https://explorer2.etherone.one/accounts/{0}" + "explorerTxLink": "https://blockscout.etherone.one/tx/{0}", + "explorerAccountLink": "https://blockscout.etherone.one/address/{0}" }, "pinkchain": { "name": "PinkChain", From 641ddc32d5d4eedb8390b27488d546577c87c49f Mon Sep 17 00:00:00 2001 From: Oliver Weichhold Date: Wed, 30 Nov 2022 16:12:10 +0100 Subject: [PATCH 51/54] Fix build error --- src/Native/libcryptonight/Makefile | 1 - 1 file changed, 1 deletion(-) diff --git a/src/Native/libcryptonight/Makefile b/src/Native/libcryptonight/Makefile index eb1d2fdc7..5d91ff233 100644 --- a/src/Native/libcryptonight/Makefile +++ b/src/Native/libcryptonight/Makefile @@ -8,7 +8,6 @@ OBJECTS = exports.o \ xmrig/crypto/cn/asm/cn_main_loop.o \ xmrig/crypto/cn/asm/CryptonightR_template.o \ xmrig/crypto/cn/r/CryptonightR_gen.o \ - xmrig/crypto/cn/gpu/cn_gpu_avx.o \ xmrig/crypto/cn/gpu/cn_gpu_ssse3.o \ xmrig-override/backend/cpu/platform/BasicCpuInfo.o \ \ From 0838e98dd562cfac79c73c3e2655d6b7da1ee112 Mon Sep 17 00:00:00 2001 From: Oliver Weichhold Date: Wed, 30 Nov 2022 16:23:14 +0100 Subject: [PATCH 52/54] disable CN-GPU AVX impl in libcryptonight --- src/Native/libcryptonight/xmrig/crypto/cn/CryptoNight_x86.h | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/Native/libcryptonight/xmrig/crypto/cn/CryptoNight_x86.h b/src/Native/libcryptonight/xmrig/crypto/cn/CryptoNight_x86.h index 8ad8be63f..c0063a87d 100644 --- a/src/Native/libcryptonight/xmrig/crypto/cn/CryptoNight_x86.h +++ b/src/Native/libcryptonight/xmrig/crypto/cn/CryptoNight_x86.h @@ -884,11 +884,15 @@ inline void cryptonight_single_hash_gpu(const uint8_t *__restrict__ input, size_ fesetround(FE_TONEAREST); # endif +#if true // OW: always use ssse3 to circumvent build problems with CN-GPU AVX impl on some linux systems without AVX2 support + cn_gpu_inner_ssse3(ctx[0]->state, ctx[0]->memory); +#else if (xmrig::Cpu::info()->hasAVX2()) { cn_gpu_inner_avx(ctx[0]->state, ctx[0]->memory); } else { cn_gpu_inner_ssse3(ctx[0]->state, ctx[0]->memory); } +#endif cn_implode_scratchpad(ctx[0]); keccakf(reinterpret_cast(ctx[0]->state), 24); From c172fb204d9a213779abbbff086c93c3568c585e Mon Sep 17 00:00:00 2001 From: Oliver Weichhold Date: Thu, 1 Dec 2022 09:10:42 +0100 Subject: [PATCH 53/54] Update BCH explorer links --- src/Miningcore/coins.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/Miningcore/coins.json b/src/Miningcore/coins.json index 33b156a92..775438c32 100644 --- a/src/Miningcore/coins.json +++ b/src/Miningcore/coins.json @@ -344,9 +344,9 @@ } ] }, - "explorerBlockLink": "https://bch.tokenview.com/block/$height$", - "explorerTxLink": "https://bch.tokenview.com/tx/{0}", - "explorerAccountLink": "https://bch.tokenview.com/address/{0}" + "explorerBlockLink": "https://bchblockexplorer.com/block/$height$", + "explorerTxLink": "https://bchblockexplorer.com/tx/{0}", + "explorerAccountLink": "https://bchblockexplorer.com/address/{0}" }, "bitcoin-diamond": { "name": "Bitcoin Diamond", From f93bee026a19ea50a5a6e432f3dcfa95b2873460 Mon Sep 17 00:00:00 2001 From: Oliver Weichhold Date: Thu, 1 Dec 2022 09:27:46 +0100 Subject: [PATCH 54/54] Update BTC explorer --- src/Miningcore/coins.json | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/Miningcore/coins.json b/src/Miningcore/coins.json index 775438c32..fa4a37586 100644 --- a/src/Miningcore/coins.json +++ b/src/Miningcore/coins.json @@ -316,9 +316,9 @@ ] }, "coinbaseIgnoreAuxFlags": true, - "explorerBlockLink": "https://btc.tokenview.com/block/$height$", - "explorerTxLink": "https://btc.tokenview.com/tx/{0}", - "explorerAccountLink": "https://btc.tokenview.com/address/{0}" + "explorerBlockLink": "https://www.blockchain.com/btc/block/$hash$", + "explorerTxLink": "https://www.blockchain.com/btc/tx/{0}", + "explorerAccountLink": "https://www.blockchain.com/btc/address/{0}" }, "bitcoin-cash": { "name": "Bitcoin Cash", @@ -2209,7 +2209,7 @@ "explorerBlockLink": "https://explorer.globalsocialpost.com/block/$height$", "explorerTxLink": "https://explorer.globalsocialpost.com/tx/{0}", "explorerAccountLink": "https://explorer.globalsocialpost.com/address/{0}" - }, + }, "radiant": { "name": "Radiant", "symbol": "RXD", @@ -2279,7 +2279,7 @@ "explorerTxLink": "https://explorer.bitoreum.org/tx/{0}", "explorerAccountLink": "https://explorer.bitoreum.org/address/{0}" }, - + "rosecoin": { "name": "Rosecoin", "symbol": "ROC",