relative time locking improvements

This commit is contained in:
Craig Raw 2020-04-06 14:53:16 +02:00
parent 130fea0937
commit 9d15c27bfd
3 changed files with 19 additions and 5 deletions

View file

@ -69,6 +69,10 @@ public class Transaction extends TransactionPart {
return false;
}
public boolean isRelativeLocktimeAllowed() {
return version >= 2L;
}
public boolean isReplaceByFee() {
if(locktime == 0) return false;

View file

@ -8,8 +8,10 @@ import java.io.OutputStream;
public class TransactionInput extends TransactionPart {
public static final long SEQUENCE_LOCKTIME_DISABLED = 4294967295L;
public static final long SEQUENCE_RBF_ENABLED = 4294967293L;
public static final long MAX_RELATIVE_TIMELOCK = 0x40FFFF;
public static final long MAX_RELATIVE_TIMELOCK_IN_BLOCKS = 0xFFFF;
public static final long MAX_RELATIVE_TIMELOCK = 2147483647L;
public static final long RELATIVE_TIMELOCK_VALUE_MASK = 0xFFFF;
public static final long RELATIVE_TIMELOCK_TYPE_FLAG = 0x400000;
public static final int RELATIVE_TIMELOCK_SECONDS_INCREMENT = 512;
// Allows for altering transactions after they were broadcast. Values below NO_SEQUENCE-1 mean it can be altered.
private long sequence;
@ -113,15 +115,19 @@ public class TransactionInput extends TransactionPart {
}
public boolean isRelativeTimeLocked() {
return sequence <= MAX_RELATIVE_TIMELOCK;
return getTransaction().isRelativeLocktimeAllowed() && sequence <= MAX_RELATIVE_TIMELOCK;
}
public boolean isRelativeTimeLockedInBlocks() {
return sequence <= MAX_RELATIVE_TIMELOCK_IN_BLOCKS;
return isRelativeTimeLocked() && ((sequence & RELATIVE_TIMELOCK_TYPE_FLAG) == 0);
}
public long getRelativeLocktime() {
return sequence & MAX_RELATIVE_TIMELOCK_IN_BLOCKS;
return sequence & RELATIVE_TIMELOCK_VALUE_MASK;
}
public Transaction getTransaction() {
return (Transaction)getParent();
}
protected void bitcoinSerializeToStream(OutputStream stream) throws IOException {

View file

@ -34,6 +34,10 @@ public abstract class TransactionPart {
protected abstract void parse() throws ProtocolException;
public TransactionPart getParent() {
return parent;
}
public final void setParent(TransactionPart parent) {
this.parent = parent;
}