diff --git a/appveyor.yml b/appveyor.yml index ca6ec2d964..4edf883108 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -21,13 +21,13 @@ build_script: - 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 netcoreapp2.1 + - dotnet publish -c Release --framework netcoreapp2.2 - # Publish Artifacts - - sh: (cd bin/Release/netcoreapp2.1 && 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\netcoreapp2.1 && mkdir miningcore && xcopy publish\* miningcore /S && 7z a miningcore-win-x64.zip miningcore && appveyor PushArtifact miningcore-win-x64.zip && cd ..\..\.. + - sh: (cd bin/Release/netcoreapp2.2 && 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\netcoreapp2.2 && 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 netcoreapp2.1 + - dotnet build -c Release --framework netcoreapp2.2 #---------------------------------# # tests configuration # diff --git a/libs/runtimes/win-x64/libcryptonight.dll b/libs/runtimes/win-x64/libcryptonight.dll index 4bdb9c8113..427ce9fccc 100644 Binary files a/libs/runtimes/win-x64/libcryptonight.dll and b/libs/runtimes/win-x64/libcryptonight.dll differ diff --git a/src/.editorconfig b/src/.editorconfig new file mode 100644 index 0000000000..f26c4c150b --- /dev/null +++ b/src/.editorconfig @@ -0,0 +1,26 @@ +root = true + +# Unix-style newlines with a newline ending every file +[*] +end_of_line = lf +insert_final_newline = true +charset = utf-8 +indent_style = space +indent_size = 4 +trim_trailing_whitespace = true + +[*.cs] +csharp_space_after_cast = true +csharp_space_after_keywords_in_control_flow_statements = false +csharp_space_between_method_declaration_parameter_list_parentheses = false +csharp_space_between_method_call_parameter_list_parentheses = false +csharp_space_around_binary_operators = true + +# Tab indentation (no size specified) +[Makefile] +indent_style = tab + +# Matches the exact files either package.json or .travis.yml +[{package.json,.travis.yml}] +indent_style = space +indent_size = 2 diff --git a/src/Miningcore.Tests/Blockchain/Bitcoin/BitcoinJobTests.cs b/src/Miningcore.Tests/Blockchain/Bitcoin/BitcoinJobTests.cs index 1e378da14e..bcdd1f21ba 100644 --- a/src/Miningcore.Tests/Blockchain/Bitcoin/BitcoinJobTests.cs +++ b/src/Miningcore.Tests/Blockchain/Bitcoin/BitcoinJobTests.cs @@ -34,13 +34,13 @@ public BitcoinJobTests() [Fact] public void BitcoinJob_Should_Accept_Valid_Share() { - var worker = new StratumClient(); + var worker = new StratumClient(); - worker.SetContext(new BitcoinWorkerContext - { - Difficulty = 0.5, - ExtraNonce1 = "01000058", - }); + worker.SetContext(new BitcoinWorkerContext + { + Difficulty = 0.5, + ExtraNonce1 = "01000058", + }); var bt = JsonConvert.DeserializeObject( "{\"Version\":536870912,\"PreviousBlockhash\":\"000000000909578519b5be7b37fdc53b2923817921c43108a907b72264da76bb\",\"CoinbaseValue\":5000000000,\"Target\":\"7fffff0000000000000000000000000000000000000000000000000000000000\",\"NonceRange\":\"00000000ffffffff\",\"CurTime\":1508869874,\"Bits\":\"207fffff\",\"Height\":14,\"Transactions\":[],\"CoinbaseAux\":{\"Flags\":\"0b2f454231362f414431322f\"},\"default_witness_commitment\":null}"); @@ -69,13 +69,13 @@ public void BitcoinJob_Should_Accept_Valid_Share() [Fact] public void BitcoinJob_Should_Not_Accept_Invalid_Share() { - var worker = new StratumClient(); + var worker = new StratumClient(); - worker.SetContext(new BitcoinWorkerContext - { - Difficulty = 0.5, - ExtraNonce1 = "01000058", - }); + worker.SetContext(new BitcoinWorkerContext + { + Difficulty = 0.5, + ExtraNonce1 = "01000058", + }); var bt = JsonConvert.DeserializeObject( "{\"Version\":536870912,\"PreviousBlockhash\":\"000000000909578519b5be7b37fdc53b2923817921c43108a907b72264da76bb\",\"CoinbaseValue\":5000000000,\"Target\":\"7fffff0000000000000000000000000000000000000000000000000000000000\",\"NonceRange\":\"00000000ffffffff\",\"CurTime\":1508869874,\"Bits\":\"207fffff\",\"Height\":14,\"Transactions\":[],\"CoinbaseAux\":{\"Flags\":\"0b2f454231362f414431322f\"},\"default_witness_commitment\":null}"); diff --git a/src/Miningcore.Tests/Blockchain/Cryptonote/CryptonoteJobTests.cs b/src/Miningcore.Tests/Blockchain/Cryptonote/CryptonoteJobTests.cs index 6b52269777..200120e286 100644 --- a/src/Miningcore.Tests/Blockchain/Cryptonote/CryptonoteJobTests.cs +++ b/src/Miningcore.Tests/Blockchain/Cryptonote/CryptonoteJobTests.cs @@ -47,12 +47,12 @@ public void MoneroJob_PrepareWorkerJob() [Fact] public void MoneroJob_Should_Accept_Valid_Share() { - var worker = new StratumClient(); + var worker = new StratumClient(); - worker.SetContext(new CryptonoteWorkerContext - { - Difficulty = 1000, - }); + worker.SetContext(new CryptonoteWorkerContext + { + Difficulty = 1000, + }); var bt = JsonConvert.DeserializeObject( "{\"blocktemplate_blob\":\"0106e7eabdcf058234351e2e6ea901a56b33bb531587424321873072d80a9e97295b6c43152b9d00000000019c0201ffe00106e3a1a0cc010275d92c0a057aa5f073079694a153d426f837f49fdb9654da10a5364e79a2086280a0d9e61d028b46dca0d04998500b40b046fd6f8bb33229e6380fd465dbb1327aa6f813d8bd80c0fc82aa0202372f076459e769116d604d30aabff7160782acc0d20e0c5cdc8963ed4e16372f8090cad2c60e02f009504ce65538bbb684b466b21be3a90e3740f185d7089d37b75f0cf62b6e7680e08d84ddcb0102cf01b85c0b592bb6e508e20b5d317052b75de121908390363201abff3476ef0180c0caf384a302024b81076c8ad0cfe84cc32fe0813d63cdd0f7d8d0e56d82aa3f58cbbe49d4c61e2b017aaf3074be7ecb30a769595758e4da7c7c87ead864baf89b679b73153dfa352c0208000000000000000000\",\"Difficulty\":2,\"Height\":224,\"prev_hash\":\"8234351e2e6ea901a56b33bb531587424321873072d80a9e97295b6c43152b9d\",\"reserved_offset\":322,\"Status\":\"OK\"}"); @@ -71,14 +71,14 @@ public void MoneroJob_Should_Accept_Valid_Share() [Fact] public void MoneroJob_Should_Not_Accept_Invalid_Share() { - var worker = new StratumClient(); + var worker = new StratumClient(); - worker.SetContext(new CryptonoteWorkerContext - { - Difficulty = 1000, - }); + worker.SetContext(new CryptonoteWorkerContext + { + Difficulty = 1000, + }); - var bt = JsonConvert.DeserializeObject( + var bt = JsonConvert.DeserializeObject( "{\"blocktemplate_blob\":\"0106e7eabdcf058234351e2e6ea901a56b33bb531587424321873072d80a9e97295b6c43152b9d00000000019c0201ffe00106e3a1a0cc010275d92c0a057aa5f073079694a153d426f837f49fdb9654da10a5364e79a2086280a0d9e61d028b46dca0d04998500b40b046fd6f8bb33229e6380fd465dbb1327aa6f813d8bd80c0fc82aa0202372f076459e769116d604d30aabff7160782acc0d20e0c5cdc8963ed4e16372f8090cad2c60e02f009504ce65538bbb684b466b21be3a90e3740f185d7089d37b75f0cf62b6e7680e08d84ddcb0102cf01b85c0b592bb6e508e20b5d317052b75de121908390363201abff3476ef0180c0caf384a302024b81076c8ad0cfe84cc32fe0813d63cdd0f7d8d0e56d82aa3f58cbbe49d4c61e2b017aaf3074be7ecb30a769595758e4da7c7c87ead864baf89b679b73153dfa352c0208000000000000000000\",\"Difficulty\":2,\"Height\":224,\"prev_hash\":\"8234351e2e6ea901a56b33bb531587424321873072d80a9e97295b6c43152b9d\",\"reserved_offset\":322,\"Status\":\"OK\"}"); var job = new CryptonoteJob(bt, "d150da".HexToByteArray(), "1", poolConfig, clusterConfig, ""); diff --git a/src/Miningcore.Tests/Blockchain/Ethereum/EthereumJobTests.cs b/src/Miningcore.Tests/Blockchain/Ethereum/EthereumJobTests.cs index 1392c206b4..db03cb00aa 100644 --- a/src/Miningcore.Tests/Blockchain/Ethereum/EthereumJobTests.cs +++ b/src/Miningcore.Tests/Blockchain/Ethereum/EthereumJobTests.cs @@ -8,15 +8,15 @@ namespace Miningcore.Tests.Blockchain.Ethereum { - /// - /// These tests take ages to complete (> 10 min. on modern hardware) - /// due to the time it takes to generate the DAG for EthashFull - /// - public class EthereumJobTests : TestBase + /// + /// These tests take ages to complete (> 10 min. on modern hardware) + /// due to the time it takes to generate the DAG for EthashFull + /// + public class EthereumJobTests : TestBase { static readonly EthashFull ethash = new EthashFull(3, Path.GetTempPath()); - /* + /* [Fact] public async Task EthereumJob_Should_Accept_Valid_Share() { diff --git a/src/Miningcore.Tests/Crypto/CrytonoteTests.cs b/src/Miningcore.Tests/Crypto/CrytonoteTests.cs index f7977a7997..939738d3bd 100644 --- a/src/Miningcore.Tests/Crypto/CrytonoteTests.cs +++ b/src/Miningcore.Tests/Crypto/CrytonoteTests.cs @@ -17,8 +17,8 @@ public void Crytonight() LibCryptonight.Cryptonight(blobConverted, buf, CryptonightVariant.VARIANT_0, 0); var result = buf.ToHexString(); Assert.Equal("a845ffbdf83ae9a8ffa504a1011efbd5ed2294bb9da591d3b583740568402c00", result); - - Array.Clear(buf,0, buf.Length); + + Array.Clear(buf, 0, buf.Length); LibCryptonight.Cryptonight(blobConverted, buf, CryptonightVariant.VARIANT_0, 0); result = buf.ToHexString(); diff --git a/src/Miningcore.Tests/Crypto/HashingTests.cs b/src/Miningcore.Tests/Crypto/HashingTests.cs index 4d3414dde9..ffdd277eeb 100644 --- a/src/Miningcore.Tests/Crypto/HashingTests.cs +++ b/src/Miningcore.Tests/Crypto/HashingTests.cs @@ -119,7 +119,7 @@ public void Lyra2Rev3_Hash() { var hasher = new Lyra2Rev3(); var hash = new byte[32]; - hasher.Digest(Enumerable.Repeat((byte)5, 80).ToArray(), hash); + hasher.Digest(Enumerable.Repeat((byte) 5, 80).ToArray(), hash); var result = hash.ToHexString(); Assert.Equal("c56ec425ada2c8ddcb8d5a79a3a0c9d79f66318193049fb81f875c537a4f963d", result); diff --git a/src/Miningcore.Tests/Crypto/MerkleTreeTests.cs b/src/Miningcore.Tests/Crypto/MerkleTreeTests.cs index 3328f77828..f6535c057d 100644 --- a/src/Miningcore.Tests/Crypto/MerkleTreeTests.cs +++ b/src/Miningcore.Tests/Crypto/MerkleTreeTests.cs @@ -80,7 +80,7 @@ public void MerkleTree_99HashesTest_Branches() { List hashesList = new List(); - for (int i = 0; i < 100; i++) + for(int i = 0; i < 100; i++) { byte[] value = Encoding.ASCII.GetBytes(i.ToString()); byte[] hash = MerkelHash(value); @@ -94,7 +94,7 @@ public void MerkleTree_99HashesTest_Branches() .ToArray(); - foreach (var hex in output) + foreach(var hex in output) this.output.WriteLine(hex); string[] expectedOutput = { @@ -114,7 +114,7 @@ public void MerkleTree_99HashesTest_Branches() private static byte[] MerkelHash(byte[] input) { - using (var hash = SHA256.Create()) + using(var hash = SHA256.Create()) { var first = hash.ComputeHash(input, 0, input.Length); return hash.ComputeHash(first); diff --git a/src/Miningcore.Tests/ModuleInitializer.cs b/src/Miningcore.Tests/ModuleInitializer.cs index c47fc7c39d..9bc89615d7 100644 --- a/src/Miningcore.Tests/ModuleInitializer.cs +++ b/src/Miningcore.Tests/ModuleInitializer.cs @@ -25,9 +25,9 @@ public static class ModuleInitializer /// public static void Initialize() { - lock (initLock) + lock(initLock) { - if (isInitialized) + if(isInitialized) return; var builder = new ContainerBuilder(); diff --git a/src/Miningcore.Tests/VarDiff/VarDiffManagerTests.cs b/src/Miningcore.Tests/VarDiff/VarDiffManagerTests.cs index 938831ecfd..b4d4dd353b 100644 --- a/src/Miningcore.Tests/VarDiff/VarDiffManagerTests.cs +++ b/src/Miningcore.Tests/VarDiff/VarDiffManagerTests.cs @@ -12,67 +12,67 @@ namespace Miningcore.Tests.VarDiff { public class VarDiffManagerTests : TestBase { -/* - private static readonly VarDiffConfig config = new VarDiffConfig - { - RetargetTime = 90, - MinDiff = 1000, - MaxDiff = 10000, - TargetTime = 15, - VariancePercent = 30, - MaxDelta = 1000, - }; + /* + private static readonly VarDiffConfig config = new VarDiffConfig + { + RetargetTime = 90, + MinDiff = 1000, + MaxDiff = 10000, + TargetTime = 15, + VariancePercent = 30, + MaxDelta = 1000, + }; - private static readonly ILogger logger = LogManager.CreateNullLogger(); - private readonly MockMasterClock clock = new MockMasterClock(); + private static readonly ILogger logger = LogManager.CreateNullLogger(); + private readonly MockMasterClock clock = new MockMasterClock(); - [Fact] - public void VarDiff_Should_Honor_MaxDelta_When_Adjusting_Up() - { - var vdm = new VarDiffManager(config, clock); - var ctx = new WorkerContextBase {Difficulty = 7500, VarDiff = new VarDiffContext() }; + [Fact] + public void VarDiff_Should_Honor_MaxDelta_When_Adjusting_Up() + { + var vdm = new VarDiffManager(config, clock); + var ctx = new WorkerContextBase {Difficulty = 7500, VarDiff = new VarDiffContext() }; - var shares = new List { 2, 3, 4 }; - var newDiff = vdm.Update(ctx, shares, string.Empty, logger); - Assert.NotNull(newDiff); - Assert.True(newDiff.Value.EqualsDigitPrecision3(8500)); - } + var shares = new List { 2, 3, 4 }; + var newDiff = vdm.Update(ctx, shares, string.Empty, logger); + Assert.NotNull(newDiff); + Assert.True(newDiff.Value.EqualsDigitPrecision3(8500)); + } - [Fact] - public void VarDiff_Should_Honor_MaxDelta_When_Adjusting_Down() - { - var vdm = new VarDiffManager(config, clock); - var ctx = new WorkerContextBase { Difficulty = 7500, VarDiff = new VarDiffContext() }; + [Fact] + public void VarDiff_Should_Honor_MaxDelta_When_Adjusting_Down() + { + var vdm = new VarDiffManager(config, clock); + var ctx = new WorkerContextBase { Difficulty = 7500, VarDiff = new VarDiffContext() }; - var shares = new List { 2000000000, 3000000000, 4000000000 }; - var newDiff = vdm.Update(ctx, shares, string.Empty, logger); - Assert.NotNull(newDiff); - Assert.True(newDiff.Value.EqualsDigitPrecision3(6500)); - } + var shares = new List { 2000000000, 3000000000, 4000000000 }; + var newDiff = vdm.Update(ctx, shares, string.Empty, logger); + Assert.NotNull(newDiff); + Assert.True(newDiff.Value.EqualsDigitPrecision3(6500)); + } - [Fact] - public void VarDiff_Should_Honor_MaxDiff_When_Adjusting_Up() - { - var vdm = new VarDiffManager(config, clock); - var ctx = new WorkerContextBase { Difficulty = 9500, VarDiff = new VarDiffContext() }; + [Fact] + public void VarDiff_Should_Honor_MaxDiff_When_Adjusting_Up() + { + var vdm = new VarDiffManager(config, clock); + var ctx = new WorkerContextBase { Difficulty = 9500, VarDiff = new VarDiffContext() }; - var shares = new List { 2, 3, 4 }; - var newDiff = vdm.Update(ctx, shares, string.Empty, logger); - Assert.NotNull(newDiff); - Assert.True(newDiff.Value.EqualsDigitPrecision3(10000)); - } + var shares = new List { 2, 3, 4 }; + var newDiff = vdm.Update(ctx, shares, string.Empty, logger); + Assert.NotNull(newDiff); + Assert.True(newDiff.Value.EqualsDigitPrecision3(10000)); + } - [Fact] - public void VarDiff_Should_Honor_MinDiff_When_Adjusting_Down() - { - var vdm = new VarDiffManager(config, clock); - var ctx = new WorkerContextBase { Difficulty = 1500, VarDiff = new VarDiffContext() }; + [Fact] + public void VarDiff_Should_Honor_MinDiff_When_Adjusting_Down() + { + var vdm = new VarDiffManager(config, clock); + var ctx = new WorkerContextBase { Difficulty = 1500, VarDiff = new VarDiffContext() }; - var shares = new List { 2000000000, 3000000000, 4000000000 }; - var newDiff = vdm.Update(ctx, shares, string.Empty, logger); - Assert.NotNull(newDiff); - Assert.True(newDiff.Value.EqualsDigitPrecision3(1000)); - } -*/ + var shares = new List { 2000000000, 3000000000, 4000000000 }; + var newDiff = vdm.Update(ctx, shares, string.Empty, logger); + Assert.NotNull(newDiff); + Assert.True(newDiff.Value.EqualsDigitPrecision3(1000)); + } + */ } } diff --git a/src/Miningcore.sln b/src/Miningcore.sln index defb5c4232..e34a73fd76 100644 --- a/src/Miningcore.sln +++ b/src/Miningcore.sln @@ -1,12 +1,17 @@  Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio 15 -VisualStudioVersion = 15.0.26730.3 +# Visual Studio Version 16 +VisualStudioVersion = 16.0.28729.10 MinimumVisualStudioVersion = 10.0.40219.1 Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Miningcore", "Miningcore\Miningcore.csproj", "{A427248A-B5E1-4808-9883-BC2AD68EE997}" EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Miningcore.Tests", "Miningcore.Tests\Miningcore.Tests.csproj", "{DCDE9CE6-84B8-42FE-AA55-2A3909A5E757}" EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{71672AAD-51F8-49EC-9EFD-E504D65A765A}" + ProjectSection(SolutionItems) = preProject + .editorconfig = .editorconfig + EndProjectSection +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU diff --git a/src/Miningcore/Api/Controllers/AdminApiController.cs b/src/Miningcore/Api/Controllers/AdminApiController.cs index 942dc4409d..46c89128d3 100644 --- a/src/Miningcore/Api/Controllers/AdminApiController.cs +++ b/src/Miningcore/Api/Controllers/AdminApiController.cs @@ -70,7 +70,7 @@ public async Task AddMinerBalanceAsync(AddBalanceRequest request) { request.Usage = request.Usage?.Trim(); - if (string.IsNullOrEmpty(request.Usage)) + if(string.IsNullOrEmpty(request.Usage)) request.Usage = $"Admin balance change from {Request.HttpContext.Connection.RemoteIpAddress}"; var oldBalance = await cf.Run(con => balanceRepo.GetBalanceAsync(con, request.PoolId, request.Address)); diff --git a/src/Miningcore/Api/Controllers/ClusterApiController.cs b/src/Miningcore/Api/Controllers/ClusterApiController.cs index a8a8ccd83b..6ea1bff9ea 100644 --- a/src/Miningcore/Api/Controllers/ClusterApiController.cs +++ b/src/Miningcore/Api/Controllers/ClusterApiController.cs @@ -62,33 +62,33 @@ public ClusterApiController(IComponentContext ctx) var blocks = (await cf.Run(con => blocksRepo.PageBlocksAsync(con, blockStates, page, pageSize))) .Select(mapper.Map) - .Where(x=> enabledPools.Contains(x.PoolId)) + .Where(x => enabledPools.Contains(x.PoolId)) .ToArray(); // enrich blocks var blocksByPool = blocks.GroupBy(x => x.PoolId); - foreach (var poolBlocks in blocksByPool) + foreach(var poolBlocks in blocksByPool) { var pool = GetPoolNoThrow(poolBlocks.Key); - if (pool == null) + if(pool == null) continue; var blockInfobaseDict = pool.Template.ExplorerBlockLinks; - + // compute infoLink - if (blockInfobaseDict != null) + if(blockInfobaseDict != null) { - foreach (var block in poolBlocks) + foreach(var block in poolBlocks) { blockInfobaseDict.TryGetValue(!string.IsNullOrEmpty(block.Type) ? block.Type : "block", out var blockInfobaseUrl); - if (!string.IsNullOrEmpty(blockInfobaseUrl)) + if(!string.IsNullOrEmpty(blockInfobaseUrl)) { - if (blockInfobaseUrl.Contains(CoinMetaData.BlockHeightPH)) + if(blockInfobaseUrl.Contains(CoinMetaData.BlockHeightPH)) block.InfoLink = blockInfobaseUrl.Replace(CoinMetaData.BlockHeightPH, block.BlockHeight.ToString(CultureInfo.InvariantCulture)); - else if (blockInfobaseUrl.Contains(CoinMetaData.BlockHashPH) && !string.IsNullOrEmpty(block.Hash)) + else if(blockInfobaseUrl.Contains(CoinMetaData.BlockHashPH) && !string.IsNullOrEmpty(block.Hash)) block.InfoLink = blockInfobaseUrl.Replace(CoinMetaData.BlockHashPH, block.Hash); } } @@ -102,7 +102,7 @@ public ClusterApiController(IComponentContext ctx) private PoolConfig GetPoolNoThrow(string poolId) { - if (string.IsNullOrEmpty(poolId)) + if(string.IsNullOrEmpty(poolId)) return null; var pool = clusterConfig.Pools.FirstOrDefault(x => x.Id == poolId && x.Enabled); diff --git a/src/Miningcore/Api/Controllers/PoolApiController.cs b/src/Miningcore/Api/Controllers/PoolApiController.cs index 78cf75dc65..f079ce1698 100644 --- a/src/Miningcore/Api/Controllers/PoolApiController.cs +++ b/src/Miningcore/Api/Controllers/PoolApiController.cs @@ -121,7 +121,7 @@ public async Task GetPoolPerformanceAsync(string poolId, var end = clock.Now; DateTime start; - switch (range) + switch(range) { case SampleRange.Day: start = end.AddDays(-1); @@ -181,18 +181,18 @@ public async Task PagePoolMinersAsync( // enrich blocks var blockInfobaseDict = pool.Template.ExplorerBlockLinks; - foreach (var block in blocks) + foreach(var block in blocks) { // compute infoLink - if (blockInfobaseDict != null) + if(blockInfobaseDict != null) { blockInfobaseDict.TryGetValue(!string.IsNullOrEmpty(block.Type) ? block.Type : "block", out var blockInfobaseUrl); - if (!string.IsNullOrEmpty(blockInfobaseUrl)) + if(!string.IsNullOrEmpty(blockInfobaseUrl)) { - if (blockInfobaseUrl.Contains(CoinMetaData.BlockHeightPH)) + if(blockInfobaseUrl.Contains(CoinMetaData.BlockHeightPH)) block.InfoLink = blockInfobaseUrl.Replace(CoinMetaData.BlockHeightPH, block.BlockHeight.ToString(CultureInfo.InvariantCulture)); - else if (blockInfobaseUrl.Contains(CoinMetaData.BlockHashPH) && !string.IsNullOrEmpty(block.Hash)) + else if(blockInfobaseUrl.Contains(CoinMetaData.BlockHashPH) && !string.IsNullOrEmpty(block.Hash)) block.InfoLink = blockInfobaseUrl.Replace(CoinMetaData.BlockHashPH, block.Hash); } } @@ -216,14 +216,14 @@ public async Task PagePoolMinersAsync( var txInfobaseUrl = pool.Template.ExplorerTxLink; var addressInfobaseUrl = pool.Template.ExplorerTxLink; - foreach (var payment in payments) + foreach(var payment in payments) { // compute transaction infoLink - if (!string.IsNullOrEmpty(txInfobaseUrl)) + if(!string.IsNullOrEmpty(txInfobaseUrl)) payment.TransactionInfoLink = string.Format(txInfobaseUrl, payment.TransactionConfirmationData); // pool wallet link - if (!string.IsNullOrEmpty(addressInfobaseUrl)) + if(!string.IsNullOrEmpty(addressInfobaseUrl)) payment.AddressInfoLink = string.Format(addressInfobaseUrl, payment.Address); } @@ -236,7 +236,7 @@ public async Task PagePoolMinersAsync( { var pool = GetPool(poolId); - if (string.IsNullOrEmpty(address)) + if(string.IsNullOrEmpty(address)) throw new ApiException($"Invalid or missing miner address", HttpStatusCode.NotFound); var statsResult = await cf.RunTx((con, tx) => @@ -244,19 +244,19 @@ public async Task PagePoolMinersAsync( Responses.MinerStats stats = null; - if (statsResult != null) + if(statsResult != null) { stats = mapper.Map(statsResult); // optional fields - if (statsResult.LastPayment != null) + if(statsResult.LastPayment != null) { // Set timestamp of last payment stats.LastPayment = statsResult.LastPayment.Created; // Compute info link var baseUrl = pool.Template.ExplorerTxLink; - if (!string.IsNullOrEmpty(baseUrl)) + if(!string.IsNullOrEmpty(baseUrl)) stats.LastPaymentLink = string.Format(baseUrl, statsResult.LastPayment.TransactionConfirmationData); } @@ -272,7 +272,7 @@ public async Task PagePoolMinersAsync( { var pool = GetPool(poolId); - if (string.IsNullOrEmpty(address)) + if(string.IsNullOrEmpty(address)) throw new ApiException($"Invalid or missing miner address", HttpStatusCode.NotFound); var payments = (await cf.Run(con => paymentsRepo.PagePaymentsAsync( @@ -284,14 +284,14 @@ public async Task PagePoolMinersAsync( var txInfobaseUrl = pool.Template.ExplorerTxLink; var addressInfobaseUrl = pool.Template.ExplorerTxLink; - foreach (var payment in payments) + foreach(var payment in payments) { // compute transaction infoLink - if (!string.IsNullOrEmpty(txInfobaseUrl)) + if(!string.IsNullOrEmpty(txInfobaseUrl)) payment.TransactionInfoLink = string.Format(txInfobaseUrl, payment.TransactionConfirmationData); // pool wallet link - if (!string.IsNullOrEmpty(addressInfobaseUrl)) + if(!string.IsNullOrEmpty(addressInfobaseUrl)) payment.AddressInfoLink = string.Format(addressInfobaseUrl, payment.Address); } @@ -304,7 +304,7 @@ public async Task PagePoolMinersAsync( { var pool = GetPool(poolId); - if (string.IsNullOrEmpty(address)) + if(string.IsNullOrEmpty(address)) throw new ApiException($"Invalid or missing miner address", HttpStatusCode.NotFound); var balanceChanges = (await cf.Run(con => paymentsRepo.PageBalanceChangesAsync( @@ -321,7 +321,7 @@ public async Task PageMinerEarningsByDayAsync( { var pool = GetPool(poolId); - if (string.IsNullOrEmpty(address)) + if(string.IsNullOrEmpty(address)) throw new ApiException($"Invalid or missing miner address", HttpStatusCode.NotFound); var earnings = (await cf.Run(con => paymentsRepo.PageMinerPaymentsByDayAsync( @@ -337,7 +337,7 @@ public async Task PageMinerEarningsByDayAsync( { var pool = GetPool(poolId); - if (string.IsNullOrEmpty(address)) + if(string.IsNullOrEmpty(address)) throw new ApiException($"Invalid or missing miner address", HttpStatusCode.NotFound); var result = await GetMinerPerformanceInternal(mode, pool, address); @@ -349,12 +349,12 @@ public async Task PageMinerEarningsByDayAsync( private PoolConfig GetPool(string poolId) { - if (string.IsNullOrEmpty(poolId)) + if(string.IsNullOrEmpty(poolId)) throw new ApiException($"Invalid pool id", HttpStatusCode.NotFound); var pool = clusterConfig.Pools.FirstOrDefault(x => x.Id == poolId && x.Enabled); - if (pool == null) + if(pool == null) throw new ApiException($"Pool {poolId} is not known", HttpStatusCode.NotFound); return pool; @@ -371,7 +371,7 @@ private PoolConfig GetPool(string poolId) { case SampleRange.Day: // set range - if (end.Minute < 30) + if(end.Minute < 30) end = end.AddHours(-1); end = end.AddMinutes(-end.Minute); @@ -384,7 +384,7 @@ private PoolConfig GetPool(string poolId) break; case SampleRange.Month: - if (end.Hour < 12) + if(end.Hour < 12) end = end.AddDays(-1); end = end.Date; diff --git a/src/Miningcore/Api/Extensions/MiningPoolExtensions.cs b/src/Miningcore/Api/Extensions/MiningPoolExtensions.cs index b40f7f00e5..6c5c3cc757 100644 --- a/src/Miningcore/Api/Extensions/MiningPoolExtensions.cs +++ b/src/Miningcore/Api/Extensions/MiningPoolExtensions.cs @@ -21,14 +21,14 @@ public static PoolInfo ToPoolInfo(this PoolConfig poolConfig, IMapper mapper, Pe // pool wallet link var addressInfobaseUrl = poolConfig.Template.ExplorerAccountLink; - if (!string.IsNullOrEmpty(addressInfobaseUrl)) + if(!string.IsNullOrEmpty(addressInfobaseUrl)) poolInfo.AddressInfoLink = string.Format(addressInfobaseUrl, poolInfo.Address); // pool fees poolInfo.PoolFeePercent = (float) poolConfig.RewardRecipients.Sum(x => x.Percentage); // strip security critical stuff - if (poolInfo.PaymentProcessing.Extra != null) + if(poolInfo.PaymentProcessing.Extra != null) { var extra = poolInfo.PaymentProcessing.Extra; diff --git a/src/Miningcore/Api/Middlewares/ApiExceptionHandlingMiddleware.cs b/src/Miningcore/Api/Middlewares/ApiExceptionHandlingMiddleware.cs index 125103fd52..1f7b1f767f 100644 --- a/src/Miningcore/Api/Middlewares/ApiExceptionHandlingMiddleware.cs +++ b/src/Miningcore/Api/Middlewares/ApiExceptionHandlingMiddleware.cs @@ -20,7 +20,7 @@ public async Task InvokeAsync(HttpContext context) await next(context); } - catch (ApiException ex) + catch(ApiException ex) { await HandleResponseOverrideExceptionAsync(context, ex); } @@ -31,7 +31,7 @@ private static async Task HandleResponseOverrideExceptionAsync(HttpContext conte var response = context.Response; response.ContentType = "application/json"; - if (ex.ResponseStatusCode.HasValue) + if(ex.ResponseStatusCode.HasValue) response.StatusCode = ex.ResponseStatusCode.Value; await response.WriteAsync(ex.Message).ConfigureAwait(false); diff --git a/src/Miningcore/Api/Middlewares/IPAccessWhitelistMiddleware.cs b/src/Miningcore/Api/Middlewares/IPAccessWhitelistMiddleware.cs index 22c7d609ba..c309ee12aa 100644 --- a/src/Miningcore/Api/Middlewares/IPAccessWhitelistMiddleware.cs +++ b/src/Miningcore/Api/Middlewares/IPAccessWhitelistMiddleware.cs @@ -24,15 +24,15 @@ public IPAccessWhitelistMiddleware(RequestDelegate next, string[] locations, IPA public async Task Invoke(HttpContext context) { - if (locations.Any(x=> context.Request.Path.Value.StartsWith(x))) + if(locations.Any(x => context.Request.Path.Value.StartsWith(x))) { var remoteAddress = context.Connection.RemoteIpAddress; - if (!whitelist.Any(x => x.Equals(remoteAddress))) + if(!whitelist.Any(x => x.Equals(remoteAddress))) { logger.Info(() => $"Unauthorized request attempt to {context.Request.Path.Value} from {remoteAddress}"); - context.Response.StatusCode = (int)HttpStatusCode.Forbidden; + context.Response.StatusCode = (int) HttpStatusCode.Forbidden; await context.Response.WriteAsync("You are not in my access list. Good Bye.\n"); return; } diff --git a/src/Miningcore/Api/WebSocketNotifications/WebSocketNotificationsRelay.cs b/src/Miningcore/Api/WebSocketNotifications/WebSocketNotificationsRelay.cs index b6d2266bac..ffb4f7a0a5 100644 --- a/src/Miningcore/Api/WebSocketNotifications/WebSocketNotificationsRelay.cs +++ b/src/Miningcore/Api/WebSocketNotifications/WebSocketNotificationsRelay.cs @@ -21,7 +21,7 @@ namespace Miningcore.Api { public class WebSocketNotificationsRelay : WebSocketHandler { - public WebSocketNotificationsRelay(WebSocketConnectionManager webSocketConnectionManager, IComponentContext ctx) : + public WebSocketNotificationsRelay(WebSocketConnectionManager webSocketConnectionManager, IComponentContext ctx) : base(webSocketConnectionManager, new StringMethodInvocationStrategy()) { messageBus = ctx.Resolve(); @@ -78,7 +78,7 @@ private async Task BroadcastNotification(WsNotificationType type, T notificat await SendMessageToAllAsync(msg); } - catch (Exception ex) + catch(Exception ex) { logger.Error(ex); } diff --git a/src/Miningcore/AutofacMetadata.cs b/src/Miningcore/AutofacMetadata.cs index c591c2186e..c1d08aef93 100644 --- a/src/Miningcore/AutofacMetadata.cs +++ b/src/Miningcore/AutofacMetadata.cs @@ -28,8 +28,8 @@ public class CoinFamilyAttribute : Attribute { public CoinFamilyAttribute(IDictionary values) { - if (values.ContainsKey(nameof(SupportedFamilies))) - SupportedFamilies = (CoinFamily[])values[nameof(SupportedFamilies)]; + if(values.ContainsKey(nameof(SupportedFamilies))) + SupportedFamilies = (CoinFamily[]) values[nameof(SupportedFamilies)]; } public CoinFamilyAttribute(params CoinFamily[] supportedFamilies) diff --git a/src/Miningcore/AutofacModule.cs b/src/Miningcore/AutofacModule.cs index cc165b7554..ad0dfb520f 100644 --- a/src/Miningcore/AutofacModule.cs +++ b/src/Miningcore/AutofacModule.cs @@ -94,7 +94,7 @@ protected override void Load(ContainerBuilder builder) builder.RegisterType() .SingleInstance(); - + builder.RegisterType() .SingleInstance(); @@ -129,7 +129,7 @@ protected override void Load(ContainerBuilder builder) .PropertiesAutowired() .AsSelf() .SingleInstance(); - + ////////////////////// // Payment Schemes diff --git a/src/Miningcore/Banning/IntegratedBanManager.cs b/src/Miningcore/Banning/IntegratedBanManager.cs index bb5f07a474..01ea1b57d4 100644 --- a/src/Miningcore/Banning/IntegratedBanManager.cs +++ b/src/Miningcore/Banning/IntegratedBanManager.cs @@ -47,7 +47,7 @@ public void Ban(IPAddress address, TimeSpan duration) Contract.Requires(duration.TotalMilliseconds > 0, $"{nameof(duration)} must not be empty"); // don't ban 127.0.0.1 - if (address.Equals(IPAddress.Loopback) || address.Equals(IPAddress.IPv6Loopback)) + if(address.Equals(IPAddress.Loopback) || address.Equals(IPAddress.IPv6Loopback)) return; cache.Set(address.ToString(), string.Empty, duration); diff --git a/src/Miningcore/Blockchain/Bitcoin/BitcoinJob.cs b/src/Miningcore/Blockchain/Bitcoin/BitcoinJob.cs index a67d1ea1c4..ae298b3ca0 100644 --- a/src/Miningcore/Blockchain/Bitcoin/BitcoinJob.cs +++ b/src/Miningcore/Blockchain/Bitcoin/BitcoinJob.cs @@ -124,7 +124,7 @@ protected virtual void BuildCoinbase() bs.ReadWrite(ref txVersion); // timestamp for POS coins - if (isPoS) + if(isPoS) { var timestamp = BlockTemplate.CurTime; bs.ReadWrite(ref timestamp); @@ -173,13 +173,13 @@ protected virtual void BuildCoinbase() protected virtual void AppendCoinbaseFinal(BitcoinStream bs) { - if (!string.IsNullOrEmpty(txComment)) + if(!string.IsNullOrEmpty(txComment)) { var data = Encoding.ASCII.GetBytes(txComment); bs.ReadWriteAsVarString(ref data); } - if (coin.HasMasterNodes && !string.IsNullOrEmpty(masterNodeParameters.CoinbasePayload)) + if(coin.HasMasterNodes && !string.IsNullOrEmpty(masterNodeParameters.CoinbasePayload)) { var data = masterNodeParameters.CoinbasePayload.HexToByteArray(); bs.ReadWriteAsVarString(ref data); @@ -191,7 +191,7 @@ protected virtual byte[] SerializeOutputTransaction(Transaction tx) var withDefaultWitnessCommitment = !string.IsNullOrEmpty(BlockTemplate.DefaultWitnessCommitment); var outputCount = (uint) tx.Outputs.Count; - if (withDefaultWitnessCommitment) + if(withDefaultWitnessCommitment) outputCount++; using(var stream = new MemoryStream()) @@ -206,7 +206,7 @@ protected virtual byte[] SerializeOutputTransaction(Transaction tx) uint rawLength; // serialize witness (segwit) - if (withDefaultWitnessCommitment) + if(withDefaultWitnessCommitment) { amount = 0; raw = BlockTemplate.DefaultWitnessCommitment.HexToByteArray(); @@ -245,7 +245,7 @@ protected virtual Script GenerateScriptSigInitial() ops.Add(Op.GetPushOp(BlockTemplate.Height)); // optionally push aux-flags - if (!string.IsNullOrEmpty(BlockTemplate.CoinbaseAux?.Flags)) + if(!string.IsNullOrEmpty(BlockTemplate.CoinbaseAux?.Flags)) ops.Add(Op.GetPushOp(BlockTemplate.CoinbaseAux.Flags.HexToByteArray())); // push timestamp @@ -274,7 +274,7 @@ protected virtual Transaction CreatePayeeOutputTransaction() var tx = Transaction.Create(network); - if (payeeParameters?.PayeeAmount > 0) + if(payeeParameters?.PayeeAmount > 0) { var payeeReward = new Money(payeeParameters.PayeeAmount.Value, MoneyUnit.Satoshi); rewardToPool -= payeeReward; @@ -298,7 +298,7 @@ protected bool RegisterSubmit(string extraNonce1, string extraNonce2, string nTi lock(submissions) { - if (submissions.Contains(key)) + if(submissions.Contains(key)) return false; submissions.Add(key); @@ -315,7 +315,7 @@ protected byte[] SerializeHeader(Span coinbaseHash, uint nTime, uint nonce var version = BlockTemplate.Version; // Overt-ASIC boost - if (versionMask.HasValue && versionBits.HasValue) + if(versionMask.HasValue && versionBits.HasValue) version = (version & ~versionMask.Value) | (versionBits.Value & versionMask.Value); #pragma warning disable 618 @@ -359,14 +359,14 @@ protected virtual (Share Share, string BlockHex) ProcessShareInternal( var isBlockCandidate = headerValue <= blockTargetValue; // test if share meets at least workers current difficulty - if (!isBlockCandidate && ratio < 0.99) + if(!isBlockCandidate && ratio < 0.99) { // check if share matched the previous difficulty from before a vardiff retarget - if (context.VarDiff?.LastUpdate != null && context.PreviousDifficulty.HasValue) + if(context.VarDiff?.LastUpdate != null && context.PreviousDifficulty.HasValue) { ratio = shareDiff / context.PreviousDifficulty.Value; - if (ratio < 0.99) + if(ratio < 0.99) throw new StratumException(StratumError.LowDifficultyShare, $"low difficulty share ({shareDiff})"); // use previous difficulty @@ -384,7 +384,7 @@ protected virtual (Share Share, string BlockHex) ProcessShareInternal( Difficulty = stratumDifficulty / shareMultiplier, }; - if (isBlockCandidate) + if(isBlockCandidate) { result.IsBlockCandidate = true; @@ -432,7 +432,7 @@ protected virtual byte[] SerializeBlock(byte[] header, byte[] coinbase) bs.ReadWrite(ref rawTransactionBuffer); // POS coins require a zero byte appended to block which the daemon replaces with the signature - if (isPoS) + if(isPoS) bs.ReadWrite((byte) 0); return stream.ToArray(); @@ -475,19 +475,19 @@ protected virtual Transaction CreateMasternodeOutputTransaction() protected virtual Money CreateMasternodeOutputs(Transaction tx, Money reward) { - if (masterNodeParameters.Masternode != null) + if(masterNodeParameters.Masternode != null) { Masternode[] masternodes; // Dash v13 Multi-Master-Nodes - if (masterNodeParameters.Masternode.Type == JTokenType.Array) + if(masterNodeParameters.Masternode.Type == JTokenType.Array) masternodes = masterNodeParameters.Masternode.ToObject(); else masternodes = new[] { masterNodeParameters.Masternode.ToObject() }; foreach(var masterNode in masternodes) { - if (!string.IsNullOrEmpty(masterNode.Payee)) + if(!string.IsNullOrEmpty(masterNode.Payee)) { var payeeAddress = BitcoinUtils.AddressToDestination(masterNode.Payee, network); var payeeReward = masterNode.Amount; @@ -500,9 +500,9 @@ protected virtual Money CreateMasternodeOutputs(Transaction tx, Money reward) } } - if (masterNodeParameters.SuperBlocks != null && masterNodeParameters.SuperBlocks.Length > 0) + if(masterNodeParameters.SuperBlocks != null && masterNodeParameters.SuperBlocks.Length > 0) { - foreach (var superBlock in masterNodeParameters.SuperBlocks) + foreach(var superBlock in masterNodeParameters.SuperBlocks) { var payeeAddress = BitcoinUtils.AddressToDestination(superBlock.Payee, network); var payeeReward = superBlock.Amount; @@ -514,7 +514,7 @@ protected virtual Money CreateMasternodeOutputs(Transaction tx, Money reward) } } - if (!string.IsNullOrEmpty(masterNodeParameters.Payee)) + if(!string.IsNullOrEmpty(masterNodeParameters.Payee)) { var payeeAddress = BitcoinUtils.AddressToDestination(masterNodeParameters.Payee, network); var payeeReward = masterNodeParameters.PayeeAmount ?? (reward / 5); @@ -570,7 +570,7 @@ public void Init(BlockTemplate blockTemplate, string jobId, txComment = !string.IsNullOrEmpty(extraPoolConfig?.CoinbaseTxComment) ? extraPoolConfig.CoinbaseTxComment : coin.CoinbaseTxComment; - if (coin.HasMasterNodes) + if(coin.HasMasterNodes) { masterNodeParameters = BlockTemplate.Extra.SafeExtensionDataAs(); @@ -589,7 +589,7 @@ public void Init(BlockTemplate blockTemplate, string jobId, this.headerHasher = headerHasher; this.blockHasher = blockHasher; - if (!string.IsNullOrEmpty(BlockTemplate.Target)) + if(!string.IsNullOrEmpty(BlockTemplate.Target)) blockTargetValue = new uint256(BlockTemplate.Target); else { @@ -636,15 +636,15 @@ public virtual (Share Share, string BlockHex) ProcessShare(StratumClient worker, var context = worker.ContextAs(); // validate nTime - if (nTime.Length != 8) + if(nTime.Length != 8) throw new StratumException(StratumError.Other, "incorrect size of ntime"); var nTimeInt = uint.Parse(nTime, NumberStyles.HexNumber); - if (nTimeInt < BlockTemplate.CurTime || nTimeInt > ((DateTimeOffset) clock.Now).ToUnixTimeSeconds() + 7200) + if(nTimeInt < BlockTemplate.CurTime || nTimeInt > ((DateTimeOffset) clock.Now).ToUnixTimeSeconds() + 7200) throw new StratumException(StratumError.Other, "ntime out of range"); // validate nonce - if (nonce.Length != 8) + if(nonce.Length != 8) throw new StratumException(StratumError.Other, "incorrect size of nonce"); var nonceInt = uint.Parse(nonce, NumberStyles.HexNumber); @@ -657,12 +657,12 @@ public virtual (Share Share, string BlockHex) ProcessShare(StratumClient worker, versionBitsInt = uint.Parse(versionBits, NumberStyles.HexNumber); // enforce that only bits covered by current mask are changed by miner - if ((versionBitsInt & ~context.VersionRollingMask.Value) != 0) + if((versionBitsInt & ~context.VersionRollingMask.Value) != 0) throw new StratumException(StratumError.Other, "rolling-version mask violation"); } // dupe check - if (!RegisterSubmit(context.ExtraNonce1, extraNonce2, nTime, nonce)) + if(!RegisterSubmit(context.ExtraNonce1, extraNonce2, nTime, nonce)) throw new StratumException(StratumError.DuplicateShare, "duplicate share"); return ProcessShareInternal(worker, extraNonce2, nTimeInt, nonceInt, versionBitsInt); diff --git a/src/Miningcore/Blockchain/Bitcoin/BitcoinJobManager.cs b/src/Miningcore/Blockchain/Bitcoin/BitcoinJobManager.cs index 37ba72ee53..f87122b836 100644 --- a/src/Miningcore/Blockchain/Bitcoin/BitcoinJobManager.cs +++ b/src/Miningcore/Blockchain/Bitcoin/BitcoinJobManager.cs @@ -90,13 +90,13 @@ private BitcoinJob CreateJob() try { - if (forceUpdate) + if(forceUpdate) lastJobRebroadcast = clock.Now; var response = string.IsNullOrEmpty(json) ? await GetBlockTemplateAsync() : GetBlockTemplateFromJson(json); // may happen if daemon is currently not connected to peers - if (response.Error != null) + if(response.Error != null) { logger.Warn(() => $"Unable to update job. Daemon responded with: {response.Error.Message} Code {response.Error.Code}"); return (false, forceUpdate); @@ -113,7 +113,7 @@ private BitcoinJob CreateJob() if(isNew) messageBus.NotifyChainHeight(poolConfig.Id, blockTemplate.Height, poolConfig.Template); - if (isNew || forceUpdate) + if(isNew || forceUpdate) { job = CreateJob(); @@ -122,11 +122,11 @@ private BitcoinJob CreateJob() ShareMultiplier, coin.CoinbaseHasherValue, coin.HeaderHasherValue, !isPoS ? coin.BlockHasherValue : coin.PoSBlockHasherValue ?? coin.BlockHasherValue); - lock (jobLock) + lock(jobLock) { - if (isNew) + if(isNew) { - if (via != null) + if(via != null) logger.Info(() => $"Detected new block {blockTemplate.Height} via {via}"); else logger.Info(() => $"Detected new block {blockTemplate.Height}"); @@ -142,7 +142,7 @@ private BitcoinJob CreateJob() validJobs.Insert(0, job); // trim active jobs - while (validJobs.Count > maxActiveJobs) + while(validJobs.Count > maxActiveJobs) validJobs.RemoveAt(validJobs.Count - 1); } @@ -152,7 +152,7 @@ private BitcoinJob CreateJob() return (isNew, forceUpdate); } - catch (Exception ex) + catch(Exception ex) { logger.Error(ex, () => $"Error during {nameof(UpdateJob)}"); } @@ -174,7 +174,7 @@ public override void Configure(PoolConfig poolConfig, ClusterConfig clusterConfi extraPoolConfig = poolConfig.Extra.SafeExtensionDataAs(); extraPoolPaymentProcessingConfig = poolConfig.PaymentProcessing?.Extra?.SafeExtensionDataAs(); - if (extraPoolConfig?.MaxActiveJobs.HasValue == true) + if(extraPoolConfig?.MaxActiveJobs.HasValue == true) maxActiveJobs = extraPoolConfig.MaxActiveJobs.Value; hasLegacyDaemon = extraPoolConfig?.HasLegacyDaemon == true; @@ -209,7 +209,7 @@ public override async ValueTask SubmitShareAsync(StratumClient worker, ob logger.LogInvoke(new[] { worker.ConnectionId }); - if (!(submission is object[] submitParams)) + if(!(submission is object[] submitParams)) throw new StratumException(StratumError.Other, "invalid params"); var context = worker.ContextAs(); @@ -222,7 +222,7 @@ public override async ValueTask SubmitShareAsync(StratumClient worker, ob var nonce = submitParams[4] as string; var versionBits = context.VersionRollingMask.HasValue ? submitParams[5] as string : null; - if (string.IsNullOrEmpty(workerValue)) + if(string.IsNullOrEmpty(workerValue)) throw new StratumException(StratumError.Other, "missing or invalid workername"); BitcoinJob job; @@ -232,7 +232,7 @@ public override async ValueTask SubmitShareAsync(StratumClient worker, ob job = validJobs.FirstOrDefault(x => x.JobId == jobId); } - if (job == null) + if(job == null) throw new StratumException(StratumError.JobNotFound, "job not found"); // extract worker/miner/payoutid @@ -253,7 +253,7 @@ public override async ValueTask SubmitShareAsync(StratumClient worker, ob share.Created = clock.Now; // if block candidate, submit & check if accepted by network - if (share.IsBlockCandidate) + if(share.IsBlockCandidate) { logger.Info(() => $"Submitting block {share.BlockHeight} [{share.BlockHash}]"); @@ -262,7 +262,7 @@ public override async ValueTask SubmitShareAsync(StratumClient worker, ob // is it still a block candidate? share.IsBlockCandidate = acceptResponse.Accepted; - if (share.IsBlockCandidate) + if(share.IsBlockCandidate) { logger.Info(() => $"Daemon accepted block {share.BlockHeight} [{share.BlockHash}] submitted by {minerName}"); diff --git a/src/Miningcore/Blockchain/Bitcoin/BitcoinJobManagerBase.cs b/src/Miningcore/Blockchain/Bitcoin/BitcoinJobManagerBase.cs index bdb6997dbd..204a47e9b7 100644 --- a/src/Miningcore/Blockchain/Bitcoin/BitcoinJobManagerBase.cs +++ b/src/Miningcore/Blockchain/Bitcoin/BitcoinJobManagerBase.cs @@ -105,7 +105,7 @@ protected virtual void SetupJobUpdates() blockSubmission.Select(x => (false, "Block-submission", (string) null)) }; - if (extraPoolConfig?.BtStream == null) + if(extraPoolConfig?.BtStream == null) { // collect ports var zmq = poolConfig.Daemons @@ -118,14 +118,14 @@ protected virtual void SetupJobUpdates() return (Socket: extra.ZmqBlockNotifySocket, Topic: topic); }); - if (zmq.Count > 0) + if(zmq.Count > 0) { logger.Info(() => $"Subscribing to ZMQ push-updates from {string.Join(", ", zmq.Values)}"); var blockNotify = daemon.ZmqSubscribe(logger, zmq) .Select(msg => { - using (msg) + using(msg) { // We just take the second frame's raw data and turn it into a hex string. // If that string changes, we got an update (DistinctUntilChanged) @@ -147,7 +147,7 @@ protected virtual void SetupJobUpdates() triggers.Add(blockNotify); } - if (poolConfig.BlockRefreshInterval > 0) + if(poolConfig.BlockRefreshInterval > 0) { // periodically update block-template var pollingInterval = poolConfig.BlockRefreshInterval > 0 ? poolConfig.BlockRefreshInterval : 1000; @@ -177,7 +177,7 @@ protected virtual void SetupJobUpdates() { var btStream = BtStreamSubscribe(extraPoolConfig.BtStream); - if (poolConfig.JobRebroadcastTimeout > 0) + if(poolConfig.JobRebroadcastTimeout > 0) { var interval = TimeSpan.FromSeconds(Math.Max(1, poolConfig.JobRebroadcastTimeout - 0.1d)); @@ -207,7 +207,7 @@ protected virtual void SetupJobUpdates() .Where(x => x.IsNew || x.Force) .Do(x => { - if (x.IsNew) + if(x.IsNew) hasInitialBlockTemplate = true; }) .Select(x => GetJobParamsForStratum(x.IsNew)) @@ -217,7 +217,7 @@ protected virtual void SetupJobUpdates() protected virtual async Task ShowDaemonSyncProgressAsync() { - if (hasLegacyDaemon) + if(hasLegacyDaemon) { await ShowDaemonSyncProgressLegacyAsync(); return; @@ -225,18 +225,18 @@ protected virtual async Task ShowDaemonSyncProgressAsync() var infos = await daemon.ExecuteCmdAllAsync(logger, BitcoinCommands.GetBlockchainInfo); - if (infos.Length > 0) + if(infos.Length > 0) { var blockCount = infos .Max(x => x.Response?.Blocks); - if (blockCount.HasValue) + if(blockCount.HasValue) { // get list of peers and their highest block height to compare to ours var peerInfo = await daemon.ExecuteCmdAnyAsync(logger, BitcoinCommands.GetPeerInfo); var peers = peerInfo.Response; - if (peers != null && peers.Length > 0) + if(peers != null && peers.Length > 0) { var totalBlocks = peers.Max(x => x.StartingHeight); var percent = totalBlocks > 0 ? (double) blockCount / totalBlocks * 100 : 0; @@ -258,22 +258,22 @@ private async Task UpdateNetworkStatsAsync() new DaemonCmd(BitcoinCommands.GetNetworkHashPS) ); - if (results.Any(x => x.Error != null)) + if(results.Any(x => x.Error != null)) { var errors = results.Where(x => x.Error != null).ToArray(); - if (errors.Any()) + if(errors.Any()) logger.Warn(() => $"Error(s) refreshing network stats: {string.Join(", ", errors.Select(y => y.Error.Message))}"); } var miningInfoResponse = results[0].Response.ToObject(); var networkInfoResponse = results[1].Response.ToObject(); - BlockchainStats.NetworkHashrate = miningInfoResponse.NetworkHashps; + BlockchainStats.NetworkHashrate = miningInfoResponse.NetworkHashps; BlockchainStats.ConnectedPeers = networkInfoResponse.Connections; // Fall back to alternative RPC if coin does not report Network HPS (Digibyte) - if (BlockchainStats.NetworkHashrate == 0 && results[2].Error == null) + if(BlockchainStats.NetworkHashrate == 0 && results[2].Error == null) BlockchainStats.NetworkHashrate = results[2].Response.Value(); } @@ -298,7 +298,7 @@ private async Task UpdateNetworkStatsAsync() submitResult.Error?.Code.ToString(CultureInfo.InvariantCulture) ?? submitResult.Response?.ToString(); - if (!string.IsNullOrEmpty(submitError)) + if(!string.IsNullOrEmpty(submitError)) { logger.Warn(() => $"Block {share.BlockHeight} submission failed with: {submitError}"); messageBus.SendMessage(new AdminNotification("Block submission failed", $"Pool {poolConfig.Id} {(!string.IsNullOrEmpty(share.Source) ? $"[{share.Source.ToUpper()}] " : string.Empty)}failed to submit block {share.BlockHeight}: {submitError}")); @@ -310,7 +310,7 @@ private async Task UpdateNetworkStatsAsync() var block = acceptResult.Response?.ToObject(); var accepted = acceptResult.Error == null && block?.Hash == share.BlockHash; - if (!accepted) + if(!accepted) { logger.Warn(() => $"Block {share.BlockHeight} submission failed for pool {poolConfig.Id} because block was not found after submission"); messageBus.SendMessage(new AdminNotification($"[{share.PoolId.ToUpper()}]-[{share.Source}] Block submission failed", $"[{share.PoolId.ToUpper()}]-[{share.Source}] Block {share.BlockHeight} submission failed for pool {poolConfig.Id} because block was not found after submission")); @@ -323,7 +323,7 @@ protected virtual async Task AreDaemonsHealthyLegacyAsync() { var responses = await daemon.ExecuteCmdAllAsync(logger, BitcoinCommands.GetInfo); - if (responses.Where(x => x.Error?.InnerException?.GetType() == typeof(DaemonClientException)) + if(responses.Where(x => x.Error?.InnerException?.GetType() == typeof(DaemonClientException)) .Select(x => (DaemonClientException) x.Error.InnerException) .Any(x => x.Code == HttpStatusCode.Unauthorized)) logger.ThrowLogPoolStartupException($"Daemon reports invalid credentials"); @@ -342,18 +342,18 @@ protected virtual async Task ShowDaemonSyncProgressLegacyAsync() { var infos = await daemon.ExecuteCmdAllAsync(logger, BitcoinCommands.GetInfo); - if (infos.Length > 0) + if(infos.Length > 0) { var blockCount = infos .Max(x => x.Response?.Blocks); - if (blockCount.HasValue) + if(blockCount.HasValue) { // get list of peers and their highest block height to compare to ours var peerInfo = await daemon.ExecuteCmdAnyAsync(logger, BitcoinCommands.GetPeerInfo); var peers = peerInfo.Response; - if (peers != null && peers.Length > 0) + if(peers != null && peers.Length > 0) { var totalBlocks = peers.Max(x => x.StartingHeight); var percent = totalBlocks > 0 ? (double) blockCount / totalBlocks * 100 : 0; @@ -373,11 +373,11 @@ private async Task UpdateNetworkStatsLegacyAsync() new DaemonCmd(BitcoinCommands.GetConnectionCount) ); - if (results.Any(x => x.Error != null)) + if(results.Any(x => x.Error != null)) { var errors = results.Where(x => x.Error != null).ToArray(); - if (errors.Any()) + if(errors.Any()) logger.Warn(() => $"Error(s) refreshing network stats: {string.Join(", ", errors.Select(y => y.Error.Message))}"); } @@ -407,12 +407,12 @@ protected override void ConfigureDaemons() protected override async Task AreDaemonsHealthyAsync() { - if (hasLegacyDaemon) + if(hasLegacyDaemon) return await AreDaemonsHealthyLegacyAsync(); var responses = await daemon.ExecuteCmdAllAsync(logger, BitcoinCommands.GetBlockchainInfo); - if (responses.Where(x => x.Error?.InnerException?.GetType() == typeof(DaemonClientException)) + if(responses.Where(x => x.Error?.InnerException?.GetType() == typeof(DaemonClientException)) .Select(x => (DaemonClientException) x.Error.InnerException) .Any(x => x.Code == HttpStatusCode.Unauthorized)) logger.ThrowLogPoolStartupException($"Daemon reports invalid credentials"); @@ -422,7 +422,7 @@ protected override async Task AreDaemonsHealthyAsync() protected override async Task AreDaemonsConnectedAsync() { - if (hasLegacyDaemon) + if(hasLegacyDaemon) return await AreDaemonsConnectedLegacyAsync(); var response = await daemon.ExecuteCmdAnyAsync(logger, BitcoinCommands.GetNetworkInfo); @@ -441,13 +441,13 @@ protected override async Task EnsureDaemonsSynchedAsync(CancellationToken ct) var isSynched = responses.All(x => x.Error == null); - if (isSynched) + if(isSynched) { logger.Info(() => $"All daemons synched with blockchain"); break; } - if (!syncPendingNotificationShown) + if(!syncPendingNotificationShown) { logger.Info(() => $"Daemons still syncing with network. Manager will be started once synced"); syncPendingNotificationShown = true; @@ -472,13 +472,13 @@ protected override async Task PostStartInitAsync(CancellationToken ct) var results = await daemon.ExecuteBatchAnyAsync(logger, commands); - if (results.Any(x => x.Error != null)) + if(results.Any(x => x.Error != null)) { var resultList = results.ToList(); var errors = results.Where(x => x.Error != null && commands[resultList.IndexOf(x)].Method != BitcoinCommands.SubmitBlock) .ToArray(); - if (errors.Any()) + if(errors.Any()) logger.ThrowLogPoolStartupException($"Init RPC failed: {string.Join(", ", errors.Select(y => y.Error.Message))}"); } @@ -490,7 +490,7 @@ protected override async Task PostStartInitAsync(CancellationToken ct) var difficultyResponse = results[3].Response.ToObject(); // chain detection - if (!hasLegacyDaemon) + if(!hasLegacyDaemon) network = Network.GetNetwork(blockchainInfoResponse.Chain.ToLower()); else network = daemonInfoResponse.Testnet ? Network.TestNet : Network.Main; @@ -498,19 +498,19 @@ protected override async Task PostStartInitAsync(CancellationToken ct) PostChainIdentifyConfigure(); // ensure pool owns wallet - if (validateAddressResponse == null || !validateAddressResponse.IsValid) + if(validateAddressResponse == null || !validateAddressResponse.IsValid) logger.ThrowLogPoolStartupException($"Daemon reports pool-address '{poolConfig.Address}' as invalid"); isPoS = difficultyResponse.Values().Any(x => x.Path == "proof-of-stake"); // Create pool address script from response - if (!isPoS) + if(!isPoS) poolAddressDestination = AddressToDestination(poolConfig.Address, extraPoolConfig?.AddressType); else poolAddressDestination = new PubKey(poolConfig.PubKey ?? validateAddressResponse.PubKey); // Payment-processing setup - if (clusterConfig.PaymentProcessing?.Enabled == true && poolConfig.PaymentProcessing?.Enabled == true) + if(clusterConfig.PaymentProcessing?.Enabled == true && poolConfig.PaymentProcessing?.Enabled == true) { // ensure pool owns wallet //if (!validateAddressResponse.IsMine) @@ -524,14 +524,14 @@ protected override async Task PostStartInitAsync(CancellationToken ct) BlockchainStats.RewardType = isPoS ? "POS" : "POW"; // block submission RPC method - if (submitBlockResponse.Error?.Message?.ToLower() == "method not found") + if(submitBlockResponse.Error?.Message?.ToLower() == "method not found") hasSubmitBlockMethod = false; - else if (submitBlockResponse.Error?.Code == -1) + else if(submitBlockResponse.Error?.Code == -1) hasSubmitBlockMethod = true; else logger.ThrowLogPoolStartupException($"Unable detect block submission RPC method"); - if (!hasLegacyDaemon) + if(!hasLegacyDaemon) await UpdateNetworkStatsAsync(); else await UpdateNetworkStatsLegacyAsync(); @@ -545,7 +545,7 @@ protected override async Task PostStartInitAsync(CancellationToken ct) await (!hasLegacyDaemon ? UpdateNetworkStatsAsync() : UpdateNetworkStatsLegacyAsync()); } - catch (Exception ex) + catch(Exception ex) { logger.Error(ex); } @@ -562,7 +562,7 @@ protected virtual IDestination AddressToDestination(string address, BitcoinAddre if(!addressType.HasValue) return BitcoinUtils.AddressToDestination(address, network); - switch (addressType.Value) + switch(addressType.Value) { case BitcoinAddressType.BechSegwit: return BitcoinUtils.BechSegwitAddressToDestination(poolConfig.Address, network); @@ -583,7 +583,7 @@ protected virtual void SetupCrypto() protected void ConfigureRewards() { // Donation to MiningCore development - if (network.NetworkType == NetworkType.Mainnet && + if(network.NetworkType == NetworkType.Mainnet && DevDonation.Addresses.TryGetValue(poolConfig.Template.Symbol, out var address)) { poolConfig.RewardRecipients = poolConfig.RewardRecipients.Concat(new[] @@ -609,7 +609,7 @@ public override void Configure(PoolConfig poolConfig, ClusterConfig clusterConfi extraPoolConfig = poolConfig.Extra.SafeExtensionDataAs(); extraPoolPaymentProcessingConfig = poolConfig.PaymentProcessing?.Extra?.SafeExtensionDataAs(); - if (extraPoolConfig?.MaxActiveJobs.HasValue == true) + if(extraPoolConfig?.MaxActiveJobs.HasValue == true) maxActiveJobs = extraPoolConfig.MaxActiveJobs.Value; hasLegacyDaemon = extraPoolConfig?.HasLegacyDaemon == true; diff --git a/src/Miningcore/Blockchain/Bitcoin/BitcoinPayoutHandler.cs b/src/Miningcore/Blockchain/Bitcoin/BitcoinPayoutHandler.cs index b5ee069911..af61c8806a 100644 --- a/src/Miningcore/Blockchain/Bitcoin/BitcoinPayoutHandler.cs +++ b/src/Miningcore/Blockchain/Bitcoin/BitcoinPayoutHandler.cs @@ -131,10 +131,10 @@ public virtual async Task ClassifyBlocksAsync(Block[] blocks) var block = page[j]; // check error - if (cmdResult.Error != null) + if(cmdResult.Error != null) { // Code -5 interpreted as "orphaned" - if (cmdResult.Error.Code == -5) + if(cmdResult.Error.Code == -5) { block.Status = BlockStatus.Orphaned; block.Reward = 0; @@ -148,7 +148,7 @@ public virtual async Task ClassifyBlocksAsync(Block[] blocks) } // missing transaction details are interpreted as "orphaned" - else if (transactionInfo?.Details == null || transactionInfo.Details.Length == 0) + else if(transactionInfo?.Details == null || transactionInfo.Details.Length == 0) { block.Status = BlockStatus.Orphaned; block.Reward = 0; @@ -214,19 +214,19 @@ public virtual async Task PayoutAsync(Balance[] balances) .Where(x => x.Amount > 0) .ToDictionary(x => x.Address, x => Math.Round(x.Amount, 4)); - if (amounts.Count == 0) + if(amounts.Count == 0) return; logger.Info(() => $"[{LogCategory}] Paying out {FormatAmount(balances.Sum(x => x.Amount))} to {balances.Length} addresses"); object[] args; - if (extraPoolPaymentProcessingConfig?.MinersPayTxFees == true) + if(extraPoolPaymentProcessingConfig?.MinersPayTxFees == true) { var comment = (poolConfig.PoolName ?? clusterConfig.ClusterName ?? "MiningCore").Trim() + " Payment"; var subtractFeesFrom = amounts.Keys.ToArray(); - if (!poolConfig.Template.As().HasMasterNodes) + if(!poolConfig.Template.As().HasMasterNodes) { args = new object[] { @@ -265,13 +265,13 @@ public virtual async Task PayoutAsync(Balance[] balances) var didUnlockWallet = false; - // send command - tryTransfer: + // send command + tryTransfer: var result = await daemon.ExecuteCmdSingleAsync(logger, BitcoinCommands.SendMany, args, new JsonSerializerSettings()); - if (result.Error == null) + if(result.Error == null) { - if (didUnlockWallet) + if(didUnlockWallet) { // lock wallet logger.Info(() => $"[{LogCategory}] Locking wallet"); @@ -281,7 +281,7 @@ public virtual async Task PayoutAsync(Balance[] balances) // check result var txId = result.Response; - if (string.IsNullOrEmpty(txId)) + if(string.IsNullOrEmpty(txId)) logger.Error(() => $"[{LogCategory}] {BitcoinCommands.SendMany} did not return a transaction id!"); else logger.Info(() => $"[{LogCategory}] Payout transaction id: {txId}"); @@ -293,9 +293,9 @@ public virtual async Task PayoutAsync(Balance[] balances) else { - if (result.Error.Code == (int) BitcoinRPCErrorCode.RPC_WALLET_UNLOCK_NEEDED && !didUnlockWallet) + if(result.Error.Code == (int) BitcoinRPCErrorCode.RPC_WALLET_UNLOCK_NEEDED && !didUnlockWallet) { - if (!string.IsNullOrEmpty(extraPoolPaymentProcessingConfig?.WalletPassword)) + if(!string.IsNullOrEmpty(extraPoolPaymentProcessingConfig?.WalletPassword)) { logger.Info(() => $"[{LogCategory}] Unlocking wallet"); @@ -305,7 +305,7 @@ public virtual async Task PayoutAsync(Balance[] balances) (object) 5 // unlock for N seconds }); - if (unlockResult.Error == null) + if(unlockResult.Error == null) { didUnlockWallet = true; goto tryTransfer; diff --git a/src/Miningcore/Blockchain/Bitcoin/BitcoinPool.cs b/src/Miningcore/Blockchain/Bitcoin/BitcoinPool.cs index 0ffd38224d..f5636ea610 100644 --- a/src/Miningcore/Blockchain/Bitcoin/BitcoinPool.cs +++ b/src/Miningcore/Blockchain/Bitcoin/BitcoinPool.cs @@ -67,7 +67,7 @@ protected virtual async Task OnSubscribeAsync(StratumClient client, Timestamped< { var request = tsRequest.Value; - if (request.Id == null) + if(request.Id == null) throw new StratumException(StratumError.MinusOne, "missing request id"); var context = client.ContextAs(); @@ -99,7 +99,7 @@ protected virtual async Task OnAuthorizeAsync(StratumClient client, Timestamped< { var request = tsRequest.Value; - if (request.Id == null) + if(request.Id == null) throw new StratumException(StratumError.MinusOne, "missing request id"); var context = client.ContextAs(); @@ -118,7 +118,7 @@ protected virtual async Task OnAuthorizeAsync(StratumClient client, Timestamped< context.Miner = minerName; context.Worker = workerName; - if (context.IsAuthorized) + if(context.IsAuthorized) { // respond await client.RespondAsync(context.IsAuthorized, request.Id); @@ -128,7 +128,7 @@ protected virtual async Task OnAuthorizeAsync(StratumClient client, Timestamped< // extract control vars from password var staticDiff = GetStaticDiffFromPassparts(passParts); - if (staticDiff.HasValue && + if(staticDiff.HasValue && (context.VarDiff != null && staticDiff.Value >= context.VarDiff.Config.MinDiff || context.VarDiff == null && staticDiff.Value > context.Difficulty)) { @@ -162,13 +162,13 @@ protected virtual async Task OnSubmitAsync(StratumClient client, Timestamped maxShareAge) + if(requestAge > maxShareAge) { logger.Warn(() => $"[{client.ConnectionId}] Dropping stale share submission request (server overloaded?)"); return; @@ -178,9 +178,9 @@ protected virtual async Task OnSubmitAsync(StratumClient client, Timestamped $"[{client.ConnectionId}] Share accepted: D={Math.Round(share.Difficulty * coin.ShareMultiplier, 3)}"); // update pool stats - if (share.IsBlockCandidate) + if(share.IsBlockCandidate) poolStats.LastPoolBlockTime = clock.Now; // update client stats @@ -239,7 +239,7 @@ private async Task OnSuggestDifficultyAsync(StratumClient client, Timestamped poolEndpoint.Difficulty) + if(requestedDiff > poolEndpoint.Difficulty) { context.SetDifficulty(requestedDiff); await client.NotifyAsync(BitcoinStratumMethods.SetDifficulty, new object[] { context.Difficulty }); @@ -264,7 +264,7 @@ private async Task OnConfigureMiningAsync(StratumClient client, Timestamped>(); var result = new Dictionary(); - foreach (var extension in extensions) + foreach(var extension in extensions) { switch(extension) { @@ -281,13 +281,13 @@ private async Task OnConfigureMiningAsync(StratumClient client, Timestamped extensionParams, Dictionary result) { //var requestedBits = extensionParams[BitcoinStratumExtensions.VersionRollingBits].Value(); uint requestedMask = BitcoinConstants.VersionRollingPoolMask; - if (extensionParams.TryGetValue(BitcoinStratumExtensions.VersionRollingMask, out var requestedMaskValue)) + if(extensionParams.TryGetValue(BitcoinStratumExtensions.VersionRollingMask, out var requestedMaskValue)) requestedMask = uint.Parse(requestedMaskValue.Value(), NumberStyles.HexNumber); // Compute effective mask @@ -300,7 +300,7 @@ private void ConfigureVersionRolling(StratumClient client, BitcoinWorkerContext logger.Info(() => $"[{client.ConnectionId}] Using version-rolling mask {result[BitcoinStratumExtensions.VersionRollingMask]}"); } - private void ConfigureMinimumDiff(StratumClient client, BitcoinWorkerContext context, + private void ConfigureMinimumDiff(StratumClient client, BitcoinWorkerContext context, Dictionary extensionParams, Dictionary result) { var requestedDiff = extensionParams[BitcoinStratumExtensions.MinimumDiffValue].Value(); @@ -308,7 +308,7 @@ private void ConfigureMinimumDiff(StratumClient client, BitcoinWorkerContext con // client may suggest higher-than-base difficulty, but not a lower one var poolEndpoint = poolConfig.Ports[client.PoolEndpoint.Port]; - if (requestedDiff > poolEndpoint.Difficulty) + if(requestedDiff > poolEndpoint.Difficulty) { context.VarDiff = null; // disable vardiff context.SetDifficulty(requestedDiff); @@ -328,17 +328,17 @@ protected virtual async Task OnNewJobAsync(object jobParams) var tasks = ForEachClient(async client => { - if (!client.IsAlive) + if(!client.IsAlive) return; var context = client.ContextAs(); - if (context.IsSubscribed && context.IsAuthorized) + if(context.IsSubscribed && context.IsAuthorized) { // check alive var lastActivityAgo = clock.Now - context.LastActivity; - if (poolConfig.ClientConnectionTimeout > 0 && + if(poolConfig.ClientConnectionTimeout > 0 && lastActivityAgo.TotalSeconds > poolConfig.ClientConnectionTimeout) { logger.Info(() => $"[{client.ConnectionId}] Booting zombie-worker (idle-timeout exceeded)"); @@ -347,7 +347,7 @@ protected virtual async Task OnNewJobAsync(object jobParams) } // varDiff: if the client has a pending difficulty change, apply it now - if (context.ApplyPendingDifficulty()) + if(context.ApplyPendingDifficulty()) await client.NotifyAsync(BitcoinStratumMethods.SetDifficulty, new object[] { context.Difficulty }); // send job @@ -362,7 +362,7 @@ protected virtual async Task OnNewJobAsync(object jobParams) catch(Exception ex) { - logger.Debug(()=> $"{nameof(OnNewJobAsync)}: {ex.Message}"); + logger.Debug(() => $"{nameof(OnNewJobAsync)}: {ex.Message}"); } } @@ -394,7 +394,7 @@ protected override async Task SetupJobManager(CancellationToken ct) await manager.StartAsync(ct); - if (poolConfig.EnableInternalStratum == true) + if(poolConfig.EnableInternalStratum == true) { disposables.Add(manager.Jobs .Select(job => Observable.FromAsync(async () => @@ -500,7 +500,7 @@ protected override async Task OnVarDiffUpdateAsync(StratumClient client, double context.EnqueueNewDifficulty(newDiff); // apply immediately and notify client - if (context.HasPendingDifficulty) + if(context.HasPendingDifficulty) { context.ApplyPendingDifficulty(); diff --git a/src/Miningcore/Blockchain/Cryptonote/CryptonoteJob.cs b/src/Miningcore/Blockchain/Cryptonote/CryptonoteJob.cs index 436136f433..74ad72f0c3 100644 --- a/src/Miningcore/Blockchain/Cryptonote/CryptonoteJob.cs +++ b/src/Miningcore/Blockchain/Cryptonote/CryptonoteJob.cs @@ -49,7 +49,7 @@ public CryptonoteJob(GetBlockTemplateResponse blockTemplate, byte[] instanceId, PrepareBlobTemplate(instanceId); PrevHash = prevHash; - switch (coin.Hash) + switch(coin.Hash) { case CryptonightHashType.Normal: hashFunc = LibCryptonight.Cryptonight; @@ -100,7 +100,7 @@ private string EncodeTarget(double difficulty) var padLength = padded.Length - bytes.Length; - if (padLength > 0) + if(padLength > 0) bytes.CopyTo(padded.Slice(padLength, bytes.Length)); padded = padded.Slice(0, 4); @@ -129,7 +129,7 @@ public void PrepareWorkerJob(CryptonoteWorkerJob workerJob, out string blob, out workerJob.Height = BlockTemplate.Height; workerJob.ExtraNonce = (uint) Interlocked.Increment(ref extraNonce); - if (extraNonce < 0) + if(extraNonce < 0) extraNonce = 0; blob = EncodeBlob(workerJob.ExtraNonce); @@ -145,7 +145,7 @@ public void PrepareWorkerJob(CryptonoteWorkerJob workerJob, out string blob, out var context = worker.ContextAs(); // validate nonce - if (!CryptonoteConstants.RegexValidNonce.IsMatch(nonce)) + if(!CryptonoteConstants.RegexValidNonce.IsMatch(nonce)) throw new StratumException(StratumError.MinusOne, "malformed nonce"); // clone template @@ -162,22 +162,22 @@ public void PrepareWorkerJob(CryptonoteWorkerJob workerJob, out string blob, out // convert var blobConverted = LibCryptonote.ConvertBlob(blob, blobTemplate.Length); - if (blobConverted == null) + if(blobConverted == null) throw new StratumException(StratumError.MinusOne, "malformed blob"); // determine variant CryptonightVariant variant = CryptonightVariant.VARIANT_0; - if (coin.HashVariant != 0) + if(coin.HashVariant != 0) variant = (CryptonightVariant) coin.HashVariant; else { - switch (coin.Hash) + switch(coin.Hash) { case CryptonightHashType.Normal: - variant = (blobConverted[0] >= 10) ? CryptonightVariant.VARIANT_4 : + variant = (blobConverted[0] >= 10) ? CryptonightVariant.VARIANT_4 : ((blobConverted[0] >= 8) ? CryptonightVariant.VARIANT_2 : - ((blobConverted[0] == 7) ? CryptonightVariant.VARIANT_1 : + ((blobConverted[0] == 7) ? CryptonightVariant.VARIANT_1 : CryptonightVariant.VARIANT_0)); break; @@ -196,7 +196,7 @@ public void PrepareWorkerJob(CryptonoteWorkerJob workerJob, out string blob, out hashFunc(blobConverted, headerHash, variant, BlockTemplate.Height); var headerHashString = headerHash.ToHexString(); - if (headerHashString != workerHash) + if(headerHashString != workerHash) throw new StratumException(StratumError.MinusOne, "bad hash"); // check difficulty @@ -207,14 +207,14 @@ public void PrepareWorkerJob(CryptonoteWorkerJob workerJob, out string blob, out var isBlockCandidate = shareDiff >= BlockTemplate.Difficulty; // test if share meets at least workers current difficulty - if (!isBlockCandidate && ratio < 0.99) + if(!isBlockCandidate && ratio < 0.99) { // check if share matched the previous difficulty from before a vardiff retarget - if (context.VarDiff?.LastUpdate != null && context.PreviousDifficulty.HasValue) + if(context.VarDiff?.LastUpdate != null && context.PreviousDifficulty.HasValue) { ratio = shareDiff / context.PreviousDifficulty.Value; - if (ratio < 0.99) + if(ratio < 0.99) throw new StratumException(StratumError.LowDifficultyShare, $"low difficulty share ({shareDiff})"); // use previous difficulty diff --git a/src/Miningcore/Blockchain/Cryptonote/CryptonoteJobManager.cs b/src/Miningcore/Blockchain/Cryptonote/CryptonoteJobManager.cs index c0b4297159..93e3d33f7b 100644 --- a/src/Miningcore/Blockchain/Cryptonote/CryptonoteJobManager.cs +++ b/src/Miningcore/Blockchain/Cryptonote/CryptonoteJobManager.cs @@ -91,7 +91,7 @@ protected async Task UpdateJob(string via = null, string json = null) var response = string.IsNullOrEmpty(json) ? await GetBlockTemplateAsync() : GetBlockTemplateFromJson(json); // may happen if daemon is currently not connected to peers - if (response.Error != null) + if(response.Error != null) { logger.Warn(() => $"Unable to update job. Daemon responded with: {response.Error.Message} Code {response.Error.Code}"); return false; @@ -103,11 +103,11 @@ protected async Task UpdateJob(string via = null, string json = null) var isNew = job == null || newHash != job.PrevHash; - if (isNew) + if(isNew) { messageBus.NotifyChainHeight(poolConfig.Id, blockTemplate.Height, poolConfig.Template); - if (via != null) + if(via != null) logger.Info(() => $"Detected new block {blockTemplate.Height} via {via}"); else logger.Info(() => $"Detected new block {blockTemplate.Height}"); @@ -164,7 +164,7 @@ private async Task ShowDaemonSyncProgressAsync() var infos = await daemon.ExecuteCmdAllAsync(logger, CryptonoteCommands.GetInfo); var firstValidResponse = infos.FirstOrDefault(x => x.Error == null && x.Response != null)?.Response; - if (firstValidResponse != null) + if(firstValidResponse != null) { var lowestHeight = infos.Where(x => x.Error == null && x.Response != null) .Min(x => x.Response.Height); @@ -184,10 +184,10 @@ private async Task UpdateNetworkStatsAsync() { var infoResponse = await daemon.ExecuteCmdAnyAsync(logger, CryptonoteCommands.GetInfo); - if (infoResponse.Error != null) + if(infoResponse.Error != null) logger.Warn(() => $"Error(s) refreshing network stats: {infoResponse.Error.Message} (Code {infoResponse.Error.Code})"); - if (infoResponse.Response != null) + if(infoResponse.Response != null) { var info = infoResponse.Response.ToObject(); @@ -206,7 +206,7 @@ private async Task SubmitBlockAsync(Share share, string blobHex, string bl { var response = await daemon.ExecuteCmdAnyAsync(logger, CryptonoteCommands.SubmitBlock, new[] { blobHex }); - if (response.Error != null || response?.Response?.Status != "OK") + if(response.Error != null || response?.Response?.Status != "OK") { var error = response.Error?.Message ?? response.Response?.Status; @@ -237,21 +237,21 @@ public override void Configure(PoolConfig poolConfig, ClusterConfig clusterConfi .Where(x => string.IsNullOrEmpty(x.Category)) .Select(x => { - if (string.IsNullOrEmpty(x.HttpPath)) + if(string.IsNullOrEmpty(x.HttpPath)) x.HttpPath = CryptonoteConstants.DaemonRpcLocation; return x; }) .ToArray(); - if (clusterConfig.PaymentProcessing?.Enabled == true && poolConfig.PaymentProcessing?.Enabled == true) + if(clusterConfig.PaymentProcessing?.Enabled == true && poolConfig.PaymentProcessing?.Enabled == true) { // extract wallet daemon endpoints walletDaemonEndpoints = poolConfig.Daemons .Where(x => x.Category?.ToLower() == CryptonoteConstants.WalletDaemonCategory) .Select(x => { - if (string.IsNullOrEmpty(x.HttpPath)) + if(string.IsNullOrEmpty(x.HttpPath)) x.HttpPath = CryptonoteConstants.DaemonRpcLocation; // cryptonote daemons only support digest auth @@ -261,7 +261,7 @@ public override void Configure(PoolConfig poolConfig, ClusterConfig clusterConfi }) .ToArray(); - if (walletDaemonEndpoints.Length == 0) + if(walletDaemonEndpoints.Length == 0) logger.ThrowLogPoolStartupException("Wallet-RPC daemon is not configured (Daemon configuration for monero-pools require an additional entry of category \'wallet' pointing to the wallet daemon)"); } @@ -279,13 +279,13 @@ public bool ValidateAddress(string address) switch(networkType) { case CryptonoteNetworkType.Main: - if (addressPrefix != coin.AddressPrefix && + if(addressPrefix != coin.AddressPrefix && addressIntegratedPrefix != coin.AddressPrefixIntegrated) return false; break; case CryptonoteNetworkType.Test: - if (addressPrefix != coin.AddressPrefixTestnet && + if(addressPrefix != coin.AddressPrefixTestnet && addressIntegratedPrefix != coin.AddressPrefixIntegratedTestnet) return false; break; @@ -303,7 +303,7 @@ public void PrepareWorkerJob(CryptonoteWorkerJob workerJob, out string blob, out var job = currentJob; - if (job != null) + if(job != null) { lock(job) { @@ -322,7 +322,7 @@ public async ValueTask SubmitShareAsync(StratumClient worker, var context = worker.ContextAs(); var job = currentJob; - if (workerJob.Height != job?.BlockTemplate.Height) + if(workerJob.Height != job?.BlockTemplate.Height) throw new StratumException(StratumError.MinusOne, "block expired"); // validate & process @@ -339,13 +339,13 @@ public async ValueTask SubmitShareAsync(StratumClient worker, share.Created = clock.Now; // if block candidate, submit & check if accepted by network - if (share.IsBlockCandidate) + if(share.IsBlockCandidate) { logger.Info(() => $"Submitting block {share.BlockHeight} [{share.BlockHash.Substring(0, 6)}]"); share.IsBlockCandidate = await SubmitBlockAsync(share, blobHex, share.BlockHash); - if (share.IsBlockCandidate) + if(share.IsBlockCandidate) { logger.Info(() => $"Daemon accepted block {share.BlockHeight} [{share.BlockHash.Substring(0, 6)}] submitted by {context.Miner}"); blockSubmissionSubject.OnNext(Unit.Default); @@ -374,7 +374,7 @@ protected override void ConfigureDaemons() daemon = new DaemonClient(jsonSerializerSettings, messageBus, clusterConfig.ClusterName ?? poolConfig.PoolName, poolConfig.Id); daemon.Configure(daemonEndpoints); - if (clusterConfig.PaymentProcessing?.Enabled == true && poolConfig.PaymentProcessing?.Enabled == true) + if(clusterConfig.PaymentProcessing?.Enabled == true && poolConfig.PaymentProcessing?.Enabled == true) { // also setup wallet daemon walletDaemon = new DaemonClient(jsonSerializerSettings, messageBus, clusterConfig.ClusterName ?? poolConfig.PoolName, poolConfig.Id); @@ -387,20 +387,20 @@ protected override async Task AreDaemonsHealthyAsync() // test daemons var responses = await daemon.ExecuteCmdAllAsync(logger, CryptonoteCommands.GetInfo); - if (responses.Where(x => x.Error?.InnerException?.GetType() == typeof(DaemonClientException)) + if(responses.Where(x => x.Error?.InnerException?.GetType() == typeof(DaemonClientException)) .Select(x => (DaemonClientException) x.Error.InnerException) .Any(x => x.Code == HttpStatusCode.Unauthorized)) logger.ThrowLogPoolStartupException($"Daemon reports invalid credentials"); - if (!responses.All(x => x.Error == null)) + if(!responses.All(x => x.Error == null)) return false; - if (clusterConfig.PaymentProcessing?.Enabled == true && poolConfig.PaymentProcessing?.Enabled == true) + if(clusterConfig.PaymentProcessing?.Enabled == true && poolConfig.PaymentProcessing?.Enabled == true) { // test wallet daemons var responses2 = await walletDaemon.ExecuteCmdAllAsync(logger, CryptonoteWalletCommands.GetAddress); - if (responses2.Where(x => x.Error?.InnerException?.GetType() == typeof(DaemonClientException)) + if(responses2.Where(x => x.Error?.InnerException?.GetType() == typeof(DaemonClientException)) .Select(x => (DaemonClientException) x.Error.InnerException) .Any(x => x.Code == HttpStatusCode.Unauthorized)) logger.ThrowLogPoolStartupException($"Wallet-Daemon reports invalid credentials"); @@ -436,13 +436,13 @@ protected override async Task EnsureDaemonsSynchedAsync(CancellationToken ct) var isSynched = responses.All(x => x.Error == null || x.Error.Code != -9); - if (isSynched) + if(isSynched) { logger.Info(() => $"All daemons synched with blockchain"); break; } - if (!syncPendingNotificationShown) + if(!syncPendingNotificationShown) { logger.Info(() => $"Daemons still syncing with network. Manager will be started once synced"); syncPendingNotificationShown = true; @@ -460,15 +460,15 @@ protected override async Task PostStartInitAsync(CancellationToken ct) var coin = poolConfig.Template.As(); var infoResponse = await daemon.ExecuteCmdAnyAsync(logger, CryptonoteCommands.GetInfo); - if (infoResponse.Error != null) + if(infoResponse.Error != null) logger.ThrowLogPoolStartupException($"Init RPC failed: {infoResponse.Error.Message} (Code {infoResponse.Error.Code})"); - if (clusterConfig.PaymentProcessing?.Enabled == true && poolConfig.PaymentProcessing?.Enabled == true) + if(clusterConfig.PaymentProcessing?.Enabled == true && poolConfig.PaymentProcessing?.Enabled == true) { var addressResponse = await walletDaemon.ExecuteCmdAnyAsync(logger, ct, CryptonoteWalletCommands.GetAddress); // ensure pool owns wallet - if (clusterConfig.PaymentProcessing?.Enabled == true && addressResponse.Response?.Address != poolConfig.Address) + if(clusterConfig.PaymentProcessing?.Enabled == true && addressResponse.Response?.Address != poolConfig.Address) logger.ThrowLogPoolStartupException($"Wallet-Daemon does not own pool-address '{poolConfig.Address}'"); } @@ -479,23 +479,23 @@ protected override async Task PostStartInitAsync(CancellationToken ct) // address validation poolAddressBase58Prefix = LibCryptonote.DecodeAddress(poolConfig.Address); - if (poolAddressBase58Prefix == 0) + if(poolAddressBase58Prefix == 0) logger.ThrowLogPoolStartupException("Unable to decode pool-address"); switch(networkType) { case CryptonoteNetworkType.Main: - if (poolAddressBase58Prefix != coin.AddressPrefix) + if(poolAddressBase58Prefix != coin.AddressPrefix) logger.ThrowLogPoolStartupException($"Invalid pool address prefix. Expected {coin.AddressPrefix}, got {poolAddressBase58Prefix}"); break; case CryptonoteNetworkType.Test: - if (poolAddressBase58Prefix != coin.AddressPrefixTestnet) + if(poolAddressBase58Prefix != coin.AddressPrefixTestnet) logger.ThrowLogPoolStartupException($"Invalid pool address prefix. Expected {coin.AddressPrefix}, got {poolAddressBase58Prefix}"); break; } - if (clusterConfig.PaymentProcessing?.Enabled == true && poolConfig.PaymentProcessing?.Enabled == true) + if(clusterConfig.PaymentProcessing?.Enabled == true && poolConfig.PaymentProcessing?.Enabled == true) ConfigureRewards(); // update stats @@ -506,18 +506,18 @@ protected override async Task PostStartInitAsync(CancellationToken ct) // Periodically update network stats Observable.Interval(TimeSpan.FromMinutes(1)) - .Select(via => Observable.FromAsync(async ()=> - { - try - { - await UpdateNetworkStatsAsync(); - } - - catch (Exception ex) - { - logger.Error(ex); - } - })) + .Select(via => Observable.FromAsync(async () => + { + try + { + await UpdateNetworkStatsAsync(); + } + + catch(Exception ex) + { + logger.Error(ex); + } + })) .Concat() .Subscribe(); @@ -527,7 +527,7 @@ protected override async Task PostStartInitAsync(CancellationToken ct) private void ConfigureRewards() { // Donation to MiningCore development - if (networkType == CryptonoteNetworkType.Main && + if(networkType == CryptonoteNetworkType.Main && DevDonation.Addresses.TryGetValue(poolConfig.Template.Symbol, out var address)) { poolConfig.RewardRecipients = poolConfig.RewardRecipients.Concat(new[] @@ -552,7 +552,7 @@ protected virtual void SetupJobUpdates() blockSubmission.Select(x => ("Block-submission", (string) null)) }; - if (extraPoolConfig?.BtStream == null) + if(extraPoolConfig?.BtStream == null) { // collect ports var zmq = poolConfig.Daemons @@ -565,14 +565,14 @@ protected virtual void SetupJobUpdates() return (Socket: extra.ZmqBlockNotifySocket, Topic: topic); }); - if (zmq.Count > 0) + if(zmq.Count > 0) { logger.Info(() => $"Subscribing to ZMQ push-updates from {string.Join(", ", zmq.Values)}"); var blockNotify = daemon.ZmqSubscribe(logger, zmq) .Select(msg => { - using (msg) + using(msg) { // We just take the second frame's raw data and turn it into a hex string. // If that string changes, we got an update (DistinctUntilChanged) @@ -594,7 +594,7 @@ protected virtual void SetupJobUpdates() triggers.Add(blockNotify); } - if (poolConfig.BlockRefreshInterval > 0) + if(poolConfig.BlockRefreshInterval > 0) { // periodically update block-template var pollingInterval = poolConfig.BlockRefreshInterval > 0 ? poolConfig.BlockRefreshInterval : 1000; diff --git a/src/Miningcore/Blockchain/Cryptonote/CryptonotePayoutHandler.cs b/src/Miningcore/Blockchain/Cryptonote/CryptonotePayoutHandler.cs index e13039d316..1b772cb4e0 100644 --- a/src/Miningcore/Blockchain/Cryptonote/CryptonotePayoutHandler.cs +++ b/src/Miningcore/Blockchain/Cryptonote/CryptonotePayoutHandler.cs @@ -84,7 +84,7 @@ private async Task HandleTransferResponseAsync(DaemonResponse(); - if (response.Error == null) + if(response.Error == null) { var txHash = response.Response.TxHash; var txFee = (decimal) response.Response.Fee / coin.SmallestUnit; @@ -109,7 +109,7 @@ private async Task HandleTransferResponseAsync(DaemonResponse(); - if (response.Error == null) + if(response.Error == null) { var txHashes = response.Response.TxHashList; var txFees = response.Response.FeeList.Select(x => (decimal) x / coin.SmallestUnit).ToArray(); @@ -132,7 +132,7 @@ private async Task HandleTransferResponseAsync(DaemonResponse GetNetworkTypeAsync() { - if (!networkType.HasValue) + if(!networkType.HasValue) { var infoResponse = await daemon.ExecuteCmdAnyAsync(logger, CryptonoteCommands.GetInfo, true); var info = infoResponse.Response.ToObject(); @@ -147,7 +147,7 @@ private async Task EnsureBalance(decimal requiredAmount, CryptonoteCoinTem { var response = await walletDaemon.ExecuteCmdSingleAsync(logger, CryptonoteWalletCommands.GetBalance); - if (response.Error != null) + if(response.Error != null) { logger.Error(() => $"[{LogCategory}] Daemon command '{CryptonoteWalletCommands.GetBalance}' returned error: {response.Error.Message} code {response.Error.Code}"); return false; @@ -156,7 +156,7 @@ private async Task EnsureBalance(decimal requiredAmount, CryptonoteCoinTem var unlockedBalance = Math.Floor(response.Response.UnlockedBalance / coin.SmallestUnit); var balance = Math.Floor(response.Response.Balance / coin.SmallestUnit); - if (response.Response.UnlockedBalance < requiredAmount) + if(response.Response.UnlockedBalance < requiredAmount) { logger.Error(() => $"[{LogCategory}] Need {FormatAmount(requiredAmount)} unlocked balance, but only have {FormatAmount(unlockedBalance)} ({FormatAmount(balance)})"); return false; @@ -171,7 +171,7 @@ private async Task PayoutBatch(Balance[] balances) var coin = poolConfig.Template.As(); // ensure there's enough balance - if (!await EnsureBalance(balances.Sum(x => x.Amount), coin)) + if(!await EnsureBalance(balances.Sum(x => x.Amount), coin)) return false; // build request @@ -193,7 +193,7 @@ private async Task PayoutBatch(Balance[] balances) GetTxKey = true }; - if (request.Destinations.Length == 0) + if(request.Destinations.Length == 0) return true; logger.Info(() => $"[{LogCategory}] Paying out {FormatAmount(balances.Sum(x => x.Amount))} to {balances.Length} addresses:\n{string.Join("\n", balances.OrderByDescending(x => x.Amount).Select(x => $"{FormatAmount(x.Amount)} to {x.Address}"))}"); @@ -202,9 +202,9 @@ private async Task PayoutBatch(Balance[] balances) var transferResponse = await walletDaemon.ExecuteCmdSingleAsync(logger, CryptonoteWalletCommands.Transfer, request); // gracefully handle error -4 (transaction would be too large. try /transfer_split) - if (transferResponse.Error?.Code == -4) + if(transferResponse.Error?.Code == -4) { - if (walletSupportsTransferSplit) + if(walletSupportsTransferSplit) { logger.Error(() => $"[{LogCategory}] Daemon command '{CryptonoteWalletCommands.Transfer}' returned error: {transferResponse.Error.Message} code {transferResponse.Error.Code}"); logger.Info(() => $"[{LogCategory}] Retrying transfer using {CryptonoteWalletCommands.TransferSplit}"); @@ -223,16 +223,16 @@ private void ExtractAddressAndPaymentId(string input, out string address, out st paymentId = null; var index = input.IndexOf(PayoutConstants.PayoutInfoSeperator); - if (index != -1) + if(index != -1) { address = input.Substring(0, index); - if (index + 1 < input.Length) + if(index + 1 < input.Length) { paymentId = input.Substring(index + 1); // ignore invalid payment ids - if (paymentId.Length != CryptonoteConstants.PaymentIdHexLength) + if(paymentId.Length != CryptonoteConstants.PaymentIdHexLength) paymentId = null; } } @@ -249,7 +249,7 @@ private async Task PayoutToPaymentId(Balance balance) var isIntegratedAddress = string.IsNullOrEmpty(paymentId); // ensure there's enough balance - if (!await EnsureBalance(balance.Amount, coin)) + if(!await EnsureBalance(balance.Amount, coin)) return false; // build request @@ -267,10 +267,10 @@ private async Task PayoutToPaymentId(Balance balance) GetTxKey = true }; - if (!isIntegratedAddress) + if(!isIntegratedAddress) request.PaymentId = paymentId; - if (!isIntegratedAddress) + if(!isIntegratedAddress) logger.Info(() => $"[{LogCategory}] Paying out {FormatAmount(balance.Amount)} to address {balance.Address} with paymentId {paymentId}"); else logger.Info(() => $"[{LogCategory}] Paying out {FormatAmount(balance.Amount)} to integrated address {balance.Address}"); @@ -278,10 +278,10 @@ private async Task PayoutToPaymentId(Balance balance) // send command var result = await walletDaemon.ExecuteCmdSingleAsync(logger, CryptonoteWalletCommands.Transfer, request); - if (walletSupportsTransferSplit) + if(walletSupportsTransferSplit) { // gracefully handle error -4 (transaction would be too large. try /transfer_split) - if (result.Error?.Code == -4) + if(result.Error?.Code == -4) { logger.Info(() => $"[{LogCategory}] Retrying transfer using {CryptonoteWalletCommands.TransferSplit}"); @@ -311,7 +311,7 @@ public async Task ConfigureAsync(ClusterConfig clusterConfig, PoolConfig poolCon .Where(x => string.IsNullOrEmpty(x.Category)) .Select(x => { - if (string.IsNullOrEmpty(x.HttpPath)) + if(string.IsNullOrEmpty(x.HttpPath)) x.HttpPath = CryptonoteConstants.DaemonRpcLocation; return x; @@ -326,7 +326,7 @@ public async Task ConfigureAsync(ClusterConfig clusterConfig, PoolConfig poolCon .Where(x => x.Category?.ToLower() == CryptonoteConstants.WalletDaemonCategory) .Select(x => { - if (string.IsNullOrEmpty(x.HttpPath)) + if(string.IsNullOrEmpty(x.HttpPath)) x.HttpPath = CryptonoteConstants.DaemonRpcLocation; return x; @@ -374,13 +374,13 @@ public async Task ClassifyBlocksAsync(Block[] blocks) Height = block.BlockHeight }); - if (rpcResult.Error != null) + if(rpcResult.Error != null) { logger.Debug(() => $"[{LogCategory}] Daemon reports error '{rpcResult.Error.Message}' (Code {rpcResult.Error.Code}) for block {block.BlockHeight}"); continue; } - if (rpcResult.Response?.BlockHeader == null) + if(rpcResult.Response?.BlockHeader == null) { logger.Debug(() => $"[{LogCategory}] Daemon returned no header for block {block.BlockHeight}"); continue; @@ -395,7 +395,7 @@ public async Task ClassifyBlocksAsync(Block[] blocks) messageBus.NotifyBlockConfirmationProgress(poolConfig.Id, block, coin); // orphaned? - if (blockHeader.IsOrphaned || blockHeader.Hash != block.TransactionConfirmationData) + if(blockHeader.IsOrphaned || blockHeader.Hash != block.TransactionConfirmationData) { block.Status = BlockStatus.Orphaned; block.Reward = 0; @@ -405,7 +405,7 @@ public async Task ClassifyBlocksAsync(Block[] blocks) } // matured and spendable? - if (blockHeader.Depth >= CryptonoteConstants.PayoutMinBlockConfirmations) + if(blockHeader.Depth >= CryptonoteConstants.PayoutMinBlockConfirmations) { block.Status = BlockStatus.Confirmed; block.ConfirmationProgress = 1; @@ -465,7 +465,7 @@ public async Task PayoutAsync(Balance[] balances) switch(networkType) { case CryptonoteNetworkType.Main: - if (addressPrefix != coin.AddressPrefix && + if(addressPrefix != coin.AddressPrefix && addressIntegratedPrefix != coin.AddressPrefixIntegrated) { logger.Warn(() => $"[{LogCategory}] Excluding payment to invalid address {x.Address}"); @@ -475,7 +475,7 @@ public async Task PayoutAsync(Balance[] balances) break; case CryptonoteNetworkType.Test: - if (addressPrefix != coin.AddressPrefixTestnet && + if(addressPrefix != coin.AddressPrefixTestnet && addressIntegratedPrefix != coin.AddressPrefixIntegratedTestnet) { logger.Warn(() => $"[{LogCategory}] Excluding payment to invalid address {x.Address}"); @@ -502,22 +502,22 @@ public async Task PayoutAsync(Balance[] balances) switch(networkType) { case CryptonoteNetworkType.Main: - if (addressIntegratedPrefix == coin.AddressPrefixIntegrated) + if(addressIntegratedPrefix == coin.AddressPrefixIntegrated) isIntegratedAddress = true; break; case CryptonoteNetworkType.Test: - if (addressIntegratedPrefix == coin.AddressPrefixIntegratedTestnet) + if(addressIntegratedPrefix == coin.AddressPrefixIntegratedTestnet) isIntegratedAddress = true; break; } return !hasPaymentId && !isIntegratedAddress; }) - .OrderByDescending(x=> x.Amount) + .OrderByDescending(x => x.Amount) .ToArray(); - if (simpleBalances.Length > 0) + if(simpleBalances.Length > 0) #if false await PayoutBatch(simpleBalances); #else @@ -533,7 +533,7 @@ public async Task PayoutAsync(Balance[] balances) .Take(pageSize) .ToArray(); - if (!await PayoutBatch(page)) + if(!await PayoutBatch(page)) break; } } @@ -545,7 +545,7 @@ public async Task PayoutAsync(Balance[] balances) .Where(x => x.Amount >= minimumPaymentToPaymentId) .ToArray(); - foreach (var balance in paymentIdBalances) + foreach(var balance in paymentIdBalances) { if(!await PayoutToPaymentId(balance)) break; diff --git a/src/Miningcore/Blockchain/Cryptonote/CryptonotePool.cs b/src/Miningcore/Blockchain/Cryptonote/CryptonotePool.cs index 26251c0b20..291c468f76 100644 --- a/src/Miningcore/Blockchain/Cryptonote/CryptonotePool.cs +++ b/src/Miningcore/Blockchain/Cryptonote/CryptonotePool.cs @@ -66,12 +66,12 @@ private async Task OnLoginAsync(StratumClient client, Timestamped(); - if (request.Id == null) + if(request.Id == null) throw new StratumException(StratumError.MinusOne, "missing request id"); var loginRequest = request.ParamsAs(); - if (string.IsNullOrEmpty(loginRequest?.Login)) + if(string.IsNullOrEmpty(loginRequest?.Login)) throw new StratumException(StratumError.MinusOne, "missing login"); // extract worker/miner/paymentid @@ -84,12 +84,12 @@ private async Task OnLoginAsync(StratumClient client, Timestamped= context.VarDiff.Config.MinDiff || context.VarDiff == null && staticDiff.Value > context.Difficulty)) { @@ -139,13 +139,13 @@ private async Task OnGetJobAsync(StratumClient client, Timestamped(); - if (request.Id == null) + if(request.Id == null) throw new StratumException(StratumError.MinusOne, "missing request id"); var getJobRequest = request.ParamsAs(); // validate worker - if (client.ConnectionId != getJobRequest?.WorkerId || !context.IsAuthorized) + if(client.ConnectionId != getJobRequest?.WorkerId || !context.IsAuthorized) throw new StratumException(StratumError.MinusOne, "unauthorized"); // respond @@ -161,7 +161,7 @@ private CryptonoteJobParams CreateWorkerJob(StratumClient client) manager.PrepareWorkerJob(job, out var blob, out var target); // should never happen - if (string.IsNullOrEmpty(blob) || string.IsNullOrEmpty(blob)) + if(string.IsNullOrEmpty(blob) || string.IsNullOrEmpty(blob)) return null; var result = new CryptonoteJobParams @@ -188,13 +188,13 @@ private async Task OnSubmitAsync(StratumClient client, Timestamped maxShareAge) + if(requestAge > maxShareAge) { logger.Warn(() => $"[{client.ConnectionId}] Dropping stale share submission request (server overloaded?)"); return; @@ -204,7 +204,7 @@ private async Task OnSubmitAsync(StratumClient client, Timestamped(); // validate worker - if (client.ConnectionId != submitRequest?.WorkerId || !context.IsAuthorized) + if(client.ConnectionId != submitRequest?.WorkerId || !context.IsAuthorized) throw new StratumException(StratumError.MinusOne, "unauthorized"); // recognize activity @@ -216,7 +216,7 @@ private async Task OnSubmitAsync(StratumClient client, Timestamped $"[{client.ConnectionId}] Share accepted: D={Math.Round(share.Difficulty, 3)}"); // update pool stats - if (share.IsBlockCandidate) + if(share.IsBlockCandidate) poolStats.LastPoolBlockTime = clock.Now; // update client stats @@ -280,17 +280,17 @@ private Task OnNewJobAsync() var tasks = ForEachClient(async client => { - if (!client.IsAlive) + if(!client.IsAlive) return; var context = client.ContextAs(); - if (context.IsSubscribed && context.IsAuthorized) + if(context.IsSubscribed && context.IsAuthorized) { // check alive var lastActivityAgo = clock.Now - context.LastActivity; - if (poolConfig.ClientConnectionTimeout > 0 && + if(poolConfig.ClientConnectionTimeout > 0 && lastActivityAgo.TotalSeconds > poolConfig.ClientConnectionTimeout) { logger.Info(() => $"[[{client.ConnectionId}] Booting zombie-worker (idle-timeout exceeded)"); @@ -305,7 +305,7 @@ private Task OnNewJobAsync() }); return Task.WhenAll(tasks); - } + } #region Overrides @@ -316,7 +316,7 @@ protected override async Task SetupJobManager(CancellationToken ct) await manager.StartAsync(ct); - if (poolConfig.EnableInternalStratum == true) + if(poolConfig.EnableInternalStratum == true) { disposables.Add(manager.Blocks .Select(_ => Observable.FromAsync(async () => @@ -326,7 +326,7 @@ protected override async Task SetupJobManager(CancellationToken ct) await OnNewJobAsync(); } - catch (Exception ex) + catch(Exception ex) { logger.Debug(() => $"{nameof(OnNewJobAsync)}: {ex.Message}"); } @@ -414,7 +414,7 @@ protected override async Task OnVarDiffUpdateAsync(StratumClient client, double // apply immediately and notify client var context = client.ContextAs(); - if (context.HasPendingDifficulty) + if(context.HasPendingDifficulty) { context.ApplyPendingDifficulty(); diff --git a/src/Miningcore/Blockchain/Cryptonote/DaemonResponses/TransferResponse.cs b/src/Miningcore/Blockchain/Cryptonote/DaemonResponses/TransferResponse.cs index a7470ddca1..0d91e24ce6 100644 --- a/src/Miningcore/Blockchain/Cryptonote/DaemonResponses/TransferResponse.cs +++ b/src/Miningcore/Blockchain/Cryptonote/DaemonResponses/TransferResponse.cs @@ -52,7 +52,7 @@ public class TransferResponse /// [JsonProperty("do_not_relay")] public string DoNotRelay { get; set; } - + public string Status { get; set; } } } diff --git a/src/Miningcore/Blockchain/Equihash/Custom/BitcoinGold/BitcoinGoldJob.cs b/src/Miningcore/Blockchain/Equihash/Custom/BitcoinGold/BitcoinGoldJob.cs index d9b0d22841..a3c9df44a6 100644 --- a/src/Miningcore/Blockchain/Equihash/Custom/BitcoinGold/BitcoinGoldJob.cs +++ b/src/Miningcore/Blockchain/Equihash/Custom/BitcoinGold/BitcoinGoldJob.cs @@ -57,12 +57,12 @@ protected override Transaction CreateOutputTransaction() protected override void BuildCoinbase() { - var script = TxIn.CreateCoinbase((int)BlockTemplate.Height).ScriptSig; + var script = TxIn.CreateCoinbase((int) BlockTemplate.Height).ScriptSig; // output transaction txOut = CreateOutputTransaction(); - using (var stream = new MemoryStream()) + using(var stream = new MemoryStream()) { var bs = new BitcoinStream(stream, true); @@ -94,11 +94,11 @@ private byte[] SerializeOutputTransaction(Transaction tx) { var withDefaultWitnessCommitment = !string.IsNullOrEmpty(BlockTemplate.DefaultWitnessCommitment); - var outputCount = (uint)tx.Outputs.Count; - if (withDefaultWitnessCommitment) + var outputCount = (uint) tx.Outputs.Count; + if(withDefaultWitnessCommitment) outputCount++; - using (var stream = new MemoryStream()) + using(var stream = new MemoryStream()) { var bs = new BitcoinStream(stream, true); @@ -110,11 +110,11 @@ private byte[] SerializeOutputTransaction(Transaction tx) uint rawLength; // serialize witness (segwit) - if (withDefaultWitnessCommitment) + if(withDefaultWitnessCommitment) { amount = 0; raw = BlockTemplate.DefaultWitnessCommitment.HexToByteArray(); - rawLength = (uint)raw.Length; + rawLength = (uint) raw.Length; bs.ReadWrite(ref amount); bs.ReadWriteAsVarInt(ref rawLength); @@ -122,12 +122,12 @@ private byte[] SerializeOutputTransaction(Transaction tx) } // serialize outputs - foreach (var output in tx.Outputs) + foreach(var output in tx.Outputs) { amount = output.Value.Satoshi; var outScript = output.ScriptPubKey; raw = outScript.ToBytes(true); - rawLength = (uint)raw.Length; + rawLength = (uint) raw.Length; bs.ReadWrite(ref amount); bs.ReadWriteAsVarInt(ref rawLength); @@ -146,7 +146,7 @@ protected override byte[] SerializeHeader(uint nTime, string nonce) var blockHeader = new EquihashBlockHeader { - Version = (int)BlockTemplate.Version, + Version = (int) BlockTemplate.Version, Bits = new Target(Encoders.Hex.DecodeData(BlockTemplate.Bits)), HashPrevBlock = uint256.Parse(BlockTemplate.PreviousBlockhash), HashMerkleRoot = new uint256(merkleRoot), @@ -178,11 +178,11 @@ public override void Init(EquihashBlockTemplate blockTemplate, string jobId, chainConfig = coin.GetNetwork(network.NetworkType); BlockTemplate = blockTemplate; JobId = jobId; - Difficulty = (double)new BigRational(chainConfig.Diff1BValue, BlockTemplate.Target.HexToReverseByteArray().AsSpan().ToBigInteger()); + Difficulty = (double) new BigRational(chainConfig.Diff1BValue, BlockTemplate.Target.HexToReverseByteArray().AsSpan().ToBigInteger()); this.solver = solver; - if (!string.IsNullOrEmpty(BlockTemplate.Target)) + if(!string.IsNullOrEmpty(BlockTemplate.Target)) blockTargetValue = new uint256(BlockTemplate.Target); else { diff --git a/src/Miningcore/Blockchain/Equihash/Custom/Minexcoin/MinexcoinJob.cs b/src/Miningcore/Blockchain/Equihash/Custom/Minexcoin/MinexcoinJob.cs index e069e4bacc..c423d95590 100644 --- a/src/Miningcore/Blockchain/Equihash/Custom/Minexcoin/MinexcoinJob.cs +++ b/src/Miningcore/Blockchain/Equihash/Custom/Minexcoin/MinexcoinJob.cs @@ -52,7 +52,7 @@ protected override Transaction CreateOutputTransaction() private Money ComputeBankReward(uint blockHeight, Money totalReward) { - if (blockHeight <= 4500000) + if(blockHeight <= 4500000) { /** * 1- 900000 20% diff --git a/src/Miningcore/Blockchain/Equihash/EquihashJob.cs b/src/Miningcore/Blockchain/Equihash/EquihashJob.cs index e1019ed70b..a6c62a6ad3 100644 --- a/src/Miningcore/Blockchain/Equihash/EquihashJob.cs +++ b/src/Miningcore/Blockchain/Equihash/EquihashJob.cs @@ -94,19 +94,19 @@ protected virtual Transaction CreateOutputTransaction() // set versions tx.Version = txVersion; - if (isOverwinterActive) + if(isOverwinterActive) { overwinterField.SetValue(tx, true); versionGroupField.SetValue(tx, txVersionGroupId); } // calculate outputs - if (chainConfig.PayFoundersReward && + if(chainConfig.PayFoundersReward && (chainConfig.LastFoundersRewardBlockHeight >= BlockTemplate.Height || chainConfig.TreasuryRewardStartBlockHeight > 0)) { // founders or treasury reward? - if (chainConfig.TreasuryRewardStartBlockHeight > 0 && + if(chainConfig.TreasuryRewardStartBlockHeight > 0 && BlockTemplate.Height >= chainConfig.TreasuryRewardStartBlockHeight) { // pool reward (t-addr) @@ -145,7 +145,7 @@ protected virtual Transaction CreateOutputTransaction() private string GetTreasuryRewardAddress() { - var index = (int)Math.Floor((BlockTemplate.Height - chainConfig.TreasuryRewardStartBlockHeight) / + var index = (int) Math.Floor((BlockTemplate.Height - chainConfig.TreasuryRewardStartBlockHeight) / chainConfig.TreasuryRewardAddressChangeInterval % chainConfig.TreasuryRewardAddresses.Length); var address = chainConfig.TreasuryRewardAddresses[index]; @@ -176,7 +176,7 @@ protected virtual byte[] SerializeHeader(uint nTime, string nonce) { var blockHeader = new EquihashBlockHeader { - Version = (int)BlockTemplate.Version, + Version = (int) BlockTemplate.Version, Bits = new Target(Encoders.Hex.DecodeData(BlockTemplate.Bits)), HashPrevBlock = uint256.Parse(BlockTemplate.PreviousBlockhash), HashMerkleRoot = new uint256(merkleRoot), @@ -184,7 +184,7 @@ protected virtual byte[] SerializeHeader(uint nTime, string nonce) Nonce = nonce }; - if (isSaplingActive && !string.IsNullOrEmpty(BlockTemplate.FinalSaplingRootHash)) + if(isSaplingActive && !string.IsNullOrEmpty(BlockTemplate.FinalSaplingRootHash)) blockHeader.HashReserved = BlockTemplate.FinalSaplingRootHash.HexToReverseByteArray(); return blockHeader.ToBytes(); @@ -192,9 +192,9 @@ protected virtual byte[] SerializeHeader(uint nTime, string nonce) private byte[] BuildRawTransactionBuffer() { - using (var stream = new MemoryStream()) + using(var stream = new MemoryStream()) { - foreach (var tx in BlockTemplate.Transactions) + foreach(var tx in BlockTemplate.Transactions) { var txRaw = tx.Data.HexToByteArray(); stream.Write(txRaw); @@ -206,10 +206,10 @@ private byte[] BuildRawTransactionBuffer() private byte[] SerializeBlock(Span header, Span coinbase, Span solution) { - var transactionCount = (uint)BlockTemplate.Transactions.Length + 1; // +1 for prepended coinbase tx + var transactionCount = (uint) BlockTemplate.Transactions.Length + 1; // +1 for prepended coinbase tx var rawTransactionBuffer = BuildRawTransactionBuffer(); - using (var stream = new MemoryStream()) + using(var stream = new MemoryStream()) { var bs = new BitcoinStream(stream, true); @@ -233,7 +233,7 @@ private byte[] SerializeBlock(Span header, Span coinbase, Span var headerBytes = SerializeHeader(nTime, nonce); // verify solution - if (!solver.Verify(headerBytes, solutionBytes.Slice(chainConfig.SolutionPreambleSize))) + if(!solver.Verify(headerBytes, solutionBytes.Slice(chainConfig.SolutionPreambleSize))) throw new StratumException(StratumError.Other, "invalid solution"); // concat header and solution @@ -243,11 +243,11 @@ private byte[] SerializeBlock(Span header, Span coinbase, Span // hash block-header Span headerHash = stackalloc byte[32]; - headerHasher.Digest(headerSolutionBytes, headerHash, (ulong)nTime); + headerHasher.Digest(headerSolutionBytes, headerHash, (ulong) nTime); var headerValue = new uint256(headerHash); // calc share-diff - var shareDiff = (double)new BigRational(chainConfig.Diff1BValue, headerHash.ToBigInteger()); + var shareDiff = (double) new BigRational(chainConfig.Diff1BValue, headerHash.ToBigInteger()); var stratumDifficulty = context.Difficulty; var ratio = shareDiff / stratumDifficulty; @@ -255,14 +255,14 @@ private byte[] SerializeBlock(Span header, Span coinbase, Span var isBlockCandidate = headerValue <= blockTargetValue; // test if share meets at least workers current difficulty - if (!isBlockCandidate && ratio < 0.99) + if(!isBlockCandidate && ratio < 0.99) { // check if share matched the previous difficulty from before a vardiff retarget - if (context.VarDiff?.LastUpdate != null && context.PreviousDifficulty.HasValue) + if(context.VarDiff?.LastUpdate != null && context.PreviousDifficulty.HasValue) { ratio = shareDiff / context.PreviousDifficulty.Value; - if (ratio < 0.99) + if(ratio < 0.99) throw new StratumException(StratumError.LowDifficultyShare, $"low difficulty share ({shareDiff})"); // use previous difficulty @@ -280,7 +280,7 @@ private byte[] SerializeBlock(Span header, Span coinbase, Span Difficulty = stratumDifficulty, }; - if (isBlockCandidate) + if(isBlockCandidate) { var headerHashReversed = headerHash.ToNewReverseArray(); @@ -299,10 +299,10 @@ private byte[] SerializeBlock(Span header, Span coinbase, Span private bool RegisterSubmit(string nonce, string solution) { - lock (submissions) + lock(submissions) { var key = nonce.ToLower() + solution.ToLower(); - if (submissions.Contains(key)) + if(submissions.Contains(key)) return false; submissions.Add(key); @@ -348,13 +348,13 @@ public virtual void Init(EquihashBlockTemplate blockTemplate, string jobId, chainConfig.OverwinterActivationHeight.Value > 0 && blockTemplate.Height >= chainConfig.OverwinterActivationHeight.Value; - if (isSaplingActive) + if(isSaplingActive) { txVersion = chainConfig.SaplingTxVersion.Value; txVersionGroupId = chainConfig.SaplingTxVersionGroupId.Value; } - else if (isOverwinterActive) + else if(isOverwinterActive) { txVersion = chainConfig.OverwinterTxVersion.Value; txVersionGroupId = chainConfig.OverwinterTxVersionGroupId.Value; @@ -363,7 +363,7 @@ public virtual void Init(EquihashBlockTemplate blockTemplate, string jobId, // Misc this.solver = solver; - if (!string.IsNullOrEmpty(BlockTemplate.Target)) + if(!string.IsNullOrEmpty(BlockTemplate.Target)) blockTargetValue = new uint256(BlockTemplate.Target); else { @@ -376,16 +376,16 @@ public virtual void Init(EquihashBlockTemplate blockTemplate, string jobId, .ReverseInPlace() .ToHexString(); - if (blockTemplate.Subsidy != null) + if(blockTemplate.Subsidy != null) blockReward = blockTemplate.Subsidy.Miner * BitcoinConstants.SatoshisPerBitcoin; else blockReward = BlockTemplate.CoinbaseValue; - if (chainConfig?.PayFoundersReward == true) + if(chainConfig?.PayFoundersReward == true) { var founders = blockTemplate.Subsidy.Founders ?? blockTemplate.Subsidy.Community; - if (!founders.HasValue) + if(!founders.HasValue) throw new Exception("Error, founders reward missing for block template"); blockReward = (blockTemplate.Subsidy.Miner + founders.Value) * BitcoinConstants.SatoshisPerBitcoin; @@ -437,25 +437,25 @@ public virtual void Init(EquihashBlockTemplate blockTemplate, string jobId, var context = worker.ContextAs(); // validate nTime - if (nTime.Length != 8) + if(nTime.Length != 8) throw new StratumException(StratumError.Other, "incorrect size of ntime"); var nTimeInt = uint.Parse(nTime.HexToReverseByteArray().ToHexString(), NumberStyles.HexNumber); - if (nTimeInt < BlockTemplate.CurTime || nTimeInt > ((DateTimeOffset)clock.Now).ToUnixTimeSeconds() + 7200) + if(nTimeInt < BlockTemplate.CurTime || nTimeInt > ((DateTimeOffset) clock.Now).ToUnixTimeSeconds() + 7200) throw new StratumException(StratumError.Other, "ntime out of range"); var nonce = context.ExtraNonce1 + extraNonce2; // validate nonce - if (nonce.Length != 64) + if(nonce.Length != 64) throw new StratumException(StratumError.Other, "incorrect size of extraNonce2"); // validate solution - if (solution.Length != (chainConfig.SolutionSize + chainConfig.SolutionPreambleSize) * 2) + if(solution.Length != (chainConfig.SolutionSize + chainConfig.SolutionPreambleSize) * 2) throw new StratumException(StratumError.Other, "incorrect size of solution"); // dupe check - if (!RegisterSubmit(nonce, solution)) + if(!RegisterSubmit(nonce, solution)) throw new StratumException(StratumError.DuplicateShare, "duplicate share"); return ProcessShareInternal(worker, nonce, nTimeInt, solution); diff --git a/src/Miningcore/Blockchain/Equihash/EquihashJobManager.cs b/src/Miningcore/Blockchain/Equihash/EquihashJobManager.cs index eea887391c..66655e20b0 100644 --- a/src/Miningcore/Blockchain/Equihash/EquihashJobManager.cs +++ b/src/Miningcore/Blockchain/Equihash/EquihashJobManager.cs @@ -64,7 +64,7 @@ private async Task> GetBlockTemplateAsync( var result = await daemon.ExecuteCmdAnyAsync(logger, BitcoinCommands.GetBlockTemplate, getBlockTemplateParams); - if (subsidyResponse.Error == null && result.Error == null && result.Response != null) + if(subsidyResponse.Error == null && result.Error == null && result.Response != null) result.Response.Subsidy = subsidyResponse.Response; else if(subsidyResponse.Error?.Code != (int) BitcoinRPCErrorCode.RPC_METHOD_NOT_FOUND) result.Error = new JsonRpcException(-1, $"{BitcoinCommands.GetBlockSubsidy} failed", null); @@ -86,7 +86,7 @@ private DaemonResponse GetBlockTemplateFromJson(string js protected override IDestination AddressToDestination(string address, BitcoinAddressType? addressType) { - if (!coin.UsesZCashAddressFormat) + if(!coin.UsesZCashAddressFormat) return base.AddressToDestination(address, addressType); var decoded = Encoders.Base58.DecodeData(address); @@ -115,13 +115,13 @@ private EquihashJob CreateJob() try { - if (forceUpdate) + if(forceUpdate) lastJobRebroadcast = clock.Now; var response = string.IsNullOrEmpty(json) ? await GetBlockTemplateAsync() : GetBlockTemplateFromJson(json); // may happen if daemon is currently not connected to peers - if (response.Error != null) + if(response.Error != null) { logger.Warn(() => $"Unable to update job. Daemon responded with: {response.Error.Message} Code {response.Error.Code}"); return (false, forceUpdate); @@ -135,10 +135,10 @@ private EquihashJob CreateJob() job.BlockTemplate?.PreviousBlockhash != blockTemplate.PreviousBlockhash && blockTemplate.Height > job.BlockTemplate?.Height); - if (isNew) + if(isNew) messageBus.NotifyChainHeight(poolConfig.Id, blockTemplate.Height, poolConfig.Template); - if (isNew || forceUpdate) + if(isNew || forceUpdate) { job = CreateJob(); @@ -146,11 +146,11 @@ private EquihashJob CreateJob() poolConfig, clusterConfig, clock, poolAddressDestination, network, solver); - lock (jobLock) + lock(jobLock) { - if (isNew) + if(isNew) { - if (via != null) + if(via != null) logger.Info(() => $"Detected new block {blockTemplate.Height} via {via}"); else logger.Info(() => $"Detected new block {blockTemplate.Height}"); @@ -166,7 +166,7 @@ private EquihashJob CreateJob() validJobs.Insert(0, job); // trim active jobs - while (validJobs.Count > maxActiveJobs) + while(validJobs.Count > maxActiveJobs) validJobs.RemoveAt(validJobs.Count - 1); } @@ -176,7 +176,7 @@ private EquihashJob CreateJob() return (isNew, forceUpdate); } - catch (Exception ex) + catch(Exception ex) { logger.Error(ex, () => $"Error during {nameof(UpdateJob)}"); } @@ -204,7 +204,7 @@ public override async Task ValidateAddressAsync(string address, Cancellati Contract.Requires(!string.IsNullOrEmpty(address), $"{nameof(address)} must not be empty"); // handle t-addr - if (await base.ValidateAddressAsync(address, ct)) + if(await base.ValidateAddressAsync(address, ct)) return true; // handle z-addr @@ -240,7 +240,7 @@ public override async ValueTask SubmitShareAsync(StratumClient worker, ob logger.LogInvoke(new[] { worker.ConnectionId }); - if (!(submission is object[] submitParams)) + if(!(submission is object[] submitParams)) throw new StratumException(StratumError.Other, "invalid params"); var context = worker.ContextAs(); @@ -252,10 +252,10 @@ public override async ValueTask SubmitShareAsync(StratumClient worker, ob var extraNonce2 = submitParams[3] as string; var solution = submitParams[4] as string; - if (string.IsNullOrEmpty(workerValue)) + if(string.IsNullOrEmpty(workerValue)) throw new StratumException(StratumError.Other, "missing or invalid workername"); - if (string.IsNullOrEmpty(solution)) + if(string.IsNullOrEmpty(solution)) throw new StratumException(StratumError.Other, "missing or invalid solution"); EquihashJob job; @@ -265,7 +265,7 @@ public override async ValueTask SubmitShareAsync(StratumClient worker, ob job = validJobs.FirstOrDefault(x => x.JobId == jobId); } - if (job == null) + if(job == null) throw new StratumException(StratumError.JobNotFound, "job not found"); // extract worker/miner/payoutid @@ -277,7 +277,7 @@ public override async ValueTask SubmitShareAsync(StratumClient worker, ob var (share, blockHex) = job.ProcessShare(worker, extraNonce2, nTime, solution); // if block candidate, submit & check if accepted by network - if (share.IsBlockCandidate) + if(share.IsBlockCandidate) { logger.Info(() => $"Submitting block {share.BlockHeight} [{share.BlockHash}]"); @@ -286,7 +286,7 @@ public override async ValueTask SubmitShareAsync(StratumClient worker, ob // is it still a block candidate? share.IsBlockCandidate = acceptResponse.Accepted; - if (share.IsBlockCandidate) + if(share.IsBlockCandidate) { logger.Info(() => $"Daemon accepted block {share.BlockHeight} [{share.BlockHash}] submitted by {minerName}"); diff --git a/src/Miningcore/Blockchain/Equihash/EquihashPayoutHandler.cs b/src/Miningcore/Blockchain/Equihash/EquihashPayoutHandler.cs index 82c47217e2..2375e9f081 100644 --- a/src/Miningcore/Blockchain/Equihash/EquihashPayoutHandler.cs +++ b/src/Miningcore/Blockchain/Equihash/EquihashPayoutHandler.cs @@ -92,7 +92,7 @@ public override async Task PayoutAsync(Balance[] balances) Contract.RequiresNonNull(balances, nameof(balances)); // Shield first - if (supportsNativeShielding) + if(supportsNativeShielding) await ShieldCoinbaseAsync(); else await ShieldCoinbaseEmulatedAsync(); @@ -119,7 +119,7 @@ public override async Task PayoutAsync(Balance[] balances) .Select(x => new ZSendManyRecipient { Address = x.Address, Amount = Math.Round(x.Amount, 8) }) .ToList(); - if (amounts.Count == 0) + if(amounts.Count == 0) return; var pageAmount = amounts.Sum(x => x.Amount); @@ -131,7 +131,7 @@ public override async Task PayoutAsync(Balance[] balances) ZMinConfirmations, // only spend funds covered by this many confirmations }); - if (balanceResult.Error != null || (decimal) (double) balanceResult.Response - TransferFee < pageAmount) + if(balanceResult.Error != null || (decimal) (double) balanceResult.Response - TransferFee < pageAmount) { logger.Info(() => $"[{LogCategory}] Insufficient shielded balance for payment of {FormatAmount(pageAmount)}"); return; @@ -147,16 +147,16 @@ public override async Task PayoutAsync(Balance[] balances) TransferFee }; - // send command - tryTransfer: + // send command + tryTransfer: var result = await daemon.ExecuteCmdSingleAsync(logger, EquihashCommands.ZSendMany, args); - if (result.Error == null) + if(result.Error == null) { var operationId = result.Response; // check result - if (string.IsNullOrEmpty(operationId)) + if(string.IsNullOrEmpty(operationId)) logger.Error(() => $"[{LogCategory}] {EquihashCommands.ZSendMany} did not return a operation id!"); else { @@ -169,12 +169,12 @@ public override async Task PayoutAsync(Balance[] balances) var operationResultResponse = await daemon.ExecuteCmdSingleAsync(logger, EquihashCommands.ZGetOperationResult, new object[] { new object[] { operationId } }); - if (operationResultResponse.Error == null && + if(operationResultResponse.Error == null && operationResultResponse.Response?.Any(x => x.OperationId == operationId) == true) { var operationResult = operationResultResponse.Response.First(x => x.OperationId == operationId); - if (!Enum.TryParse(operationResult.Status, true, out ZOperationStatus status)) + if(!Enum.TryParse(operationResult.Status, true, out ZOperationStatus status)) { logger.Error(() => $"Unrecognized operation status: {operationResult.Status}"); break; @@ -210,9 +210,9 @@ public override async Task PayoutAsync(Balance[] balances) else { - if (result.Error.Code == (int) BitcoinRPCErrorCode.RPC_WALLET_UNLOCK_NEEDED && !didUnlockWallet) + if(result.Error.Code == (int) BitcoinRPCErrorCode.RPC_WALLET_UNLOCK_NEEDED && !didUnlockWallet) { - if (!string.IsNullOrEmpty(extraPoolPaymentProcessingConfig?.WalletPassword)) + if(!string.IsNullOrEmpty(extraPoolPaymentProcessingConfig?.WalletPassword)) { logger.Info(() => $"[{LogCategory}] Unlocking wallet"); @@ -222,7 +222,7 @@ public override async Task PayoutAsync(Balance[] balances) (object) 5 // unlock for N seconds }); - if (unlockResult.Error == null) + if(unlockResult.Error == null) { didUnlockWallet = true; goto tryTransfer; @@ -277,9 +277,9 @@ private async Task ShieldCoinbaseAsync() var result = await daemon.ExecuteCmdSingleAsync(logger, EquihashCommands.ZShieldCoinbase, args); - if (result.Error != null) + if(result.Error != null) { - if (result.Error.Code == -6) + if(result.Error.Code == -6) logger.Info(() => $"[{LogCategory}] No funds to shield"); else logger.Error(() => $"[{LogCategory}] {EquihashCommands.ZShieldCoinbase} returned error: {result.Error.Message} code {result.Error.Code}"); @@ -298,12 +298,12 @@ private async Task ShieldCoinbaseAsync() var operationResultResponse = await daemon.ExecuteCmdSingleAsync(logger, EquihashCommands.ZGetOperationResult, new object[] { new object[] { operationId } }); - if (operationResultResponse.Error == null && + if(operationResultResponse.Error == null && operationResultResponse.Response?.Any(x => x.OperationId == operationId) == true) { var operationResult = operationResultResponse.Response.First(x => x.OperationId == operationId); - if (!Enum.TryParse(operationResult.Status, true, out ZOperationStatus status)) + if(!Enum.TryParse(operationResult.Status, true, out ZOperationStatus status)) { logger.Error(() => $"Unrecognized operation status: {operationResult.Status}"); break; @@ -338,7 +338,7 @@ private async Task ShieldCoinbaseEmulatedAsync() // get t-addr unspent balance for just the coinbase address (pool wallet) var unspentResult = await daemon.ExecuteCmdSingleAsync(logger, BitcoinCommands.ListUnspent); - if (unspentResult.Error != null) + if(unspentResult.Error != null) { logger.Error(() => $"[{LogCategory}] {BitcoinCommands.ListUnspent} returned error: {unspentResult.Error.Message} code {unspentResult.Error.Code}"); return; @@ -349,7 +349,7 @@ private async Task ShieldCoinbaseEmulatedAsync() .Sum(x => x.Amount); // make sure there's enough balance to shield after reserves - if (balance - TransferFee <= TransferFee) + if(balance - TransferFee <= TransferFee) { logger.Info(() => $"[{LogCategory}] Balance {FormatAmount(balance)} too small for emulated shielding"); return; @@ -378,7 +378,7 @@ private async Task ShieldCoinbaseEmulatedAsync() // send command var sendResult = await daemon.ExecuteCmdSingleAsync(logger, EquihashCommands.ZSendMany, args); - if (sendResult.Error != null) + if(sendResult.Error != null) { logger.Error(() => $"[{LogCategory}] {EquihashCommands.ZSendMany} returned error: {unspentResult.Error.Message} code {unspentResult.Error.Code}"); return; @@ -395,12 +395,12 @@ private async Task ShieldCoinbaseEmulatedAsync() var operationResultResponse = await daemon.ExecuteCmdSingleAsync(logger, EquihashCommands.ZGetOperationResult, new object[] { new object[] { operationId } }); - if (operationResultResponse.Error == null && + if(operationResultResponse.Error == null && operationResultResponse.Response?.Any(x => x.OperationId == operationId) == true) { var operationResult = operationResultResponse.Response.First(x => x.OperationId == operationId); - if (!Enum.TryParse(operationResult.Status, true, out ZOperationStatus status)) + if(!Enum.TryParse(operationResult.Status, true, out ZOperationStatus status)) { logger.Error(() => $"Unrecognized operation status: {operationResult.Status}"); break; diff --git a/src/Miningcore/Blockchain/Equihash/EquihashPool.cs b/src/Miningcore/Blockchain/Equihash/EquihashPool.cs index 5e687e8ee0..f1b2ac69e8 100644 --- a/src/Miningcore/Blockchain/Equihash/EquihashPool.cs +++ b/src/Miningcore/Blockchain/Equihash/EquihashPool.cs @@ -70,8 +70,8 @@ public override void Configure(PoolConfig poolConfig, ClusterConfig clusterConfi extraConfig = poolConfig.Extra.SafeExtensionDataAs(); - if (poolConfig.Template.As().UsesZCashAddressFormat && - string.IsNullOrEmpty(extraConfig?.ZAddress)) + if(poolConfig.Template.As().UsesZCashAddressFormat && + string.IsNullOrEmpty(extraConfig?.ZAddress)) logger.ThrowLogPoolStartupException($"Pool z-address is not configured"); } @@ -86,7 +86,7 @@ protected override async Task SetupJobManager(CancellationToken ct) await manager.StartAsync(ct); - if (poolConfig.EnableInternalStratum == true) + if(poolConfig.EnableInternalStratum == true) { disposables.Add(manager.Jobs .Select(job => Observable.FromAsync(async () => @@ -96,7 +96,7 @@ protected override async Task SetupJobManager(CancellationToken ct) await OnNewJobAsync(job); } - catch (Exception ex) + catch(Exception ex) { logger.Debug(() => $"{nameof(OnNewJobAsync)}: {ex.Message}"); } @@ -132,7 +132,7 @@ protected async Task OnSubscribeAsync(StratumClient client, Timestamped(); - if (request.Id == null) + if(request.Id == null) throw new StratumException(StratumError.MinusOne, "missing request id"); var requestParams = request.ParamsAs(); @@ -155,7 +155,7 @@ protected async Task OnAuthorizeAsync(StratumClient client, Timestamped(); @@ -174,7 +174,7 @@ protected async Task OnAuthorizeAsync(StratumClient client, Timestamped= context.VarDiff.Config.MinDiff || context.VarDiff == null && staticDiff.Value > context.Difficulty)) { @@ -222,13 +222,13 @@ protected virtual async Task OnSubmitAsync(StratumClient client, Timestamped maxShareAge) + if(requestAge > maxShareAge) { logger.Warn(() => $"[{client.ConnectionId}] Dropping stale share submission request (server overloaded?)"); return; @@ -238,9 +238,9 @@ protected virtual async Task OnSubmitAsync(StratumClient client, Timestamped $"[{client.ConnectionId}] Share accepted: D={Math.Round(share.Difficulty, 3)}"); // update pool stats - if (share.IsBlockCandidate) + if(share.IsBlockCandidate) poolStats.LastPoolBlockTime = clock.Now; // update client stats @@ -268,7 +268,7 @@ protected virtual async Task OnSubmitAsync(StratumClient client, Timestamped(); - if (request.Id == null) + if(request.Id == null) throw new StratumException(StratumError.MinusOne, "missing request id"); var requestParams = request.ParamsAs(); var target = requestParams.FirstOrDefault(); - if (!string.IsNullOrEmpty(target)) + if(!string.IsNullOrEmpty(target)) { - if (System.Numerics.BigInteger.TryParse(target, NumberStyles.HexNumber, CultureInfo.InvariantCulture, out var targetBig)) + if(System.Numerics.BigInteger.TryParse(target, NumberStyles.HexNumber, CultureInfo.InvariantCulture, out var targetBig)) { var newDiff = (double) new BigRational(manager.ChainConfig.Diff1BValue, targetBig); var poolEndpoint = poolConfig.Ports[client.PoolEndpoint.Port]; - if (newDiff >= poolEndpoint.Difficulty) + if(newDiff >= poolEndpoint.Difficulty) { context.EnqueueNewDifficulty(newDiff); context.ApplyPendingDifficulty(); @@ -373,17 +373,17 @@ protected Task OnNewJobAsync(object jobParams) var tasks = ForEachClient(async client => { - if (!client.IsAlive) + if(!client.IsAlive) return; var context = client.ContextAs(); - if (context.IsSubscribed && context.IsAuthorized) + if(context.IsSubscribed && context.IsAuthorized) { // check alive var lastActivityAgo = clock.Now - context.LastActivity; - if (poolConfig.ClientConnectionTimeout > 0 && + if(poolConfig.ClientConnectionTimeout > 0 && lastActivityAgo.TotalSeconds > poolConfig.ClientConnectionTimeout) { logger.Info(() => $"[{client.ConnectionId}] Booting zombie-worker (idle-timeout exceeded)"); @@ -392,7 +392,7 @@ protected Task OnNewJobAsync(object jobParams) } // varDiff: if the client has a pending difficulty change, apply it now - if (context.ApplyPendingDifficulty()) + if(context.ApplyPendingDifficulty()) await client.NotifyAsync(EquihashStratumMethods.SetTarget, new object[] { EncodeTarget(context.Difficulty) }); // send job @@ -419,7 +419,7 @@ protected override async Task OnVarDiffUpdateAsync(StratumClient client, double context.EnqueueNewDifficulty(newDiff); // apply immediately and notify client - if (context.HasPendingDifficulty) + if(context.HasPendingDifficulty) { context.ApplyPendingDifficulty(); diff --git a/src/Miningcore/Blockchain/Equihash/EquihashUtils.cs b/src/Miningcore/Blockchain/Equihash/EquihashUtils.cs index d44e36f0be..93b0943cfa 100644 --- a/src/Miningcore/Blockchain/Equihash/EquihashUtils.cs +++ b/src/Miningcore/Blockchain/Equihash/EquihashUtils.cs @@ -11,14 +11,14 @@ public static class EquihashUtils public static string EncodeTarget(double difficulty, EquihashCoinTemplate.EquihashNetworkParams chainConfig) { string result; - var diff = BigInteger.ValueOf((long)(difficulty * 255d)); + var diff = BigInteger.ValueOf((long) (difficulty * 255d)); var quotient = chainConfig.Diff1Value.Divide(diff).Multiply(BigInteger.ValueOf(255)); var bytes = quotient.ToByteArray().AsSpan(); Span padded = stackalloc byte[EquihashConstants.TargetPaddingLength]; var padLength = EquihashConstants.TargetPaddingLength - bytes.Length; - if (padLength > 0) + if(padLength > 0) { bytes.CopyTo(padded.Slice(padLength, bytes.Length)); result = padded.ToHexString(0, EquihashConstants.TargetPaddingLength); diff --git a/src/Miningcore/Blockchain/Ethereum/EthereumJob.cs b/src/Miningcore/Blockchain/Ethereum/EthereumJob.cs index dbf20a6880..af24ff363d 100644 --- a/src/Miningcore/Blockchain/Ethereum/EthereumJob.cs +++ b/src/Miningcore/Blockchain/Ethereum/EthereumJob.cs @@ -21,7 +21,7 @@ public EthereumJob(string id, EthereumBlockTemplate blockTemplate, ILogger logge this.logger = logger; var target = blockTemplate.Target; - if (target.StartsWith("0x")) + if(target.StartsWith("0x")) target = target.Substring(2); blockTarget = new uint256(target.HexToReverseByteArray()); @@ -39,7 +39,7 @@ private void RegisterNonce(StratumClient worker, string nonce) { var nonceLower = nonce.ToLower(); - if (!workerNonces.TryGetValue(worker, out var nonces)) + if(!workerNonces.TryGetValue(worker, out var nonces)) { nonces = new HashSet(new[] { nonceLower }); workerNonces[worker] = nonces; @@ -47,7 +47,7 @@ private void RegisterNonce(StratumClient worker, string nonce) else { - if (nonces.Contains(nonceLower)) + if(nonces.Contains(nonceLower)) throw new StratumException(StratumError.MinusOne, "duplicate share"); nonces.Add(nonceLower); @@ -67,14 +67,14 @@ private void RegisterNonce(StratumClient worker, string nonce) var context = worker.ContextAs(); var fullNonceHex = context.ExtraNonce1 + nonce; - if (!ulong.TryParse(fullNonceHex, NumberStyles.HexNumber, CultureInfo.InvariantCulture, out var fullNonce)) + if(!ulong.TryParse(fullNonceHex, NumberStyles.HexNumber, CultureInfo.InvariantCulture, out var fullNonce)) throw new StratumException(StratumError.MinusOne, "bad nonce " + fullNonceHex); // get dag for block var dag = await ethash.GetDagAsync(BlockTemplate.Height, logger, ct); // compute - if (!dag.Compute(logger, BlockTemplate.Header.HexToByteArray(), fullNonce, out var mixDigest, out var resultBytes)) + if(!dag.Compute(logger, BlockTemplate.Header.HexToByteArray(), fullNonce, out var mixDigest, out var resultBytes)) throw new StratumException(StratumError.MinusOne, "bad hash"); // test if share meets at least workers current difficulty @@ -86,14 +86,14 @@ private void RegisterNonce(StratumClient worker, string nonce) var ratio = shareDiff / stratumDifficulty; var isBlockCandidate = resultValue <= blockTarget; - if (!isBlockCandidate && ratio < 0.99) + if(!isBlockCandidate && ratio < 0.99) { // check if share matched the previous difficulty from before a vardiff retarget - if (context.VarDiff?.LastUpdate != null && context.PreviousDifficulty.HasValue) + if(context.VarDiff?.LastUpdate != null && context.PreviousDifficulty.HasValue) { ratio = shareDiff / context.PreviousDifficulty.Value; - if (ratio < 0.99) + if(ratio < 0.99) throw new StratumException(StratumError.LowDifficultyShare, $"low difficulty share ({shareDiff})"); // use previous difficulty @@ -117,7 +117,7 @@ private void RegisterNonce(StratumClient worker, string nonce) BlockHash = mixDigest.ToHexString(true) }; - if (share.IsBlockCandidate) + if(share.IsBlockCandidate) { fullNonceHex = "0x" + fullNonceHex; var headerHash = BlockTemplate.Header; diff --git a/src/Miningcore/Blockchain/Ethereum/EthereumJobManager.cs b/src/Miningcore/Blockchain/Ethereum/EthereumJobManager.cs index 19dc5cc9ed..ba769cced7 100644 --- a/src/Miningcore/Blockchain/Ethereum/EthereumJobManager.cs +++ b/src/Miningcore/Blockchain/Ethereum/EthereumJobManager.cs @@ -112,7 +112,7 @@ protected bool UpdateJob(EthereumBlockTemplate blockTemplate) try { // may happen if daemon is currently not connected to peers - if (blockTemplate == null || blockTemplate.Header?.Length == 0) + if(blockTemplate == null || blockTemplate.Header?.Length == 0) return false; // logger.Info(() => $"Blocktemplate {blockTemplate.Height}-{blockTemplate.Header}"); @@ -122,7 +122,7 @@ protected bool UpdateJob(EthereumBlockTemplate blockTemplate) job.BlockTemplate.Height < blockTemplate.Height || job.BlockTemplate.Header != blockTemplate.Header; - if (isNew) + if(isNew) { messageBus.NotifyChainHeight(poolConfig.Id, blockTemplate.Height, poolConfig.Template); @@ -167,7 +167,7 @@ protected bool UpdateJob(EthereumBlockTemplate blockTemplate) private Task GetBlockTemplateAsync() { - if (isParity) + if(isParity) return GetBlockTemplateParityAsync(); return GetBlockTemplateGethAsync(); @@ -179,13 +179,13 @@ private async Task GetBlockTemplateParityAsync() var response = await daemon.ExecuteCmdAnyAsync(logger, EC.GetWork); - if (response.Error != null) + if(response.Error != null) { logger.Warn(() => $"Error(s) refreshing blocktemplate: {response.Error})"); return null; } - if (response.Response == null) + if(response.Response == null) { logger.Warn(() => $"Error(s) refreshing blocktemplate: {EC.GetWork} returned null response"); return null; @@ -210,9 +210,9 @@ private async Task GetBlockTemplateGethAsync() var results = await daemon.ExecuteBatchAnyAsync(logger, commands); - if (results.Any(x => x.Error != null)) + if(results.Any(x => x.Error != null)) { - logger.Warn(() => $"Error(s) refreshing blocktemplate: {results.First(x=> x.Error != null).Error.Message}"); + logger.Warn(() => $"Error(s) refreshing blocktemplate: {results.First(x => x.Error != null).Error.Message}"); return null; } @@ -221,7 +221,7 @@ private async Task GetBlockTemplateGethAsync() var block = results[1].Response.ToObject(); // append blockheight (parity returns this as 4th element in the getWork response, geth does not) - if (work.Length < 4) + if(work.Length < 4) { var currentHeight = block.Height.Value; work = work.Concat(new[] { (currentHeight + 1).ToStringHexWithPrefix() }).ToArray(); @@ -233,7 +233,7 @@ private async Task GetBlockTemplateGethAsync() private EthereumBlockTemplate AssembleBlockTemplate(string[] work) { - if (work.Length < 4) + if(work.Length < 4) { logger.Error(() => $"Error(s) refreshing blocktemplate: getWork did not return blockheight. Are you really connected to a Parity daemon?"); return null; @@ -261,24 +261,24 @@ private async Task ShowDaemonSyncProgressAsync() var responses = await daemon.ExecuteCmdAllAsync(logger, EC.GetSyncState); var firstValidResponse = responses.FirstOrDefault(x => x.Error == null && x.Response != null)?.Response; - if (firstValidResponse != null) + if(firstValidResponse != null) { // eth_syncing returns false if not synching - if (firstValidResponse is bool) + if(firstValidResponse is bool) return; var syncStates = responses.Where(x => x.Error == null && x.Response != null && firstValidResponse is JObject) .Select(x => ((JObject) x.Response).ToObject()) .ToArray(); - if (syncStates.Any()) + if(syncStates.Any()) { // get peer count var response = await daemon.ExecuteCmdAllAsync(logger, EC.GetPeerCount); var validResponses = response.Where(x => x.Error == null && x.Response != null).ToArray(); var peerCount = validResponses.Any() ? validResponses.Max(x => x.Response.IntegralFromHex()) : 0; - if (syncStates.Any(x => x.WarpChunksAmount != 0)) + if(syncStates.Any(x => x.WarpChunksAmount != 0)) { var warpChunkAmount = syncStates.Min(x => x.WarpChunksAmount); var warpChunkProcessed = syncStates.Max(x => x.WarpChunksProcessed); @@ -287,7 +287,7 @@ private async Task ShowDaemonSyncProgressAsync() logger.Info(() => $"Daemons have downloaded {percent:0.00}% of warp-chunks from {peerCount} peers"); } - else if (syncStates.Any(x => x.HighestBlock != 0)) + else if(syncStates.Any(x => x.HighestBlock != 0)) { var lowestHeight = syncStates.Min(x => x.CurrentBlock); var totalBlocks = syncStates.Max(x => x.HighestBlock); @@ -312,12 +312,12 @@ private async Task UpdateNetworkStatsAsync() var results = await daemon.ExecuteBatchAnyAsync(logger, commands); - if (results.Any(x => x.Error != null)) + if(results.Any(x => x.Error != null)) { var errors = results.Where(x => x.Error != null) .ToArray(); - if (errors.Any()) + if(errors.Any()) logger.Warn(() => $"Error(s) refreshing network stats: {string.Join(", ", errors.Select(y => y.Error.Message))})"); } @@ -344,7 +344,7 @@ private async Task SubmitBlockAsync(Share share, string fullNonceHex, stri mixHash }); - if (response.Error != null || (bool?) response.Response == false) + if(response.Error != null || (bool?) response.Response == false) { var error = response.Error?.Message ?? response?.Response?.ToString(); @@ -361,7 +361,7 @@ private object[] GetJobParamsForStratum(bool isNew) { var job = currentJob; - if (job != null) + if(job != null) { return new object[] { @@ -404,11 +404,11 @@ public override void Configure(PoolConfig poolConfig, ClusterConfig clusterConfi base.Configure(poolConfig, clusterConfig); - if (poolConfig.EnableInternalStratum == true) + if(poolConfig.EnableInternalStratum == true) { // ensure dag location is configured - var dagDir = !string.IsNullOrEmpty(extraPoolConfig?.DagDir) ? - Environment.ExpandEnvironmentVariables(extraPoolConfig.DagDir) : + var dagDir = !string.IsNullOrEmpty(extraPoolConfig?.DagDir) ? + Environment.ExpandEnvironmentVariables(extraPoolConfig.DagDir) : Dag.GetDefaultDagDirectory(); // create it if necessary @@ -423,7 +423,7 @@ public bool ValidateAddress(string address) { Contract.Requires(!string.IsNullOrEmpty(address), $"{nameof(address)} must not be empty"); - if (EthereumConstants.ZeroHashPattern.IsMatch(address) || + if(EthereumConstants.ZeroHashPattern.IsMatch(address) || !EthereumConstants.ValidAddressPattern.IsMatch(address)) return false; @@ -452,7 +452,7 @@ public async ValueTask SubmitShareAsync(StratumClient worker, string[] re // stale? lock(jobLock) { - if (!validJobs.TryGetValue(jobId, out job)) + if(!validJobs.TryGetValue(jobId, out job)) throw new StratumException(StratumError.MinusOne, "stale share"); } @@ -466,13 +466,13 @@ public async ValueTask SubmitShareAsync(StratumClient worker, string[] re share.Created = clock.Now; // if block candidate, submit & check if accepted by network - if (share.IsBlockCandidate) + if(share.IsBlockCandidate) { logger.Info(() => $"Submitting block {share.BlockHeight}"); share.IsBlockCandidate = await SubmitBlockAsync(share, fullNonceHex, headerHash, mixHash); - if (share.IsBlockCandidate) + if(share.IsBlockCandidate) { logger.Info(() => $"Daemon accepted block {share.BlockHeight} submitted by {context.Miner}"); } @@ -499,7 +499,7 @@ protected override async Task AreDaemonsHealthyAsync() { var responses = await daemon.ExecuteCmdAllAsync(logger, EC.GetBlockByNumber, new[] { (object) "latest", true }); - if (responses.Where(x => x.Error?.InnerException?.GetType() == typeof(DaemonClientException)) + if(responses.Where(x => x.Error?.InnerException?.GetType() == typeof(DaemonClientException)) .Select(x => (DaemonClientException) x.Error.InnerException) .Any(x => x.Code == HttpStatusCode.Unauthorized)) logger.ThrowLogPoolStartupException($"Daemon reports invalid credentials"); @@ -525,13 +525,13 @@ protected override async Task EnsureDaemonsSynchedAsync(CancellationToken ct) var isSynched = responses.All(x => x.Error == null && x.Response is bool && (bool) x.Response == false); - if (isSynched) + if(isSynched) { logger.Info(() => $"All daemons synched with blockchain"); break; } - if (!syncPendingNotificationShown) + if(!syncPendingNotificationShown) { logger.Info(() => $"Daemons still syncing with network. Manager will be started once synced"); syncPendingNotificationShown = true; @@ -556,15 +556,15 @@ protected override async Task PostStartInitAsync(CancellationToken ct) var results = await daemon.ExecuteBatchAnyAsync(logger, commands); - if (results.Any(x => x.Error != null)) + if(results.Any(x => x.Error != null)) { - if (results[3].Error != null) + if(results[3].Error != null) isParity = false; var errors = results.Take(3).Where(x => x.Error != null) .ToArray(); - if (errors.Any()) + if(errors.Any()) logger.ThrowLogPoolStartupException($"Init RPC failed: {string.Join(", ", errors.Select(y => y.Error.Message))}"); } @@ -582,7 +582,7 @@ protected override async Task PostStartInitAsync(CancellationToken ct) EthereumUtils.DetectNetworkAndChain(netVersion, parityChain, out networkType, out chainType); - if (clusterConfig.PaymentProcessing?.Enabled == true && poolConfig.PaymentProcessing?.Enabled == true) + if(clusterConfig.PaymentProcessing?.Enabled == true && poolConfig.PaymentProcessing?.Enabled == true) ConfigureRewards(); // update stats @@ -593,14 +593,14 @@ protected override async Task PostStartInitAsync(CancellationToken ct) // Periodically update network stats Observable.Interval(TimeSpan.FromMinutes(10)) - .Select(via => Observable.FromAsync(async ()=> + .Select(via => Observable.FromAsync(async () => { try { await UpdateNetworkStatsAsync(); } - catch (Exception ex) + catch(Exception ex) { logger.Error(ex); } @@ -608,14 +608,14 @@ protected override async Task PostStartInitAsync(CancellationToken ct) .Concat() .Subscribe(); - if (poolConfig.EnableInternalStratum == true) + if(poolConfig.EnableInternalStratum == true) { // make sure we have a current DAG while(true) { var blockTemplate = await GetBlockTemplateAsync(); - if (blockTemplate != null) + if(blockTemplate != null) { logger.Info(() => $"Loading current DAG ..."); @@ -636,7 +636,7 @@ protected override async Task PostStartInitAsync(CancellationToken ct) private void ConfigureRewards() { // Donation to MiningCore development - if (networkType == EthereumNetworkType.Main && + if(networkType == EthereumNetworkType.Main && chainType == ParityChainType.Mainnet && DevDonation.Addresses.TryGetValue(poolConfig.Template.As().Symbol, out var address)) { @@ -654,18 +654,18 @@ private void ConfigureRewards() protected virtual async Task SetupJobUpdatesAsync() { - if (extraPoolConfig?.BtStream == null) + if(extraPoolConfig?.BtStream == null) { var enableStreaming = extraPoolConfig?.EnableDaemonWebsocketStreaming == true; - if (enableStreaming && !poolConfig.Daemons.Any(x => - x.Extra.SafeExtensionDataAs()?.PortWs.HasValue == true)) + if(enableStreaming && !poolConfig.Daemons.Any(x => + x.Extra.SafeExtensionDataAs()?.PortWs.HasValue == true)) { logger.Warn(() => $"'{nameof(EthereumPoolConfigExtra.EnableDaemonWebsocketStreaming).ToLowerCamelCase()}' enabled but not a single daemon found with a configured websocket port ('{nameof(EthereumDaemonEndpointConfigExtra.PortWs).ToLowerCamelCase()}'). Falling back to polling."); enableStreaming = false; } - if (enableStreaming) + if(enableStreaming) { // collect ports var wsDaemons = poolConfig.Daemons @@ -679,10 +679,10 @@ protected virtual async Task SetupJobUpdatesAsync() logger.Info(() => $"Subscribing to WebSocket(s) {string.Join(", ", wsDaemons.Keys.Select(x => $"{(wsDaemons[x].SslWs ? "wss" : "ws")}://{x.Host}:{wsDaemons[x].Value}").Distinct())}"); - if (isParity) + if(isParity) { // stream work updates - var getWorkObs = daemon.WebsocketSubscribe(logger, wsDaemons, EC.ParitySubscribe, new[] { (object)EC.GetWork }) + var getWorkObs = daemon.WebsocketSubscribe(logger, wsDaemons, EC.ParitySubscribe, new[] { (object) EC.GetWork }) .Select(data => { try @@ -691,7 +691,7 @@ protected virtual async Task SetupJobUpdatesAsync() return psp?.Result; } - catch (Exception ex) + catch(Exception ex) { logger.Info(() => $"Error deserializing pending block: {ex.Message}"); } @@ -704,7 +704,7 @@ protected virtual async Task SetupJobUpdatesAsync() .Select(UpdateJob) .Do(isNew => { - if (isNew) + if(isNew) logger.Info(() => $"New work at height {currentJob.BlockTemplate.Height} and header {currentJob.BlockTemplate.Header} detected via WebSocket"); }) .Where(isNew => isNew) @@ -717,10 +717,10 @@ protected virtual async Task SetupJobUpdatesAsync() { var wsSubscription = "newHeads"; var isRetry = false; - retry: + retry: // stream work updates - var getWorkObs = daemon.WebsocketSubscribe(logger, wsDaemons, EC.Subscribe, new[] { (object)wsSubscription, new object() }); + var getWorkObs = daemon.WebsocketSubscribe(logger, wsDaemons, EC.Subscribe, new[] { (object) wsSubscription, new object() }); // test subscription var subcriptionResponse = await getWorkObs @@ -728,10 +728,10 @@ protected virtual async Task SetupJobUpdatesAsync() .Select(x => JsonConvert.DeserializeObject>(Encoding.UTF8.GetString(x))) .ToTask(); - if (subcriptionResponse.Error != null) + if(subcriptionResponse.Error != null) { // older versions of geth only support subscriptions to "newBlocks" - if (!isRetry && subcriptionResponse.Error.Code == (int)BitcoinRPCErrorCode.RPC_METHOD_NOT_FOUND) + if(!isRetry && subcriptionResponse.Error.Code == (int) BitcoinRPCErrorCode.RPC_METHOD_NOT_FOUND) { wsSubscription = "newBlocks"; @@ -747,7 +747,7 @@ protected virtual async Task SetupJobUpdatesAsync() .Concat() .Do(isNew => { - if (isNew) + if(isNew) logger.Info(() => $"New work at height {currentJob.BlockTemplate.Height} and header {currentJob.BlockTemplate.Header} detected via WebSocket"); }) .Where(isNew => isNew) @@ -766,7 +766,7 @@ protected virtual async Task SetupJobUpdatesAsync() .Concat() .Do(isNew => { - if (isNew) + if(isNew) logger.Info(() => $"New work at height {currentJob.BlockTemplate.Height} and header {currentJob.BlockTemplate.Header} detected via RPC-Polling"); }) .Where(isNew => isNew) @@ -786,7 +786,7 @@ protected virtual async Task SetupJobUpdatesAsync() .Select(UpdateJob) .Do(isNew => { - if (isNew) + if(isNew) logger.Info(() => $"New work at height {currentJob.BlockTemplate.Height} and header {currentJob.BlockTemplate.Header} detected via BT-Stream"); }) .Where(isNew => isNew) diff --git a/src/Miningcore/Blockchain/Ethereum/EthereumPayoutHandler.cs b/src/Miningcore/Blockchain/Ethereum/EthereumPayoutHandler.cs index 7d3da12464..660ba0954e 100644 --- a/src/Miningcore/Blockchain/Ethereum/EthereumPayoutHandler.cs +++ b/src/Miningcore/Blockchain/Ethereum/EthereumPayoutHandler.cs @@ -149,7 +149,7 @@ public async Task ClassifyBlocksAsync(Block[] blocks) messageBus.NotifyBlockConfirmationProgress(poolConfig.Id, block, coin); // is it block mined by us? - if (blockInfo.Miner == poolConfig.Address) + if(blockInfo.Miner == poolConfig.Address) { // additional check // NOTE: removal of first character of both sealfields caused by @@ -160,7 +160,7 @@ public async Task ClassifyBlocksAsync(Block[] blocks) blockInfo.SealFields[1].Substring(2) == nonce; // mature? - if (match && (latestBlockHeight - block.BlockHeight >= EthereumConstants.MinConfimations)) + if(match && (latestBlockHeight - block.BlockHeight >= EthereumConstants.MinConfimations)) { block.Status = BlockStatus.Confirmed; block.ConfirmationProgress = 1; @@ -168,10 +168,10 @@ public async Task ClassifyBlocksAsync(Block[] blocks) block.Reward = GetBaseBlockReward(chainType, block.BlockHeight); // base reward block.Type = "block"; - if (extraConfig?.KeepUncles == false) + if(extraConfig?.KeepUncles == false) block.Reward += blockInfo.Uncles.Length * (block.Reward / 32); // uncle rewards - if (extraConfig?.KeepTransactionFees == false && blockInfo.Transactions?.Length > 0) + if(extraConfig?.KeepTransactionFees == false && blockInfo.Transactions?.Length > 0) block.Reward += await GetTxRewardAsync(blockInfo); // tx fees logger.Info(() => $"[{LogCategory}] Unlocked block {block.BlockHeight} worth {FormatAmount(block.Reward)}"); @@ -196,7 +196,7 @@ public async Task ClassifyBlocksAsync(Block[] blocks) foreach(var blockInfo2 in blockInfo2s) { // don't give up yet, there might be an uncle - if (blockInfo2.Uncles.Length > 0) + if(blockInfo2.Uncles.Length > 0) { // fetch all uncles in a single RPC batch request var uncleBatch = blockInfo2.Uncles.Select((x, index) => new DaemonCmd(EC.GetUncleByBlockNumberAndIndex, @@ -213,10 +213,10 @@ public async Task ClassifyBlocksAsync(Block[] blocks) .Select(x => x.Response.ToObject()) .FirstOrDefault(x => x.Miner == poolConfig.Address); - if (uncle != null) + if(uncle != null) { // mature? - if (latestBlockHeight - uncle.Height.Value >= EthereumConstants.MinConfimations) + if(latestBlockHeight - uncle.Height.Value >= EthereumConstants.MinConfimations) { block.Status = BlockStatus.Confirmed; block.ConfirmationProgress = 1; @@ -237,7 +237,7 @@ public async Task ClassifyBlocksAsync(Block[] blocks) } } - if (block.Status == BlockStatus.Pending && block.ConfirmationProgress > 0.75) + if(block.Status == BlockStatus.Pending && block.ConfirmationProgress > 0.75) { // we've lost this one block.Status = BlockStatus.Orphaned; @@ -273,7 +273,7 @@ public async Task PayoutAsync(Balance[] balances) // ensure we have peers var infoResponse = await daemon.ExecuteCmdSingleAsync(logger, EC.GetPeerCount); - if (networkType == EthereumNetworkType.Main && + if(networkType == EthereumNetworkType.Main && (infoResponse.Error != null || string.IsNullOrEmpty(infoResponse.Response) || infoResponse.Response.IntegralFromHex() < EthereumConstants.MinPayoutPeerCount)) { @@ -299,7 +299,7 @@ public async Task PayoutAsync(Balance[] balances) } } - if (txHashes.Any()) + if(txHashes.Any()) NotifyPayoutSuccess(poolConfig.Id, balances, txHashes.ToArray(), null); } @@ -309,7 +309,7 @@ public async Task PayoutAsync(Balance[] balances) { var cacheMisses = blockHeights.Where(x => !blockCache.ContainsKey(x)).ToArray(); - if (cacheMisses.Any()) + if(cacheMisses.Any()) { var blockBatch = cacheMisses.Select(height => new DaemonCmd(EC.GetBlockByNumber, new[] @@ -338,16 +338,16 @@ internal static decimal GetBaseBlockReward(ParityChainType chainType, ulong heig switch(chainType) { case ParityChainType.Mainnet: - if (height >= EthereumConstants.ByzantiumHardForkHeight) + if(height >= EthereumConstants.ByzantiumHardForkHeight) return EthereumConstants.ByzantiumBlockReward; return EthereumConstants.HomesteadBlockReward; case ParityChainType.Classic: - { - var era = Math.Floor(((double) height + 1) / EthereumClassicConstants.BlockPerEra); - return (decimal) Math.Pow((double) EthereumClassicConstants.BasePercent, era) * EthereumClassicConstants.BaseRewardInitial; - } + { + var era = Math.Floor(((double) height + 1) / EthereumClassicConstants.BlockPerEra); + return (decimal) Math.Pow((double) EthereumClassicConstants.BasePercent, era) * EthereumClassicConstants.BaseRewardInitial; + } case ParityChainType.Expanse: return EthereumConstants.ExpanseBlockReward; @@ -375,7 +375,7 @@ private async Task GetTxRewardAsync(DaemonResponses.Block blockInfo) var results = await daemon.ExecuteBatchAnyAsync(logger, batch); - if (results.Any(x => x.Error != null)) + if(results.Any(x => x.Error != null)) throw new Exception($"Error fetching tx receipts: {string.Join(", ", results.Where(x => x.Error != null).Select(y => y.Error.Message))}"); // create lookup table @@ -418,15 +418,15 @@ private async Task DetectChainAsync() var results = await daemon.ExecuteBatchAnyAsync(logger, commands); - if (results.Any(x => x.Error != null)) + if(results.Any(x => x.Error != null)) { - if (results[1].Error != null) + if(results[1].Error != null) isParity = false; var errors = results.Take(1).Where(x => x.Error != null) .ToArray(); - if (errors.Any()) + if(errors.Any()) throw new Exception($"Chain detection failed: {string.Join(", ", errors.Select(y => y.Error.Message))}"); } @@ -442,7 +442,7 @@ private async Task DetectChainAsync() private async Task PayoutAsync(Balance balance) { // unlock account - if (extraConfig.CoinbasePassword != null) + if(extraConfig.CoinbasePassword != null) { var unlockResponse = await daemon.ExecuteCmdSingleAsync(logger, EC.UnlockAccount, new[] { @@ -451,7 +451,7 @@ private async Task PayoutAsync(Balance balance) null }); - if (unlockResponse.Error != null || unlockResponse.Response == null || (bool) unlockResponse.Response == false) + if(unlockResponse.Error != null || unlockResponse.Response == null || (bool) unlockResponse.Response == false) throw new Exception("Unable to unlock coinbase account for sending transaction"); } @@ -467,10 +467,10 @@ private async Task PayoutAsync(Balance balance) var response = await daemon.ExecuteCmdSingleAsync(logger, EC.SendTx, new[] { request }); - if (response.Error != null) + if(response.Error != null) throw new Exception($"{EC.SendTx} returned error: {response.Error.Message} code {response.Error.Code}"); - if (string.IsNullOrEmpty(response.Response) || EthereumConstants.ZeroHashPattern.IsMatch(response.Response)) + if(string.IsNullOrEmpty(response.Response) || EthereumConstants.ZeroHashPattern.IsMatch(response.Response)) throw new Exception($"{EC.SendTx} did not return a valid transaction hash"); var txHash = response.Response; diff --git a/src/Miningcore/Blockchain/Ethereum/EthereumPool.cs b/src/Miningcore/Blockchain/Ethereum/EthereumPool.cs index 5ef684e1c2..707e8eb185 100644 --- a/src/Miningcore/Blockchain/Ethereum/EthereumPool.cs +++ b/src/Miningcore/Blockchain/Ethereum/EthereumPool.cs @@ -65,12 +65,12 @@ private async Task OnSubscribeAsync(StratumClient client, Timestamped(); - if (request.Id == null) + if(request.Id == null) throw new StratumException(StratumError.Other, "missing request id"); var requestParams = request.ParamsAs(); - if (requestParams == null || requestParams.Length < 2 || requestParams.Any(string.IsNullOrEmpty)) + if(requestParams == null || requestParams.Length < 2 || requestParams.Any(string.IsNullOrEmpty)) throw new StratumException(StratumError.MinusOne, "invalid request"); manager.PrepareWorker(client); @@ -99,7 +99,7 @@ private async Task OnAuthorizeAsync(StratumClient client, Timestamped(); - if (request.Id == null) + if(request.Id == null) throw new StratumException(StratumError.MinusOne, "missing request id"); var requestParams = request.ParamsAs(); @@ -122,7 +122,7 @@ private async Task OnAuthorizeAsync(StratumClient client, Timestamped= context.VarDiff.Config.MinDiff || context.VarDiff == null && staticDiff.Value > context.Difficulty)) { @@ -145,28 +145,28 @@ private async Task OnSubmitAsync(StratumClient client, Timestamped maxShareAge) + if(requestAge > maxShareAge) { logger.Warn(() => $"[{client.ConnectionId}] Dropping stale share submission request (server overloaded?)"); return; } // validate worker - if (!context.IsAuthorized) + if(!context.IsAuthorized) throw new StratumException(StratumError.UnauthorizedWorker, "unauthorized worker"); - else if (!context.IsSubscribed) + else if(!context.IsSubscribed) throw new StratumException(StratumError.NotSubscribed, "not subscribed"); // check request var submitRequest = request.ParamsAs(); - if (submitRequest.Length != 3 || + if(submitRequest.Length != 3 || submitRequest.Any(string.IsNullOrEmpty)) throw new StratumException(StratumError.MinusOne, "malformed PoW result"); @@ -189,7 +189,7 @@ private async Task OnSubmitAsync(StratumClient client, Timestamped(); var sendInitialWork = false; - lock (context) + lock(context) { - if (context.IsSubscribed && context.IsAuthorized && !context.IsInitialWorkSent) + if(context.IsSubscribed && context.IsAuthorized && !context.IsInitialWorkSent) { context.IsInitialWorkSent = true; sendInitialWork = true; } } - if (sendInitialWork) + if(sendInitialWork) { // send intial update await client.NotifyAsync(EthereumStratumMethods.SetDifficulty, new object[] { context.Difficulty }); @@ -243,17 +243,17 @@ protected virtual Task OnNewJobAsync(object jobParams) var tasks = ForEachClient(async client => { - if (!client.IsAlive) + if(!client.IsAlive) return; var context = client.ContextAs(); - if (context.IsSubscribed && context.IsAuthorized && context.IsInitialWorkSent) + if(context.IsSubscribed && context.IsAuthorized && context.IsInitialWorkSent) { // check alive var lastActivityAgo = clock.Now - context.LastActivity; - if (poolConfig.ClientConnectionTimeout > 0 && + if(poolConfig.ClientConnectionTimeout > 0 && lastActivityAgo.TotalSeconds > poolConfig.ClientConnectionTimeout) { logger.Info(() => $"[{client.ConnectionId}] Booting zombie-worker (idle-timeout exceeded)"); @@ -262,7 +262,7 @@ protected virtual Task OnNewJobAsync(object jobParams) } // varDiff: if the client has a pending difficulty change, apply it now - if (context.ApplyPendingDifficulty()) + if(context.ApplyPendingDifficulty()) await client.NotifyAsync(EthereumStratumMethods.SetDifficulty, new object[] { context.Difficulty }); // send job @@ -282,7 +282,7 @@ protected override async Task SetupJobManager(CancellationToken ct) await manager.StartAsync(ct); - if (poolConfig.EnableInternalStratum == true) + if(poolConfig.EnableInternalStratum == true) { disposables.Add(manager.Jobs .Select(job => Observable.FromAsync(async () => @@ -292,7 +292,7 @@ protected override async Task SetupJobManager(CancellationToken ct) await OnNewJobAsync(job); } - catch (Exception ex) + catch(Exception ex) { logger.Debug(() => $"{nameof(OnNewJobAsync)}: {ex.Message}"); } @@ -378,7 +378,7 @@ protected override async Task OnVarDiffUpdateAsync(StratumClient client, double // apply immediately and notify client var context = client.ContextAs(); - if (context.HasPendingDifficulty) + if(context.HasPendingDifficulty) { context.ApplyPendingDifficulty(); @@ -394,7 +394,7 @@ public override void Configure(PoolConfig poolConfig, ClusterConfig clusterConfi // validate mandatory extra config var extraConfig = poolConfig.PaymentProcessing?.Extra?.SafeExtensionDataAs(); - if (clusterConfig.PaymentProcessing?.Enabled == true && extraConfig?.CoinbasePassword == null) + if(clusterConfig.PaymentProcessing?.Enabled == true && extraConfig?.CoinbasePassword == null) logger.ThrowLogPoolStartupException("\"paymentProcessing.coinbasePassword\" pool-configuration property missing or empty (required for unlocking wallet during payment processing)"); } diff --git a/src/Miningcore/Blockchain/Ethereum/EthereumUtils.cs b/src/Miningcore/Blockchain/Ethereum/EthereumUtils.cs index c06ca00ee6..b97af4bc7b 100644 --- a/src/Miningcore/Blockchain/Ethereum/EthereumUtils.cs +++ b/src/Miningcore/Blockchain/Ethereum/EthereumUtils.cs @@ -8,11 +8,11 @@ public static void DetectNetworkAndChain(string netVersionResponse, string parit out EthereumNetworkType networkType, out ParityChainType chainType) { // convert network - if (int.TryParse(netVersionResponse, out var netWorkTypeInt)) + if(int.TryParse(netVersionResponse, out var netWorkTypeInt)) { networkType = (EthereumNetworkType) netWorkTypeInt; - if (!Enum.IsDefined(typeof(EthereumNetworkType), networkType)) + if(!Enum.IsDefined(typeof(EthereumNetworkType), networkType)) networkType = EthereumNetworkType.Unknown; } @@ -20,15 +20,15 @@ public static void DetectNetworkAndChain(string netVersionResponse, string parit networkType = EthereumNetworkType.Unknown; // convert chain - if (!Enum.TryParse(parityChainResponse, true, out chainType)) + if(!Enum.TryParse(parityChainResponse, true, out chainType)) { - if (parityChainResponse.ToLower() == "ethereum classic") + if(parityChainResponse.ToLower() == "ethereum classic") chainType = ParityChainType.Classic; else chainType = ParityChainType.Unknown; } - if (chainType == ParityChainType.Foundation) + if(chainType == ParityChainType.Foundation) chainType = ParityChainType.Mainnet; } } diff --git a/src/Miningcore/Blockchain/ExtraNonceProviderBase.cs b/src/Miningcore/Blockchain/ExtraNonceProviderBase.cs index 9cfcc36bf6..44694686b1 100644 --- a/src/Miningcore/Blockchain/ExtraNonceProviderBase.cs +++ b/src/Miningcore/Blockchain/ExtraNonceProviderBase.cs @@ -57,7 +57,7 @@ public string Next() lock(counterLock) { counter++; - if (counter > nonceMax) + if(counter > nonceMax) counter = 0; // encode to hex diff --git a/src/Miningcore/Blockchain/JobManagerBase.cs b/src/Miningcore/Blockchain/JobManagerBase.cs index 3a93a52af1..fa3ce28857 100644 --- a/src/Miningcore/Blockchain/JobManagerBase.cs +++ b/src/Miningcore/Blockchain/JobManagerBase.cs @@ -89,7 +89,7 @@ protected string NextJobId(string format = null) Interlocked.Increment(ref jobId); var value = Interlocked.CompareExchange(ref jobId, 0, Int32.MinValue); - if (format != null) + if(format != null) return value.ToString(format); return value.ToStringHex8(); diff --git a/src/Miningcore/Configuration/ClusterConfigExtensions.cs b/src/Miningcore/Configuration/ClusterConfigExtensions.cs index 9f7e3bd7d4..d1f419d393 100644 --- a/src/Miningcore/Configuration/ClusterConfigExtensions.cs +++ b/src/Miningcore/Configuration/ClusterConfigExtensions.cs @@ -32,7 +32,7 @@ public BitcoinTemplate() { coinbaseHasherValue = new Lazy(() => { - if (CoinbaseHasher == null) + if(CoinbaseHasher == null) return null; return HashAlgorithmFactory.GetHash(ComponentContext, CoinbaseHasher); @@ -40,7 +40,7 @@ public BitcoinTemplate() headerHasherValue = new Lazy(() => { - if (HeaderHasher == null) + if(HeaderHasher == null) return null; return HashAlgorithmFactory.GetHash(ComponentContext, HeaderHasher); @@ -48,7 +48,7 @@ public BitcoinTemplate() blockHasherValue = new Lazy(() => { - if (BlockHasher == null) + if(BlockHasher == null) return null; return HashAlgorithmFactory.GetHash(ComponentContext, BlockHasher); @@ -56,7 +56,7 @@ public BitcoinTemplate() posBlockHasherValue = new Lazy(() => { - if (PoSBlockHasher == null) + if(PoSBlockHasher == null) return null; return HashAlgorithmFactory.GetHash(ComponentContext, PoSBlockHasher); @@ -81,8 +81,8 @@ public override string GetAlgorithmName() { var hash = HeaderHasherValue; - if (hash.GetType() == typeof(DigestReverser)) - return ((DigestReverser)hash).Upstream.GetType().Name; + if(hash.GetType() == typeof(DigestReverser)) + return ((DigestReverser) hash).Upstream.GetType().Name; return hash.GetType().Name; } @@ -106,7 +106,7 @@ public EquihashNetworkParams() diff1BValue = new Lazy(() => { - if (string.IsNullOrEmpty(Diff1)) + if(string.IsNullOrEmpty(Diff1)) throw new InvalidOperationException("Diff1 has not yet been initialized"); return BigInteger.Parse(Diff1, NumberStyles.HexNumber); @@ -161,7 +161,7 @@ public partial class CryptonoteCoinTemplate public override string GetAlgorithmName() { - switch (Hash) + switch(Hash) { case CryptonightHashType.Normal: return "Cryptonight"; diff --git a/src/Miningcore/Configuration/ClusterConfigValidation.cs b/src/Miningcore/Configuration/ClusterConfigValidation.cs index dce4799791..df22d15487 100644 --- a/src/Miningcore/Configuration/ClusterConfigValidation.cs +++ b/src/Miningcore/Configuration/ClusterConfigValidation.cs @@ -183,7 +183,7 @@ public PoolConfigValidator() RuleFor(j => j.Ports) .Must((pc, ports, ctx) => { - if (ports?.Keys.Any(port => port < 0) == true) + if(ports?.Keys.Any(port => port < 0) == true) { ctx.MessageFormatter.AppendArgument("port", ports.Keys.First(port => port < 0)); return false; @@ -234,7 +234,7 @@ public ClusterConfigValidator() .GroupBy(x => x.Id) .ToArray(); - if (ids.Any(id => id.Count() > 1)) + if(ids.Any(id => id.Count() > 1)) { ctx.MessageFormatter.AppendArgument("poolId", ids.First(id => id.Count() > 1).Key); return false; @@ -254,7 +254,7 @@ public ClusterConfigValidator() foreach(var port in ports) { - if (port.Count() > 1) + if(port.Count() > 1) { ctx.MessageFormatter.AppendArgument("port", port.Key); return false; @@ -340,7 +340,7 @@ public void Validate() var validator = new ClusterConfigValidator(); var result = validator.Validate(this); - if (!result.IsValid) + if(!result.IsValid) throw new ValidationException(result.Errors); } } diff --git a/src/Miningcore/Configuration/CoinTemplateLoader.cs b/src/Miningcore/Configuration/CoinTemplateLoader.cs index 277849c1cd..4d8a9a62eb 100644 --- a/src/Miningcore/Configuration/CoinTemplateLoader.cs +++ b/src/Miningcore/Configuration/CoinTemplateLoader.cs @@ -16,26 +16,26 @@ public static class CoinTemplateLoader private static IEnumerable> LoadTemplates(string filename, JsonSerializer serializer, IComponentContext ctx) { - using (var jreader = new JsonTextReader(File.OpenText(filename))) + using(var jreader = new JsonTextReader(File.OpenText(filename))) { var jo = serializer.Deserialize(jreader); - foreach (var o in jo) + foreach(var o in jo) { - if (o.Value.Type != JTokenType.Object) + if(o.Value.Type != JTokenType.Object) logger.ThrowLogPoolStartupException("Invalid coin-template file: dictionary of coin-templates expected"); var value = o.Value[nameof(CoinTemplate.Family).ToLower()]; - if (value == null) + if(value == null) logger.ThrowLogPoolStartupException("Invalid coin-template: missing 'family' property"); var family = value.ToObject(); - var result = (CoinTemplate)o.Value.ToObject(CoinTemplate.Families[family]); + var result = (CoinTemplate) o.Value.ToObject(CoinTemplate.Families[family]); ctx.InjectProperties(result); // Patch explorer links - if ((result.ExplorerBlockLinks == null || result.ExplorerBlockLinks.Count == 0) && + if((result.ExplorerBlockLinks == null || result.ExplorerBlockLinks.Count == 0) && !string.IsNullOrEmpty(result.ExplorerBlockLink)) { result.ExplorerBlockLinks = new Dictionary @@ -63,16 +63,16 @@ public static Dictionary Load(IComponentContext ctx, strin var result = new Dictionary(); - foreach (var filename in coinDefs) + foreach(var filename in coinDefs) { var definitions = LoadTemplates(filename, serializer, ctx).ToArray(); - foreach (var definition in definitions) + foreach(var definition in definitions) { var coinId = definition.Key; // log redefinitions - if (result.ContainsKey(coinId)) + if(result.ContainsKey(coinId)) logger.Warn($"Redefinition of coin '{coinId}' in file {filename}. First seen in {result[coinId].Source}"); result[coinId] = definition.Value; diff --git a/src/Miningcore/Contracts/Contract.cs b/src/Miningcore/Contracts/Contract.cs index 4de061f491..e2797c73ea 100644 --- a/src/Miningcore/Contracts/Contract.cs +++ b/src/Miningcore/Contracts/Contract.cs @@ -33,7 +33,7 @@ public class Contract public static void Requires(bool predicate, string message = null) where TException : Exception, new() { - if (!predicate) + if(!predicate) { var constructor = constructors.GetOrAdd(typeof(TException), CreateConstructor); throw constructor(new object[] { message }); @@ -43,7 +43,7 @@ public static void Requires(bool predicate, string message = null) [ContractAnnotation("parameter:null => halt")] public static void RequiresNonNull(object parameter, string paramName) { - if (parameter == null) + if(parameter == null) throw new ArgumentNullException(paramName); } @@ -64,7 +64,7 @@ private static ConstructorDelegate CreateConstructor(Type type) // To feed the constructor with the right parameters, we need to generate an array // of parameters that will be read from the initialize object array argument. var constructorParameters = parameters.Select((paramType, index) => - // convert the object[index] to the right constructor parameter type. + // convert the object[index] to the right constructor parameter type. Expression.Convert( // read a value from the object[index] Expression.ArrayAccess( diff --git a/src/Miningcore/Crypto/HashAlgorithmFactory.cs b/src/Miningcore/Crypto/HashAlgorithmFactory.cs index b9c6d6cf98..bf7354ced2 100644 --- a/src/Miningcore/Crypto/HashAlgorithmFactory.cs +++ b/src/Miningcore/Crypto/HashAlgorithmFactory.cs @@ -20,7 +20,7 @@ public static IHashAlgorithm GetHash(IComponentContext ctx, JObject definition) throw new NotSupportedException("$Invalid or empty hash value {hash}"); var args = definition["args"]? - .Select(token => token.Type == JTokenType.Object ? GetHash(ctx, (JObject)token) : token.Value()) + .Select(token => token.Type == JTokenType.Object ? GetHash(ctx, (JObject) token) : token.Value()) .ToArray(); return InstantiateHash(ctx, hash, args); @@ -29,19 +29,19 @@ public static IHashAlgorithm GetHash(IComponentContext ctx, JObject definition) private static IHashAlgorithm InstantiateHash(IComponentContext ctx, string name, object[] args) { // special handling for DigestReverser - if (name == "reverse") + if(name == "reverse") name = nameof(DigestReverser); // check cache if possible var hasArgs = args != null && args.Length > 0; - if (!hasArgs && cache.TryGetValue(name, out var result)) + if(!hasArgs && cache.TryGetValue(name, out var result)) return result; var hashClass = (typeof(Sha256D).Namespace + "." + name).ToLower(); var hashType = typeof(Sha256D).Assembly.GetType(hashClass, true, true); // create it (we'll let Autofac do the heavy lifting) - if (hasArgs) + if(hasArgs) result = (IHashAlgorithm) ctx.Resolve(hashType, args.Select((x, i) => new PositionalParameter(i, x))); else { diff --git a/src/Miningcore/Crypto/Hashing/Algorithms/Kezzak.cs b/src/Miningcore/Crypto/Hashing/Algorithms/Kezzak.cs index d5d3bbae9e..91be8c5d62 100644 --- a/src/Miningcore/Crypto/Hashing/Algorithms/Kezzak.cs +++ b/src/Miningcore/Crypto/Hashing/Algorithms/Kezzak.cs @@ -41,13 +41,13 @@ public void Digest(ReadOnlySpan data, Span result, params object[] e Span dataEx = stackalloc byte[data.Length + nTimeHex.Length]; data.CopyTo(dataEx); - if (nTimeHex.Length > 0) + if(nTimeHex.Length > 0) { var dest = dataEx.Slice(data.Length); nTimeHex.CopyTo(dest); } - fixed(byte* input = dataEx) + fixed (byte* input = dataEx) { fixed (byte* output = result) { diff --git a/src/Miningcore/Crypto/Hashing/Algorithms/ScryptN.cs b/src/Miningcore/Crypto/Hashing/Algorithms/ScryptN.cs index 4e74c73837..c60f82a213 100644 --- a/src/Miningcore/Crypto/Hashing/Algorithms/ScryptN.cs +++ b/src/Miningcore/Crypto/Hashing/Algorithms/ScryptN.cs @@ -55,11 +55,11 @@ public void Digest(ReadOnlySpan data, Span result, params object[] e Contract.Requires(result.Length >= 32, $"{nameof(result)} must be greater or equal 32 bytes"); // get nFactor - var ts = ((DateTimeOffset)Clock.Now).ToUnixTimeSeconds(); + var ts = ((DateTimeOffset) Clock.Now).ToUnixTimeSeconds(); var n = timetable.First(x => ts >= x.Item2).Item1; var nFactor = Math.Log(n) / Math.Log(2); - fixed(byte* input = data) + fixed (byte* input = data) { fixed (byte* output = result) { diff --git a/src/Miningcore/Crypto/Hashing/Algorithms/Sha256D.cs b/src/Miningcore/Crypto/Hashing/Algorithms/Sha256D.cs index 5323b09a9a..fd6a90412a 100644 --- a/src/Miningcore/Crypto/Hashing/Algorithms/Sha256D.cs +++ b/src/Miningcore/Crypto/Hashing/Algorithms/Sha256D.cs @@ -33,7 +33,7 @@ public void Digest(ReadOnlySpan data, Span result, params object[] e { Contract.Requires(result.Length >= 32, $"{nameof(result)} must be greater or equal 32 bytes"); - using (var hasher = SHA256.Create()) + using(var hasher = SHA256.Create()) { hasher.TryComputeHash(data, result, out var cb); hasher.TryComputeHash(result, result, out cb); diff --git a/src/Miningcore/Crypto/Hashing/Algorithms/Sha256S.cs b/src/Miningcore/Crypto/Hashing/Algorithms/Sha256S.cs index d8ed61dc93..4295b59c12 100644 --- a/src/Miningcore/Crypto/Hashing/Algorithms/Sha256S.cs +++ b/src/Miningcore/Crypto/Hashing/Algorithms/Sha256S.cs @@ -33,7 +33,7 @@ public void Digest(ReadOnlySpan data, Span result, params object[] e { Contract.Requires(result.Length >= 32, $"{nameof(result)} must be greater or equal 32 bytes"); - using (var hasher = SHA256.Create()) + using(var hasher = SHA256.Create()) { hasher.TryComputeHash(data, result, out var cb); } diff --git a/src/Miningcore/Crypto/Hashing/Equihash/EquihashSolver.cs b/src/Miningcore/Crypto/Hashing/Equihash/EquihashSolver.cs index 5019b11c9d..16b7ea1bf0 100644 --- a/src/Miningcore/Crypto/Hashing/Equihash/EquihashSolver.cs +++ b/src/Miningcore/Crypto/Hashing/Equihash/EquihashSolver.cs @@ -35,7 +35,7 @@ public static int MaxThreads get => maxThreads; set { - if (sem.IsValueCreated) + if(sem.IsValueCreated) throw new InvalidOperationException("Too late: semaphore already created"); maxThreads = value; @@ -55,7 +55,7 @@ public static int MaxThreads /// header including nonce (140 bytes) /// equihash solution without size-preamble /// - public abstract bool Verify(Span header, Span solution); + public abstract bool Verify(ReadOnlySpan header, ReadOnlySpan solution); } public unsafe class EquihashSolver_200_9 : EquihashSolver @@ -65,7 +65,7 @@ public EquihashSolver_200_9(string personalization) this.personalization = personalization; } - public override bool Verify(Span header, Span solution) + public override bool Verify(ReadOnlySpan header, ReadOnlySpan solution) { try { @@ -94,7 +94,7 @@ public EquihashSolver_144_5(string personalization) this.personalization = personalization; } - public override bool Verify(Span header, Span solution) + public override bool Verify(ReadOnlySpan header, ReadOnlySpan solution) { try { @@ -123,7 +123,7 @@ public EquihashSolver_96_5(string personalization) this.personalization = personalization; } - public override bool Verify(Span header, Span solution) + public override bool Verify(ReadOnlySpan header, ReadOnlySpan solution) { try { diff --git a/src/Miningcore/Crypto/Hashing/Equihash/EquihashSolverFactory.cs b/src/Miningcore/Crypto/Hashing/Equihash/EquihashSolverFactory.cs index 124a14cb69..4b75ba32d3 100644 --- a/src/Miningcore/Crypto/Hashing/Equihash/EquihashSolverFactory.cs +++ b/src/Miningcore/Crypto/Hashing/Equihash/EquihashSolverFactory.cs @@ -32,7 +32,7 @@ public static EquihashSolver GetSolver(IComponentContext ctx, JObject definition private static EquihashSolver InstantiateSolver(IComponentContext ctx, object[] args) { var key = string.Join("-", args); - if (cache.TryGetValue(key, out var result)) + if(cache.TryGetValue(key, out var result)) return result; var n = (int) Convert.ChangeType(args[0], typeof(int)); @@ -49,7 +49,7 @@ private static EquihashSolver InstantiateSolver(IComponentContext ctx, object[] result = (EquihashSolver) ctx.Resolve(hashType, new PositionalParameter(0, personalization)); } - catch (ComponentNotRegisteredException) + catch(ComponentNotRegisteredException) { throw new NotSupportedException($"Equihash variant {n}_{k} is currently not implemented"); } diff --git a/src/Miningcore/Crypto/Hashing/Ethash/Cache.cs b/src/Miningcore/Crypto/Hashing/Ethash/Cache.cs index 4b48f94e7c..7d31c6bd7c 100644 --- a/src/Miningcore/Crypto/Hashing/Ethash/Cache.cs +++ b/src/Miningcore/Crypto/Hashing/Ethash/Cache.cs @@ -25,7 +25,7 @@ public Cache(ulong epoch) public void Dispose() { - if (handle != IntPtr.Zero) + if(handle != IntPtr.Zero) { LibMultihash.ethash_light_delete(handle); handle = IntPtr.Zero; @@ -38,7 +38,7 @@ await Task.Run(() => { lock(genLock) { - if (!isGenerated) + if(!isGenerated) { var started = DateTime.Now; logger.Debug(() => $"Generating cache for epoch {Epoch}"); @@ -64,12 +64,12 @@ public unsafe bool Compute(ILogger logger, byte[] hash, ulong nonce, out byte[] var value = new LibMultihash.ethash_return_value(); - fixed(byte* input = hash) + fixed (byte* input = hash) { LibMultihash.ethash_light_compute(handle, input, nonce, ref value); } - if (value.success) + if(value.success) { mixDigest = value.mix_hash.value; result = value.result.value; diff --git a/src/Miningcore/Crypto/Hashing/Ethash/Dag.cs b/src/Miningcore/Crypto/Hashing/Ethash/Dag.cs index 24551f7aba..a519524826 100644 --- a/src/Miningcore/Crypto/Hashing/Ethash/Dag.cs +++ b/src/Miningcore/Crypto/Hashing/Ethash/Dag.cs @@ -29,14 +29,14 @@ public static unsafe string GetDefaultDagDirectory() { var chars = new byte[512]; - fixed(byte* data = chars) + fixed (byte* data = chars) { - if (LibMultihash.ethash_get_default_dirname(data, chars.Length)) + if(LibMultihash.ethash_get_default_dirname(data, chars.Length)) { int length; for(length = 0; length < chars.Length; length++) { - if (data[length] == 0) + if(data[length] == 0) break; } @@ -49,7 +49,7 @@ public static unsafe string GetDefaultDagDirectory() public void Dispose() { - if (handle != IntPtr.Zero) + if(handle != IntPtr.Zero) { LibMultihash.ethash_full_delete(handle); handle = IntPtr.Zero; @@ -60,7 +60,7 @@ public async ValueTask GenerateAsync(string dagDir, ILogger logger, Cancellation { Contract.Requires(!string.IsNullOrEmpty(dagDir), $"{nameof(dagDir)} must not be empty"); - if (handle == IntPtr.Zero) + if(handle == IntPtr.Zero) { await Task.Run(() => { @@ -69,7 +69,7 @@ await Task.Run(() => sem.WaitOne(); // re-check after obtaining lock - if (handle != IntPtr.Zero) + if(handle != IntPtr.Zero) return; logger.Info(() => $"Generating DAG for epoch {Epoch}"); @@ -90,7 +90,7 @@ await Task.Run(() => return !ct.IsCancellationRequested ? 0 : 1; }); - if (handle == IntPtr.Zero) + if(handle == IntPtr.Zero) throw new OutOfMemoryException("ethash_full_new IO or memory error"); logger.Info(() => $"Done generating DAG for epoch {Epoch} after {DateTime.Now - started}"); @@ -98,7 +98,7 @@ await Task.Run(() => finally { - if (light != IntPtr.Zero) + if(light != IntPtr.Zero) LibMultihash.ethash_light_delete(light); } } @@ -122,12 +122,12 @@ public unsafe bool Compute(ILogger logger, byte[] hash, ulong nonce, out byte[] var value = new LibMultihash.ethash_return_value(); - fixed(byte* input = hash) + fixed (byte* input = hash) { LibMultihash.ethash_full_compute(handle, input, nonce, ref value); } - if (value.success) + if(value.success) { mixDigest = value.mix_hash.value; result = value.result.value; diff --git a/src/Miningcore/Crypto/Hashing/Ethash/EthashFull.cs b/src/Miningcore/Crypto/Hashing/Ethash/EthashFull.cs index ee6b6f6c58..4310c9b8e2 100644 --- a/src/Miningcore/Crypto/Hashing/Ethash/EthashFull.cs +++ b/src/Miningcore/Crypto/Hashing/Ethash/EthashFull.cs @@ -38,10 +38,10 @@ public async Task GetDagAsync(ulong block, ILogger logger, CancellationToke lock(cacheLock) { - if (numCaches == 0) + if(numCaches == 0) numCaches = 3; - if (!caches.TryGetValue(epoch, out result)) + if(!caches.TryGetValue(epoch, out result)) { // No cached DAG, evict the oldest if the cache limit was reached while(caches.Count >= numCaches) @@ -56,7 +56,7 @@ public async Task GetDagAsync(ulong block, ILogger logger, CancellationToke } // If we have the new DAG pre-generated, use that, otherwise create a new one - if (future != null && future.Epoch == epoch) + if(future != null && future.Epoch == epoch) { logger.Debug(() => $"Using pre-generated DAG for epoch {epoch}"); @@ -74,7 +74,7 @@ public async Task GetDagAsync(ulong block, ILogger logger, CancellationToke } // If we used up the future cache, or need a refresh, regenerate - else if (future == null || future.Epoch <= epoch) + else if(future == null || future.Epoch <= epoch) { logger.Info(() => $"Pre-generating DAG for epoch {epoch + 1}"); future = new Dag(epoch + 1); diff --git a/src/Miningcore/Crypto/MerkleTree.cs b/src/Miningcore/Crypto/MerkleTree.cs index fe8af89a40..3527baf565 100644 --- a/src/Miningcore/Crypto/MerkleTree.cs +++ b/src/Miningcore/Crypto/MerkleTree.cs @@ -87,15 +87,15 @@ private IList CalculateSteps(IEnumerable hashList) var startL = 2; var Ll = L.Count; - if (Ll > 1) + if(Ll > 1) while(true) { - if (Ll == 1) + if(Ll == 1) break; steps.Add(L[1]); - if (Ll % 2 == 1) + if(Ll % 2 == 1) L.Add(L[L.Count - 1]); var Ld = new List(); diff --git a/src/Miningcore/DaemonInterface/DaemonClient.cs b/src/Miningcore/DaemonInterface/DaemonClient.cs index f086a005a7..3655e04463 100644 --- a/src/Miningcore/DaemonInterface/DaemonClient.cs +++ b/src/Miningcore/DaemonInterface/DaemonClient.cs @@ -109,7 +109,7 @@ public void Configure(DaemonEndpointConfig[] endPoints, string digestAuthRealm = // create one HttpClient instance per endpoint that carries the associated credentials httpClients = endPoints.ToDictionary(endpoint => endpoint, endpoint => { - if (string.IsNullOrEmpty(endpoint.User) || !endpoint.DigestAuth) + if(string.IsNullOrEmpty(endpoint.User) || !endpoint.DigestAuth) return defaultHttpClient; return new HttpClient(new SocketsHttpHandler @@ -331,15 +331,15 @@ private async Task BuildRequestTask(ILogger logger, DaemonEndpo // build request url var protocol = (endPoint.Ssl || endPoint.Http2) ? "https" : "http"; var requestUrl = $"{protocol}://{endPoint.Host}:{endPoint.Port}"; - if (!string.IsNullOrEmpty(endPoint.HttpPath)) + if(!string.IsNullOrEmpty(endPoint.HttpPath)) requestUrl += $"{(endPoint.HttpPath.StartsWith("/") ? string.Empty : "/")}{endPoint.HttpPath}"; // build http request - using (var request = new HttpRequestMessage(HttpMethod.Post, requestUrl)) + using(var request = new HttpRequestMessage(HttpMethod.Post, requestUrl)) { request.Headers.ConnectionClose = false; // enable keep-alive - if (endPoint.Http2) + if(endPoint.Http2) request.Version = new Version(2, 0); // build request content @@ -347,7 +347,7 @@ private async Task BuildRequestTask(ILogger logger, DaemonEndpo request.Content = new StringContent(json, Encoding.UTF8, "application/json"); // build auth header - if (!string.IsNullOrEmpty(endPoint.User) && !endPoint.DigestAuth) + if(!string.IsNullOrEmpty(endPoint.User) && !endPoint.DigestAuth) { var auth = $"{endPoint.User}:{endPoint.Password}"; var base64 = Convert.ToBase64String(Encoding.UTF8.GetBytes(auth)); @@ -357,13 +357,13 @@ private async Task BuildRequestTask(ILogger logger, DaemonEndpo logger.Trace(() => $"Sending RPC request to {requestUrl}: {json}"); // send request - using (var response = await httpClients[endPoint].SendAsync(request, ct)) + using(var response = await httpClients[endPoint].SendAsync(request, ct)) { // read response var responseContent = await response.Content.ReadAsStringAsync(); // deserialize response - using (var jreader = new JsonTextReader(new StringReader(responseContent))) + using(var jreader = new JsonTextReader(new StringReader(responseContent))) { var result = serializer.Deserialize(jreader); @@ -389,7 +389,7 @@ private async Task[]> BuildBatchRequestTask(ILogger logg // build request url var protocol = (endPoint.Ssl || endPoint.Http2) ? "https" : "http"; var requestUrl = $"{protocol}://{endPoint.Host}:{endPoint.Port}"; - if (!string.IsNullOrEmpty(endPoint.HttpPath)) + if(!string.IsNullOrEmpty(endPoint.HttpPath)) requestUrl += $"{(endPoint.HttpPath.StartsWith("/") ? string.Empty : "/")}{endPoint.HttpPath}"; // build http request @@ -397,7 +397,7 @@ private async Task[]> BuildBatchRequestTask(ILogger logg { request.Headers.ConnectionClose = false; // enable keep-alive - if (endPoint.Http2) + if(endPoint.Http2) request.Version = new Version(2, 0); // build request content @@ -405,7 +405,7 @@ private async Task[]> BuildBatchRequestTask(ILogger logg request.Content = new StringContent(json, Encoding.UTF8, "application/json"); // build auth header - if (!string.IsNullOrEmpty(endPoint.User) && !endPoint.DigestAuth) + if(!string.IsNullOrEmpty(endPoint.User) && !endPoint.DigestAuth) { var auth = $"{endPoint.User}:{endPoint.Password}"; var base64 = Convert.ToBase64String(Encoding.UTF8.GetBytes(auth)); @@ -420,7 +420,7 @@ private async Task[]> BuildBatchRequestTask(ILogger logg // deserialize response var jsonResponse = await response.Content.ReadAsStringAsync(); - using (var jreader = new JsonTextReader(new StringReader(jsonResponse))) + using(var jreader = new JsonTextReader(new StringReader(jsonResponse))) { var result = serializer.Deserialize[]>(jreader); @@ -448,22 +448,22 @@ private DaemonResponse MapDaemonResponse(int i, Task MapDaemonResponse(int i, Task(serializer); else resp.Response = (TResponse) x.Result?.Result; @@ -485,7 +485,7 @@ private DaemonResponse MapDaemonResponse(int i, Task[] MapDaemonBatchResponse(int i, Task[]> x) { - if (x.IsFaulted) + if(x.IsFaulted) return x.Result?.Select(y => new DaemonResponse { Instance = endPoints[i], @@ -516,7 +516,7 @@ private IObservable WebsocketSubscribeEndpoint(ILogger logger, DaemonEnd { var buf = new byte[0x10000]; - while (!cts.IsCancellationRequested) + while(!cts.IsCancellationRequested) { try { @@ -541,7 +541,7 @@ private IObservable WebsocketSubscribeEndpoint(ILogger logger, DaemonEnd // stream response var stream = new MemoryStream(); - while (!cts.IsCancellationRequested && client.State == WebSocketState.Open) + while(!cts.IsCancellationRequested && client.State == WebSocketState.Open) { stream.SetLength(0); var complete = false; @@ -557,7 +557,7 @@ private IObservable WebsocketSubscribeEndpoint(ILogger logger, DaemonEnd var response = await client.ReceiveAsync(buf, ctsComposite.Token); - if (response.MessageType == WebSocketMessageType.Binary) + if(response.MessageType == WebSocketMessageType.Binary) throw new InvalidDataException("expected text, received binary data"); stream.Write(buf, 0, response.Count); @@ -567,7 +567,7 @@ private IObservable WebsocketSubscribeEndpoint(ILogger logger, DaemonEnd } } while(!complete && !cts.IsCancellationRequested && client.State == WebSocketState.Open); - logger.Debug(()=> $"Received WebSocket message with length {stream.Length}"); + logger.Debug(() => $"Received WebSocket message with length {stream.Length}"); // publish obs.OnNext(stream.ToArray()); diff --git a/src/Miningcore/Extensions/ArrayExtensions.cs b/src/Miningcore/Extensions/ArrayExtensions.cs index 83923446aa..28fdab436e 100644 --- a/src/Miningcore/Extensions/ArrayExtensions.cs +++ b/src/Miningcore/Extensions/ArrayExtensions.cs @@ -71,20 +71,20 @@ public static string ToHexString(this Span value, bool withPrefix = false) public static string ToHexString(this Span value, int? off, int? len, bool withPrefix = false) { - if (value == null || value.Length == 0) + if(value == null || value.Length == 0) return string.Empty; var length = len ?? value.Length; var bufferSize = length * 2; - if (withPrefix) + if(withPrefix) bufferSize += 2; Span buffer = stackalloc char[bufferSize]; var offset = 0; - if (withPrefix) + if(withPrefix) { buffer[offset++] = '0'; buffer[offset++] = 'x'; diff --git a/src/Miningcore/Extensions/ConnectionFactoryExtensions.cs b/src/Miningcore/Extensions/ConnectionFactoryExtensions.cs index c5348e8dbd..6155e0ea4a 100644 --- a/src/Miningcore/Extensions/ConnectionFactoryExtensions.cs +++ b/src/Miningcore/Extensions/ConnectionFactoryExtensions.cs @@ -34,7 +34,7 @@ public static class ConnectionFactoryExtensions public static async Task Run(this IConnectionFactory factory, Func action) { - using (var con = await factory.OpenConnectionAsync()) + using(var con = await factory.OpenConnectionAsync()) { await action(con); } @@ -69,7 +69,7 @@ public static async Task RunTx(this IConnectionFactory factory, { await action(con, tx); - if (autoCommit) + if(autoCommit) tx.Commit(); } @@ -99,7 +99,7 @@ public static async Task RunTx(this IConnectionFactory factory, { var result = await func(con, tx); - if (autoCommit) + if(autoCommit) tx.Commit(); return result; diff --git a/src/Miningcore/Extensions/DictionaryExtensions.cs b/src/Miningcore/Extensions/DictionaryExtensions.cs index 1fe0a60a73..99d4040cf0 100644 --- a/src/Miningcore/Extensions/DictionaryExtensions.cs +++ b/src/Miningcore/Extensions/DictionaryExtensions.cs @@ -35,7 +35,7 @@ public static void StripValue(this IDictionary dict, string key) var keyActual = dict.Keys.FirstOrDefault(x => x.ToLower(CultureInfo.InvariantCulture) == key); - if (keyActual != null) + if(keyActual != null) { var result = dict.Remove(keyActual); Debug.Assert(result); diff --git a/src/Miningcore/Extensions/HttpContextExtensions.cs b/src/Miningcore/Extensions/HttpContextExtensions.cs index 8ebaeeea9c..2e6feb893e 100644 --- a/src/Miningcore/Extensions/HttpContextExtensions.cs +++ b/src/Miningcore/Extensions/HttpContextExtensions.cs @@ -9,7 +9,7 @@ public static class HttpContextExtensions public static T GetQueryParameter(this HttpContext ctx, string name, T defaultValue) { var stringVal = ctx.Request.Query[name].FirstOrDefault(); - if (string.IsNullOrEmpty(stringVal)) + if(string.IsNullOrEmpty(stringVal)) return defaultValue; return (T) Convert.ChangeType(stringVal, typeof(T)); diff --git a/src/Miningcore/Extensions/LoggingExtensions.cs b/src/Miningcore/Extensions/LoggingExtensions.cs index 0523adef37..0460a8509e 100644 --- a/src/Miningcore/Extensions/LoggingExtensions.cs +++ b/src/Miningcore/Extensions/LoggingExtensions.cs @@ -11,7 +11,7 @@ public static class LoggingExtensions { public static void LogInvoke(this ILogger logger, object[] args = null, [CallerMemberName] string caller = null) { - if (args == null) + if(args == null) logger.Debug(() => $"{caller}()"); else logger.Debug(() => $"{caller}({string.Join(", ", args.Select(x => x?.ToString()))})"); @@ -19,7 +19,7 @@ public static void LogInvoke(this ILogger logger, object[] args = null, [CallerM public static void LogInvoke(this ILogger logger, string logCat, object[] args = null, [CallerMemberName] string caller = null) { - if (args == null) + if(args == null) logger.Debug(() => $"[{logCat}] {caller}()"); else logger.Debug(() => $"[{logCat}] {caller}({string.Join(", ", args.Select(x => x?.ToString()))})"); diff --git a/src/Miningcore/Extensions/MessageBusExtensions.cs b/src/Miningcore/Extensions/MessageBusExtensions.cs index 04d340eaa9..322486dd55 100644 --- a/src/Miningcore/Extensions/MessageBusExtensions.cs +++ b/src/Miningcore/Extensions/MessageBusExtensions.cs @@ -14,7 +14,7 @@ public static void NotifyBlockFound(this IMessageBus messageBus, string poolId, // miner account explorer link string minerExplorerLink = null; - if (!string.IsNullOrEmpty(coin.ExplorerAccountLink)) + if(!string.IsNullOrEmpty(coin.ExplorerAccountLink)) minerExplorerLink = string.Format(coin.ExplorerAccountLink, block.Miner); messageBus.SendMessage(new BlockFoundNotification @@ -46,19 +46,19 @@ public static void NotifyBlockUnlocked(this IMessageBus messageBus, string poolI string blockExplorerLink = null; string minerExplorerLink = null; - if (block.Status != BlockStatus.Orphaned) + if(block.Status != BlockStatus.Orphaned) { // block explorer link - if (coin.ExplorerBlockLinks.TryGetValue(!string.IsNullOrEmpty(block.Type) ? block.Type : "block", out var blockInfobaseUrl)) + if(coin.ExplorerBlockLinks.TryGetValue(!string.IsNullOrEmpty(block.Type) ? block.Type : "block", out var blockInfobaseUrl)) { - if (blockInfobaseUrl.Contains(CoinMetaData.BlockHeightPH)) + if(blockInfobaseUrl.Contains(CoinMetaData.BlockHeightPH)) blockExplorerLink = blockInfobaseUrl.Replace(CoinMetaData.BlockHeightPH, block.BlockHeight.ToString(CultureInfo.InvariantCulture)); - else if (blockInfobaseUrl.Contains(CoinMetaData.BlockHashPH) && !string.IsNullOrEmpty(block.Hash)) + else if(blockInfobaseUrl.Contains(CoinMetaData.BlockHashPH) && !string.IsNullOrEmpty(block.Hash)) blockExplorerLink = blockInfobaseUrl.Replace(CoinMetaData.BlockHashPH, block.Hash); } // miner account explorer link - if (!string.IsNullOrEmpty(coin.ExplorerAccountLink)) + if(!string.IsNullOrEmpty(coin.ExplorerAccountLink)) minerExplorerLink = string.Format(coin.ExplorerAccountLink, block.Miner); } diff --git a/src/Miningcore/Extensions/NumberExtensions.cs b/src/Miningcore/Extensions/NumberExtensions.cs index 3fd37bd4f2..ae8fb13abb 100644 --- a/src/Miningcore/Extensions/NumberExtensions.cs +++ b/src/Miningcore/Extensions/NumberExtensions.cs @@ -27,7 +27,7 @@ public static class NumberExtensions { public static uint ToBigEndian(this uint value) { - if (BitConverter.IsLittleEndian) + if(BitConverter.IsLittleEndian) return (uint) IPAddress.NetworkToHostOrder((int) value); return value; @@ -35,7 +35,7 @@ public static uint ToBigEndian(this uint value) public static uint ToLittleEndian(this uint value) { - if (!BitConverter.IsLittleEndian) + if(!BitConverter.IsLittleEndian) return (uint) IPAddress.HostToNetworkOrder((int) value); return value; diff --git a/src/Miningcore/Extensions/PipelineExtensions.cs b/src/Miningcore/Extensions/PipelineExtensions.cs index 70d8095137..822bdeeca7 100644 --- a/src/Miningcore/Extensions/PipelineExtensions.cs +++ b/src/Miningcore/Extensions/PipelineExtensions.cs @@ -7,7 +7,7 @@ public static class PipelineExtensions { public static ReadOnlySpan ToSpan(this ReadOnlySequence buffer) { - if (buffer.IsSingleSegment) + if(buffer.IsSingleSegment) return buffer.First.Span; return buffer.ToArray(); diff --git a/src/Miningcore/Extensions/SerializationExtensions.cs b/src/Miningcore/Extensions/SerializationExtensions.cs index 5c9e3c579d..de1ead5fd6 100644 --- a/src/Miningcore/Extensions/SerializationExtensions.cs +++ b/src/Miningcore/Extensions/SerializationExtensions.cs @@ -28,7 +28,7 @@ public static class SerializationExtensions { public static T SafeExtensionDataAs(this IDictionary extra) { - if (extra != null) + if(extra != null) { try { diff --git a/src/Miningcore/Extensions/StringExtensions.cs b/src/Miningcore/Extensions/StringExtensions.cs index 19b2bfca04..ab13b17f89 100644 --- a/src/Miningcore/Extensions/StringExtensions.cs +++ b/src/Miningcore/Extensions/StringExtensions.cs @@ -36,13 +36,13 @@ public static class StringExtensions /// public static byte[] HexToByteArray(this string str) { - if (str.StartsWith("0x")) + if(str.StartsWith("0x")) str = str.Substring(2); var arr = new byte[str.Length >> 1]; var count = str.Length >> 1; - for (var i = 0; i < count; ++i) + for(var i = 0; i < count; ++i) arr[i] = (byte) ((GetHexVal(str[i << 1]) << 4) + GetHexVal(str[(i << 1) + 1])); return arr; @@ -55,14 +55,14 @@ public static byte[] HexToByteArray(this string str) /// public static byte[] HexToReverseByteArray(this string str) { - if (str.StartsWith("0x")) + if(str.StartsWith("0x")) str = str.Substring(2); var arr = new byte[str.Length >> 1]; var count = str.Length >> 1; - for (var i = 0; i < count; ++i) - arr[count - 1 - i] = (byte)((GetHexVal(str[i << 1]) << 4) + GetHexVal(str[(i << 1) + 1])); + for(var i = 0; i < count; ++i) + arr[count - 1 - i] = (byte) ((GetHexVal(str[i << 1]) << 4) + GetHexVal(str[(i << 1) + 1])); return arr; } @@ -85,7 +85,7 @@ public static string ToStringHex8(this int value) public static string ToStringHexWithPrefix(this ulong value) { - if (value == 0) + if(value == 0) return "0x0"; return "0x" + value.ToString("x", CultureInfo.InvariantCulture); @@ -93,7 +93,7 @@ public static string ToStringHexWithPrefix(this ulong value) public static string ToStringHexWithPrefix(this long value) { - if (value == 0) + if(value == 0) return "0x0"; return "0x" + value.ToString("x", CultureInfo.InvariantCulture); @@ -101,7 +101,7 @@ public static string ToStringHexWithPrefix(this long value) public static string ToStringHexWithPrefix(this uint value) { - if (value == 0) + if(value == 0) return "0x0"; return "0x" + value.ToString("x", CultureInfo.InvariantCulture); @@ -109,7 +109,7 @@ public static string ToStringHexWithPrefix(this uint value) public static string ToStringHexWithPrefix(this int value) { - if (value == 0) + if(value == 0) return "0x0"; return "0x" + value.ToString("x", CultureInfo.InvariantCulture); @@ -117,7 +117,7 @@ public static string ToStringHexWithPrefix(this int value) public static string StripHexPrefix(this string value) { - if (value?.ToLower().StartsWith("0x") == true) + if(value?.ToLower().StartsWith("0x") == true) return value.Substring(2); return value; @@ -127,10 +127,10 @@ public static T IntegralFromHex(this string value) { var underlyingType = Nullable.GetUnderlyingType(typeof(T)); - if (value.StartsWith("0x")) + if(value.StartsWith("0x")) value = value.Substring(2); - if (!ulong.TryParse(value, NumberStyles.AllowHexSpecifier, CultureInfo.InvariantCulture, out var val)) + if(!ulong.TryParse(value, NumberStyles.AllowHexSpecifier, CultureInfo.InvariantCulture, out var val)) throw new FormatException(); return (T) Convert.ChangeType(val, underlyingType ?? typeof(T)); @@ -138,7 +138,7 @@ public static T IntegralFromHex(this string value) public static string ToLowerCamelCase(this string str) { - if (string.IsNullOrEmpty(str)) + if(string.IsNullOrEmpty(str)) return str; return char.ToLowerInvariant(str[0]) + str.Substring(1); @@ -151,7 +151,7 @@ public static string AsString(this ReadOnlySequence line, Encoding encodin public static string Capitalize(this string str) { - if (string.IsNullOrEmpty(str)) + if(string.IsNullOrEmpty(str)) return str; return str.Substring(0, 1).ToUpper() + str.Substring(1); diff --git a/src/Miningcore/Extensions/ZmqExtensions.cs b/src/Miningcore/Extensions/ZmqExtensions.cs index ef85260de8..4fb2e5e277 100644 --- a/src/Miningcore/Extensions/ZmqExtensions.cs +++ b/src/Miningcore/Extensions/ZmqExtensions.cs @@ -20,7 +20,7 @@ public static class ZmqExtensions private static readonly Lazy<(byte[] PubKey, byte[] SecretKey)> ownKey = new Lazy<(byte[] PubKey, byte[] SecretKey)>(() => { - if (!ZContext.Has("curve")) + if(!ZContext.Has("curve")) throw new NotSupportedException("ZMQ library does not support curve"); Z85.CurveKeypair(out var pubKey, out var secretKey); @@ -32,7 +32,7 @@ public static class ZmqExtensions private static byte[] DeriveKey(string password, int length = 32) { - using (var kbd = new Rfc2898DeriveBytes(Encoding.UTF8.GetBytes(password), NoSalt, PasswordIterations)) + using(var kbd = new Rfc2898DeriveBytes(Encoding.UTF8.GetBytes(password), NoSalt, PasswordIterations)) { var block = kbd.GetBytes(length); return block; @@ -43,7 +43,7 @@ private static byte[] DeriveKey(string password, int length = 32) public static IObservable MonitorAsObservable(this ZSocket socket) { - return Observable.Defer(() => Observable.Create(obs=> + return Observable.Defer(() => Observable.Create(obs => { var url = $"inproc://monitor{Interlocked.Increment(ref monitorSocketIndex)}"; var monitor = ZMonitor.Create(socket.Context, url); @@ -72,7 +72,7 @@ void OnEvent(object sender, ZMonitorEventArgs e) public static void LogMonitorEvent(ILogger logger, ZMonitorEventArgs e) { - logger.Info(()=> $"[ZMQ] [{e.Event.Address}] {Enum.GetName(typeof(ZMonitorEvents), e.Event.Event)} [{e.Event.EventValue}]"); + logger.Info(() => $"[ZMQ] [{e.Event.Address}] {Enum.GetName(typeof(ZMonitorEvents), e.Event.Event)} [{e.Event.EventValue}]"); } /// @@ -82,17 +82,17 @@ public static void SetupCurveTlsServer(this ZSocket socket, string keyPlain, ILo { keyPlain = keyPlain?.Trim(); - if (string.IsNullOrEmpty(keyPlain)) + if(string.IsNullOrEmpty(keyPlain)) return; - if (!ZContext.Has("curve")) + if(!ZContext.Has("curve")) logger.ThrowLogPoolStartupException("Unable to initialize ZMQ Curve Transport-Layer-Security. Your ZMQ library was compiled without Curve support!"); // Get server's public key byte[] keyBytes = null; byte[] serverPubKey = null; - if (!knownKeys.TryGetValue(keyPlain, out var serverKeys)) + if(!knownKeys.TryGetValue(keyPlain, out var serverKeys)) { keyBytes = DeriveKey(keyPlain, 32); @@ -120,16 +120,16 @@ public static void SetupCurveTlsClient(this ZSocket socket, string keyPlain, ILo { keyPlain = keyPlain?.Trim(); - if (string.IsNullOrEmpty(keyPlain)) + if(string.IsNullOrEmpty(keyPlain)) return; - if (!ZContext.Has("curve")) + if(!ZContext.Has("curve")) logger.ThrowLogPoolStartupException("Unable to initialize ZMQ Curve Transport-Layer-Security. Your ZMQ library was compiled without Curve support!"); // Get server's public key byte[] serverPubKey = null; - if (!knownKeys.TryGetValue(keyPlain, out var serverKeys)) + if(!knownKeys.TryGetValue(keyPlain, out var serverKeys)) { var keyBytes = DeriveKey(keyPlain, 32); diff --git a/src/Miningcore/JsonRpc/JsonRpcRequest.cs b/src/Miningcore/JsonRpc/JsonRpcRequest.cs index a8639012da..6925f9a1ce 100644 --- a/src/Miningcore/JsonRpc/JsonRpcRequest.cs +++ b/src/Miningcore/JsonRpc/JsonRpcRequest.cs @@ -63,7 +63,7 @@ public JsonRpcRequest(string method, T parameters, object id) public TParam ParamsAs() where TParam : class { - if (Params is JToken) + if(Params is JToken) return ((JToken) Params)?.ToObject(); return (TParam) Params; diff --git a/src/Miningcore/JsonRpc/JsonRpcResponse.cs b/src/Miningcore/JsonRpc/JsonRpcResponse.cs index b88cd070f4..dc73352b15 100644 --- a/src/Miningcore/JsonRpc/JsonRpcResponse.cs +++ b/src/Miningcore/JsonRpc/JsonRpcResponse.cs @@ -60,7 +60,7 @@ public JsonRpcResponse(JsonRpcException ex, object id, object result) Error = ex; Id = id; - if (result != null) + if(result != null) Result = JToken.FromObject(result); } @@ -78,7 +78,7 @@ public JsonRpcResponse(JsonRpcException ex, object id, object result) public TParam ResultAs() where TParam : class { - if (Result is JToken) + if(Result is JToken) return ((JToken) Result)?.ToObject(); return (TParam) Result; diff --git a/src/Miningcore/Messaging/MessageBus.cs b/src/Miningcore/Messaging/MessageBus.cs index f15b45736b..f7d01bc1d1 100644 --- a/src/Miningcore/Messaging/MessageBus.cs +++ b/src/Miningcore/Messaging/MessageBus.cs @@ -164,7 +164,7 @@ private ISubject setupSubjectIfNecessary(string contract) withMessageBus(typeof(T), contract, (mb, tuple) => { - if (mb.TryGetValue(tuple, out var subjRef) && subjRef.IsAlive) + if(mb.TryGetValue(tuple, out var subjRef) && subjRef.IsAlive) { ret = (ISubject) subjRef.Target; return; @@ -186,7 +186,7 @@ private void withMessageBus( { var tuple = new Tuple(type, contract); block(messageBus, tuple); - if (messageBus.ContainsKey(tuple) && !messageBus[tuple].IsAlive) + if(messageBus.ContainsKey(tuple) && !messageBus[tuple].IsAlive) messageBus.Remove(tuple); } } diff --git a/src/Miningcore/Mining/BtStreamReceiver.cs b/src/Miningcore/Mining/BtStreamReceiver.cs index 9d5da27bc8..233acee752 100644 --- a/src/Miningcore/Mining/BtStreamReceiver.cs +++ b/src/Miningcore/Mining/BtStreamReceiver.cs @@ -56,7 +56,7 @@ private void StartMessageReceiver(ZmqPubSubEndpointConfig[] endpoints) .DistinctBy(x => $"{x.Url}:{x.SharedEncryptionKey}") .ToArray(); - while (!cts.IsCancellationRequested) + while(!cts.IsCancellationRequested) { // track last message received per endpoint var lastMessageReceived = relays.Select(_ => clock.Now).ToArray(); @@ -66,29 +66,29 @@ private void StartMessageReceiver(ZmqPubSubEndpointConfig[] endpoints) // setup sockets var sockets = relays.Select(SetupSubSocket).ToArray(); - using (new CompositeDisposable(sockets)) + using(new CompositeDisposable(sockets)) { var pollItems = sockets.Select(_ => ZPollItem.CreateReceiver()).ToArray(); - while (!cts.IsCancellationRequested) + while(!cts.IsCancellationRequested) { - if (sockets.PollIn(pollItems, out var messages, out var error, timeout)) + if(sockets.PollIn(pollItems, out var messages, out var error, timeout)) { - for (var i = 0; i < messages.Length; i++) + for(var i = 0; i < messages.Length; i++) { var msg = messages[i]; - if (msg != null) + if(msg != null) { lastMessageReceived[i] = clock.Now; - using (msg) + using(msg) { ProcessMessage(msg); } } - else if (clock.Now - lastMessageReceived[i] > reconnectTimeout) + else if(clock.Now - lastMessageReceived[i] > reconnectTimeout) { // re-create socket sockets[i].Dispose(); @@ -101,18 +101,18 @@ private void StartMessageReceiver(ZmqPubSubEndpointConfig[] endpoints) } } - if (error != null) + if(error != null) logger.Error(() => $"{nameof(ShareReceiver)}: {error.Name} [{error.Name}] during receive"); } } } } - catch (Exception ex) + catch(Exception ex) { logger.Error(() => $"{nameof(ShareReceiver)}: {ex}"); - if (!cts.IsCancellationRequested) + if(!cts.IsCancellationRequested) Thread.Sleep(1000); } } @@ -126,7 +126,7 @@ private static ZSocket SetupSubSocket(ZmqPubSubEndpointConfig relay) subSocket.Connect(relay.Url); subSocket.SubscribeAll(); - if (subSocket.CurveServerKey != null) + if(subSocket.CurveServerKey != null) logger.Info($"Monitoring Bt-Stream source {relay.Url} using Curve public-key {subSocket.CurveServerKey.ToHexString()}"); else logger.Info($"Monitoring Bt-Stream source {relay.Url}"); @@ -143,17 +143,17 @@ private void ProcessMessage(ZMessage msg) var sent = DateTimeOffset.FromUnixTimeMilliseconds(msg[3].ReadInt64()).DateTime; // TMP FIX - if (flags != 0 && ((flags & 1) == 0)) + if(flags != 0 && ((flags & 1) == 0)) flags = BitConverter.ToUInt32(BitConverter.GetBytes(flags).ToNewReverseArray()); // compressed - if ((flags & 1) == 1) + if((flags & 1) == 1) { - using (var stm = new MemoryStream(data)) + using(var stm = new MemoryStream(data)) { - using (var stmOut = new MemoryStream()) + using(var stmOut = new MemoryStream()) { - using (var ds = new DeflateStream(stm, CompressionMode.Decompress)) + using(var ds = new DeflateStream(stm, CompressionMode.Decompress)) { ds.CopyTo(stmOut); } @@ -177,14 +177,14 @@ public void Start(ClusterConfig clusterConfig) this.clusterConfig = clusterConfig; var endpoints = clusterConfig.Pools.Select(x => - x.Extra.SafeExtensionDataAs()?.BtStream ?? + x.Extra.SafeExtensionDataAs()?.BtStream ?? x.Extra.SafeExtensionDataAs()?.BtStream ?? x.Extra.SafeExtensionDataAs()?.BtStream) .Where(x => x != null) - .DistinctBy(x=> $"{x.Url}:{x.SharedEncryptionKey}") + .DistinctBy(x => $"{x.Url}:{x.SharedEncryptionKey}") .ToArray(); - if (endpoints.Any()) + if(endpoints.Any()) StartMessageReceiver(endpoints); } diff --git a/src/Miningcore/Mining/PoolBase.cs b/src/Miningcore/Mining/PoolBase.cs index b98f69045b..ada7255652 100644 --- a/src/Miningcore/Mining/PoolBase.cs +++ b/src/Miningcore/Mining/PoolBase.cs @@ -96,17 +96,17 @@ protected PoolBase(IComponentContext ctx, protected double? GetStaticDiffFromPassparts(string[] parts) { - if (parts == null || parts.Length == 0) + if(parts == null || parts.Length == 0) return null; foreach(var part in parts) { var m = regexStaticDiff.Match(part); - if (m.Success) + if(m.Success) { var str = m.Groups[1].Value.Trim(); - if (double.TryParse(str, NumberStyles.Float, CultureInfo.InvariantCulture, out var diff) && + if(double.TryParse(str, NumberStyles.Float, CultureInfo.InvariantCulture, out var diff) && !double.IsNaN(diff) && !double.IsInfinity(diff)) return diff; } @@ -125,7 +125,7 @@ protected override void OnConnect(StratumClient client, IPEndPoint ipEndPoint) client.SetContext(context); // varDiff setup - if (context.VarDiff != null) + if(context.VarDiff != null) { lock(context.VarDiff) { @@ -141,12 +141,12 @@ private void EnsureNoZombieClient(StratumClient client) { Observable.Timer(clock.Now.AddSeconds(10)) .TakeUntil(client.Terminated) - .Where(_=> client.IsAlive) + .Where(_ => client.IsAlive) .Subscribe(_ => { try { - if (client.LastReceive == null) + if(client.LastReceive == null) { logger.Info(() => $"[{client.ConnectionId}] Booting zombie-worker (post-connect silence)"); @@ -154,7 +154,7 @@ private void EnsureNoZombieClient(StratumClient client) } } - catch (Exception ex) + catch(Exception ex) { logger.Error(ex); } @@ -175,7 +175,7 @@ protected async Task UpdateVarDiffAsync(StratumClient client, bool isIdleUpdate { var context = client.ContextAs(); - if (context.VarDiff != null) + if(context.VarDiff != null) { logger.Debug(() => $"[{client.ConnectionId}] Updating VarDiff" + (isIdleUpdate ? " [idle]" : string.Empty)); @@ -185,7 +185,7 @@ protected async Task UpdateVarDiffAsync(StratumClient client, bool isIdleUpdate lock(varDiffManagers) { - if (!varDiffManagers.TryGetValue(poolEndpoint, out varDiffManager)) + if(!varDiffManagers.TryGetValue(poolEndpoint, out varDiffManager)) { varDiffManager = new VarDiffManager(poolEndpoint.VarDiff, clock); varDiffManagers[poolEndpoint] = varDiffManager; @@ -202,7 +202,7 @@ protected async Task UpdateVarDiffAsync(StratumClient client, bool isIdleUpdate newDiff = varDiffManager.Update(context.VarDiff, context.Difficulty, isIdleUpdate); } - if (newDiff != null) + if(newDiff != null) { logger.Info(() => $"[{client.ConnectionId}] VarDiff update to {Math.Round(newDiff.Value, 2)}"); @@ -223,7 +223,7 @@ private void StartVarDiffIdleUpdate(StratumClient client, PoolEndpoint poolEndpo var shareReceived = messageBus.Listen() .Where(x => x.Share.PoolId == poolConfig.Id && x.Client == client) - .Select(_=> Unit.Default) + .Select(_ => Unit.Default) .Take(1); var timeout = poolEndpoint.VarDiff.TargetTime; @@ -251,7 +251,7 @@ protected virtual Task OnVarDiffUpdateAsync(StratumClient client, double newDiff protected void SetupBanning(ClusterConfig clusterConfig) { - if (poolConfig.Banning?.Enabled == true) + if(poolConfig.Banning?.Enabled == true) { var managerType = clusterConfig.Banning?.Manager ?? BanManagerKind.Integrated; banManager = ctx.ResolveKeyed(managerType); @@ -260,7 +260,7 @@ protected void SetupBanning(ClusterConfig clusterConfig) protected virtual async Task InitStatsAsync() { - if (clusterConfig.ShareRelay == null) + if(clusterConfig.ShareRelay == null) await LoadStatsAsync(); } @@ -272,7 +272,7 @@ private async Task LoadStatsAsync() var stats = await cf.Run(con => statsRepo.GetLastPoolStatsAsync(con, poolConfig.Id)); - if (stats != null) + if(stats != null) { poolStats = mapper.Map(stats); blockchainStats = mapper.Map(stats); @@ -289,11 +289,11 @@ protected void ConsiderBan(StratumClient client, WorkerContextBase context, Pool { var totalShares = context.Stats.ValidShares + context.Stats.InvalidShares; - if (totalShares > config.CheckThreshold) + if(totalShares > config.CheckThreshold) { var ratioBad = (double) context.Stats.InvalidShares / totalShares; - if (ratioBad < config.InvalidPercent / 100.0) + if(ratioBad < config.InvalidPercent / 100.0) { // reset stats context.Stats.ValidShares = 0; @@ -302,7 +302,7 @@ protected void ConsiderBan(StratumClient client, WorkerContextBase context, Pool else { - if (poolConfig.Banning?.Enabled == true && + if(poolConfig.Banning?.Enabled == true && (clusterConfig.Banning?.BanOnInvalidShares.HasValue == false || clusterConfig.Banning?.BanOnInvalidShares == true)) { @@ -319,7 +319,7 @@ protected void ConsiderBan(StratumClient client, WorkerContextBase context, Pool private (IPEndPoint IPEndPoint, PoolEndpoint PoolEndpoint) PoolEndpoint2IPEndpoint(int port, PoolEndpoint pep) { var listenAddress = IPAddress.Parse("127.0.0.1"); - if (!string.IsNullOrEmpty(pep.ListenAddress)) + if(!string.IsNullOrEmpty(pep.ListenAddress)) listenAddress = pep.ListenAddress != "*" ? IPAddress.Parse(pep.ListenAddress) : IPAddress.Any; return (new IPEndPoint(listenAddress, port), pep); @@ -338,7 +338,7 @@ private void OutputPoolInfo() Network Difficulty: {blockchainStats.NetworkDifficulty} Network Hash Rate: {FormatUtil.FormatHashrate(blockchainStats.NetworkHashrate)} Stratum Port(s): {(poolConfig.Ports?.Any() == true ? string.Join(", ", poolConfig.Ports.Keys) : string.Empty)} -Pool Fee: {(poolConfig.RewardRecipients?.Any() == true ? poolConfig.RewardRecipients.Where(x=> x.Type != "dev").Sum(x => x.Percentage) : 0)}% +Pool Fee: {(poolConfig.RewardRecipients?.Any() == true ? poolConfig.RewardRecipients.Where(x => x.Type != "dev").Sum(x => x.Percentage) : 0)}% "; logger.Info(() => msg); @@ -374,7 +374,7 @@ public virtual async Task StartAsync(CancellationToken ct) await SetupJobManager(ct); await InitStatsAsync(); - if (poolConfig.EnableInternalStratum == true) + if(poolConfig.EnableInternalStratum == true) { var ipEndpoints = poolConfig.Ports.Keys .Select(port => PoolEndpoint2IPEndpoint(port, poolConfig.Ports[port])) diff --git a/src/Miningcore/Mining/ShareReceiver.cs b/src/Miningcore/Mining/ShareReceiver.cs index 6fc4daf651..94966f7c75 100644 --- a/src/Miningcore/Mining/ShareReceiver.cs +++ b/src/Miningcore/Mining/ShareReceiver.cs @@ -78,7 +78,7 @@ private void StartMessageReceiver() .DistinctBy(x => $"{x.Url}:{x.SharedEncryptionKey}") .ToArray(); - while (!cts.IsCancellationRequested) + while(!cts.IsCancellationRequested) { // track last message received per endpoint var lastMessageReceived = relays.Select(_ => clock.Now).ToArray(); @@ -88,26 +88,26 @@ private void StartMessageReceiver() // setup sockets var sockets = relays.Select(SetupSubSocket).ToArray(); - using (new CompositeDisposable(sockets)) + using(new CompositeDisposable(sockets)) { var pollItems = sockets.Select(_ => ZPollItem.CreateReceiver()).ToArray(); - while (!cts.IsCancellationRequested) + while(!cts.IsCancellationRequested) { - if (sockets.PollIn(pollItems, out var messages, out var error, timeout)) + if(sockets.PollIn(pollItems, out var messages, out var error, timeout)) { - for (var i = 0; i < messages.Length; i++) + for(var i = 0; i < messages.Length; i++) { var msg = messages[i]; - if (msg != null) + if(msg != null) { lastMessageReceived[i] = clock.Now; queue.Post((relays[i].Url, msg)); } - else if (clock.Now - lastMessageReceived[i] > reconnectTimeout) + else if(clock.Now - lastMessageReceived[i] > reconnectTimeout) { // re-create socket sockets[i].Dispose(); @@ -120,18 +120,18 @@ private void StartMessageReceiver() } } - if (error != null) + if(error != null) logger.Error(() => $"{nameof(ShareReceiver)}: {error.Name} [{error.Name}] during receive"); } } } } - catch (Exception ex) + catch(Exception ex) { logger.Error(() => $"{nameof(ShareReceiver)}: {ex}"); - if (!cts.IsCancellationRequested) + if(!cts.IsCancellationRequested) Thread.Sleep(5000); } } @@ -145,7 +145,7 @@ private static ZSocket SetupSubSocket(ShareRelayEndpointConfig relay) subSocket.Connect(relay.Url); subSocket.SubscribeAll(); - if (subSocket.CurveServerKey != null) + if(subSocket.CurveServerKey != null) logger.Info($"Monitoring external stratum {relay.Url} using Curve public-key {subSocket.CurveServerKey.ToHexString()}"); else logger.Info($"Monitoring external stratum {relay.Url}"); @@ -155,7 +155,7 @@ private static ZSocket SetupSubSocket(ShareRelayEndpointConfig relay) private void StartMessageProcessors() { - for (var i = 0; i < Environment.ProcessorCount; i++) + for(var i = 0; i < Environment.ProcessorCount; i++) ProcessMessages(); } @@ -163,19 +163,19 @@ private void ProcessMessages() { Task.Run(async () => { - while (!cts.IsCancellationRequested) + while(!cts.IsCancellationRequested) { try { var (url, msg) = await queue.ReceiveAsync(cts.Token); - using (msg) + using(msg) { ProcessMessage(url, msg); } } - catch (Exception ex) + catch(Exception ex) { logger.Error(ex); } @@ -191,35 +191,35 @@ private void ProcessMessage(string url, ZMessage msg) var data = msg[2].Read(); // validate - if (string.IsNullOrEmpty(topic) || !pools.ContainsKey(topic)) + if(string.IsNullOrEmpty(topic) || !pools.ContainsKey(topic)) { logger.Warn(() => $"Received share for pool '{topic}' which is not known locally. Ignoring ..."); return; } - if (data?.Length == 0) + if(data?.Length == 0) { logger.Warn(() => $"Received empty data from {url}/{topic}. Ignoring ..."); return; } // TMP FIX - if ((flags & ShareRelay.WireFormatMask) == 0) + if((flags & ShareRelay.WireFormatMask) == 0) flags = BitConverter.ToUInt32(BitConverter.GetBytes(flags).ToNewReverseArray()); // deserialize - var wireFormat = (ShareRelay.WireFormat)(flags & ShareRelay.WireFormatMask); + var wireFormat = (ShareRelay.WireFormat) (flags & ShareRelay.WireFormatMask); Share share = null; - switch (wireFormat) + switch(wireFormat) { case ShareRelay.WireFormat.Json: - using (var stream = new MemoryStream(data)) + using(var stream = new MemoryStream(data)) { - using (var reader = new StreamReader(stream, Encoding.UTF8)) + using(var reader = new StreamReader(stream, Encoding.UTF8)) { - using (var jreader = new JsonTextReader(reader)) + using(var jreader = new JsonTextReader(reader)) { share = serializer.Deserialize(jreader); } @@ -229,10 +229,10 @@ private void ProcessMessage(string url, ZMessage msg) break; case ShareRelay.WireFormat.ProtocolBuffers: - using (var stream = new MemoryStream(data)) + using(var stream = new MemoryStream(data)) { share = Serializer.Deserialize(stream); - share.BlockReward = (decimal)share.BlockRewardDouble; + share.BlockReward = (decimal) share.BlockRewardDouble; } break; @@ -242,7 +242,7 @@ private void ProcessMessage(string url, ZMessage msg) break; } - if (share == null) + if(share == null) { logger.Error(() => $"Unable to deserialize share received from {url}/{topic}"); return; @@ -254,7 +254,7 @@ private void ProcessMessage(string url, ZMessage msg) messageBus.SendMessage(new ClientShare(null, share)); // update poolstats from shares - if (pools.TryGetValue(topic, out var poolContext)) + if(pools.TryGetValue(topic, out var poolContext)) { var pool = poolContext.Pool; @@ -263,12 +263,12 @@ private void ProcessMessage(string url, ZMessage msg) poolContext.Logger.Info(() => $"External {(!string.IsNullOrEmpty(share.Source) ? $"[{share.Source.ToUpper()}] " : string.Empty)}share accepted: D={Math.Round(share.Difficulty * shareMultiplier, 3)}"); - if (pool.NetworkStats != null) + if(pool.NetworkStats != null) { - pool.NetworkStats.BlockHeight = (ulong)share.BlockHeight; + pool.NetworkStats.BlockHeight = (ulong) share.BlockHeight; pool.NetworkStats.NetworkDifficulty = share.NetworkDifficulty; - if (poolContext.BlockHeight != share.BlockHeight) + if(poolContext.BlockHeight != share.BlockHeight) { pool.NetworkStats.LastNetworkBlockTime = clock.Now; poolContext.BlockHeight = share.BlockHeight; @@ -295,7 +295,7 @@ public void Start(ClusterConfig clusterConfig) { this.clusterConfig = clusterConfig; - if (clusterConfig.ShareRelays != null) + if(clusterConfig.ShareRelays != null) { StartMessageReceiver(); StartMessageProcessors(); diff --git a/src/Miningcore/Mining/ShareRecorder.cs b/src/Miningcore/Mining/ShareRecorder.cs index 613846a102..9a111aedef 100644 --- a/src/Miningcore/Mining/ShareRecorder.cs +++ b/src/Miningcore/Mining/ShareRecorder.cs @@ -113,9 +113,9 @@ await cf.RunTx(async (con, tx) => await shareRepo.BatchInsertAsync(con, tx, mapped); // Insert blocks - foreach (var share in shares) + foreach(var share in shares) { - if (!share.IsBlockCandidate) + if(!share.IsBlockCandidate) continue; var blockEntity = mapper.Map(share); @@ -148,7 +148,7 @@ private async Task OnExecutePolicyFallbackAsync(Context context, CancellationTok { using(var writer = new StreamWriter(stream, new UTF8Encoding(false))) { - if (stream.Length == 0) + if(stream.Length == 0) WriteRecoveryFileheader(writer); foreach(var share in shares) @@ -164,7 +164,7 @@ private async Task OnExecutePolicyFallbackAsync(Context context, CancellationTok catch(Exception ex) { - if (!hasLoggedPolicyFallbackFailure) + if(!hasLoggedPolicyFallbackFailure) { logger.Fatal(ex, "Fatal error during policy fallback execution. Share(s) will be lost!"); hasLoggedPolicyFallbackFailure = true; @@ -201,11 +201,11 @@ public async Task RecoverSharesAsync(ClusterConfig clusterConfig, string recover var line = reader.ReadLine().Trim(); // skip blank lines - if (line.Length == 0) + if(line.Length == 0) continue; // skip comments - if (line.StartsWith("#")) + if(line.StartsWith("#")) continue; // parse @@ -224,7 +224,7 @@ public async Task RecoverSharesAsync(ClusterConfig clusterConfig, string recover // import try { - if (shares.Count == bufferSize) + if(shares.Count == bufferSize) { await PersistSharesCoreAsync(shares); @@ -241,7 +241,7 @@ public async Task RecoverSharesAsync(ClusterConfig clusterConfig, string recover // progress var now = DateTime.UtcNow; - if (now - lastProgressUpdate > TimeSpan.FromSeconds(10)) + if(now - lastProgressUpdate > TimeSpan.FromSeconds(10)) { logger.Info($"{successCount} shares imported"); lastProgressUpdate = now; @@ -251,7 +251,7 @@ public async Task RecoverSharesAsync(ClusterConfig clusterConfig, string recover // import remaining shares try { - if (shares.Count > 0) + if(shares.Count > 0) { await PersistSharesCoreAsync(shares); @@ -267,7 +267,7 @@ public async Task RecoverSharesAsync(ClusterConfig clusterConfig, string recover } } - if (failCount == 0) + if(failCount == 0) logger.Info(() => $"Successfully imported {successCount} shares"); else logger.Warn(() => $"Successfully imported {successCount} shares with {failCount} failures"); @@ -281,7 +281,7 @@ public async Task RecoverSharesAsync(ClusterConfig clusterConfig, string recover private void NotifyAdminOnPolicyFallback() { - if (clusterConfig.Notifications?.Admin?.Enabled == true && + if(clusterConfig.Notifications?.Admin?.Enabled == true && clusterConfig.Notifications?.Admin?.NotifyPaymentSuccess == true && !notifiedAdminOnPolicyFallback) { @@ -320,7 +320,7 @@ private void StartQueue() { queueSub = messageBus.Listen() .ObserveOn(TaskPoolScheduler.Default) - .Select(x=> x.Share) + .Select(x => x.Share) .Buffer(TimeSpan.FromSeconds(5), 200) .Where(shares => shares.Any()) .Select(shares => Observable.FromAsync(async () => @@ -330,16 +330,16 @@ private void StartQueue() await PersistSharesAsync(shares); } - catch (Exception ex) + catch(Exception ex) { logger.Error(ex); } })) .Concat() .Subscribe( - _=> {}, - ex=> logger.Fatal(()=> $"{nameof(ShareRecorder)} queue terminated with {ex}"), - ()=> logger.Info(()=> $"{nameof(ShareRecorder)} queue completed")); + _ => { }, + ex => logger.Fatal(() => $"{nameof(ShareRecorder)} queue terminated with {ex}"), + () => logger.Info(() => $"{nameof(ShareRecorder)} queue completed")); } private void ConfigureRecovery() diff --git a/src/Miningcore/Mining/ShareRelay.cs b/src/Miningcore/Mining/ShareRelay.cs index 8911aeb3d8..a52da60a60 100644 --- a/src/Miningcore/Mining/ShareRelay.cs +++ b/src/Miningcore/Mining/ShareRelay.cs @@ -57,7 +57,7 @@ public void Start(ClusterConfig clusterConfig) pubSocket = new ZSocket(ZSocketType.PUB); - if (!clusterConfig.ShareRelay.Connect) + if(!clusterConfig.ShareRelay.Connect) { pubSocket.SetupCurveTlsServer(clusterConfig.ShareRelay.SharedEncryptionKey, logger); @@ -111,7 +111,7 @@ private void InitializeQueue() { var flags = (int) WireFormat.ProtocolBuffers; - using (var msg = new ZMessage()) + using(var msg = new ZMessage()) { // Topic frame msg.Add(new ZFrame(share.PoolId)); @@ -139,16 +139,16 @@ private void InitializeQueue() private void CheckQueueBacklog() { - if (queue.Count > QueueSizeWarningThreshold) + if(queue.Count > QueueSizeWarningThreshold) { - if (!hasWarnedAboutBacklogSize) + if(!hasWarnedAboutBacklogSize) { logger.Warn(() => $"Share relay queue backlog has crossed {QueueSizeWarningThreshold}"); hasWarnedAboutBacklogSize = true; } } - else if (hasWarnedAboutBacklogSize && queue.Count <= QueueSizeWarningThreshold / 2) + else if(hasWarnedAboutBacklogSize && queue.Count <= QueueSizeWarningThreshold / 2) { hasWarnedAboutBacklogSize = false; } diff --git a/src/Miningcore/Mining/StatsRecorder.cs b/src/Miningcore/Mining/StatsRecorder.cs index dfd81f610f..42f992939e 100644 --- a/src/Miningcore/Mining/StatsRecorder.cs +++ b/src/Miningcore/Mining/StatsRecorder.cs @@ -143,12 +143,12 @@ private async Task UpdatePoolHashratesAsync() var byMiner = result.GroupBy(x => x.Miner).ToArray(); - if (result.Length > 0) + if(result.Length > 0) { // calculate pool stats var windowActual = (result.Max(x => x.LastShare) - result.Min(x => x.FirstShare)).TotalSeconds; - if (windowActual >= MinHashrateCalculationWindow) + if(windowActual >= MinHashrateCalculationWindow) { var poolHashesAccumulated = result.Sum(x => x.Sum); var poolHashesCountAccumulated = result.Sum(x => x.Count); @@ -178,7 +178,7 @@ await cf.RunTx(async (con, tx) => await statsRepo.InsertPoolStatsAsync(con, tx, mapped); }); - if (result.Length == 0) + if(result.Length == 0) continue; // calculate & update miner, worker hashrates @@ -195,7 +195,7 @@ await cf.RunTx(async (con, tx) => // calculate miner/worker stats var windowActual = (minerHashes.Max(x => x.LastShare) - minerHashes.Min(x => x.FirstShare)).TotalSeconds; - if (windowActual >= MinHashrateCalculationWindow) + if(windowActual >= MinHashrateCalculationWindow) { var hashrate = pool.HashrateFromShares(item.Sum, windowActual) * HashrateBoostFactor; minerTotalHashrate += hashrate; @@ -231,7 +231,7 @@ await cf.Run(async con => logger.Info(() => $"Deleted {rowCount} old poolstats records"); rowCount = await statsRepo.DeleteMinerStatsBeforeAsync(con, cutOff); - if (rowCount > 0) + if(rowCount > 0) logger.Info(() => $"Deleted {rowCount} old minerstats records"); }); diff --git a/src/Miningcore/Mining/WorkerContextBase.cs b/src/Miningcore/Mining/WorkerContextBase.cs index d256df99bb..aefa07fe58 100644 --- a/src/Miningcore/Mining/WorkerContextBase.cs +++ b/src/Miningcore/Mining/WorkerContextBase.cs @@ -67,7 +67,7 @@ public void Init(PoolConfig poolConfig, double difficulty, VarDiffConfig varDiff LastActivity = clock.Now; Stats = new ShareStats(); - if (varDiffConfig != null) + if(varDiffConfig != null) VarDiff = new VarDiffContext { Config = varDiffConfig }; } @@ -78,7 +78,7 @@ public void EnqueueNewDifficulty(double difficulty) public bool ApplyPendingDifficulty() { - if (pendingDifficulty.HasValue) + if(pendingDifficulty.HasValue) { SetDifficulty(pendingDifficulty.Value); pendingDifficulty = null; diff --git a/src/Miningcore/Miningcore.csproj b/src/Miningcore/Miningcore.csproj index d4ac16f133..5efa5b57ca 100644 --- a/src/Miningcore/Miningcore.csproj +++ b/src/Miningcore/Miningcore.csproj @@ -49,29 +49,29 @@ - - + + - - - - + + + + - + - + - + - - - + + + diff --git a/src/Miningcore/Native/LibCryptonight.cs b/src/Miningcore/Native/LibCryptonight.cs index c274516409..c1d383c05e 100644 --- a/src/Miningcore/Native/LibCryptonight.cs +++ b/src/Miningcore/Native/LibCryptonight.cs @@ -40,7 +40,7 @@ internal CryptonightContextStore(Func allocator, string logId) // allocate context per CPU for(var i = 0; i < contexts.BoundedCapacity; i++) { - contexts.Add(new Lazy(()=> + contexts.Add(new Lazy(() => { var result = allocator(); @@ -57,7 +57,7 @@ internal CryptonightContextStore(Func allocator, string logId) internal Lazy Lease() { - logger.Debug(()=> $"Leasing {logId} context ({contexts.Count})"); + logger.Debug(() => $"Leasing {logId} context ({contexts.Count})"); return contexts.Take(); } @@ -126,6 +126,9 @@ public enum CryptonightVariant VARIANT_GPU = 11, // CryptoNight-GPU (Ryo) VARIANT_WOW = 12, // CryptoNightR (Wownero) VARIANT_4 = 13, // CryptoNightR (Monero's variant 4) + VARIANT_RWZ = 14, // CryptoNight variant 2 with 3/4 iterations and reversed shuffle operation (Graft) + VARIANT_ZLS = 15, // CryptoNight variant 2 with 3/4 iterations (Zelerius) + VARIANT_DOUBLE = 16, // CryptoNight variant 2 with double iterations (X-CASH) VARIANT_MAX }; @@ -145,7 +148,7 @@ public static void Cryptonight(ReadOnlySpan data, Span result, Crypt { fixed (byte* output = result) { - cryptonight(ctx.Value, input, output, (uint)data.Length, variant, height); + cryptonight(ctx.Value, input, output, (uint) data.Length, variant, height); } } } @@ -168,9 +171,9 @@ public static void CryptonightLight(ReadOnlySpan data, Span result, try { - fixed(byte* input = data) + fixed (byte* input = data) { - fixed(byte* output = result) + fixed (byte* output = result) { cryptonight_light(ctx.Value, input, output, (uint) data.Length, variant, height); } @@ -226,7 +229,7 @@ public static void CryptonightPico(ReadOnlySpan data, Span result, C { fixed (byte* output = result) { - cryptonight_pico(ctx.Value, input, output, (uint)data.Length, variant, height); + cryptonight_pico(ctx.Value, input, output, (uint) data.Length, variant, height); } } } diff --git a/src/Miningcore/Native/LibCryptonote.cs b/src/Miningcore/Native/LibCryptonote.cs index 9a1d76bd99..12709a16f8 100644 --- a/src/Miningcore/Native/LibCryptonote.cs +++ b/src/Miningcore/Native/LibCryptonote.cs @@ -44,7 +44,7 @@ public static byte[] ConvertBlob(ReadOnlySpan data, int size) { Contract.Requires(data.Length > 0, $"{nameof(data)} must not be empty"); - fixed(byte* input = data) + fixed (byte* input = data) { // provide reasonable large output buffer var outputBuffer = ArrayPool.Shared.Rent(0x100); @@ -54,27 +54,27 @@ public static byte[] ConvertBlob(ReadOnlySpan data, int size) var outputBufferLength = outputBuffer.Length; var success = false; - fixed(byte* output = outputBuffer) + fixed (byte* output = outputBuffer) { success = convert_blob(input, size, output, ref outputBufferLength); } - if (!success) + if(!success) { // if we get false, the buffer might have been too small - if (outputBufferLength == 0) + if(outputBufferLength == 0) return null; // nope, other error // retry with correctly sized buffer ArrayPool.Shared.Return(outputBuffer); outputBuffer = ArrayPool.Shared.Rent(outputBufferLength); - fixed(byte* output = outputBuffer) + fixed (byte* output = outputBuffer) { success = convert_blob(input, size, output, ref outputBufferLength); } - if (!success) + if(!success) return null; // sorry } @@ -98,7 +98,7 @@ public static UInt64 DecodeAddress(string address) var data = Encoding.UTF8.GetBytes(address); - fixed(byte* input = data) + fixed (byte* input = data) { return decode_address(input, data.Length); } @@ -110,7 +110,7 @@ public static UInt64 DecodeIntegratedAddress(string address) var data = Encoding.UTF8.GetBytes(address); - fixed(byte* input = data) + fixed (byte* input = data) { return decode_integrated_address(input, data.Length); } @@ -124,7 +124,7 @@ public static void CryptonightHashFast(ReadOnlySpan data, Span resul { fixed (byte* output = result) { - cn_fast_hash(input, output, (uint)data.Length); + cn_fast_hash(input, output, (uint) data.Length); } } } diff --git a/src/Miningcore/Notifications/NotificationService.cs b/src/Miningcore/Notifications/NotificationService.cs index 1bbacb60cf..b8bf3fc787 100644 --- a/src/Miningcore/Notifications/NotificationService.cs +++ b/src/Miningcore/Notifications/NotificationService.cs @@ -38,7 +38,7 @@ public NotificationService( adminEmail = clusterConfig.Notifications?.Admin?.EmailAddress; //adminPhone = null; - if (clusterConfig.Notifications?.Enabled == true) + if(clusterConfig.Notifications?.Enabled == true) { queue = new BlockingCollection(); @@ -59,7 +59,7 @@ public NotificationService( }); }); - messageBus.Listen() + messageBus.Listen() .Subscribe(x => { queue?.Add(new QueuedNotification @@ -74,14 +74,14 @@ public NotificationService( messageBus.Listen() .Subscribe(x => { - if (string.IsNullOrEmpty(x.Error)) + if(string.IsNullOrEmpty(x.Error)) { var coin = poolConfigs[x.PoolId].Template; // prepare tx links string[] txLinks = null; - if (!string.IsNullOrEmpty(coin.ExplorerTxLink)) + if(!string.IsNullOrEmpty(coin.ExplorerTxLink)) txLinks = x.TxIds.Select(txHash => string.Format(coin.ExplorerTxLink, txHash)).ToArray(); queue?.Add(new QueuedNotification @@ -150,19 +150,19 @@ private async Task SendNotificationAsync(QueuedNotification notification) switch(notification.Category) { case NotificationCategory.Admin: - if (clusterConfig.Notifications?.Admin?.Enabled == true) + if(clusterConfig.Notifications?.Admin?.Enabled == true) await SendEmailAsync(adminEmail, notification.Subject, notification.Msg); break; case NotificationCategory.Block: - if (clusterConfig.Notifications?.Admin?.Enabled == true && + if(clusterConfig.Notifications?.Admin?.Enabled == true && clusterConfig.Notifications?.Admin?.NotifyBlockFound == true) await SendEmailAsync(adminEmail, notification.Subject, notification.Msg); break; case NotificationCategory.PaymentSuccess: case NotificationCategory.PaymentFailure: - if (clusterConfig.Notifications?.Admin?.Enabled == true && + if(clusterConfig.Notifications?.Admin?.Enabled == true && clusterConfig.Notifications?.Admin?.NotifyPaymentSuccess == true) await SendEmailAsync(adminEmail, notification.Subject, notification.Msg); break; diff --git a/src/Miningcore/Payments/PaymentSchemes/PPLNSPaymentScheme.cs b/src/Miningcore/Payments/PaymentSchemes/PPLNSPaymentScheme.cs index c8c45f727a..de65cc2479 100644 --- a/src/Miningcore/Payments/PaymentSchemes/PPLNSPaymentScheme.cs +++ b/src/Miningcore/Payments/PaymentSchemes/PPLNSPaymentScheme.cs @@ -95,7 +95,7 @@ public async Task UpdateBalancesAsync(IDbConnection con, IDbTransaction tx, Pool { var amount = rewards[address]; - if (amount > 0) + if(amount > 0) { logger.Info(() => $"Adding {payoutHandler.FormatAmount(amount)} to balance of {address} for {FormatUtil.FormatQuantity(shares[address])} ({shares[address]}) shares for block {block.BlockHeight}"); await balanceRepo.AddAmountAsync(con, tx, poolConfig.Id, address, amount, $"Reward for {FormatUtil.FormatQuantity(shares[address])} shares for block {block.BlockHeight}"); @@ -103,11 +103,11 @@ public async Task UpdateBalancesAsync(IDbConnection con, IDbTransaction tx, Pool } // delete discarded shares - if (shareCutOffDate.HasValue) + if(shareCutOffDate.HasValue) { var cutOffCount = await shareRepo.CountSharesBeforeCreatedAsync(con, tx, poolConfig.Id, shareCutOffDate.Value); - if (cutOffCount > 0) + if(cutOffCount > 0) { await LogDiscardedSharesAsync(poolConfig, block, shareCutOffDate.Value); @@ -122,7 +122,7 @@ public async Task UpdateBalancesAsync(IDbConnection con, IDbTransaction tx, Pool var totalShareCount = shares.Values.ToList().Sum(x => new decimal(x)); var totalRewards = rewards.Values.ToList().Sum(x => x); - if (totalRewards > 0) + if(totalRewards > 0) logger.Info(() => $"{FormatUtil.FormatQuantity((double) totalShareCount)} ({Math.Round(totalShareCount, 2)}) shares contributed to a total payout of {payoutHandler.FormatAmount(totalRewards)} ({totalRewards / blockReward * 100:0.00}% of block reward) to {rewards.Keys.Count} addresses"); } @@ -148,19 +148,19 @@ private async Task LogDiscardedSharesAsync(PoolConfig poolConfig, Block block, D var address = share.Miner; // record attributed shares for diagnostic purposes - if (!shares.ContainsKey(address)) + if(!shares.ContainsKey(address)) shares[address] = share.Difficulty; else shares[address] += share.Difficulty; } - if (page.Length < pageSize) + if(page.Length < pageSize) break; before = page[page.Length - 1].Created; } - if (shares.Keys.Count > 0) + if(shares.Keys.Count > 0) { // sort addresses by shares var addressesByShares = shares.Keys.OrderByDescending(x => shares[x]); @@ -205,7 +205,7 @@ private async Task LogDiscardedSharesAsync(PoolConfig poolConfig, Block block, D var address = share.Miner; // record attributed shares for diagnostic purposes - if (!shares.ContainsKey(address)) + if(!shares.ContainsKey(address)) shares[address] = share.Difficulty; else shares[address] += share.Difficulty; @@ -213,7 +213,7 @@ private async Task LogDiscardedSharesAsync(PoolConfig poolConfig, Block block, D var score = (decimal) (share.Difficulty / share.NetworkDifficulty); // if accumulated score would cross threshold, cap it to the remaining value - if (accumulatedScore + score >= window) + if(accumulatedScore + score >= window) { score = window - accumulatedScore; shareCutOffDate = share.Created; @@ -226,20 +226,20 @@ private async Task LogDiscardedSharesAsync(PoolConfig poolConfig, Block block, D blockRewardRemaining -= reward; // this should never happen - if (blockRewardRemaining <= 0 && !done) + if(blockRewardRemaining <= 0 && !done) throw new OverflowException("blockRewardRemaining < 0"); - if (reward > 0) + if(reward > 0) { // accumulate miner reward - if (!rewards.ContainsKey(address)) + if(!rewards.ContainsKey(address)) rewards[address] = reward; else rewards[address] += reward; } } - if (page.Length < pageSize) + if(page.Length < pageSize) break; before = page[page.Length - 1].Created; diff --git a/src/Miningcore/Payments/PaymentSchemes/SoloPaymentScheme.cs b/src/Miningcore/Payments/PaymentSchemes/SoloPaymentScheme.cs index f97c4cd61c..167c52d707 100644 --- a/src/Miningcore/Payments/PaymentSchemes/SoloPaymentScheme.cs +++ b/src/Miningcore/Payments/PaymentSchemes/SoloPaymentScheme.cs @@ -79,7 +79,7 @@ public async Task UpdateBalancesAsync(IDbConnection con, IDbTransaction tx, Pool { var amount = rewards[address]; - if (amount > 0) + if(amount > 0) { logger.Info(() => $"Adding {payoutHandler.FormatAmount(amount)} to balance of {address} for block {block.BlockHeight}"); await balanceRepo.AddAmountAsync(con, tx, poolConfig.Id, address, amount, $"Reward for block {block.BlockHeight}"); @@ -87,11 +87,11 @@ public async Task UpdateBalancesAsync(IDbConnection con, IDbTransaction tx, Pool } // delete discarded shares - if (shareCutOffDate.HasValue) + if(shareCutOffDate.HasValue) { var cutOffCount = await shareRepo.CountSharesBeforeCreatedAsync(con, tx, poolConfig.Id, shareCutOffDate.Value); - if (cutOffCount > 0) + if(cutOffCount > 0) { #if !DEBUG logger.Info(() => $"Deleting {cutOffCount} discarded shares before {shareCutOffDate.Value:O}"); @@ -111,7 +111,7 @@ public async Task UpdateBalancesAsync(IDbConnection con, IDbTransaction tx, Pool .Select(x => x.Address) .ToArray(); - if (recipients.Length == 0) + if(recipients.Length == 0) throw new Exception("No reward-recipients of type = 'solo' configured"); // split reward evenly between configured solo-recipients diff --git a/src/Miningcore/Payments/PayoutHandlerBase.cs b/src/Miningcore/Payments/PayoutHandlerBase.cs index 820dbe40e3..14add42dbb 100644 --- a/src/Miningcore/Payments/PayoutHandlerBase.cs +++ b/src/Miningcore/Payments/PayoutHandlerBase.cs @@ -110,7 +110,7 @@ public virtual async Task UpdateBlockRewardBalancesAsync(IDbConnection var blockRewardRemaining = block.Reward; // Distribute funds to configured reward recipients - foreach (var recipient in poolConfig.RewardRecipients.Where(x => x.Percentage > 0)) + foreach(var recipient in poolConfig.RewardRecipients.Where(x => x.Percentage > 0)) { var amount = block.Reward * (recipient.Percentage / 100.0m); var address = recipient.Address; @@ -118,7 +118,7 @@ public virtual async Task UpdateBlockRewardBalancesAsync(IDbConnection blockRewardRemaining -= amount; // skip transfers from pool wallet to pool wallet - if (address != poolConfig.Address) + if(address != poolConfig.Address) { logger.Info(() => $"Adding {FormatAmount(amount)} to balance of {address}"); await balanceRepo.AddAmountAsync(con, tx, poolConfig.Id, address, amount, $"Reward for block {block.BlockHeight}"); @@ -140,7 +140,7 @@ await cf.RunTx(async (con, tx) => { foreach(var balance in balances) { - if (!string.IsNullOrEmpty(transactionConfirmation) && + if(!string.IsNullOrEmpty(transactionConfirmation) && !poolConfig.RewardRecipients.Any(x => x.Address == balance.Address)) { // record payment diff --git a/src/Miningcore/Payments/PayoutManager.cs b/src/Miningcore/Payments/PayoutManager.cs index bde33cb3ab..b0b11842bb 100644 --- a/src/Miningcore/Payments/PayoutManager.cs +++ b/src/Miningcore/Payments/PayoutManager.cs @@ -100,14 +100,14 @@ private async Task ProcessPoolsAsync() await PayoutPoolBalancesAsync(pool, handler); } - catch (InvalidOperationException ex) + catch(InvalidOperationException ex) { logger.Error(ex.InnerException ?? ex, () => $"[{pool.Id}] Payment processing failed"); } - catch (AggregateException ex) + catch(AggregateException ex) { - switch (ex.InnerException) + switch(ex.InnerException) { case HttpRequestException httpEx: logger.Error(() => $"[{pool.Id}] Payment processing failed: {httpEx.Message}"); @@ -119,7 +119,7 @@ private async Task ProcessPoolsAsync() } } - catch (Exception ex) + catch(Exception ex) { logger.Error(ex, () => $"[{pool.Id}] Payment processing failed"); } @@ -133,7 +133,7 @@ private static CoinFamily HandleFamilyOverride(CoinFamily family, PoolConfig poo case CoinFamily.Equihash: var equihashTemplate = pool.Template.As(); - if (equihashTemplate.UseBitcoinPayoutHandler) + if(equihashTemplate.UseBitcoinPayoutHandler) return CoinFamily.Bitcoin; break; @@ -150,7 +150,7 @@ private async Task UpdatePoolBalancesAsync(PoolConfig pool, IPayoutHandler handl // classify var updatedBlocks = await handler.ClassifyBlocksAsync(pendingBlocks); - if (updatedBlocks.Any()) + if(updatedBlocks.Any()) { foreach(var block in updatedBlocks.OrderBy(x => x.Created)) { @@ -158,10 +158,10 @@ private async Task UpdatePoolBalancesAsync(PoolConfig pool, IPayoutHandler handl await cf.RunTx(async (con, tx) => { - if (!block.Effort.HasValue) // fill block effort if empty + if(!block.Effort.HasValue) // fill block effort if empty await CalculateBlockEffortAsync(pool, block, handler); - switch (block.Status) + switch(block.Status) { case BlockStatus.Confirmed: // blockchains that do not support block-reward payments via coinbase Tx @@ -190,7 +190,7 @@ private async Task PayoutPoolBalancesAsync(PoolConfig pool, IPayoutHandler handl var poolBalancesOverMinimum = await cf.Run(con => balanceRepo.GetPoolBalancesOverThresholdAsync(con, pool.Id, pool.PaymentProcessing.MinimumPayment)); - if (poolBalancesOverMinimum.Length > 0) + if(poolBalancesOverMinimum.Length > 0) { try { @@ -229,7 +229,7 @@ private async Task CalculateBlockEffortAsync(PoolConfig pool, Block block, IPayo BlockStatus.Pending, }, block.Created)); - if (lastBlock != null) + if(lastBlock != null) from = lastBlock.Created; // get combined diff of all shares for block @@ -237,7 +237,7 @@ private async Task CalculateBlockEffortAsync(PoolConfig pool, Block block, IPayo shareRepo.GetAccumulatedShareDifficultyBetweenCreatedAsync(con, pool.Id, from, to)); // handler has the final say - if (accumulatedShareDiffForBlock.HasValue) + if(accumulatedShareDiffForBlock.HasValue) await handler.CalculateBlockEffortAsync(block, accumulatedShareDiffForBlock.Value); } @@ -247,7 +247,7 @@ public void Configure(ClusterConfig clusterConfig) { this.clusterConfig = clusterConfig; - interval = TimeSpan.FromSeconds(clusterConfig.PaymentProcessing.Interval > 0 ? + interval = TimeSpan.FromSeconds(clusterConfig.PaymentProcessing.Interval > 0 ? clusterConfig.PaymentProcessing.Interval : 600); } @@ -257,7 +257,7 @@ public void Start() { logger.Info(() => "Online"); - while (!cts.IsCancellationRequested) + while(!cts.IsCancellationRequested) { try { diff --git a/src/Miningcore/Persistence/Postgres/Repositories/BalanceRepository.cs b/src/Miningcore/Persistence/Postgres/Repositories/BalanceRepository.cs index bb03c20c7b..96dc1316a9 100644 --- a/src/Miningcore/Persistence/Postgres/Repositories/BalanceRepository.cs +++ b/src/Miningcore/Persistence/Postgres/Repositories/BalanceRepository.cs @@ -68,7 +68,7 @@ public async Task AddAmountAsync(IDbConnection con, IDbTransaction tx, stri var balance = (await con.QueryAsync(query, new { poolId, address }, tx)) .FirstOrDefault(); - if (balance == null) + if(balance == null) { balance = new Entities.Balance { diff --git a/src/Miningcore/Persistence/Postgres/Repositories/BlockRepository.cs b/src/Miningcore/Persistence/Postgres/Repositories/BlockRepository.cs index 11d646d570..eb855c7957 100644 --- a/src/Miningcore/Persistence/Postgres/Repositories/BlockRepository.cs +++ b/src/Miningcore/Persistence/Postgres/Repositories/BlockRepository.cs @@ -81,12 +81,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(query, new - { - poolId, - status = status.Select(x => x.ToString().ToLower()).ToArray(), - offset = page * pageSize, - pageSize - })) + { + poolId, + status = status.Select(x => x.ToString().ToLower()).ToArray(), + offset = page * pageSize, + pageSize + })) .Select(mapper.Map) .ToArray(); } @@ -125,11 +125,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(); } diff --git a/src/Miningcore/Persistence/Postgres/Repositories/PaymentRepository.cs b/src/Miningcore/Persistence/Postgres/Repositories/PaymentRepository.cs index 9df257711f..43b9b8fe1f 100644 --- a/src/Miningcore/Persistence/Postgres/Repositories/PaymentRepository.cs +++ b/src/Miningcore/Persistence/Postgres/Repositories/PaymentRepository.cs @@ -59,7 +59,7 @@ public async Task PagePaymentsAsync(IDbConnection con, string poolId, var query = "SELECT * FROM payments WHERE poolid = @poolid "; - if (!string.IsNullOrEmpty(address)) + if(!string.IsNullOrEmpty(address)) query += " AND address = @address "; query += "ORDER BY created DESC OFFSET @offset FETCH NEXT (@pageSize) ROWS ONLY"; diff --git a/src/Miningcore/Persistence/Postgres/Repositories/ShareRepository.cs b/src/Miningcore/Persistence/Postgres/Repositories/ShareRepository.cs index 9b9362731b..6648693949 100644 --- a/src/Miningcore/Persistence/Postgres/Repositories/ShareRepository.cs +++ b/src/Miningcore/Persistence/Postgres/Repositories/ShareRepository.cs @@ -67,14 +67,14 @@ public Task BatchInsertAsync(IDbConnection con, IDbTransaction tx, IEnumerable CountSharesBetweenCreatedAsync(IDbConnection con, string poolI var whereClause = "poolid = @poolId AND miner = @miner"; - if (start.HasValue) + if(start.HasValue) whereClause += " AND created >= @start "; - if (end.HasValue) + if(end.HasValue) whereClause += " AND created <= @end"; var query = $"SELECT count(*) FROM shares WHERE {whereClause}"; diff --git a/src/Miningcore/Persistence/Postgres/Repositories/StatsRepository.cs b/src/Miningcore/Persistence/Postgres/Repositories/StatsRepository.cs index ddf253d599..8a6edd5ac5 100644 --- a/src/Miningcore/Persistence/Postgres/Repositories/StatsRepository.cs +++ b/src/Miningcore/Persistence/Postgres/Repositories/StatsRepository.cs @@ -67,7 +67,7 @@ public async Task InsertMinerWorkerPerformanceStatsAsync(IDbConnection con, IDbT var mapped = mapper.Map(stats); - if (string.IsNullOrEmpty(mapped.Worker)) + if(string.IsNullOrEmpty(mapped.Worker)) mapped.Worker = string.Empty; const string query = "INSERT INTO minerstats(poolid, miner, worker, hashrate, sharespersecond, created) " + @@ -83,7 +83,7 @@ public async Task GetLastPoolStatsAsync(IDbConnection con, string poo const string query = "SELECT * FROM poolstats WHERE poolid = @poolId ORDER BY created DESC FETCH NEXT 1 ROWS ONLY"; var entity = await con.QuerySingleOrDefaultAsync(query, new { poolId }); - if (entity == null) + if(entity == null) return null; return mapper.Map(entity); @@ -139,7 +139,7 @@ public async Task GetMinerStatsAsync(IDbConnection con, IDbTransacti var result = await con.QuerySingleOrDefaultAsync(query, new { poolId, miner }, tx); - if (result != null) + if(result != null) { query = "SELECT * FROM payments WHERE poolid = @poolId AND address = @miner" + " ORDER BY created DESC LIMIT 1"; @@ -153,10 +153,10 @@ public async Task GetMinerStatsAsync(IDbConnection con, IDbTransacti var lastUpdate = await con.QuerySingleOrDefaultAsync(query, new { poolId, miner }, tx); // ignore stale minerstats - if (lastUpdate.HasValue && (clock.Now - DateTime.SpecifyKind(lastUpdate.Value, DateTimeKind.Utc) > MinerStatsMaxAge)) + if(lastUpdate.HasValue && (clock.Now - DateTime.SpecifyKind(lastUpdate.Value, DateTimeKind.Utc) > MinerStatsMaxAge)) lastUpdate = null; - if (lastUpdate.HasValue) + if(lastUpdate.HasValue) { // load rows rows by timestamp query = "SELECT * FROM minerstats WHERE poolid = @poolId AND miner = @miner AND created = @created"; @@ -165,12 +165,12 @@ public async Task GetMinerStatsAsync(IDbConnection con, IDbTransacti .Select(mapper.Map) .ToArray(); - if (stats.Any()) + if(stats.Any()) { // replace null worker with empty string foreach(var stat in stats) { - if (stat.Worker == null) + if(stat.Worker == null) { stat.Worker = string.Empty; break; @@ -217,14 +217,14 @@ public async Task GetMinerPerformanceBetweenH .GroupBy(x => x.Created); var tmp = entitiesByDate.Select(x => new WorkerPerformanceStatsContainer + { + Created = x.Key, + Workers = x.ToDictionary(y => y.Worker ?? string.Empty, y => new WorkerPerformanceStats { - Created = x.Key, - Workers = x.ToDictionary(y => y.Worker ?? string.Empty, y => new WorkerPerformanceStats - { - Hashrate = y.Hashrate, - SharesPerSecond = y.SharesPerSecond - }) + Hashrate = y.Hashrate, + SharesPerSecond = y.SharesPerSecond }) + }) .ToArray(); //.ToDictionary(x=> x.Created.ToUniversalTime().ToUnixTimestamp(), x=> x); @@ -260,14 +260,14 @@ public async Task GetMinerPerformanceBetweenD .GroupBy(x => x.Created); var tmp = entitiesByDate.Select(x => new WorkerPerformanceStatsContainer + { + Created = x.Key, + Workers = x.ToDictionary(y => y.Worker, y => new WorkerPerformanceStats { - Created = x.Key, - Workers = x.ToDictionary(y => y.Worker, y => new WorkerPerformanceStats - { - Hashrate = y.Hashrate, - SharesPerSecond = y.SharesPerSecond - }) + Hashrate = y.Hashrate, + SharesPerSecond = y.SharesPerSecond }) + }) .ToArray(); //.ToDictionary(x => x.Created.ToUniversalTime().ToUnixTimestamp(), x => x); diff --git a/src/Miningcore/Program.cs b/src/Miningcore/Program.cs index 463d3c03fd..691e1689b6 100644 --- a/src/Miningcore/Program.cs +++ b/src/Miningcore/Program.cs @@ -110,7 +110,7 @@ public static void Main(string[] args) AppDomain.CurrentDomain.ProcessExit += OnProcessExit; Console.CancelKeyPress += OnCancelKeyPress; - if (!HandleCommandLineOptions(args, out var configFile)) + if(!HandleCommandLineOptions(args, out var configFile)) return; isShareRecoveryMode = shareRecoveryOption.HasValue(); @@ -118,7 +118,7 @@ public static void Main(string[] args) Logo(); clusterConfig = ReadConfig(configFile); - if (dumpConfigOption.HasValue()) + if(dumpConfigOption.HasValue()) { DumpParsedConfig(clusterConfig); return; @@ -128,9 +128,9 @@ public static void Main(string[] args) Bootstrap(); LogRuntimeInfo(); - if (!isShareRecoveryMode) + if(!isShareRecoveryMode) { - if (!cts.IsCancellationRequested) + if(!cts.IsCancellationRequested) Start().Wait(cts.Token); } @@ -140,7 +140,7 @@ public static void Main(string[] args) catch(PoolStartupAbortException ex) { - if (!string.IsNullOrEmpty(ex.Message)) + if(!string.IsNullOrEmpty(ex.Message)) Console.WriteLine(ex.Message); Console.WriteLine("\nCluster cannot start. Good Bye!"); @@ -158,7 +158,7 @@ public static void Main(string[] args) catch(AggregateException ex) { - if (!(ex.InnerExceptions.First() is PoolStartupAbortException)) + if(!(ex.InnerExceptions.First() is PoolStartupAbortException)) Console.WriteLine(ex); Console.WriteLine("Cluster cannot start. Good Bye!"); @@ -191,7 +191,7 @@ private static void ValidateConfig() // set some defaults foreach(var config in clusterConfig.Pools) { - if (!config.EnableInternalStratum.HasValue) + if(!config.EnableInternalStratum.HasValue) config.EnableInternalStratum = clusterConfig.ShareRelays == null || clusterConfig.ShareRelays.Length == 0; } @@ -241,13 +241,13 @@ private static bool HandleCommandLineOptions(string[] args, out string configFil app.Execute(args); - if (versionOption.HasValue()) + if(versionOption.HasValue()) { app.ShowVersion(); return false; } - if (!configFileOption.HasValue()) + if(!configFileOption.HasValue()) { app.ShowHelp(); return false; @@ -325,14 +325,14 @@ private static void HumanizeJsonParseException(JsonSerializationException ex) { var m = regexJsonTypeConversionError.Match(ex.Message); - if (m.Success) + if(m.Success) { var value = m.Groups[1].Value; var type = Type.GetType(m.Groups[2].Value); var line = m.Groups[3].Value; var col = m.Groups[4].Value; - if (type == typeof(PayoutScheme)) + if(type == typeof(PayoutScheme)) Console.WriteLine($"Error: Payout scheme '{value}' is not (yet) supported (line {line}, column {col})"); } @@ -345,11 +345,11 @@ private static void HumanizeJsonParseException(JsonSerializationException ex) private static void ValidateRuntimeEnvironment() { // root check - if (!RuntimeInformation.IsOSPlatform(OSPlatform.Windows) && Environment.UserName == "root") + if(!RuntimeInformation.IsOSPlatform(OSPlatform.Windows) && Environment.UserName == "root") logger.Warn(() => "Running as root is discouraged!"); // require 64-bit on Windows - if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows) && RuntimeInformation.ProcessArchitecture == Architecture.X86) + if(RuntimeInformation.IsOSPlatform(OSPlatform.Windows) && RuntimeInformation.ProcessArchitecture == Architecture.X86) throw new PoolStartupAbortException("Miningcore requires 64-Bit Windows"); } @@ -362,7 +362,7 @@ private static void MonitorGc() while(true) { var s = GC.WaitForFullGCApproach(); - if (s == GCNotificationStatus.Succeeded) + if(s == GCNotificationStatus.Succeeded) { logger.Info(() => "FullGC soon"); sw.Start(); @@ -370,13 +370,13 @@ private static void MonitorGc() s = GC.WaitForFullGCComplete(); - if (s == GCNotificationStatus.Succeeded) + if(s == GCNotificationStatus.Succeeded) { logger.Info(() => "FullGC completed"); sw.Stop(); - if (sw.Elapsed.TotalSeconds > gcStats.MaxFullGcDuration) + if(sw.Elapsed.TotalSeconds > gcStats.MaxFullGcDuration) gcStats.MaxFullGcDuration = sw.Elapsed.TotalSeconds; sw.Reset(); @@ -415,7 +415,7 @@ private static void ConfigureLogging() var config = clusterConfig.Logging; var loggingConfig = new LoggingConfiguration(); - if (config != null) + if(config != null) { // parse level var level = !string.IsNullOrEmpty(config.Level) @@ -435,7 +435,7 @@ private static void ConfigureLogging() loggingConfig.AddRule(level, LogLevel.Info, nullTarget, "Microsoft.AspNetCore.Mvc.Infrastructure.*", true); // Api Log - if (!string.IsNullOrEmpty(config.ApiLogFile) && !isShareRecoveryMode) + if(!string.IsNullOrEmpty(config.ApiLogFile) && !isShareRecoveryMode) { var target = new FileTarget("file") { @@ -448,9 +448,9 @@ private static void ConfigureLogging() loggingConfig.AddRule(level, LogLevel.Fatal, target, "Microsoft.AspNetCore.*", true); } - if (config.EnableConsoleLog || isShareRecoveryMode) + if(config.EnableConsoleLog || isShareRecoveryMode) { - if (config.EnableConsoleColors) + if(config.EnableConsoleColors) { var target = new ColoredConsoleTarget("console") { @@ -497,7 +497,7 @@ private static void ConfigureLogging() } } - if (!string.IsNullOrEmpty(config.LogFile) && !isShareRecoveryMode) + if(!string.IsNullOrEmpty(config.LogFile) && !isShareRecoveryMode) { var target = new FileTarget("file") { @@ -510,7 +510,7 @@ private static void ConfigureLogging() loggingConfig.AddRule(level, LogLevel.Fatal, target); } - if (config.PerPoolLogFile && !isShareRecoveryMode) + if(config.PerPoolLogFile && !isShareRecoveryMode) { foreach(var poolConfig in clusterConfig.Pools) { @@ -534,7 +534,7 @@ private static void ConfigureLogging() private static Layout GetLogPath(ClusterLoggingConfig config, string name) { - if (string.IsNullOrEmpty(config.LogBaseDirectory)) + if(string.IsNullOrEmpty(config.LogBaseDirectory)) return name; return Path.Combine(config.LogBaseDirectory, name); @@ -543,18 +543,18 @@ private static Layout GetLogPath(ClusterLoggingConfig config, string name) private static void ConfigureMisc() { // Configure Equihash - if (clusterConfig.EquihashMaxThreads.HasValue) + if(clusterConfig.EquihashMaxThreads.HasValue) EquihashSolver.MaxThreads = clusterConfig.EquihashMaxThreads.Value; } private static void ConfigurePersistence(ContainerBuilder builder) { - if (clusterConfig.Persistence == null && + if(clusterConfig.Persistence == null && clusterConfig.PaymentProcessing?.Enabled == true && clusterConfig.ShareRelay == null) logger.ThrowLogPoolStartupException("Persistence is not configured!"); - if (clusterConfig.Persistence?.Postgres != null) + if(clusterConfig.Persistence?.Postgres != null) ConfigurePostgres(clusterConfig.Persistence.Postgres, builder); else ConfigureDummyPersistence(builder); @@ -563,16 +563,16 @@ private static void ConfigurePersistence(ContainerBuilder builder) private static void ConfigurePostgres(DatabaseConfig pgConfig, ContainerBuilder builder) { // validate config - if (string.IsNullOrEmpty(pgConfig.Host)) + if(string.IsNullOrEmpty(pgConfig.Host)) logger.ThrowLogPoolStartupException("Postgres configuration: invalid or missing 'host'"); - if (pgConfig.Port == 0) + if(pgConfig.Port == 0) logger.ThrowLogPoolStartupException("Postgres configuration: invalid or missing 'port'"); - if (string.IsNullOrEmpty(pgConfig.Database)) + if(string.IsNullOrEmpty(pgConfig.Database)) logger.ThrowLogPoolStartupException("Postgres configuration: invalid or missing 'database'"); - if (string.IsNullOrEmpty(pgConfig.User)) + if(string.IsNullOrEmpty(pgConfig.User)) logger.ThrowLogPoolStartupException("Postgres configuration: invalid or missing 'user'"); // build connection string @@ -625,20 +625,20 @@ private static Dictionary LoadCoinTemplates() private static void UseIpWhiteList(IApplicationBuilder app, bool defaultToLoopback, string[] locations, string[] whitelist) { var ipList = whitelist?.Select(x => IPAddress.Parse(x)).ToList(); - if (defaultToLoopback && (ipList == null || ipList.Count == 0)) + if(defaultToLoopback && (ipList == null || ipList.Count == 0)) ipList = new List(new[] { IPAddress.Loopback, IPAddress.IPv6Loopback, IPUtils.IPv4LoopBackOnIPv6 }); - if (ipList.Count > 0) + if(ipList.Count > 0) { // always allow access by localhost - if (!ipList.Any(x => x.Equals(IPAddress.Loopback))) + if(!ipList.Any(x => x.Equals(IPAddress.Loopback))) ipList.Add(IPAddress.Loopback); - if (!ipList.Any(x => x.Equals(IPAddress.IPv6Loopback))) + if(!ipList.Any(x => x.Equals(IPAddress.IPv6Loopback))) ipList.Add(IPAddress.IPv6Loopback); - if (!ipList.Any(x => x.Equals(IPUtils.IPv4LoopBackOnIPv6))) + if(!ipList.Any(x => x.Equals(IPUtils.IPv4LoopBackOnIPv6))) ipList.Add(IPUtils.IPv4LoopBackOnIPv6); - logger.Info(() => $"API Access to {string.Join(",", locations)} restricted to {string.Join(",", ipList.Select(x=> x.ToString()))}"); + logger.Info(() => $"API Access to {string.Join(",", locations)} restricted to {string.Join(",", ipList.Select(x => x.ToString()))}"); app.UseMiddleware(locations, ipList.ToArray()); } @@ -659,7 +659,7 @@ private static void ConfigureIpRateLimitOptions(IpRateLimitOptions options) options.IpWhitelist = clusterConfig.Api?.RateLimiting?.IpWhitelist?.ToList(); // default to whitelist localhost if whitelist absent - if (options.IpWhitelist == null || options.IpWhitelist.Count == 0) + if(options.IpWhitelist == null || options.IpWhitelist.Count == 0) { options.IpWhitelist = new List { @@ -672,7 +672,7 @@ private static void ConfigureIpRateLimitOptions(IpRateLimitOptions options) // limits var rules = clusterConfig.Api?.RateLimiting?.Rules?.ToList(); - if (rules == null || rules.Count == 0) + if(rules == null || rules.Count == 0) { rules = new List { @@ -711,22 +711,24 @@ private static void StartApi() .ConfigureServices(services => { // rate limiting - if (enableApiRateLimiting) + if(enableApiRateLimiting) { services.Configure(ConfigureIpRateLimitOptions); services.AddSingleton(); services.AddSingleton(); + services.AddSingleton(); } + // Controllers + services.AddSingleton(); + services.AddSingleton(); + // MVC services.AddSingleton((IComponentContext) container); services.AddSingleton(); - services.AddSingleton(); - services.AddSingleton(); - services.AddMvc() - .SetCompatibilityVersion(CompatibilityVersion.Version_2_1) + .SetCompatibilityVersion(CompatibilityVersion.Version_2_2) .AddControllersAsServices() .AddJsonOptions(options => { @@ -741,7 +743,7 @@ private static void StartApi() }) .Configure(app => { - if (enableApiRateLimiting) + if(enableApiRateLimiting) app.UseIpRateLimiting(); app.UseMiddleware(); @@ -771,10 +773,10 @@ private static async Task Start() logger.Info($"{coinTemplates.Keys.Count} coins loaded from {string.Join(", ", clusterConfig.CoinTemplates)}"); // Populate pool configs with corresponding template - foreach (var poolConfig in clusterConfig.Pools.Where(x => x.Enabled)) + foreach(var poolConfig in clusterConfig.Pools.Where(x => x.Enabled)) { // Lookup coin definition - if (!coinTemplates.TryGetValue(poolConfig.Coin, out var template)) + if(!coinTemplates.TryGetValue(poolConfig.Coin, out var template)) logger.ThrowLogPoolStartupException($"Pool {poolConfig.Id} references undefined coin '{poolConfig.Coin}'"); poolConfig.Template = template; @@ -787,7 +789,7 @@ private static async Task Start() btStreamReceiver = container.Resolve(); btStreamReceiver.Start(clusterConfig); - if (clusterConfig.ShareRelay == null) + if(clusterConfig.ShareRelay == null) { // start share recorder shareRecorder = container.Resolve(); @@ -806,7 +808,7 @@ private static async Task Start() } // start API - if (clusterConfig.Api == null || clusterConfig.Api.Enabled) + if(clusterConfig.Api == null || clusterConfig.Api.Enabled) { StartApi(); @@ -814,7 +816,7 @@ private static async Task Start() } // start payment processor - if (clusterConfig.PaymentProcessing?.Enabled == true && + if(clusterConfig.PaymentProcessing?.Enabled == true && clusterConfig.Pools.Any(x => x.PaymentProcessing?.Enabled == true)) { payoutManager = container.Resolve(); @@ -826,7 +828,7 @@ private static async Task Start() else logger.Info("Payment processing is not enabled"); - if (clusterConfig.ShareRelay == null) + if(clusterConfig.ShareRelay == null) { // start pool stats updater statsRecorder = container.Resolve(); @@ -866,7 +868,7 @@ private static Task RecoverSharesAsync(string recoveryFilename) private static void OnAppDomainUnhandledException(object sender, UnhandledExceptionEventArgs e) { - if (logger != null) + if(logger != null) { logger.Error(e.ExceptionObject); LogManager.Flush(TimeSpan.Zero); diff --git a/src/Miningcore/Serialization/HexToByteArrayJsonConverter.cs b/src/Miningcore/Serialization/HexToByteArrayJsonConverter.cs index 494ca979b4..cae7f0f1dc 100644 --- a/src/Miningcore/Serialization/HexToByteArrayJsonConverter.cs +++ b/src/Miningcore/Serialization/HexToByteArrayJsonConverter.cs @@ -20,10 +20,10 @@ public override void WriteJson(JsonWriter writer, object value, JsonSerializer s public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) { var str = (string) reader.Value; - if (str.StartsWith("0x")) + if(str.StartsWith("0x")) str = str.Substring(2); - if (string.IsNullOrEmpty(str)) + if(string.IsNullOrEmpty(str)) return null; return str.HexToByteArray(); diff --git a/src/Miningcore/Serialization/HexToIntegralTypeJsonConverter.cs b/src/Miningcore/Serialization/HexToIntegralTypeJsonConverter.cs index c00ab8406d..f86d8b3a95 100644 --- a/src/Miningcore/Serialization/HexToIntegralTypeJsonConverter.cs +++ b/src/Miningcore/Serialization/HexToIntegralTypeJsonConverter.cs @@ -18,7 +18,7 @@ public override bool CanConvert(Type objectType) public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) { - if (value == null) + if(value == null) writer.WriteValue("null"); else writer.WriteValue($"0x{value:x}"); @@ -28,16 +28,16 @@ public override object ReadJson(JsonReader reader, Type objectType, object exist { var str = (string) reader.Value; - if (string.IsNullOrEmpty(str)) + if(string.IsNullOrEmpty(str)) return default(T); - if (str.StartsWith("0x")) + if(str.StartsWith("0x")) str = str.Substring(2); - if (typeof(T) == typeof(BigInteger)) + if(typeof(T) == typeof(BigInteger)) return BigInteger.Parse("0" + str, NumberStyles.HexNumber); - if (typeof(T) == typeof(uint256)) + if(typeof(T) == typeof(uint256)) return new uint256(str.HexToReverseByteArray()); var val = ulong.Parse("0" + str, NumberStyles.HexNumber, CultureInfo.InvariantCulture); diff --git a/src/Miningcore/Stratum/StratumClient.cs b/src/Miningcore/Stratum/StratumClient.cs index d559540de9..89368de931 100644 --- a/src/Miningcore/Stratum/StratumClient.cs +++ b/src/Miningcore/Stratum/StratumClient.cs @@ -105,7 +105,7 @@ public void Run(Socket socket, Action onError) { PoolEndpoint = endpoint.IPEndPoint; - RemoteEndpoint = (IPEndPoint)socket.RemoteEndPoint; + RemoteEndpoint = (IPEndPoint) socket.RemoteEndPoint; expectingProxyHeader = endpoint.PoolEndpoint.TcpProxyProtocol?.Enable == true; @@ -121,9 +121,9 @@ public void Run(Socket socket, networkStream = new NetworkStream(socket, true); logger.Info(() => $"[{ConnectionId}] Accepting connection from {RemoteEndpoint.Address}:{RemoteEndpoint.Port} ..."); - using (var disposables = new CompositeDisposable(networkStream, cts)) + using(var disposables = new CompositeDisposable(networkStream, cts)) { - if (endpoint.PoolEndpoint.Tls) + if(endpoint.PoolEndpoint.Tls) { var sslStream = new SslStream(networkStream, false); disposables.Add(sslStream); @@ -159,14 +159,14 @@ public void Run(Socket socket, // Signal completion or error var error = tasks.FirstOrDefault(t => t.IsFaulted)?.Exception; - if (error == null) + if(error == null) onCompleted(this); else onError(this, error); } } - catch (Exception ex) + catch(Exception ex) { onError(this, ex); } @@ -196,7 +196,7 @@ public void SetContext(T value) where T : WorkerContextBase public T ContextAs() where T : WorkerContextBase { - return (T)context; + return (T) context; } public ValueTask RespondAsync(T payload, object id) @@ -206,7 +206,7 @@ public ValueTask RespondAsync(T payload, object id) public ValueTask RespondErrorAsync(StratumError code, string message, object id, object result = null, object data = null) { - return RespondAsync(new JsonRpcResponse(new JsonRpcException((int)code, message, null), id, result)); + return RespondAsync(new JsonRpcResponse(new JsonRpcException((int) code, message, null), id, result)); } public ValueTask RespondAsync(JsonRpcResponse response) @@ -235,13 +235,13 @@ private async ValueTask SendAsync(T payload) { Contract.RequiresNonNull(payload, nameof(payload)); - using (var ctsTimeout = new CancellationTokenSource()) + using(var ctsTimeout = new CancellationTokenSource()) { - using (var ctsComposite = CancellationTokenSource.CreateLinkedTokenSource(cts.Token, ctsTimeout.Token)) + using(var ctsComposite = CancellationTokenSource.CreateLinkedTokenSource(cts.Token, ctsTimeout.Token)) { ctsTimeout.CancelAfter(sendTimeout); - if (!await sendQueue.SendAsync(payload, ctsComposite.Token)) + if(!await sendQueue.SendAsync(payload, ctsComposite.Token)) { // this will force a disconnect down the line throw new IOException($"Send queue stalled at {sendQueue.Count} of {SendQueueCapacity} items"); @@ -252,7 +252,7 @@ private async ValueTask SendAsync(T payload) private async Task FillReceivePipeAsync() { - while (true) + while(true) { logger.Debug(() => $"[{ConnectionId}] [NET] Waiting for data ..."); @@ -260,7 +260,7 @@ private async Task FillReceivePipeAsync() // read from network directly into pipe memory var cb = await networkStream.ReadAsync(memory, cts.Token); - if (cb == 0) + if(cb == 0) break; // EOF logger.Debug(() => $"[{ConnectionId}] [NET] Received data: {StratumConstants.Encoding.GetString(memory.ToArray(), 0, cb)}"); @@ -271,7 +271,7 @@ private async Task FillReceivePipeAsync() receivePipe.Writer.Advance(cb); var result = await receivePipe.Writer.FlushAsync(cts.Token); - if (result.IsCompleted) + if(result.IsCompleted) break; } } @@ -279,16 +279,16 @@ private async Task FillReceivePipeAsync() private async Task ProcessReceivePipeAsync(TcpProxyProtocolConfig proxyProtocol, Func onRequestAsync) { - while (true) + while(true) { logger.Debug(() => $"[{ConnectionId}] [PIPE] Waiting for data ..."); var result = await receivePipe.Reader.ReadAsync(cts.Token); - + var buffer = result.Buffer; SequencePosition? position = null; - if (buffer.Length > MaxInboundRequestLength) + if(buffer.Length > MaxInboundRequestLength) throw new InvalidDataException($"Incoming data exceeds maximum of {MaxInboundRequestLength}"); logger.Debug(() => $"[{ConnectionId}] [PIPE] Received data: {result.Buffer.AsString(StratumConstants.Encoding)}"); @@ -296,30 +296,30 @@ private async Task ProcessReceivePipeAsync(TcpProxyProtocolConfig proxyProtocol, do { // Scan buffer for line terminator - position = buffer.PositionOf((byte)'\n'); + position = buffer.PositionOf((byte) '\n'); - if (position != null) + if(position != null) { var slice = buffer.Slice(0, position.Value); - if (!expectingProxyHeader || !ProcessProxyHeader(slice, proxyProtocol)) + if(!expectingProxyHeader || !ProcessProxyHeader(slice, proxyProtocol)) await ProcessRequestAsync(onRequestAsync, slice); // Skip consumed section buffer = buffer.Slice(buffer.GetPosition(1, position.Value)); } - } while (position != null); + } while(position != null); receivePipe.Reader.AdvanceTo(buffer.Start, buffer.End); - if (result.IsCompleted) + if(result.IsCompleted) break; } } private async Task ProcessSendQueueAsync() { - while (true) + while(true) { var msg = await sendQueue.ReceiveAsync(cts.Token); @@ -335,10 +335,10 @@ private async Task SendMessage(object msg) try { - using (var stream = new MemoryStream(buffer, true)) + using(var stream = new MemoryStream(buffer, true)) { // serialize - using (var writer = new StreamWriter(stream, StratumConstants.Encoding, MaxOutboundRequestLength, true)) + using(var writer = new StreamWriter(stream, StratumConstants.Encoding, MaxOutboundRequestLength, true)) { serializer.Serialize(writer, msg); } @@ -346,9 +346,9 @@ private async Task SendMessage(object msg) stream.WriteByte((byte) '\n'); // terminator // send - using (var ctsTimeout = new CancellationTokenSource()) + using(var ctsTimeout = new CancellationTokenSource()) { - using (var ctsComposite = CancellationTokenSource.CreateLinkedTokenSource(cts.Token, ctsTimeout.Token)) + using(var ctsComposite = CancellationTokenSource.CreateLinkedTokenSource(cts.Token, ctsTimeout.Token)) { ctsTimeout.CancelAfter(sendTimeout); @@ -369,11 +369,11 @@ private async Task ProcessRequestAsync( Func onRequestAsync, ReadOnlySequence lineBuffer) { - using (var reader = new JsonTextReader(new StreamReader(new MemoryStream(lineBuffer.ToArray()), StratumConstants.Encoding))) + using(var reader = new JsonTextReader(new StreamReader(new MemoryStream(lineBuffer.ToArray()), StratumConstants.Encoding))) { var request = serializer.Deserialize(reader); - if (request == null) + if(request == null) throw new JsonException("Unable to deserialize request"); // Dispatch @@ -391,13 +391,13 @@ private bool ProcessProxyHeader(ReadOnlySequence seq, TcpProxyProtocolConf var line = seq.AsString(StratumConstants.Encoding); var peerAddress = RemoteEndpoint.Address; - if (line.StartsWith("PROXY ")) + if(line.StartsWith("PROXY ")) { var proxyAddresses = proxyProtocol.ProxyAddresses?.Select(x => IPAddress.Parse(x)).ToArray(); - if (proxyAddresses == null || !proxyAddresses.Any()) + if(proxyAddresses == null || !proxyAddresses.Any()) proxyAddresses = new[] { IPAddress.Loopback, IPUtils.IPv4LoopBackOnIPv6, IPAddress.IPv6Loopback }; - if (proxyAddresses.Any(x => x.Equals(peerAddress))) + if(proxyAddresses.Any(x => x.Equals(peerAddress))) { logger.Debug(() => $"[{ConnectionId}] Received Proxy-Protocol header: {line}"); @@ -419,7 +419,7 @@ private bool ProcessProxyHeader(ReadOnlySequence seq, TcpProxyProtocolConf return true; } - else if (proxyProtocol.Mandatory) + else if(proxyProtocol.Mandatory) { throw new InvalidDataException($"[{ConnectionId}] Missing mandatory Proxy-Protocol header from {peerAddress}. Closing connection."); } diff --git a/src/Miningcore/Stratum/StratumServer.cs b/src/Miningcore/Stratum/StratumServer.cs index dc12035b6e..d02261eb85 100644 --- a/src/Miningcore/Stratum/StratumServer.cs +++ b/src/Miningcore/Stratum/StratumServer.cs @@ -59,7 +59,7 @@ protected StratumServer(IComponentContext ctx, IMasterClock clock) static StratumServer() { - if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows)) + if(RuntimeInformation.IsOSPlatform(OSPlatform.Windows)) { ignoredSocketErrors = new HashSet { @@ -69,7 +69,7 @@ static StratumServer() }; } - else if (RuntimeInformation.IsOSPlatform(OSPlatform.Linux)) + else if(RuntimeInformation.IsOSPlatform(OSPlatform.Linux)) { // see: http://www.virtsync.com/c-error-codes-include-errno ignoredSocketErrors = new HashSet @@ -86,7 +86,7 @@ static StratumServer() protected readonly Dictionary clients = new Dictionary(); protected static readonly ConcurrentDictionary certs = new ConcurrentDictionary(); protected static readonly HashSet ignoredSocketErrors; - protected static readonly MethodBase StreamWriterCtor = typeof(StreamWriter).GetConstructor(new []{ typeof(Stream), typeof(Encoding), typeof(int), typeof(bool) }); + protected static readonly MethodBase StreamWriterCtor = typeof(StreamWriter).GetConstructor(new[] { typeof(Stream), typeof(Encoding), typeof(int), typeof(bool) }); protected readonly IComponentContext ctx; protected readonly IMasterClock clock; @@ -110,7 +110,7 @@ public void StartListeners(params (IPEndPoint IPEndPoint, PoolEndpoint PoolEndpo server.Bind(port.IPEndPoint); server.Listen(512); - lock (ports) + lock(ports) { ports[port.IPEndPoint.Port] = server; } @@ -123,7 +123,7 @@ public void StartListeners(params (IPEndPoint IPEndPoint, PoolEndpoint PoolEndpo // Setup accept tasks var tasks = sockets.Select(socket => socket.AcceptAsync()).ToArray(); - while (true) + while(true) { try { @@ -137,11 +137,11 @@ public void StartListeners(params (IPEndPoint IPEndPoint, PoolEndpoint PoolEndpo var port = stratumPorts[i]; // skip running tasks - if (!(task.IsCompleted || task.IsFaulted || task.IsCanceled)) + if(!(task.IsCompleted || task.IsFaulted || task.IsCanceled)) continue; // accept connection if successful - if (task.IsCompletedSuccessfully) + if(task.IsCompletedSuccessfully) AcceptConnection(task.Result, port); // Refresh task @@ -169,7 +169,7 @@ private void AcceptConnection(Socket socket, (IPEndPoint IPEndPoint, PoolEndpoin var connectionId = CorrelationIdGenerator.GetNextId(); // get rid of banned clients as early as possible - if (banManager?.IsBanned(remoteEndpoint.Address) == true) + if(banManager?.IsBanned(remoteEndpoint.Address) == true) { logger.Debug(() => $"Disconnecting banned ip {remoteEndpoint.Address}"); socket.Close(); @@ -179,9 +179,9 @@ private void AcceptConnection(Socket socket, (IPEndPoint IPEndPoint, PoolEndpoin // TLS cert loading X509Certificate2 cert = null; - if (port.PoolEndpoint.Tls) + if(port.PoolEndpoint.Tls) { - if (!certs.TryGetValue(port.PoolEndpoint.TlsPfxFile, out cert)) + if(!certs.TryGetValue(port.PoolEndpoint.TlsPfxFile, out cert)) cert = AddCert(port); } @@ -212,7 +212,7 @@ protected virtual void RegisterClient(StratumClient client, string connectionId) { Contract.RequiresNonNull(client, nameof(client)); - lock (clients) + lock(clients) { clients[connectionId] = client; } @@ -224,9 +224,9 @@ protected virtual void UnregisterClient(StratumClient client) var subscriptionId = client.ConnectionId; - if (!string.IsNullOrEmpty(subscriptionId)) + if(!string.IsNullOrEmpty(subscriptionId)) { - lock (clients) + lock(clients) { clients.Remove(subscriptionId); } @@ -238,7 +238,7 @@ protected virtual void UnregisterClient(StratumClient client) protected async Task OnRequestAsync(StratumClient client, JsonRpcRequest request, CancellationToken ct) { // boot pre-connected clients - if (banManager?.IsBanned(client.RemoteEndpoint.Address) == true) + if(banManager?.IsBanned(client.RemoteEndpoint.Address) == true) { logger.Info(() => $"[{client.ConnectionId}] Disconnecting banned client @ {client.RemoteEndpoint.Address}"); DisconnectClient(client); @@ -252,16 +252,16 @@ protected async Task OnRequestAsync(StratumClient client, JsonRpcRequest request protected virtual void OnClientError(StratumClient client, Exception ex) { - if (ex is AggregateException) + if(ex is AggregateException) ex = ex.InnerException; - if (ex is IOException && ex.InnerException != null) + if(ex is IOException && ex.InnerException != null) ex = ex.InnerException; - switch (ex) + switch(ex) { case SocketException sockEx: - if (!ignoredSocketErrors.Contains(sockEx.ErrorCode)) + if(!ignoredSocketErrors.Contains(sockEx.ErrorCode)) logger.Error(() => $"[{client.ConnectionId}] Connection error state: {ex}"); break; @@ -269,18 +269,18 @@ protected virtual void OnClientError(StratumClient client, Exception ex) // junk received (invalid json) logger.Error(() => $"[{client.ConnectionId}] Connection json error state: {jsonEx.Message}"); - if (clusterConfig.Banning?.BanOnJunkReceive.HasValue == false || clusterConfig.Banning?.BanOnJunkReceive == true) + if(clusterConfig.Banning?.BanOnJunkReceive.HasValue == false || clusterConfig.Banning?.BanOnJunkReceive == true) { logger.Info(() => $"[{client.ConnectionId}] Banning client for sending junk"); banManager?.Ban(client.RemoteEndpoint.Address, TimeSpan.FromMinutes(3)); } break; - + case AuthenticationException authEx: // junk received (SSL handshake) logger.Error(() => $"[{client.ConnectionId}] Connection json error state: {authEx.Message}"); - if (clusterConfig.Banning?.BanOnJunkReceive.HasValue == false || clusterConfig.Banning?.BanOnJunkReceive == true) + if(clusterConfig.Banning?.BanOnJunkReceive.HasValue == false || clusterConfig.Banning?.BanOnJunkReceive == true) { logger.Info(() => $"[{client.ConnectionId}] Banning client for failing SSL handshake"); banManager?.Ban(client.RemoteEndpoint.Address, TimeSpan.FromMinutes(3)); @@ -291,9 +291,9 @@ protected virtual void OnClientError(StratumClient client, Exception ex) // junk received (SSL handshake) logger.Error(() => $"[{client.ConnectionId}] Connection json error state: {ioEx.Message}"); - if (ioEx.Source == "System.Net.Security") + if(ioEx.Source == "System.Net.Security") { - if (clusterConfig.Banning?.BanOnJunkReceive.HasValue == false || clusterConfig.Banning?.BanOnJunkReceive == true) + if(clusterConfig.Banning?.BanOnJunkReceive.HasValue == false || clusterConfig.Banning?.BanOnJunkReceive == true) { logger.Info(() => $"[{client.ConnectionId}] Banning client for failing SSL handshake"); banManager?.Ban(client.RemoteEndpoint.Address, TimeSpan.FromMinutes(3)); @@ -346,7 +346,7 @@ private X509Certificate2 AddCert((IPEndPoint IPEndPoint, PoolEndpoint PoolEndpoi return tlsCert; } - catch (Exception ex) + catch(Exception ex) { logger.Info(() => $"Failed to load TLS certificate {port.PoolEndpoint.TlsPfxFile}: {ex.Message}"); throw; @@ -380,7 +380,7 @@ protected IEnumerable ForEachClient(Func func) { StratumClient[] tmp; - lock (clients) + lock(clients) { tmp = clients.Values.ToArray(); } diff --git a/src/Miningcore/Util/BigRational.cs b/src/Miningcore/Util/BigRational.cs index b38df5b447..913a53e989 100644 --- a/src/Miningcore/Util/BigRational.cs +++ b/src/Miningcore/Util/BigRational.cs @@ -155,10 +155,10 @@ public BigRational GetFractionPart() public override bool Equals(object obj) { - if (obj == null) + if(obj == null) return false; - if (!(obj is BigRational)) + if(!(obj is BigRational)) return false; return Equals((BigRational) obj); } @@ -171,9 +171,9 @@ public override int GetHashCode() // IComparable int IComparable.CompareTo(object obj) { - if (obj == null) + if(obj == null) return 1; - if (!(obj is BigRational)) + if(!(obj is BigRational)) throw new ArgumentException("Argument must be of type BigRational", "obj"); return Compare(this, (BigRational) obj); } @@ -198,7 +198,7 @@ public override string ToString() // a/b = c/d, iff ad = bc public bool Equals(BigRational other) { - if (Denominator == other.Denominator) + if(Denominator == other.Denominator) return m_numerator == other.m_numerator; return m_numerator * other.Denominator == Denominator * other.m_numerator; } @@ -218,14 +218,14 @@ public BigRational(BigInteger numerator) // BigRational(Double) public BigRational(double value) { - if (double.IsNaN(value)) + if(double.IsNaN(value)) throw new ArgumentException("Argument is not a number", nameof(value)); - if (double.IsInfinity(value)) + if(double.IsInfinity(value)) throw new ArgumentException("Argument is infinity", nameof(value)); SplitDoubleIntoParts(value, out var sign, out var exponent, out var significand, out _); - if (significand == 0) + if(significand == 0) { this = Zero; return; @@ -234,11 +234,11 @@ public BigRational(double value) m_numerator = significand; Denominator = 1 << 52; - if (exponent > 0) + if(exponent > 0) m_numerator = BigInteger.Pow(m_numerator, exponent); - else if (exponent < 0) + else if(exponent < 0) Denominator = BigInteger.Pow(Denominator, -exponent); - if (sign < 0) + if(sign < 0) m_numerator = BigInteger.Negate(m_numerator); Simplify(); } @@ -251,11 +251,11 @@ public BigRational(double value) public BigRational(decimal value) { var bits = decimal.GetBits(value); - if (bits == null || bits.Length != 4 || (bits[3] & ~(DecimalSignMask | DecimalScaleMask)) != 0 || + if(bits == null || bits.Length != 4 || (bits[3] & ~(DecimalSignMask | DecimalScaleMask)) != 0 || (bits[3] & DecimalScaleMask) > 28 << 16) throw new ArgumentException("invalid Decimal", nameof(value)); - if (value == decimal.Zero) + if(value == decimal.Zero) { this = Zero; return; @@ -266,7 +266,7 @@ public BigRational(decimal value) m_numerator = (new BigInteger(ul) << 32) | (uint) bits[0]; // (hiMid << 32) | (low) var isNegative = (bits[3] & DecimalSignMask) != 0; - if (isNegative) + if(isNegative) m_numerator = BigInteger.Negate(m_numerator); // build up the denominator @@ -278,15 +278,15 @@ public BigRational(decimal value) public BigRational(BigInteger numerator, BigInteger denominator) { - if (denominator.Sign == 0) + if(denominator.Sign == 0) throw new DivideByZeroException(); - if (numerator.Sign == 0) + if(numerator.Sign == 0) { // 0/m -> 0/1 m_numerator = BigInteger.Zero; Denominator = BigInteger.One; } - else if (denominator.Sign < 0) + else if(denominator.Sign < 0) { m_numerator = BigInteger.Negate(numerator); Denominator = BigInteger.Negate(denominator); @@ -302,14 +302,14 @@ public BigRational(BigInteger numerator, BigInteger denominator) public BigRational(BigInteger whole, BigInteger numerator, BigInteger denominator) { - if (denominator.Sign == 0) + if(denominator.Sign == 0) throw new DivideByZeroException(); - if (numerator.Sign == 0 && whole.Sign == 0) + if(numerator.Sign == 0 && whole.Sign == 0) { m_numerator = BigInteger.Zero; Denominator = BigInteger.One; } - else if (denominator.Sign < 0) + else if(denominator.Sign < 0) { Denominator = BigInteger.Negate(denominator); m_numerator = BigInteger.Negate(whole) * Denominator + BigInteger.Negate(numerator); @@ -385,11 +385,11 @@ public static BigRational DivRem(BigRational dividend, BigRational divisor, out public static BigRational Pow(BigRational baseValue, BigInteger exponent) { - if (exponent.Sign == 0) + if(exponent.Sign == 0) return One; - if (exponent.Sign < 0) + if(exponent.Sign < 0) { - if (baseValue == Zero) + if(baseValue == Zero) throw new ArgumentException("cannot raise zero to a negative power", nameof(baseValue)); // n^(-e) -> (1/n)^e baseValue = Invert(baseValue); @@ -584,12 +584,12 @@ public static explicit operator double(BigRational value) // The Double value type represents a double-precision 64-bit number with // values ranging from -1.79769313486232e308 to +1.79769313486232e308 // values that do not fit into this range are returned as +/-Infinity - if (SafeCastToDouble(value.m_numerator) && SafeCastToDouble(value.Denominator)) + if(SafeCastToDouble(value.m_numerator) && SafeCastToDouble(value.Denominator)) return (double) value.m_numerator / (double) value.Denominator; // scale the numerator to preseve the fraction part through the integer division var denormalized = value.m_numerator * s_bnDoublePrecision / value.Denominator; - if (denormalized.IsZero) + if(denormalized.IsZero) return value.Sign < 0 ? BitConverter.Int64BitsToDouble(unchecked((long) 0x8000000000000000)) : 0d; // underflow to -+0 @@ -600,8 +600,8 @@ public static explicit operator double(BigRational value) while(scale > 0) { - if (!isDouble) - if (SafeCastToDouble(denormalized)) + if(!isDouble) + if(SafeCastToDouble(denormalized)) { result = (double) denormalized; isDouble = true; @@ -615,7 +615,7 @@ public static explicit operator double(BigRational value) scale--; } - if (!isDouble) + if(!isDouble) return value.Sign < 0 ? double.NegativeInfinity : double.PositiveInfinity; return result; } @@ -625,15 +625,15 @@ public static explicit operator decimal(BigRational value) // The Decimal value type represents decimal numbers ranging // from +79,228,162,514,264,337,593,543,950,335 to -79,228,162,514,264,337,593,543,950,335 // the binary representation of a Decimal value is of the form, ((-2^96 to 2^96) / 10^(0 to 28)) - if (SafeCastToDecimal(value.m_numerator) && SafeCastToDecimal(value.Denominator)) + if(SafeCastToDecimal(value.m_numerator) && SafeCastToDecimal(value.Denominator)) return (decimal) value.m_numerator / (decimal) value.Denominator; // scale the numerator to preseve the fraction part through the integer division var denormalized = value.m_numerator * s_bnDecimalPrecision / value.Denominator; - if (denormalized.IsZero) + if(denormalized.IsZero) return decimal.Zero; // underflow - fraction is too small to fit in a decimal for(var scale = DecimalMaxScale; scale >= 0; scale--) - if (!SafeCastToDecimal(denormalized)) + if(!SafeCastToDecimal(denormalized)) { denormalized = denormalized / 10; } @@ -729,14 +729,14 @@ void IDeserializationCallback.OnDeserialization(object sender) try { // verify that the deserialized number is well formed - if (Denominator.Sign == 0 || m_numerator.Sign == 0) + if(Denominator.Sign == 0 || m_numerator.Sign == 0) { // n/0 -> 0/1 // 0/m -> 0/1 m_numerator = BigInteger.Zero; Denominator = BigInteger.One; } - else if (Denominator.Sign < 0) + else if(Denominator.Sign < 0) { m_numerator = BigInteger.Negate(m_numerator); Denominator = BigInteger.Negate(Denominator); @@ -753,7 +753,7 @@ void IDeserializationCallback.OnDeserialization(object sender) [SecurityPermission(SecurityAction.LinkDemand, Flags = SecurityPermissionFlag.SerializationFormatter)] void ISerializable.GetObjectData(SerializationInfo info, StreamingContext context) { - if (info == null) + if(info == null) throw new ArgumentNullException(nameof(info)); info.AddValue("Numerator", m_numerator); @@ -762,7 +762,7 @@ void ISerializable.GetObjectData(SerializationInfo info, StreamingContext contex private BigRational(SerializationInfo info, StreamingContext context) { - if (info == null) + if(info == null) throw new ArgumentNullException(nameof(info)); m_numerator = (BigInteger) info.GetValue("Numerator", typeof(BigInteger)); @@ -779,11 +779,11 @@ private void Simplify() { // * if the numerator is {0, +1, -1} then the fraction is already reduced // * if the denominator is {+1} then the fraction is already reduced - if (m_numerator == BigInteger.Zero) + if(m_numerator == BigInteger.Zero) Denominator = BigInteger.One; var gcd = BigInteger.GreatestCommonDivisor(m_numerator, Denominator); - if (gcd > BigInteger.One) + if(gcd > BigInteger.One) { m_numerator = m_numerator / gcd; Denominator = Denominator / gcd; @@ -816,14 +816,14 @@ private static void SplitDoubleIntoParts(double dbl, out int sign, out int exp, sign = 1 - ((int) (du.uu >> 62) & 2); man = du.uu & 0x000FFFFFFFFFFFFF; exp = (int) (du.uu >> 52) & 0x7FF; - if (exp == 0) + if(exp == 0) { // Denormalized number. isFinite = true; - if (man != 0) + if(man != 0) exp = -1074; } - else if (exp == 0x7FF) + else if(exp == 0x7FF) { // NaN or Infinite. isFinite = false; @@ -842,7 +842,7 @@ private static double GetDoubleFromParts(int sign, int exp, ulong man) DoubleUlong du; du.dbl = 0; - if (man == 0) + if(man == 0) { du.uu = 0; } @@ -850,7 +850,7 @@ private static double GetDoubleFromParts(int sign, int exp, ulong man) { // Normalize so that 0x0010 0000 0000 0000 is the highest bit set var cbitShift = CbitHighZero(man) - 11; - if (cbitShift < 0) + if(cbitShift < 0) man >>= -cbitShift; else man <<= cbitShift; @@ -859,16 +859,16 @@ private static double GetDoubleFromParts(int sign, int exp, ulong man) // (52 bits) and skew the exponent (by 0x3FF == 1023) exp += 1075; - if (exp >= 0x7FF) + if(exp >= 0x7FF) { // Infinity du.uu = 0x7FF0000000000000; } - else if (exp <= 0) + else if(exp <= 0) { // Denormalized exp--; - if (exp < -52) + if(exp < -52) du.uu = 0; else du.uu = man >> -exp; @@ -880,7 +880,7 @@ private static double GetDoubleFromParts(int sign, int exp, ulong man) } } - if (sign < 0) + if(sign < 0) du.uu |= 0x8000000000000000; return du.dbl; @@ -888,42 +888,42 @@ private static double GetDoubleFromParts(int sign, int exp, ulong man) private static int CbitHighZero(ulong uu) { - if ((uu & 0xFFFFFFFF00000000) == 0) + if((uu & 0xFFFFFFFF00000000) == 0) return 32 + CbitHighZero((uint) uu); return CbitHighZero((uint) (uu >> 32)); } private static int CbitHighZero(uint u) { - if (u == 0) + if(u == 0) return 32; var cbit = 0; - if ((u & 0xFFFF0000) == 0) + if((u & 0xFFFF0000) == 0) { cbit += 16; u <<= 16; } - if ((u & 0xFF000000) == 0) + if((u & 0xFF000000) == 0) { cbit += 8; u <<= 8; } - if ((u & 0xF0000000) == 0) + if((u & 0xF0000000) == 0) { cbit += 4; u <<= 4; } - if ((u & 0xC0000000) == 0) + if((u & 0xC0000000) == 0) { cbit += 2; u <<= 2; } - if ((u & 0x80000000) == 0) + if((u & 0x80000000) == 0) cbit += 1; return cbit; } diff --git a/src/Miningcore/Util/CircularBuffer.cs b/src/Miningcore/Util/CircularBuffer.cs index a5e31dad13..1cd69f164c 100644 --- a/src/Miningcore/Util/CircularBuffer.cs +++ b/src/Miningcore/Util/CircularBuffer.cs @@ -61,12 +61,12 @@ public CircularBuffer(int capacity) /// public CircularBuffer(int capacity, T[] items) { - if (capacity < 1) + if(capacity < 1) throw new ArgumentException( "Circular buffer cannot have negative or zero capacity.", nameof(capacity)); - if (items == null) + if(items == null) throw new ArgumentNullException(nameof(items)); - if (items.Length > capacity) + if(items.Length > capacity) throw new ArgumentException( "Too many items to fit circular buffer", nameof(items)); @@ -115,10 +115,10 @@ public T this[int index] { get { - if (IsEmpty) + if(IsEmpty) throw new IndexOutOfRangeException( string.Format("Cannot access index {0}. Buffer is empty", index)); - if (index >= size) + if(index >= size) throw new IndexOutOfRangeException( string.Format("Cannot access index {0}. Buffer size is {1}", index, size)); var actualIndex = InternalIndex(index); @@ -126,10 +126,10 @@ public T this[int index] } set { - if (IsEmpty) + if(IsEmpty) throw new IndexOutOfRangeException( string.Format("Cannot access index {0}. Buffer is empty", index)); - if (index >= size) + if(index >= size) throw new IndexOutOfRangeException( string.Format("Cannot access index {0}. Buffer size is {1}", index, size)); var actualIndex = InternalIndex(index); @@ -187,7 +187,7 @@ public T Back() /// Item to push to the back of the buffer public void PushBack(T item) { - if (IsFull) + if(IsFull) { buffer[end] = item; Increment(ref end); @@ -210,7 +210,7 @@ public void PushBack(T item) /// Item to push to the front of the buffer public void PushFront(T item) { - if (IsFull) + if(IsFull) { Decrement(ref start); end = start; @@ -270,7 +270,7 @@ public T[] ToArray() private void ThrowIfEmpty(string message = "Cannot access an empty buffer.") { - if (IsEmpty) + if(IsEmpty) throw new InvalidOperationException(message); } @@ -281,7 +281,7 @@ private void ThrowIfEmpty(string message = "Cannot access an empty buffer.") /// private void Increment(ref int index) { - if (++index == Capacity) + if(++index == Capacity) index = 0; } @@ -292,7 +292,7 @@ private void Increment(ref int index) /// private void Decrement(ref int index) { - if (index == 0) + if(index == 0) index = Capacity; index--; } @@ -323,14 +323,14 @@ private int InternalIndex(int index) private ArraySegment ArrayOne() { - if (start < end) + if(start < end) return new ArraySegment(buffer, start, end - start); return new ArraySegment(buffer, start, buffer.Length - start); } private ArraySegment ArrayTwo() { - if (start < end) + if(start < end) return new ArraySegment(buffer, end, 0); return new ArraySegment(buffer, 0, end); } diff --git a/src/Miningcore/Util/ScheduledSubject.cs b/src/Miningcore/Util/ScheduledSubject.cs index efd98ec2eb..b604ec9e12 100644 --- a/src/Miningcore/Util/ScheduledSubject.cs +++ b/src/Miningcore/Util/ScheduledSubject.cs @@ -15,7 +15,7 @@ public ScheduledSubject(IScheduler scheduler, IObserver defaultObserver = nul _defaultObserver = defaultObserver; _subject = defaultSubject ?? new Subject(); - if (defaultObserver != null) + if(defaultObserver != null) _defaultObserverSub = _subject.ObserveOn(_scheduler).Subscribe(_defaultObserver); } @@ -51,14 +51,14 @@ public IDisposable Subscribe(IObserver observer) _subject.ObserveOn(_scheduler).Subscribe(observer), Disposable.Create(() => { - if (Interlocked.Decrement(ref _observerRefCount) <= 0 && _defaultObserver != null) + if(Interlocked.Decrement(ref _observerRefCount) <= 0 && _defaultObserver != null) _defaultObserverSub = _subject.ObserveOn(_scheduler).Subscribe(_defaultObserver); })); } public void Dispose() { - if (_subject is IDisposable) + if(_subject is IDisposable) ((IDisposable) _subject).Dispose(); } } diff --git a/src/Miningcore/VarDiff/VarDiffManager.cs b/src/Miningcore/VarDiff/VarDiffManager.cs index 0bba5c0ef1..e4d776e9f3 100644 --- a/src/Miningcore/VarDiff/VarDiffManager.cs +++ b/src/Miningcore/VarDiff/VarDiffManager.cs @@ -55,7 +55,7 @@ public VarDiffManager(VarDiffConfig varDiffOptions, IMasterClock clock) var ts = DateTimeOffset.Now.ToUnixTimeMilliseconds() / 1000.0; // For the first time, won't change diff. - if (!ctx.LastTs.HasValue) + if(!ctx.LastTs.HasValue) { ctx.LastRtc = ts; ctx.LastTs = ts; @@ -73,41 +73,41 @@ public VarDiffManager(VarDiffConfig varDiffOptions, IMasterClock clock) var avg = (timeTotal + sinceLast) / (timeCount + 1); // Once there is a share submitted, store the time into the buffer and update the last time. - if (!isIdleUpdate) + if(!isIdleUpdate) { ctx.TimeBuffer.PushBack(sinceLast); ctx.LastTs = ts; } // Check if we need to change the difficulty - if (ts - ctx.LastRtc < options.RetargetTime || avg >= tMin && avg <= tMax) + if(ts - ctx.LastRtc < options.RetargetTime || avg >= tMin && avg <= tMax) return null; // Possible New Diff var newDiff = difficulty * options.TargetTime / avg; // Max delta - if (options.MaxDelta.HasValue && options.MaxDelta > 0) + if(options.MaxDelta.HasValue && options.MaxDelta > 0) { var delta = Math.Abs(newDiff - difficulty); - if (delta > options.MaxDelta) + if(delta > options.MaxDelta) { - if (newDiff > difficulty) + if(newDiff > difficulty) newDiff -= delta - options.MaxDelta.Value; - else if (newDiff < difficulty) + else if(newDiff < difficulty) newDiff += delta - options.MaxDelta.Value; } } // Clamp to valid range - if (newDiff < minDiff) + if(newDiff < minDiff) newDiff = minDiff; - if (newDiff > maxDiff) + if(newDiff > maxDiff) newDiff = maxDiff; // RTC if the Diff is changed - if (newDiff < difficulty || newDiff > difficulty) + if(newDiff < difficulty || newDiff > difficulty) { ctx.LastRtc = ts; ctx.LastUpdate = clock.Now; diff --git a/src/Native/libcryptonight/exports.cpp b/src/Native/libcryptonight/exports.cpp index d3704b5db4..45146c5642 100644 --- a/src/Native/libcryptonight/exports.cpp +++ b/src/Native/libcryptonight/exports.cpp @@ -31,7 +31,7 @@ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. #if (defined(__AES__) && (__AES__ == 1)) || (defined(__ARM_FEATURE_CRYPTO) && (__ARM_FEATURE_CRYPTO == 1)) #define SOFT_AES false #else -#warning Using software AES +// #warning Using software AES #define SOFT_AES true #endif @@ -41,6 +41,9 @@ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. #define MODULE_API #endif +#define STRINGISE_IMPL(x) #x +#define STRINGISE(x) STRINGISE_IMPL(x) + extern "C" MODULE_API cryptonight_ctx *cryptonight_alloc_context_export() { cryptonight_ctx *ctx = NULL; Mem::create(&ctx, xmrig::CRYPTONIGHT, 1); @@ -77,34 +80,28 @@ extern "C" MODULE_API void cryptonight_free_ctx_export(cryptonight_ctx *ctx) { extern "C" MODULE_API void cryptonight_export(cryptonight_ctx* ctx, const char* input, unsigned char *output, size_t inputSize, uint32_t variant, uint64_t height) { switch (variant) { - case 0: - cryptonight_single_hash(reinterpret_cast(input), inputSize, reinterpret_cast(output), &ctx, height); + case 0: cryptonight_single_hash(reinterpret_cast(input), inputSize, reinterpret_cast(output), &ctx, height); break; - case 1: - cryptonight_single_hash(reinterpret_cast(input), inputSize, reinterpret_cast(output), &ctx, height); + case 1: cryptonight_single_hash(reinterpret_cast(input), inputSize, reinterpret_cast(output), &ctx, height); break; - case 3: - cryptonight_single_hash(reinterpret_cast(input), inputSize, reinterpret_cast(output), &ctx, height); + case 3: cryptonight_single_hash(reinterpret_cast(input), inputSize, reinterpret_cast(output), &ctx, height); break; - case 4: - cryptonight_single_hash(reinterpret_cast(input), inputSize, reinterpret_cast(output), &ctx, height); + case 4: cryptonight_single_hash(reinterpret_cast(input), inputSize, reinterpret_cast(output), &ctx, height); break; - case 6: - cryptonight_single_hash(reinterpret_cast(input), inputSize, reinterpret_cast(output), &ctx, height); + case 6: cryptonight_single_hash(reinterpret_cast(input), inputSize, reinterpret_cast(output), &ctx, height); break; - case 7: - cryptonight_single_hash(reinterpret_cast(input), inputSize, reinterpret_cast(output), &ctx, height); + case 7: cryptonight_single_hash(reinterpret_cast(input), inputSize, reinterpret_cast(output), &ctx, height); break; case 8: #if !SOFT_AES && defined(CPU_INTEL) - //#warning Using IvyBridge assembler implementation + // #warning Using IvyBridge assembler implementation cryptonight_single_hash_asm(reinterpret_cast(input), inputSize, reinterpret_cast(output), &ctx, height); #elif !SOFT_AES && defined(CPU_AMD) - #warning Using Ryzen assembler implementation + // #warning Using Ryzen assembler implementation cryptonight_single_hash_asm(reinterpret_cast(input), inputSize, reinterpret_cast(output), &ctx, height); #elif !SOFT_AES && defined(CPU_AMD_OLD) - #warning Using Bulldozer assembler implementation + // #warning Using Bulldozer assembler implementation cryptonight_single_hash_asm(reinterpret_cast(input), inputSize, reinterpret_cast(output), &ctx, height); #else cryptonight_single_hash (reinterpret_cast(input), inputSize, reinterpret_cast(output), &ctx, height); @@ -113,20 +110,19 @@ extern "C" MODULE_API void cryptonight_export(cryptonight_ctx* ctx, const char* case 9: #if !SOFT_AES && defined(CPU_INTEL) - //#warning Using IvyBridge assembler implementation + // #warning Using IvyBridge assembler implementation cryptonight_single_hash_asm(reinterpret_cast(input), inputSize, reinterpret_cast(output), &ctx, height); #elif !SOFT_AES && defined(CPU_AMD) - #warning Using Ryzen assembler implementation + // #warning Using Ryzen assembler implementation cryptonight_single_hash_asm(reinterpret_cast(input), inputSize, reinterpret_cast(output), &ctx, height); #elif !SOFT_AES && defined(CPU_AMD_OLD) - #warning Using Bulldozer assembler implementation + // #warning Using Bulldozer assembler implementation cryptonight_single_hash_asm(reinterpret_cast(input), inputSize, reinterpret_cast(output), &ctx, height); #else cryptonight_single_hash (reinterpret_cast(input), inputSize, reinterpret_cast(output), &ctx, height); #endif break; - case 11: - cryptonight_single_hash_gpu(reinterpret_cast(input), inputSize, reinterpret_cast(output), &ctx, height); + case 11: cryptonight_single_hash_gpu(reinterpret_cast(input), inputSize, reinterpret_cast(output), &ctx, height); break; case 12: //if (!height_set) return THROW_ERROR_EXCEPTION("CryptonightR requires block template height as Argument 3"); @@ -141,21 +137,54 @@ extern "C" MODULE_API void cryptonight_export(cryptonight_ctx* ctx, const char* //if (!height_set) return THROW_ERROR_EXCEPTION("Cryptonight4 requires block template height as Argument 3"); #if !SOFT_AES && defined(CPU_INTEL) - //#warning Using IvyBridge assembler implementation + // #warning Using IvyBridge assembler implementation cryptonight_single_hash_asm(reinterpret_cast(input), inputSize, reinterpret_cast(output), &ctx, height); #elif !SOFT_AES && defined(CPU_AMD) - #warning Using Ryzen assembler implementation + // #warning Using Ryzen assembler implementation cryptonight_single_hash_asm(reinterpret_cast(input), inputSize, reinterpret_cast(output), &ctx, height); #elif !SOFT_AES && defined(CPU_AMD_OLD) - #warning Using Bulldozer assembler implementation + // #warning Using Bulldozer assembler implementation cryptonight_single_hash_asm(reinterpret_cast(input), inputSize, reinterpret_cast(output), &ctx, height); #else cryptonight_single_hash (reinterpret_cast(input), inputSize, reinterpret_cast(output), &ctx, height); #endif break; - default: - cryptonight_single_hash(reinterpret_cast(input), inputSize, reinterpret_cast(output), &ctx, height); + case 14: + cryptonight_single_hash(reinterpret_cast(input), inputSize, reinterpret_cast(output), &ctx, height); + break; + + case 15: +#if !SOFT_AES && defined(CPU_INTEL) + // #warning Using IvyBridge assembler implementation + cryptonight_single_hash_asm(reinterpret_cast(input), inputSize, reinterpret_cast(output), &ctx, height); +#elif !SOFT_AES && defined(CPU_AMD) + // #warning Using Ryzen assembler implementation + cryptonight_single_hash_asm(reinterpret_cast(input), inputSize, reinterpret_cast(output), &ctx, height); +#elif !SOFT_AES && defined(CPU_AMD_OLD) + // #warning Using Bulldozer assembler implementation + cryptonight_single_hash_asm(reinterpret_cast(input), inputSize, reinterpret_cast(output), &ctx, height); +#else + cryptonight_single_hash (reinterpret_cast(input), inputSize, reinterpret_cast(output), &ctx, height); +#endif + break; + + case 16: +#if !SOFT_AES && defined(CPU_INTEL) + // #warning Using IvyBridge assembler implementation + cryptonight_single_hash_asm(reinterpret_cast(input), inputSize, reinterpret_cast(output), &ctx, height); +#elif !SOFT_AES && defined(CPU_AMD) + // #warning Using Ryzen assembler implementation + cryptonight_single_hash_asm(reinterpret_cast(input), inputSize, reinterpret_cast(output), &ctx, height); +#elif !SOFT_AES && defined(CPU_AMD_OLD) + // #warning Using Bulldozer assembler implementation + cryptonight_single_hash_asm(reinterpret_cast(input), inputSize, reinterpret_cast(output), &ctx, height); +#else + cryptonight_single_hash (reinterpret_cast(input), inputSize, reinterpret_cast(output), &ctx, height); +#endif + break; + + default: cryptonight_single_hash(reinterpret_cast(input), inputSize, reinterpret_cast(output), &ctx, height); } } diff --git a/src/Native/libcryptonight/libcryptonight.vcxproj b/src/Native/libcryptonight/libcryptonight.vcxproj index 2fa7b019a7..520aa16cbd 100644 --- a/src/Native/libcryptonight/libcryptonight.vcxproj +++ b/src/Native/libcryptonight/libcryptonight.vcxproj @@ -211,18 +211,15 @@ + - Document Document - - - diff --git a/src/Native/libcryptonight/xmrig/Mem_win.cpp b/src/Native/libcryptonight/xmrig/Mem_win.cpp index e6b4353a1b..372ed5fa40 100644 --- a/src/Native/libcryptonight/xmrig/Mem_win.cpp +++ b/src/Native/libcryptonight/xmrig/Mem_win.cpp @@ -30,6 +30,7 @@ #include +//#include "common/log/Log.h" #include "common/utils/mm_malloc.h" #include "common/xmrig.h" #include "crypto/CryptoNight.h" diff --git a/src/Native/libcryptonight/xmrig/common/xmrig.h b/src/Native/libcryptonight/xmrig/common/xmrig.h index c6a5f5688c..e8ca8857e0 100644 --- a/src/Native/libcryptonight/xmrig/common/xmrig.h +++ b/src/Native/libcryptonight/xmrig/common/xmrig.h @@ -61,21 +61,24 @@ enum AlgoVariant { enum Variant { - VARIANT_AUTO = -1, // Autodetect - VARIANT_0 = 0, // Original CryptoNight or CryptoNight-Heavy - VARIANT_1 = 1, // CryptoNight variant 1 also known as Monero7 and CryptoNightV7 - VARIANT_TUBE = 2, // Modified CryptoNight-Heavy (TUBE only) - VARIANT_XTL = 3, // Modified CryptoNight variant 1 (Stellite only) - VARIANT_MSR = 4, // Modified CryptoNight variant 1 (Masari only) - VARIANT_XHV = 5, // Modified CryptoNight-Heavy (Haven Protocol only) - VARIANT_XAO = 6, // Modified CryptoNight variant 0 (Alloy only) - VARIANT_RTO = 7, // Modified CryptoNight variant 1 (Arto only) - VARIANT_2 = 8, // CryptoNight variant 2 - VARIANT_HALF = 9, // CryptoNight variant 2 with half iterations (Masari/Stellite) - VARIANT_TRTL = 10, // CryptoNight Turtle (TRTL) - VARIANT_GPU = 11, // CryptoNight-GPU (Ryo) - VARIANT_WOW = 12, // CryptoNightR (Wownero) - VARIANT_4 = 13, // CryptoNightR (Monero's variant 4) + VARIANT_AUTO = -1, // Autodetect + VARIANT_0 = 0, // Original CryptoNight or CryptoNight-Heavy + VARIANT_1 = 1, // CryptoNight variant 1 also known as Monero7 and CryptoNightV7 + VARIANT_TUBE = 2, // Modified CryptoNight-Heavy (TUBE only) + VARIANT_XTL = 3, // Modified CryptoNight variant 1 (Stellite only) + VARIANT_MSR = 4, // Modified CryptoNight variant 1 (Masari only) + VARIANT_XHV = 5, // Modified CryptoNight-Heavy (Haven Protocol only) + VARIANT_XAO = 6, // Modified CryptoNight variant 0 (Alloy only) + VARIANT_RTO = 7, // Modified CryptoNight variant 1 (Arto only) + VARIANT_2 = 8, // CryptoNight variant 2 + VARIANT_HALF = 9, // CryptoNight variant 2 with half iterations (Masari/Stellite) + VARIANT_TRTL = 10, // CryptoNight Turtle (TRTL) + VARIANT_GPU = 11, // CryptoNight-GPU (Ryo) + VARIANT_WOW = 12, // CryptoNightR (Wownero) + VARIANT_4 = 13, // CryptoNightR (Monero's variant 4) + VARIANT_RWZ = 14, // CryptoNight variant 2 with 3/4 iterations and reversed shuffle operation (Graft) + VARIANT_ZLS = 15, // CryptoNight variant 2 with 3/4 iterations (Zelerius) + VARIANT_DOUBLE = 16, // CryptoNight variant 2 with double iterations (X-CASH) VARIANT_MAX }; diff --git a/src/Native/libcryptonight/xmrig/crypto/CryptoNight.h b/src/Native/libcryptonight/xmrig/crypto/CryptoNight.h index b92945e4e3..91a4c7b71e 100644 --- a/src/Native/libcryptonight/xmrig/crypto/CryptoNight.h +++ b/src/Native/libcryptonight/xmrig/crypto/CryptoNight.h @@ -49,6 +49,10 @@ struct cryptonight_r_data { struct cryptonight_ctx { alignas(16) uint8_t state[224]; alignas(16) uint8_t *memory; + + uint8_t unused[40]; + const uint32_t* saes_table; + cn_mainloop_fun_ms_abi generated_code; cn_mainloop_double_fun_ms_abi generated_code_double; cryptonight_r_data generated_code_data; diff --git a/src/Native/libcryptonight/xmrig/crypto/CryptoNight_arm.h b/src/Native/libcryptonight/xmrig/crypto/CryptoNight_arm.h index e7232eb1f3..d762929c2b 100644 --- a/src/Native/libcryptonight/xmrig/crypto/CryptoNight_arm.h +++ b/src/Native/libcryptonight/xmrig/crypto/CryptoNight_arm.h @@ -436,7 +436,7 @@ static inline void cryptonight_monero_tweak(const uint8_t* l, uint64_t idx, __m1 uint64_t* mem_out = (uint64_t*)&l[idx]; if (BASE == xmrig::VARIANT_2) { - VARIANT2_SHUFFLE(l, idx, ax0, bx0, bx1, cx); + VARIANT2_SHUFFLE(l, idx, ax0, bx0, bx1, cx, (VARIANT == xmrig::VARIANT_RWZ ? 1 : 0)); _mm_store_si128((__m128i *)mem_out, _mm_xor_si128(bx0, cx)); } else { __m128i tmp = _mm_xor_si128(bx0, cx); @@ -530,9 +530,9 @@ inline void cryptonight_single_hash(const uint8_t *__restrict__ input, size_t si if (BASE == xmrig::VARIANT_2) { if (VARIANT == xmrig::VARIANT_4) { - VARIANT2_SHUFFLE(l0, idx0 & MASK, ax0, bx0, bx1, cx); + VARIANT2_SHUFFLE(l0, idx0 & MASK, ax0, bx0, bx1, cx, 0); } else { - VARIANT2_SHUFFLE2(l0, idx0 & MASK, ax0, bx0, bx1, hi, lo); + VARIANT2_SHUFFLE2(l0, idx0 & MASK, ax0, bx0, bx1, hi, lo, (VARIANT == xmrig::VARIANT_RWZ ? 1 : 0)); } } @@ -709,9 +709,9 @@ inline void cryptonight_double_hash(const uint8_t *__restrict__ input, size_t si if (BASE == xmrig::VARIANT_2) { if (VARIANT == xmrig::VARIANT_4) { - VARIANT2_SHUFFLE(l0, idx0 & MASK, ax0, bx00, bx01, cx0); + VARIANT2_SHUFFLE(l0, idx0 & MASK, ax0, bx00, bx01, cx0, 0); } else { - VARIANT2_SHUFFLE2(l0, idx0 & MASK, ax0, bx00, bx01, hi, lo); + VARIANT2_SHUFFLE2(l0, idx0 & MASK, ax0, bx00, bx01, hi, lo, (VARIANT == xmrig::VARIANT_RWZ ? 1 : 0)); } } @@ -767,9 +767,9 @@ inline void cryptonight_double_hash(const uint8_t *__restrict__ input, size_t si if (BASE == xmrig::VARIANT_2) { if (VARIANT == xmrig::VARIANT_4) { - VARIANT2_SHUFFLE(l1, idx1 & MASK, ax1, bx10, bx11, cx1); + VARIANT2_SHUFFLE(l1, idx1 & MASK, ax1, bx10, bx11, cx1, 0); } else { - VARIANT2_SHUFFLE2(l1, idx1 & MASK, ax1, bx10, bx11, hi, lo); + VARIANT2_SHUFFLE2(l1, idx1 & MASK, ax1, bx10, bx11, hi, lo, (VARIANT == xmrig::VARIANT_RWZ ? 1 : 0)); } } diff --git a/src/Native/libcryptonight/xmrig/crypto/CryptoNight_constants.h b/src/Native/libcryptonight/xmrig/crypto/CryptoNight_constants.h index 4ea1adb3b0..b04ce08d41 100644 --- a/src/Native/libcryptonight/xmrig/crypto/CryptoNight_constants.h +++ b/src/Native/libcryptonight/xmrig/crypto/CryptoNight_constants.h @@ -42,6 +42,9 @@ constexpr const uint32_t CRYPTONIGHT_MASK = 0x1FFFF0; constexpr const uint32_t CRYPTONIGHT_ITER = 0x80000; constexpr const uint32_t CRYPTONIGHT_HALF_ITER = 0x40000; constexpr const uint32_t CRYPTONIGHT_XAO_ITER = 0x100000; +constexpr const uint32_t CRYPTONIGHT_DOUBLE_ITER = 0x100000; +constexpr const uint32_t CRYPTONIGHT_WALTZ_ITER = 0x60000; +constexpr const uint32_t CRYPTONIGHT_ZLS_ITER = 0x60000; constexpr const uint32_t CRYPTONIGHT_GPU_ITER = 0xC000; constexpr const uint32_t CRYPTONIGHT_GPU_MASK = 0x1FFFC0; @@ -134,6 +137,9 @@ template<> inline constexpr uint32_t cn_select_iter() template<> inline constexpr uint32_t cn_select_iter() { return CRYPTONIGHT_XAO_ITER; } template<> inline constexpr uint32_t cn_select_iter() { return CRYPTONIGHT_ITER; } template<> inline constexpr uint32_t cn_select_iter() { return CRYPTONIGHT_GPU_ITER; } +template<> inline constexpr uint32_t cn_select_iter() { return CRYPTONIGHT_WALTZ_ITER; } +template<> inline constexpr uint32_t cn_select_iter() { return CRYPTONIGHT_ZLS_ITER; } +template<> inline constexpr uint32_t cn_select_iter() { return CRYPTONIGHT_DOUBLE_ITER; } template<> inline constexpr uint32_t cn_select_iter() { return CRYPTONIGHT_LITE_ITER; } template<> inline constexpr uint32_t cn_select_iter() { return CRYPTONIGHT_LITE_ITER; } template<> inline constexpr uint32_t cn_select_iter() { return CRYPTONIGHT_HEAVY_ITER; } @@ -153,11 +159,16 @@ inline uint32_t cn_select_iter(Algo algorithm, Variant variant) return CRYPTONIGHT_GPU_ITER; case VARIANT_RTO: + case VARIANT_DOUBLE: return CRYPTONIGHT_XAO_ITER; case VARIANT_TRTL: return CRYPTONIGHT_TRTL_ITER; + case VARIANT_RWZ: + case VARIANT_ZLS: + return CRYPTONIGHT_WALTZ_ITER; + default: break; } @@ -184,26 +195,28 @@ inline uint32_t cn_select_iter(Algo algorithm, Variant variant) } -template inline constexpr Variant cn_base_variant() { return VARIANT_0; } -template<> inline constexpr Variant cn_base_variant() { return VARIANT_0; } -template<> inline constexpr Variant cn_base_variant() { return VARIANT_1; } -template<> inline constexpr Variant cn_base_variant() { return VARIANT_1; } -template<> inline constexpr Variant cn_base_variant() { return VARIANT_1; } -template<> inline constexpr Variant cn_base_variant() { return VARIANT_1; } -template<> inline constexpr Variant cn_base_variant() { return VARIANT_0; } -template<> inline constexpr Variant cn_base_variant() { return VARIANT_0; } -template<> inline constexpr Variant cn_base_variant() { return VARIANT_1; } -template<> inline constexpr Variant cn_base_variant() { return VARIANT_2; } -template<> inline constexpr Variant cn_base_variant() { return VARIANT_2; } -template<> inline constexpr Variant cn_base_variant() { return VARIANT_2; } -template<> inline constexpr Variant cn_base_variant() { return VARIANT_GPU; } -template<> inline constexpr Variant cn_base_variant() { return VARIANT_2; } -template<> inline constexpr Variant cn_base_variant() { return VARIANT_2; } - +template inline constexpr Variant cn_base_variant() { return VARIANT_0; } +template<> inline constexpr Variant cn_base_variant() { return VARIANT_0; } +template<> inline constexpr Variant cn_base_variant() { return VARIANT_1; } +template<> inline constexpr Variant cn_base_variant() { return VARIANT_1; } +template<> inline constexpr Variant cn_base_variant() { return VARIANT_1; } +template<> inline constexpr Variant cn_base_variant() { return VARIANT_1; } +template<> inline constexpr Variant cn_base_variant() { return VARIANT_0; } +template<> inline constexpr Variant cn_base_variant() { return VARIANT_0; } +template<> inline constexpr Variant cn_base_variant() { return VARIANT_1; } +template<> inline constexpr Variant cn_base_variant() { return VARIANT_2; } +template<> inline constexpr Variant cn_base_variant() { return VARIANT_2; } +template<> inline constexpr Variant cn_base_variant() { return VARIANT_2; } +template<> inline constexpr Variant cn_base_variant() { return VARIANT_GPU; } +template<> inline constexpr Variant cn_base_variant() { return VARIANT_2; } +template<> inline constexpr Variant cn_base_variant() { return VARIANT_2; } +template<> inline constexpr Variant cn_base_variant() { return VARIANT_2; } +template<> inline constexpr Variant cn_base_variant() { return VARIANT_2; } +template<> inline constexpr Variant cn_base_variant() { return VARIANT_2; } template inline constexpr bool cn_is_cryptonight_r() { return false; } -template<> inline constexpr bool cn_is_cryptonight_r() { return true; } -template<> inline constexpr bool cn_is_cryptonight_r() { return true; } +template<> inline constexpr bool cn_is_cryptonight_r() { return true; } +template<> inline constexpr bool cn_is_cryptonight_r() { return true; } } /* namespace xmrig */ diff --git a/src/Native/libcryptonight/xmrig/crypto/CryptoNight_monero.h b/src/Native/libcryptonight/xmrig/crypto/CryptoNight_monero.h index 26c1fff0e3..4e84ac5d09 100644 --- a/src/Native/libcryptonight/xmrig/crypto/CryptoNight_monero.h +++ b/src/Native/libcryptonight/xmrig/crypto/CryptoNight_monero.h @@ -83,11 +83,11 @@ sqrt_result_xmm_##part = int_sqrt_v2(cx_0 + division_result); \ } while (0) -# define VARIANT2_SHUFFLE(base_ptr, offset, _a, _b, _b1, _c) \ +# define VARIANT2_SHUFFLE(base_ptr, offset, _a, _b, _b1, _c, reverse) \ do { \ - const __m128i chunk1 = _mm_load_si128((__m128i *)((base_ptr) + ((offset) ^ 0x10))); \ + const __m128i chunk1 = _mm_load_si128((__m128i *)((base_ptr) + ((offset) ^ (reverse ? 0x30 : 0x10)))); \ const __m128i chunk2 = _mm_load_si128((__m128i *)((base_ptr) + ((offset) ^ 0x20))); \ - const __m128i chunk3 = _mm_load_si128((__m128i *)((base_ptr) + ((offset) ^ 0x30))); \ + const __m128i chunk3 = _mm_load_si128((__m128i *)((base_ptr) + ((offset) ^ (reverse ? 0x10 : 0x30)))); \ _mm_store_si128((__m128i *)((base_ptr) + ((offset) ^ 0x10)), _mm_add_epi64(chunk3, _b1)); \ _mm_store_si128((__m128i *)((base_ptr) + ((offset) ^ 0x20)), _mm_add_epi64(chunk1, _b)); \ _mm_store_si128((__m128i *)((base_ptr) + ((offset) ^ 0x30)), _mm_add_epi64(chunk2, _a)); \ @@ -96,15 +96,20 @@ } \ } while (0) -# define VARIANT2_SHUFFLE2(base_ptr, offset, _a, _b, _b1, hi, lo) \ +# define VARIANT2_SHUFFLE2(base_ptr, offset, _a, _b, _b1, hi, lo, reverse) \ do { \ const __m128i chunk1 = _mm_xor_si128(_mm_load_si128((__m128i *)((base_ptr) + ((offset) ^ 0x10))), _mm_set_epi64x(lo, hi)); \ const __m128i chunk2 = _mm_load_si128((__m128i *)((base_ptr) + ((offset) ^ 0x20))); \ hi ^= ((uint64_t*)((base_ptr) + ((offset) ^ 0x20)))[0]; \ lo ^= ((uint64_t*)((base_ptr) + ((offset) ^ 0x20)))[1]; \ const __m128i chunk3 = _mm_load_si128((__m128i *)((base_ptr) + ((offset) ^ 0x30))); \ - _mm_store_si128((__m128i *)((base_ptr) + ((offset) ^ 0x10)), _mm_add_epi64(chunk3, _b1)); \ - _mm_store_si128((__m128i *)((base_ptr) + ((offset) ^ 0x20)), _mm_add_epi64(chunk1, _b)); \ + if (reverse) { \ + _mm_store_si128((__m128i *)((base_ptr) + ((offset) ^ 0x10)), _mm_add_epi64(chunk1, _b1)); \ + _mm_store_si128((__m128i *)((base_ptr) + ((offset) ^ 0x20)), _mm_add_epi64(chunk3, _b)); \ + } else { \ + _mm_store_si128((__m128i *)((base_ptr) + ((offset) ^ 0x10)), _mm_add_epi64(chunk3, _b1)); \ + _mm_store_si128((__m128i *)((base_ptr) + ((offset) ^ 0x20)), _mm_add_epi64(chunk1, _b)); \ + } \ _mm_store_si128((__m128i *)((base_ptr) + ((offset) ^ 0x30)), _mm_add_epi64(chunk2, _a)); \ } while (0) @@ -128,11 +133,11 @@ sqrt_result_##part += ((r2 + b > sqrt_input) ? -1 : 0) + ((r2 + (1ULL << 32) < sqrt_input - s) ? 1 : 0); \ } while (0) -# define VARIANT2_SHUFFLE(base_ptr, offset, _a, _b, _b1, _c) \ +# define VARIANT2_SHUFFLE(base_ptr, offset, _a, _b, _b1, _c, reverse) \ do { \ - const uint64x2_t chunk1 = vld1q_u64((uint64_t*)((base_ptr) + ((offset) ^ 0x10))); \ + const uint64x2_t chunk1 = vld1q_u64((uint64_t*)((base_ptr) + ((offset) ^ (reverse ? 0x30 : 0x10)))); \ const uint64x2_t chunk2 = vld1q_u64((uint64_t*)((base_ptr) + ((offset) ^ 0x20))); \ - const uint64x2_t chunk3 = vld1q_u64((uint64_t*)((base_ptr) + ((offset) ^ 0x30))); \ + const uint64x2_t chunk3 = vld1q_u64((uint64_t*)((base_ptr) + ((offset) ^ (reverse ? 0x10 : 0x30)))); \ vst1q_u64((uint64_t*)((base_ptr) + ((offset) ^ 0x10)), vaddq_u64(chunk3, vreinterpretq_u64_u8(_b1))); \ vst1q_u64((uint64_t*)((base_ptr) + ((offset) ^ 0x20)), vaddq_u64(chunk1, vreinterpretq_u64_u8(_b))); \ vst1q_u64((uint64_t*)((base_ptr) + ((offset) ^ 0x30)), vaddq_u64(chunk2, vreinterpretq_u64_u8(_a))); \ @@ -141,15 +146,20 @@ } \ } while (0) -# define VARIANT2_SHUFFLE2(base_ptr, offset, _a, _b, _b1, hi, lo) \ +# define VARIANT2_SHUFFLE2(base_ptr, offset, _a, _b, _b1, hi, lo, reverse) \ do { \ const uint64x2_t chunk1 = veorq_u64(vld1q_u64((uint64_t*)((base_ptr) + ((offset) ^ 0x10))), vcombine_u64(vcreate_u64(hi), vcreate_u64(lo))); \ const uint64x2_t chunk2 = vld1q_u64((uint64_t*)((base_ptr) + ((offset) ^ 0x20))); \ hi ^= ((uint64_t*)((base_ptr) + ((offset) ^ 0x20)))[0]; \ lo ^= ((uint64_t*)((base_ptr) + ((offset) ^ 0x20)))[1]; \ const uint64x2_t chunk3 = vld1q_u64((uint64_t*)((base_ptr) + ((offset) ^ 0x30))); \ - vst1q_u64((uint64_t*)((base_ptr) + ((offset) ^ 0x10)), vaddq_u64(chunk3, vreinterpretq_u64_u8(_b1))); \ - vst1q_u64((uint64_t*)((base_ptr) + ((offset) ^ 0x20)), vaddq_u64(chunk1, vreinterpretq_u64_u8(_b))); \ + if (reverse) { \ + vst1q_u64((uint64_t*)((base_ptr) + ((offset) ^ 0x10)), vaddq_u64(chunk1, vreinterpretq_u64_u8(_b1))); \ + vst1q_u64((uint64_t*)((base_ptr) + ((offset) ^ 0x20)), vaddq_u64(chunk3, vreinterpretq_u64_u8(_b))); \ + } else { \ + vst1q_u64((uint64_t*)((base_ptr) + ((offset) ^ 0x10)), vaddq_u64(chunk3, vreinterpretq_u64_u8(_b1))); \ + vst1q_u64((uint64_t*)((base_ptr) + ((offset) ^ 0x20)), vaddq_u64(chunk1, vreinterpretq_u64_u8(_b))); \ + } \ vst1q_u64((uint64_t*)((base_ptr) + ((offset) ^ 0x30)), vaddq_u64(chunk2, vreinterpretq_u64_u8(_a))); \ } while (0) #endif @@ -158,6 +168,16 @@ #define SWAP64LE(x) x #define hash_extra_blake(data, length, hash) blake256_hash((uint8_t*)(hash), (uint8_t*)(data), (length)) +#ifndef NOINLINE +#ifdef __GNUC__ +#define NOINLINE __attribute__ ((noinline)) +#elif _MSC_VER +#define NOINLINE __declspec(noinline) +#else +#define NOINLINE +#endif +#endif + #include "common/xmrig.h" #include "variant4_random_math.h" diff --git a/src/Native/libcryptonight/xmrig/crypto/CryptoNight_x86.h b/src/Native/libcryptonight/xmrig/crypto/CryptoNight_x86.h index 4c5d4ac040..8b9ea7836c 100644 --- a/src/Native/libcryptonight/xmrig/crypto/CryptoNight_x86.h +++ b/src/Native/libcryptonight/xmrig/crypto/CryptoNight_x86.h @@ -192,31 +192,102 @@ static inline void aes_genkey(const __m128i* memory, __m128i* k0, __m128i* k1, _ } +static FORCEINLINE void soft_aesenc(void* __restrict ptr, const void* __restrict key, const uint32_t* __restrict t) +{ + uint32_t x0 = ((const uint32_t*)(ptr))[0]; + uint32_t x1 = ((const uint32_t*)(ptr))[1]; + uint32_t x2 = ((const uint32_t*)(ptr))[2]; + uint32_t x3 = ((const uint32_t*)(ptr))[3]; + + uint32_t y0 = t[x0 & 0xff]; x0 >>= 8; + uint32_t y1 = t[x1 & 0xff]; x1 >>= 8; + uint32_t y2 = t[x2 & 0xff]; x2 >>= 8; + uint32_t y3 = t[x3 & 0xff]; x3 >>= 8; + t += 256; + + y0 ^= t[x1 & 0xff]; x1 >>= 8; + y1 ^= t[x2 & 0xff]; x2 >>= 8; + y2 ^= t[x3 & 0xff]; x3 >>= 8; + y3 ^= t[x0 & 0xff]; x0 >>= 8; + t += 256; + + y0 ^= t[x2 & 0xff]; x2 >>= 8; + y1 ^= t[x3 & 0xff]; x3 >>= 8; + y2 ^= t[x0 & 0xff]; x0 >>= 8; + y3 ^= t[x1 & 0xff]; x1 >>= 8; + t += 256; + + y0 ^= t[x3]; + y1 ^= t[x0]; + y2 ^= t[x1]; + y3 ^= t[x2]; + + ((uint32_t*)ptr)[0] = y0 ^ ((uint32_t*)key)[0]; + ((uint32_t*)ptr)[1] = y1 ^ ((uint32_t*)key)[1]; + ((uint32_t*)ptr)[2] = y2 ^ ((uint32_t*)key)[2]; + ((uint32_t*)ptr)[3] = y3 ^ ((uint32_t*)key)[3]; +} + +static FORCEINLINE __m128i soft_aesenc(const void* __restrict ptr, const __m128i key, const uint32_t* __restrict t) +{ + uint32_t x0 = ((const uint32_t*)(ptr))[0]; + uint32_t x1 = ((const uint32_t*)(ptr))[1]; + uint32_t x2 = ((const uint32_t*)(ptr))[2]; + uint32_t x3 = ((const uint32_t*)(ptr))[3]; + + uint32_t y0 = t[x0 & 0xff]; x0 >>= 8; + uint32_t y1 = t[x1 & 0xff]; x1 >>= 8; + uint32_t y2 = t[x2 & 0xff]; x2 >>= 8; + uint32_t y3 = t[x3 & 0xff]; x3 >>= 8; + t += 256; + + y0 ^= t[x1 & 0xff]; x1 >>= 8; + y1 ^= t[x2 & 0xff]; x2 >>= 8; + y2 ^= t[x3 & 0xff]; x3 >>= 8; + y3 ^= t[x0 & 0xff]; x0 >>= 8; + t += 256; + + y0 ^= t[x2 & 0xff]; x2 >>= 8; + y1 ^= t[x3 & 0xff]; x3 >>= 8; + y2 ^= t[x0 & 0xff]; x0 >>= 8; + y3 ^= t[x1 & 0xff]; x1 >>= 8; + + y0 ^= t[x3 + 256]; + y1 ^= t[x0 + 256]; + y2 ^= t[x1 + 256]; + y3 ^= t[x2 + 256]; + + return _mm_xor_si128(_mm_set_epi32(y3, y2, y1, y0), key); +} + template -static inline void aes_round(__m128i key, __m128i* x0, __m128i* x1, __m128i* x2, __m128i* x3, __m128i* x4, __m128i* x5, __m128i* x6, __m128i* x7) +void aes_round(__m128i key, __m128i* x0, __m128i* x1, __m128i* x2, __m128i* x3, __m128i* x4, __m128i* x5, __m128i* x6, __m128i* x7); + +template<> +NOINLINE void aes_round(__m128i key, __m128i* x0, __m128i* x1, __m128i* x2, __m128i* x3, __m128i* x4, __m128i* x5, __m128i* x6, __m128i* x7) { - if (SOFT_AES) { - *x0 = soft_aesenc((uint32_t*)x0, key); - *x1 = soft_aesenc((uint32_t*)x1, key); - *x2 = soft_aesenc((uint32_t*)x2, key); - *x3 = soft_aesenc((uint32_t*)x3, key); - *x4 = soft_aesenc((uint32_t*)x4, key); - *x5 = soft_aesenc((uint32_t*)x5, key); - *x6 = soft_aesenc((uint32_t*)x6, key); - *x7 = soft_aesenc((uint32_t*)x7, key); - } - else { - *x0 = _mm_aesenc_si128(*x0, key); - *x1 = _mm_aesenc_si128(*x1, key); - *x2 = _mm_aesenc_si128(*x2, key); - *x3 = _mm_aesenc_si128(*x3, key); - *x4 = _mm_aesenc_si128(*x4, key); - *x5 = _mm_aesenc_si128(*x5, key); - *x6 = _mm_aesenc_si128(*x6, key); - *x7 = _mm_aesenc_si128(*x7, key); - } + *x0 = soft_aesenc((uint32_t*)x0, key, (const uint32_t*)saes_table); + *x1 = soft_aesenc((uint32_t*)x1, key, (const uint32_t*)saes_table); + *x2 = soft_aesenc((uint32_t*)x2, key, (const uint32_t*)saes_table); + *x3 = soft_aesenc((uint32_t*)x3, key, (const uint32_t*)saes_table); + *x4 = soft_aesenc((uint32_t*)x4, key, (const uint32_t*)saes_table); + *x5 = soft_aesenc((uint32_t*)x5, key, (const uint32_t*)saes_table); + *x6 = soft_aesenc((uint32_t*)x6, key, (const uint32_t*)saes_table); + *x7 = soft_aesenc((uint32_t*)x7, key, (const uint32_t*)saes_table); } +template<> +FORCEINLINE void aes_round(__m128i key, __m128i* x0, __m128i* x1, __m128i* x2, __m128i* x3, __m128i* x4, __m128i* x5, __m128i* x6, __m128i* x7) +{ + *x0 = _mm_aesenc_si128(*x0, key); + *x1 = _mm_aesenc_si128(*x1, key); + *x2 = _mm_aesenc_si128(*x2, key); + *x3 = _mm_aesenc_si128(*x3, key); + *x4 = _mm_aesenc_si128(*x4, key); + *x5 = _mm_aesenc_si128(*x5, key); + *x6 = _mm_aesenc_si128(*x6, key); + *x7 = _mm_aesenc_si128(*x7, key); +} inline void mix_and_propagate(__m128i& x0, __m128i& x1, __m128i& x2, __m128i& x3, __m128i& x4, __m128i& x5, __m128i& x6, __m128i& x7) { @@ -460,7 +531,7 @@ template static inline void cryptonight_monero_tweak(uint64_t* mem_out, const uint8_t* l, uint64_t idx, __m128i ax0, __m128i bx0, __m128i bx1, __m128i& cx) { if (BASE == xmrig::VARIANT_2) { - VARIANT2_SHUFFLE(l, idx, ax0, bx0, bx1, cx); + VARIANT2_SHUFFLE(l, idx, ax0, bx0, bx1, cx, (VARIANT == xmrig::VARIANT_RWZ ? 1 : 0)); _mm_store_si128((__m128i *)mem_out, _mm_xor_si128(bx0, cx)); } else { __m128i tmp = _mm_xor_si128(bx0, cx); @@ -478,6 +549,8 @@ static inline void cryptonight_monero_tweak(uint64_t* mem_out, const uint8_t* l, } } +void wow_soft_aes_compile_code(const V4_Instruction* code, int code_size, void* machine_code, xmrig::Assembly ASM); +void v4_soft_aes_compile_code(const V4_Instruction* code, int code_size, void* machine_code, xmrig::Assembly ASM); template inline void cryptonight_single_hash(const uint8_t *__restrict__ input, size_t size, uint8_t *__restrict__ output, cryptonight_ctx **__restrict__ ctx, uint64_t height) @@ -498,9 +571,31 @@ inline void cryptonight_single_hash(const uint8_t *__restrict__ input, size_t si cn_explode_scratchpad((__m128i*) ctx[0]->state, (__m128i*) ctx[0]->memory); - const uint8_t* l0 = ctx[0]->memory; uint64_t* h0 = reinterpret_cast(ctx[0]->state); +#ifndef XMRIG_NO_ASM + if (SOFT_AES && xmrig::cn_is_cryptonight_r()) + { + if (!ctx[0]->generated_code_data.match(VARIANT, height)) { + V4_Instruction code[256]; + const int code_size = v4_random_math_init(code, height); + + if (VARIANT == xmrig::VARIANT_WOW) + wow_soft_aes_compile_code(code, code_size, reinterpret_cast(ctx[0]->generated_code), xmrig::ASM_NONE); + else if (VARIANT == xmrig::VARIANT_4) + v4_soft_aes_compile_code(code, code_size, reinterpret_cast(ctx[0]->generated_code), xmrig::ASM_NONE); + + ctx[0]->generated_code_data.variant = VARIANT; + ctx[0]->generated_code_data.height = height; + } + + ctx[0]->saes_table = (const uint32_t*)saes_table; + ctx[0]->generated_code(ctx[0]); + } else { +#endif + + const uint8_t* l0 = ctx[0]->memory; + VARIANT1_INIT(0); VARIANT2_INIT(0); VARIANT2_SET_ROUNDING_MODE(); @@ -524,7 +619,7 @@ inline void cryptonight_single_hash(const uint8_t *__restrict__ input, size_t si cx = aes_round_tweak_div(cx, ax0); } else if (SOFT_AES) { - cx = soft_aesenc((uint32_t*)&l0[idx0 & MASK], ax0); + cx = soft_aesenc((uint32_t*)&l0[idx0 & MASK], ax0, (const uint32_t*)saes_table); } else { cx = _mm_aesenc_si128(cx, ax0); @@ -558,9 +653,9 @@ inline void cryptonight_single_hash(const uint8_t *__restrict__ input, size_t si if (BASE == xmrig::VARIANT_2) { if (VARIANT == xmrig::VARIANT_4) { - VARIANT2_SHUFFLE(l0, idx0 & MASK, ax0, bx0, bx1, cx); + VARIANT2_SHUFFLE(l0, idx0 & MASK, ax0, bx0, bx1, cx, 0); } else { - VARIANT2_SHUFFLE2(l0, idx0 & MASK, ax0, bx0, bx1, hi, lo); + VARIANT2_SHUFFLE2(l0, idx0 & MASK, ax0, bx0, bx1, hi, lo, (VARIANT == xmrig::VARIANT_RWZ ? 1 : 0)); } } @@ -602,6 +697,10 @@ inline void cryptonight_single_hash(const uint8_t *__restrict__ input, size_t si bx0 = cx; } +#ifndef XMRIG_NO_ASM + } +#endif + cn_implode_scratchpad((__m128i*) ctx[0]->memory, (__m128i*) ctx[0]->state); xmrig::keccakf(h0, 24); @@ -655,6 +754,8 @@ extern "C" void cnv2_mainloop_ivybridge_asm(cryptonight_ctx *ctx); extern "C" void cnv2_mainloop_ryzen_asm(cryptonight_ctx *ctx); extern "C" void cnv2_mainloop_bulldozer_asm(cryptonight_ctx *ctx); extern "C" void cnv2_double_mainloop_sandybridge_asm(cryptonight_ctx* ctx0, cryptonight_ctx* ctx1); +extern "C" void cnv2_rwz_mainloop_asm(cryptonight_ctx *ctx); +extern "C" void cnv2_rwz_double_mainloop_asm(cryptonight_ctx* ctx0, cryptonight_ctx* ctx1); extern xmrig::CpuThread::cn_mainloop_fun cn_half_mainloop_ivybridge_asm; extern xmrig::CpuThread::cn_mainloop_fun cn_half_mainloop_ryzen_asm; @@ -666,6 +767,16 @@ extern xmrig::CpuThread::cn_mainloop_fun cn_trtl_mainloop_ryzen_asm; extern xmrig::CpuThread::cn_mainloop_fun cn_trtl_mainloop_bulldozer_asm; extern xmrig::CpuThread::cn_mainloop_double_fun cn_trtl_double_mainloop_sandybridge_asm; +extern xmrig::CpuThread::cn_mainloop_fun cn_zls_mainloop_ivybridge_asm; +extern xmrig::CpuThread::cn_mainloop_fun cn_zls_mainloop_ryzen_asm; +extern xmrig::CpuThread::cn_mainloop_fun cn_zls_mainloop_bulldozer_asm; +extern xmrig::CpuThread::cn_mainloop_double_fun cn_zls_double_mainloop_sandybridge_asm; + +extern xmrig::CpuThread::cn_mainloop_fun cn_double_mainloop_ivybridge_asm; +extern xmrig::CpuThread::cn_mainloop_fun cn_double_mainloop_ryzen_asm; +extern xmrig::CpuThread::cn_mainloop_fun cn_double_mainloop_bulldozer_asm; +extern xmrig::CpuThread::cn_mainloop_double_fun cn_double_double_mainloop_sandybridge_asm; + void wow_compile_code(const V4_Instruction* code, int code_size, void* machine_code, xmrig::Assembly ASM); void v4_compile_code(const V4_Instruction* code, int code_size, void* machine_code, xmrig::Assembly ASM); void wow_compile_code_double(const V4_Instruction* code, int code_size, void* machine_code, xmrig::Assembly ASM); @@ -744,6 +855,31 @@ inline void cryptonight_single_hash_asm(const uint8_t *__restrict__ input, size_ cn_trtl_mainloop_bulldozer_asm(ctx[0]); } } + else if (VARIANT == xmrig::VARIANT_RWZ) { + cnv2_rwz_mainloop_asm(ctx[0]); + } + else if (VARIANT == xmrig::VARIANT_ZLS) { + if (ASM == xmrig::ASM_INTEL) { + cn_zls_mainloop_ivybridge_asm(ctx[0]); + } + else if (ASM == xmrig::ASM_RYZEN) { + cn_zls_mainloop_ryzen_asm(ctx[0]); + } + else { + cn_zls_mainloop_bulldozer_asm(ctx[0]); + } + } + else if (VARIANT == xmrig::VARIANT_DOUBLE) { + if (ASM == xmrig::ASM_INTEL) { + cn_double_mainloop_ivybridge_asm(ctx[0]); + } + else if (ASM == xmrig::ASM_RYZEN) { + cn_double_mainloop_ryzen_asm(ctx[0]); + } + else { + cn_double_mainloop_bulldozer_asm(ctx[0]); + } + } else if (xmrig::cn_is_cryptonight_r()) { ctx[0]->generated_code(ctx[0]); } @@ -782,6 +918,15 @@ inline void cryptonight_double_hash_asm(const uint8_t *__restrict__ input, size_ else if (VARIANT == xmrig::VARIANT_TRTL) { cn_trtl_double_mainloop_sandybridge_asm(ctx[0], ctx[1]); } + else if (VARIANT == xmrig::VARIANT_RWZ) { + cnv2_rwz_double_mainloop_asm(ctx[0], ctx[1]); + } + else if (VARIANT == xmrig::VARIANT_ZLS) { + cn_zls_double_mainloop_sandybridge_asm(ctx[0], ctx[1]); + } + else if (VARIANT == xmrig::VARIANT_DOUBLE) { + cn_double_double_mainloop_sandybridge_asm(ctx[0], ctx[1]); + } else if (xmrig::cn_is_cryptonight_r()) { ctx[0]->generated_code_double(ctx[0], ctx[1]); } @@ -857,8 +1002,8 @@ inline void cryptonight_double_hash(const uint8_t *__restrict__ input, size_t si cx1 = aes_round_tweak_div(cx1, ax1); } else if (SOFT_AES) { - cx0 = soft_aesenc((uint32_t*)&l0[idx0 & MASK], ax0); - cx1 = soft_aesenc((uint32_t*)&l1[idx1 & MASK], ax1); + cx0 = soft_aesenc((uint32_t*)&l0[idx0 & MASK], ax0, (const uint32_t*)saes_table); + cx1 = soft_aesenc((uint32_t*)&l1[idx1 & MASK], ax1, (const uint32_t*)saes_table); } else { cx0 = _mm_aesenc_si128(cx0, ax0); @@ -896,9 +1041,9 @@ inline void cryptonight_double_hash(const uint8_t *__restrict__ input, size_t si if (BASE == xmrig::VARIANT_2) { if (VARIANT == xmrig::VARIANT_4) { - VARIANT2_SHUFFLE(l0, idx0 & MASK, ax0, bx00, bx01, cx0); + VARIANT2_SHUFFLE(l0, idx0 & MASK, ax0, bx00, bx01, cx0, 0); } else { - VARIANT2_SHUFFLE2(l0, idx0 & MASK, ax0, bx00, bx01, hi, lo); + VARIANT2_SHUFFLE2(l0, idx0 & MASK, ax0, bx00, bx01, hi, lo, (VARIANT == xmrig::VARIANT_RWZ ? 1 : 0)); } } @@ -952,9 +1097,9 @@ inline void cryptonight_double_hash(const uint8_t *__restrict__ input, size_t si if (BASE == xmrig::VARIANT_2) { if (VARIANT == xmrig::VARIANT_4) { - VARIANT2_SHUFFLE(l1, idx1 & MASK, ax1, bx10, bx11, cx1); + VARIANT2_SHUFFLE(l1, idx1 & MASK, ax1, bx10, bx11, cx1, 0); } else { - VARIANT2_SHUFFLE2(l1, idx1 & MASK, ax1, bx10, bx11, hi, lo); + VARIANT2_SHUFFLE2(l1, idx1 & MASK, ax1, bx10, bx11, hi, lo, (VARIANT == xmrig::VARIANT_RWZ ? 1 : 0)); } } @@ -1019,7 +1164,7 @@ inline void cryptonight_double_hash(const uint8_t *__restrict__ input, size_t si c = aes_round_tweak_div(c, a); \ } \ else if (SOFT_AES) { \ - c = soft_aesenc(c, a); \ + c = soft_aesenc(&c, a, (const uint32_t*)saes_table); \ } else { \ c = _mm_aesenc_si128(c, a); \ } \ @@ -1056,9 +1201,9 @@ inline void cryptonight_double_hash(const uint8_t *__restrict__ input, size_t si lo = __umul128(idx, cl##part, &hi); \ if (BASE == xmrig::VARIANT_2) { \ if (VARIANT == xmrig::VARIANT_4) { \ - VARIANT2_SHUFFLE(l, idx & MASK, a, b0, b1, c); \ + VARIANT2_SHUFFLE(l, idx & MASK, a, b0, b1, c, 0); \ } else { \ - VARIANT2_SHUFFLE2(l, idx & MASK, a, b0, b1, hi, lo); \ + VARIANT2_SHUFFLE2(l, idx & MASK, a, b0, b1, hi, lo, (VARIANT == xmrig::VARIANT_RWZ ? 1 : 0)); \ } \ } \ if (VARIANT == xmrig::VARIANT_4) { \ diff --git a/src/Native/libcryptonight/xmrig/crypto/CryptonightR_gen.cpp b/src/Native/libcryptonight/xmrig/crypto/CryptonightR_gen.cpp index 55f94662c4..3fba49cd95 100644 --- a/src/Native/libcryptonight/xmrig/crypto/CryptonightR_gen.cpp +++ b/src/Native/libcryptonight/xmrig/crypto/CryptonightR_gen.cpp @@ -31,7 +31,6 @@ typedef void(*void_func)(); #include "crypto/asm/CryptonightR_template.h" #include "Mem.h" -#if !defined XMRIG_ARM && !defined XMRIG_NO_ASM static inline void add_code(uint8_t* &p, void (*p1)(), void (*p2)()) { @@ -159,4 +158,30 @@ void v4_compile_code_double(const V4_Instruction* code, int code_size, void* mac Mem::flushInstructionCache(machine_code, p - p0); } -#endif +void wow_soft_aes_compile_code(const V4_Instruction* code, int code_size, void* machine_code, xmrig::Assembly ASM) +{ + uint8_t* p0 = reinterpret_cast(machine_code); + uint8_t* p = p0; + + add_code(p, CryptonightWOW_soft_aes_template_part1, CryptonightWOW_soft_aes_template_part2); + add_random_math(p, code, code_size, instructions, instructions_mov, false, ASM); + add_code(p, CryptonightWOW_soft_aes_template_part2, CryptonightWOW_soft_aes_template_part3); + *(int*)(p - 4) = static_cast((((const uint8_t*)CryptonightWOW_soft_aes_template_mainloop) - ((const uint8_t*)CryptonightWOW_soft_aes_template_part1)) - (p - p0)); + add_code(p, CryptonightWOW_soft_aes_template_part3, CryptonightWOW_soft_aes_template_end); + + Mem::flushInstructionCache(machine_code, p - p0); +} + +void v4_soft_aes_compile_code(const V4_Instruction* code, int code_size, void* machine_code, xmrig::Assembly ASM) +{ + uint8_t* p0 = reinterpret_cast(machine_code); + uint8_t* p = p0; + + add_code(p, CryptonightR_soft_aes_template_part1, CryptonightR_soft_aes_template_part2); + add_random_math(p, code, code_size, instructions, instructions_mov, false, ASM); + add_code(p, CryptonightR_soft_aes_template_part2, CryptonightR_soft_aes_template_part3); + *(int*)(p - 4) = static_cast((((const uint8_t*)CryptonightR_soft_aes_template_mainloop) - ((const uint8_t*)CryptonightR_soft_aes_template_part1)) - (p - p0)); + add_code(p, CryptonightR_soft_aes_template_part3, CryptonightR_soft_aes_template_end); + + Mem::flushInstructionCache(machine_code, p - p0); +} diff --git a/src/Native/libcryptonight/xmrig/crypto/asm/CryptonightR_soft_aes_template.inc b/src/Native/libcryptonight/xmrig/crypto/asm/CryptonightR_soft_aes_template.inc new file mode 100644 index 0000000000..40c7874d28 --- /dev/null +++ b/src/Native/libcryptonight/xmrig/crypto/asm/CryptonightR_soft_aes_template.inc @@ -0,0 +1,279 @@ +PUBLIC FN_PREFIX(CryptonightR_soft_aes_template_part1) +PUBLIC FN_PREFIX(CryptonightR_soft_aes_template_mainloop) +PUBLIC FN_PREFIX(CryptonightR_soft_aes_template_part2) +PUBLIC FN_PREFIX(CryptonightR_soft_aes_template_part3) +PUBLIC FN_PREFIX(CryptonightR_soft_aes_template_end) + +ALIGN(64) +FN_PREFIX(CryptonightR_soft_aes_template_part1): + mov QWORD PTR [rsp+8], rcx + push rbx + push rbp + push rsi + push rdi + push r12 + push r13 + push r14 + push r15 + sub rsp, 232 + + mov eax, [rcx+96] + mov ebx, [rcx+100] + mov esi, [rcx+104] + mov edx, [rcx+108] + mov [rsp+144], eax + mov [rsp+148], ebx + mov [rsp+152], esi + mov [rsp+156], edx + + mov rax, QWORD PTR [rcx+48] + mov r10, rcx + xor rax, QWORD PTR [rcx+16] + mov r8, QWORD PTR [rcx+32] + xor r8, QWORD PTR [rcx] + mov r9, QWORD PTR [rcx+40] + xor r9, QWORD PTR [rcx+8] + movq xmm4, rax + mov rdx, QWORD PTR [rcx+56] + xor rdx, QWORD PTR [rcx+24] + mov r11, QWORD PTR [rcx+224] + mov rcx, QWORD PTR [rcx+88] + xor rcx, QWORD PTR [r10+72] + mov rax, QWORD PTR [r10+80] + movq xmm0, rdx + xor rax, QWORD PTR [r10+64] + + movaps XMMWORD PTR [rsp+16], xmm6 + movaps XMMWORD PTR [rsp+32], xmm7 + movaps XMMWORD PTR [rsp+48], xmm8 + movaps XMMWORD PTR [rsp+64], xmm9 + movaps XMMWORD PTR [rsp+80], xmm10 + movaps XMMWORD PTR [rsp+96], xmm11 + movaps XMMWORD PTR [rsp+112], xmm12 + movaps XMMWORD PTR [rsp+128], xmm13 + + movq xmm5, rax + + mov rax, r8 + punpcklqdq xmm4, xmm0 + and eax, 2097136 + movq xmm10, QWORD PTR [r10+96] + movq xmm0, rcx + mov rcx, QWORD PTR [r10+104] + xorps xmm9, xmm9 + mov QWORD PTR [rsp+328], rax + movq xmm12, r11 + mov QWORD PTR [rsp+320], r9 + punpcklqdq xmm5, xmm0 + movq xmm13, rcx + mov r12d, 524288 + + ALIGN(64) +FN_PREFIX(CryptonightR_soft_aes_template_mainloop): + movd xmm11, r12d + mov r12, QWORD PTR [r10+272] + lea r13, QWORD PTR [rax+r11] + mov esi, DWORD PTR [r13] + movq xmm0, r9 + mov r10d, DWORD PTR [r13+4] + movq xmm7, r8 + mov ebp, DWORD PTR [r13+12] + mov r14d, DWORD PTR [r13+8] + mov rdx, QWORD PTR [rsp+328] + movzx ecx, sil + shr esi, 8 + punpcklqdq xmm7, xmm0 + mov r15d, DWORD PTR [r12+rcx*4] + movzx ecx, r10b + shr r10d, 8 + mov edi, DWORD PTR [r12+rcx*4] + movzx ecx, r14b + shr r14d, 8 + mov ebx, DWORD PTR [r12+rcx*4] + movzx ecx, bpl + shr ebp, 8 + mov r9d, DWORD PTR [r12+rcx*4] + movzx ecx, r10b + shr r10d, 8 + xor r15d, DWORD PTR [r12+rcx*4+1024] + movzx ecx, r14b + shr r14d, 8 + mov eax, r14d + shr eax, 8 + xor edi, DWORD PTR [r12+rcx*4+1024] + add eax, 256 + movzx ecx, bpl + shr ebp, 8 + xor ebx, DWORD PTR [r12+rcx*4+1024] + movzx ecx, sil + shr esi, 8 + xor r9d, DWORD PTR [r12+rcx*4+1024] + add r12, 2048 + movzx ecx, r10b + shr r10d, 8 + add r10d, 256 + mov r11d, DWORD PTR [r12+rax*4] + xor r11d, DWORD PTR [r12+rcx*4] + xor r11d, r9d + movzx ecx, sil + mov r10d, DWORD PTR [r12+r10*4] + shr esi, 8 + add esi, 256 + xor r10d, DWORD PTR [r12+rcx*4] + movzx ecx, bpl + xor r10d, ebx + shr ebp, 8 + movd xmm1, r11d + add ebp, 256 + movq r11, xmm12 + mov r9d, DWORD PTR [r12+rcx*4] + xor r9d, DWORD PTR [r12+rsi*4] + mov eax, DWORD PTR [r12+rbp*4] + xor r9d, edi + movzx ecx, r14b + movd xmm0, r10d + movd xmm2, r9d + xor eax, DWORD PTR [r12+rcx*4] + mov rcx, rdx + xor eax, r15d + punpckldq xmm2, xmm1 + xor rcx, 16 + movd xmm6, eax + mov rax, rdx + punpckldq xmm6, xmm0 + xor rax, 32 + punpckldq xmm6, xmm2 + xor rdx, 48 + movdqu xmm2, XMMWORD PTR [rcx+r11] + pxor xmm6, xmm2 + pxor xmm6, xmm7 + paddq xmm2, xmm4 + movdqu xmm1, XMMWORD PTR [rax+r11] + movdqu xmm0, XMMWORD PTR [rdx+r11] + pxor xmm6, xmm1 + pxor xmm6, xmm0 + paddq xmm0, xmm5 + movdqu XMMWORD PTR [rcx+r11], xmm0 + movdqu XMMWORD PTR [rax+r11], xmm2 + movq rcx, xmm13 + paddq xmm1, xmm7 + movdqu XMMWORD PTR [rdx+r11], xmm1 + movq rdi, xmm6 + mov r10, rdi + and r10d, 2097136 + movdqa xmm0, xmm6 + pxor xmm0, xmm4 + movdqu XMMWORD PTR [r13], xmm0 + + mov ebx, [rsp+144] + mov ebp, [rsp+152] + add ebx, [rsp+148] + add ebp, [rsp+156] + shl rbp, 32 + or rbx, rbp + + xor rbx, QWORD PTR [r10+r11] + lea r14, QWORD PTR [r10+r11] + mov rbp, QWORD PTR [r14+8] + + mov [rsp+160], rbx + mov [rsp+168], rdi + mov [rsp+176], rbp + mov [rsp+184], r10 + mov r10, rsp + + mov ebx, [rsp+144] + mov esi, [rsp+148] + mov edi, [rsp+152] + mov ebp, [rsp+156] + + movd esp, xmm7 + movaps xmm0, xmm7 + psrldq xmm0, 8 + movd r15d, xmm0 + movd eax, xmm4 + movd edx, xmm5 + movaps xmm0, xmm5 + psrldq xmm0, 8 + movd r9d, xmm0 + +FN_PREFIX(CryptonightR_soft_aes_template_part2): + mov rsp, r10 + mov [rsp+144], ebx + mov [rsp+148], esi + mov [rsp+152], edi + mov [rsp+156], ebp + + mov edi, edi + shl rbp, 32 + or rbp, rdi + xor r8, rbp + + mov ebx, ebx + shl rsi, 32 + or rsi, rbx + xor QWORD PTR [rsp+320], rsi + + mov rbx, [rsp+160] + mov rdi, [rsp+168] + mov rbp, [rsp+176] + mov r10, [rsp+184] + + mov r9, r10 + xor r9, 16 + mov rcx, r10 + xor rcx, 32 + xor r10, 48 + mov rax, rbx + mul rdi + movdqu xmm2, XMMWORD PTR [r9+r11] + movdqu xmm1, XMMWORD PTR [rcx+r11] + pxor xmm6, xmm2 + pxor xmm6, xmm1 + paddq xmm1, xmm7 + add r8, rdx + movdqu xmm0, XMMWORD PTR [r10+r11] + pxor xmm6, xmm0 + paddq xmm0, xmm5 + paddq xmm2, xmm4 + movdqu XMMWORD PTR [r9+r11], xmm0 + movdqa xmm5, xmm4 + mov r9, QWORD PTR [rsp+320] + movdqa xmm4, xmm6 + add r9, rax + movdqu XMMWORD PTR [rcx+r11], xmm2 + movdqu XMMWORD PTR [r10+r11], xmm1 + mov r10, QWORD PTR [rsp+304] + movd r12d, xmm11 + mov QWORD PTR [r14], r8 + xor r8, rbx + mov rax, r8 + mov QWORD PTR [r14+8], r9 + and eax, 2097136 + xor r9, rbp + mov QWORD PTR [rsp+320], r9 + mov QWORD PTR [rsp+328], rax + sub r12d, 1 + jne FN_PREFIX(CryptonightR_soft_aes_template_mainloop) + +FN_PREFIX(CryptonightR_soft_aes_template_part3): + movaps xmm6, XMMWORD PTR [rsp+16] + movaps xmm7, XMMWORD PTR [rsp+32] + movaps xmm8, XMMWORD PTR [rsp+48] + movaps xmm9, XMMWORD PTR [rsp+64] + movaps xmm10, XMMWORD PTR [rsp+80] + movaps xmm11, XMMWORD PTR [rsp+96] + movaps xmm12, XMMWORD PTR [rsp+112] + movaps xmm13, XMMWORD PTR [rsp+128] + + add rsp, 232 + pop r15 + pop r14 + pop r13 + pop r12 + pop rdi + pop rsi + pop rbp + pop rbx + ret +FN_PREFIX(CryptonightR_soft_aes_template_end): diff --git a/src/Native/libcryptonight/xmrig/crypto/asm/CryptonightR_soft_aes_template_win.inc b/src/Native/libcryptonight/xmrig/crypto/asm/CryptonightR_soft_aes_template_win.inc new file mode 100644 index 0000000000..d771f69cff --- /dev/null +++ b/src/Native/libcryptonight/xmrig/crypto/asm/CryptonightR_soft_aes_template_win.inc @@ -0,0 +1,279 @@ +PUBLIC CryptonightR_soft_aes_template_part1 +PUBLIC CryptonightR_soft_aes_template_mainloop +PUBLIC CryptonightR_soft_aes_template_part2 +PUBLIC CryptonightR_soft_aes_template_part3 +PUBLIC CryptonightR_soft_aes_template_end + +ALIGN(64) +CryptonightR_soft_aes_template_part1: + mov QWORD PTR [rsp+8], rcx + push rbx + push rbp + push rsi + push rdi + push r12 + push r13 + push r14 + push r15 + sub rsp, 232 + + mov eax, [rcx+96] + mov ebx, [rcx+100] + mov esi, [rcx+104] + mov edx, [rcx+108] + mov [rsp+144], eax + mov [rsp+148], ebx + mov [rsp+152], esi + mov [rsp+156], edx + + mov rax, QWORD PTR [rcx+48] + mov r10, rcx + xor rax, QWORD PTR [rcx+16] + mov r8, QWORD PTR [rcx+32] + xor r8, QWORD PTR [rcx] + mov r9, QWORD PTR [rcx+40] + xor r9, QWORD PTR [rcx+8] + movq xmm4, rax + mov rdx, QWORD PTR [rcx+56] + xor rdx, QWORD PTR [rcx+24] + mov r11, QWORD PTR [rcx+224] + mov rcx, QWORD PTR [rcx+88] + xor rcx, QWORD PTR [r10+72] + mov rax, QWORD PTR [r10+80] + movq xmm0, rdx + xor rax, QWORD PTR [r10+64] + + movaps XMMWORD PTR [rsp+16], xmm6 + movaps XMMWORD PTR [rsp+32], xmm7 + movaps XMMWORD PTR [rsp+48], xmm8 + movaps XMMWORD PTR [rsp+64], xmm9 + movaps XMMWORD PTR [rsp+80], xmm10 + movaps XMMWORD PTR [rsp+96], xmm11 + movaps XMMWORD PTR [rsp+112], xmm12 + movaps XMMWORD PTR [rsp+128], xmm13 + + movq xmm5, rax + + mov rax, r8 + punpcklqdq xmm4, xmm0 + and eax, 2097136 + movq xmm10, QWORD PTR [r10+96] + movq xmm0, rcx + mov rcx, QWORD PTR [r10+104] + xorps xmm9, xmm9 + mov QWORD PTR [rsp+328], rax + movq xmm12, r11 + mov QWORD PTR [rsp+320], r9 + punpcklqdq xmm5, xmm0 + movq xmm13, rcx + mov r12d, 524288 + + ALIGN(64) +CryptonightR_soft_aes_template_mainloop: + movd xmm11, r12d + mov r12, QWORD PTR [r10+272] + lea r13, QWORD PTR [rax+r11] + mov esi, DWORD PTR [r13] + movq xmm0, r9 + mov r10d, DWORD PTR [r13+4] + movq xmm7, r8 + mov ebp, DWORD PTR [r13+12] + mov r14d, DWORD PTR [r13+8] + mov rdx, QWORD PTR [rsp+328] + movzx ecx, sil + shr esi, 8 + punpcklqdq xmm7, xmm0 + mov r15d, DWORD PTR [r12+rcx*4] + movzx ecx, r10b + shr r10d, 8 + mov edi, DWORD PTR [r12+rcx*4] + movzx ecx, r14b + shr r14d, 8 + mov ebx, DWORD PTR [r12+rcx*4] + movzx ecx, bpl + shr ebp, 8 + mov r9d, DWORD PTR [r12+rcx*4] + movzx ecx, r10b + shr r10d, 8 + xor r15d, DWORD PTR [r12+rcx*4+1024] + movzx ecx, r14b + shr r14d, 8 + mov eax, r14d + shr eax, 8 + xor edi, DWORD PTR [r12+rcx*4+1024] + add eax, 256 + movzx ecx, bpl + shr ebp, 8 + xor ebx, DWORD PTR [r12+rcx*4+1024] + movzx ecx, sil + shr esi, 8 + xor r9d, DWORD PTR [r12+rcx*4+1024] + add r12, 2048 + movzx ecx, r10b + shr r10d, 8 + add r10d, 256 + mov r11d, DWORD PTR [r12+rax*4] + xor r11d, DWORD PTR [r12+rcx*4] + xor r11d, r9d + movzx ecx, sil + mov r10d, DWORD PTR [r12+r10*4] + shr esi, 8 + add esi, 256 + xor r10d, DWORD PTR [r12+rcx*4] + movzx ecx, bpl + xor r10d, ebx + shr ebp, 8 + movd xmm1, r11d + add ebp, 256 + movq r11, xmm12 + mov r9d, DWORD PTR [r12+rcx*4] + xor r9d, DWORD PTR [r12+rsi*4] + mov eax, DWORD PTR [r12+rbp*4] + xor r9d, edi + movzx ecx, r14b + movd xmm0, r10d + movd xmm2, r9d + xor eax, DWORD PTR [r12+rcx*4] + mov rcx, rdx + xor eax, r15d + punpckldq xmm2, xmm1 + xor rcx, 16 + movd xmm6, eax + mov rax, rdx + punpckldq xmm6, xmm0 + xor rax, 32 + punpckldq xmm6, xmm2 + xor rdx, 48 + movdqu xmm2, XMMWORD PTR [rcx+r11] + pxor xmm6, xmm2 + pxor xmm6, xmm7 + paddq xmm2, xmm4 + movdqu xmm1, XMMWORD PTR [rax+r11] + movdqu xmm0, XMMWORD PTR [rdx+r11] + pxor xmm6, xmm1 + pxor xmm6, xmm0 + paddq xmm0, xmm5 + movdqu XMMWORD PTR [rcx+r11], xmm0 + movdqu XMMWORD PTR [rax+r11], xmm2 + movq rcx, xmm13 + paddq xmm1, xmm7 + movdqu XMMWORD PTR [rdx+r11], xmm1 + movq rdi, xmm6 + mov r10, rdi + and r10d, 2097136 + movdqa xmm0, xmm6 + pxor xmm0, xmm4 + movdqu XMMWORD PTR [r13], xmm0 + + mov ebx, [rsp+144] + mov ebp, [rsp+152] + add ebx, [rsp+148] + add ebp, [rsp+156] + shl rbp, 32 + or rbx, rbp + + xor rbx, QWORD PTR [r10+r11] + lea r14, QWORD PTR [r10+r11] + mov rbp, QWORD PTR [r14+8] + + mov [rsp+160], rbx + mov [rsp+168], rdi + mov [rsp+176], rbp + mov [rsp+184], r10 + mov r10, rsp + + mov ebx, [rsp+144] + mov esi, [rsp+148] + mov edi, [rsp+152] + mov ebp, [rsp+156] + + movd esp, xmm7 + movaps xmm0, xmm7 + psrldq xmm0, 8 + movd r15d, xmm0 + movd eax, xmm4 + movd edx, xmm5 + movaps xmm0, xmm5 + psrldq xmm0, 8 + movd r9d, xmm0 + +CryptonightR_soft_aes_template_part2: + mov rsp, r10 + mov [rsp+144], ebx + mov [rsp+148], esi + mov [rsp+152], edi + mov [rsp+156], ebp + + mov edi, edi + shl rbp, 32 + or rbp, rdi + xor r8, rbp + + mov ebx, ebx + shl rsi, 32 + or rsi, rbx + xor QWORD PTR [rsp+320], rsi + + mov rbx, [rsp+160] + mov rdi, [rsp+168] + mov rbp, [rsp+176] + mov r10, [rsp+184] + + mov r9, r10 + xor r9, 16 + mov rcx, r10 + xor rcx, 32 + xor r10, 48 + mov rax, rbx + mul rdi + movdqu xmm2, XMMWORD PTR [r9+r11] + movdqu xmm1, XMMWORD PTR [rcx+r11] + pxor xmm6, xmm2 + pxor xmm6, xmm1 + paddq xmm1, xmm7 + add r8, rdx + movdqu xmm0, XMMWORD PTR [r10+r11] + pxor xmm6, xmm0 + paddq xmm0, xmm5 + paddq xmm2, xmm4 + movdqu XMMWORD PTR [r9+r11], xmm0 + movdqa xmm5, xmm4 + mov r9, QWORD PTR [rsp+320] + movdqa xmm4, xmm6 + add r9, rax + movdqu XMMWORD PTR [rcx+r11], xmm2 + movdqu XMMWORD PTR [r10+r11], xmm1 + mov r10, QWORD PTR [rsp+304] + movd r12d, xmm11 + mov QWORD PTR [r14], r8 + xor r8, rbx + mov rax, r8 + mov QWORD PTR [r14+8], r9 + and eax, 2097136 + xor r9, rbp + mov QWORD PTR [rsp+320], r9 + mov QWORD PTR [rsp+328], rax + sub r12d, 1 + jne CryptonightR_soft_aes_template_mainloop + +CryptonightR_soft_aes_template_part3: + movaps xmm6, XMMWORD PTR [rsp+16] + movaps xmm7, XMMWORD PTR [rsp+32] + movaps xmm8, XMMWORD PTR [rsp+48] + movaps xmm9, XMMWORD PTR [rsp+64] + movaps xmm10, XMMWORD PTR [rsp+80] + movaps xmm11, XMMWORD PTR [rsp+96] + movaps xmm12, XMMWORD PTR [rsp+112] + movaps xmm13, XMMWORD PTR [rsp+128] + + add rsp, 232 + pop r15 + pop r14 + pop r13 + pop r12 + pop rdi + pop rsi + pop rbp + pop rbx + ret +CryptonightR_soft_aes_template_end: diff --git a/src/Native/libcryptonight/xmrig/crypto/asm/CryptonightR_template.S b/src/Native/libcryptonight/xmrig/crypto/asm/CryptonightR_template.S index 5f3046cb95..d2974d1605 100644 --- a/src/Native/libcryptonight/xmrig/crypto/asm/CryptonightR_template.S +++ b/src/Native/libcryptonight/xmrig/crypto/asm/CryptonightR_template.S @@ -531,6 +531,8 @@ PUBLIC FN_PREFIX(CryptonightR_instruction_mov256) #include "CryptonightWOW_template.inc" #include "CryptonightR_template.inc" +#include "CryptonightWOW_soft_aes_template.inc" +#include "CryptonightR_soft_aes_template.inc" FN_PREFIX(CryptonightR_instruction0): imul rbx, rbx diff --git a/src/Native/libcryptonight/xmrig/crypto/asm/CryptonightR_template.h b/src/Native/libcryptonight/xmrig/crypto/asm/CryptonightR_template.h index c2054705b9..d9159a8f26 100644 --- a/src/Native/libcryptonight/xmrig/crypto/asm/CryptonightR_template.h +++ b/src/Native/libcryptonight/xmrig/crypto/asm/CryptonightR_template.h @@ -26,6 +26,30 @@ extern "C" void CryptonightR_template_double_part4(); void CryptonightR_template_double_end(); + void CryptonightWOW_soft_aes_template_part1(); + void CryptonightWOW_soft_aes_template_mainloop(); + void CryptonightWOW_soft_aes_template_part2(); + void CryptonightWOW_soft_aes_template_part3(); + void CryptonightWOW_soft_aes_template_end(); + void CryptonightWOW_soft_aes_template_double_part1(); + void CryptonightWOW_soft_aes_template_double_mainloop(); + void CryptonightWOW_soft_aes_template_double_part2(); + void CryptonightWOW_soft_aes_template_double_part3(); + void CryptonightWOW_soft_aes_template_double_part4(); + void CryptonightWOW_soft_aes_template_double_end(); + + void CryptonightR_soft_aes_template_part1(); + void CryptonightR_soft_aes_template_mainloop(); + void CryptonightR_soft_aes_template_part2(); + void CryptonightR_soft_aes_template_part3(); + void CryptonightR_soft_aes_template_end(); + void CryptonightR_soft_aes_template_double_part1(); + void CryptonightR_soft_aes_template_double_mainloop(); + void CryptonightR_soft_aes_template_double_part2(); + void CryptonightR_soft_aes_template_double_part3(); + void CryptonightR_soft_aes_template_double_part4(); + void CryptonightR_soft_aes_template_double_end(); + void CryptonightR_instruction0(); void CryptonightR_instruction1(); void CryptonightR_instruction2(); diff --git a/src/Native/libcryptonight/xmrig/crypto/asm/CryptonightR_template.inc b/src/Native/libcryptonight/xmrig/crypto/asm/CryptonightR_template.inc index b54486a579..8ecab7247f 100644 --- a/src/Native/libcryptonight/xmrig/crypto/asm/CryptonightR_template.inc +++ b/src/Native/libcryptonight/xmrig/crypto/asm/CryptonightR_template.inc @@ -70,29 +70,30 @@ FN_PREFIX(CryptonightR_template_mainloop): aesenc xmm5, xmm4 - mov r12d, r9d + mov r13d, r9d mov eax, r9d xor r9d, 48 - xor r12d, 16 + xor r13d, 16 xor eax, 32 movdqu xmm0, XMMWORD PTR [r9+r11] movaps xmm3, xmm0 - movdqu xmm2, XMMWORD PTR [r12+r11] + movdqu xmm2, XMMWORD PTR [r13+r11] movdqu xmm1, XMMWORD PTR [rax+r11] pxor xmm0, xmm2 pxor xmm5, xmm1 pxor xmm5, xmm0 + + movq r12, xmm5 + movd r10d, xmm5 + and r10d, 2097136 + paddq xmm3, xmm7 paddq xmm2, xmm6 paddq xmm1, xmm4 - movdqu XMMWORD PTR [r12+r11], xmm3 + movdqu XMMWORD PTR [r13+r11], xmm3 movdqu XMMWORD PTR [rax+r11], xmm2 movdqu XMMWORD PTR [r9+r11], xmm1 - movq r12, xmm5 - movd r10d, xmm5 - and r10d, 2097136 - movdqa xmm0, xmm5 pxor xmm0, xmm6 movdqu XMMWORD PTR [rdx], xmm0 @@ -102,14 +103,16 @@ FN_PREFIX(CryptonightR_template_mainloop): shl rdx, 32 or r13, rdx - xor r13, QWORD PTR [r10+r11] - mov r14, QWORD PTR [r10+r11+8] - movd eax, xmm6 movd edx, xmm7 pextrd r9d, xmm7, 2 + xor r13, QWORD PTR [r10+r11] + mov r14, QWORD PTR [r10+r11+8] + FN_PREFIX(CryptonightR_template_part2): + lea rcx, [r10+r11] + mov eax, edi mov edx, ebp shl rdx, 32 @@ -124,6 +127,8 @@ FN_PREFIX(CryptonightR_template_part2): mov rax, r13 mul r12 + add r15, rax + add rsp, rdx mov r9d, r10d mov r12d, r10d @@ -145,13 +150,10 @@ FN_PREFIX(CryptonightR_template_part2): movdqu XMMWORD PTR [r10+r11], xmm3 movdqa xmm7, xmm6 - add r15, rax - add rsp, rdx - xor r10, 48 - mov QWORD PTR [r10+r11], rsp + mov QWORD PTR [rcx], rsp xor rsp, r13 mov r9d, esp - mov QWORD PTR [r10+r11+8], r15 + mov QWORD PTR [rcx+8], r15 and r9d, 2097136 xor r15, r14 movdqa xmm6, xmm5 diff --git a/src/Native/libcryptonight/xmrig/crypto/asm/CryptonightR_template_win.inc b/src/Native/libcryptonight/xmrig/crypto/asm/CryptonightR_template_win.inc new file mode 100644 index 0000000000..a170f2d2b5 --- /dev/null +++ b/src/Native/libcryptonight/xmrig/crypto/asm/CryptonightR_template_win.inc @@ -0,0 +1,531 @@ +PUBLIC CryptonightR_template_part1 +PUBLIC CryptonightR_template_mainloop +PUBLIC CryptonightR_template_part2 +PUBLIC CryptonightR_template_part3 +PUBLIC CryptonightR_template_end +PUBLIC CryptonightR_template_double_part1 +PUBLIC CryptonightR_template_double_mainloop +PUBLIC CryptonightR_template_double_part2 +PUBLIC CryptonightR_template_double_part3 +PUBLIC CryptonightR_template_double_part4 +PUBLIC CryptonightR_template_double_end + +ALIGN(64) +CryptonightR_template_part1: + mov QWORD PTR [rsp+16], rbx + mov QWORD PTR [rsp+24], rbp + mov QWORD PTR [rsp+32], rsi + push r10 + push r11 + push r12 + push r13 + push r14 + push r15 + push rdi + sub rsp, 64 + mov r12, rcx + mov r8, QWORD PTR [r12+32] + mov rdx, r12 + xor r8, QWORD PTR [r12] + mov r15, QWORD PTR [r12+40] + mov r9, r8 + xor r15, QWORD PTR [r12+8] + mov r11, QWORD PTR [r12+224] + mov r12, QWORD PTR [r12+56] + xor r12, QWORD PTR [rdx+24] + mov rax, QWORD PTR [rdx+48] + xor rax, QWORD PTR [rdx+16] + movaps XMMWORD PTR [rsp+48], xmm6 + movq xmm0, r12 + movaps XMMWORD PTR [rsp+32], xmm7 + movaps XMMWORD PTR [rsp+16], xmm8 + movaps XMMWORD PTR [rsp], xmm9 + mov r12, QWORD PTR [rdx+88] + xor r12, QWORD PTR [rdx+72] + movq xmm6, rax + mov rax, QWORD PTR [rdx+80] + xor rax, QWORD PTR [rdx+64] + punpcklqdq xmm6, xmm0 + and r9d, 2097136 + movq xmm0, r12 + movq xmm7, rax + punpcklqdq xmm7, xmm0 + mov r10d, r9d + movq xmm9, rsp + mov rsp, r8 + mov r8d, 524288 + + mov ebx, [rdx+96] + mov esi, [rdx+100] + mov edi, [rdx+104] + mov ebp, [rdx+108] + + ALIGN(64) +CryptonightR_template_mainloop: + movdqa xmm5, XMMWORD PTR [r9+r11] + movq xmm0, r15 + movq xmm4, rsp + punpcklqdq xmm4, xmm0 + lea rdx, QWORD PTR [r9+r11] + + aesenc xmm5, xmm4 + + mov r13d, r9d + mov eax, r9d + xor r9d, 48 + xor r13d, 16 + xor eax, 32 + movdqu xmm0, XMMWORD PTR [r9+r11] + movaps xmm3, xmm0 + movdqu xmm2, XMMWORD PTR [r13+r11] + movdqu xmm1, XMMWORD PTR [rax+r11] + pxor xmm0, xmm2 + pxor xmm5, xmm1 + pxor xmm5, xmm0 + + movq r12, xmm5 + movd r10d, xmm5 + and r10d, 2097136 + + paddq xmm3, xmm7 + paddq xmm2, xmm6 + paddq xmm1, xmm4 + movdqu XMMWORD PTR [r13+r11], xmm3 + movdqu XMMWORD PTR [rax+r11], xmm2 + movdqu XMMWORD PTR [r9+r11], xmm1 + + movdqa xmm0, xmm5 + pxor xmm0, xmm6 + movdqu XMMWORD PTR [rdx], xmm0 + + lea r13d, [ebx+esi] + lea edx, [edi+ebp] + shl rdx, 32 + or r13, rdx + + movd eax, xmm6 + movd edx, xmm7 + pextrd r9d, xmm7, 2 + + xor r13, QWORD PTR [r10+r11] + mov r14, QWORD PTR [r10+r11+8] + +CryptonightR_template_part2: + lea rcx, [r10+r11] + + mov eax, edi + mov edx, ebp + shl rdx, 32 + or rax, rdx + xor rsp, rax + + mov eax, ebx + mov edx, esi + shl rdx, 32 + or rax, rdx + xor r15, rax + + mov rax, r13 + mul r12 + add r15, rax + add rsp, rdx + + mov r9d, r10d + mov r12d, r10d + xor r9d, 16 + xor r12d, 32 + xor r10d, 48 + movdqa xmm1, XMMWORD PTR [r12+r11] + movaps xmm3, xmm1 + movdqa xmm2, XMMWORD PTR [r9+r11] + movdqa xmm0, XMMWORD PTR [r10+r11] + pxor xmm1, xmm2 + pxor xmm5, xmm0 + pxor xmm5, xmm1 + paddq xmm3, xmm4 + paddq xmm2, xmm6 + paddq xmm0, xmm7 + movdqu XMMWORD PTR [r9+r11], xmm0 + movdqu XMMWORD PTR [r12+r11], xmm2 + movdqu XMMWORD PTR [r10+r11], xmm3 + + movdqa xmm7, xmm6 + mov QWORD PTR [rcx], rsp + xor rsp, r13 + mov r9d, esp + mov QWORD PTR [rcx+8], r15 + and r9d, 2097136 + xor r15, r14 + movdqa xmm6, xmm5 + dec r8d + jnz CryptonightR_template_mainloop + +CryptonightR_template_part3: + movq rsp, xmm9 + + mov rbx, QWORD PTR [rsp+136] + mov rbp, QWORD PTR [rsp+144] + mov rsi, QWORD PTR [rsp+152] + movaps xmm6, XMMWORD PTR [rsp+48] + movaps xmm7, XMMWORD PTR [rsp+32] + movaps xmm8, XMMWORD PTR [rsp+16] + movaps xmm9, XMMWORD PTR [rsp] + add rsp, 64 + pop rdi + pop r15 + pop r14 + pop r13 + pop r12 + pop r11 + pop r10 + ret 0 +CryptonightR_template_end: + +ALIGN(64) +CryptonightR_template_double_part1: + mov QWORD PTR [rsp+24], rbx + push rbp + push rsi + push rdi + push r12 + push r13 + push r14 + push r15 + sub rsp, 320 + mov r14, QWORD PTR [rcx+32] + mov r8, rcx + xor r14, QWORD PTR [rcx] + mov r12, QWORD PTR [rcx+40] + mov ebx, r14d + mov rsi, QWORD PTR [rcx+224] + and ebx, 2097136 + xor r12, QWORD PTR [rcx+8] + mov rcx, QWORD PTR [rcx+56] + xor rcx, QWORD PTR [r8+24] + mov rax, QWORD PTR [r8+48] + xor rax, QWORD PTR [r8+16] + mov r15, QWORD PTR [rdx+32] + xor r15, QWORD PTR [rdx] + movq xmm0, rcx + mov rcx, QWORD PTR [r8+88] + xor rcx, QWORD PTR [r8+72] + mov r13, QWORD PTR [rdx+40] + mov rdi, QWORD PTR [rdx+224] + xor r13, QWORD PTR [rdx+8] + movaps XMMWORD PTR [rsp+160], xmm6 + movaps XMMWORD PTR [rsp+176], xmm7 + movaps XMMWORD PTR [rsp+192], xmm8 + movaps XMMWORD PTR [rsp+208], xmm9 + movaps XMMWORD PTR [rsp+224], xmm10 + movaps XMMWORD PTR [rsp+240], xmm11 + movaps XMMWORD PTR [rsp+256], xmm12 + movaps XMMWORD PTR [rsp+272], xmm13 + movaps XMMWORD PTR [rsp+288], xmm14 + movaps XMMWORD PTR [rsp+304], xmm15 + movq xmm7, rax + mov rax, QWORD PTR [r8+80] + xor rax, QWORD PTR [r8+64] + + movaps xmm1, XMMWORD PTR [rdx+96] + movaps xmm2, XMMWORD PTR [r8+96] + movaps XMMWORD PTR [rsp], xmm1 + movaps XMMWORD PTR [rsp+16], xmm2 + + mov r8d, r15d + punpcklqdq xmm7, xmm0 + movq xmm0, rcx + mov rcx, QWORD PTR [rdx+56] + xor rcx, QWORD PTR [rdx+24] + movq xmm9, rax + mov QWORD PTR [rsp+128], rsi + mov rax, QWORD PTR [rdx+48] + xor rax, QWORD PTR [rdx+16] + punpcklqdq xmm9, xmm0 + movq xmm0, rcx + mov rcx, QWORD PTR [rdx+88] + xor rcx, QWORD PTR [rdx+72] + movq xmm8, rax + mov QWORD PTR [rsp+136], rdi + mov rax, QWORD PTR [rdx+80] + xor rax, QWORD PTR [rdx+64] + punpcklqdq xmm8, xmm0 + and r8d, 2097136 + movq xmm0, rcx + mov r11d, 524288 + movq xmm10, rax + punpcklqdq xmm10, xmm0 + + movq xmm14, QWORD PTR [rsp+128] + movq xmm15, QWORD PTR [rsp+136] + + ALIGN(64) +CryptonightR_template_double_mainloop: + movdqu xmm6, XMMWORD PTR [rbx+rsi] + movq xmm0, r12 + mov ecx, ebx + movq xmm3, r14 + punpcklqdq xmm3, xmm0 + xor ebx, 16 + aesenc xmm6, xmm3 + movq xmm4, r15 + movdqu xmm0, XMMWORD PTR [rbx+rsi] + pxor xmm6, xmm0 + xor ebx, 48 + paddq xmm0, xmm7 + movdqu xmm1, XMMWORD PTR [rbx+rsi] + pxor xmm6, xmm1 + movdqu XMMWORD PTR [rbx+rsi], xmm0 + paddq xmm1, xmm3 + xor ebx, 16 + mov eax, ebx + xor rax, 32 + movdqu xmm0, XMMWORD PTR [rbx+rsi] + pxor xmm6, xmm0 + movq rdx, xmm6 + movdqu XMMWORD PTR [rbx+rsi], xmm1 + paddq xmm0, xmm9 + movdqu XMMWORD PTR [rax+rsi], xmm0 + movdqa xmm0, xmm6 + pxor xmm0, xmm7 + movdqu XMMWORD PTR [rcx+rsi], xmm0 + mov esi, edx + movdqu xmm5, XMMWORD PTR [r8+rdi] + and esi, 2097136 + mov ecx, r8d + movq xmm0, r13 + punpcklqdq xmm4, xmm0 + xor r8d, 16 + aesenc xmm5, xmm4 + movdqu xmm0, XMMWORD PTR [r8+rdi] + pxor xmm5, xmm0 + xor r8d, 48 + paddq xmm0, xmm8 + movdqu xmm1, XMMWORD PTR [r8+rdi] + pxor xmm5, xmm1 + movdqu XMMWORD PTR [r8+rdi], xmm0 + paddq xmm1, xmm4 + xor r8d, 16 + mov eax, r8d + xor rax, 32 + movdqu xmm0, XMMWORD PTR [r8+rdi] + pxor xmm5, xmm0 + movdqu XMMWORD PTR [r8+rdi], xmm1 + paddq xmm0, xmm10 + movdqu XMMWORD PTR [rax+rdi], xmm0 + movdqa xmm0, xmm5 + pxor xmm0, xmm8 + movdqu XMMWORD PTR [rcx+rdi], xmm0 + movq rdi, xmm5 + movq rcx, xmm14 + mov ebp, edi + mov r8, QWORD PTR [rcx+rsi] + mov r10, QWORD PTR [rcx+rsi+8] + lea r9, QWORD PTR [rcx+rsi] + xor esi, 16 + + movq xmm0, rsp + movq xmm1, rsi + movq xmm2, rdi + movq xmm11, rbp + movq xmm12, r15 + movq xmm13, rdx + mov [rsp+104], rcx + mov [rsp+112], r9 + + mov ebx, DWORD PTR [rsp+16] + mov esi, DWORD PTR [rsp+20] + mov edi, DWORD PTR [rsp+24] + mov ebp, DWORD PTR [rsp+28] + + lea eax, [ebx+esi] + lea edx, [edi+ebp] + shl rdx, 32 + or rax, rdx + xor r8, rax + + movd esp, xmm3 + pextrd r15d, xmm3, 2 + movd eax, xmm7 + movd edx, xmm9 + pextrd r9d, xmm9, 2 + +CryptonightR_template_double_part2: + + mov eax, edi + mov edx, ebp + shl rdx, 32 + or rax, rdx + xor r14, rax + + mov eax, ebx + mov edx, esi + shl rdx, 32 + or rax, rdx + xor r12, rax + + movq rsp, xmm0 + mov DWORD PTR [rsp+16], ebx + mov DWORD PTR [rsp+20], esi + mov DWORD PTR [rsp+24], edi + mov DWORD PTR [rsp+28], ebp + + movq rsi, xmm1 + movq rdi, xmm2 + movq rbp, xmm11 + movq r15, xmm12 + movq rdx, xmm13 + mov rcx, [rsp+104] + mov r9, [rsp+112] + + mov rbx, r8 + mov rax, r8 + mul rdx + and ebp, 2097136 + mov r8, rax + movdqu xmm1, XMMWORD PTR [rcx+rsi] + pxor xmm6, xmm1 + xor esi, 48 + paddq xmm1, xmm7 + movdqu xmm2, XMMWORD PTR [rsi+rcx] + pxor xmm6, xmm2 + paddq xmm2, xmm3 + movdqu XMMWORD PTR [rsi+rcx], xmm1 + xor esi, 16 + mov eax, esi + mov rsi, rcx + movdqu xmm0, XMMWORD PTR [rax+rcx] + pxor xmm6, xmm0 + movdqu XMMWORD PTR [rax+rcx], xmm2 + paddq xmm0, xmm9 + add r12, r8 + xor rax, 32 + add r14, rdx + movdqa xmm9, xmm7 + movdqa xmm7, xmm6 + movdqu XMMWORD PTR [rax+rcx], xmm0 + mov QWORD PTR [r9+8], r12 + xor r12, r10 + mov QWORD PTR [r9], r14 + movq rcx, xmm15 + xor r14, rbx + mov r10d, ebp + mov ebx, r14d + xor ebp, 16 + and ebx, 2097136 + mov r8, QWORD PTR [r10+rcx] + mov r9, QWORD PTR [r10+rcx+8] + + movq xmm0, rsp + movq xmm1, rbx + movq xmm2, rsi + movq xmm11, rdi + movq xmm12, rbp + movq xmm13, r15 + mov [rsp+104], rcx + mov [rsp+112], r9 + + mov ebx, DWORD PTR [rsp] + mov esi, DWORD PTR [rsp+4] + mov edi, DWORD PTR [rsp+8] + mov ebp, DWORD PTR [rsp+12] + + lea eax, [ebx+esi] + lea edx, [edi+ebp] + shl rdx, 32 + or rax, rdx + + xor r8, rax + movq xmm3, r8 + + movd esp, xmm4 + pextrd r15d, xmm4, 2 + movd eax, xmm8 + movd edx, xmm10 + pextrd r9d, xmm10, 2 + +CryptonightR_template_double_part3: + + movq r15, xmm13 + + mov eax, edi + mov edx, ebp + shl rdx, 32 + or rax, rdx + xor r15, rax + + mov eax, ebx + mov edx, esi + shl rdx, 32 + or rax, rdx + xor r13, rax + + movq rsp, xmm0 + mov DWORD PTR [rsp], ebx + mov DWORD PTR [rsp+4], esi + mov DWORD PTR [rsp+8], edi + mov DWORD PTR [rsp+12], ebp + + movq rbx, xmm1 + movq rsi, xmm2 + movq rdi, xmm11 + movq rbp, xmm12 + mov rcx, [rsp+104] + mov r9, [rsp+112] + + mov rax, r8 + mul rdi + mov rdi, rcx + mov r8, rax + movdqu xmm1, XMMWORD PTR [rbp+rcx] + pxor xmm5, xmm1 + xor ebp, 48 + paddq xmm1, xmm8 + add r13, r8 + movdqu xmm2, XMMWORD PTR [rbp+rcx] + pxor xmm5, xmm2 + add r15, rdx + movdqu XMMWORD PTR [rbp+rcx], xmm1 + paddq xmm2, xmm4 + xor ebp, 16 + mov eax, ebp + xor rax, 32 + movdqu xmm0, XMMWORD PTR [rbp+rcx] + pxor xmm5, xmm0 + movdqu XMMWORD PTR [rbp+rcx], xmm2 + paddq xmm0, xmm10 + movdqu XMMWORD PTR [rax+rcx], xmm0 + movq rax, xmm3 + movdqa xmm10, xmm8 + mov QWORD PTR [r10+rcx], r15 + movdqa xmm8, xmm5 + xor r15, rax + mov QWORD PTR [r10+rcx+8], r13 + mov r8d, r15d + xor r13, r9 + and r8d, 2097136 + dec r11d + jnz CryptonightR_template_double_mainloop + +CryptonightR_template_double_part4: + + mov rbx, QWORD PTR [rsp+400] + movaps xmm6, XMMWORD PTR [rsp+160] + movaps xmm7, XMMWORD PTR [rsp+176] + movaps xmm8, XMMWORD PTR [rsp+192] + movaps xmm9, XMMWORD PTR [rsp+208] + movaps xmm10, XMMWORD PTR [rsp+224] + movaps xmm11, XMMWORD PTR [rsp+240] + movaps xmm12, XMMWORD PTR [rsp+256] + movaps xmm13, XMMWORD PTR [rsp+272] + movaps xmm14, XMMWORD PTR [rsp+288] + movaps xmm15, XMMWORD PTR [rsp+304] + add rsp, 320 + pop r15 + pop r14 + pop r13 + pop r12 + pop rdi + pop rsi + pop rbp + ret 0 +CryptonightR_template_double_end: diff --git a/src/Native/libcryptonight/xmrig/crypto/asm/CryptonightWOW_soft_aes_template.inc b/src/Native/libcryptonight/xmrig/crypto/asm/CryptonightWOW_soft_aes_template.inc new file mode 100644 index 0000000000..feea3949c2 --- /dev/null +++ b/src/Native/libcryptonight/xmrig/crypto/asm/CryptonightWOW_soft_aes_template.inc @@ -0,0 +1,266 @@ +PUBLIC FN_PREFIX(CryptonightWOW_soft_aes_template_part1) +PUBLIC FN_PREFIX(CryptonightWOW_soft_aes_template_mainloop) +PUBLIC FN_PREFIX(CryptonightWOW_soft_aes_template_part2) +PUBLIC FN_PREFIX(CryptonightWOW_soft_aes_template_part3) +PUBLIC FN_PREFIX(CryptonightWOW_soft_aes_template_end) + +ALIGN(64) +FN_PREFIX(CryptonightWOW_soft_aes_template_part1): + mov QWORD PTR [rsp+8], rcx + push rbx + push rbp + push rsi + push rdi + push r12 + push r13 + push r14 + push r15 + sub rsp, 232 + + mov eax, [rcx+96] + mov ebx, [rcx+100] + mov esi, [rcx+104] + mov edx, [rcx+108] + mov [rsp+144], eax + mov [rsp+148], ebx + mov [rsp+152], esi + mov [rsp+156], edx + + mov rax, QWORD PTR [rcx+48] + mov r10, rcx + xor rax, QWORD PTR [rcx+16] + mov r8, QWORD PTR [rcx+32] + xor r8, QWORD PTR [rcx] + mov r9, QWORD PTR [rcx+40] + xor r9, QWORD PTR [rcx+8] + movq xmm4, rax + mov rdx, QWORD PTR [rcx+56] + xor rdx, QWORD PTR [rcx+24] + mov r11, QWORD PTR [rcx+224] + mov rcx, QWORD PTR [rcx+88] + xor rcx, QWORD PTR [r10+72] + mov rax, QWORD PTR [r10+80] + movq xmm0, rdx + xor rax, QWORD PTR [r10+64] + + movaps XMMWORD PTR [rsp+16], xmm6 + movaps XMMWORD PTR [rsp+32], xmm7 + movaps XMMWORD PTR [rsp+48], xmm8 + movaps XMMWORD PTR [rsp+64], xmm9 + movaps XMMWORD PTR [rsp+80], xmm10 + movaps XMMWORD PTR [rsp+96], xmm11 + movaps XMMWORD PTR [rsp+112], xmm12 + movaps XMMWORD PTR [rsp+128], xmm13 + + movq xmm5, rax + + mov rax, r8 + punpcklqdq xmm4, xmm0 + and eax, 2097136 + movq xmm10, QWORD PTR [r10+96] + movq xmm0, rcx + mov rcx, QWORD PTR [r10+104] + xorps xmm9, xmm9 + mov QWORD PTR [rsp+328], rax + movq xmm12, r11 + mov QWORD PTR [rsp+320], r9 + punpcklqdq xmm5, xmm0 + movq xmm13, rcx + mov r12d, 524288 + + ALIGN(64) +FN_PREFIX(CryptonightWOW_soft_aes_template_mainloop): + movd xmm11, r12d + mov r12, QWORD PTR [r10+272] + lea r13, QWORD PTR [rax+r11] + mov esi, DWORD PTR [r13] + movq xmm0, r9 + mov r10d, DWORD PTR [r13+4] + movq xmm7, r8 + mov ebp, DWORD PTR [r13+12] + mov r14d, DWORD PTR [r13+8] + mov rdx, QWORD PTR [rsp+328] + movzx ecx, sil + shr esi, 8 + punpcklqdq xmm7, xmm0 + mov r15d, DWORD PTR [r12+rcx*4] + movzx ecx, r10b + shr r10d, 8 + mov edi, DWORD PTR [r12+rcx*4] + movzx ecx, r14b + shr r14d, 8 + mov ebx, DWORD PTR [r12+rcx*4] + movzx ecx, bpl + shr ebp, 8 + mov r9d, DWORD PTR [r12+rcx*4] + movzx ecx, r10b + shr r10d, 8 + xor r15d, DWORD PTR [r12+rcx*4+1024] + movzx ecx, r14b + shr r14d, 8 + mov eax, r14d + shr eax, 8 + xor edi, DWORD PTR [r12+rcx*4+1024] + add eax, 256 + movzx ecx, bpl + shr ebp, 8 + xor ebx, DWORD PTR [r12+rcx*4+1024] + movzx ecx, sil + shr esi, 8 + xor r9d, DWORD PTR [r12+rcx*4+1024] + add r12, 2048 + movzx ecx, r10b + shr r10d, 8 + add r10d, 256 + mov r11d, DWORD PTR [r12+rax*4] + xor r11d, DWORD PTR [r12+rcx*4] + xor r11d, r9d + movzx ecx, sil + mov r10d, DWORD PTR [r12+r10*4] + shr esi, 8 + add esi, 256 + xor r10d, DWORD PTR [r12+rcx*4] + movzx ecx, bpl + xor r10d, ebx + shr ebp, 8 + movd xmm1, r11d + add ebp, 256 + movq r11, xmm12 + mov r9d, DWORD PTR [r12+rcx*4] + xor r9d, DWORD PTR [r12+rsi*4] + mov eax, DWORD PTR [r12+rbp*4] + xor r9d, edi + movzx ecx, r14b + movd xmm0, r10d + movd xmm2, r9d + xor eax, DWORD PTR [r12+rcx*4] + mov rcx, rdx + xor eax, r15d + punpckldq xmm2, xmm1 + xor rcx, 16 + movd xmm6, eax + mov rax, rdx + punpckldq xmm6, xmm0 + xor rax, 32 + punpckldq xmm6, xmm2 + xor rdx, 48 + movdqu xmm2, XMMWORD PTR [rcx+r11] + pxor xmm6, xmm7 + paddq xmm2, xmm4 + movdqu xmm1, XMMWORD PTR [rax+r11] + movdqu xmm0, XMMWORD PTR [rdx+r11] + paddq xmm0, xmm5 + movdqu XMMWORD PTR [rcx+r11], xmm0 + movdqu XMMWORD PTR [rax+r11], xmm2 + movq rcx, xmm13 + paddq xmm1, xmm7 + movdqu XMMWORD PTR [rdx+r11], xmm1 + movq rdi, xmm6 + mov r10, rdi + and r10d, 2097136 + movdqa xmm0, xmm6 + pxor xmm0, xmm4 + movdqu XMMWORD PTR [r13], xmm0 + + mov ebx, [rsp+144] + mov ebp, [rsp+152] + add ebx, [rsp+148] + add ebp, [rsp+156] + shl rbp, 32 + or rbx, rbp + + xor rbx, QWORD PTR [r10+r11] + lea r14, QWORD PTR [r10+r11] + mov rbp, QWORD PTR [r14+8] + + mov [rsp+160], rbx + mov [rsp+168], rdi + mov [rsp+176], rbp + mov [rsp+184], r10 + mov r10, rsp + + mov ebx, [rsp+144] + mov esi, [rsp+148] + mov edi, [rsp+152] + mov ebp, [rsp+156] + + movd esp, xmm7 + movaps xmm0, xmm7 + psrldq xmm0, 8 + movd r15d, xmm0 + movd eax, xmm4 + movd edx, xmm5 + +FN_PREFIX(CryptonightWOW_soft_aes_template_part2): + mov rsp, r10 + mov [rsp+144], ebx + mov [rsp+148], esi + mov [rsp+152], edi + mov [rsp+156], ebp + + mov rbx, [rsp+160] + mov rdi, [rsp+168] + mov rbp, [rsp+176] + mov r10, [rsp+184] + + mov r9, r10 + xor r9, 16 + mov rcx, r10 + xor rcx, 32 + xor r10, 48 + mov rax, rbx + mul rdi + movdqu xmm2, XMMWORD PTR [r9+r11] + movdqu xmm1, XMMWORD PTR [rcx+r11] + paddq xmm1, xmm7 + movq xmm0, rax + movq xmm3, rdx + xor rax, QWORD PTR [r11+rcx+8] + xor rdx, QWORD PTR [rcx+r11] + punpcklqdq xmm3, xmm0 + add r8, rdx + movdqu xmm0, XMMWORD PTR [r10+r11] + pxor xmm2, xmm3 + paddq xmm0, xmm5 + paddq xmm2, xmm4 + movdqu XMMWORD PTR [r9+r11], xmm0 + movdqa xmm5, xmm4 + mov r9, QWORD PTR [rsp+320] + movdqa xmm4, xmm6 + add r9, rax + movdqu XMMWORD PTR [rcx+r11], xmm2 + movdqu XMMWORD PTR [r10+r11], xmm1 + mov r10, QWORD PTR [rsp+304] + movd r12d, xmm11 + mov QWORD PTR [r14], r8 + xor r8, rbx + mov rax, r8 + mov QWORD PTR [r14+8], r9 + and eax, 2097136 + xor r9, rbp + mov QWORD PTR [rsp+320], r9 + mov QWORD PTR [rsp+328], rax + sub r12d, 1 + jne FN_PREFIX(CryptonightWOW_soft_aes_template_mainloop) + +FN_PREFIX(CryptonightWOW_soft_aes_template_part3): + movaps xmm6, XMMWORD PTR [rsp+16] + movaps xmm7, XMMWORD PTR [rsp+32] + movaps xmm8, XMMWORD PTR [rsp+48] + movaps xmm9, XMMWORD PTR [rsp+64] + movaps xmm10, XMMWORD PTR [rsp+80] + movaps xmm11, XMMWORD PTR [rsp+96] + movaps xmm12, XMMWORD PTR [rsp+112] + movaps xmm13, XMMWORD PTR [rsp+128] + + add rsp, 232 + pop r15 + pop r14 + pop r13 + pop r12 + pop rdi + pop rsi + pop rbp + pop rbx + ret +FN_PREFIX(CryptonightWOW_soft_aes_template_end): diff --git a/src/Native/libcryptonight/xmrig/crypto/asm/CryptonightWOW_soft_aes_template_win.inc b/src/Native/libcryptonight/xmrig/crypto/asm/CryptonightWOW_soft_aes_template_win.inc new file mode 100644 index 0000000000..6ebad99f63 --- /dev/null +++ b/src/Native/libcryptonight/xmrig/crypto/asm/CryptonightWOW_soft_aes_template_win.inc @@ -0,0 +1,266 @@ +PUBLIC CryptonightWOW_soft_aes_template_part1 +PUBLIC CryptonightWOW_soft_aes_template_mainloop +PUBLIC CryptonightWOW_soft_aes_template_part2 +PUBLIC CryptonightWOW_soft_aes_template_part3 +PUBLIC CryptonightWOW_soft_aes_template_end + +ALIGN(64) +CryptonightWOW_soft_aes_template_part1: + mov QWORD PTR [rsp+8], rcx + push rbx + push rbp + push rsi + push rdi + push r12 + push r13 + push r14 + push r15 + sub rsp, 232 + + mov eax, [rcx+96] + mov ebx, [rcx+100] + mov esi, [rcx+104] + mov edx, [rcx+108] + mov [rsp+144], eax + mov [rsp+148], ebx + mov [rsp+152], esi + mov [rsp+156], edx + + mov rax, QWORD PTR [rcx+48] + mov r10, rcx + xor rax, QWORD PTR [rcx+16] + mov r8, QWORD PTR [rcx+32] + xor r8, QWORD PTR [rcx] + mov r9, QWORD PTR [rcx+40] + xor r9, QWORD PTR [rcx+8] + movq xmm4, rax + mov rdx, QWORD PTR [rcx+56] + xor rdx, QWORD PTR [rcx+24] + mov r11, QWORD PTR [rcx+224] + mov rcx, QWORD PTR [rcx+88] + xor rcx, QWORD PTR [r10+72] + mov rax, QWORD PTR [r10+80] + movq xmm0, rdx + xor rax, QWORD PTR [r10+64] + + movaps XMMWORD PTR [rsp+16], xmm6 + movaps XMMWORD PTR [rsp+32], xmm7 + movaps XMMWORD PTR [rsp+48], xmm8 + movaps XMMWORD PTR [rsp+64], xmm9 + movaps XMMWORD PTR [rsp+80], xmm10 + movaps XMMWORD PTR [rsp+96], xmm11 + movaps XMMWORD PTR [rsp+112], xmm12 + movaps XMMWORD PTR [rsp+128], xmm13 + + movq xmm5, rax + + mov rax, r8 + punpcklqdq xmm4, xmm0 + and eax, 2097136 + movq xmm10, QWORD PTR [r10+96] + movq xmm0, rcx + mov rcx, QWORD PTR [r10+104] + xorps xmm9, xmm9 + mov QWORD PTR [rsp+328], rax + movq xmm12, r11 + mov QWORD PTR [rsp+320], r9 + punpcklqdq xmm5, xmm0 + movq xmm13, rcx + mov r12d, 524288 + + ALIGN(64) +CryptonightWOW_soft_aes_template_mainloop: + movd xmm11, r12d + mov r12, QWORD PTR [r10+272] + lea r13, QWORD PTR [rax+r11] + mov esi, DWORD PTR [r13] + movq xmm0, r9 + mov r10d, DWORD PTR [r13+4] + movq xmm7, r8 + mov ebp, DWORD PTR [r13+12] + mov r14d, DWORD PTR [r13+8] + mov rdx, QWORD PTR [rsp+328] + movzx ecx, sil + shr esi, 8 + punpcklqdq xmm7, xmm0 + mov r15d, DWORD PTR [r12+rcx*4] + movzx ecx, r10b + shr r10d, 8 + mov edi, DWORD PTR [r12+rcx*4] + movzx ecx, r14b + shr r14d, 8 + mov ebx, DWORD PTR [r12+rcx*4] + movzx ecx, bpl + shr ebp, 8 + mov r9d, DWORD PTR [r12+rcx*4] + movzx ecx, r10b + shr r10d, 8 + xor r15d, DWORD PTR [r12+rcx*4+1024] + movzx ecx, r14b + shr r14d, 8 + mov eax, r14d + shr eax, 8 + xor edi, DWORD PTR [r12+rcx*4+1024] + add eax, 256 + movzx ecx, bpl + shr ebp, 8 + xor ebx, DWORD PTR [r12+rcx*4+1024] + movzx ecx, sil + shr esi, 8 + xor r9d, DWORD PTR [r12+rcx*4+1024] + add r12, 2048 + movzx ecx, r10b + shr r10d, 8 + add r10d, 256 + mov r11d, DWORD PTR [r12+rax*4] + xor r11d, DWORD PTR [r12+rcx*4] + xor r11d, r9d + movzx ecx, sil + mov r10d, DWORD PTR [r12+r10*4] + shr esi, 8 + add esi, 256 + xor r10d, DWORD PTR [r12+rcx*4] + movzx ecx, bpl + xor r10d, ebx + shr ebp, 8 + movd xmm1, r11d + add ebp, 256 + movq r11, xmm12 + mov r9d, DWORD PTR [r12+rcx*4] + xor r9d, DWORD PTR [r12+rsi*4] + mov eax, DWORD PTR [r12+rbp*4] + xor r9d, edi + movzx ecx, r14b + movd xmm0, r10d + movd xmm2, r9d + xor eax, DWORD PTR [r12+rcx*4] + mov rcx, rdx + xor eax, r15d + punpckldq xmm2, xmm1 + xor rcx, 16 + movd xmm6, eax + mov rax, rdx + punpckldq xmm6, xmm0 + xor rax, 32 + punpckldq xmm6, xmm2 + xor rdx, 48 + movdqu xmm2, XMMWORD PTR [rcx+r11] + pxor xmm6, xmm7 + paddq xmm2, xmm4 + movdqu xmm1, XMMWORD PTR [rax+r11] + movdqu xmm0, XMMWORD PTR [rdx+r11] + paddq xmm0, xmm5 + movdqu XMMWORD PTR [rcx+r11], xmm0 + movdqu XMMWORD PTR [rax+r11], xmm2 + movq rcx, xmm13 + paddq xmm1, xmm7 + movdqu XMMWORD PTR [rdx+r11], xmm1 + movq rdi, xmm6 + mov r10, rdi + and r10d, 2097136 + movdqa xmm0, xmm6 + pxor xmm0, xmm4 + movdqu XMMWORD PTR [r13], xmm0 + + mov ebx, [rsp+144] + mov ebp, [rsp+152] + add ebx, [rsp+148] + add ebp, [rsp+156] + shl rbp, 32 + or rbx, rbp + + xor rbx, QWORD PTR [r10+r11] + lea r14, QWORD PTR [r10+r11] + mov rbp, QWORD PTR [r14+8] + + mov [rsp+160], rbx + mov [rsp+168], rdi + mov [rsp+176], rbp + mov [rsp+184], r10 + mov r10, rsp + + mov ebx, [rsp+144] + mov esi, [rsp+148] + mov edi, [rsp+152] + mov ebp, [rsp+156] + + movd esp, xmm7 + movaps xmm0, xmm7 + psrldq xmm0, 8 + movd r15d, xmm0 + movd eax, xmm4 + movd edx, xmm5 + +CryptonightWOW_soft_aes_template_part2: + mov rsp, r10 + mov [rsp+144], ebx + mov [rsp+148], esi + mov [rsp+152], edi + mov [rsp+156], ebp + + mov rbx, [rsp+160] + mov rdi, [rsp+168] + mov rbp, [rsp+176] + mov r10, [rsp+184] + + mov r9, r10 + xor r9, 16 + mov rcx, r10 + xor rcx, 32 + xor r10, 48 + mov rax, rbx + mul rdi + movdqu xmm2, XMMWORD PTR [r9+r11] + movdqu xmm1, XMMWORD PTR [rcx+r11] + paddq xmm1, xmm7 + movq xmm0, rax + movq xmm3, rdx + xor rax, QWORD PTR [r11+rcx+8] + xor rdx, QWORD PTR [rcx+r11] + punpcklqdq xmm3, xmm0 + add r8, rdx + movdqu xmm0, XMMWORD PTR [r10+r11] + pxor xmm2, xmm3 + paddq xmm0, xmm5 + paddq xmm2, xmm4 + movdqu XMMWORD PTR [r9+r11], xmm0 + movdqa xmm5, xmm4 + mov r9, QWORD PTR [rsp+320] + movdqa xmm4, xmm6 + add r9, rax + movdqu XMMWORD PTR [rcx+r11], xmm2 + movdqu XMMWORD PTR [r10+r11], xmm1 + mov r10, QWORD PTR [rsp+304] + movd r12d, xmm11 + mov QWORD PTR [r14], r8 + xor r8, rbx + mov rax, r8 + mov QWORD PTR [r14+8], r9 + and eax, 2097136 + xor r9, rbp + mov QWORD PTR [rsp+320], r9 + mov QWORD PTR [rsp+328], rax + sub r12d, 1 + jne CryptonightWOW_soft_aes_template_mainloop + +CryptonightWOW_soft_aes_template_part3: + movaps xmm6, XMMWORD PTR [rsp+16] + movaps xmm7, XMMWORD PTR [rsp+32] + movaps xmm8, XMMWORD PTR [rsp+48] + movaps xmm9, XMMWORD PTR [rsp+64] + movaps xmm10, XMMWORD PTR [rsp+80] + movaps xmm11, XMMWORD PTR [rsp+96] + movaps xmm12, XMMWORD PTR [rsp+112] + movaps xmm13, XMMWORD PTR [rsp+128] + + add rsp, 232 + pop r15 + pop r14 + pop r13 + pop r12 + pop rdi + pop rsi + pop rbp + pop rbx + ret +CryptonightWOW_soft_aes_template_end: diff --git a/src/Native/libcryptonight/xmrig/crypto/asm/CryptonightWOW_template_win.inc b/src/Native/libcryptonight/xmrig/crypto/asm/CryptonightWOW_template_win.inc new file mode 100644 index 0000000000..c5652e2787 --- /dev/null +++ b/src/Native/libcryptonight/xmrig/crypto/asm/CryptonightWOW_template_win.inc @@ -0,0 +1,486 @@ +PUBLIC CryptonightWOW_template_part1 +PUBLIC CryptonightWOW_template_mainloop +PUBLIC CryptonightWOW_template_part2 +PUBLIC CryptonightWOW_template_part3 +PUBLIC CryptonightWOW_template_end +PUBLIC CryptonightWOW_template_double_part1 +PUBLIC CryptonightWOW_template_double_mainloop +PUBLIC CryptonightWOW_template_double_part2 +PUBLIC CryptonightWOW_template_double_part3 +PUBLIC CryptonightWOW_template_double_part4 +PUBLIC CryptonightWOW_template_double_end + +ALIGN(64) +CryptonightWOW_template_part1: + mov QWORD PTR [rsp+16], rbx + mov QWORD PTR [rsp+24], rbp + mov QWORD PTR [rsp+32], rsi + push r10 + push r11 + push r12 + push r13 + push r14 + push r15 + push rdi + sub rsp, 64 + mov r12, rcx + mov r8, QWORD PTR [r12+32] + mov rdx, r12 + xor r8, QWORD PTR [r12] + mov r15, QWORD PTR [r12+40] + mov r9, r8 + xor r15, QWORD PTR [r12+8] + mov r11, QWORD PTR [r12+224] + mov r12, QWORD PTR [r12+56] + xor r12, QWORD PTR [rdx+24] + mov rax, QWORD PTR [rdx+48] + xor rax, QWORD PTR [rdx+16] + movaps XMMWORD PTR [rsp+48], xmm6 + movq xmm0, r12 + movaps XMMWORD PTR [rsp+32], xmm7 + movaps XMMWORD PTR [rsp+16], xmm8 + movaps XMMWORD PTR [rsp], xmm9 + mov r12, QWORD PTR [rdx+88] + xor r12, QWORD PTR [rdx+72] + movq xmm6, rax + mov rax, QWORD PTR [rdx+80] + xor rax, QWORD PTR [rdx+64] + punpcklqdq xmm6, xmm0 + and r9d, 2097136 + movq xmm0, r12 + movq xmm7, rax + punpcklqdq xmm7, xmm0 + mov r10d, r9d + movq xmm9, rsp + mov rsp, r8 + mov r8d, 524288 + + mov ebx, [rdx+96] + mov esi, [rdx+100] + mov edi, [rdx+104] + mov ebp, [rdx+108] + + ALIGN(64) +CryptonightWOW_template_mainloop: + movdqa xmm5, XMMWORD PTR [r9+r11] + movq xmm0, r15 + movq xmm4, rsp + punpcklqdq xmm4, xmm0 + lea rdx, QWORD PTR [r9+r11] + + aesenc xmm5, xmm4 + movd r10d, xmm5 + and r10d, 2097136 + + mov r12d, r9d + mov eax, r9d + xor r9d, 48 + xor r12d, 16 + xor eax, 32 + movdqu xmm0, XMMWORD PTR [r9+r11] + movdqu xmm2, XMMWORD PTR [r12+r11] + movdqu xmm1, XMMWORD PTR [rax+r11] + paddq xmm0, xmm7 + paddq xmm2, xmm6 + paddq xmm1, xmm4 + movdqu XMMWORD PTR [r12+r11], xmm0 + movq r12, xmm5 + movdqu XMMWORD PTR [rax+r11], xmm2 + movdqu XMMWORD PTR [r9+r11], xmm1 + + movdqa xmm0, xmm5 + pxor xmm0, xmm6 + movdqu XMMWORD PTR [rdx], xmm0 + + lea r13d, [ebx+esi] + lea edx, [edi+ebp] + shl rdx, 32 + or r13, rdx + + xor r13, QWORD PTR [r10+r11] + mov r14, QWORD PTR [r10+r11+8] + + movd eax, xmm6 + movd edx, xmm7 + pextrd r9d, xmm7, 2 + +CryptonightWOW_template_part2: + mov rax, r13 + mul r12 + movq xmm0, rax + movq xmm3, rdx + punpcklqdq xmm3, xmm0 + + mov r9d, r10d + mov r12d, r10d + xor r9d, 16 + xor r12d, 32 + xor r10d, 48 + movdqa xmm1, XMMWORD PTR [r12+r11] + xor rdx, QWORD PTR [r12+r11] + xor rax, QWORD PTR [r11+r12+8] + movdqa xmm2, XMMWORD PTR [r9+r11] + pxor xmm3, xmm2 + paddq xmm7, XMMWORD PTR [r10+r11] + paddq xmm1, xmm4 + paddq xmm3, xmm6 + movdqu XMMWORD PTR [r9+r11], xmm7 + movdqu XMMWORD PTR [r12+r11], xmm3 + movdqu XMMWORD PTR [r10+r11], xmm1 + + movdqa xmm7, xmm6 + add r15, rax + add rsp, rdx + xor r10, 48 + mov QWORD PTR [r10+r11], rsp + xor rsp, r13 + mov r9d, esp + mov QWORD PTR [r10+r11+8], r15 + and r9d, 2097136 + xor r15, r14 + movdqa xmm6, xmm5 + dec r8d + jnz CryptonightWOW_template_mainloop + +CryptonightWOW_template_part3: + movq rsp, xmm9 + + mov rbx, QWORD PTR [rsp+136] + mov rbp, QWORD PTR [rsp+144] + mov rsi, QWORD PTR [rsp+152] + movaps xmm6, XMMWORD PTR [rsp+48] + movaps xmm7, XMMWORD PTR [rsp+32] + movaps xmm8, XMMWORD PTR [rsp+16] + movaps xmm9, XMMWORD PTR [rsp] + add rsp, 64 + pop rdi + pop r15 + pop r14 + pop r13 + pop r12 + pop r11 + pop r10 + ret 0 +CryptonightWOW_template_end: + +ALIGN(64) +CryptonightWOW_template_double_part1: + mov QWORD PTR [rsp+24], rbx + push rbp + push rsi + push rdi + push r12 + push r13 + push r14 + push r15 + sub rsp, 320 + mov r14, QWORD PTR [rcx+32] + mov r8, rcx + xor r14, QWORD PTR [rcx] + mov r12, QWORD PTR [rcx+40] + mov ebx, r14d + mov rsi, QWORD PTR [rcx+224] + and ebx, 2097136 + xor r12, QWORD PTR [rcx+8] + mov rcx, QWORD PTR [rcx+56] + xor rcx, QWORD PTR [r8+24] + mov rax, QWORD PTR [r8+48] + xor rax, QWORD PTR [r8+16] + mov r15, QWORD PTR [rdx+32] + xor r15, QWORD PTR [rdx] + movq xmm0, rcx + mov rcx, QWORD PTR [r8+88] + xor rcx, QWORD PTR [r8+72] + mov r13, QWORD PTR [rdx+40] + mov rdi, QWORD PTR [rdx+224] + xor r13, QWORD PTR [rdx+8] + movaps XMMWORD PTR [rsp+160], xmm6 + movaps XMMWORD PTR [rsp+176], xmm7 + movaps XMMWORD PTR [rsp+192], xmm8 + movaps XMMWORD PTR [rsp+208], xmm9 + movaps XMMWORD PTR [rsp+224], xmm10 + movaps XMMWORD PTR [rsp+240], xmm11 + movaps XMMWORD PTR [rsp+256], xmm12 + movaps XMMWORD PTR [rsp+272], xmm13 + movaps XMMWORD PTR [rsp+288], xmm14 + movaps XMMWORD PTR [rsp+304], xmm15 + movq xmm7, rax + mov rax, QWORD PTR [r8+80] + xor rax, QWORD PTR [r8+64] + + movaps xmm1, XMMWORD PTR [rdx+96] + movaps xmm2, XMMWORD PTR [r8+96] + movaps XMMWORD PTR [rsp], xmm1 + movaps XMMWORD PTR [rsp+16], xmm2 + + mov r8d, r15d + punpcklqdq xmm7, xmm0 + movq xmm0, rcx + mov rcx, QWORD PTR [rdx+56] + xor rcx, QWORD PTR [rdx+24] + movq xmm9, rax + mov QWORD PTR [rsp+128], rsi + mov rax, QWORD PTR [rdx+48] + xor rax, QWORD PTR [rdx+16] + punpcklqdq xmm9, xmm0 + movq xmm0, rcx + mov rcx, QWORD PTR [rdx+88] + xor rcx, QWORD PTR [rdx+72] + movq xmm8, rax + mov QWORD PTR [rsp+136], rdi + mov rax, QWORD PTR [rdx+80] + xor rax, QWORD PTR [rdx+64] + punpcklqdq xmm8, xmm0 + and r8d, 2097136 + movq xmm0, rcx + mov r11d, 524288 + movq xmm10, rax + punpcklqdq xmm10, xmm0 + + movq xmm14, QWORD PTR [rsp+128] + movq xmm15, QWORD PTR [rsp+136] + + ALIGN(64) +CryptonightWOW_template_double_mainloop: + movdqu xmm6, XMMWORD PTR [rbx+rsi] + movq xmm0, r12 + mov ecx, ebx + movq xmm3, r14 + punpcklqdq xmm3, xmm0 + xor ebx, 16 + aesenc xmm6, xmm3 + movq rdx, xmm6 + movq xmm4, r15 + movdqu xmm0, XMMWORD PTR [rbx+rsi] + xor ebx, 48 + paddq xmm0, xmm7 + movdqu xmm1, XMMWORD PTR [rbx+rsi] + movdqu XMMWORD PTR [rbx+rsi], xmm0 + paddq xmm1, xmm3 + xor ebx, 16 + mov eax, ebx + xor rax, 32 + movdqu xmm0, XMMWORD PTR [rbx+rsi] + movdqu XMMWORD PTR [rbx+rsi], xmm1 + paddq xmm0, xmm9 + movdqu XMMWORD PTR [rax+rsi], xmm0 + movdqa xmm0, xmm6 + pxor xmm0, xmm7 + movdqu XMMWORD PTR [rcx+rsi], xmm0 + mov esi, edx + movdqu xmm5, XMMWORD PTR [r8+rdi] + and esi, 2097136 + mov ecx, r8d + movq xmm0, r13 + punpcklqdq xmm4, xmm0 + xor r8d, 16 + aesenc xmm5, xmm4 + movdqu xmm0, XMMWORD PTR [r8+rdi] + xor r8d, 48 + paddq xmm0, xmm8 + movdqu xmm1, XMMWORD PTR [r8+rdi] + movdqu XMMWORD PTR [r8+rdi], xmm0 + paddq xmm1, xmm4 + xor r8d, 16 + mov eax, r8d + xor rax, 32 + movdqu xmm0, XMMWORD PTR [r8+rdi] + movdqu XMMWORD PTR [r8+rdi], xmm1 + paddq xmm0, xmm10 + movdqu XMMWORD PTR [rax+rdi], xmm0 + movdqa xmm0, xmm5 + pxor xmm0, xmm8 + movdqu XMMWORD PTR [rcx+rdi], xmm0 + movq rdi, xmm5 + movq rcx, xmm14 + mov ebp, edi + mov r8, QWORD PTR [rcx+rsi] + mov r10, QWORD PTR [rcx+rsi+8] + lea r9, QWORD PTR [rcx+rsi] + xor esi, 16 + + movq xmm0, rsp + movq xmm1, rsi + movq xmm2, rdi + movq xmm11, rbp + movq xmm12, r15 + movq xmm13, rdx + mov [rsp+104], rcx + mov [rsp+112], r9 + + mov ebx, DWORD PTR [rsp+16] + mov esi, DWORD PTR [rsp+20] + mov edi, DWORD PTR [rsp+24] + mov ebp, DWORD PTR [rsp+28] + + lea eax, [ebx+esi] + lea edx, [edi+ebp] + shl rdx, 32 + or rax, rdx + xor r8, rax + + movd esp, xmm3 + pextrd r15d, xmm3, 2 + movd eax, xmm7 + movd edx, xmm9 + pextrd r9d, xmm9, 2 + +CryptonightWOW_template_double_part2: + + movq rsp, xmm0 + mov DWORD PTR [rsp+16], ebx + mov DWORD PTR [rsp+20], esi + mov DWORD PTR [rsp+24], edi + mov DWORD PTR [rsp+28], ebp + + movq rsi, xmm1 + movq rdi, xmm2 + movq rbp, xmm11 + movq r15, xmm12 + movq rdx, xmm13 + mov rcx, [rsp+104] + mov r9, [rsp+112] + + mov rbx, r8 + mov rax, r8 + mul rdx + and ebp, 2097136 + mov r8, rax + movq xmm1, rdx + movq xmm0, r8 + punpcklqdq xmm1, xmm0 + pxor xmm1, XMMWORD PTR [rcx+rsi] + xor esi, 48 + paddq xmm1, xmm7 + movdqu xmm2, XMMWORD PTR [rsi+rcx] + xor rdx, QWORD PTR [rsi+rcx] + paddq xmm2, xmm3 + xor r8, QWORD PTR [rsi+rcx+8] + movdqu XMMWORD PTR [rsi+rcx], xmm1 + xor esi, 16 + mov eax, esi + mov rsi, rcx + movdqu xmm0, XMMWORD PTR [rax+rcx] + movdqu XMMWORD PTR [rax+rcx], xmm2 + paddq xmm0, xmm9 + add r12, r8 + xor rax, 32 + add r14, rdx + movdqa xmm9, xmm7 + movdqa xmm7, xmm6 + movdqu XMMWORD PTR [rax+rcx], xmm0 + mov QWORD PTR [r9+8], r12 + xor r12, r10 + mov QWORD PTR [r9], r14 + movq rcx, xmm15 + xor r14, rbx + mov r10d, ebp + mov ebx, r14d + xor ebp, 16 + and ebx, 2097136 + mov r8, QWORD PTR [r10+rcx] + mov r9, QWORD PTR [r10+rcx+8] + + movq xmm0, rsp + movq xmm1, rbx + movq xmm2, rsi + movq xmm11, rdi + movq xmm12, rbp + movq xmm13, r15 + mov [rsp+104], rcx + mov [rsp+112], r9 + + mov ebx, DWORD PTR [rsp] + mov esi, DWORD PTR [rsp+4] + mov edi, DWORD PTR [rsp+8] + mov ebp, DWORD PTR [rsp+12] + + lea eax, [ebx+esi] + lea edx, [edi+ebp] + shl rdx, 32 + or rax, rdx + + xor r8, rax + movq xmm3, r8 + + movd esp, xmm4 + pextrd r15d, xmm4, 2 + movd eax, xmm8 + movd edx, xmm10 + pextrd r9d, xmm10, 2 + +CryptonightWOW_template_double_part3: + + movq rsp, xmm0 + mov DWORD PTR [rsp], ebx + mov DWORD PTR [rsp+4], esi + mov DWORD PTR [rsp+8], edi + mov DWORD PTR [rsp+12], ebp + + movq rbx, xmm1 + movq rsi, xmm2 + movq rdi, xmm11 + movq rbp, xmm12 + movq r15, xmm13 + mov rcx, [rsp+104] + mov r9, [rsp+112] + + mov rax, r8 + mul rdi + movq xmm1, rdx + movq xmm0, rax + punpcklqdq xmm1, xmm0 + mov rdi, rcx + mov r8, rax + pxor xmm1, XMMWORD PTR [rbp+rcx] + xor ebp, 48 + paddq xmm1, xmm8 + xor r8, QWORD PTR [rbp+rcx+8] + xor rdx, QWORD PTR [rbp+rcx] + add r13, r8 + movdqu xmm2, XMMWORD PTR [rbp+rcx] + add r15, rdx + movdqu XMMWORD PTR [rbp+rcx], xmm1 + paddq xmm2, xmm4 + xor ebp, 16 + mov eax, ebp + xor rax, 32 + movdqu xmm0, XMMWORD PTR [rbp+rcx] + movdqu XMMWORD PTR [rbp+rcx], xmm2 + paddq xmm0, xmm10 + movdqu XMMWORD PTR [rax+rcx], xmm0 + movq rax, xmm3 + movdqa xmm10, xmm8 + mov QWORD PTR [r10+rcx], r15 + movdqa xmm8, xmm5 + xor r15, rax + mov QWORD PTR [r10+rcx+8], r13 + mov r8d, r15d + xor r13, r9 + and r8d, 2097136 + dec r11d + jnz CryptonightWOW_template_double_mainloop + +CryptonightWOW_template_double_part4: + + mov rbx, QWORD PTR [rsp+400] + movaps xmm6, XMMWORD PTR [rsp+160] + movaps xmm7, XMMWORD PTR [rsp+176] + movaps xmm8, XMMWORD PTR [rsp+192] + movaps xmm9, XMMWORD PTR [rsp+208] + movaps xmm10, XMMWORD PTR [rsp+224] + movaps xmm11, XMMWORD PTR [rsp+240] + movaps xmm12, XMMWORD PTR [rsp+256] + movaps xmm13, XMMWORD PTR [rsp+272] + movaps xmm14, XMMWORD PTR [rsp+288] + movaps xmm15, XMMWORD PTR [rsp+304] + add rsp, 320 + pop r15 + pop r14 + pop r13 + pop r12 + pop rdi + pop rsi + pop rbp + ret 0 +CryptonightWOW_template_double_end: diff --git a/src/Native/libcryptonight/xmrig/crypto/asm/cn2/cnv2_rwz_double_main_loop.inc b/src/Native/libcryptonight/xmrig/crypto/asm/cn2/cnv2_rwz_double_main_loop.inc new file mode 100644 index 0000000000..d2d871732d --- /dev/null +++ b/src/Native/libcryptonight/xmrig/crypto/asm/cn2/cnv2_rwz_double_main_loop.inc @@ -0,0 +1,410 @@ + mov rax, rsp + push rbx + push rbp + push rsi + push rdi + push r12 + push r13 + push r14 + push r15 + sub rsp, 184 + + stmxcsr DWORD PTR [rsp+272] + mov DWORD PTR [rsp+276], 24448 + ldmxcsr DWORD PTR [rsp+276] + + mov r13, QWORD PTR [rcx+224] + mov r9, rdx + mov r10, QWORD PTR [rcx+32] + mov r8, rcx + xor r10, QWORD PTR [rcx] + mov r14d, 393216 + mov r11, QWORD PTR [rcx+40] + xor r11, QWORD PTR [rcx+8] + mov rsi, QWORD PTR [rdx+224] + mov rdx, QWORD PTR [rcx+56] + xor rdx, QWORD PTR [rcx+24] + mov rdi, QWORD PTR [r9+32] + xor rdi, QWORD PTR [r9] + mov rbp, QWORD PTR [r9+40] + xor rbp, QWORD PTR [r9+8] + movq xmm0, rdx + movaps XMMWORD PTR [rax-88], xmm6 + movaps XMMWORD PTR [rax-104], xmm7 + movaps XMMWORD PTR [rax-120], xmm8 + movaps XMMWORD PTR [rsp+112], xmm9 + movaps XMMWORD PTR [rsp+96], xmm10 + movaps XMMWORD PTR [rsp+80], xmm11 + movaps XMMWORD PTR [rsp+64], xmm12 + movaps XMMWORD PTR [rsp+48], xmm13 + movaps XMMWORD PTR [rsp+32], xmm14 + movaps XMMWORD PTR [rsp+16], xmm15 + mov rdx, r10 + movq xmm4, QWORD PTR [r8+96] + and edx, 2097136 + mov rax, QWORD PTR [rcx+48] + xorps xmm13, xmm13 + xor rax, QWORD PTR [rcx+16] + mov rcx, QWORD PTR [rcx+88] + xor rcx, QWORD PTR [r8+72] + movq xmm5, QWORD PTR [r8+104] + movq xmm7, rax + + mov eax, 1 + shl rax, 52 + movq xmm14, rax + punpcklqdq xmm14, xmm14 + + mov eax, 1023 + shl rax, 52 + movq xmm12, rax + punpcklqdq xmm12, xmm12 + + mov rax, QWORD PTR [r8+80] + xor rax, QWORD PTR [r8+64] + punpcklqdq xmm7, xmm0 + movq xmm0, rcx + mov rcx, QWORD PTR [r9+56] + xor rcx, QWORD PTR [r9+24] + movq xmm3, rax + mov rax, QWORD PTR [r9+48] + xor rax, QWORD PTR [r9+16] + punpcklqdq xmm3, xmm0 + movq xmm0, rcx + mov QWORD PTR [rsp], r13 + mov rcx, QWORD PTR [r9+88] + xor rcx, QWORD PTR [r9+72] + movq xmm6, rax + mov rax, QWORD PTR [r9+80] + xor rax, QWORD PTR [r9+64] + punpcklqdq xmm6, xmm0 + movq xmm0, rcx + mov QWORD PTR [rsp+256], r10 + mov rcx, rdi + mov QWORD PTR [rsp+264], r11 + movq xmm8, rax + and ecx, 2097136 + punpcklqdq xmm8, xmm0 + movq xmm0, QWORD PTR [r9+96] + punpcklqdq xmm4, xmm0 + movq xmm0, QWORD PTR [r9+104] + lea r8, QWORD PTR [rcx+rsi] + movdqu xmm11, XMMWORD PTR [r8] + punpcklqdq xmm5, xmm0 + lea r9, QWORD PTR [rdx+r13] + movdqu xmm15, XMMWORD PTR [r9] + + ALIGN(64) +rwz_main_loop_double: + movdqu xmm9, xmm15 + mov eax, edx + mov ebx, edx + xor eax, 16 + xor ebx, 32 + xor edx, 48 + + movq xmm0, r11 + movq xmm2, r10 + punpcklqdq xmm2, xmm0 + aesenc xmm9, xmm2 + + movdqu xmm0, XMMWORD PTR [rdx+r13] + movdqu xmm1, XMMWORD PTR [rbx+r13] + paddq xmm0, xmm7 + paddq xmm1, xmm2 + movdqu XMMWORD PTR [rbx+r13], xmm0 + movdqu xmm0, XMMWORD PTR [rax+r13] + movdqu XMMWORD PTR [rdx+r13], xmm1 + paddq xmm0, xmm3 + movdqu XMMWORD PTR [rax+r13], xmm0 + + movq r11, xmm9 + mov edx, r11d + and edx, 2097136 + movdqa xmm0, xmm9 + pxor xmm0, xmm7 + movdqu XMMWORD PTR [r9], xmm0 + + lea rbx, QWORD PTR [rdx+r13] + mov r10, QWORD PTR [rdx+r13] + + movdqu xmm10, xmm11 + movq xmm0, rbp + movq xmm11, rdi + punpcklqdq xmm11, xmm0 + aesenc xmm10, xmm11 + + mov eax, ecx + mov r12d, ecx + xor eax, 16 + xor r12d, 32 + xor ecx, 48 + + movdqu xmm0, XMMWORD PTR [rcx+rsi] + paddq xmm0, xmm6 + movdqu xmm1, XMMWORD PTR [r12+rsi] + movdqu XMMWORD PTR [r12+rsi], xmm0 + paddq xmm1, xmm11 + movdqu xmm0, XMMWORD PTR [rax+rsi] + movdqu XMMWORD PTR [rcx+rsi], xmm1 + paddq xmm0, xmm8 + movdqu XMMWORD PTR [rax+rsi], xmm0 + + movq rcx, xmm10 + and ecx, 2097136 + + movdqa xmm0, xmm10 + pxor xmm0, xmm6 + movdqu XMMWORD PTR [r8], xmm0 + mov r12, QWORD PTR [rcx+rsi] + + mov r9, QWORD PTR [rbx+8] + + xor edx, 16 + mov r8d, edx + mov r15d, edx + + movq rdx, xmm5 + shl rdx, 32 + movq rax, xmm4 + xor rdx, rax + xor r10, rdx + mov rax, r10 + mul r11 + mov r11d, r8d + xor r11d, 48 + movq xmm0, rdx + xor rdx, [r11+r13] + movq xmm1, rax + xor rax, [r11+r13+8] + punpcklqdq xmm0, xmm1 + + pxor xmm0, XMMWORD PTR [r8+r13] + movdqu xmm1, XMMWORD PTR [r11+r13] + paddq xmm0, xmm3 + paddq xmm1, xmm2 + movdqu XMMWORD PTR [r8+r13], xmm0 + xor r8d, 32 + movdqu xmm0, XMMWORD PTR [r8+r13] + movdqu XMMWORD PTR [r8+r13], xmm1 + paddq xmm0, xmm7 + movdqu XMMWORD PTR [r11+r13], xmm0 + + mov r11, QWORD PTR [rsp+256] + add r11, rdx + mov rdx, QWORD PTR [rsp+264] + add rdx, rax + mov QWORD PTR [rbx], r11 + xor r11, r10 + mov QWORD PTR [rbx+8], rdx + xor rdx, r9 + mov QWORD PTR [rsp+256], r11 + and r11d, 2097136 + mov QWORD PTR [rsp+264], rdx + mov QWORD PTR [rsp+8], r11 + lea r15, QWORD PTR [r11+r13] + movdqu xmm15, XMMWORD PTR [r11+r13] + lea r13, QWORD PTR [rsi+rcx] + movdqa xmm0, xmm5 + psrldq xmm0, 8 + movaps xmm2, xmm13 + movq r10, xmm0 + psllq xmm5, 1 + shl r10, 32 + movdqa xmm0, xmm9 + psrldq xmm0, 8 + movdqa xmm1, xmm10 + movq r11, xmm0 + psrldq xmm1, 8 + movq r8, xmm1 + psrldq xmm4, 8 + movaps xmm0, xmm13 + movq rax, xmm4 + xor r10, rax + movaps xmm1, xmm13 + xor r10, r12 + lea rax, QWORD PTR [r11+1] + shr rax, 1 + movdqa xmm3, xmm9 + punpcklqdq xmm3, xmm10 + paddq xmm5, xmm3 + movq rdx, xmm5 + psrldq xmm5, 8 + cvtsi2sd xmm2, rax + or edx, -2147483647 + lea rax, QWORD PTR [r8+1] + shr rax, 1 + movq r9, xmm5 + cvtsi2sd xmm0, rax + or r9d, -2147483647 + cvtsi2sd xmm1, rdx + unpcklpd xmm2, xmm0 + movaps xmm0, xmm13 + cvtsi2sd xmm0, r9 + unpcklpd xmm1, xmm0 + divpd xmm2, xmm1 + paddq xmm2, xmm14 + cvttsd2si rax, xmm2 + psrldq xmm2, 8 + mov rbx, rax + imul rax, rdx + sub r11, rax + js rwz_div_fix_1 +rwz_div_fix_1_ret: + + cvttsd2si rdx, xmm2 + mov rax, rdx + imul rax, r9 + movd xmm2, r11d + movd xmm4, ebx + sub r8, rax + js rwz_div_fix_2 +rwz_div_fix_2_ret: + + movd xmm1, r8d + movd xmm0, edx + punpckldq xmm2, xmm1 + punpckldq xmm4, xmm0 + punpckldq xmm4, xmm2 + paddq xmm3, xmm4 + movdqa xmm0, xmm3 + psrlq xmm0, 12 + paddq xmm0, xmm12 + sqrtpd xmm1, xmm0 + movq r9, xmm1 + movdqa xmm5, xmm1 + psrlq xmm5, 19 + test r9, 524287 + je rwz_sqrt_fix_1 +rwz_sqrt_fix_1_ret: + + movq r9, xmm10 + psrldq xmm1, 8 + movq r8, xmm1 + test r8, 524287 + je rwz_sqrt_fix_2 +rwz_sqrt_fix_2_ret: + + mov r12d, ecx + mov r8d, ecx + xor r12d, 16 + xor r8d, 32 + xor ecx, 48 + mov rax, r10 + mul r9 + movq xmm0, rax + movq xmm3, rdx + punpcklqdq xmm3, xmm0 + + movdqu xmm0, XMMWORD PTR [r12+rsi] + pxor xmm0, xmm3 + movdqu xmm1, XMMWORD PTR [r8+rsi] + xor rdx, [r8+rsi] + xor rax, [r8+rsi+8] + movdqu xmm3, XMMWORD PTR [rcx+rsi] + paddq xmm3, xmm6 + paddq xmm1, xmm11 + paddq xmm0, xmm8 + movdqu XMMWORD PTR [r8+rsi], xmm3 + movdqu XMMWORD PTR [rcx+rsi], xmm1 + movdqu XMMWORD PTR [r12+rsi], xmm0 + + add rdi, rdx + mov QWORD PTR [r13], rdi + xor rdi, r10 + mov ecx, edi + and ecx, 2097136 + lea r8, QWORD PTR [rcx+rsi] + + mov rdx, QWORD PTR [r13+8] + add rbp, rax + mov QWORD PTR [r13+8], rbp + movdqu xmm11, XMMWORD PTR [rcx+rsi] + xor rbp, rdx + mov r13, QWORD PTR [rsp] + movdqa xmm3, xmm7 + mov rdx, QWORD PTR [rsp+8] + movdqa xmm8, xmm6 + mov r10, QWORD PTR [rsp+256] + movdqa xmm7, xmm9 + mov r11, QWORD PTR [rsp+264] + movdqa xmm6, xmm10 + mov r9, r15 + dec r14d + jne rwz_main_loop_double + + ldmxcsr DWORD PTR [rsp+272] + movaps xmm13, XMMWORD PTR [rsp+48] + lea r11, QWORD PTR [rsp+184] + movaps xmm6, XMMWORD PTR [r11-24] + movaps xmm7, XMMWORD PTR [r11-40] + movaps xmm8, XMMWORD PTR [r11-56] + movaps xmm9, XMMWORD PTR [r11-72] + movaps xmm10, XMMWORD PTR [r11-88] + movaps xmm11, XMMWORD PTR [r11-104] + movaps xmm12, XMMWORD PTR [r11-120] + movaps xmm14, XMMWORD PTR [rsp+32] + movaps xmm15, XMMWORD PTR [rsp+16] + mov rsp, r11 + pop r15 + pop r14 + pop r13 + pop r12 + pop rdi + pop rsi + pop rbp + pop rbx + jmp rwz_cnv2_double_mainloop_asm_endp + +rwz_div_fix_1: + dec rbx + add r11, rdx + jmp rwz_div_fix_1_ret + +rwz_div_fix_2: + dec rdx + add r8, r9 + jmp rwz_div_fix_2_ret + +rwz_sqrt_fix_1: + movq r8, xmm3 + movdqa xmm0, xmm5 + psrldq xmm0, 8 + dec r9 + mov r11d, -1022 + shl r11, 32 + mov rax, r9 + shr r9, 19 + shr rax, 20 + mov rdx, r9 + sub rdx, rax + lea rdx, [rdx+r11+1] + add rax, r11 + imul rdx, rax + sub rdx, r8 + adc r9, 0 + movq xmm5, r9 + punpcklqdq xmm5, xmm0 + jmp rwz_sqrt_fix_1_ret + +rwz_sqrt_fix_2: + psrldq xmm3, 8 + movq r11, xmm3 + dec r8 + mov ebx, -1022 + shl rbx, 32 + mov rax, r8 + shr r8, 19 + shr rax, 20 + mov rdx, r8 + sub rdx, rax + lea rdx, [rdx+rbx+1] + add rax, rbx + imul rdx, rax + sub rdx, r11 + adc r8, 0 + movq xmm0, r8 + punpcklqdq xmm5, xmm0 + jmp rwz_sqrt_fix_2_ret + +rwz_cnv2_double_mainloop_asm_endp: diff --git a/src/Native/libcryptonight/xmrig/crypto/asm/cn2/cnv2_rwz_main_loop.inc b/src/Native/libcryptonight/xmrig/crypto/asm/cn2/cnv2_rwz_main_loop.inc new file mode 100644 index 0000000000..021f787e33 --- /dev/null +++ b/src/Native/libcryptonight/xmrig/crypto/asm/cn2/cnv2_rwz_main_loop.inc @@ -0,0 +1,186 @@ + mov QWORD PTR [rsp+24], rbx + push rbp + push rsi + push rdi + push r12 + push r13 + push r14 + push r15 + sub rsp, 80 + + stmxcsr DWORD PTR [rsp] + mov DWORD PTR [rsp+4], 24448 + ldmxcsr DWORD PTR [rsp+4] + + mov rax, QWORD PTR [rcx+48] + mov r9, rcx + xor rax, QWORD PTR [rcx+16] + mov esi, 393216 + mov r8, QWORD PTR [rcx+32] + mov r13d, -2147483647 + xor r8, QWORD PTR [rcx] + mov r11, QWORD PTR [rcx+40] + mov r10, r8 + mov rdx, QWORD PTR [rcx+56] + movq xmm4, rax + xor rdx, QWORD PTR [rcx+24] + xor r11, QWORD PTR [rcx+8] + mov rbx, QWORD PTR [rcx+224] + mov rax, QWORD PTR [r9+80] + xor rax, QWORD PTR [r9+64] + movq xmm0, rdx + mov rcx, QWORD PTR [rcx+88] + xor rcx, QWORD PTR [r9+72] + movq xmm3, QWORD PTR [r9+104] + movaps XMMWORD PTR [rsp+64], xmm6 + movaps XMMWORD PTR [rsp+48], xmm7 + movaps XMMWORD PTR [rsp+32], xmm8 + and r10d, 2097136 + movq xmm5, rax + + xor eax, eax + mov QWORD PTR [rsp+16], rax + + mov ax, 1023 + shl rax, 52 + movq xmm8, rax + mov r15, QWORD PTR [r9+96] + punpcklqdq xmm4, xmm0 + movq xmm0, rcx + punpcklqdq xmm5, xmm0 + movdqu xmm6, XMMWORD PTR [r10+rbx] + + ALIGN(64) +rwz_main_loop: + lea rdx, QWORD PTR [r10+rbx] + mov ecx, r10d + mov eax, r10d + mov rdi, r15 + xor ecx, 16 + xor eax, 32 + xor r10d, 48 + movq xmm0, r11 + movq xmm7, r8 + punpcklqdq xmm7, xmm0 + aesenc xmm6, xmm7 + movq rbp, xmm6 + mov r9, rbp + and r9d, 2097136 + movdqu xmm0, XMMWORD PTR [rcx+rbx] + movdqu xmm1, XMMWORD PTR [rax+rbx] + movdqu xmm2, XMMWORD PTR [r10+rbx] + paddq xmm0, xmm5 + paddq xmm1, xmm7 + paddq xmm2, xmm4 + movdqu XMMWORD PTR [rcx+rbx], xmm0 + movdqu XMMWORD PTR [rax+rbx], xmm2 + movdqu XMMWORD PTR [r10+rbx], xmm1 + mov r10, r9 + xor r10d, 32 + movq rcx, xmm3 + mov rax, rcx + shl rax, 32 + xor rdi, rax + movdqa xmm0, xmm6 + pxor xmm0, xmm4 + movdqu XMMWORD PTR [rdx], xmm0 + xor rdi, QWORD PTR [r9+rbx] + lea r14, QWORD PTR [r9+rbx] + mov r12, QWORD PTR [r14+8] + xor edx, edx + lea r9d, DWORD PTR [ecx+ecx] + add r9d, ebp + movdqa xmm0, xmm6 + psrldq xmm0, 8 + or r9d, r13d + movq rax, xmm0 + div r9 + xorps xmm3, xmm3 + mov eax, eax + shl rdx, 32 + add rdx, rax + lea r9, QWORD PTR [rdx+rbp] + mov r15, rdx + mov rax, r9 + shr rax, 12 + movq xmm0, rax + paddq xmm0, xmm8 + sqrtsd xmm3, xmm0 + psubq xmm3, XMMWORD PTR [rsp+16] + movq rdx, xmm3 + test edx, 524287 + je rwz_sqrt_fixup + psrlq xmm3, 19 +rwz_sqrt_fixup_ret: + + mov ecx, r10d + mov rax, rdi + mul rbp + movq xmm2, rdx + xor rdx, [rcx+rbx] + add r8, rdx + mov QWORD PTR [r14], r8 + xor r8, rdi + mov edi, r8d + and edi, 2097136 + movq xmm0, rax + xor rax, [rcx+rbx+8] + add r11, rax + mov QWORD PTR [r14+8], r11 + punpcklqdq xmm2, xmm0 + + mov r9d, r10d + xor r9d, 48 + xor r10d, 16 + pxor xmm2, XMMWORD PTR [r9+rbx] + movdqu xmm0, XMMWORD PTR [r10+rbx] + paddq xmm0, xmm4 + movdqu xmm1, XMMWORD PTR [rcx+rbx] + paddq xmm2, xmm5 + paddq xmm1, xmm7 + movdqa xmm5, xmm4 + movdqu XMMWORD PTR [r9+rbx], xmm2 + movdqa xmm4, xmm6 + movdqu XMMWORD PTR [rcx+rbx], xmm0 + movdqu XMMWORD PTR [r10+rbx], xmm1 + movdqu xmm6, [rdi+rbx] + mov r10d, edi + xor r11, r12 + dec rsi + jne rwz_main_loop + + ldmxcsr DWORD PTR [rsp] + mov rbx, QWORD PTR [rsp+160] + movaps xmm6, XMMWORD PTR [rsp+64] + movaps xmm7, XMMWORD PTR [rsp+48] + movaps xmm8, XMMWORD PTR [rsp+32] + add rsp, 80 + pop r15 + pop r14 + pop r13 + pop r12 + pop rdi + pop rsi + pop rbp + jmp cnv2_rwz_main_loop_endp + +rwz_sqrt_fixup: + dec rdx + mov r13d, -1022 + shl r13, 32 + mov rax, rdx + shr rdx, 19 + shr rax, 20 + mov rcx, rdx + sub rcx, rax + add rax, r13 + not r13 + sub rcx, r13 + mov r13d, -2147483647 + imul rcx, rax + sub rcx, r9 + adc rdx, 0 + movq xmm3, rdx + jmp rwz_sqrt_fixup_ret + +cnv2_rwz_main_loop_endp: diff --git a/src/Native/libcryptonight/xmrig/crypto/asm/cn_main_loop.S b/src/Native/libcryptonight/xmrig/crypto/asm/cn_main_loop.S index a792337f08..c2c08739a5 100644 --- a/src/Native/libcryptonight/xmrig/crypto/asm/cn_main_loop.S +++ b/src/Native/libcryptonight/xmrig/crypto/asm/cn_main_loop.S @@ -15,6 +15,8 @@ .global FN_PREFIX(cnv2_mainloop_ryzen_asm) .global FN_PREFIX(cnv2_mainloop_bulldozer_asm) .global FN_PREFIX(cnv2_double_mainloop_sandybridge_asm) +.global FN_PREFIX(cnv2_rwz_mainloop_asm) +.global FN_PREFIX(cnv2_rwz_double_mainloop_asm) ALIGN(64) FN_PREFIX(cnv2_mainloop_ivybridge_asm): @@ -52,3 +54,21 @@ FN_PREFIX(cnv2_double_mainloop_sandybridge_asm): add rsp, 48 ret 0 mov eax, 3735929054 + +ALIGN(64) +FN_PREFIX(cnv2_rwz_mainloop_asm): + sub rsp, 48 + mov rcx, rdi + #include "cn2/cnv2_rwz_main_loop.inc" + add rsp, 48 + ret 0 + mov eax, 3735929054 + +ALIGN(64) +FN_PREFIX(cnv2_rwz_double_mainloop_asm): + sub rsp, 48 + mov rcx, rdi + #include "cn2/cnv2_rwz_double_main_loop.inc" + add rsp, 48 + ret 0 + mov eax, 3735929054 diff --git a/src/Native/libcryptonight/xmrig/crypto/asm/win64/CryptonightR_soft_aes_template_win.inc b/src/Native/libcryptonight/xmrig/crypto/asm/win64/CryptonightR_soft_aes_template_win.inc new file mode 100644 index 0000000000..d6d393a966 --- /dev/null +++ b/src/Native/libcryptonight/xmrig/crypto/asm/win64/CryptonightR_soft_aes_template_win.inc @@ -0,0 +1,279 @@ +PUBLIC CryptonightR_soft_aes_template_part1 +PUBLIC CryptonightR_soft_aes_template_mainloop +PUBLIC CryptonightR_soft_aes_template_part2 +PUBLIC CryptonightR_soft_aes_template_part3 +PUBLIC CryptonightR_soft_aes_template_end + +ALIGN(64) +CryptonightR_soft_aes_template_part1: + mov QWORD PTR [rsp+8], rcx + push rbx + push rbp + push rsi + push rdi + push r12 + push r13 + push r14 + push r15 + sub rsp, 232 + + mov eax, [rcx+96] + mov ebx, [rcx+100] + mov esi, [rcx+104] + mov edx, [rcx+108] + mov [rsp+144], eax + mov [rsp+148], ebx + mov [rsp+152], esi + mov [rsp+156], edx + + mov rax, QWORD PTR [rcx+48] + mov r10, rcx + xor rax, QWORD PTR [rcx+16] + mov r8, QWORD PTR [rcx+32] + xor r8, QWORD PTR [rcx] + mov r9, QWORD PTR [rcx+40] + xor r9, QWORD PTR [rcx+8] + movd xmm4, rax + mov rdx, QWORD PTR [rcx+56] + xor rdx, QWORD PTR [rcx+24] + mov r11, QWORD PTR [rcx+224] + mov rcx, QWORD PTR [rcx+88] + xor rcx, QWORD PTR [r10+72] + mov rax, QWORD PTR [r10+80] + movd xmm0, rdx + xor rax, QWORD PTR [r10+64] + + movaps XMMWORD PTR [rsp+16], xmm6 + movaps XMMWORD PTR [rsp+32], xmm7 + movaps XMMWORD PTR [rsp+48], xmm8 + movaps XMMWORD PTR [rsp+64], xmm9 + movaps XMMWORD PTR [rsp+80], xmm10 + movaps XMMWORD PTR [rsp+96], xmm11 + movaps XMMWORD PTR [rsp+112], xmm12 + movaps XMMWORD PTR [rsp+128], xmm13 + + movd xmm5, rax + + mov rax, r8 + punpcklqdq xmm4, xmm0 + and eax, 2097136 + movd xmm10, QWORD PTR [r10+96] + movd xmm0, rcx + mov rcx, QWORD PTR [r10+104] + xorps xmm9, xmm9 + mov QWORD PTR [rsp+328], rax + movd xmm12, r11 + mov QWORD PTR [rsp+320], r9 + punpcklqdq xmm5, xmm0 + movd xmm13, rcx + mov r12d, 524288 + + ALIGN(64) +CryptonightR_soft_aes_template_mainloop: + movd xmm11, r12d + mov r12, QWORD PTR [r10+272] + lea r13, QWORD PTR [rax+r11] + mov esi, DWORD PTR [r13] + movd xmm0, r9 + mov r10d, DWORD PTR [r13+4] + movd xmm7, r8 + mov ebp, DWORD PTR [r13+12] + mov r14d, DWORD PTR [r13+8] + mov rdx, QWORD PTR [rsp+328] + movzx ecx, sil + shr esi, 8 + punpcklqdq xmm7, xmm0 + mov r15d, DWORD PTR [r12+rcx*4] + movzx ecx, r10b + shr r10d, 8 + mov edi, DWORD PTR [r12+rcx*4] + movzx ecx, r14b + shr r14d, 8 + mov ebx, DWORD PTR [r12+rcx*4] + movzx ecx, bpl + shr ebp, 8 + mov r9d, DWORD PTR [r12+rcx*4] + movzx ecx, r10b + shr r10d, 8 + xor r15d, DWORD PTR [r12+rcx*4+1024] + movzx ecx, r14b + shr r14d, 8 + mov eax, r14d + shr eax, 8 + xor edi, DWORD PTR [r12+rcx*4+1024] + add eax, 256 + movzx ecx, bpl + shr ebp, 8 + xor ebx, DWORD PTR [r12+rcx*4+1024] + movzx ecx, sil + shr esi, 8 + xor r9d, DWORD PTR [r12+rcx*4+1024] + add r12, 2048 + movzx ecx, r10b + shr r10d, 8 + add r10d, 256 + mov r11d, DWORD PTR [r12+rax*4] + xor r11d, DWORD PTR [r12+rcx*4] + xor r11d, r9d + movzx ecx, sil + mov r10d, DWORD PTR [r12+r10*4] + shr esi, 8 + add esi, 256 + xor r10d, DWORD PTR [r12+rcx*4] + movzx ecx, bpl + xor r10d, ebx + shr ebp, 8 + movd xmm1, r11d + add ebp, 256 + movd r11, xmm12 + mov r9d, DWORD PTR [r12+rcx*4] + xor r9d, DWORD PTR [r12+rsi*4] + mov eax, DWORD PTR [r12+rbp*4] + xor r9d, edi + movzx ecx, r14b + movd xmm0, r10d + movd xmm2, r9d + xor eax, DWORD PTR [r12+rcx*4] + mov rcx, rdx + xor eax, r15d + punpckldq xmm2, xmm1 + xor rcx, 16 + movd xmm6, eax + mov rax, rdx + punpckldq xmm6, xmm0 + xor rax, 32 + punpckldq xmm6, xmm2 + xor rdx, 48 + movdqu xmm2, XMMWORD PTR [rcx+r11] + pxor xmm6, xmm2 + pxor xmm6, xmm7 + paddq xmm2, xmm4 + movdqu xmm1, XMMWORD PTR [rax+r11] + movdqu xmm0, XMMWORD PTR [rdx+r11] + pxor xmm6, xmm1 + pxor xmm6, xmm0 + paddq xmm0, xmm5 + movdqu XMMWORD PTR [rcx+r11], xmm0 + movdqu XMMWORD PTR [rax+r11], xmm2 + movd rcx, xmm13 + paddq xmm1, xmm7 + movdqu XMMWORD PTR [rdx+r11], xmm1 + movd rdi, xmm6 + mov r10, rdi + and r10d, 2097136 + movdqa xmm0, xmm6 + pxor xmm0, xmm4 + movdqu XMMWORD PTR [r13], xmm0 + + mov ebx, [rsp+144] + mov ebp, [rsp+152] + add ebx, [rsp+148] + add ebp, [rsp+156] + shl rbp, 32 + or rbx, rbp + + xor rbx, QWORD PTR [r10+r11] + lea r14, QWORD PTR [r10+r11] + mov rbp, QWORD PTR [r14+8] + + mov [rsp+160], rbx + mov [rsp+168], rdi + mov [rsp+176], rbp + mov [rsp+184], r10 + mov r10, rsp + + mov ebx, [rsp+144] + mov esi, [rsp+148] + mov edi, [rsp+152] + mov ebp, [rsp+156] + + movd esp, xmm7 + movaps xmm0, xmm7 + psrldq xmm0, 8 + movd r15d, xmm0 + movd eax, xmm4 + movd edx, xmm5 + movaps xmm0, xmm5 + psrldq xmm0, 8 + movd r9d, xmm0 + +CryptonightR_soft_aes_template_part2: + mov rsp, r10 + mov [rsp+144], ebx + mov [rsp+148], esi + mov [rsp+152], edi + mov [rsp+156], ebp + + mov edi, edi + shl rbp, 32 + or rbp, rdi + xor r8, rbp + + mov ebx, ebx + shl rsi, 32 + or rsi, rbx + xor QWORD PTR [rsp+320], rsi + + mov rbx, [rsp+160] + mov rdi, [rsp+168] + mov rbp, [rsp+176] + mov r10, [rsp+184] + + mov r9, r10 + xor r9, 16 + mov rcx, r10 + xor rcx, 32 + xor r10, 48 + mov rax, rbx + mul rdi + movdqu xmm2, XMMWORD PTR [r9+r11] + movdqu xmm1, XMMWORD PTR [rcx+r11] + pxor xmm6, xmm2 + pxor xmm6, xmm1 + paddq xmm1, xmm7 + add r8, rdx + movdqu xmm0, XMMWORD PTR [r10+r11] + pxor xmm6, xmm0 + paddq xmm0, xmm5 + paddq xmm2, xmm4 + movdqu XMMWORD PTR [r9+r11], xmm0 + movdqa xmm5, xmm4 + mov r9, QWORD PTR [rsp+320] + movdqa xmm4, xmm6 + add r9, rax + movdqu XMMWORD PTR [rcx+r11], xmm2 + movdqu XMMWORD PTR [r10+r11], xmm1 + mov r10, QWORD PTR [rsp+304] + movd r12d, xmm11 + mov QWORD PTR [r14], r8 + xor r8, rbx + mov rax, r8 + mov QWORD PTR [r14+8], r9 + and eax, 2097136 + xor r9, rbp + mov QWORD PTR [rsp+320], r9 + mov QWORD PTR [rsp+328], rax + sub r12d, 1 + jne CryptonightR_soft_aes_template_mainloop + +CryptonightR_soft_aes_template_part3: + movaps xmm6, XMMWORD PTR [rsp+16] + movaps xmm7, XMMWORD PTR [rsp+32] + movaps xmm8, XMMWORD PTR [rsp+48] + movaps xmm9, XMMWORD PTR [rsp+64] + movaps xmm10, XMMWORD PTR [rsp+80] + movaps xmm11, XMMWORD PTR [rsp+96] + movaps xmm12, XMMWORD PTR [rsp+112] + movaps xmm13, XMMWORD PTR [rsp+128] + + add rsp, 232 + pop r15 + pop r14 + pop r13 + pop r12 + pop rdi + pop rsi + pop rbp + pop rbx + ret +CryptonightR_soft_aes_template_end: diff --git a/src/Native/libcryptonight/xmrig/crypto/asm/win64/CryptonightR_template.asm b/src/Native/libcryptonight/xmrig/crypto/asm/win64/CryptonightR_template.asm index 25b72c3c0d..250eca3d08 100644 --- a/src/Native/libcryptonight/xmrig/crypto/asm/win64/CryptonightR_template.asm +++ b/src/Native/libcryptonight/xmrig/crypto/asm/win64/CryptonightR_template.asm @@ -518,6 +518,8 @@ PUBLIC CryptonightR_instruction_mov256 INCLUDE CryptonightWOW_template_win.inc INCLUDE CryptonightR_template_win.inc +INCLUDE CryptonightWOW_soft_aes_template_win.inc +INCLUDE CryptonightR_soft_aes_template_win.inc CryptonightR_instruction0: imul rbx, rbx diff --git a/src/Native/libcryptonight/xmrig/crypto/asm/win64/CryptonightR_template_win.inc b/src/Native/libcryptonight/xmrig/crypto/asm/win64/CryptonightR_template_win.inc index 2f2d71a25c..60ee3441b5 100644 --- a/src/Native/libcryptonight/xmrig/crypto/asm/win64/CryptonightR_template_win.inc +++ b/src/Native/libcryptonight/xmrig/crypto/asm/win64/CryptonightR_template_win.inc @@ -70,29 +70,30 @@ CryptonightR_template_mainloop: aesenc xmm5, xmm4 - mov r12d, r9d + mov r13d, r9d mov eax, r9d xor r9d, 48 - xor r12d, 16 + xor r13d, 16 xor eax, 32 movdqu xmm0, XMMWORD PTR [r9+r11] movaps xmm3, xmm0 - movdqu xmm2, XMMWORD PTR [r12+r11] + movdqu xmm2, XMMWORD PTR [r13+r11] movdqu xmm1, XMMWORD PTR [rax+r11] pxor xmm0, xmm2 pxor xmm5, xmm1 pxor xmm5, xmm0 + + movd r12, xmm5 + movd r10d, xmm5 + and r10d, 2097136 + paddq xmm3, xmm7 paddq xmm2, xmm6 paddq xmm1, xmm4 - movdqu XMMWORD PTR [r12+r11], xmm3 + movdqu XMMWORD PTR [r13+r11], xmm3 movdqu XMMWORD PTR [rax+r11], xmm2 movdqu XMMWORD PTR [r9+r11], xmm1 - movd r12, xmm5 - movd r10d, xmm5 - and r10d, 2097136 - movdqa xmm0, xmm5 pxor xmm0, xmm6 movdqu XMMWORD PTR [rdx], xmm0 @@ -102,14 +103,16 @@ CryptonightR_template_mainloop: shl rdx, 32 or r13, rdx - xor r13, QWORD PTR [r10+r11] - mov r14, QWORD PTR [r10+r11+8] - movd eax, xmm6 movd edx, xmm7 pextrd r9d, xmm7, 2 + xor r13, QWORD PTR [r10+r11] + mov r14, QWORD PTR [r10+r11+8] + CryptonightR_template_part2: + lea rcx, [r10+r11] + mov eax, edi mov edx, ebp shl rdx, 32 @@ -124,6 +127,8 @@ CryptonightR_template_part2: mov rax, r13 mul r12 + add r15, rax + add rsp, rdx mov r9d, r10d mov r12d, r10d @@ -145,13 +150,10 @@ CryptonightR_template_part2: movdqu XMMWORD PTR [r10+r11], xmm3 movdqa xmm7, xmm6 - add r15, rax - add rsp, rdx - xor r10, 48 - mov QWORD PTR [r10+r11], rsp + mov QWORD PTR [rcx], rsp xor rsp, r13 mov r9d, esp - mov QWORD PTR [r10+r11+8], r15 + mov QWORD PTR [rcx+8], r15 and r9d, 2097136 xor r15, r14 movdqa xmm6, xmm5 diff --git a/src/Native/libcryptonight/xmrig/crypto/asm/win64/CryptonightWOW_soft_aes_template_win.inc b/src/Native/libcryptonight/xmrig/crypto/asm/win64/CryptonightWOW_soft_aes_template_win.inc new file mode 100644 index 0000000000..6820903671 --- /dev/null +++ b/src/Native/libcryptonight/xmrig/crypto/asm/win64/CryptonightWOW_soft_aes_template_win.inc @@ -0,0 +1,266 @@ +PUBLIC CryptonightWOW_soft_aes_template_part1 +PUBLIC CryptonightWOW_soft_aes_template_mainloop +PUBLIC CryptonightWOW_soft_aes_template_part2 +PUBLIC CryptonightWOW_soft_aes_template_part3 +PUBLIC CryptonightWOW_soft_aes_template_end + +ALIGN(64) +CryptonightWOW_soft_aes_template_part1: + mov QWORD PTR [rsp+8], rcx + push rbx + push rbp + push rsi + push rdi + push r12 + push r13 + push r14 + push r15 + sub rsp, 232 + + mov eax, [rcx+96] + mov ebx, [rcx+100] + mov esi, [rcx+104] + mov edx, [rcx+108] + mov [rsp+144], eax + mov [rsp+148], ebx + mov [rsp+152], esi + mov [rsp+156], edx + + mov rax, QWORD PTR [rcx+48] + mov r10, rcx + xor rax, QWORD PTR [rcx+16] + mov r8, QWORD PTR [rcx+32] + xor r8, QWORD PTR [rcx] + mov r9, QWORD PTR [rcx+40] + xor r9, QWORD PTR [rcx+8] + movd xmm4, rax + mov rdx, QWORD PTR [rcx+56] + xor rdx, QWORD PTR [rcx+24] + mov r11, QWORD PTR [rcx+224] + mov rcx, QWORD PTR [rcx+88] + xor rcx, QWORD PTR [r10+72] + mov rax, QWORD PTR [r10+80] + movd xmm0, rdx + xor rax, QWORD PTR [r10+64] + + movaps XMMWORD PTR [rsp+16], xmm6 + movaps XMMWORD PTR [rsp+32], xmm7 + movaps XMMWORD PTR [rsp+48], xmm8 + movaps XMMWORD PTR [rsp+64], xmm9 + movaps XMMWORD PTR [rsp+80], xmm10 + movaps XMMWORD PTR [rsp+96], xmm11 + movaps XMMWORD PTR [rsp+112], xmm12 + movaps XMMWORD PTR [rsp+128], xmm13 + + movd xmm5, rax + + mov rax, r8 + punpcklqdq xmm4, xmm0 + and eax, 2097136 + movd xmm10, QWORD PTR [r10+96] + movd xmm0, rcx + mov rcx, QWORD PTR [r10+104] + xorps xmm9, xmm9 + mov QWORD PTR [rsp+328], rax + movd xmm12, r11 + mov QWORD PTR [rsp+320], r9 + punpcklqdq xmm5, xmm0 + movd xmm13, rcx + mov r12d, 524288 + + ALIGN(64) +CryptonightWOW_soft_aes_template_mainloop: + movd xmm11, r12d + mov r12, QWORD PTR [r10+272] + lea r13, QWORD PTR [rax+r11] + mov esi, DWORD PTR [r13] + movd xmm0, r9 + mov r10d, DWORD PTR [r13+4] + movd xmm7, r8 + mov ebp, DWORD PTR [r13+12] + mov r14d, DWORD PTR [r13+8] + mov rdx, QWORD PTR [rsp+328] + movzx ecx, sil + shr esi, 8 + punpcklqdq xmm7, xmm0 + mov r15d, DWORD PTR [r12+rcx*4] + movzx ecx, r10b + shr r10d, 8 + mov edi, DWORD PTR [r12+rcx*4] + movzx ecx, r14b + shr r14d, 8 + mov ebx, DWORD PTR [r12+rcx*4] + movzx ecx, bpl + shr ebp, 8 + mov r9d, DWORD PTR [r12+rcx*4] + movzx ecx, r10b + shr r10d, 8 + xor r15d, DWORD PTR [r12+rcx*4+1024] + movzx ecx, r14b + shr r14d, 8 + mov eax, r14d + shr eax, 8 + xor edi, DWORD PTR [r12+rcx*4+1024] + add eax, 256 + movzx ecx, bpl + shr ebp, 8 + xor ebx, DWORD PTR [r12+rcx*4+1024] + movzx ecx, sil + shr esi, 8 + xor r9d, DWORD PTR [r12+rcx*4+1024] + add r12, 2048 + movzx ecx, r10b + shr r10d, 8 + add r10d, 256 + mov r11d, DWORD PTR [r12+rax*4] + xor r11d, DWORD PTR [r12+rcx*4] + xor r11d, r9d + movzx ecx, sil + mov r10d, DWORD PTR [r12+r10*4] + shr esi, 8 + add esi, 256 + xor r10d, DWORD PTR [r12+rcx*4] + movzx ecx, bpl + xor r10d, ebx + shr ebp, 8 + movd xmm1, r11d + add ebp, 256 + movd r11, xmm12 + mov r9d, DWORD PTR [r12+rcx*4] + xor r9d, DWORD PTR [r12+rsi*4] + mov eax, DWORD PTR [r12+rbp*4] + xor r9d, edi + movzx ecx, r14b + movd xmm0, r10d + movd xmm2, r9d + xor eax, DWORD PTR [r12+rcx*4] + mov rcx, rdx + xor eax, r15d + punpckldq xmm2, xmm1 + xor rcx, 16 + movd xmm6, eax + mov rax, rdx + punpckldq xmm6, xmm0 + xor rax, 32 + punpckldq xmm6, xmm2 + xor rdx, 48 + movdqu xmm2, XMMWORD PTR [rcx+r11] + pxor xmm6, xmm7 + paddq xmm2, xmm4 + movdqu xmm1, XMMWORD PTR [rax+r11] + movdqu xmm0, XMMWORD PTR [rdx+r11] + paddq xmm0, xmm5 + movdqu XMMWORD PTR [rcx+r11], xmm0 + movdqu XMMWORD PTR [rax+r11], xmm2 + movd rcx, xmm13 + paddq xmm1, xmm7 + movdqu XMMWORD PTR [rdx+r11], xmm1 + movd rdi, xmm6 + mov r10, rdi + and r10d, 2097136 + movdqa xmm0, xmm6 + pxor xmm0, xmm4 + movdqu XMMWORD PTR [r13], xmm0 + + mov ebx, [rsp+144] + mov ebp, [rsp+152] + add ebx, [rsp+148] + add ebp, [rsp+156] + shl rbp, 32 + or rbx, rbp + + xor rbx, QWORD PTR [r10+r11] + lea r14, QWORD PTR [r10+r11] + mov rbp, QWORD PTR [r14+8] + + mov [rsp+160], rbx + mov [rsp+168], rdi + mov [rsp+176], rbp + mov [rsp+184], r10 + mov r10, rsp + + mov ebx, [rsp+144] + mov esi, [rsp+148] + mov edi, [rsp+152] + mov ebp, [rsp+156] + + movd esp, xmm7 + movaps xmm0, xmm7 + psrldq xmm0, 8 + movd r15d, xmm0 + movd eax, xmm4 + movd edx, xmm5 + +CryptonightWOW_soft_aes_template_part2: + mov rsp, r10 + mov [rsp+144], ebx + mov [rsp+148], esi + mov [rsp+152], edi + mov [rsp+156], ebp + + mov rbx, [rsp+160] + mov rdi, [rsp+168] + mov rbp, [rsp+176] + mov r10, [rsp+184] + + mov r9, r10 + xor r9, 16 + mov rcx, r10 + xor rcx, 32 + xor r10, 48 + mov rax, rbx + mul rdi + movdqu xmm2, XMMWORD PTR [r9+r11] + movdqu xmm1, XMMWORD PTR [rcx+r11] + paddq xmm1, xmm7 + movd xmm0, rax + movd xmm3, rdx + xor rax, QWORD PTR [r11+rcx+8] + xor rdx, QWORD PTR [rcx+r11] + punpcklqdq xmm3, xmm0 + add r8, rdx + movdqu xmm0, XMMWORD PTR [r10+r11] + pxor xmm2, xmm3 + paddq xmm0, xmm5 + paddq xmm2, xmm4 + movdqu XMMWORD PTR [r9+r11], xmm0 + movdqa xmm5, xmm4 + mov r9, QWORD PTR [rsp+320] + movdqa xmm4, xmm6 + add r9, rax + movdqu XMMWORD PTR [rcx+r11], xmm2 + movdqu XMMWORD PTR [r10+r11], xmm1 + mov r10, QWORD PTR [rsp+304] + movd r12d, xmm11 + mov QWORD PTR [r14], r8 + xor r8, rbx + mov rax, r8 + mov QWORD PTR [r14+8], r9 + and eax, 2097136 + xor r9, rbp + mov QWORD PTR [rsp+320], r9 + mov QWORD PTR [rsp+328], rax + sub r12d, 1 + jne CryptonightWOW_soft_aes_template_mainloop + +CryptonightWOW_soft_aes_template_part3: + movaps xmm6, XMMWORD PTR [rsp+16] + movaps xmm7, XMMWORD PTR [rsp+32] + movaps xmm8, XMMWORD PTR [rsp+48] + movaps xmm9, XMMWORD PTR [rsp+64] + movaps xmm10, XMMWORD PTR [rsp+80] + movaps xmm11, XMMWORD PTR [rsp+96] + movaps xmm12, XMMWORD PTR [rsp+112] + movaps xmm13, XMMWORD PTR [rsp+128] + + add rsp, 232 + pop r15 + pop r14 + pop r13 + pop r12 + pop rdi + pop rsi + pop rbp + pop rbx + ret +CryptonightWOW_soft_aes_template_end: diff --git a/src/Native/libcryptonight/xmrig/crypto/asm/win64/cn2/cnv2_rwz_double_main_loop.inc b/src/Native/libcryptonight/xmrig/crypto/asm/win64/cn2/cnv2_rwz_double_main_loop.inc new file mode 100644 index 0000000000..69ca8793ca --- /dev/null +++ b/src/Native/libcryptonight/xmrig/crypto/asm/win64/cn2/cnv2_rwz_double_main_loop.inc @@ -0,0 +1,410 @@ + mov rax, rsp + push rbx + push rbp + push rsi + push rdi + push r12 + push r13 + push r14 + push r15 + sub rsp, 184 + + stmxcsr DWORD PTR [rsp+272] + mov DWORD PTR [rsp+276], 24448 + ldmxcsr DWORD PTR [rsp+276] + + mov r13, QWORD PTR [rcx+224] + mov r9, rdx + mov r10, QWORD PTR [rcx+32] + mov r8, rcx + xor r10, QWORD PTR [rcx] + mov r14d, 393216 + mov r11, QWORD PTR [rcx+40] + xor r11, QWORD PTR [rcx+8] + mov rsi, QWORD PTR [rdx+224] + mov rdx, QWORD PTR [rcx+56] + xor rdx, QWORD PTR [rcx+24] + mov rdi, QWORD PTR [r9+32] + xor rdi, QWORD PTR [r9] + mov rbp, QWORD PTR [r9+40] + xor rbp, QWORD PTR [r9+8] + movd xmm0, rdx + movaps XMMWORD PTR [rax-88], xmm6 + movaps XMMWORD PTR [rax-104], xmm7 + movaps XMMWORD PTR [rax-120], xmm8 + movaps XMMWORD PTR [rsp+112], xmm9 + movaps XMMWORD PTR [rsp+96], xmm10 + movaps XMMWORD PTR [rsp+80], xmm11 + movaps XMMWORD PTR [rsp+64], xmm12 + movaps XMMWORD PTR [rsp+48], xmm13 + movaps XMMWORD PTR [rsp+32], xmm14 + movaps XMMWORD PTR [rsp+16], xmm15 + mov rdx, r10 + movd xmm4, QWORD PTR [r8+96] + and edx, 2097136 + mov rax, QWORD PTR [rcx+48] + xorps xmm13, xmm13 + xor rax, QWORD PTR [rcx+16] + mov rcx, QWORD PTR [rcx+88] + xor rcx, QWORD PTR [r8+72] + movd xmm5, QWORD PTR [r8+104] + movd xmm7, rax + + mov eax, 1 + shl rax, 52 + movd xmm14, rax + punpcklqdq xmm14, xmm14 + + mov eax, 1023 + shl rax, 52 + movd xmm12, rax + punpcklqdq xmm12, xmm12 + + mov rax, QWORD PTR [r8+80] + xor rax, QWORD PTR [r8+64] + punpcklqdq xmm7, xmm0 + movd xmm0, rcx + mov rcx, QWORD PTR [r9+56] + xor rcx, QWORD PTR [r9+24] + movd xmm3, rax + mov rax, QWORD PTR [r9+48] + xor rax, QWORD PTR [r9+16] + punpcklqdq xmm3, xmm0 + movd xmm0, rcx + mov QWORD PTR [rsp], r13 + mov rcx, QWORD PTR [r9+88] + xor rcx, QWORD PTR [r9+72] + movd xmm6, rax + mov rax, QWORD PTR [r9+80] + xor rax, QWORD PTR [r9+64] + punpcklqdq xmm6, xmm0 + movd xmm0, rcx + mov QWORD PTR [rsp+256], r10 + mov rcx, rdi + mov QWORD PTR [rsp+264], r11 + movd xmm8, rax + and ecx, 2097136 + punpcklqdq xmm8, xmm0 + movd xmm0, QWORD PTR [r9+96] + punpcklqdq xmm4, xmm0 + movd xmm0, QWORD PTR [r9+104] + lea r8, QWORD PTR [rcx+rsi] + movdqu xmm11, XMMWORD PTR [r8] + punpcklqdq xmm5, xmm0 + lea r9, QWORD PTR [rdx+r13] + movdqu xmm15, XMMWORD PTR [r9] + + ALIGN(64) +rwz_main_loop_double: + movdqu xmm9, xmm15 + mov eax, edx + mov ebx, edx + xor eax, 16 + xor ebx, 32 + xor edx, 48 + + movd xmm0, r11 + movd xmm2, r10 + punpcklqdq xmm2, xmm0 + aesenc xmm9, xmm2 + + movdqu xmm0, XMMWORD PTR [rdx+r13] + movdqu xmm1, XMMWORD PTR [rbx+r13] + paddq xmm0, xmm7 + paddq xmm1, xmm2 + movdqu XMMWORD PTR [rbx+r13], xmm0 + movdqu xmm0, XMMWORD PTR [rax+r13] + movdqu XMMWORD PTR [rdx+r13], xmm1 + paddq xmm0, xmm3 + movdqu XMMWORD PTR [rax+r13], xmm0 + + movd r11, xmm9 + mov edx, r11d + and edx, 2097136 + movdqa xmm0, xmm9 + pxor xmm0, xmm7 + movdqu XMMWORD PTR [r9], xmm0 + + lea rbx, QWORD PTR [rdx+r13] + mov r10, QWORD PTR [rdx+r13] + + movdqu xmm10, xmm11 + movd xmm0, rbp + movd xmm11, rdi + punpcklqdq xmm11, xmm0 + aesenc xmm10, xmm11 + + mov eax, ecx + mov r12d, ecx + xor eax, 16 + xor r12d, 32 + xor ecx, 48 + + movdqu xmm0, XMMWORD PTR [rcx+rsi] + paddq xmm0, xmm6 + movdqu xmm1, XMMWORD PTR [r12+rsi] + movdqu XMMWORD PTR [r12+rsi], xmm0 + paddq xmm1, xmm11 + movdqu xmm0, XMMWORD PTR [rax+rsi] + movdqu XMMWORD PTR [rcx+rsi], xmm1 + paddq xmm0, xmm8 + movdqu XMMWORD PTR [rax+rsi], xmm0 + + movd rcx, xmm10 + and ecx, 2097136 + + movdqa xmm0, xmm10 + pxor xmm0, xmm6 + movdqu XMMWORD PTR [r8], xmm0 + mov r12, QWORD PTR [rcx+rsi] + + mov r9, QWORD PTR [rbx+8] + + xor edx, 16 + mov r8d, edx + mov r15d, edx + + movd rdx, xmm5 + shl rdx, 32 + movd rax, xmm4 + xor rdx, rax + xor r10, rdx + mov rax, r10 + mul r11 + mov r11d, r8d + xor r11d, 48 + movd xmm0, rdx + xor rdx, [r11+r13] + movd xmm1, rax + xor rax, [r11+r13+8] + punpcklqdq xmm0, xmm1 + + pxor xmm0, XMMWORD PTR [r8+r13] + movdqu xmm1, XMMWORD PTR [r11+r13] + paddq xmm0, xmm3 + paddq xmm1, xmm2 + movdqu XMMWORD PTR [r8+r13], xmm0 + xor r8d, 32 + movdqu xmm0, XMMWORD PTR [r8+r13] + movdqu XMMWORD PTR [r8+r13], xmm1 + paddq xmm0, xmm7 + movdqu XMMWORD PTR [r11+r13], xmm0 + + mov r11, QWORD PTR [rsp+256] + add r11, rdx + mov rdx, QWORD PTR [rsp+264] + add rdx, rax + mov QWORD PTR [rbx], r11 + xor r11, r10 + mov QWORD PTR [rbx+8], rdx + xor rdx, r9 + mov QWORD PTR [rsp+256], r11 + and r11d, 2097136 + mov QWORD PTR [rsp+264], rdx + mov QWORD PTR [rsp+8], r11 + lea r15, QWORD PTR [r11+r13] + movdqu xmm15, XMMWORD PTR [r11+r13] + lea r13, QWORD PTR [rsi+rcx] + movdqa xmm0, xmm5 + psrldq xmm0, 8 + movaps xmm2, xmm13 + movd r10, xmm0 + psllq xmm5, 1 + shl r10, 32 + movdqa xmm0, xmm9 + psrldq xmm0, 8 + movdqa xmm1, xmm10 + movd r11, xmm0 + psrldq xmm1, 8 + movd r8, xmm1 + psrldq xmm4, 8 + movaps xmm0, xmm13 + movd rax, xmm4 + xor r10, rax + movaps xmm1, xmm13 + xor r10, r12 + lea rax, QWORD PTR [r11+1] + shr rax, 1 + movdqa xmm3, xmm9 + punpcklqdq xmm3, xmm10 + paddq xmm5, xmm3 + movd rdx, xmm5 + psrldq xmm5, 8 + cvtsi2sd xmm2, rax + or edx, -2147483647 + lea rax, QWORD PTR [r8+1] + shr rax, 1 + movd r9, xmm5 + cvtsi2sd xmm0, rax + or r9d, -2147483647 + cvtsi2sd xmm1, rdx + unpcklpd xmm2, xmm0 + movaps xmm0, xmm13 + cvtsi2sd xmm0, r9 + unpcklpd xmm1, xmm0 + divpd xmm2, xmm1 + paddq xmm2, xmm14 + cvttsd2si rax, xmm2 + psrldq xmm2, 8 + mov rbx, rax + imul rax, rdx + sub r11, rax + js rwz_div_fix_1 +rwz_div_fix_1_ret: + + cvttsd2si rdx, xmm2 + mov rax, rdx + imul rax, r9 + movd xmm2, r11d + movd xmm4, ebx + sub r8, rax + js rwz_div_fix_2 +rwz_div_fix_2_ret: + + movd xmm1, r8d + movd xmm0, edx + punpckldq xmm2, xmm1 + punpckldq xmm4, xmm0 + punpckldq xmm4, xmm2 + paddq xmm3, xmm4 + movdqa xmm0, xmm3 + psrlq xmm0, 12 + paddq xmm0, xmm12 + sqrtpd xmm1, xmm0 + movd r9, xmm1 + movdqa xmm5, xmm1 + psrlq xmm5, 19 + test r9, 524287 + je rwz_sqrt_fix_1 +rwz_sqrt_fix_1_ret: + + movd r9, xmm10 + psrldq xmm1, 8 + movd r8, xmm1 + test r8, 524287 + je rwz_sqrt_fix_2 +rwz_sqrt_fix_2_ret: + + mov r12d, ecx + mov r8d, ecx + xor r12d, 16 + xor r8d, 32 + xor ecx, 48 + mov rax, r10 + mul r9 + movd xmm0, rax + movd xmm3, rdx + punpcklqdq xmm3, xmm0 + + movdqu xmm0, XMMWORD PTR [r12+rsi] + pxor xmm0, xmm3 + movdqu xmm1, XMMWORD PTR [r8+rsi] + xor rdx, [r8+rsi] + xor rax, [r8+rsi+8] + movdqu xmm3, XMMWORD PTR [rcx+rsi] + paddq xmm3, xmm6 + paddq xmm1, xmm11 + paddq xmm0, xmm8 + movdqu XMMWORD PTR [r8+rsi], xmm3 + movdqu XMMWORD PTR [rcx+rsi], xmm1 + movdqu XMMWORD PTR [r12+rsi], xmm0 + + add rdi, rdx + mov QWORD PTR [r13], rdi + xor rdi, r10 + mov ecx, edi + and ecx, 2097136 + lea r8, QWORD PTR [rcx+rsi] + + mov rdx, QWORD PTR [r13+8] + add rbp, rax + mov QWORD PTR [r13+8], rbp + movdqu xmm11, XMMWORD PTR [rcx+rsi] + xor rbp, rdx + mov r13, QWORD PTR [rsp] + movdqa xmm3, xmm7 + mov rdx, QWORD PTR [rsp+8] + movdqa xmm8, xmm6 + mov r10, QWORD PTR [rsp+256] + movdqa xmm7, xmm9 + mov r11, QWORD PTR [rsp+264] + movdqa xmm6, xmm10 + mov r9, r15 + dec r14d + jne rwz_main_loop_double + + ldmxcsr DWORD PTR [rsp+272] + movaps xmm13, XMMWORD PTR [rsp+48] + lea r11, QWORD PTR [rsp+184] + movaps xmm6, XMMWORD PTR [r11-24] + movaps xmm7, XMMWORD PTR [r11-40] + movaps xmm8, XMMWORD PTR [r11-56] + movaps xmm9, XMMWORD PTR [r11-72] + movaps xmm10, XMMWORD PTR [r11-88] + movaps xmm11, XMMWORD PTR [r11-104] + movaps xmm12, XMMWORD PTR [r11-120] + movaps xmm14, XMMWORD PTR [rsp+32] + movaps xmm15, XMMWORD PTR [rsp+16] + mov rsp, r11 + pop r15 + pop r14 + pop r13 + pop r12 + pop rdi + pop rsi + pop rbp + pop rbx + jmp rwz_cnv2_double_mainloop_asm_endp + +rwz_div_fix_1: + dec rbx + add r11, rdx + jmp rwz_div_fix_1_ret + +rwz_div_fix_2: + dec rdx + add r8, r9 + jmp rwz_div_fix_2_ret + +rwz_sqrt_fix_1: + movd r8, xmm3 + movdqa xmm0, xmm5 + psrldq xmm0, 8 + dec r9 + mov r11d, -1022 + shl r11, 32 + mov rax, r9 + shr r9, 19 + shr rax, 20 + mov rdx, r9 + sub rdx, rax + lea rdx, [rdx+r11+1] + add rax, r11 + imul rdx, rax + sub rdx, r8 + adc r9, 0 + movd xmm5, r9 + punpcklqdq xmm5, xmm0 + jmp rwz_sqrt_fix_1_ret + +rwz_sqrt_fix_2: + psrldq xmm3, 8 + movd r11, xmm3 + dec r8 + mov ebx, -1022 + shl rbx, 32 + mov rax, r8 + shr r8, 19 + shr rax, 20 + mov rdx, r8 + sub rdx, rax + lea rdx, [rdx+rbx+1] + add rax, rbx + imul rdx, rax + sub rdx, r11 + adc r8, 0 + movd xmm0, r8 + punpcklqdq xmm5, xmm0 + jmp rwz_sqrt_fix_2_ret + +rwz_cnv2_double_mainloop_asm_endp: diff --git a/src/Native/libcryptonight/xmrig/crypto/asm/win64/cn2/cnv2_rwz_main_loop.inc b/src/Native/libcryptonight/xmrig/crypto/asm/win64/cn2/cnv2_rwz_main_loop.inc new file mode 100644 index 0000000000..9931773056 --- /dev/null +++ b/src/Native/libcryptonight/xmrig/crypto/asm/win64/cn2/cnv2_rwz_main_loop.inc @@ -0,0 +1,186 @@ + mov QWORD PTR [rsp+24], rbx + push rbp + push rsi + push rdi + push r12 + push r13 + push r14 + push r15 + sub rsp, 80 + + stmxcsr DWORD PTR [rsp] + mov DWORD PTR [rsp+4], 24448 + ldmxcsr DWORD PTR [rsp+4] + + mov rax, QWORD PTR [rcx+48] + mov r9, rcx + xor rax, QWORD PTR [rcx+16] + mov esi, 393216 + mov r8, QWORD PTR [rcx+32] + mov r13d, -2147483647 + xor r8, QWORD PTR [rcx] + mov r11, QWORD PTR [rcx+40] + mov r10, r8 + mov rdx, QWORD PTR [rcx+56] + movd xmm4, rax + xor rdx, QWORD PTR [rcx+24] + xor r11, QWORD PTR [rcx+8] + mov rbx, QWORD PTR [rcx+224] + mov rax, QWORD PTR [r9+80] + xor rax, QWORD PTR [r9+64] + movd xmm0, rdx + mov rcx, QWORD PTR [rcx+88] + xor rcx, QWORD PTR [r9+72] + movd xmm3, QWORD PTR [r9+104] + movaps XMMWORD PTR [rsp+64], xmm6 + movaps XMMWORD PTR [rsp+48], xmm7 + movaps XMMWORD PTR [rsp+32], xmm8 + and r10d, 2097136 + movd xmm5, rax + + xor eax, eax + mov QWORD PTR [rsp+16], rax + + mov ax, 1023 + shl rax, 52 + movd xmm8, rax + mov r15, QWORD PTR [r9+96] + punpcklqdq xmm4, xmm0 + movd xmm0, rcx + punpcklqdq xmm5, xmm0 + movdqu xmm6, XMMWORD PTR [r10+rbx] + + ALIGN(64) +rwz_main_loop: + lea rdx, QWORD PTR [r10+rbx] + mov ecx, r10d + mov eax, r10d + mov rdi, r15 + xor ecx, 16 + xor eax, 32 + xor r10d, 48 + movd xmm0, r11 + movd xmm7, r8 + punpcklqdq xmm7, xmm0 + aesenc xmm6, xmm7 + movd rbp, xmm6 + mov r9, rbp + and r9d, 2097136 + movdqu xmm0, XMMWORD PTR [rcx+rbx] + movdqu xmm1, XMMWORD PTR [rax+rbx] + movdqu xmm2, XMMWORD PTR [r10+rbx] + paddq xmm0, xmm5 + paddq xmm1, xmm7 + paddq xmm2, xmm4 + movdqu XMMWORD PTR [rcx+rbx], xmm0 + movdqu XMMWORD PTR [rax+rbx], xmm2 + movdqu XMMWORD PTR [r10+rbx], xmm1 + mov r10, r9 + xor r10d, 32 + movd rcx, xmm3 + mov rax, rcx + shl rax, 32 + xor rdi, rax + movdqa xmm0, xmm6 + pxor xmm0, xmm4 + movdqu XMMWORD PTR [rdx], xmm0 + xor rdi, QWORD PTR [r9+rbx] + lea r14, QWORD PTR [r9+rbx] + mov r12, QWORD PTR [r14+8] + xor edx, edx + lea r9d, DWORD PTR [ecx+ecx] + add r9d, ebp + movdqa xmm0, xmm6 + psrldq xmm0, 8 + or r9d, r13d + movd rax, xmm0 + div r9 + xorps xmm3, xmm3 + mov eax, eax + shl rdx, 32 + add rdx, rax + lea r9, QWORD PTR [rdx+rbp] + mov r15, rdx + mov rax, r9 + shr rax, 12 + movd xmm0, rax + paddq xmm0, xmm8 + sqrtsd xmm3, xmm0 + psubq xmm3, XMMWORD PTR [rsp+16] + movd rdx, xmm3 + test edx, 524287 + je rwz_sqrt_fixup + psrlq xmm3, 19 +rwz_sqrt_fixup_ret: + + mov ecx, r10d + mov rax, rdi + mul rbp + movd xmm2, rdx + xor rdx, [rcx+rbx] + add r8, rdx + mov QWORD PTR [r14], r8 + xor r8, rdi + mov edi, r8d + and edi, 2097136 + movd xmm0, rax + xor rax, [rcx+rbx+8] + add r11, rax + mov QWORD PTR [r14+8], r11 + punpcklqdq xmm2, xmm0 + + mov r9d, r10d + xor r9d, 48 + xor r10d, 16 + pxor xmm2, XMMWORD PTR [r9+rbx] + movdqu xmm0, XMMWORD PTR [r10+rbx] + paddq xmm0, xmm4 + movdqu xmm1, XMMWORD PTR [rcx+rbx] + paddq xmm2, xmm5 + paddq xmm1, xmm7 + movdqa xmm5, xmm4 + movdqu XMMWORD PTR [r9+rbx], xmm2 + movdqa xmm4, xmm6 + movdqu XMMWORD PTR [rcx+rbx], xmm0 + movdqu XMMWORD PTR [r10+rbx], xmm1 + movdqu xmm6, [rdi+rbx] + mov r10d, edi + xor r11, r12 + dec rsi + jne rwz_main_loop + + ldmxcsr DWORD PTR [rsp] + mov rbx, QWORD PTR [rsp+160] + movaps xmm6, XMMWORD PTR [rsp+64] + movaps xmm7, XMMWORD PTR [rsp+48] + movaps xmm8, XMMWORD PTR [rsp+32] + add rsp, 80 + pop r15 + pop r14 + pop r13 + pop r12 + pop rdi + pop rsi + pop rbp + jmp cnv2_rwz_main_loop_endp + +rwz_sqrt_fixup: + dec rdx + mov r13d, -1022 + shl r13, 32 + mov rax, rdx + shr rdx, 19 + shr rax, 20 + mov rcx, rdx + sub rcx, rax + add rax, r13 + not r13 + sub rcx, r13 + mov r13d, -2147483647 + imul rcx, rax + sub rcx, r9 + adc rdx, 0 + movd xmm3, rdx + jmp rwz_sqrt_fixup_ret + +cnv2_rwz_main_loop_endp: diff --git a/src/Native/libcryptonight/xmrig/crypto/asm/win64/cn_main_loop.S b/src/Native/libcryptonight/xmrig/crypto/asm/win64/cn_main_loop.S index 1200c4dfea..63c3a8ba65 100644 --- a/src/Native/libcryptonight/xmrig/crypto/asm/win64/cn_main_loop.S +++ b/src/Native/libcryptonight/xmrig/crypto/asm/win64/cn_main_loop.S @@ -5,6 +5,8 @@ .global cnv2_mainloop_ryzen_asm .global cnv2_mainloop_bulldozer_asm .global cnv2_double_mainloop_sandybridge_asm +.global cnv2_rwz_mainloop_asm +.global cnv2_rwz_double_mainloop_asm ALIGN(64) cnv2_mainloop_ivybridge_asm: @@ -29,3 +31,15 @@ cnv2_double_mainloop_sandybridge_asm: #include "../cn2/cnv2_double_main_loop_sandybridge.inc" ret 0 mov eax, 3735929054 + +ALIGN(64) +cnv2_rwz_mainloop_asm: + #include "cn2/cnv2_rwz_main_loop.inc" + ret 0 + mov eax, 3735929054 + +ALIGN(64) +cnv2_rwz_double_mainloop_asm: + #include "cn2/cnv2_rwz_double_main_loop.inc" + ret 0 + mov eax, 3735929054 diff --git a/src/Native/libcryptonight/xmrig/crypto/asm/win64/cn_main_loop.asm b/src/Native/libcryptonight/xmrig/crypto/asm/win64/cn_main_loop.asm index 846b860c81..57246cf5ca 100644 --- a/src/Native/libcryptonight/xmrig/crypto/asm/win64/cn_main_loop.asm +++ b/src/Native/libcryptonight/xmrig/crypto/asm/win64/cn_main_loop.asm @@ -3,6 +3,8 @@ PUBLIC cnv2_mainloop_ivybridge_asm PUBLIC cnv2_mainloop_ryzen_asm PUBLIC cnv2_mainloop_bulldozer_asm PUBLIC cnv2_double_mainloop_sandybridge_asm +PUBLIC cnv2_rwz_mainloop_asm +PUBLIC cnv2_rwz_double_mainloop_asm ALIGN 64 cnv2_mainloop_ivybridge_asm PROC @@ -32,5 +34,19 @@ cnv2_double_mainloop_sandybridge_asm PROC mov eax, 3735929054 cnv2_double_mainloop_sandybridge_asm ENDP +ALIGN(64) +cnv2_rwz_mainloop_asm PROC + INCLUDE cn2/cnv2_rwz_main_loop.inc + ret 0 + mov eax, 3735929054 +cnv2_rwz_mainloop_asm ENDP + +ALIGN(64) +cnv2_rwz_double_mainloop_asm PROC + INCLUDE cn2/cnv2_rwz_double_main_loop.inc + ret 0 + mov eax, 3735929054 +cnv2_rwz_double_mainloop_asm ENDP + _TEXT_CNV2_MAINLOOP ENDS END diff --git a/src/Native/libcryptonight/xmrig/crypto/cn_gpu_arm.cpp b/src/Native/libcryptonight/xmrig/crypto/cn_gpu_arm.cpp index b463dd2ec1..2ac9ff1e38 100644 --- a/src/Native/libcryptonight/xmrig/crypto/cn_gpu_arm.cpp +++ b/src/Native/libcryptonight/xmrig/crypto/cn_gpu_arm.cpp @@ -29,6 +29,14 @@ #include "crypto/CryptoNight_constants.h" +#if !defined(__ARM_64BIT_STATE) +float32x4_t vdivq_f32(const float32x4_t a, const float32x4_t b) { + const float32x4_t inv = vrecpeq_f32(b); + return vmulq_f32(a, vmulq_f32(vrecpsq_f32(b, inv), inv)); +} +#endif + + inline void vandq_f32(float32x4_t &v, uint32_t v2) { uint32x4_t vc = vdupq_n_u32(v2); diff --git a/src/Native/libcryptonight/xmrig/extra.cpp b/src/Native/libcryptonight/xmrig/extra.cpp index 8a66360310..50faeba457 100644 --- a/src/Native/libcryptonight/xmrig/extra.cpp +++ b/src/Native/libcryptonight/xmrig/extra.cpp @@ -80,6 +80,16 @@ xmrig::CpuThread::cn_mainloop_fun cn_trtl_mainloop_ryzen_asm xmrig::CpuThread::cn_mainloop_fun cn_trtl_mainloop_bulldozer_asm = nullptr; xmrig::CpuThread::cn_mainloop_double_fun cn_trtl_double_mainloop_sandybridge_asm = nullptr; +xmrig::CpuThread::cn_mainloop_fun cn_zls_mainloop_ivybridge_asm = nullptr; +xmrig::CpuThread::cn_mainloop_fun cn_zls_mainloop_ryzen_asm = nullptr; +xmrig::CpuThread::cn_mainloop_fun cn_zls_mainloop_bulldozer_asm = nullptr; +xmrig::CpuThread::cn_mainloop_double_fun cn_zls_double_mainloop_sandybridge_asm = nullptr; + +xmrig::CpuThread::cn_mainloop_fun cn_double_mainloop_ivybridge_asm = nullptr; +xmrig::CpuThread::cn_mainloop_fun cn_double_mainloop_ryzen_asm = nullptr; +xmrig::CpuThread::cn_mainloop_fun cn_double_mainloop_bulldozer_asm = nullptr; +xmrig::CpuThread::cn_mainloop_double_fun cn_double_double_mainloop_sandybridge_asm = nullptr; + void xmrig::CpuThread::patchAsmVariants() { const int allocation_size = 65536; @@ -95,15 +105,35 @@ void xmrig::CpuThread::patchAsmVariants() cn_trtl_mainloop_bulldozer_asm = reinterpret_cast (base + 0x6000); cn_trtl_double_mainloop_sandybridge_asm = reinterpret_cast (base + 0x7000); - patchCode(cn_half_mainloop_ivybridge_asm, cnv2_mainloop_ivybridge_asm, xmrig::CRYPTONIGHT_HALF_ITER, xmrig::CRYPTONIGHT_MASK); - patchCode(cn_half_mainloop_ryzen_asm, cnv2_mainloop_ryzen_asm, xmrig::CRYPTONIGHT_HALF_ITER, xmrig::CRYPTONIGHT_MASK); - patchCode(cn_half_mainloop_bulldozer_asm, cnv2_mainloop_bulldozer_asm, xmrig::CRYPTONIGHT_HALF_ITER, xmrig::CRYPTONIGHT_MASK); - patchCode(cn_half_double_mainloop_sandybridge_asm, cnv2_double_mainloop_sandybridge_asm, xmrig::CRYPTONIGHT_HALF_ITER, xmrig::CRYPTONIGHT_MASK); - - patchCode(cn_trtl_mainloop_ivybridge_asm, cnv2_mainloop_ivybridge_asm, xmrig::CRYPTONIGHT_TRTL_ITER, xmrig::CRYPTONIGHT_PICO_MASK); - patchCode(cn_trtl_mainloop_ryzen_asm, cnv2_mainloop_ryzen_asm, xmrig::CRYPTONIGHT_TRTL_ITER, xmrig::CRYPTONIGHT_PICO_MASK); - patchCode(cn_trtl_mainloop_bulldozer_asm, cnv2_mainloop_bulldozer_asm, xmrig::CRYPTONIGHT_TRTL_ITER, xmrig::CRYPTONIGHT_PICO_MASK); - patchCode(cn_trtl_double_mainloop_sandybridge_asm, cnv2_double_mainloop_sandybridge_asm, xmrig::CRYPTONIGHT_TRTL_ITER, xmrig::CRYPTONIGHT_PICO_MASK); + cn_zls_mainloop_ivybridge_asm = reinterpret_cast (base + 0x8000); + cn_zls_mainloop_ryzen_asm = reinterpret_cast (base + 0x9000); + cn_zls_mainloop_bulldozer_asm = reinterpret_cast (base + 0xA000); + cn_zls_double_mainloop_sandybridge_asm = reinterpret_cast (base + 0xB000); + + cn_double_mainloop_ivybridge_asm = reinterpret_cast (base + 0xC000); + cn_double_mainloop_ryzen_asm = reinterpret_cast (base + 0xD000); + cn_double_mainloop_bulldozer_asm = reinterpret_cast (base + 0xE000); + cn_double_double_mainloop_sandybridge_asm = reinterpret_cast (base + 0xF000); + + patchCode(cn_half_mainloop_ivybridge_asm, cnv2_mainloop_ivybridge_asm, xmrig::CRYPTONIGHT_HALF_ITER, xmrig::CRYPTONIGHT_MASK); + patchCode(cn_half_mainloop_ryzen_asm, cnv2_mainloop_ryzen_asm, xmrig::CRYPTONIGHT_HALF_ITER, xmrig::CRYPTONIGHT_MASK); + patchCode(cn_half_mainloop_bulldozer_asm, cnv2_mainloop_bulldozer_asm, xmrig::CRYPTONIGHT_HALF_ITER, xmrig::CRYPTONIGHT_MASK); + patchCode(cn_half_double_mainloop_sandybridge_asm, cnv2_double_mainloop_sandybridge_asm, xmrig::CRYPTONIGHT_HALF_ITER, xmrig::CRYPTONIGHT_MASK); + + patchCode(cn_trtl_mainloop_ivybridge_asm, cnv2_mainloop_ivybridge_asm, xmrig::CRYPTONIGHT_TRTL_ITER, xmrig::CRYPTONIGHT_PICO_MASK); + patchCode(cn_trtl_mainloop_ryzen_asm, cnv2_mainloop_ryzen_asm, xmrig::CRYPTONIGHT_TRTL_ITER, xmrig::CRYPTONIGHT_PICO_MASK); + patchCode(cn_trtl_mainloop_bulldozer_asm, cnv2_mainloop_bulldozer_asm, xmrig::CRYPTONIGHT_TRTL_ITER, xmrig::CRYPTONIGHT_PICO_MASK); + patchCode(cn_trtl_double_mainloop_sandybridge_asm, cnv2_double_mainloop_sandybridge_asm, xmrig::CRYPTONIGHT_TRTL_ITER, xmrig::CRYPTONIGHT_PICO_MASK); + + patchCode(cn_zls_mainloop_ivybridge_asm, cnv2_mainloop_ivybridge_asm, xmrig::CRYPTONIGHT_ZLS_ITER, xmrig::CRYPTONIGHT_MASK); + patchCode(cn_zls_mainloop_ryzen_asm, cnv2_mainloop_ryzen_asm, xmrig::CRYPTONIGHT_ZLS_ITER, xmrig::CRYPTONIGHT_MASK); + patchCode(cn_zls_mainloop_bulldozer_asm, cnv2_mainloop_bulldozer_asm, xmrig::CRYPTONIGHT_ZLS_ITER, xmrig::CRYPTONIGHT_MASK); + patchCode(cn_zls_double_mainloop_sandybridge_asm, cnv2_double_mainloop_sandybridge_asm, xmrig::CRYPTONIGHT_ZLS_ITER, xmrig::CRYPTONIGHT_MASK); + + patchCode(cn_double_mainloop_ivybridge_asm, cnv2_mainloop_ivybridge_asm, xmrig::CRYPTONIGHT_DOUBLE_ITER, xmrig::CRYPTONIGHT_MASK); + patchCode(cn_double_mainloop_ryzen_asm, cnv2_mainloop_ryzen_asm, xmrig::CRYPTONIGHT_DOUBLE_ITER, xmrig::CRYPTONIGHT_MASK); + patchCode(cn_double_mainloop_bulldozer_asm, cnv2_mainloop_bulldozer_asm, xmrig::CRYPTONIGHT_DOUBLE_ITER, xmrig::CRYPTONIGHT_MASK); + patchCode(cn_double_double_mainloop_sandybridge_asm, cnv2_double_mainloop_sandybridge_asm, xmrig::CRYPTONIGHT_DOUBLE_ITER, xmrig::CRYPTONIGHT_MASK); Mem::protectExecutableMemory(base, allocation_size); Mem::flushInstructionCache(base, allocation_size);