Skip to content

Commit 5d8ba3d

Browse files
committed
Sapling: add option to skip ProveAndSing in TransactionBuilder::Build
adding dummy proofs and signatures instead
1 parent efd7139 commit 5d8ba3d

File tree

3 files changed

+67
-3
lines changed

3 files changed

+67
-3
lines changed

src/sapling/transaction_builder.cpp

Lines changed: 61 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -324,7 +324,66 @@ TransactionBuilderResult TransactionBuilder::ProveAndSign()
324324
return TransactionBuilderResult(CTransaction(mtx));
325325
}
326326

327-
TransactionBuilderResult TransactionBuilder::Build()
327+
TransactionBuilderResult TransactionBuilder::AddDummySignatures()
328+
{
329+
if (!spends.empty() || !outputs.empty()) {
330+
// Add Dummy Sapling OutputDescriptions
331+
OutputDescription dummyOD;
332+
dummyOD.cv = UINT256_MAX;
333+
dummyOD.cmu = UINT256_MAX;
334+
dummyOD.ephemeralKey = UINT256_MAX;
335+
dummyOD.encCiphertext = {{0xff}};
336+
dummyOD.outCiphertext = {{0xff}};
337+
dummyOD.zkproof = {{0xff}};
338+
for (unsigned int i = 0; i < outputs.size(); i++) {
339+
mtx.sapData->vShieldedOutput.push_back(dummyOD);
340+
}
341+
// Add Dummy Sapling SpendDescriptions
342+
SpendDescription dummySD;
343+
dummySD.cv = UINT256_MAX;
344+
dummySD.anchor = UINT256_MAX;
345+
dummySD.nullifier = UINT256_MAX;
346+
dummySD.rk = UINT256_MAX;
347+
dummySD.zkproof = {{0xff}};
348+
dummySD.spendAuthSig = {{0xff}};
349+
for (unsigned int i = 0; i < spends.size(); i++) {
350+
mtx.sapData->vShieldedSpend.push_back(dummySD);
351+
}
352+
// Add Dummy Binding sig
353+
mtx.sapData->bindingSig = {{0xff}};
354+
}
355+
356+
// Add Dummmy Transparent signatures
357+
CTransaction txNewConst(mtx);
358+
for (int nIn = 0; nIn < (int) mtx.vin.size(); nIn++) {
359+
auto tIn = tIns[nIn];
360+
SignatureData sigdata;
361+
if (!ProduceSignature(DummySignatureCreator(keystore), tIn.scriptPubKey, sigdata, SIGVERSION_SAPLING, false)) {
362+
return TransactionBuilderResult("Failed to sign transaction");
363+
} else {
364+
UpdateTransaction(mtx, nIn, sigdata);
365+
}
366+
}
367+
368+
return TransactionBuilderResult(CTransaction(mtx));
369+
}
370+
371+
void TransactionBuilder::ClearProofsAndSignatures()
372+
{
373+
// Clear Sapling output descriptions
374+
mtx.sapData->vShieldedOutput.clear();
375+
376+
// Clear Sapling spend descriptions
377+
mtx.sapData->vShieldedSpend.clear();
378+
379+
// Clear Binding sig
380+
mtx.sapData->bindingSig = {{0}};
381+
382+
// Clear Transparent signatures
383+
for (CTxIn& in : mtx.vin) in.scriptSig = CScript();
384+
}
385+
386+
TransactionBuilderResult TransactionBuilder::Build(bool fDummySig)
328387
{
329388
//
330389
// Consistency checks
@@ -378,5 +437,5 @@ TransactionBuilderResult TransactionBuilder::Build()
378437
}
379438
}
380439

381-
return ProveAndSign();
440+
return fDummySig ? AddDummySignatures() : ProveAndSign();
382441
}

src/sapling/transaction_builder.h

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -120,9 +120,13 @@ class TransactionBuilder
120120

121121
void SendChangeTo(CTxDestination& changeAddr);
122122

123-
TransactionBuilderResult Build();
123+
TransactionBuilderResult Build(bool fDummySig = false);
124124
// Add Sapling Spend/Output descriptions, binding sig, and transparent signatures
125125
TransactionBuilderResult ProveAndSign();
126+
// Add dummy Sapling Spend/Output descriptions, binding sig, and transparent signatures
127+
TransactionBuilderResult AddDummySignatures();
128+
// Remove Sapling Spend/Output descriptions, binding sig, and transparent signatures
129+
void ClearProofsAndSignatures();
126130
};
127131

128132
#endif /* TRANSACTION_BUILDER_H */

src/uint256.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -139,5 +139,6 @@ arith_uint512 UintToArith512(const uint512 &);
139139
/** constant uint256 instances */
140140
const uint256 UINT256_ZERO = uint256();
141141
const uint256 UINT256_ONE = uint256("0000000000000000000000000000000000000000000000000000000000000001");
142+
const uint256 UINT256_MAX = uint256("ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff");
142143

143144
#endif // PIVX_UINT256_H

0 commit comments

Comments
 (0)