Sha256Hash: migrate to byte[] serialize() from byte[] getReversedBytes()

This commit is contained in:
Andreas Schildbach 2023-04-03 21:40:25 +02:00
parent edf889306b
commit 4248804f82
10 changed files with 21 additions and 19 deletions

View File

@ -269,9 +269,11 @@ public class Sha256Hash implements Comparable<Sha256Hash> {
} }
/** /**
* Returns a reversed copy of the internal byte array. * Allocates a byte array and writes the hash into it, in reversed order.
*
* @return byte array containing the hash
*/ */
public byte[] getReversedBytes() { public byte[] serialize() {
return ByteUtils.reverseBytes(bytes); return ByteUtils.reverseBytes(bytes);
} }
@ -284,7 +286,7 @@ public class Sha256Hash implements Comparable<Sha256Hash> {
*/ */
public ByteBuffer write(ByteBuffer buf) throws BufferOverflowException { public ByteBuffer write(ByteBuffer buf) throws BufferOverflowException {
// we have to flip it around, as on the wire it's in little endian // we have to flip it around, as on the wire it's in little endian
buf.put(getReversedBytes()); buf.put(serialize());
return buf; return buf;
} }

View File

@ -269,8 +269,8 @@ public class Block extends Message {
// default for testing // default for testing
void writeHeader(OutputStream stream) throws IOException { void writeHeader(OutputStream stream) throws IOException {
ByteUtils.writeInt32LE(version, stream); ByteUtils.writeInt32LE(version, stream);
stream.write(prevBlockHash.getReversedBytes()); stream.write(prevBlockHash.serialize());
stream.write(getMerkleRoot().getReversedBytes()); stream.write(getMerkleRoot().serialize());
ByteUtils.writeInt32LE(time.getEpochSecond(), stream); ByteUtils.writeInt32LE(time.getEpochSecond(), stream);
ByteUtils.writeInt32LE(difficultyTarget, stream); ByteUtils.writeInt32LE(difficultyTarget, stream);
ByteUtils.writeInt32LE(nonce, stream); ByteUtils.writeInt32LE(nonce, stream);
@ -520,7 +520,7 @@ public class Block extends Message {
if (witnessReserved.length != 32) if (witnessReserved.length != 32)
throw new VerificationException("Coinbase witness reserved invalid: length"); throw new VerificationException("Coinbase witness reserved invalid: length");
Sha256Hash witnessRootHash = Sha256Hash.twiceOf(getWitnessRoot().getReversedBytes(), witnessReserved); Sha256Hash witnessRootHash = Sha256Hash.twiceOf(getWitnessRoot().serialize(), witnessReserved);
if (!witnessRootHash.equals(witnessCommitment)) if (!witnessRootHash.equals(witnessCommitment))
throw new VerificationException("Witness merkle root invalid. Expected " + witnessCommitment.toString() throw new VerificationException("Witness merkle root invalid. Expected " + witnessCommitment.toString()
+ " but got " + witnessRootHash.toString()); + " but got " + witnessRootHash.toString());
@ -594,8 +594,8 @@ public class Block extends Message {
Sha256Hash leftHash = tree.get(levelOffset + left); Sha256Hash leftHash = tree.get(levelOffset + left);
Sha256Hash rightHash = tree.get(levelOffset + right); Sha256Hash rightHash = tree.get(levelOffset + right);
tree.add(Sha256Hash.wrapReversed(hashTwice( tree.add(Sha256Hash.wrapReversed(hashTwice(
leftHash.getReversedBytes(), leftHash.serialize(),
rightHash.getReversedBytes()))); rightHash.serialize())));
} }
// Move to the next level. // Move to the next level.
levelOffset += levelSize; levelOffset += levelSize;

View File

@ -84,10 +84,10 @@ public class GetBlocksMessage extends Message {
stream.write(VarInt.of(locator.size()).serialize()); stream.write(VarInt.of(locator.size()).serialize());
for (Sha256Hash hash : locator.getHashes()) { for (Sha256Hash hash : locator.getHashes()) {
// Have to reverse as wire format is little endian. // Have to reverse as wire format is little endian.
stream.write(hash.getReversedBytes()); stream.write(hash.serialize());
} }
// Next, a block ID to stop at. // Next, a block ID to stop at.
stream.write(stopHash.getReversedBytes()); stream.write(stopHash.serialize());
} }
@Override @Override

View File

@ -91,7 +91,7 @@ public abstract class ListMessage extends Message {
// Write out the type code. // Write out the type code.
ByteUtils.writeInt32LE(i.type.code, stream); ByteUtils.writeInt32LE(i.type.code, stream);
// And now the hash. // And now the hash.
stream.write(i.hash.getReversedBytes()); stream.write(i.hash.serialize());
} }
} }

View File

