From 8be3a223550745dc082d82fb0faf496850adce6c Mon Sep 17 00:00:00 2001 From: Scruffy Scruffington Date: Wed, 4 Apr 2018 00:05:30 +0300 Subject: [PATCH] Segwit support: parse transactions --- parser.cpp | 46 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 46 insertions(+) diff --git a/parser.cpp b/parser.cpp index af0885e..5788936 100644 --- a/parser.cpp +++ b/parser.cpp @@ -358,12 +358,26 @@ static void parseInputs( const Block *block, const uint8_t *&p, const uint8_t *txHash + #if defined(BITCOIN) + , uint64_t* witnessNum + #endif ) { if(!skip) { startInputs(p); } LOAD_VARINT(nbInputs, p); + + #if defined(BITCOIN) // segwit support + *witnessNum = 0; + if(nbInputs == 0) + { + SKIP(unsigned char, flag, p); // flag is always 1 in current implementation + LOAD_VARINT(nbRealInputs, p); + nbInputs = nbRealInputs; + *witnessNum = nbRealInputs; + } + #endif for(uint64_t inputIndex=0; inputIndex( block, @@ -378,6 +392,28 @@ static void parseInputs( } } +#if defined(BITCOIN) +static void parseWitness( + const uint8_t* &p +) { + LOAD_VARINT(num, p); + for(uint64_t i=0; i @@ -409,7 +445,12 @@ static void parseTX( SKIP(uint32_t, nTime, p); #endif + #if defined(BITCOIN) + uint64_t witnessNum = 0; + parseInputs(block, p, txHash, &witnessNum); + #else parseInputs(block, p, txHash); + #endif Chunk *txo = 0; size_t txoOffset = -1; @@ -422,6 +463,11 @@ static void parseTX( parseOutputs(p, txHash); + #if defined(BITCOIN) + if(witnessNum) + parseWitnesses(witnessNum, p); + #endif + if(txo) { size_t txoSize = p - outputsStart; txo->init(