Add support for Overwinter v3 transactions to mininode framework.
This commit is contained in:
parent
e4dff510b4
commit
697140ede5
|
@ -44,6 +44,8 @@ BIP0031_VERSION = 60000
|
||||||
MY_VERSION = 170002 # past bip-31 for ping/pong
|
MY_VERSION = 170002 # past bip-31 for ping/pong
|
||||||
MY_SUBVERSION = "/python-mininode-tester:0.0.1/"
|
MY_SUBVERSION = "/python-mininode-tester:0.0.1/"
|
||||||
|
|
||||||
|
OVERWINTER_VERSION_GROUP_ID = 0x03C48270
|
||||||
|
|
||||||
MAX_INV_SZ = 50000
|
MAX_INV_SZ = 50000
|
||||||
|
|
||||||
|
|
||||||
|
@ -565,6 +567,7 @@ class CTxOut(object):
|
||||||
class CTransaction(object):
|
class CTransaction(object):
|
||||||
def __init__(self, tx=None):
|
def __init__(self, tx=None):
|
||||||
if tx is None:
|
if tx is None:
|
||||||
|
self.fOverwintered = False
|
||||||
self.nVersion = 1
|
self.nVersion = 1
|
||||||
self.vin = []
|
self.vin = []
|
||||||
self.vout = []
|
self.vout = []
|
||||||
|
@ -575,6 +578,7 @@ class CTransaction(object):
|
||||||
self.sha256 = None
|
self.sha256 = None
|
||||||
self.hash = None
|
self.hash = None
|
||||||
else:
|
else:
|
||||||
|
self.fOverwintered = tx.fOverwintered
|
||||||
self.nVersion = tx.nVersion
|
self.nVersion = tx.nVersion
|
||||||
self.vin = copy.deepcopy(tx.vin)
|
self.vin = copy.deepcopy(tx.vin)
|
||||||
self.vout = copy.deepcopy(tx.vout)
|
self.vout = copy.deepcopy(tx.vout)
|
||||||
|
@ -586,24 +590,46 @@ class CTransaction(object):
|
||||||
self.hash = None
|
self.hash = None
|
||||||
|
|
||||||
def deserialize(self, f):
|
def deserialize(self, f):
|
||||||
self.nVersion = struct.unpack("<i", f.read(4))[0]
|
header = struct.unpack("<I", f.read(4))[0]
|
||||||
|
self.fOverwintered = bool(header >> 31)
|
||||||
|
self.nVersion = header & 0x7FFFFFFF
|
||||||
|
self.nVersionGroupId = (struct.unpack("<I", f.read(4))[0]
|
||||||
|
if self.fOverwintered else 0)
|
||||||
|
|
||||||
|
isOverwinterV3 = (self.fOverwintered and
|
||||||
|
self.nVersionGroupId == OVERWINTER_VERSION_GROUP_ID and
|
||||||
|
self.nVersion == 3)
|
||||||
|
|
||||||
self.vin = deser_vector(f, CTxIn)
|
self.vin = deser_vector(f, CTxIn)
|
||||||
self.vout = deser_vector(f, CTxOut)
|
self.vout = deser_vector(f, CTxOut)
|
||||||
self.nLockTime = struct.unpack("<I", f.read(4))[0]
|
self.nLockTime = struct.unpack("<I", f.read(4))[0]
|
||||||
|
if isOverwinterV3:
|
||||||
|
self.nExpiryHeight = struct.unpack("<I", f.read(4))[0]
|
||||||
|
|
||||||
if self.nVersion >= 2:
|
if self.nVersion >= 2:
|
||||||
self.vjoinsplit = deser_vector(f, JSDescription)
|
self.vjoinsplit = deser_vector(f, JSDescription)
|
||||||
if len(self.vjoinsplit) > 0:
|
if len(self.vjoinsplit) > 0:
|
||||||
self.joinSplitPubKey = deser_uint256(f)
|
self.joinSplitPubKey = deser_uint256(f)
|
||||||
self.joinSplitSig = f.read(64)
|
self.joinSplitSig = f.read(64)
|
||||||
|
|
||||||
self.sha256 = None
|
self.sha256 = None
|
||||||
self.hash = None
|
self.hash = None
|
||||||
|
|
||||||
def serialize(self):
|
def serialize(self):
|
||||||
|
header = (int(self.fOverwintered)<<31) | self.nVersion
|
||||||
|
isOverwinterV3 = (self.fOverwintered and
|
||||||
|
self.nVersionGroupId == OVERWINTER_VERSION_GROUP_ID and
|
||||||
|
self.nVersion == 3)
|
||||||
|
|
||||||
r = ""
|
r = ""
|
||||||
r += struct.pack("<i", self.nVersion)
|
r += struct.pack("<I", header)
|
||||||
|
if self.fOverwintered:
|
||||||
|
r += struct.pack("<I", self.nVersionGroupId)
|
||||||
r += ser_vector(self.vin)
|
r += ser_vector(self.vin)
|
||||||
r += ser_vector(self.vout)
|
r += ser_vector(self.vout)
|
||||||
r += struct.pack("<I", self.nLockTime)
|
r += struct.pack("<I", self.nLockTime)
|
||||||
|
if isOverwinterV3:
|
||||||
|
r += struct.pack("<I", self.nExpiryHeight)
|
||||||
if self.nVersion >= 2:
|
if self.nVersion >= 2:
|
||||||
r += ser_vector(self.vjoinsplit)
|
r += ser_vector(self.vjoinsplit)
|
||||||
if len(self.vjoinsplit) > 0:
|
if len(self.vjoinsplit) > 0:
|
||||||
|
@ -628,8 +654,10 @@ class CTransaction(object):
|
||||||
return True
|
return True
|
||||||
|
|
||||||
def __repr__(self):
|
def __repr__(self):
|
||||||
r = "CTransaction(nVersion=%i vin=%s vout=%s nLockTime=%i" \
|
r = ("CTransaction(fOverwintered=%r nVersion=%i nVersionGroupId=0x%08x "
|
||||||
% (self.nVersion, repr(self.vin), repr(self.vout), self.nLockTime)
|
"vin=%s vout=%s nLockTime=%i nExpiryHeight=%i"
|
||||||
|
% (self.fOverwintered, self.nVersion, self.nVersionGroupId,
|
||||||
|
repr(self.vin), repr(self.vout), self.nLockTime, self.nExpiryHeight))
|
||||||
if self.nVersion >= 2:
|
if self.nVersion >= 2:
|
||||||
r += " vjoinsplit=%s" % repr(self.vjoinsplit)
|
r += " vjoinsplit=%s" % repr(self.vjoinsplit)
|
||||||
if len(self.vjoinsplit) > 0:
|
if len(self.vjoinsplit) > 0:
|
||||||
|
|
Loading…
Reference in New Issue