Я работаю над индивидуальным майнером Java, который подключается к майнингу с помощью протокола Stratum. Я получаю майнинг. НЕОТИВАТЬ РАБОТЫ И пытаюсь: < /p>
Реконструировать транзакцию Coinbase < /p>
Построить корень Merkle < /p>
генерировать полный заголовок блока < /p> Получил его с целевым < /p>
, что я получаю пособие, и сравнивать его с целевым. шахтер (например, LV06), даже при использовании одних и тех же данных и нера. Я полагаю, что я ошибаюсь в обработке эндсианности или корневой конструкции Меркл, особенно при обращении с байтовыми массивами. < /P>
{
"method": "mining.notify",
"id": null,
"params": [
"93df",
"cf75f6f1b4552c923cd26cb8933764f54f017897000160ff0000000000000000", // prevHash
"01000000010000000000000000000000000000000000000000000000000000000000000000ffffffff4f0319b80d082f5669614254432f2cfabe6d6d19cf1f862484fc3ccb33361c3ed253fe7ceb995b62b9f80bbefe008bd12d0d9f100000000000000010df9326034dace2d5", // coinb1
"ffffffff05500a0e13000000001976a914fb37342f6275b13936799def06f2eb4c0f20151588ac00000000000000002b6a2952534b424c4f434b3a80058adf23a28f72ae80f95b0ba3af97571088ae0897e8fb98542e15007438250000000000000000296a2773797392eea868ed486be678551991db33bd1f296f83aa70f0b9171fe03f3adeea6c9306211f000000000000000000146a124558534154011508000113021b1a1f1200130000000000000000266a24aa21a9edf559e9353a8ab2ebb8ee33085f4ab7475bd1f72fa76330f79538fbccbc2e9d6c00000000", // coinb2
[
"1bcac60a66ff347e7a1ef1b518a38e94f779dc289f3b42ac82de412e84fb3b46",
"e2bfc5e0d3d6941306c3cd8b22d0bcdc7d3a0f09afd2dc9be8fcb5f80d982fc6",
"3f46eab36bd561ddb064a1d8d4d0ac2583dcac7a24bcea6d508f83c357722b3f",
"1716388283bff08265b4c93b9e117a54439a5ff3559c79935a73ccdac74e0504",
"897193b69cb03a8f54842be9ee764abfb1738791b9d58cca1d0f513d426364ce",
"2d18b8154503dc6b6afabca35847c16cf39fc8eb13fd9554bb3f8d314c2e22ca",
"ab907a89f979d0694d9657a412103822bfe3e9b72c9067698f1007e64f0944f6",
"fb72865b78f22cd221af665dc06abee4d8dee81331024a57597c8915c772b97b",
"b2c1830cdcfdea7ec3ed72b1aa7513ac1c4255042f925f1550a414bb946f9991",
"535fef283bd77bd46550c26ac47047f88a883cd7ff9d5f1eb1faf430ee823e23",
"dd3f9e3def29b626719d83a10952e5d73e0ed647ffcbb1d6ad1491d21869b8b7",
"acc7e5eee275e564a0426ed7ac2aa43549f926280eeb62c09987f2b9dd8fa9ca"
],
"20000000", // version
"17025049", // nBits
"6839fa82", // nTime
true
]
}
< /code>
Что мне нужна помощь с: < /p>
Как мне справляться с эндианностью на протяжении всего процесса?
-это уже в маленьком эендионе или мне нужно изменить его? Окончательный корень Merkle должен быть изменен перед тем, как поместить его в заголовок? public MerkleResolver.Result generateMerkle(String extranonce2, List
merkleBranchesHex, String sessionExtranonce1, String coinb1, String coinb2,
MessageDigest digest) {
MerkleResolver.Result result = new MerkleResolver.Result();
result.extranonce2 = extranonce2;
result.extranonce1AndExtranonce2 = sessionExtranonce1 + extranonce2;
result.coinbaseHex = coinb1 + result.extranonce1AndExtranonce2 + coinb2;
result.coinbaseBytes = MinerUtils.hexStringToByteArray(result.coinbaseHex);
result.coinbaseHash = (MinerUtils.doubleSha256(result.coinbaseBytes, digest));
result.merkleRoot = recalculateMerkleRoot(result.coinbaseHash, merkleBranchesHex, digest);
return result;
< /code>
} < /p>
public byte[] recalculateMerkleRoot(byte[] coinbaseHashLE, List
merkleBranches, MessageDigest digest) {
byte[] currentHash = MinerUtils.reverseBytes(coinbaseHashLE);
for (String branchHex : merkleBranches) {
byte[] branch = MinerUtils.reverseBytes(MinerUtils.hexStringToByteArray(branchHex));
byte[] combined = MinerUtils.concatenateBytes(currentHash, branch);
currentHash = MinerUtils.doubleSha256(combined, digest);
}
return MinerUtils.reverseBytes(currentHash);
< /code>
} < /p>
public byte[] generateBlockHeader(long nonce, String versionHex, String prevHashHex,
byte[] merkleRoot, String nBitsHex, String nTime) {
ByteBuffer header = ByteBuffer.allocate(80);
header.order(ByteOrder.LITTLE_ENDIAN);
// 1. Versión (little-endian directo del pool)
if (this.lastVersionHex == null) {
this.lastVersionHex = (MinerUtils.hexStringToByteArray(versionHex));
}
header.put(this.lastVersionHex);
// 2. PrevHash (big-endian → little-endian)
if (this.lastPrevHashHex == null) {
byte[] prevHash = MinerUtils.hexStringToByteArray(prevHashHex);
this.lastPrevHashHex = (prevHash);
}
header.put(this.lastPrevHashHex);
// 3. Merkle Root (ya debe venir en little-endian)
if (this.lastMerkleRoot == null) {
this.lastMerkleRoot = merkleRoot;
}
header.put(this.lastMerkleRoot);
// 4. Timestamp (little-endian)
if (this.lastNtime == null) {
this.lastNtime = (MinerUtils.hexStringToByteArray(nTime));
}
header.put(this.lastNtime);
// 5. Bits (big-endian → little-endian)
if (this.lastNbit == null) {
byte[] bits = MinerUtils.hexStringToByteArray(nBitsHex);
this.lastNbit = (bits);
}
header.put(this.lastNbit);
// 6. Nonce (little-endian)
header.putInt((int) (nonce & 0xFFFFFFFFL));
return header.array();
}
< /code>
< /li>
< /ol>
Моя цель:
Сопоставьте то же самое хэш и результаты трудности, которые создает ASIC, используя только Java. < /p>
Большое спасибо! Любое понимание или фрагмент кода высоко ценится.
Подробнее здесь: https://stackoverflow.com/questions/796 ... ing-notify