psbt: clarify PSBT, PSBTInput, PSBTOutput unserialization flows
The unserialization flows of the PSBT types work based on few underlying assumptions of functions from `serialize.h` & `stream.h` that takes some to understand when read the first time. Add few comments that highlight these assumptions hopefully making it easier to grasp. Also, mention key/value format types as per BIP 174.
This commit is contained in:
1 file changed
+18
-9
+18
-9
@@ -465,7 +465,8 @@ struct PSBTInput
|
|||||||
// Read loop
|
// Read loop
|
||||||
bool found_sep = false;
|
bool found_sep = false;
|
||||||
while(!s.empty()) {
|
while(!s.empty()) {
|
||||||
// Read
|
// Read the key of format "<keylen><keytype><keydata>" after which
|
||||||
|
// "key" will contain "<keytype><keydata>"
|
||||||
std::vector<unsigned char> key;
|
std::vector<unsigned char> key;
|
||||||
s >> key;
|
s >> key;
|
||||||
|
|
||||||
@@ -476,11 +477,13 @@ struct PSBTInput
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Type is compact size uint at beginning of key
|
// "skey" is used so that "key" is unchanged after reading keytype below
|
||||||
SpanReader skey{key};
|
SpanReader skey{key};
|
||||||
|
// keytype is of the format compact size uint at the beginning of "key"
|
||||||
uint64_t type = ReadCompactSize(skey);
|
uint64_t type = ReadCompactSize(skey);
|
||||||
|
|
||||||
// Do stuff based on type
|
// Do stuff based on keytype "type", i.e., key checks, reading values of the
|
||||||
|
// format "<valuelen><valuedata>" from the stream "s", and value checks
|
||||||
switch(type) {
|
switch(type) {
|
||||||
case PSBT_IN_NON_WITNESS_UTXO:
|
case PSBT_IN_NON_WITNESS_UTXO:
|
||||||
{
|
{
|
||||||
@@ -949,7 +952,8 @@ struct PSBTOutput
|
|||||||
// Read loop
|
// Read loop
|
||||||
bool found_sep = false;
|
bool found_sep = false;
|
||||||
while(!s.empty()) {
|
while(!s.empty()) {
|
||||||
// Read
|
// Read the key of format "<keylen><keytype><keydata>" after which
|
||||||
|
// "key" will contain "<keytype><keydata>"
|
||||||
std::vector<unsigned char> key;
|
std::vector<unsigned char> key;
|
||||||
s >> key;
|
s >> key;
|
||||||
|
|
||||||
@@ -960,11 +964,13 @@ struct PSBTOutput
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Type is compact size uint at beginning of key
|
// "skey" is used so that "key" is unchanged after reading keytype below
|
||||||
SpanReader skey{key};
|
SpanReader skey{key};
|
||||||
|
// keytype is of the format compact size uint at the beginning of "key"
|
||||||
uint64_t type = ReadCompactSize(skey);
|
uint64_t type = ReadCompactSize(skey);
|
||||||
|
|
||||||
// Do stuff based on type
|
// Do stuff based on keytype "type", i.e., key checks, reading values of the
|
||||||
|
// format "<valuelen><valuedata>" from the stream "s", and value checks
|
||||||
switch(type) {
|
switch(type) {
|
||||||
case PSBT_OUT_REDEEMSCRIPT:
|
case PSBT_OUT_REDEEMSCRIPT:
|
||||||
{
|
{
|
||||||
@@ -1212,7 +1218,8 @@ struct PartiallySignedTransaction
|
|||||||
// Read global data
|
// Read global data
|
||||||
bool found_sep = false;
|
bool found_sep = false;
|
||||||
while(!s.empty()) {
|
while(!s.empty()) {
|
||||||
// Read
|
// Read the key of format "<keylen><keytype><keydata>" after which
|
||||||
|
// "key" will contain "<keytype><keydata>"
|
||||||
std::vector<unsigned char> key;
|
std::vector<unsigned char> key;
|
||||||
s >> key;
|
s >> key;
|
||||||
|
|
||||||
@@ -1223,11 +1230,13 @@ struct PartiallySignedTransaction
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Type is compact size uint at beginning of key
|
// "skey" is used so that "key" is unchanged after reading keytype below
|
||||||
SpanReader skey{key};
|
SpanReader skey{key};
|
||||||
|
// keytype is of the format compact size uint at the beginning of "key"
|
||||||
uint64_t type = ReadCompactSize(skey);
|
uint64_t type = ReadCompactSize(skey);
|
||||||
|
|
||||||
// Do stuff based on type
|
// Do stuff based on keytype "type", i.e., key checks, reading values of the
|
||||||
|
// format "<valuelen><valuedata>" from the stream "s", and value checks
|
||||||
switch(type) {
|
switch(type) {
|
||||||
case PSBT_GLOBAL_UNSIGNED_TX:
|
case PSBT_GLOBAL_UNSIGNED_TX:
|
||||||
{
|
{
|
||||||
|
|||||||
Reference in new issue
Block a user