From 8f6bedfd4bbab996c7813484fefe1aeddd8e3a89 Mon Sep 17 00:00:00 2001 From: Gregory Sanders Date: Mon, 26 Nov 2018 12:06:29 -0500 Subject: [PATCH] functional framework support for CScriptNum decode --- test/functional/test_framework/script.py | 23 ++++++++++++++++++++--- 1 file changed, 20 insertions(+), 3 deletions(-) diff --git a/test/functional/test_framework/script.py b/test/functional/test_framework/script.py index 375d6334f7..314a161f96 100644 --- a/test/functional/test_framework/script.py +++ b/test/functional/test_framework/script.py @@ -368,11 +368,12 @@ class CScriptNum(): @staticmethod def encode(obj): + val = obj.value r = bytearray(0) - if obj.value == 0: + if val == 0: return bytes(r) - neg = obj.value < 0 - absvalue = -obj.value if neg else obj.value + neg = val < 0 + absvalue = -val if neg else val while (absvalue): r.append(absvalue & 0xff) absvalue >>= 8 @@ -382,6 +383,22 @@ class CScriptNum(): r[-1] |= 0x80 return bytes([len(r)]) + r + @staticmethod + def decode(vch): + # We assume valid push_size and minimal encoding + value = vch[1:] + # Mask for all but the highest result bit + num_mask = (2**(len(value)*8) - 1) >> 1 + if len(value) == 0: + return 0 + else : + result = 0 + for i in range(len(value)): + result |= int(value[i]) << 8*i + if value[-1] >= 0x80: + result &= num_mask + result *= -1 + return result class CScript(bytes): """Serialized script