mirror of
https://github.com/bitcoinj/bitcoinj.git
synced 2025-03-09 16:04:54 +01:00
Message: fold unsafeBitcoinSerialize()
into bitcoinSerialize()
This commit is contained in:
parent
e882322505
commit
7fba2d8c6b
17 changed files with 43 additions and 69 deletions
|
@ -905,7 +905,7 @@ public class Block extends Message {
|
||||||
ScriptBuilder.createP2PKOutputScript(ECKey.fromPublicOnly(pubKeyTo)).getProgram()));
|
ScriptBuilder.createP2PKOutputScript(ECKey.fromPublicOnly(pubKeyTo)).getProgram()));
|
||||||
transactions.add(coinbase);
|
transactions.add(coinbase);
|
||||||
coinbase.setParent(this);
|
coinbase.setParent(this);
|
||||||
coinbase.length = coinbase.unsafeBitcoinSerialize().length;
|
coinbase.length = coinbase.bitcoinSerialize().length;
|
||||||
adjustLength(transactions.size(), coinbase.length);
|
adjustLength(transactions.size(), coinbase.length);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -256,7 +256,7 @@ public class BloomFilter extends Message {
|
||||||
|
|
||||||
/** Inserts the given transaction outpoint. */
|
/** Inserts the given transaction outpoint. */
|
||||||
public synchronized void insert(TransactionOutPoint outpoint) {
|
public synchronized void insert(TransactionOutPoint outpoint) {
|
||||||
insert(outpoint.unsafeBitcoinSerialize());
|
insert(outpoint.bitcoinSerialize());
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -358,7 +358,7 @@ public class BloomFilter extends Message {
|
||||||
}
|
}
|
||||||
if (found) return true;
|
if (found) return true;
|
||||||
for (TransactionInput input : tx.getInputs()) {
|
for (TransactionInput input : tx.getInputs()) {
|
||||||
if (contains(input.getOutpoint().unsafeBitcoinSerialize())) {
|
if (contains(input.getOutpoint().bitcoinSerialize())) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
for (ScriptChunk chunk : input.getScriptSig().getChunks()) {
|
for (ScriptChunk chunk : input.getScriptSig().getChunks()) {
|
||||||
|
|
|
@ -138,38 +138,12 @@ public abstract class Message {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Returns a copy of the array returned by {@link Message#unsafeBitcoinSerialize()}, which is safe to mutate.
|
|
||||||
* If you need extra performance and can guarantee you won't write to the array, you can use the unsafe version.
|
|
||||||
*
|
|
||||||
* @return a freshly allocated serialized byte array
|
|
||||||
*/
|
|
||||||
public byte[] bitcoinSerialize() {
|
|
||||||
byte[] bytes = unsafeBitcoinSerialize();
|
|
||||||
byte[] copy = new byte[bytes.length];
|
|
||||||
System.arraycopy(bytes, 0, copy, 0, bytes.length);
|
|
||||||
return copy;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* <p>Serialize this message to a byte array that conforms to the bitcoin wire protocol.</p>
|
* <p>Serialize this message to a byte array that conforms to the bitcoin wire protocol.</p>
|
||||||
*
|
*
|
||||||
* <p>This method may return the original byte array used to construct this message if the
|
* @return a byte array
|
||||||
* following conditions are met:</p>
|
|
||||||
*
|
|
||||||
* <ol>
|
|
||||||
* <li>1) The message was parsed from a byte array with parseRetain = true</li>
|
|
||||||
* <li>2) The message has not been modified</li>
|
|
||||||
* <li>3) The array had an offset of 0 and no surplus bytes</li>
|
|
||||||
* </ol>
|
|
||||||
*
|
|
||||||
* <p>If condition 3 is not met then an copy of the relevant portion of the array will be returned.
|
|
||||||
* Otherwise a full serialize will occur. For this reason you should only use this API if you can guarantee you
|
|
||||||
* will treat the resulting array as read only.</p>
|
|
||||||
*
|
|
||||||
* @return a byte array owned by this object, do NOT mutate it.
|
|
||||||
*/
|
*/
|
||||||
public byte[] unsafeBitcoinSerialize() {
|
public final byte[] bitcoinSerialize() {
|
||||||
// No cached array available so serialize parts by stream.
|
// No cached array available so serialize parts by stream.
|
||||||
ByteArrayOutputStream stream = new ByteArrayOutputStream(length < 32 ? 32 : length + 32);
|
ByteArrayOutputStream stream = new ByteArrayOutputStream(length < 32 ? 32 : length + 32);
|
||||||
try {
|
try {
|
||||||
|
|
|
@ -136,7 +136,7 @@ public class StoredBlock {
|
||||||
buffer.putInt(getHeight());
|
buffer.putInt(getHeight());
|
||||||
// Using unsafeBitcoinSerialize here can give us direct access to the same bytes we read off the wire,
|
// Using unsafeBitcoinSerialize here can give us direct access to the same bytes we read off the wire,
|
||||||
// avoiding serialization round-trips.
|
// avoiding serialization round-trips.
|
||||||
byte[] bytes = getHeader().unsafeBitcoinSerialize();
|
byte[] bytes = getHeader().bitcoinSerialize();
|
||||||
buffer.put(bytes, 0, Block.HEADER_SIZE); // Trim the trailing 00 byte (zero transactions).
|
buffer.put(bytes, 0, Block.HEADER_SIZE); // Trim the trailing 00 byte (zero transactions).
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -823,7 +823,7 @@ public class Transaction extends ChildMessage {
|
||||||
s.append(", wtxid ").append(wTxId);
|
s.append(", wtxid ").append(wTxId);
|
||||||
s.append('\n');
|
s.append('\n');
|
||||||
int weight = getWeight();
|
int weight = getWeight();
|
||||||
int size = unsafeBitcoinSerialize().length;
|
int size = bitcoinSerialize().length;
|
||||||
int vsize = getVsize();
|
int vsize = getVsize();
|
||||||
s.append(indent).append("weight: ").append(weight).append(" wu, ");
|
s.append(indent).append("weight: ").append(weight).append(" wu, ");
|
||||||
if (size != vsize)
|
if (size != vsize)
|
||||||
|
@ -951,7 +951,7 @@ public class Transaction extends ChildMessage {
|
||||||
* @return raw transaction in hex format
|
* @return raw transaction in hex format
|
||||||
*/
|
*/
|
||||||
public String toHexString() {
|
public String toHexString() {
|
||||||
return ByteUtils.formatHex(unsafeBitcoinSerialize());
|
return ByteUtils.formatHex(bitcoinSerialize());
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -965,7 +965,7 @@ public class Transaction extends ChildMessage {
|
||||||
}
|
}
|
||||||
inputs.clear();
|
inputs.clear();
|
||||||
// You wanted to reserialize, right?
|
// You wanted to reserialize, right?
|
||||||
this.length = this.unsafeBitcoinSerialize().length;
|
this.length = this.bitcoinSerialize().length;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -1130,7 +1130,7 @@ public class Transaction extends ChildMessage {
|
||||||
}
|
}
|
||||||
outputs.clear();
|
outputs.clear();
|
||||||
// You wanted to reserialize, right?
|
// You wanted to reserialize, right?
|
||||||
this.length = this.unsafeBitcoinSerialize().length;
|
this.length = this.bitcoinSerialize().length;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -1303,7 +1303,7 @@ public class Transaction extends ChildMessage {
|
||||||
try {
|
try {
|
||||||
// Create a copy of this transaction to operate upon because we need make changes to the inputs and outputs.
|
// Create a copy of this transaction to operate upon because we need make changes to the inputs and outputs.
|
||||||
// It would not be thread-safe to change the attributes of the transaction object itself.
|
// It would not be thread-safe to change the attributes of the transaction object itself.
|
||||||
Transaction tx = this.params.getDefaultSerializer().makeTransaction(ByteBuffer.wrap(this.bitcoinSerialize()));
|
Transaction tx = this.params.getDefaultSerializer().makeTransaction(ByteBuffer.wrap(bitcoinSerialize()));
|
||||||
|
|
||||||
// Clear input scripts in preparation for signing. If we're signing a fresh
|
// Clear input scripts in preparation for signing. If we're signing a fresh
|
||||||
// transaction that step isn't very helpful, but it doesn't add much cost relative to the actual
|
// transaction that step isn't very helpful, but it doesn't add much cost relative to the actual
|
||||||
|
|
|
@ -212,7 +212,7 @@ public class TransactionOutput extends ChildMessage {
|
||||||
// so dust is a spendable txout less than
|
// so dust is a spendable txout less than
|
||||||
// 98*dustRelayFee/1000 (in satoshis).
|
// 98*dustRelayFee/1000 (in satoshis).
|
||||||
// 294 satoshis at the default rate of 3000 sat/kB.
|
// 294 satoshis at the default rate of 3000 sat/kB.
|
||||||
long size = this.unsafeBitcoinSerialize().length;
|
long size = this.bitcoinSerialize().length;
|
||||||
final Script script = getScriptPubKey();
|
final Script script = getScriptPubKey();
|
||||||
if (ScriptPattern.isP2PKH(script) || ScriptPattern.isP2PK(script) || ScriptPattern.isP2SH(script))
|
if (ScriptPattern.isP2PKH(script) || ScriptPattern.isP2PK(script) || ScriptPattern.isP2SH(script))
|
||||||
size += 32 + 4 + 1 + 107 + 4; // 148
|
size += 32 + 4 + 1 + 107 + 4; // 148
|
||||||
|
|
|
@ -346,7 +346,7 @@ public class PaymentProtocol {
|
||||||
Protos.Payment.Builder builder = Protos.Payment.newBuilder();
|
Protos.Payment.Builder builder = Protos.Payment.newBuilder();
|
||||||
for (Transaction transaction : transactions) {
|
for (Transaction transaction : transactions) {
|
||||||
transaction.verify();
|
transaction.verify();
|
||||||
builder.addTransactions(ByteString.copyFrom(transaction.unsafeBitcoinSerialize()));
|
builder.addTransactions(ByteString.copyFrom(transaction.bitcoinSerialize()));
|
||||||
}
|
}
|
||||||
if (refundOutputs != null) {
|
if (refundOutputs != null) {
|
||||||
for (Protos.Output output : refundOutputs)
|
for (Protos.Output output : refundOutputs)
|
||||||
|
|
|
@ -4417,7 +4417,7 @@ public class Wallet extends BaseTaggableObject
|
||||||
signTransaction(req);
|
signTransaction(req);
|
||||||
|
|
||||||
// Check size.
|
// Check size.
|
||||||
final int size = req.tx.unsafeBitcoinSerialize().length;
|
final int size = req.tx.bitcoinSerialize().length;
|
||||||
if (size > Transaction.MAX_STANDARD_TX_SIZE)
|
if (size > Transaction.MAX_STANDARD_TX_SIZE)
|
||||||
throw new ExceededMaxTransactionSize();
|
throw new ExceededMaxTransactionSize();
|
||||||
|
|
||||||
|
@ -5626,7 +5626,7 @@ public class Wallet extends BaseTaggableObject
|
||||||
if (sign)
|
if (sign)
|
||||||
signTransaction(req);
|
signTransaction(req);
|
||||||
// KeyTimeCoinSelector should never select enough inputs to push us oversize.
|
// KeyTimeCoinSelector should never select enough inputs to push us oversize.
|
||||||
checkState(rekeyTx.unsafeBitcoinSerialize().length < Transaction.MAX_STANDARD_TX_SIZE);
|
checkState(rekeyTx.bitcoinSerialize().length < Transaction.MAX_STANDARD_TX_SIZE);
|
||||||
return rekeyTx;
|
return rekeyTx;
|
||||||
} catch (VerificationException e) {
|
} catch (VerificationException e) {
|
||||||
throw new RuntimeException(e); // Cannot happen.
|
throw new RuntimeException(e); // Cannot happen.
|
||||||
|
|
|
@ -172,16 +172,16 @@ public class BlockTest {
|
||||||
tx.addInput(new TransactionInput(TESTNET, null, new byte[] {(byte) ScriptOpCodes.OP_FALSE},
|
tx.addInput(new TransactionInput(TESTNET, null, new byte[] {(byte) ScriptOpCodes.OP_FALSE},
|
||||||
new TransactionOutPoint(TESTNET, 0, Sha256Hash.of(new byte[] { 1 }))));
|
new TransactionOutPoint(TESTNET, 0, Sha256Hash.of(new byte[] { 1 }))));
|
||||||
int origTxLength = 8 + 2 + 8 + 1 + 10 + 40 + 1 + 1;
|
int origTxLength = 8 + 2 + 8 + 1 + 10 + 40 + 1 + 1;
|
||||||
assertEquals(tx.unsafeBitcoinSerialize().length, tx.length);
|
assertEquals(tx.bitcoinSerialize().length, tx.length);
|
||||||
assertEquals(origTxLength, tx.length);
|
assertEquals(origTxLength, tx.length);
|
||||||
block.addTransaction(tx);
|
block.addTransaction(tx);
|
||||||
assertEquals(block.unsafeBitcoinSerialize().length, block.length);
|
assertEquals(block.bitcoinSerialize().length, block.length);
|
||||||
assertEquals(origBlockLen + tx.length, block.length);
|
assertEquals(origBlockLen + tx.length, block.length);
|
||||||
block.getTransactions().get(1).getInputs().get(0).setScriptBytes(new byte[] {(byte) ScriptOpCodes.OP_FALSE, (byte) ScriptOpCodes.OP_FALSE});
|
block.getTransactions().get(1).getInputs().get(0).setScriptBytes(new byte[] {(byte) ScriptOpCodes.OP_FALSE, (byte) ScriptOpCodes.OP_FALSE});
|
||||||
assertEquals(block.length, origBlockLen + tx.length);
|
assertEquals(block.length, origBlockLen + tx.length);
|
||||||
assertEquals(tx.length, origTxLength + 1);
|
assertEquals(tx.length, origTxLength + 1);
|
||||||
block.getTransactions().get(1).getInputs().get(0).clearScriptBytes();
|
block.getTransactions().get(1).getInputs().get(0).clearScriptBytes();
|
||||||
assertEquals(block.length, block.unsafeBitcoinSerialize().length);
|
assertEquals(block.length, block.bitcoinSerialize().length);
|
||||||
assertEquals(block.length, origBlockLen + tx.length);
|
assertEquals(block.length, origBlockLen + tx.length);
|
||||||
assertEquals(tx.length, origTxLength - 1);
|
assertEquals(tx.length, origTxLength - 1);
|
||||||
block.getTransactions().get(1).addInput(new TransactionInput(TESTNET, null, new byte[] {(byte) ScriptOpCodes.OP_FALSE},
|
block.getTransactions().get(1).addInput(new TransactionInput(TESTNET, null, new byte[] {(byte) ScriptOpCodes.OP_FALSE},
|
||||||
|
|
|
@ -54,7 +54,7 @@ public class BloomFilterTest {
|
||||||
assertTrue(filter.contains(ByteUtils.parseHex("b9300670b4c5366e95b2699e8b18bc75e5f729c5")));
|
assertTrue(filter.contains(ByteUtils.parseHex("b9300670b4c5366e95b2699e8b18bc75e5f729c5")));
|
||||||
|
|
||||||
// Value generated by Bitcoin Core
|
// Value generated by Bitcoin Core
|
||||||
assertEquals("03614e9b050000000000000001", ByteUtils.formatHex(filter.unsafeBitcoinSerialize()));
|
assertEquals("03614e9b050000000000000001", ByteUtils.formatHex(filter.bitcoinSerialize()));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
|
@ -73,7 +73,7 @@ public class BloomFilterTest {
|
||||||
assertTrue(filter.contains(ByteUtils.parseHex("b9300670b4c5366e95b2699e8b18bc75e5f729c5")));
|
assertTrue(filter.contains(ByteUtils.parseHex("b9300670b4c5366e95b2699e8b18bc75e5f729c5")));
|
||||||
|
|
||||||
// Value generated by Bitcoin Core
|
// Value generated by Bitcoin Core
|
||||||
assertEquals("03ce4299050000000100008002", ByteUtils.formatHex(filter.unsafeBitcoinSerialize()));
|
assertEquals("03ce4299050000000100008002", ByteUtils.formatHex(filter.bitcoinSerialize()));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
|
@ -97,6 +97,6 @@ public class BloomFilterTest {
|
||||||
BloomFilter filter = wallet.getBloomFilter(wallet.getBloomFilterElementCount(), 0.001, 0);
|
BloomFilter filter = wallet.getBloomFilter(wallet.getBloomFilterElementCount(), 0.001, 0);
|
||||||
|
|
||||||
// Value generated by Bitcoin Core
|
// Value generated by Bitcoin Core
|
||||||
assertEquals("082ae5edc8e51d4a03080000000000000002", ByteUtils.formatHex(filter.unsafeBitcoinSerialize()));
|
assertEquals("082ae5edc8e51d4a03080000000000000002", ByteUtils.formatHex(filter.bitcoinSerialize()));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -193,7 +193,7 @@ public class FullBlockTestGenerator {
|
||||||
if (outStream != null && element instanceof BlockAndValidity) {
|
if (outStream != null && element instanceof BlockAndValidity) {
|
||||||
try {
|
try {
|
||||||
ByteUtils.writeUint32BE(params.getPacketMagic(), outStream);
|
ByteUtils.writeUint32BE(params.getPacketMagic(), outStream);
|
||||||
byte[] block = ((BlockAndValidity)element).block.bitcoinSerialize();
|
byte[] block = ((BlockAndValidity) element).block.bitcoinSerialize();
|
||||||
byte[] length = new byte[4];
|
byte[] length = new byte[4];
|
||||||
ByteUtils.writeUint32BE(block.length, length, 0);
|
ByteUtils.writeUint32BE(block.length, length, 0);
|
||||||
outStream.write(ByteUtils.reverseBytes(length));
|
outStream.write(ByteUtils.reverseBytes(length));
|
||||||
|
|
|
@ -147,7 +147,7 @@ public class WalletProtobufSerializerTest {
|
||||||
assertEquals(1, wallet1.getTransactions(true).size());
|
assertEquals(1, wallet1.getTransactions(true).size());
|
||||||
assertEquals(v1, wallet1.getBalance(Wallet.BalanceType.ESTIMATED));
|
assertEquals(v1, wallet1.getBalance(Wallet.BalanceType.ESTIMATED));
|
||||||
Transaction t1copy = wallet1.getTransaction(t1.getTxId());
|
Transaction t1copy = wallet1.getTransaction(t1.getTxId());
|
||||||
assertArrayEquals(t1.unsafeBitcoinSerialize(), t1copy.unsafeBitcoinSerialize());
|
assertArrayEquals(t1.bitcoinSerialize(), t1copy.bitcoinSerialize());
|
||||||
assertEquals(2, t1copy.getConfidence().numBroadcastPeers());
|
assertEquals(2, t1copy.getConfidence().numBroadcastPeers());
|
||||||
assertNotNull(t1copy.getConfidence().lastBroadcastTime());
|
assertNotNull(t1copy.getConfidence().lastBroadcastTime());
|
||||||
assertEquals(TransactionConfidence.Source.NETWORK, t1copy.getConfidence().getSource());
|
assertEquals(TransactionConfidence.Source.NETWORK, t1copy.getConfidence().getSource());
|
||||||
|
|
|
@ -1679,10 +1679,10 @@ public class WalletTest extends TestWithWallet {
|
||||||
wallet.addWatchedAddress(watchedAddress);
|
wallet.addWatchedAddress(watchedAddress);
|
||||||
|
|
||||||
// Note that this has a 1e-12 chance of failing this unit test due to a false positive
|
// Note that this has a 1e-12 chance of failing this unit test due to a false positive
|
||||||
assertFalse(wallet.getBloomFilter(1e-12).contains(outPoint.unsafeBitcoinSerialize()));
|
assertFalse(wallet.getBloomFilter(1e-12).contains(outPoint.bitcoinSerialize()));
|
||||||
|
|
||||||
sendMoneyToWallet(BlockChain.NewBlockType.BEST_CHAIN, t1);
|
sendMoneyToWallet(BlockChain.NewBlockType.BEST_CHAIN, t1);
|
||||||
assertTrue(wallet.getBloomFilter(1e-12).contains(outPoint.unsafeBitcoinSerialize()));
|
assertTrue(wallet.getBloomFilter(1e-12).contains(outPoint.bitcoinSerialize()));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
|
@ -1732,10 +1732,10 @@ public class WalletTest extends TestWithWallet {
|
||||||
TransactionOutPoint outPoint = new TransactionOutPoint(TESTNET, 0, t1);
|
TransactionOutPoint outPoint = new TransactionOutPoint(TESTNET, 0, t1);
|
||||||
|
|
||||||
// Note that this has a 1e-12 chance of failing this unit test due to a false positive
|
// Note that this has a 1e-12 chance of failing this unit test due to a false positive
|
||||||
assertFalse(wallet.getBloomFilter(1e-12).contains(outPoint.unsafeBitcoinSerialize()));
|
assertFalse(wallet.getBloomFilter(1e-12).contains(outPoint.bitcoinSerialize()));
|
||||||
|
|
||||||
sendMoneyToWallet(BlockChain.NewBlockType.BEST_CHAIN, t1);
|
sendMoneyToWallet(BlockChain.NewBlockType.BEST_CHAIN, t1);
|
||||||
assertFalse(wallet.getBloomFilter(1e-12).contains(outPoint.unsafeBitcoinSerialize()));
|
assertFalse(wallet.getBloomFilter(1e-12).contains(outPoint.bitcoinSerialize()));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1750,10 +1750,10 @@ public class WalletTest extends TestWithWallet {
|
||||||
Transaction t1 = createFakeTx(TESTNET, CENT, address);
|
Transaction t1 = createFakeTx(TESTNET, CENT, address);
|
||||||
TransactionOutPoint outPoint = new TransactionOutPoint(TESTNET, 0, t1);
|
TransactionOutPoint outPoint = new TransactionOutPoint(TESTNET, 0, t1);
|
||||||
|
|
||||||
assertFalse(wallet.getBloomFilter(falsePositiveRate).contains(outPoint.unsafeBitcoinSerialize()));
|
assertFalse(wallet.getBloomFilter(falsePositiveRate).contains(outPoint.bitcoinSerialize()));
|
||||||
|
|
||||||
sendMoneyToWallet(BlockChain.NewBlockType.BEST_CHAIN, t1);
|
sendMoneyToWallet(BlockChain.NewBlockType.BEST_CHAIN, t1);
|
||||||
assertTrue(wallet.getBloomFilter(falsePositiveRate).contains(outPoint.unsafeBitcoinSerialize()));
|
assertTrue(wallet.getBloomFilter(falsePositiveRate).contains(outPoint.bitcoinSerialize()));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
|
@ -2344,7 +2344,7 @@ public class WalletTest extends TestWithWallet {
|
||||||
SendRequest request15 = SendRequest.to(OTHER_ADDRESS, CENT);
|
SendRequest request15 = SendRequest.to(OTHER_ADDRESS, CENT);
|
||||||
for (int i = 0; i < 29; i++)
|
for (int i = 0; i < 29; i++)
|
||||||
request15.tx.addOutput(CENT, OTHER_ADDRESS);
|
request15.tx.addOutput(CENT, OTHER_ADDRESS);
|
||||||
assertTrue(request15.tx.unsafeBitcoinSerialize().length > 1000);
|
assertTrue(request15.tx.bitcoinSerialize().length > 1000);
|
||||||
request15.feePerKb = Transaction.DEFAULT_TX_FEE;
|
request15.feePerKb = Transaction.DEFAULT_TX_FEE;
|
||||||
request15.ensureMinRequiredFee = true;
|
request15.ensureMinRequiredFee = true;
|
||||||
wallet.completeTx(request15);
|
wallet.completeTx(request15);
|
||||||
|
@ -2361,7 +2361,7 @@ public class WalletTest extends TestWithWallet {
|
||||||
request16.ensureMinRequiredFee = true;
|
request16.ensureMinRequiredFee = true;
|
||||||
for (int i = 0; i < 29; i++)
|
for (int i = 0; i < 29; i++)
|
||||||
request16.tx.addOutput(CENT, OTHER_ADDRESS);
|
request16.tx.addOutput(CENT, OTHER_ADDRESS);
|
||||||
assertTrue(request16.tx.unsafeBitcoinSerialize().length > 1000);
|
assertTrue(request16.tx.bitcoinSerialize().length > 1000);
|
||||||
wallet.completeTx(request16);
|
wallet.completeTx(request16);
|
||||||
// Just the reference fee should be added if feePerKb == 0
|
// Just the reference fee should be added if feePerKb == 0
|
||||||
// Hardcoded tx length because actual length may vary depending on actual signature length
|
// Hardcoded tx length because actual length may vary depending on actual signature length
|
||||||
|
@ -2383,14 +2383,14 @@ public class WalletTest extends TestWithWallet {
|
||||||
assertEquals(Coin.valueOf(99900), request17.tx.getFee());
|
assertEquals(Coin.valueOf(99900), request17.tx.getFee());
|
||||||
assertEquals(1, request17.tx.getInputs().size());
|
assertEquals(1, request17.tx.getInputs().size());
|
||||||
// Calculate its max length to make sure it is indeed 999
|
// Calculate its max length to make sure it is indeed 999
|
||||||
int theoreticalMaxLength17 = request17.tx.unsafeBitcoinSerialize().length + myKey.getPubKey().length + 75;
|
int theoreticalMaxLength17 = request17.tx.bitcoinSerialize().length + myKey.getPubKey().length + 75;
|
||||||
for (TransactionInput in : request17.tx.getInputs())
|
for (TransactionInput in : request17.tx.getInputs())
|
||||||
theoreticalMaxLength17 -= in.getScriptBytes().length;
|
theoreticalMaxLength17 -= in.getScriptBytes().length;
|
||||||
assertEquals(999, theoreticalMaxLength17);
|
assertEquals(999, theoreticalMaxLength17);
|
||||||
Transaction spend17 = request17.tx;
|
Transaction spend17 = request17.tx;
|
||||||
{
|
{
|
||||||
// Its actual size must be between 996 and 999 (inclusive) as signatures have a 3-byte size range (almost always)
|
// Its actual size must be between 996 and 999 (inclusive) as signatures have a 3-byte size range (almost always)
|
||||||
final int length = spend17.unsafeBitcoinSerialize().length;
|
final int length = spend17.bitcoinSerialize().length;
|
||||||
assertTrue(Integer.toString(length), length >= 996 && length <= 999);
|
assertTrue(Integer.toString(length), length >= 996 && length <= 999);
|
||||||
}
|
}
|
||||||
// Now check that it got a fee of 1 since its max size is 999 (1kb).
|
// Now check that it got a fee of 1 since its max size is 999 (1kb).
|
||||||
|
@ -2411,13 +2411,13 @@ public class WalletTest extends TestWithWallet {
|
||||||
assertEquals(1, request18.tx.getInputs().size());
|
assertEquals(1, request18.tx.getInputs().size());
|
||||||
// Calculate its max length to make sure it is indeed 1001
|
// Calculate its max length to make sure it is indeed 1001
|
||||||
Transaction spend18 = request18.tx;
|
Transaction spend18 = request18.tx;
|
||||||
int theoreticalMaxLength18 = spend18.unsafeBitcoinSerialize().length + myKey.getPubKey().length + 75;
|
int theoreticalMaxLength18 = spend18.bitcoinSerialize().length + myKey.getPubKey().length + 75;
|
||||||
for (TransactionInput in : spend18.getInputs())
|
for (TransactionInput in : spend18.getInputs())
|
||||||
theoreticalMaxLength18 -= in.getScriptBytes().length;
|
theoreticalMaxLength18 -= in.getScriptBytes().length;
|
||||||
assertEquals(1001, theoreticalMaxLength18);
|
assertEquals(1001, theoreticalMaxLength18);
|
||||||
// Its actual size must be between 998 and 1000 (inclusive) as signatures have a 3-byte size range (almost always)
|
// Its actual size must be between 998 and 1000 (inclusive) as signatures have a 3-byte size range (almost always)
|
||||||
assertTrue(spend18.unsafeBitcoinSerialize().length >= 998);
|
assertTrue(spend18.bitcoinSerialize().length >= 998);
|
||||||
assertTrue(spend18.unsafeBitcoinSerialize().length <= 1001);
|
assertTrue(spend18.bitcoinSerialize().length <= 1001);
|
||||||
// Now check that it did get a fee since its max size is 1000
|
// Now check that it did get a fee since its max size is 1000
|
||||||
assertEquals(25, spend18.getOutputs().size());
|
assertEquals(25, spend18.getOutputs().size());
|
||||||
// We optimize for priority, so the output selected should be the largest one
|
// We optimize for priority, so the output selected should be the largest one
|
||||||
|
@ -2523,7 +2523,7 @@ public class WalletTest extends TestWithWallet {
|
||||||
Coin dustThresholdMinusOne = new TransactionOutput(TESTNET, null, Coin.COIN, OTHER_ADDRESS).getMinNonDustValue().subtract(SATOSHI);
|
Coin dustThresholdMinusOne = new TransactionOutput(TESTNET, null, Coin.COIN, OTHER_ADDRESS).getMinNonDustValue().subtract(SATOSHI);
|
||||||
request26.tx.addOutput(CENT.subtract(fee.add(dustThresholdMinusOne)),
|
request26.tx.addOutput(CENT.subtract(fee.add(dustThresholdMinusOne)),
|
||||||
OTHER_ADDRESS);
|
OTHER_ADDRESS);
|
||||||
assertTrue(request26.tx.unsafeBitcoinSerialize().length > 1000);
|
assertTrue(request26.tx.bitcoinSerialize().length > 1000);
|
||||||
request26.feePerKb = SATOSHI;
|
request26.feePerKb = SATOSHI;
|
||||||
request26.ensureMinRequiredFee = true;
|
request26.ensureMinRequiredFee = true;
|
||||||
wallet.completeTx(request26);
|
wallet.completeTx(request26);
|
||||||
|
|
|
@ -181,7 +181,7 @@ public class FilteredBlockAndPartialMerkleTreeTest extends TestWithPeerGroup {
|
||||||
|
|
||||||
BloomFilter filter = wallet.getBloomFilter(wallet.getKeyChainGroupSize()*2, 0.001, 0xDEADBEEF);
|
BloomFilter filter = wallet.getBloomFilter(wallet.getKeyChainGroupSize()*2, 0.001, 0xDEADBEEF);
|
||||||
// Compare the serialized bloom filter to a known-good value
|
// Compare the serialized bloom filter to a known-good value
|
||||||
assertArrayEquals(ByteUtils.parseHex("0e1b091ca195e45a9164889b6bc46a09000000efbeadde02"), filter.unsafeBitcoinSerialize());
|
assertArrayEquals(ByteUtils.parseHex("0e1b091ca195e45a9164889b6bc46a09000000efbeadde02"), filter.bitcoinSerialize());
|
||||||
|
|
||||||
// Create a peer.
|
// Create a peer.
|
||||||
peerGroup.start();
|
peerGroup.start();
|
||||||
|
|
|
@ -652,7 +652,7 @@ public class PeerGroupTest extends TestWithPeerGroup {
|
||||||
InboundMessageQueuer p3 = connectPeer(3);
|
InboundMessageQueuer p3 = connectPeer(3);
|
||||||
assertTrue(p3.lastReceivedFilter.contains(key.getPubKey()));
|
assertTrue(p3.lastReceivedFilter.contains(key.getPubKey()));
|
||||||
assertTrue(p3.lastReceivedFilter.contains(key.getPubKeyHash()));
|
assertTrue(p3.lastReceivedFilter.contains(key.getPubKeyHash()));
|
||||||
assertTrue(p3.lastReceivedFilter.contains(outpoint.unsafeBitcoinSerialize()));
|
assertTrue(p3.lastReceivedFilter.contains(outpoint.bitcoinSerialize()));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
|
|
|
@ -854,9 +854,9 @@ public class PeerTest extends TestWithNetworkConnections {
|
||||||
@Override
|
@Override
|
||||||
public void bitcoinSerializeToStream(OutputStream stream) throws IOException {
|
public void bitcoinSerializeToStream(OutputStream stream) throws IOException {
|
||||||
// Add some hashes.
|
// Add some hashes.
|
||||||
addItem(new InventoryItem(InventoryItem.Type.TRANSACTION, Sha256Hash.of(new byte[]{1})));
|
addItem(new InventoryItem(InventoryItem.Type.TRANSACTION, Sha256Hash.of(new byte[] { 1 })));
|
||||||
addItem(new InventoryItem(InventoryItem.Type.TRANSACTION, Sha256Hash.of(new byte[]{2})));
|
addItem(new InventoryItem(InventoryItem.Type.TRANSACTION, Sha256Hash.of(new byte[] { 2 })));
|
||||||
addItem(new InventoryItem(InventoryItem.Type.TRANSACTION, Sha256Hash.of(new byte[]{3})));
|
addItem(new InventoryItem(InventoryItem.Type.TRANSACTION, Sha256Hash.of(new byte[] { 3 })));
|
||||||
|
|
||||||
// Write out a copy that's truncated in the middle.
|
// Write out a copy that's truncated in the middle.
|
||||||
ByteArrayOutputStream bos = new ByteArrayOutputStream();
|
ByteArrayOutputStream bos = new ByteArrayOutputStream();
|
||||||
|
|
|
@ -86,7 +86,7 @@ public class TestFeeLevel {
|
||||||
request.feePerKb = feeRateToTest;
|
request.feePerKb = feeRateToTest;
|
||||||
request.ensureMinRequiredFee = false;
|
request.ensureMinRequiredFee = false;
|
||||||
kit.wallet().completeTx(request);
|
kit.wallet().completeTx(request);
|
||||||
System.out.println("Size in bytes is " + request.tx.unsafeBitcoinSerialize().length);
|
System.out.println("Size in bytes is " + request.tx.bitcoinSerialize().length);
|
||||||
System.out.println("TX is " + request.tx);
|
System.out.println("TX is " + request.tx);
|
||||||
System.out.println("Waiting for " + kit.peerGroup().getMaxConnections() + " connected peers");
|
System.out.println("Waiting for " + kit.peerGroup().getMaxConnections() + " connected peers");
|
||||||
kit.peerGroup().addDisconnectedEventListener((peer, peerCount) -> System.out.println(peerCount +
|
kit.peerGroup().addDisconnectedEventListener((peer, peerCount) -> System.out.println(peerCount +
|
||||||
|
|
Loading…
Add table
Reference in a new issue