|
| 1 | +using Autofac; |
| 2 | +using Microsoft.IO; |
| 3 | +using Miningcore.Blockchain.Bitcoin; |
| 4 | +using Miningcore.Configuration; |
| 5 | +using Miningcore.Stratum; |
| 6 | +using Miningcore.Tests.Util; |
| 7 | +using NBitcoin; |
| 8 | +using Newtonsoft.Json; |
| 9 | +using NLog; |
| 10 | +using Xunit; |
| 11 | +#pragma warning disable 8974 |
| 12 | + |
| 13 | +namespace Miningcore.Tests.Blockchain.Bitcoin; |
| 14 | + |
| 15 | +public class BitcoinJobTests : TestBase |
| 16 | +{ |
| 17 | + [Fact] |
| 18 | + public void Process_Valid_Block() |
| 19 | + { |
| 20 | + var (job, worker) = CreateJob(); |
| 21 | + |
| 22 | + var submitParams = JsonConvert.DeserializeObject<object[]>("[\"yXHmbak4AdgK5vWamwqFtEijn2NpgLvmi4\",\"00000001\",\"01000000\",\"63445774\",\"51036775\"]", jsonSerializerSettings); |
| 23 | + |
| 24 | + // extract params |
| 25 | + var extraNonce2 = submitParams[2] as string; |
| 26 | + var nTime = submitParams[3] as string; |
| 27 | + var nonce = submitParams[4] as string; |
| 28 | + |
| 29 | + // validate & process |
| 30 | + var (share, blockHex) = job.ProcessShare(worker, extraNonce2, nTime, nonce); |
| 31 | + |
| 32 | + Assert.NotNull(share); |
| 33 | + Assert.Equal("00000056300e9fd18624edd7eaa8bcd6c8466d7eb8cf91b4e60f9d35fa97f504", share.BlockHash); |
| 34 | + Assert.Equal("000000204b0e40a0b523ec3d00fc1a7cee084165a111646b9b35e50936ada1861a0100000362a84c2b4b2e530ec640e2a7f85e05da2c42c8e3645a5bbc2245e74ec1ae967457446371d7011e756703510103000500010000000000000000000000000000000000000000000000000000000000000000ffffffff1d03b66a0c04745744630060000001010000000a4d696e696e67636f7265000000000241016d40000000001976a91464f2b2b84f62d68a2cd7f7f5fb2b5aa75ef716d788ac2c56f32a000000001976a9141a9cab092e161f3822af4b27f4f33051dbb7d32088ac00000000460200b66a0c00fbab6816312c05803d026cce30fec0332c059f66e421ab0bf65b96ea9efb8a22e12cfc31666208b47a006e5b74f95a4c0797b6bc620ea1cc07cb53616e547302", blockHex); |
| 35 | + Assert.Equal(813750, share.BlockHeight); |
| 36 | + Assert.True(share.IsBlockCandidate); |
| 37 | + } |
| 38 | + |
| 39 | + [Fact] |
| 40 | + public void Process_Duplicate_Submission() |
| 41 | + { |
| 42 | + var (job, worker) = CreateJob(); |
| 43 | + |
| 44 | + var submitParams = JsonConvert.DeserializeObject<object[]>("[\"yXHmbak4AdgK5vWamwqFtEijn2NpgLvmi4\",\"00000001\",\"01000000\",\"63445774\",\"51036775\"]", jsonSerializerSettings); |
| 45 | + |
| 46 | + // extract params |
| 47 | + var extraNonce2 = submitParams[2] as string; |
| 48 | + var nTime = submitParams[3] as string; |
| 49 | + var nonce = submitParams[4] as string; |
| 50 | + |
| 51 | + // validate & process |
| 52 | + var (share, _) = job.ProcessShare(worker, extraNonce2, nTime, nonce); |
| 53 | + |
| 54 | + Assert.NotNull(share); |
| 55 | + Assert.True(share.IsBlockCandidate); |
| 56 | + |
| 57 | + Assert.ThrowsAny<StratumException>(()=> job.ProcessShare(worker, extraNonce2, nTime, nonce)); |
| 58 | + } |
| 59 | + |
| 60 | + [Fact] |
| 61 | + public void Process_Invalid_Nonce() |
| 62 | + { |
| 63 | + var (job, worker) = CreateJob(); |
| 64 | + |
| 65 | + var submitParams = JsonConvert.DeserializeObject<object[]>("[\"yXHmbak4AdgK5vWamwqFtEijn2NpgLvmi4\",\"00000001\",\"01000000\",\"63445774\",\"61036775\"]", jsonSerializerSettings); |
| 66 | + |
| 67 | + // extract params |
| 68 | + var extraNonce2 = submitParams[2] as string; |
| 69 | + var nTime = submitParams[3] as string; |
| 70 | + var nonce = submitParams[4] as string; |
| 71 | + |
| 72 | + // validate & process |
| 73 | + Assert.ThrowsAny<StratumException>(()=> job.ProcessShare(worker, extraNonce2, nTime, nonce)); |
| 74 | + } |
| 75 | + |
| 76 | + [Fact] |
| 77 | + public void Process_Invalid_Time() |
| 78 | + { |
| 79 | + var (job, worker) = CreateJob(); |
| 80 | + |
| 81 | + var submitParams = JsonConvert.DeserializeObject<object[]>("[\"yXHmbak4AdgK5vWamwqFtEijn2NpgLvmi4\",\"00000001\",\"01000000\",\"13445774\",\"51036775\"]", jsonSerializerSettings); |
| 82 | + |
| 83 | + // extract params |
| 84 | + var extraNonce2 = submitParams[2] as string; |
| 85 | + var nTime = submitParams[3] as string; |
| 86 | + var nonce = submitParams[4] as string; |
| 87 | + |
| 88 | + // validate & process |
| 89 | + Assert.ThrowsAny<StratumException>(()=> job.ProcessShare(worker, extraNonce2, nTime, nonce)); |
| 90 | + } |
| 91 | + |
| 92 | + private (BitcoinJob, StratumConnection) CreateJob() |
| 93 | + { |
| 94 | + var job = new BitcoinJob(); |
| 95 | + var coin = (BitcoinTemplate) ModuleInitializer.CoinTemplates["dash"]; |
| 96 | + var pc = new PoolConfig { Template = coin }; |
| 97 | + |
| 98 | + var blockTemplate = JsonConvert.DeserializeObject<Miningcore.Blockchain.Bitcoin.DaemonResponses.BlockTemplate>("{\"version\":536870912,\"previousBlockhash\":\"0000011a86a1ad3609e5359b6b6411a1654108ee7c1afc003dec23b5a0400e4b\",\"coinbaseValue\":1801475949,\"target\":\"000001d771000000000000000000000000000000000000000000000000000000\",\"nonceRange\":\"00000000ffffffff\",\"curTime\":1665423220,\"bits\":\"1e01d771\",\"height\":813750,\"transactions\":[],\"coinbaseAux\":{\"flags\":null},\"default_witness_commitment\":null,\"capabilities\":[\"proposal\"],\"rules\":[\"csv\",\"dip0001\",\"bip147\",\"dip0003\",\"dip0008\",\"realloc\",\"dip0020\",\"dip0024\"],\"vbavailable\":{},\"vbrequired\":0,\"longpollid\":\"0000011a86a1ad3609e5359b6b6411a1654108ee7c1afc003dec23b5a0400e4b814670\",\"mintime\":1665422408,\"mutable\":[\"time\",\"transactions\",\"prevblock\"],\"sigoplimit\":40000,\"sizelimit\":2000000,\"previousbits\":\"1e01bee4\",\"masternode\":[{\"payee\":\"yVXDAM73Tg6A44Bm3qduXsMCYxzuqBCT48\",\"script\":\"76a91464f2b2b84f62d68a2cd7f7f5fb2b5aa75ef716d788ac\",\"amount\":1080885569}],\"masternode_payments_started\":true,\"masternode_payments_enforced\":true,\"superblock\":[],\"superblocks_started\":true,\"superblocks_enabled\":true,\"coinbase_payload\":\"0200b66a0c00fbab6816312c05803d026cce30fec0332c059f66e421ab0bf65b96ea9efb8a22e12cfc31666208b47a006e5b74f95a4c0797b6bc620ea1cc07cb53616e547302\"}", jsonSerializerSettings); |
| 99 | + var clock = MockMasterClock.FromTicks(638010200200475015); |
| 100 | + var poolAddressDestination = BitcoinUtils.AddressToDestination("yNkA6gVSPqKzW6WmJtTazRLKbSkQA5ND2h", Network.TestNet); |
| 101 | + var network = Network.GetNetwork("testnet"); |
| 102 | + |
| 103 | + var context = new BitcoinWorkerContext |
| 104 | + { |
| 105 | + Miner = "yXHmbak4AdgK5vWamwqFtEijn2NpgLvmi4", |
| 106 | + ExtraNonce1 = "60000001", |
| 107 | + Difficulty = 0.01, |
| 108 | + UserAgent = "cpuminer-multi/1.3.1" |
| 109 | + }; |
| 110 | + |
| 111 | + var worker = new StratumConnection(new NullLogger(LogManager.LogFactory), container.Resolve<RecyclableMemoryStreamManager>(), clock, "1", false); |
| 112 | + worker.SetContext(context); |
| 113 | + |
| 114 | + job.Init(blockTemplate, "1", pc, null, new ClusterConfig(), clock, poolAddressDestination, network, false, |
| 115 | + coin.ShareMultiplier, coin.CoinbaseHasherValue, coin.HeaderHasherValue, coin.BlockHasherValue); |
| 116 | + |
| 117 | + return (job, worker); |
| 118 | + } |
| 119 | +} |
0 commit comments