Skip to content
This repository was archived by the owner on Oct 20, 2023. It is now read-only.

Commit 171a262

Browse files
author
Oliver Weichhold
authored
Merge pull request #1519 from oliverw/dev
Dev
2 parents b1c46a3 + f93bee0 commit 171a262

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

51 files changed

+2151
-950
lines changed

.github/workflows/dotnet.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,4 +27,4 @@ jobs:
2727
- name: Build
2828
run: dotnet build --no-restore src
2929
- name: Test
30-
run: dotnet test --no-build --verbosity normal src
30+
run: dotnet test --logger:"console;verbosity=detailed" --no-build --verbosity normal src

.gitignore

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -204,3 +204,5 @@ fabric.properties
204204

205205
# End of https://www.toptal.com/developers/gitignore/api/rider
206206
.idea
207+
208+
.fake

README.md

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -223,14 +223,13 @@ Once again, do not run a production pool on Windows! This is not a supported con
223223

224224
To support this project you can become a [sponsor](https://github.com/sponsors/oliverw) or send a donation to the following accounts:
225225

226-
* XMR: `46S2AEwYmD9fnmZkxCpXf1T3U3DyEq3Ekb8Lg9kgUMGABn9Fp9q5nE2fBcXebrjrXfZHy5uC5HfLE6X4WLtSm35wUr9Mh46`
227-
* BTC: `bc1quzdczlpfn3n4xvpdz0x9h79569afhg0ashwxxp`
228-
* BCH: `qrf6uhhapq7fgkjv2ce2hcjqpk8ec2zc25et4xsphv`
229-
* LTC: `LTK6CWastkmBzGxgQhTTtCUjkjDA14kxzC`
226+
* ETH: `miningcore.eth (ENS Address)`
227+
* BTC: `miningcore.eth (ENS Address)`
228+
* LTC: `miningcore.eth (ENS Address)`
230229
* DOGE: `DGDuKRhBewGP1kbUz4hszNd2p6dDzWYy9Q`
231-
* ETH: `0xcb55abBfe361B12323eb952110cE33d5F28BeeE1`
232230
* ETC: `0xF8cCE9CE143C68d3d4A7e6bf47006f21Cfcf93c0`
233231
* DASH: `XqpBAV9QCaoLnz42uF5frSSfrJTrqHoxjp`
234232
* ZEC: `t1YHZHz2DGVMJiggD2P4fBQ2TAPgtLSUwZ7`
235233
* BTG: `GQb77ZuMCyJGZFyxpzqNfm7GB1rQreP4n6`
236234
* ERGO: `9foYU8JkoqWBSDA3ba8VHfduPXV2NaVNPPAFkdYoR9t9cPQGMv4`
235+
* XMR: `46S2AEwYmD9fnmZkxCpXf1T3U3DyEq3Ekb8Lg9kgUMGABn9Fp9q5nE2fBcXebrjrXfZHy5uC5HfLE6X4WLtSm35wUr9Mh46`

appveyor.yml

Lines changed: 0 additions & 45 deletions
This file was deleted.
11 KB
Binary file not shown.

miningcore.code-workspace

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
{
2+
"folders": [
3+
{
4+
"path": "."
5+
}
6+
],
7+
"settings": {}
8+
}

src/Miningcore.Tests/Benchmarks/Stratum/StratumConnectionBenchmarks.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ public void Setup()
3939
clock = ModuleInitializer.Container.Resolve<IMasterClock>();
4040
logger = new NullLogger(LogManager.LogFactory);
4141

42-
connection = new(logger, rmsm, clock, ConnectionId);
42+
connection = new(logger, rmsm, clock, ConnectionId, false);
4343
wrapper = new(connection);
4444
}
4545

