From acba52786c47552c3fee64684814820ec7c9c784 Mon Sep 17 00:00:00 2001 From: Vivek Teegalapally Date: Wed, 11 Jul 2018 19:58:10 +0530 Subject: [PATCH] Adding a new class FLO in coins.py and writing new functions in tx.py to deserialize FLO's transactions --- electrumx/lib/coins.py | 19 ++++++++++ electrumx/lib/tx.py | 78 +++++++++++++++++++++++++++++++++++++++++- 2 files changed, 96 insertions(+), 1 deletion(-) diff --git a/electrumx/lib/coins.py b/electrumx/lib/coins.py index ba88616..e8c1412 100644 --- a/electrumx/lib/coins.py +++ b/electrumx/lib/coins.py @@ -1897,3 +1897,22 @@ class Monoeci(Coin): '''Given a header return the hash.''' import x11_hash return x11_hash.getPoWHash(header) + +class Flo(Coin): + NAME = "Flo" + SHORTNAME = "FLO" + NET = "mainnet" + XPUB_VERBYTES = bytes.fromhex("0134406b") + XPRV_VERBYTES = bytes.fromhex("01343c31") + P2PKH_VERBYTE = bytes.fromhex("23") + P2SH_VERBYTES = [bytes.fromhex("08")] + WIF_BYTE = bytes.fromhex("b0") + GENESIS_HASH = ('09c7781c9df90708e278c35d38ea5c9041d7ecfcdd1c56ba67274b7cff3e1cea') + TX_COUNT = 8908766 + TX_COUNT_HEIGHT = 1105256 + TX_PER_BLOCK = 10 + RPC_PORT = 7313 + REORG_LIMIT = 800 + PEERS = [ + ] + DESERIALIZER = lib_tx.DeserializerFlo diff --git a/electrumx/lib/tx.py b/electrumx/lib/tx.py index 3db331b..7a0fff5 100644 --- a/electrumx/lib/tx.py +++ b/electrumx/lib/tx.py @@ -402,6 +402,82 @@ class DeserializerTxTimeAuxPow(DeserializerTxTime): return self._read_nbytes(header_end) +class TxFlo(namedtuple("Tx", "version inputs outputs locktime txcomment")): + '''Class representing a transaction.''' + + @cachedproperty + def is_coinbase(self): + return self.inputs[0].is_coinbase + + +class TxFloSegWit(namedtuple("Tx", "version marker flag inputs outputs " + "witness locktime txcomment")): + '''Class representing a SegWit transaction.''' + + @cachedproperty + def is_coinbase(self): + return self.inputs[0].is_coinbase + + +class DeserializerFlo(DeserializerSegWit): + + # https://bitcoincore.org/en/segwit_wallet_dev/#transaction-serialization + + def _read_tx(self): + '''Return a deserialized transaction.''' + version = self._read_le_int32() + inputs = self._read_inputs() + outputs = self._read_outputs() + locktime = self._read_le_uint32() + + if version >= 2: + comment = self._read_varbytes() + else: + comment = "" + + return TxFlo(version, inputs, outputs, locktime, comment) + + def _read_tx_parts(self): + '''Return a (deserialized TX, tx_hash, vsize) tuple.''' + start = self.cursor + marker = self.binary[self.cursor + 4] + if marker: + tx = self._read_tx() + tx_hash = double_sha256(self.binary[start:self.cursor]) + return tx, tx_hash, self.binary_length + + # Ugh, this is nasty. + version = self._read_le_int32() + 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() + + # FLO -> + if version >= 2: + tx_comment = self._read_varbytes() + else: + tx_comment = "" + # <- FLO + + orig_ser += self.binary[start:self.cursor] + vsize = (3 * base_size + self.binary_length) // 4 + + return TxFloSegWit(version, marker, flag, inputs, outputs, witness, + locktime, tx_comment), double_sha256(orig_ser), vsize + + class DeserializerBitcoinAtom(DeserializerSegWit): FORK_BLOCK_HEIGHT = 505888 @@ -503,7 +579,7 @@ class DeserializerDecred(Deserializer): outputs = self._read_outputs() locktime = self._read_le_uint32() expiry = self._read_le_uint32() - no_witness_tx = b'\x01\x00\x01\x00' + self.binary[start+4:self.cursor] + no_witness_tx = b'\x01\x00\x01\x00' + self.binary[start + 4:self.cursor] witness = self._read_witness(len(inputs)) return TxDcr( version,