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

Commit

Permalink
Merge branch 'dev'
Browse files Browse the repository at this point in the history
- ZCash working with "Overwinter" and upcoming "Sapling" release - Fixes #374, Fixes #369, Fixes #369, Fixes #292, Fixes #281, Fixes #281
- Updated Ethereum codebase for latest parity releases - Fixes #301
- Equihash Solver security update
- Fixes for latest Bitcoin Gold update
- Fix for Monero payouts to integrated addresses
- Fixes #257
  • Loading branch information
Oliver Weichhold committed Sep 14, 2018
2 parents 7207861 + 1801e34 commit 782f6ae
Show file tree
Hide file tree
Showing 66 changed files with 989 additions and 852 deletions.
121 changes: 0 additions & 121 deletions src/MiningCore.Tests/Crypto/EthashTests.cs

This file was deleted.

10 changes: 5 additions & 5 deletions src/MiningCore.Tests/Crypto/HashingTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -325,7 +325,7 @@ public void DummyHasher_Should_Always_Throw()
[Fact]
public void EquihashVerifier_Should_Verify_Success()
{
var hasher = EquihashSolver.Instance.Value;
var hasher = new EquihashSolver_ZCash();
var header = "0400000008e9694cc2120ec1b5733cc12687b609058eec4f7046a521ad1d1e3049b400003e7420ed6f40659de0305ef9b7ec037f4380ed9848bc1c015691c90aa16ff3930000000000000000000000000000000000000000000000000000000000000000c9310d5874e0001f000000000000000000000000000000010b000000000000000000000000000040" .HexToByteArray();
var solution = "00b43863a213bfe79f00337f5a729f09710abcc07035ef8ac34372abddecf2f82715f7223f075af96f0604fc124d6151fc8fb516d24a137faec123a89aa9a433f8a25a6bcfc554c28be556f6c878f96539186fab191505f278df48bf1ad2240e5bb39f372a143de1dd1b672312e00d52a3dd83f471b0239a7e8b30d4b9153027df87c8cd0b64de76749539fea376b4f39d08cf3d5e821495e52fdfa6f8085e59fc670656121c9d7c01388c8b4b4585aa7b9ac3f7ae796f9eb1fadba1730a1860eed797feabb18832b5e8f003c0adaf0788d1016e7a8969144018ecc86140aa4553962aa739a4850b509b505e158c5f9e2d5376374652e9e6d81b19fa0351be229af136efbce681463cc53d7880c1eeca3411154474ff8a7b2bac034a2026646776a517bf63921c31fbbd6be7c3ff42aab28230bfe81d33800b892b262f3579b7a41925a59f5cc1d4f523577c19ff9f92023146fa26486595bd89a1ba459eb0b5cec0578c3a071dbec73eca054c723ab30ce8e69de32e779cd2f1030e39878ac6ea3cdca743b43aedefe1a9b4f2da861038e2759defef0b8cad11d4179f2f08881b53ccc203e558c0571e049d998a257b3279016aad0d7999b609f6331a0d0f88e286a70432ca7f50a5bb8fafbbe9230b4ccb1fa57361c163d6b9f84579d61f41585a022d07dc8e55a8de4d8f87641dae777819458a2bf1bb02c438480ff11621ca8442ec2946875cce247c8877051359e9c822670d37bb00fa806e60e8e890ce62540fda2d5b1c790ca1e005030ac6d8e63db577bb98be111ee146828f9c48ee6257d7627b93ea3dd11aac3412e63dfc7ca132a73c4f51e7650f3f8ecf57bfc18716990b492d50e0a3e5fbf6136e771b91f7283ec3326209265b9531d157f8a07a4117fc8fb29ba1363afc6f9f0608251ea595256727a5bbe28f42a42edfbfa9017680e32980d4ad381612612b2bc7ad91e82eca693ea4fc27049a99636b50a576f1e55c72202d582b150ef194c1419f53177ecf315ea6b0e2f1aa8cd8f59b165aa0d89561c537fb6141f5813b7a4968fe16afc703326113f68508d88ff8d0aee1e88a84c0ae56c72f27511290ced48e93e8c95419d14aed1a5b2e9b2c9c1070c593e5eb50bb9a80e14e9f9fe501f56b1b3140159e8213b75d48d14af472a604484cd8e7e7abb6820245ed3ab29f9947463a033c586194be45eadec8392c8614d83a1e9ca0fe5655fa14f7a9c1d1f8f2185a06193ff4a3c3e9a96b02310033ceaa25894e7c56a6147e691597098054e285d39656d3d459ec5d13243c062b6eb44e19a13bdfc0b3c96bd3d1aeb75bb6b080322aea23555993cb529243958bb1a0e5d5027e6c78155437242d1d13c1d6e442a0e3783147a08bbfc0c2529fb705ad27713df40486fd58f001977f25dfd3c202451c07010a3880bca63959ca61f10ed3871f1152166fce2b52135718a8ceb239a0664a31c62defaad70be4b920dce70549c10d9138fbbad7f291c5b73fa21c3889929b143bc1576b72f70667ac11052b686891085290d871db528b5cfdc10a6d563925227609f10d1768a0e02dc7471ad424f94f737d4e7eb0fb167f1434fc4ae2d49e152f06f0845b6db0a44f0d6f5e7410420e6bd1f430b1af956005bf72b51405a04d9a5d9906ceca52c22c855785c3c3ac4c3e9bf532d31bab321e1db66f6a9f7dc9c017f2b7d8dfeb933cf5bbae71311ae318f6d187ebc5c843be342b08a9a0ff7c4b9c4b0f4fa74b13296afe84b6481440d58332e07b3d051ed55219d28e77af6612134da4431b797c63ef55bc53831e2f421db620fee51ba0967e4ed7009ef90af2204259bbfbb54537fd35c2132fa8e7f9c84bf9938d248862c6ca1cca9f48b0b33aa1589185c4eabc1c32".HexToByteArray();
var result = hasher.Verify(header, solution);
Expand All @@ -336,7 +336,7 @@ public void EquihashVerifier_Should_Verify_Success()
[Fact]
public void EquihashVerifier_Should_Not_Verify_Invalid_Solution()
{
var hasher = EquihashSolver.Instance.Value;
var hasher = new EquihashSolver_ZCash();
var header = "0400000008e9694cc2120ec1b5733cc12687b609058eec4f7046a521ad1d1e3049b400003e7420ed6f40659de0305ef9b7ec037f4380ed9848bc1c015691c90aa16ff3930000000000000000000000000000000000000000000000000000000000000000c9310d5874e0001f000000000000000000000000000000010b000000000000000000000000000040".HexToByteArray();
var solution = "90b43863a213bfe79f00337f5a729f09710abcc07035ef8ac34372abddecf2f82715f7223f075af96f0604fc124d6151fc8fb516d24a137faec123a89aa9a433f8a25a6bcfc554c28be556f6c878f96539186fab191505f278df48bf1ad2240e5bb39f372a143de1dd1b672312e00d52a3dd83f471b0239a7e8b30d4b9153027df87c8cd0b64de76749539fea376b4f39d08cf3d5e821495e52fdfa6f8085e59fc670656121c9d7c01388c8b4b4585aa7b9ac3f7ae796f9eb1fadba1730a1860eed797feabb18832b5e8f003c0adaf0788d1016e7a8969144018ecc86140aa4553962aa739a4850b509b505e158c5f9e2d5376374652e9e6d81b19fa0351be229af136efbce681463cc53d7880c1eeca3411154474ff8a7b2bac034a2026646776a517bf63921c31fbbd6be7c3ff42aab28230bfe81d33800b892b262f3579b7a41925a59f5cc1d4f523577c19ff9f92023146fa26486595bd89a1ba459eb0b5cec0578c3a071dbec73eca054c723ab30ce8e69de32e779cd2f1030e39878ac6ea3cdca743b43aedefe1a9b4f2da861038e2759defef0b8cad11d4179f2f08881b53ccc203e558c0571e049d998a257b3279016aad0d7999b609f6331a0d0f88e286a70432ca7f50a5bb8fafbbe9230b4ccb1fa57361c163d6b9f84579d61f41585a022d07dc8e55a8de4d8f87641dae777819458a2bf1bb02c438480ff11621ca8442ec2946875cce247c8877051359e9c822670d37bb00fa806e60e8e890ce62540fda2d5b1c790ca1e005030ac6d8e63db577bb98be111ee146828f9c48ee6257d7627b93ea3dd11aac3412e63dfc7ca132a73c4f51e7650f3f8ecf57bfc18716990b492d50e0a3e5fbf6136e771b91f7283ec3326209265b9531d157f8a07a4117fc8fb29ba1363afc6f9f0608251ea595256727a5bbe28f42a42edfbfa9017680e32980d4ad381612612b2bc7ad91e82eca693ea4fc27049a99636b50a576f1e55c72202d582b150ef194c1419f53177ecf315ea6b0e2f1aa8cd8f59b165aa0d89561c537fb6141f5813b7a4968fe16afc703326113f68508d88ff8d0aee1e88a84c0ae56c72f27511290ced48e93e8c95419d14aed1a5b2e9b2c9c1070c593e5eb50bb9a80e14e9f9fe501f56b1b3140159e8213b75d48d14af472a604484cd8e7e7abb6820245ed3ab29f9947463a033c586194be45eadec8392c8614d83a1e9ca0fe5655fa14f7a9c1d1f8f2185a06193ff4a3c3e9a96b02310033ceaa25894e7c56a6147e691597098054e285d39656d3d459ec5d13243c062b6eb44e19a13bdfc0b3c96bd3d1aeb75bb6b080322aea23555993cb529243958bb1a0e5d5027e6c78155437242d1d13c1d6e442a0e3783147a08bbfc0c2529fb705ad27713df40486fd58f001977f25dfd3c202451c07010a3880bca63959ca61f10ed3871f1152166fce2b52135718a8ceb239a0664a31c62defaad70be4b920dce70549c10d9138fbbad7f291c5b73fa21c3889929b143bc1576b72f70667ac11052b686891085290d871db528b5cfdc10a6d563925227609f10d1768a0e02dc7471ad424f94f737d4e7eb0fb167f1434fc4ae2d49e152f06f0845b6db0a44f0d6f5e7410420e6bd1f430b1af956005bf72b51405a04d9a5d9906ceca52c22c855785c3c3ac4c3e9bf532d31bab321e1db66f6a9f7dc9c017f2b7d8dfeb933cf5bbae71311ae318f6d187ebc5c843be342b08a9a0ff7c4b9c4b0f4fa74b13296afe84b6481440d58332e07b3d051ed55219d28e77af6612134da4431b797c63ef55bc53831e2f421db620fee51ba0967e4ed7009ef90af2204259bbfbb54537fd35c2132fa8e7f9c84bf9938d248862c6ca1cca9f48b0b33aa1589185c4eabc1c32".HexToByteArray();
var result = hasher.Verify(header, solution);
Expand All @@ -347,7 +347,7 @@ public void EquihashVerifier_Should_Not_Verify_Invalid_Solution()
[Fact]
public void EquihashVerifier_Should_Not_Verify_Fake_Solution()
{
var hasher = EquihashSolver.Instance.Value;
var hasher = new EquihashSolver_ZCash();
var header = "0400000008e9694cc2120ec1b5733cc12687b609058eec4f7046a521ad1d1e3049b400003e7420ed6f40659de0305ef9b7ec037f4380ed9848bc1c015691c90aa16ff3930000000000000000000000000000000000000000000000000000000000000000c9310d5874e0001f000000000000000000000000000000010b000000000000000000000000000040".HexToByteArray();
var solution = Enumerable.Repeat((byte) 0, 1344).ToArray();
var result = hasher.Verify(header, solution);
Expand All @@ -358,14 +358,14 @@ public void EquihashVerifier_Should_Not_Verify_Fake_Solution()
[Fact]
public void EquihashVerifier_Should_Throw_On_Null_Input()
{
var hasher = EquihashSolver.Instance.Value;
var hasher = new EquihashSolver_ZCash();
Assert.Throws<ArgumentNullException>(() => hasher.Verify(null, null));
}

[Fact]
public void EquihashVerifier_Should_Throw_On_Wrong_Argument_Length()
{
var hasher = EquihashSolver.Instance.Value;
var hasher = new EquihashSolver_ZCash();
Assert.Throws<ArgumentException>(() => hasher.Verify(new byte[3], null));
Assert.Throws<ArgumentException>(() => hasher.Verify(new byte[140], new byte[3]));
}
Expand Down
2 changes: 0 additions & 2 deletions src/MiningCore/Banning/IntegratedBanManager.cs
Original file line number Diff line number Diff line change
Expand Up @@ -36,8 +36,6 @@ public class IntegratedBanManager : IBanManager

public bool IsBanned(IPAddress address)
{
Contract.RequiresNonNull(address, nameof(address));

var result = cache.Get(address.ToString());
return result != null;
}
Expand Down
69 changes: 31 additions & 38 deletions src/MiningCore/Blockchain/Bitcoin/BitcoinJob.cs
Original file line number Diff line number Diff line change
Expand Up @@ -63,6 +63,25 @@ public class BitcoinJob<TBlockTemplate>
protected string[] merkleBranchesHex;
protected MerkleTree mt;

protected Network NBitcoinNetworkType
{
get
{
switch (networkType)
{
case BitcoinNetworkType.Main:
return Network.Main;
case BitcoinNetworkType.Test:
return Network.TestNet;
case BitcoinNetworkType.RegTest:
return Network.RegTest;

default:
throw new NotSupportedException("unsupported network type");
}
}
}

///////////////////////////////////////////
// GetJobParams related properties

Expand All @@ -75,7 +94,7 @@ public class BitcoinJob<TBlockTemplate>
protected static byte[] scriptSigFinalBytes = new Script(Op.GetPushOp(Encoding.UTF8.GetBytes("/MiningCore/"))).ToBytes();

protected static byte[] sha256Empty = Enumerable.Repeat((byte) 0, 32).ToArray();
protected static uint txVersion = 1u; // transaction version (currently 1) - see https://en.bitcoin.it/wiki/Transaction
protected uint txVersion = 1u; // transaction version (currently 1) - see https://en.bitcoin.it/wiki/Transaction

protected static uint txInputCount = 1u;
protected static uint txInPrevOutIndex = (uint) (Math.Pow(2, 32) - 1);
Expand Down Expand Up @@ -135,7 +154,7 @@ protected virtual void BuildCoinbase()
bs.ReadWriteAsVarInt(ref sigScriptLength);
bs.ReadWrite(ref sigScriptInitialBytes);

// done
// done
coinbaseInitial = stream.ToArray();
coinbaseInitialHex = coinbaseInitial.ToHexString();
}
Expand Down Expand Up @@ -166,45 +185,19 @@ protected virtual void BuildCoinbase()

protected virtual byte[] SerializeOutputTransaction(Transaction tx)
{
var withDefaultWitnessCommitment = !string.IsNullOrEmpty(BlockTemplate.DefaultWitnessCommitment);

var outputCount = (uint) tx.Outputs.Count;
if (withDefaultWitnessCommitment)
outputCount++;

using(var stream = new MemoryStream())
{
var bs = new BitcoinStream(stream, true);

// write output count
bs.ReadWriteAsVarInt(ref outputCount);

long amount;
byte[] raw;
uint rawLength;

// serialize witness (segwit)
if (withDefaultWitnessCommitment)
{
amount = 0;
raw = BlockTemplate.DefaultWitnessCommitment.HexToByteArray();
rawLength = (uint)raw.Length;

bs.ReadWrite(ref amount);
bs.ReadWriteAsVarInt(ref rawLength);
bs.ReadWrite(ref raw);
}
// serialize outputs
var vout = tx.Outputs;
bs.ReadWrite<TxOutList, TxOut>(ref vout);

// serialize outputs
foreach (var output in tx.Outputs)
// serialize witness (segwit)
if (!string.IsNullOrEmpty(BlockTemplate.DefaultWitnessCommitment))
{
amount = output.Value.Satoshi;
var outScript = output.ScriptPubKey;
raw = outScript.ToBytes(true);
rawLength = (uint) raw.Length;

bs.ReadWrite(ref amount);
bs.ReadWriteAsVarInt(ref rawLength);
var witScript = new WitScript(BlockTemplate.DefaultWitnessCommitment);
var raw = witScript.ToBytes();
bs.ReadWrite(ref raw);
}

Expand Down Expand Up @@ -239,7 +232,7 @@ protected virtual Transaction CreateOutputTransaction()
{
rewardToPool = new Money(BlockTemplate.CoinbaseValue * blockRewardMultiplier, MoneyUnit.Satoshi);

var tx = new Transaction();
var tx = Transaction.Create(NBitcoinNetworkType);

tx.Outputs.Insert(0, new TxOut(rewardToPool, poolAddressDestination)
{
Expand Down Expand Up @@ -290,7 +283,7 @@ protected virtual byte[] SerializeHeader(byte[] coinbaseHash, uint nTime, uint n

protected virtual (Share Share, string BlockHex) ProcessShareInternal(StratumClient worker, string extraNonce2, uint nTime, uint nonce)
{
var context = worker.GetContextAs<BitcoinWorkerContext>();
var context = worker.ContextAs<BitcoinWorkerContext>();
var extraNonce1 = context.ExtraNonce1;

// build coinbase
Expand Down Expand Up @@ -488,7 +481,7 @@ public virtual (Share Share, string BlockHex) ProcessShare(StratumClient worker,
Contract.Requires<ArgumentException>(!string.IsNullOrEmpty(nTime), $"{nameof(nTime)} must not be empty");
Contract.Requires<ArgumentException>(!string.IsNullOrEmpty(nonce), $"{nameof(nonce)} must not be empty");

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

// validate nTime
if (nTime.Length != 8)
Expand Down
Loading

0 comments on commit 782f6ae

Please sign in to comment.