Lines changed: 119 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,119 @@
1+
using Autofac;
2+
using Microsoft.IO;
3+
using Miningcore.Blockchain.Bitcoin;
4+
using Miningcore.Configuration;
5+
using Miningcore.Stratum;
6+
using Miningcore.Tests.Util;
7+
using NBitcoin;
8+
using Newtonsoft.Json;
9+
using NLog;
10+
using Xunit;
11+
#pragma warning disable 8974
12+
13+
namespace Miningcore.Tests.Blockchain.Bitcoin;
14+
15+
public class BitcoinJobTests : TestBase
16+
{
17+
[Fact]
18+
public void Process_Valid_Block()
19+
{
20+
var (job, worker) = CreateJob();
21+
22+
var submitParams = JsonConvert.DeserializeObject<object[]>("[\"yXHmbak4AdgK5vWamwqFtEijn2NpgLvmi4\",\"00000001\",\"01000000\",\"63445774\",\"51036775\"]", jsonSerializerSettings);
23+
24+
// extract params
25+
var extraNonce2 = submitParams[2] as string;
26+
var nTime = submitParams[3] as string;
27+
var nonce = submitParams[4] as string;
28+
29+
// validate & process
30+
var (share, blockHex) = job.ProcessShare(worker, extraNonce2, nTime, nonce);
31+
32+
Assert.NotNull(share);
33+
Assert.Equal("00000056300e9fd18624edd7eaa8bcd6c8466d7eb8cf91b4e60f9d35fa97f504", share.BlockHash);
34+
Assert.Equal("000000204b0e40a0b523ec3d00fc1a7cee084165a111646b9b35e50936ada1861a0100000362a84c2b4b2e530ec640e2a7f85e05da2c42c8e3645a5bbc2245e74ec1ae967457446371d7011e756703510103000500010000000000000000000000000000000000000000000000000000000000000000ffffffff1d03b66a0c04745744630060000001010000000a4d696e696e67636f7265000000000241016d40000000001976a91464f2b2b84f62d68a2cd7f7f5fb2b5aa75ef716d788ac2c56f32a000000001976a9141a9cab092e161f3822af4b27f4f33051dbb7d32088ac00000000460200b66a0c00fbab6816312c05803d026cce30fec0332c059f66e421ab0bf65b96ea9efb8a22e12cfc31666208b47a006e5b74f95a4c0797b6bc620ea1cc07cb53616e547302", blockHex);
35+
Assert.Equal(813750, share.BlockHeight);
36+
Assert.True(share.IsBlockCandidate);
37+
}
38+
39+
[Fact]
40+
public void Process_Duplicate_Submission()
41+
{
42+
var (job, worker) = CreateJob();
43+
44+
var submitParams = JsonConvert.DeserializeObject<object[]>("[\"yXHmbak4AdgK5vWamwqFtEijn2NpgLvmi4\",\"00000001\",\"01000000\",\"63445774\",\"51036775\"]", jsonSerializerSettings);
45+
46+
// extract params
47+
var extraNonce2 = submitParams[2] as string;
48+
var nTime = submitParams[3] as string;
49+
var nonce = submitParams[4] as string;
50+
51+
// validate & process
52+
var (share, _) = job.ProcessShare(worker, extraNonce2, nTime, nonce);
53+
54+
Assert.NotNull(share);
55+
Assert.True(share.IsBlockCandidate);
56+
57+
Assert.ThrowsAny<StratumException>(()=> job.ProcessShare(worker, extraNonce2, nTime, nonce));
58+
}
59+
60+
[Fact]
61+
public void Process_Invalid_Nonce()
62+
{
63+
var (job, worker) = CreateJob();
64+
65+
var submitParams = JsonConvert.DeserializeObject<object[]>("[\"yXHmbak4AdgK5vWamwqFtEijn2NpgLvmi4\",\"00000001\",\"01000000\",\"63445774\",\"61036775\"]", jsonSerializerSettings);
66+
67+
// extract params
68+
var extraNonce2 = submitParams[2] as string;
69+
var nTime = submitParams[3] as string;
70+
var nonce = submitParams[4] as string;
71+
72+
// validate & process
73+
Assert.ThrowsAny<StratumException>(()=> job.ProcessShare(worker, extraNonce2, nTime, nonce));
74+
}
75+
76+
[Fact]
77+
public void Process_Invalid_Time()
78+
{
79+
var (job, worker) = CreateJob();
80+
81+
var submitParams = JsonConvert.DeserializeObject<object[]>("[\"yXHmbak4AdgK5vWamwqFtEijn2NpgLvmi4\",\"00000001\",\"01000000\",\"13445774\",\"51036775\"]", jsonSerializerSettings);
82+
83+
// extract params
84+
var extraNonce2 = submitParams[2] as string;
85+
var nTime = submitParams[3] as string;
86+
var nonce = submitParams[4] as string;
87+
88+
// validate & process
89+
Assert.ThrowsAny<StratumException>(()=> job.ProcessShare(worker, extraNonce2, nTime, nonce));
90+
}
91+
92+
private (BitcoinJob, StratumConnection) CreateJob()
93+
{
94+
var job = new BitcoinJob();
95+
var coin = (BitcoinTemplate) ModuleInitializer.CoinTemplates["dash"];
96+
var pc = new PoolConfig { Template = coin };
97+
98+
var blockTemplate = JsonConvert.DeserializeObject<Miningcore.Blockchain.Bitcoin.DaemonResponses.BlockTemplate>("{\"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);
99+
var clock = MockMasterClock.FromTicks(638010200200475015);
100+
var poolAddressDestination = BitcoinUtils.AddressToDestination("yNkA6gVSPqKzW6WmJtTazRLKbSkQA5ND2h", Network.TestNet);
101+
var network = Network.GetNetwork("testnet");
102+
103+
var context = new BitcoinWorkerContext
104+
{
105+
Miner = "yXHmbak4AdgK5vWamwqFtEijn2NpgLvmi4",
106+
ExtraNonce1 = "60000001",
107+
Difficulty = 0.01,
108+
UserAgent = "cpuminer-multi/1.3.1"
109+
};
110+
111+
var worker = new StratumConnection(new NullLogger(LogManager.LogFactory), container.Resolve<RecyclableMemoryStreamManager>(), clock, "1", false);
112+
worker.SetContext(context);
113+
114+
job.Init(blockTemplate, "1", pc, null, new ClusterConfig(), clock, poolAddressDestination, network, false,
115+
coin.ShareMultiplier, coin.CoinbaseHasherValue, coin.HeaderHasherValue, coin.BlockHasherValue);
116+
117+
return (job, worker);
118+
}
119+
}
Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,66 @@
1+
using System.Linq;
2+
using System.Reflection;
3+
using System.Runtime.Serialization;
4+
using Miningcore.Configuration;
5+
using Xunit;
6+
using Xunit.Abstractions;
7+
#pragma warning disable 8974
8+
9+
namespace Miningcore.Tests.Coins;
10+
11+
public class CoinTemplateValidationTest : TestBase
12+
{
13+
private readonly ITestOutputHelper output;
14+
15+
public CoinTemplateValidationTest(ITestOutputHelper output)
16+
{
17+
this.output = output;
18+
}
19+
20+
[Fact]
21+
public void Validate_Coin_Templates()
22+
{
23+
var cft = typeof(CoinFamily).GetTypeInfo();
24+
var cryptonightHashType = typeof(CryptonightHashType).GetTypeInfo();
25+
26+
foreach(var template in ModuleInitializer.CoinTemplates)
27+
{
28+
var t = template.Value;
29+
30+
output.WriteLine($"* {t.Name ?? t.Symbol ?? t.CanonicalName}");
31+
32+
Assert.NotEmpty(t.Name);
33+
Assert.NotEmpty(t.Symbol);
34+
Assert.True(CoinTemplate.Families.ContainsKey(t.Family));
35+
Assert.NotNull(cft.DeclaredMembers.SingleOrDefault(x => x.Name == t.Family.ToString())?.GetCustomAttribute<EnumMemberAttribute>(false));
36+
37+
switch(t)
38+
{
39+
case BitcoinTemplate bt when t is BitcoinTemplate:
40+
{
41+
if(bt.CoinbaseHasher != null)
42+
Assert.Null(Record.Exception(() => bt.CoinbaseHasherValue));
43+
44+
if(bt.HeaderHasher != null)
45+
Assert.Null(Record.Exception(() => bt.HeaderHasherValue));
46+
47+
if(bt.BlockHasher != null)
48+
Assert.Null(Record.Exception(() => bt.BlockHasherValue));
49+
50+
if(bt.PoSBlockHasher != null)
51+
Assert.Null(Record.Exception(() => bt.PoSBlockHasherValue));
52+
break;
53+
}
54+
55+
case CryptonoteCoinTemplate cnt when t is CryptonoteCoinTemplate:
56+
{
57+
Assert.NotNull(cryptonightHashType.DeclaredMembers.SingleOrDefault(x => x.Name == cnt.Hash.ToString())?.GetCustomAttribute<EnumMemberAttribute>(false));
58+
59+
break;
60+
}
61+
}
62+
63+
Assert.NotEmpty(t.GetAlgorithmName());
64+
}
65+
}
66+
}

src/Miningcore.Tests/Crypto/HashingTests.cs

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -176,6 +176,16 @@ public void Sha256D_Hash()
176176
Assert.Equal("4f4eb6dbba8198745a278997e154e8309b571259e33fce4d3a31adea39dc9173", result);
177177
}
178178

179+
[Fact]
180+
public void Sha256DT_Hash()
181+
{
182+
var hasher = new Sha256DT();
183+
var hash = new byte[32];
184+
hasher.Digest(testValue2, hash);
185+
var result = hash.ToHexString();
186+
Assert.Equal("bf4735b3a0feebe83727a7a2327f8223eec7484190e8dd52611ce75b045a2e75", result);
187+
}
188+
179189
[Fact]
180190
public void Sha256S_Hash()
181191
{
@@ -187,6 +197,17 @@ public void Sha256S_Hash()
187197
Assert.Equal("bd75a82b9957d6d043076dea52262635042693f1fe23bcadadaecc908e1e5cc6", result);
188198
}
189199

200+
[Fact]
201+
public void Sha512256D_Hash()
202+
{
203+
var hasher = new Sha512256D();
204+
var hash = new byte[32];
205+
hasher.Digest(testValue, hash);
206+
var result = hash.ToHexString();
207+
208+
Assert.Equal("6b86ce4bf945d8e935d51db4e32589acf6dbcda58ca1cef7568d52f704c46d7f", result);
209+
}
210+
190211
[Fact]
191212
public void X11_Hash()
192213
{

0 commit comments

Comments
 (0)