Skip to content

Commit 2a65753

Browse files
committed
Merge c67ef29 into merged_master (Elements PR ElementsProject#600)
Also uncommented a bunch of PSBT functional tests (had to add a fee output to one transaction, update `find_output` to skip CT outputs, and change two constant checks at the end of the commented-out section).
2 parents 8466747 + c67ef29 commit 2a65753

22 files changed

+1213
-212
lines changed

src/core_io.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@ bool DecodeHexBlockHeader(CBlockHeader&, const std::string& hex_header);
3737
*/
3838
bool ParseHashStr(const std::string& strHex, uint256& result);
3939
std::vector<unsigned char> ParseHexUV(const UniValue& v, const std::string& strName);
40+
4041
int ParseSighashString(const UniValue& sighash);
4142

4243
// core_write.cpp

src/core_write.cpp

Lines changed: 15 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
#include <issuance.h>
1010
#include <key_io.h>
1111
#include <script/script.h>
12+
#include <script/sign.h>
1213
#include <script/standard.h>
1314
#include <serialize.h>
1415
#include <streams.h>
@@ -326,15 +327,21 @@ void TxToUniv(const CTransaction& tx, const uint256& hashBlock, UniValue& entry,
326327
uint64_t minv;
327328
uint64_t maxv;
328329
const CTxOutWitness* ptxoutwit = tx.witness.vtxoutwit.size() <= i? NULL: &tx.witness.vtxoutwit[i];
329-
if (ptxoutwit && secp256k1_rangeproof_info(secp256k1_blind_context, &exp, &mantissa, &minv, &maxv, &ptxoutwit->vchRangeproof[0], ptxoutwit->vchRangeproof.size())) {
330-
if (exp == -1) {
331-
out.pushKV("value", ValueFromAmount((CAmount)minv));
332-
} else {
333-
out.pushKV("value-minimum", ValueFromAmount((CAmount)minv));
334-
out.pushKV("value-maximum", ValueFromAmount((CAmount)maxv));
330+
if (ptxoutwit) {
331+
if (ptxoutwit->vchRangeproof.size() && secp256k1_rangeproof_info(secp256k1_blind_context, &exp, &mantissa, &minv, &maxv, &ptxoutwit->vchRangeproof[0], ptxoutwit->vchRangeproof.size())) {
332+
if (exp == -1) {
333+
out.pushKV("value", ValueFromAmount((CAmount)minv));
334+
} else {
335+
out.pushKV("value-minimum", ValueFromAmount((CAmount)minv));
336+
out.pushKV("value-maximum", ValueFromAmount((CAmount)maxv));
337+
}
338+
out.pushKV("ct-exponent", exp);
339+
out.pushKV("ct-bits", mantissa);
340+
}
341+
342+
if (ptxoutwit->vchSurjectionproof.size()) {
343+
out.pushKV("surjectionproof", HexStr(ptxoutwit->vchSurjectionproof));
335344
}
336-
out.pushKV("ct-exponent", exp);
337-
out.pushKV("ct-bits", mantissa);
338345
}
339346
out.pushKV("valuecommitment", txout.nValue.GetHex());
340347
}

src/psbt.cpp

Lines changed: 49 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44

55
#include <psbt.h>
66
#include <util/strencodings.h>
7+
#include <confidential_validation.h>
78

89
#include <numeric>
910

@@ -154,6 +155,11 @@ void PSBTInput::Merge(const PSBTInput& input)
154155
if (witness_script.empty() && !input.witness_script.empty()) witness_script = input.witness_script;
155156
if (final_script_sig.empty() && !input.final_script_sig.empty()) final_script_sig = input.final_script_sig;
156157
if (final_script_witness.IsNull() && !input.final_script_witness.IsNull()) final_script_witness = input.final_script_witness;
158+
159+
if (!value && input.value) value = input.value;
160+
if (value_blinding_factor.IsNull() && !input.value_blinding_factor.IsNull()) value_blinding_factor = input.value_blinding_factor;
161+
if (asset.IsNull() && !input.asset.IsNull()) asset = input.asset;
162+
if (asset_blinding_factor.IsNull() && !input.asset_blinding_factor.IsNull()) asset_blinding_factor = input.asset_blinding_factor;
157163
}
158164

159165
bool PSBTInput::IsSane() const
@@ -206,6 +212,15 @@ void PSBTOutput::Merge(const PSBTOutput& output)
206212

207213
if (redeem_script.empty() && !output.redeem_script.empty()) redeem_script = output.redeem_script;
208214
if (witness_script.empty() && !output.witness_script.empty()) witness_script = output.witness_script;
215+
216+
if (!blinding_pubkey.IsValid() && output.blinding_pubkey.IsValid()) blinding_pubkey = output.blinding_pubkey;
217+
if (value_commitment.IsNull() && !output.value_commitment.IsNull()) value_commitment = output.value_commitment;
218+
if (value_blinding_factor.IsNull() && !output.value_blinding_factor.IsNull()) value_blinding_factor = output.value_blinding_factor;
219+
if (asset_commitment.IsNull() && !output.asset_commitment.IsNull()) asset_commitment = output.asset_commitment;
220+
if (asset_blinding_factor.IsNull() && !output.asset_blinding_factor.IsNull()) asset_blinding_factor = output.asset_blinding_factor;
221+
if (nonce_commitment.IsNull() && !output.nonce_commitment.IsNull()) nonce_commitment = output.nonce_commitment;
222+
if (range_proof.empty() && !output.range_proof.empty()) range_proof = output.range_proof;
223+
if (surjection_proof.empty() && !output.surjection_proof.empty()) surjection_proof = output.surjection_proof;
209224
}
210225
bool PSBTInputSigned(const PSBTInput& input)
211226
{
@@ -244,7 +259,7 @@ bool SignPSBTInput(const SigningProvider& provider, PartiallySignedTransaction&
244259
SignatureData sigdata;
245260
input.FillSignatureData(sigdata);
246261

247-
// Get UTXO
262+
// Get UTXO for this input
248263
bool require_witness_sig = false;
249264
CTxOut utxo;
250265

@@ -323,10 +338,35 @@ bool FinalizeAndExtractPSBT(PartiallySignedTransaction& psbtx, CMutableTransacti
323338
}
324339

325340
result = *psbtx.tx;
341+
result.witness.vtxinwit.resize(result.vin.size());
326342
for (unsigned int i = 0; i < result.vin.size(); ++i) {
327343
result.vin[i].scriptSig = psbtx.inputs[i].final_script_sig;
328344
result.witness.vtxinwit[i].scriptWitness = psbtx.inputs[i].final_script_witness;
329345
}
346+
347+
result.witness.vtxoutwit.resize(result.vout.size());
348+
for (unsigned int i = 0; i < result.vout.size(); ++i) {
349+
PSBTOutput& output = psbtx.outputs.at(i);
350+
CTxOut& out = result.vout[i];
351+
CTxOutWitness& outwit = result.witness.vtxoutwit[i];
352+
353+
if (!output.value_commitment.IsNull()) {
354+
out.nValue = output.value_commitment;
355+
}
356+
if (!output.asset_commitment.IsNull()) {
357+
out.nAsset = output.asset_commitment;
358+
}
359+
if (!output.nonce_commitment.IsNull()) {
360+
out.nNonce = output.nonce_commitment;
361+
}
362+
if (!output.range_proof.empty()) {
363+
outwit.vchRangeproof = output.range_proof;
364+
}
365+
if (!output.surjection_proof.empty()) {
366+
outwit.vchSurjectionproof = output.surjection_proof;
367+
}
368+
}
369+
330370
return true;
331371
}
332372

@@ -358,6 +398,14 @@ std::string PSBTRoleName(PSBTRole role) {
358398
assert(false);
359399
}
360400

401+
std::string EncodePSBT(const PartiallySignedTransaction& psbt)
402+
{
403+
CDataStream ssTx(SER_NETWORK, PROTOCOL_VERSION);
404+
ssTx << psbt;
405+
return EncodeBase64((unsigned char*)ssTx.data(), ssTx.size());
406+
}
407+
408+
361409
bool DecodeBase64PSBT(PartiallySignedTransaction& psbt, const std::string& base64_tx, std::string& error)
362410
{
363411
bool invalid;

0 commit comments

Comments
 (0)