Browse Source

Add Segregated Witness support for Emercoin (#835)

patch-2
yakimka 6 years ago
committed by Neil
parent
commit
91fed53a5a
  1. 2
      electrumx/lib/coins.py
  2. 61
      electrumx/lib/tx.py
  3. 15
      tests/blocks/emercoin_mainnet_357826.json

2
electrumx/lib/coins.py

@ -522,7 +522,7 @@ class Emercoin(Coin):
VALUE_PER_COIN = 1000000
RPC_PORT = 6662
DESERIALIZER = lib_tx.DeserializerTxTimeAuxPow
DESERIALIZER = lib_tx.DeserializerEmercoin
PEERS = []

61
electrumx/lib/tx.py

@ -386,6 +386,65 @@ class DeserializerTxTime(Deserializer):
)
class TxTimeSegWit(namedtuple(
"Tx", "version time marker flag inputs outputs witness locktime")):
'''Class representing a SegWit transaction with time.'''
class DeserializerTxTimeSegWit(DeserializerTxTime):
def _read_witness(self, fields):
read_witness_field = self._read_witness_field
return [read_witness_field() for _ in range(fields)]
def _read_witness_field(self):
read_varbytes = self._read_varbytes
return [read_varbytes() for _ in range(self._read_varint())]
def _read_tx_parts(self):
'''Return a (deserialized TX, tx_hash, vsize) tuple.'''
start = self.cursor
marker = self.binary[self.cursor + 8]
if marker:
tx = super().read_tx()
tx_hash = self.TX_HASH_FN(self.binary[start:self.cursor])
return tx, tx_hash, self.binary_length
version = self._read_le_int32()
time = self._read_le_uint32()
orig_ser = self.binary[start:self.cursor]
marker = self._read_byte()
flag = self._read_byte()
start = self.cursor
inputs = self._read_inputs()
outputs = self._read_outputs()
orig_ser += self.binary[start:self.cursor]
base_size = self.cursor - start
witness = self._read_witness(len(inputs))
start = self.cursor
locktime = self._read_le_uint32()
orig_ser += self.binary[start:self.cursor]
vsize = (3 * base_size + self.binary_length) // 4
return TxTimeSegWit(
version, time, marker, flag, inputs, outputs, witness, locktime),\
self.TX_HASH_FN(orig_ser), vsize
def read_tx(self):
return self._read_tx_parts()[0]
def read_tx_and_hash(self):
tx, tx_hash, vsize = self._read_tx_parts()
return tx, tx_hash
def read_tx_and_vsize(self):
tx, tx_hash, vsize = self._read_tx_parts()
return tx, vsize
class TxTrezarcoin(
namedtuple("Tx", "version time inputs outputs locktime txcomment")):
'''Class representing transaction that has a time and txcomment field.'''
@ -454,7 +513,7 @@ class DeserializerReddcoin(Deserializer):
return TxTime(version, time, inputs, outputs, locktime)
class DeserializerTxTimeAuxPow(DeserializerTxTime):
class DeserializerEmercoin(DeserializerTxTimeSegWit):
VERSION_AUXPOW = (1 << 8)
def is_merged_block(self):

15
tests/blocks/emercoin_mainnet_357826.json

@ -0,0 +1,15 @@
{
"hash": "3547b7602c258ecbcc41add2a88ae7a17ba4ba652738665f2d251721f5ef5c10",
"size": 529,
"height": 357826,
"merkleroot": "e3006f819f8d63d775fb9768c79459020af2476378038582ae84b161a0ba0acc",
"tx": [
"9a5459ab695dc33350fe8cda07e0e7d0785a8ffd15ab15ce24e71b7c29032ac0",
"478e827fd064766f3ffd4a48d66436d3f5b4067d8f23eb61138e9d79b2b44c0e"
],
"time": 1559191908,
"nonce": 0,
"bits": "1c0bd7cd",
"previousblockhash": "7a6ca59966f6c64c63e3a7368e69d802bcce24bb4e52f4913e38440ec4511599",
"block": "08009a02991551c40e44383e91f4524ebb24cebc02d8698e36a7e3634cc6f66699a56c7acc0abaa061b184ae828503786347f20a025994c76897fb75d7638d9f816f00e36461ef5ccdd70b1c0000000002020000006461ef5c0001010000000000000000000000000000000000000000000000000000000000000000ffffffff0603c275050101ffffffff020000000000000000000000000000000000266a24aa21a9edcb3fd1d48b60833fd11082400a3b11380cd784beee5e34ec04edb76d9839212e0120000000000000000000000000000000000000000000000000000000000000000000000000020000006461ef5c0143c349bfe857bb2d6277d01f554d2e716420896d18a2468b4fb92dc608b73d860100000048473044022041f43ec86d25cbe2a1e768e20b3dfe1cb4268e12c2c128632a42fd87f308e2a302206f87ce19fe4b2c71f77cbe651cde44df12966b84367e7a3f20bd0bb586672ffa01ffffffff03000000000000000000041eb01e00000000232102a7a1a6520b42f10f17a9c5aae2b8f6e24c7d5c4cdef7d7abcfe54bf71ddec72facd410510b00000000232102a7a1a6520b42f10f17a9c5aae2b8f6e24c7d5c4cdef7d7abcfe54bf71ddec72fac0000000046304402203f9b16d59876626514326d01cad088cc3763cfa90172afd57b4c5716b8d63fa702203fb45c154c1b4158070d6bcdd62a14258d3e218663b298d5be2bafa0d03acdf3"
}
Loading…
Cancel
Save