| 506 | |
| 507 | template<typename T_tx_ref, typename T_merkle_block> |
| 508 | CScriptWitness CreatePeginWitnessInner(const CAmount& value, const CAsset& asset, const uint256& genesis_hash, const CScript& claim_script, const T_tx_ref& tx_ref, const T_merkle_block& merkle_block) |
| 509 | { |
| 510 | std::vector<unsigned char> value_bytes; |
| 511 | CVectorWriter ss_val(0, 0, value_bytes, 0); |
| 512 | try { |
| 513 | ss_val << value; |
| 514 | } catch (...) { |
| 515 | throw std::ios_base::failure("Amount serialization is invalid."); |
| 516 | } |
| 517 | |
| 518 | // Strip witness data for proof inclusion since only TXID-covered fields matters |
| 519 | CDataStream ss_tx(SER_NETWORK, PROTOCOL_VERSION | SERIALIZE_TRANSACTION_NO_WITNESS); |
| 520 | ss_tx << tx_ref; |
| 521 | const auto* ss_tx_ptr = UCharCast(ss_tx.data()); |
| 522 | std::vector<unsigned char> tx_data_stripped(ss_tx_ptr, ss_tx_ptr + ss_tx.size()); |
| 523 | |
| 524 | // Serialize merkle block |
| 525 | CDataStream ss_txout_proof(SER_NETWORK, PROTOCOL_VERSION | SERIALIZE_TRANSACTION_NO_WITNESS); |
| 526 | ss_txout_proof << merkle_block; |
| 527 | const auto* ss_txout_ptr = UCharCast(ss_txout_proof.data()); |
| 528 | std::vector<unsigned char> txout_proof_bytes(ss_txout_ptr, ss_txout_ptr + ss_txout_proof.size()); |
| 529 | |
| 530 | // Construct pegin proof |
| 531 | CScriptWitness pegin_witness; |
| 532 | std::vector<std::vector<unsigned char>>& stack = pegin_witness.stack; |
| 533 | stack.push_back(value_bytes); |
| 534 | stack.push_back(std::vector<unsigned char>(asset.begin(), asset.end())); |
| 535 | stack.push_back(std::vector<unsigned char>(genesis_hash.begin(), genesis_hash.end())); |
| 536 | stack.push_back(std::vector<unsigned char>(claim_script.begin(), claim_script.end())); |
| 537 | stack.push_back(tx_data_stripped); |
| 538 | stack.push_back(txout_proof_bytes); |
| 539 | return pegin_witness; |
| 540 | } |
| 541 | |
| 542 | CScriptWitness CreatePeginWitness(const CAmount& value, const CAsset& asset, const uint256& genesis_hash, const CScript& claim_script, const CTransactionRef& tx_ref, const CMerkleBlock& merkle_block) |
| 543 | { |