Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Dao improvements #1746

Merged
merged 20 commits into from Oct 4, 2018
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
Expand Up @@ -58,17 +58,16 @@ static Optional<OpReturnType> getOptionalOpReturnTypeCandidate(TempTxOutput temp
* Parse the type of OP_RETURN data and validate it.
*
* @param tempTxOutput The temporary transaction output to parse.
* @param isLastOutput If true, the output being parsed has a non-zero value.
* @return The type of the transaction output, which will be either one of the
* {@code *_OP_RETURN_OUTPUT} values, or {@code UNDEFINED} in case of
* unexpected state.
*/
static TxOutputType getTxOutputType(TempTxOutput tempTxOutput, boolean isLastOutput) {
static TxOutputType getTxOutputType(TempTxOutput tempTxOutput) {
boolean nonZeroOutput = tempTxOutput.getValue() != 0;
byte[] opReturnData = tempTxOutput.getOpReturnData();
checkNotNull(opReturnData, "opReturnData must not be null");

if (nonZeroOutput || !isLastOutput || opReturnData.length < 22) {
if (nonZeroOutput || opReturnData.length < 22) {
log.warn("OP_RETURN data does not match our rules. opReturnData={}",
Utils.HEX.encode(opReturnData));
return TxOutputType.INVALID_OUTPUT;
Expand Down
50 changes: 23 additions & 27 deletions core/src/main/java/bisq/core/dao/node/parser/TxOutputParser.java
Expand Up @@ -51,7 +51,7 @@ public class TxOutputParser {
@Setter
private long availableInputValue = 0;
private int lockTime;
private List<TempTxOutput> bsqOutputs = new ArrayList<>();
private List<TempTxOutput> tempTxOutputs = new ArrayList<>();
@Setter
private int unlockBlockHeight;
@Setter
Expand All @@ -77,38 +77,34 @@ public class TxOutputParser {
this.bsqStateService = bsqStateService;
}

public void commitTxOutputs() {
bsqOutputs.forEach(bsqOutput -> {
bsqStateService.addUnspentTxOutput(TxOutput.fromTempOutput(bsqOutput));
});
}

/**
* This sets all outputs to BTC_OUTPUT and doesn't add any txOutputs to the bsqStateService
*/
public void commitTxOutputsForInvalidTx() {
bsqOutputs.forEach(bsqOutput -> {
bsqOutput.setTxOutputType(TxOutputType.BTC_OUTPUT);
});

}

public void processGenesisTxOutput(TempTx genesisTx) {
for (int i = 0; i < genesisTx.getTempTxOutputs().size(); ++i) {
TempTxOutput tempTxOutput = genesisTx.getTempTxOutputs().get(i);
bsqOutputs.add(tempTxOutput);
tempTxOutputs.add(tempTxOutput);
}
commitTxOutputs();
commitTxOutputsForValidTx();
}

public void commitTxOutputsForValidTx() {
tempTxOutputs.forEach(output -> bsqStateService.addUnspentTxOutput(TxOutput.fromTempOutput(output)));
}

/**
* This sets all outputs to BTC_OUTPUT and doesn't add any txOutputs to the unspentTxOutput map in bsqStateService
*/
public void commitTxOutputsForInvalidTx() {
tempTxOutputs.forEach(output -> output.setTxOutputType(TxOutputType.BTC_OUTPUT));
}

boolean isOpReturnOutput(TempTxOutput txOutput) {
return txOutput.getOpReturnData() != null;
}

void processOpReturnOutput(boolean isLastOutput, TempTxOutput tempTxOutput) {
void processOpReturnOutput(TempTxOutput tempTxOutput) {
byte[] opReturnData = tempTxOutput.getOpReturnData();
if (opReturnData != null) {
handleOpReturnOutput(tempTxOutput, isLastOutput);
handleOpReturnOutput(tempTxOutput);
} else {
log.error("This should be an opReturn output");
}
Expand All @@ -117,9 +113,9 @@ void processOpReturnOutput(boolean isLastOutput, TempTxOutput tempTxOutput) {
/**
* Process a transaction output.
*
* @param isLastOutput If it is the last output
* @param tempTxOutput The TempTxOutput we are parsing
* @param index The index in the outputs
* @param isLastOutput If it is the last output
* @param tempTxOutput The TempTxOutput we are parsing
* @param index The index in the outputs
*/
void processTxOutput(boolean isLastOutput, TempTxOutput tempTxOutput, int index) {
// We do not check for pubKeyScript.scriptType.NULL_DATA because that is only set if dumpBlockchainData is true
Expand Down Expand Up @@ -164,7 +160,7 @@ private void handleUnlockBondTx(TempTxOutput txOutput) {
availableInputValue -= optionalSpentLockupTxOutput.get().getValue();

txOutput.setTxOutputType(TxOutputType.UNLOCK_OUTPUT);
bsqOutputs.add(txOutput);
tempTxOutputs.add(txOutput);

//TODO move up to TxParser
// We should add unlockBlockHeight to TempTxOutput and remove unlockBlockHeight from tempTx
Expand Down Expand Up @@ -198,7 +194,7 @@ private void handleBsqOutput(TempTxOutput txOutput, int index, long txOutputValu
bsqOutput = TxOutputType.BSQ_OUTPUT;
}
txOutput.setTxOutputType(bsqOutput);
bsqOutputs.add(txOutput);
tempTxOutputs.add(txOutput);

bsqOutputFound = true;
}
Expand All @@ -219,8 +215,8 @@ private void handleBtcOutput(TempTxOutput txOutput, int index) {
}
}

private void handleOpReturnOutput(TempTxOutput tempTxOutput, boolean isLastOutput) {
TxOutputType txOutputType = OpReturnParser.getTxOutputType(tempTxOutput, isLastOutput);
private void handleOpReturnOutput(TempTxOutput tempTxOutput) {
TxOutputType txOutputType = OpReturnParser.getTxOutputType(tempTxOutput);
tempTxOutput.setTxOutputType(txOutputType);

optionalVerifiedOpReturnType = getMappedOpReturnType(txOutputType);
Expand Down
6 changes: 3 additions & 3 deletions core/src/main/java/bisq/core/dao/node/parser/TxParser.java
Expand Up @@ -127,7 +127,7 @@ public Optional<Tx> findTx(RawTx rawTx, String genesisTxId, int genesisBlockHeig
int lastNonOpReturnIndex = lastIndex;
if (txOutputParser.isOpReturnOutput(outputs.get(lastIndex))) {
// TODO(SQ): perhaps the check for isLastOutput could be skipped
ManfredKarrer marked this conversation as resolved.
Show resolved Hide resolved
txOutputParser.processOpReturnOutput(true, outputs.get(lastIndex));
txOutputParser.processOpReturnOutput(outputs.get(lastIndex));
lastNonOpReturnIndex -= 1;
}

Expand Down Expand Up @@ -170,8 +170,8 @@ public Optional<Tx> findTx(RawTx rawTx, String genesisTxId, int genesisBlockHeig
}
}

if (tempTx.getTxType() != TxType.INVALID){
txOutputParser.commitTxOutputs();
if (tempTx.getTxType() != TxType.INVALID) {
txOutputParser.commitTxOutputsForValidTx();
} else {
txOutputParser.commitTxOutputsForInvalidTx();
}
Expand Down