@ -116,7 +116,7 @@ public class PartialMerkleTree extends Message {
stream.write(VarInt.of(hashes.size()).serialize()); stream.write(VarInt.of(hashes.size()).serialize());
for (Sha256Hash hash : hashes) for (Sha256Hash hash : hashes)
stream.write(hash.getReversedBytes()); stream.write(hash.serialize());
stream.write(VarInt.of(matchedChildBits.length).serialize()); stream.write(VarInt.of(matchedChildBits.length).serialize());
stream.write(matchedChildBits); stream.write(matchedChildBits);

View File

@ -113,7 +113,7 @@ public class RejectMessage extends Message {
stream.write(VarInt.of(reasonBytes.length).serialize()); stream.write(VarInt.of(reasonBytes.length).serialize());
stream.write(reasonBytes); stream.write(reasonBytes);
if ("block".equals(message) || "tx".equals(message)) if ("block".equals(message) || "tx".equals(message))
stream.write(messageHash.getReversedBytes()); stream.write(messageHash.serialize());
} }
/** /**

View File

@ -1430,7 +1430,7 @@ public class Transaction extends Message {
if (!anyoneCanPay) { if (!anyoneCanPay) {
ByteArrayOutputStream bosHashPrevouts = new ByteArrayOutputStream(256); ByteArrayOutputStream bosHashPrevouts = new ByteArrayOutputStream(256);
for (TransactionInput input : this.inputs) { for (TransactionInput input : this.inputs) {
bosHashPrevouts.write(input.getOutpoint().getHash().getReversedBytes()); bosHashPrevouts.write(input.getOutpoint().getHash().serialize());
writeInt32LE(input.getOutpoint().getIndex(), bosHashPrevouts); writeInt32LE(input.getOutpoint().getIndex(), bosHashPrevouts);
} }
hashPrevouts = Sha256Hash.hashTwice(bosHashPrevouts.toByteArray()); hashPrevouts = Sha256Hash.hashTwice(bosHashPrevouts.toByteArray());
@ -1468,7 +1468,7 @@ public class Transaction extends Message {
writeInt32LE(version, bos); writeInt32LE(version, bos);
bos.write(hashPrevouts); bos.write(hashPrevouts);
bos.write(hashSequence); bos.write(hashSequence);
bos.write(inputs.get(inputIndex).getOutpoint().getHash().getReversedBytes()); bos.write(inputs.get(inputIndex).getOutpoint().getHash().serialize());
writeInt32LE(inputs.get(inputIndex).getOutpoint().getIndex(), bos); writeInt32LE(inputs.get(inputIndex).getOutpoint().getIndex(), bos);
bos.write(VarInt.of(scriptCode.length).serialize()); bos.write(VarInt.of(scriptCode.length).serialize());
bos.write(scriptCode); bos.write(scriptCode);

View File

@ -105,7 +105,7 @@ public class TransactionOutPoint extends Message {
@Override @Override
protected void bitcoinSerializeToStream(OutputStream stream) throws IOException { protected void bitcoinSerializeToStream(OutputStream stream) throws IOException {
stream.write(hash.getReversedBytes()); stream.write(hash.serialize());
ByteUtils.writeInt32LE(index, stream); ByteUtils.writeInt32LE(index, stream);
} }

View File

@ -315,8 +315,8 @@ public class BlockTest {
@Override @Override
protected void bitcoinSerializeToStream(OutputStream stream) throws IOException { protected void bitcoinSerializeToStream(OutputStream stream) throws IOException {
ByteUtils.writeInt32LE(getVersion(), stream); ByteUtils.writeInt32LE(getVersion(), stream);
stream.write(getPrevBlockHash().getReversedBytes()); stream.write(getPrevBlockHash().serialize());
stream.write(getMerkleRoot().getReversedBytes()); stream.write(getMerkleRoot().serialize());
ByteUtils.writeInt32LE(getTimeSeconds(), stream); ByteUtils.writeInt32LE(getTimeSeconds(), stream);
ByteUtils.writeInt32LE(getDifficultyTarget(), stream); ByteUtils.writeInt32LE(getDifficultyTarget(), stream);
ByteUtils.writeInt32LE(getNonce(), stream); ByteUtils.writeInt32LE(getNonce(), stream);

View File

@ -241,7 +241,7 @@ public class FilteredBlockAndPartialMerkleTreeTest extends TestWithPeerGroup {
stream.write(VarInt.of(Integer.MAX_VALUE).serialize()); stream.write(VarInt.of(Integer.MAX_VALUE).serialize());
//stream.write(VarInt.of(hashes.size()).encode()); //stream.write(VarInt.of(hashes.size()).encode());
for (Sha256Hash hash : hashes) for (Sha256Hash hash : hashes)
stream.write(hash.getReversedBytes()); stream.write(hash.serialize());
stream.write(VarInt.of(bits.length).serialize()); stream.write(VarInt.of(bits.length).serialize());
stream.write(bits); stream.write(bits);