Skip to content

Commit 40606a7

Browse files
fix: use Lazy BLS objects in FinalCommitment
Signed-off-by: HashEngineering <hashengineeringsolutions@gmail.com>
1 parent 100c9cd commit 40606a7

File tree

7 files changed

+66
-24
lines changed

7 files changed

+66
-24
lines changed

core/src/main/java/org/bitcoinj/crypto/BLSAbstractLazyObject.java

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,8 +19,11 @@
1919
import org.bitcoinj.core.NetworkParameters;
2020
import org.bitcoinj.core.ProtocolException;
2121

22+
import java.io.IOException;
23+
import java.io.OutputStream;
2224

23-
public class BLSAbstractLazyObject extends Message {
25+
26+
public abstract class BLSAbstractLazyObject extends Message {
2427

2528
byte [] buffer;
2629
boolean initialized;
@@ -46,6 +49,11 @@ protected void parse() throws ProtocolException {
4649
initialized = false;
4750
}
4851

52+
abstract protected void bitcoinSerializeToStream(OutputStream stream, boolean legacy) throws IOException;
53+
54+
public void bitcoinSerialize(OutputStream stream, boolean legacy) throws IOException {
55+
bitcoinSerializeToStream(stream, legacy);
56+
}
4957

5058
public boolean isInitialized() {
5159
return initialized;

core/src/main/java/org/bitcoinj/crypto/BLSLazyPublicKey.java

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,7 @@ protected void parse() throws ProtocolException {
7373
length = cursor - offset;
7474
}
7575

76+
7677
@Override
7778
protected void bitcoinSerializeToStream(OutputStream stream) throws IOException {
7879
if (!initialized && buffer == null) {
@@ -85,7 +86,8 @@ protected void bitcoinSerializeToStream(OutputStream stream) throws IOException
8586
}
8687
}
8788

88-
public void bitcoinSerialize(OutputStream stream, boolean legacy) throws IOException {
89+
@Override
90+
protected void bitcoinSerializeToStream(OutputStream stream, boolean legacy) throws IOException {
8991
if (!initialized && buffer == null) {
9092
throw new IOException("public key and buffer are not initialized");
9193
}
@@ -147,4 +149,12 @@ public boolean equals(Object o) {
147149
public int hashCode() {
148150
return publicKey != null ? publicKey.hashCode() : 0;
149151
}
152+
153+
public boolean isValid() {
154+
if (initialized) {
155+
return publicKey.isValid();
156+
} else {
157+
return buffer != null;
158+
}
159+
}
150160
}

core/src/main/java/org/bitcoinj/crypto/BLSLazySignature.java

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,22 @@ protected void bitcoinSerializeToStream(OutputStream stream) throws IOException
6464
}
6565
}
6666

67+
protected void bitcoinSerializeToStream(OutputStream stream, boolean legacy) throws IOException {
68+
lock.lock();
69+
try {
70+
if (!initialized && buffer == null) {
71+
log.warn("signature and buffer are not initialized");
72+
buffer = invalidSignature.getBuffer();
73+
}
74+
if (buffer == null) {
75+
buffer = signature.getBuffer(BLSSignature.BLS_CURVE_SIG_SIZE, legacy);
76+
}
77+
stream.write(buffer);
78+
} finally {
79+
lock.unlock();
80+
}
81+
}
82+
6783
public BLSLazySignature assign(BLSLazySignature blsLazySignature) {
6884
lock.lock();
6985
try {
@@ -121,4 +137,12 @@ public BLSSignature getSignature() {
121137
public String toString() {
122138
return initialized ? signature.toString() : (buffer == null ? invalidSignature.toString() : Utils.HEX.encode(buffer));
123139
}
140+
141+
public boolean isValid() {
142+
if (initialized) {
143+
return signature.isValid();
144+
} else {
145+
return buffer != null;
146+
}
147+
}
124148
}

core/src/main/java/org/bitcoinj/crypto/BLSSignature.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -255,7 +255,7 @@ public boolean recover(ArrayList<BLSSignature> sigs, ArrayList<BLSId> ids)
255255

256256
public boolean checkMalleable(byte [] buf, int size)
257257
{
258-
byte [] buf2 = getBuffer(serializedSize);
258+
byte [] buf2 = getBuffer(serializedSize, legacy);
259259
if (!Arrays.equals(buf, buf2)) {
260260
// TODO not sure if this is actually possible with the BLS libs. I'm assuming here that somewhere deep inside
261261
// these libs masking might happen, so that 2 different binary representations could result in the same object

core/src/main/java/org/bitcoinj/quorums/FinalCommitment.java

Lines changed: 16 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,6 @@
2121
import org.bitcoinj.crypto.BLSLazyPublicKey;
2222
import org.bitcoinj.crypto.BLSLazySignature;
2323
import org.bitcoinj.crypto.BLSPublicKey;
24-
import org.bitcoinj.crypto.BLSScheme;
2524
import org.bitcoinj.crypto.BLSSignature;
2625
import org.bitcoinj.evolution.Masternode;
2726
import org.bitcoinj.evolution.SpecialTxPayload;
@@ -56,11 +55,11 @@ public class FinalCommitment extends SpecialTxPayload {
5655
ArrayList<Boolean> signers;
5756
ArrayList<Boolean> validMembers;
5857

59-
BLSPublicKey quorumPublicKey;
58+
BLSLazyPublicKey quorumPublicKey;
6059
Sha256Hash quorumVvecHash;
6160

62-
BLSSignature quorumSignature;
63-
BLSSignature membersSignature;
61+
BLSLazySignature quorumSignature;
62+
BLSLazySignature membersSignature;
6463
private boolean verified = false;
6564

6665
public FinalCommitment(NetworkParameters params, byte [] payload, int offset) {
@@ -90,10 +89,10 @@ public FinalCommitment(NetworkParameters params, int version,
9089
int quorumSize = LLMQParameters.fromType(LLMQParameters.LLMQType.fromValue(llmqType)).size;
9190
this.signers = Utils.booleanArrayList(quorumSize, signers);
9291
this.validMembers = Utils.booleanArrayList(quorumSize, validMembers);
93-
this.quorumPublicKey = new BLSPublicKey(params, quorumPublicKey, 0, isLegacy());
92+
this.quorumPublicKey = new BLSLazyPublicKey(params, quorumPublicKey, 0, isLegacy());
9493
this.quorumVvecHash = quorumVvecHash;
95-
this.quorumSignature = signature.getSignature();
96-
this.membersSignature = membersSignature.getSignature();
94+
this.quorumSignature = new BLSLazySignature(signature);
95+
this.membersSignature = new BLSLazySignature(membersSignature);
9796
length = 1 + 32 +
9897
(isIndexed() ? 2 : 0) +
9998
VarInt.sizeOf(quorumSize) * 2 +
@@ -115,15 +114,15 @@ protected void parse() throws ProtocolException {
115114
signers = readBooleanArrayList();
116115
validMembers = readBooleanArrayList();
117116

118-
quorumPublicKey = new BLSPublicKey(params, payload, cursor, isLegacy());
117+
quorumPublicKey = new BLSLazyPublicKey(params, payload, cursor, isLegacy());
119118
cursor += quorumPublicKey.getMessageSize();
120119

121120
quorumVvecHash = readHash();
122121

123-
quorumSignature = new BLSSignature(params, payload, cursor, isLegacy());
122+
quorumSignature = new BLSLazySignature(params, payload, cursor, isLegacy());
124123
cursor += quorumSignature.getMessageSize();
125124

126-
membersSignature = new BLSSignature(params, payload, cursor, isLegacy());
125+
membersSignature = new BLSLazySignature(params, payload, cursor, isLegacy());
127126
cursor += membersSignature.getMessageSize();
128127

129128
length = cursor - offset;
@@ -293,7 +292,7 @@ public boolean verify(StoredBlock block, ArrayList<Masternode> members, boolean
293292

294293
// sigs are only checked when the block is processed
295294
if (checkSigs) {
296-
Sha256Hash commitmentHash = LLMQUtils.buildCommitmentHash(llmqParameters.type, quorumHash, validMembers, quorumPublicKey, quorumVvecHash);
295+
Sha256Hash commitmentHash = LLMQUtils.buildCommitmentHash(llmqParameters.type, quorumHash, validMembers, quorumPublicKey.getPublicKey(), quorumVvecHash);
297296

298297
ArrayList<BLSPublicKey> memberPubKeys = Lists.newArrayList();
299298
for (int i = 0; i < members.size(); i++) {
@@ -303,15 +302,15 @@ public boolean verify(StoredBlock block, ArrayList<Masternode> members, boolean
303302
memberPubKeys.add(members.get(i).getPubKeyOperator());
304303
}
305304

306-
if (!membersSignature.verifySecureAggregated(memberPubKeys, commitmentHash, isLegacy())) {
305+
if (!membersSignature.getSignature().verifySecureAggregated(memberPubKeys, commitmentHash, isLegacy())) {
307306
log.error("invalid aggregated members signature");
308307
return false;
309308
}
310309

311-
Context.get().signingManager.logSignature("QUORUM", quorumPublicKey, commitmentHash, quorumSignature);
310+
Context.get().signingManager.logSignature("QUORUM", quorumPublicKey.getPublicKey(), commitmentHash, quorumSignature.getSignature());
312311

313312
if(Context.get().masternodeSync.hasVerifyFlag(MasternodeSync.VERIFY_FLAGS.BLS_SIGNATURES)) {
314-
if (!quorumSignature.verifyInsecure(quorumPublicKey, commitmentHash, isLegacy())) {
313+
if (!quorumSignature.getSignature().verifyInsecure(quorumPublicKey.getPublicKey(), commitmentHash, isLegacy())) {
315314
log.error("invalid quorum signature");
316315
return false;
317316
}
@@ -393,19 +392,19 @@ public LLMQParameters.LLMQType getLlmqType() {
393392
}
394393

395394
public BLSPublicKey getQuorumPublicKey() {
396-
return quorumPublicKey;
395+
return quorumPublicKey.getPublicKey();
397396
}
398397

399398
public Sha256Hash getQuorumVvecHash() {
400399
return quorumVvecHash;
401400
}
402401

403402
public BLSSignature getMembersSignature() {
404-
return membersSignature;
403+
return membersSignature.getSignature();
405404
}
406405

407406
public BLSSignature getQuorumSignature() {
408-
return quorumSignature;
407+
return quorumSignature.getSignature();
409408
}
410409

411410
public ArrayList<Boolean> getSigners() {

core/src/main/java/org/bitcoinj/quorums/Quorum.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
import org.bitcoinj.core.NetworkParameters;
44
import org.bitcoinj.core.Sha256Hash;
5+
import org.bitcoinj.crypto.BLSLazyPublicKey;
56
import org.bitcoinj.crypto.BLSPublicKey;
67

78
public class Quorum {
@@ -22,7 +23,7 @@ public Quorum(LLMQParameters llmqParameters, FinalCommitment commitment) {
2223
public Quorum(NetworkParameters params, LLMQParameters llmqParameters, Sha256Hash quorumHash, BLSPublicKey publicKey) {
2324
this.llmqParameters = llmqParameters;
2425
this.commitment = new FinalCommitment(params, llmqParameters, quorumHash);
25-
this.commitment.quorumPublicKey = publicKey;
26+
this.commitment.quorumPublicKey = new BLSLazyPublicKey(publicKey);
2627
}
2728

2829
@Override

core/src/test/java/org/bitcoinj/quorums/FinalCommitmentTest.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -85,7 +85,7 @@ public void finalCommitmentTest() throws IOException {
8585
assertEquals(49, commitment.countValidMembers());
8686

8787
BLSPublicKey quorumPublickKey = new BLSPublicKey(PARAMS, Utils.HEX.decode("160b120058893acc8b6622dfd210f7d00aed97a43b364da4073b791c23b1e8b4b4c7943bf5b3b4c62c0108b391351a43"), 0, true);
88-
assertEquals(quorumPublickKey, commitment.quorumPublicKey);
88+
assertEquals(quorumPublickKey, commitment.quorumPublicKey.getPublicKey());
8989

9090
UnsafeByteArrayOutputStream bos = new UnsafeByteArrayOutputStream(txdata.length);
9191
assertArrayEquals(commitmentTx.getExtraPayload(), payload.getPayload());
@@ -152,7 +152,7 @@ public void finalCommitmentTestTwo() throws IOException {
152152
assertEquals(322, commitment.countValidMembers());
153153

154154
BLSPublicKey quorumPublickKey = new BLSPublicKey(PARAMS, Utils.HEX.decode("03a3fbbe99d80a9be8fc59fd4fe43dfbeba9119b688e97493664716cdf15ae47fad70fea7cb93f20fba10d689f9e3c02"), 0, true);
155-
assertEquals(quorumPublickKey, commitment.quorumPublicKey);
155+
assertEquals(quorumPublickKey, commitment.quorumPublicKey.getPublicKey());
156156

157157
assertArrayEquals(commitmentTx.getExtraPayload(), payload.getPayload());
158158
// round trip
@@ -184,7 +184,7 @@ public void finalCommitmentV2Test() throws IOException {
184184
assertEquals(10, commitment.countValidMembers());
185185

186186
BLSPublicKey quorumPublickKey = new BLSPublicKey(PARAMS, Utils.HEX.decode("0e22ac5b7c87076a03b1e4bee58c8404aaed183dd2c3114cea3ac1cbf85218a6196a19073789e9a12fc439b773842368"), 0, true);
187-
assertEquals(quorumPublickKey, commitment.quorumPublicKey);
187+
assertEquals(quorumPublickKey, commitment.quorumPublicKey.getPublicKey());
188188

189189
// round trip
190190
assertArrayEquals(qfcommit, commitment.bitcoinSerialize());

0 commit comments

Comments
 (0)