@@ -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):
5666def 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