* testOnJdk8 is not run by default
* If testJdk8 Gradle property is set, run testOnJdk8 as part of `check`
* Set testJdk8 in gradle.yml Github Actions workflow
This commit contains rather hard to review diffs to the protobuf test datasets in .txt format.
To aid the review, this Python script can be used to convert the data from the old to the new
format:
```
import sys
file = open(sys.argv[1])
outfile = open(sys.argv[1] + ".lite", "w")
line = file.readline()
lines = []
def sortAndPrint(group, removeLastLB=False, removeFirstLB=False):
group.sort()
if removeFirstLB and group[0] == "\n":
group.remove("\n")
for i in range(len(group)):
if i == len(group) - 1 and removeLastLB:
group[i] = group[i].rstrip()
print(group[i], end="", file=outfile)
def sign32neg(value):
if 0x80000000 <= value <= 0xFFFFFFFF:
value &= 0x7FFFFFFF
value = int(value)
value = ~value
value ^= 0x7FFFFFFF
return value
def processPath(path):
parts = path.rstrip().split(":")
number = int(parts[1].lstrip())
if number >= 0x80000000:
number = sign32neg(number)
return parts[0] + ": " + str(number) + "\n"
groupcount = 0
while len(line) > 0:
if line.startswith("type:"):
if len(lines):
sortAndPrint(lines, removeFirstLB=groupcount==0)
groupcount += 1
lines.clear()
lines.append(line)
elif line.find("deterministic_key {") != -1:
structure = line
innerlines = []
line = file.readline()
while not line.startswith('}'):
if line.find("path") != -1: # preserve order of paths
pathlines = processPath(line)
line = file.readline()
if line.startswith('}'):
innerlines.append(pathlines)
continue
while line.find("path") != -1:
pathlines += processPath(line)
line = file.readline()
innerlines.append(pathlines)
if line.startswith('}'):
continue
if line.startswith(" sigsRequiredToSpend"):
line = line.replace("sigsRequiredToSpend", "sigs_required_to_spend")
innerlines.append(line)
line = file.readline()
innerlines.sort()
for l in innerlines:
structure += l
structure += line.rstrip() + "\n"
lines.append(structure)
elif line.find("path") != -1: # preserve order of paths
accountpathlines = processPath(line)
line = file.readline()
while line.find("path") != -1:
accountpathlines += processPath(line)
line = file.readline()
lines.append(accountpathlines)
lines.append(line)
else:
lines.append(line)
line = file.readline()
print(file=outfile)
sortAndPrint(lines, removeLastLB=True)
file.close()
outfile.close()
```
Problem: A transaction received from the network is added to all wallets
that find it relevant. If two wallets find the same transaction relevant
the same Transaction instance is added to both wallets.
Spending the outputs from this transaction can cause consistiency
issues, in particular if the outputs are spent in the same transaction,
as shown in WalletTest.oneTxTwoWallets. There are probably more issues
with having the same Transaction instance handled by two different
wallets.
Fix: Clone the transaction before adding it to the wallet.
AccessControlException is deprecated for removal in JDK 17.
its parent classes are:
`AccessControlException` <- `SecurityException` <- `RuntimeException`
It can be replaced with its parent `SecurityException` which is not deprecated and will behave almost identically in this one place where it is used.
Replace a few calls to:
Utils.setMockClock(Utils.setCurrentTimeSeconds())
with
Utils.setMockClock()
The behavior of the first is slightly different
and possibly pathological, and I believe that in
all three cases in this PR, it is the later behavior
that is intended.
This refactoring breaks the cyclic dependency of NetworkParameters constructors
on the constructors in Block and will allow us to migrate the code
now in the getGenesisBlock() methods into (atomic) factories/constructors
in `Block` allowing us to create block objects that are unmodifiable/immutable.
* Add Block.STANDARD_MAX_DIFFICULTY_TARGET and use in subclasses
* Always define maxTarget in terms of a nBits constant and use
Utils.decodeCompactBits()
* Define constants for GENESIS_TIME and GENESIS_NONCE
The tests are currently using a custom value for maxTarget
that can’t be generated via CompactBits format.
This commit changes the string constant to match what would be
generated by using Utils.decodeCompactBits(EASIEST_DIFFICULTY_TARGET).
1. Define Sha256 constants for expected hashes
2. Compare hashes in binary form
3. Move hash comparison to immediately follow Block creation
4. Add error message to the check state call
It said “half of all possible hash solutions” which
led me to believe that decodeCompactBits() would
extend 1’s all the way out to the least significant
bit.