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

Commit 506f321

Browse files
author
Oliver Weichhold
authored
Merge pull request #1207 from oliverw/dev
Dev
2 parents 05b7810 + 76f9715 commit 506f321

File tree

101 files changed

+1902
-1918
lines changed

Some content is hidden

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

101 files changed

+1902
-1918
lines changed

Diff for: src/Miningcore.Tests/Miningcore.Tests.csproj

+3-3
Original file line numberDiff line numberDiff line change
@@ -33,10 +33,10 @@
3333
</ItemGroup>
3434

3535
<ItemGroup>
36-
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.0.0" />
36+
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.1.0" />
3737
<PackageReference Include="Microsoft.Reactive.Testing" Version="5.0.0" />
38-
<PackageReference Include="NLog" Version="4.7.13" />
39-
<PackageReference Include="Npgsql" Version="6.0.2" />
38+
<PackageReference Include="NLog" Version="4.7.14" />
39+
<PackageReference Include="Npgsql" Version="6.0.3" />
4040
<PackageReference Include="xunit" Version="2.4.1" />
4141
<PackageReference Include="xunit.runner.visualstudio" Version="2.4.3">
4242
<PrivateAssets>all</PrivateAssets>

Diff for: src/Miningcore/AutoMapperProfile.cs

+1
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ public AutoMapperProfile()
2525
CreateMap<Blockchain.Share, Block>()
2626
.ForMember(dest => dest.Reward, opt => opt.MapFrom(src => src.BlockReward))
2727
.ForMember(dest => dest.Hash, opt => opt.MapFrom(src => src.BlockHash))
28+
.ForMember(dest => dest.Type, opt => opt.MapFrom(src => src.BlockType))
2829
.ForMember(dest => dest.Status, opt => opt.Ignore());
2930

3031
CreateMap<BlockStatus, string>().ConvertUsing(e => e.ToString().ToLower());

Diff for: src/Miningcore/AutofacModule.cs

-2
Original file line numberDiff line numberDiff line change
@@ -54,8 +54,6 @@ protected override void Load(ContainerBuilder builder)
5454

5555
builder.RegisterInstance(new RecyclableMemoryStreamManager
5656
{
57-
MaximumFreeSmallPoolBytes = 0x100000, // 1 MB
58-
MaximumFreeLargePoolBytes = 0x1000000, // 16 MB
5957
ThrowExceptionOnToArray = true
6058
});
6159

Diff for: src/Miningcore/Banning/IntegratedBanManager.cs

+2-2
Original file line numberDiff line numberDiff line change
@@ -21,8 +21,8 @@ public bool IsBanned(IPAddress address)
2121

