@@ -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}
0 commit comments