/
JobInfo.cs
109 lines (92 loc) · 4.08 KB
/
JobInfo.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using BCNet;
namespace CentralMine.NET
{
class JobInfo : WorkBlock
{
public string mJobID;
public string mPrevHash;
public string mCoinBaseA;
public string mCoinBaseB;
public List<String> mMerkleBranch;
public string mVersion;
public string mDifficulty;
public string mTime;
string mExtraNonce;
int mExtraNonceSize;
ulong mExtraNonceB = 2;
public string mExtraNonce2;
public string mTimeStr;
public JobInfo(string extraNonce, int extraNonceSize)
: base()
{
mMerkleBranch = new List<string>();
mExtraNonce = extraNonce;
mExtraNonceSize = extraNonceSize;
}
public void Initialize(ulong serverDiff)
{
if (serverDiff == 0)
{
uint diff = Utils.HexStringToUInt(mDifficulty);
int diffBytes = ((int)diff >> 24) & 0x000000FF;
strTarget = "";
for (int i = 0; i < diffBytes - 3; i++)
strTarget += "00";
strTarget += string.Format("{0:X2}", (byte)diff);
strTarget += string.Format("{0:X2}", (byte)((int)diff >> 8));
strTarget += string.Format("{0:X2}", (byte)((int)diff >> 16));
for (int i = diffBytes; i < 32; i++)
strTarget += "00";
}
else
{
strTarget = "000000000000000000000000000000000000000000000000";
strTarget += string.Format("{0:X2}", (byte)((long)serverDiff));
strTarget += string.Format("{0:X2}", (byte)((long)serverDiff >> 8));
strTarget += string.Format("{0:X2}", (byte)((long)serverDiff >> 16));
strTarget += string.Format("{0:X2}", (byte)((long)serverDiff >> 24));
strTarget += string.Format("{0:X2}", (byte)((long)serverDiff >> 32));
strTarget += string.Format("{0:X2}", (byte)((long)serverDiff >> 40));
strTarget += string.Format("{0:X2}", (byte)((long)serverDiff >> 48));
strTarget += string.Format("{0:X2}", (byte)((long)serverDiff >> 56));
}
target = Utils.HexStringToByteArray(strTarget);
//Utils.ByteSwapIntegers(target);
mHashMan = new HashManager();
}
public void GenerateWork()
{
byte[] en2b = new byte[mExtraNonceSize];
for( int i = 0; i < mExtraNonceSize; i++ )
{
ulong mask = (ulong)0xFF << (i * 8);
ulong masked = (mExtraNonceB & mask) >> (i * 8);
en2b[mExtraNonceSize - (1 + i)] = (byte)masked;
}
mExtraNonceB++;
mExtraNonce2 = Utils.ByteArrayToHexString(en2b);
string coinbase = mCoinBaseA + mExtraNonce + mExtraNonce2 + mCoinBaseB;
byte[] cb = Utils.HexStringToByteArray(coinbase);
byte[] cbHash = MinerLib_cs.Scrypt.SHA2562(cb);
string merkleRoot = Utils.ByteArrayToHexString(cbHash);
foreach (string merkle in mMerkleBranch)
{
byte[] hashData = Utils.HexStringToByteArray(merkleRoot + merkle);
byte[] merkleHash = MinerLib_cs.Scrypt.SHA2562(hashData);
merkleRoot = Utils.ByteArrayToHexString(merkleHash);
}
// byteswap the merkle root section
byte[] merkleData = Utils.HexStringToByteArray(merkleRoot);
Utils.ByteSwapIntegers(merkleData);
merkleRoot = Utils.ByteArrayToHexString(merkleData);
uint time = (uint)Utils.UnixTime() + 120;
mTimeStr = Utils.UIntToHexString(time);
strData = mVersion + mPrevHash + merkleRoot + mTimeStr + mDifficulty + "00000000" + "000000800000000000000000000000000000000000000000000000000000000000000000000000000000000080020000";
data = Utils.HexStringToByteArray(strData);
}
}
}