2222
public void Ban(IPAddress address, TimeSpan duration)
2323
{
24-
Contract.RequiresNonNull(address, nameof(address));
25-
Contract.Requires<ArgumentException>(duration.TotalMilliseconds > 0, $"{nameof(duration)} must not be empty");
24+
Contract.RequiresNonNull(address);
25+
Contract.Requires<ArgumentException>(duration.TotalMilliseconds > 0);
2626

2727
// don't ban loopback
2828
if(address.Equals(IPAddress.Loopback) || address.Equals(IPAddress.IPv6Loopback))

Diff for: src/Miningcore/Blockchain/Bitcoin/BitcoinJob.cs

+13-13
Original file line numberDiff line numberDiff line change
@@ -533,15 +533,15 @@ public void Init(BlockTemplate blockTemplate, string jobId,
533533
bool isPoS, double shareMultiplier, IHashAlgorithm coinbaseHasher,
534534
IHashAlgorithm headerHasher, IHashAlgorithm blockHasher)
535535
{
536-
Contract.RequiresNonNull(blockTemplate, nameof(blockTemplate));
537-
Contract.RequiresNonNull(pc, nameof(pc));
538-
Contract.RequiresNonNull(cc, nameof(cc));
539-
Contract.RequiresNonNull(clock, nameof(clock));
540-
Contract.RequiresNonNull(poolAddressDestination, nameof(poolAddressDestination));
541-
Contract.RequiresNonNull(coinbaseHasher, nameof(coinbaseHasher));
542-
Contract.RequiresNonNull(headerHasher, nameof(headerHasher));
543-
Contract.RequiresNonNull(blockHasher, nameof(blockHasher));
544-
Contract.Requires<ArgumentException>(!string.IsNullOrEmpty(jobId), $"{nameof(jobId)} must not be empty");
536+
Contract.RequiresNonNull(blockTemplate);
537+
Contract.RequiresNonNull(pc);
538+
Contract.RequiresNonNull(cc);
539+
Contract.RequiresNonNull(clock);
540+
Contract.RequiresNonNull(poolAddressDestination);
541+
Contract.RequiresNonNull(coinbaseHasher);
542+
Contract.RequiresNonNull(headerHasher);
543+
Contract.RequiresNonNull(blockHasher);
544+
Contract.Requires<ArgumentException>(!string.IsNullOrEmpty(jobId));
545545

546546
coin = pc.Template.As<BitcoinTemplate>();
547547
networkParams = coin.GetNetwork(network.ChainName);
@@ -635,10 +635,10 @@ public object GetJobParams(bool isNew)
635635
public virtual (Share Share, string BlockHex) ProcessShare(StratumConnection worker,
636636
string extraNonce2, string nTime, string nonce, string versionBits = null)
637637
{
638-
Contract.RequiresNonNull(worker, nameof(worker));
639-
Contract.Requires<ArgumentException>(!string.IsNullOrEmpty(extraNonce2), $"{nameof(extraNonce2)} must not be empty");
640-
Contract.Requires<ArgumentException>(!string.IsNullOrEmpty(nTime), $"{nameof(nTime)} must not be empty");
641-
Contract.Requires<ArgumentException>(!string.IsNullOrEmpty(nonce), $"{nameof(nonce)} must not be empty");
638+
Contract.RequiresNonNull(worker);
639+
Contract.Requires<ArgumentException>(!string.IsNullOrEmpty(extraNonce2));
640+
Contract.Requires<ArgumentException>(!string.IsNullOrEmpty(nTime));
641+
Contract.Requires<ArgumentException>(!string.IsNullOrEmpty(nonce));
642642

643643
var context = worker.ContextAs<BitcoinWorkerContext>();
644644

Diff for: src/Miningcore/Blockchain/Bitcoin/BitcoinJobManager.cs

+8-3
Original file line numberDiff line numberDiff line change
@@ -151,6 +151,11 @@ await GetBlockTemplateAsync(ct) :
151151
return (isNew, forceUpdate);
152152
}
153153

154+
catch(OperationCanceledException)
155+
{
156+
// ignored
157+
}
158+
154159
catch(Exception ex)
155160
{
156161
logger.Error(ex, () => $"Error during {nameof(UpdateJob)}");
@@ -183,7 +188,7 @@ public override void Configure(PoolConfig pc, ClusterConfig cc)
183188

184189
public virtual object[] GetSubscriberData(StratumConnection worker)
185190
{
186-
Contract.RequiresNonNull(worker, nameof(worker));
191+
Contract.RequiresNonNull(worker);
187192

188193
var context = worker.ContextAs<BitcoinWorkerContext>();
189194

@@ -203,8 +208,8 @@ public virtual object[] GetSubscriberData(StratumConnection worker)
203208
public virtual async ValueTask<Share> SubmitShareAsync(StratumConnection worker, object submission,
204209
CancellationToken ct)
205210
{
206-
Contract.RequiresNonNull(worker, nameof(worker));
207-
Contract.RequiresNonNull(submission, nameof(submission));
211+
Contract.RequiresNonNull(worker);
212+
Contract.RequiresNonNull(submission);
208213

209214
if(submission is not object[] submitParams)
210215
throw new StratumException(StratumError.Other, "invalid params");

Diff for: src/Miningcore/Blockchain/Bitcoin/BitcoinJobManagerBase.cs

+11-12
Original file line numberDiff line numberDiff line change
@@ -28,10 +28,10 @@ protected BitcoinJobManagerBase(
2828
IExtraNonceProvider extraNonceProvider) :
2929
base(ctx, messageBus)
3030
{
31-
Contract.RequiresNonNull(ctx, nameof(ctx));
32-
Contract.RequiresNonNull(clock, nameof(clock));
33-
Contract.RequiresNonNull(messageBus, nameof(messageBus));
34-
Contract.RequiresNonNull(extraNonceProvider, nameof(extraNonceProvider));
31+
Contract.RequiresNonNull(ctx);
32+
Contract.RequiresNonNull(clock);
33+
Contract.RequiresNonNull(messageBus);
34+
Contract.RequiresNonNull(extraNonceProvider);
3535

3636
this.clock = clock;
3737
this.extraNonceProvider = extraNonceProvider;
@@ -396,9 +396,11 @@ protected override async Task<bool> AreDaemonsConnectedAsync(CancellationToken c
396396

397397
protected override async Task EnsureDaemonsSynchedAsync(CancellationToken ct)
398398
{
399+
using var timer = new PeriodicTimer(TimeSpan.FromSeconds(5));
400+
399401
var syncPendingNotificationShown = false;
400402

401-
while(true)
403+
do
402404
{
403405
var response = await rpc.ExecuteAsync<BlockTemplate>(logger,
404406
BitcoinCommands.GetBlockTemplate, ct, GetBlockTemplateParams());
@@ -418,10 +420,7 @@ protected override async Task EnsureDaemonsSynchedAsync(CancellationToken ct)
418420
}
419421

420422
await ShowDaemonSyncProgressAsync(ct);
421-
422-
// delay retry by 5s
423-
await Task.Delay(5000, ct);
424-
}
423+
} while(await timer.WaitForNextTickAsync(ct));
425424
}
426425

427426
protected override async Task PostStartInitAsync(CancellationToken ct)
@@ -447,7 +446,7 @@ protected override async Task PostStartInitAsync(CancellationToken ct)
447446
.ToArray();
448447

449448
if(errors.Any())
450-
throw new PoolStartupException($"Init RPC failed: {string.Join(", ", errors.Select(y => y.Error.Message))}");
449+
throw new PoolStartupException($"Init RPC failed: {string.Join(", ", errors.Select(y => y.Error.Message))}", poolConfig.Id);
451450
}
452451

453452
// extract results
@@ -468,7 +467,7 @@ protected override async Task PostStartInitAsync(CancellationToken ct)
468467

469468
// ensure pool owns wallet
470469
if(validateAddressResponse is not {IsValid: true})
471-
throw new PoolStartupException($"Daemon reports pool-address '{poolConfig.Address}' as invalid");
470+
throw new PoolStartupException($"Daemon reports pool-address '{poolConfig.Address}' as invalid", poolConfig.Id);
472471

473472
isPoS = poolConfig.Template is BitcoinTemplate {IsPseudoPoS: true} || difficultyResponse.Values().Any(x => x.Path == "proof-of-stake");
474473

@@ -502,7 +501,7 @@ protected override async Task PostStartInitAsync(CancellationToken ct)
502501
else if(submitBlockResponse.Error?.Code == -1)
503502
hasSubmitBlockMethod = true;
504503
else
505-
throw new PoolStartupException("Unable detect block submission RPC method");
504+
throw new PoolStartupException("Unable detect block submission RPC method", poolConfig.Id);
506505

507506
if(!hasLegacyDaemon)
508507
await UpdateNetworkStatsAsync(ct);

Diff for: src/Miningcore/Blockchain/Bitcoin/BitcoinPayoutHandler.cs

+7-7
Original file line numberDiff line numberDiff line change
@@ -36,9 +36,9 @@ public BitcoinPayoutHandler(
3636
IMessageBus messageBus) :
3737
base(cf, mapper, shareRepo, blockRepo, balanceRepo, paymentRepo, clock, messageBus)
3838
{
39-
Contract.RequiresNonNull(ctx, nameof(ctx));
40-
Contract.RequiresNonNull(balanceRepo, nameof(balanceRepo));
41-
Contract.RequiresNonNull(paymentRepo, nameof(paymentRepo));
39+
Contract.RequiresNonNull(ctx);
40+
Contract.RequiresNonNull(balanceRepo);
41+
Contract.RequiresNonNull(paymentRepo);
4242

4343
this.ctx = ctx;
4444
}
@@ -54,7 +54,7 @@ public BitcoinPayoutHandler(
5454

5555
public virtual Task ConfigureAsync(ClusterConfig cc, PoolConfig pc, CancellationToken ct)
5656
{
57-
Contract.RequiresNonNull(pc, nameof(pc));
57+
Contract.RequiresNonNull(pc);
5858

5959
poolConfig = pc;
6060
clusterConfig = cc;
@@ -72,8 +72,8 @@ public virtual Task ConfigureAsync(ClusterConfig cc, PoolConfig pc, Cancellation
7272

7373
public virtual async Task<Block[]> ClassifyBlocksAsync(IMiningPool pool, Block[] blocks, CancellationToken ct)
7474
{
75-
Contract.RequiresNonNull(poolConfig, nameof(poolConfig));
76-
Contract.RequiresNonNull(blocks, nameof(blocks));
75+
Contract.RequiresNonNull(poolConfig);
76+
Contract.RequiresNonNull(blocks);
7777

7878
var coin = poolConfig.Template.As<CoinTemplate>();
7979
var pageSize = 100;
@@ -188,7 +188,7 @@ public virtual Task CalculateBlockEffortAsync(IMiningPool pool, Block block, dou
188188

189189
public virtual async Task PayoutAsync(IMiningPool pool, Balance[] balances, CancellationToken ct)
190190
{
191-
Contract.RequiresNonNull(balances, nameof(balances));
191+
Contract.RequiresNonNull(balances);
192192

193193
// build args
194194
var amounts = balances

Diff for: src/Miningcore/Blockchain/Bitcoin/BitcoinPool.cs

+12-19
Original file line numberDiff line numberDiff line change
@@ -143,7 +143,7 @@ protected virtual async Task OnAuthorizeAsync(StratumConnection connection, Time
143143

144144
banManager.Ban(connection.RemoteEndpoint.Address, loginFailureBanTimeout);
145145

146-
CloseConnection(connection);
146+
Disconnect(connection);
147147
}
148148
}
149149

@@ -175,12 +175,10 @@ protected virtual async Task OnSubmitAsync(StratumConnection connection, Timesta
175175
else if(!context.IsSubscribed)
176176
throw new StratumException(StratumError.NotSubscribed, "not subscribed");
177177

178-
// submit
179178
var requestParams = request.ParamsAs<string[]>();
180-
var poolEndpoint = poolConfig.Ports[connection.LocalEndpoint.Port];
181179

180+
// submit
182181
var share = await manager.SubmitShareAsync(connection, requestParams, ct);
183-
184182
await connection.RespondAsync(true, request.Id);
185183

186184
// publish
@@ -197,7 +195,8 @@ protected virtual async Task OnSubmitAsync(StratumConnection connection, Timesta
197195

198196
// update client stats
199197
context.Stats.ValidShares++;
200-
await UpdateVarDiffAsync(connection);
198+
199+
await UpdateVarDiffAsync(connection, false, ct);
201200
}
202201

203202
catch(StratumException ex)
@@ -315,26 +314,23 @@ private void ConfigureMinimumDiff(StratumConnection connection, BitcoinWorkerCon
315314
}
316315
}
317316

318-
protected virtual Task OnNewJobAsync(object jobParams)
317+
protected virtual async Task OnNewJobAsync(object jobParams)
319318
{
320319
currentJobParams = jobParams;
321320

322-
logger.Info(() => "Broadcasting job");
321+
logger.Info(() => $"Broadcasting job {((object[]) jobParams)[0]}");
323322

324-
return Guard(Task.WhenAll(TaskForEach(async connection =>
323+
await Guard(() => ForEachMinerAsync(async (connection, ct) =>
325324
{
326325
var context = connection.ContextAs<BitcoinWorkerContext>();
327326

328-
if(!context.IsSubscribed || !context.IsAuthorized || CloseIfDead(connection, context))
329-
return;
330-
331327
// varDiff: if the client has a pending difficulty change, apply it now
332328
if(context.ApplyPendingDifficulty())
333329
await connection.NotifyAsync(BitcoinStratumMethods.SetDifficulty, new object[] { context.Difficulty });
334330

335331
// send job
336332
await connection.NotifyAsync(BitcoinStratumMethods.MiningNotify, currentJobParams);
337-
})), ex=> logger.Debug(() => $"{nameof(OnNewJobAsync)}: {ex.Message}"));
333+
}));
338334
}
339335

340336
public override double HashrateFromShares(double shares, double interval)
@@ -458,16 +454,13 @@ protected override async Task OnRequestAsync(StratumConnection connection,
458454
}
459455
}
460456

461-
protected override async Task OnVarDiffUpdateAsync(StratumConnection connection, double newDiff)
457+
protected override async Task OnVarDiffUpdateAsync(StratumConnection connection, double newDiff, CancellationToken ct)
462458
{
463-
var context = connection.ContextAs<BitcoinWorkerContext>();
464-
465-
context.EnqueueNewDifficulty(newDiff);
459+
await base.OnVarDiffUpdateAsync(connection, newDiff, ct);
466460

467-
// apply immediately and notify
468-
if(context.ApplyPendingDifficulty())
461+
if(connection.Context.ApplyPendingDifficulty())
469462
{
470-
await connection.NotifyAsync(BitcoinStratumMethods.SetDifficulty, new object[] { context.Difficulty });
463+
await connection.NotifyAsync(BitcoinStratumMethods.SetDifficulty, new object[] { connection.Context.Difficulty });
471464
await connection.NotifyAsync(BitcoinStratumMethods.MiningNotify, currentJobParams);
472465
}
473466
}

Diff for: src/Miningcore/Blockchain/Cryptonote/CryptonoteJob.cs

+8-8
Original file line numberDiff line numberDiff line change
@@ -15,11 +15,11 @@ public class CryptonoteJob
1515
public CryptonoteJob(GetBlockTemplateResponse blockTemplate, byte[] instanceId, string jobId,
1616
CryptonoteCoinTemplate coin, PoolConfig poolConfig, ClusterConfig clusterConfig, string prevHash, string randomXRealm)
1717
{
18-
Contract.RequiresNonNull(blockTemplate, nameof(blockTemplate));
19-
Contract.RequiresNonNull(poolConfig, nameof(poolConfig));
20-
Contract.RequiresNonNull(clusterConfig, nameof(clusterConfig));
21-
Contract.RequiresNonNull(instanceId, nameof(instanceId));
22-
Contract.Requires<ArgumentException>(!string.IsNullOrEmpty(jobId), $"{nameof(jobId)} must not be empty");
18+
Contract.RequiresNonNull(blockTemplate);
19+
Contract.RequiresNonNull(poolConfig);
20+
Contract.RequiresNonNull(clusterConfig);
21+
Contract.RequiresNonNull(instanceId);
22+
Contract.Requires<ArgumentException>(!string.IsNullOrEmpty(jobId));
2323

2424
BlockTemplate = blockTemplate;
2525
PrepareBlobTemplate(instanceId);
@@ -133,9 +133,9 @@ public void PrepareWorkerJob(CryptonoteWorkerJob workerJob, out string blob, out
133133

134134
public (Share Share, string BlobHex) ProcessShare(string nonce, uint workerExtraNonce, string workerHash, StratumConnection worker)
135135
{
136-
Contract.Requires<ArgumentException>(!string.IsNullOrEmpty(nonce), $"{nameof(nonce)} must not be empty");
137-
Contract.Requires<ArgumentException>(!string.IsNullOrEmpty(workerHash), $"{nameof(workerHash)} must not be empty");
138-
Contract.Requires<ArgumentException>(workerExtraNonce != 0, $"{nameof(workerExtraNonce)} must not be empty");
136+
Contract.Requires<ArgumentException>(!string.IsNullOrEmpty(nonce));
137+
Contract.Requires<ArgumentException>(!string.IsNullOrEmpty(workerHash));
138+
Contract.Requires<ArgumentException>(workerExtraNonce != 0);
139139

140140
var context = worker.ContextAs<CryptonoteWorkerContext>();
141141

0 commit comments

Comments
 (0)