@@ -212,6 +212,34 @@ including hashes of the scriptsigs, sequences, and outputs. See the section
212
212
optimization.
213
213
214
214
<source lang ="python" >
215
+
216
+ def ser_compact_size(l):
217
+ r = b""
218
+ if l < 253:
219
+ # Serialize as unsigned char
220
+ r = struct.pack("B", l)
221
+ elif l < 0x10000:
222
+ # Serialize as unsigned char 253 followed by unsigned 2 byte integer (little endian)
223
+ r = struct.pack("<BH", 253, l)
224
+ elif l < 0x100000000:
225
+ # Serialize as unsigned char 254 followed by unsigned 4 byte integer (little endian)
226
+ r = struct.pack("<BI", 254, l)
227
+ else:
228
+ # Serialize as unsigned char 255 followed by unsigned 8 byte integer (little endian)
229
+ r = struct.pack("<BQ", 255, l)
230
+ return r
231
+
232
+ def ser_string(s):
233
+ return ser_compact_size(len(s)) + s
234
+
235
+ class CTxOut:
236
+ def serialize(self):
237
+ r = b""
238
+ # serialize as signed 8 byte integer (little endian)
239
+ r += struct.pack("<q", self.nValue)
240
+ r += ser_string(self.scriptPubKey)
241
+ return r
242
+
215
243
def get_default_check_template_precomputed_data(self):
216
244
result = {}
217
245
# If there are no scriptSigs we do not need to precompute a hash
@@ -221,6 +249,7 @@ def get_default_check_template_precomputed_data(self):
221
249
# each nSequence is packed as 4 byte unsigned integer (little endian)
222
250
result["sequences"] = sha256(b"".join(struct.pack("<I", inp.nSequence) for inp in self.vin))
223
251
# The same value is also pre-computed for and defined in BIP-341 and can be shared
252
+ # See class CTxOut above for details.
224
253
result["outputs"] = sha256(b"".join(out.serialize() for out in self.vout))
225
254
return result
226
255
@@ -229,21 +258,21 @@ def get_default_check_template_hash(self, nIn, precomputed = None):
229
258
if precomputed == None:
230
259
precomputed = self.get_default_check_template_precomputed_data()
231
260
r = b""
232
- # pack as 4 byte signed integer (little endian)
261
+ # Serialize as 4 byte signed integer (little endian)
233
262
r += struct.pack("<i", self.nVersion)
234
- # pack as 4 byte unsigned integer (little endian)
263
+ # Serialize as 4 byte unsigned integer (little endian)
235
264
r += struct.pack("<I", self.nLockTime)
236
265
# we do not include the hash in the case where there is no
237
266
# scriptSigs
238
267
if "scriptSigs" in precomputed:
239
268
r += precomputed["scriptSigs"]
240
- # pack as 4 byte unsigned integer (little endian)
269
+ # Serialize as 4 byte unsigned integer (little endian)
241
270
r += struct.pack("<I", len(self.vin))
242
271
r += precomputed["sequences"]
243
- # pack as 4 byte unsigned integer (little endian)
272
+ # Serialize as 4 byte unsigned integer (little endian)
244
273
r += struct.pack("<I", len(self.vout))
245
274
r += precomputed["outputs"]
246
- # pack as 4 byte unsigned integer (little endian)
275
+ # Serialize as 4 byte unsigned integer (little endian)
247
276
r += struct.pack("<I", nIn)
248
277
return sha256(r)
249
278
</source >
0 commit comments