Skip to content

Commit 2ce9566

Browse files
committed
[Bug] Fix variable len integer parsing in Tx deserialization
1 parent 6c83ad3 commit 2ce9566

File tree

1 file changed

+14
-4
lines changed

1 file changed

+14
-4
lines changed

src/pivx_parser.py

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,16 @@ def readInt(self, nbytes, byteorder="big", signed=False):
2121
self.cursor += nbytes * 2
2222
return res
2323

24+
def readVarInt(self):
25+
r = self.readInt(1)
26+
if r == 253:
27+
return self.readInt(2, "little")
28+
elif r == 254:
29+
return self.readInt(4, "little")
30+
elif r == 255:
31+
return self.readInt(8, "little")
32+
return r
33+
2434
def readString(self, nbytes, byteorder="big"):
2535
if self.cursor + nbytes * 2 > len(self.hex_str):
2636
raise Exception("HexParser range error")
@@ -40,7 +50,7 @@ def ParseTxInput(p):
4050
vin = {}
4151
vin["txid"] = p.readString(32, "little")
4252
vin["vout"] = p.readInt(4, "little")
43-
script_len = p.readInt(1, "little")
53+
script_len = p.readVarInt()
4454
vin["scriptSig"] = {}
4555
vin["scriptSig"]["hex"] = p.readString(script_len, "big")
4656
vin["sequence"] = p.readInt(4, "little")
@@ -56,7 +66,7 @@ def ParseTxInput(p):
5666
def ParseTxOutput(p, isTestnet=False):
5767
vout = {}
5868
vout["value"] = p.readInt(8, "little")
59-
script_len = p.readInt(1, "little")
69+
script_len = p.readVarInt()
6070
vout["scriptPubKey"] = {}
6171
vout["scriptPubKey"]["hex"] = p.readString(script_len, "big")
6272
vout["scriptPubKey"]["addresses"] = []
@@ -77,12 +87,12 @@ def ParseTx(hex_string, isTestnet=False):
7787

7888
tx["version"] = p.readInt(4, "little")
7989

80-
num_of_inputs = p.readInt(1, "little")
90+
num_of_inputs = p.readVarInt()
8191
tx["vin"] = []
8292
for i in range(num_of_inputs):
8393
tx["vin"].append(ParseTxInput(p))
8494

85-
num_of_outputs = p.readInt(1, "little")
95+
num_of_outputs = p.readVarInt()
8696
tx["vout"] = []
8797
for i in range(num_of_outputs):
8898
tx["vout"].append(ParseTxOutput(p, isTestnet))

0 commit comments

Comments
 (0)