Skip to content

Commit 107bcc9

Browse files
authored
Merge pull request #29 from PIVX-Project/2020_fix_tx_serialization
[Bug] Fix variable len integer parsing in Tx deserialization
2 parents 6c83ad3 + f5466a2 commit 107bcc9

File tree

2 files changed

+16
-6
lines changed

2 files changed

+16
-6
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))

src/version.txt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
{
22
"number": "0.6.0",
3-
"tag": "a",
4-
"comments": []
3+
"tag": "b",
4+
"comments": ["fix varInt"]
55
}

0 commit comments

Comments
 (0)