From 940304626a403b30305e227a0c56c94aa9d0e14b Mon Sep 17 00:00:00 2001 From: boo <booblegum42@gmail.com> Date: Thu, 8 Feb 2024 11:13:01 +0700 Subject: [PATCH] add mempool, net fee --- node/datums.py | 21 +++++++++++++++------ node/net.py | 30 +++++++++++++++++++++++++++++- 2 files changed, 44 insertions(+), 7 deletions(-) diff --git a/node/datums.py b/node/datums.py index a372f3e..3e90774 100644 --- a/node/datums.py +++ b/node/datums.py @@ -19,20 +19,23 @@ from .types import ticker, TSD class CFDatum: - __slots__ = ["_origin_datum", "hash", "type", "created_at", "atom", "size", "version"] + # __slots__ = ["_origin_datum", "hash", "type", "created_at", "atom", "size", "version", "net"] - def __init__(self, atom: CFBlock | CFEvent, datum: Datum): + def __init__(self, atom: CFBlock | CFEvent | None, datum: Datum, net: CFNet | None = None): self._origin_datum = datum - self.size = datum.getSize() + self.hash = str(datum.hash) + self.type = datum.getTypeStr() self.version = datum.versionStr + self.size = datum.getSize() try: self.created_at = datum.tsCreated except OSError: self.created_at = datetime.fromtimestamp(0) logIt.error(f"Datum [{datum.hash}] has invalid timestamp!") - self.type = datum.getTypeStr() - self.hash = str(datum.hash) - self.atom = atom + if atom is None and net is None: + raise AttributeError("A datum without a parent atom requires a net") + self.atom = atom # atom == None - datum in mempool + self.net = net def get_sub_datum( self) -> CFDatumTX | CFDatumToken | CFDatumEmission | CFDatumAnchor | CFDatumDecree | CFDatumCustom: @@ -53,6 +56,8 @@ class SubDatum: @property def net(self) -> 'CFNet': + if self._parent_datum.atom is None: # mempool datum + return self._parent_datum.net return self._parent_datum.atom.chain.net @@ -70,6 +75,10 @@ class CFDatumTX(SubDatum): self.ticker = ledger.get_tx_ticker(self) self.accepted = bool(ticker) + @property + def items(self) -> list[CFItem]: + return self.get_items() + def get_items(self, filter_type: type[T] | None = None) -> list[T]: from .mappings import CFItemMapper all_items = [CFItemMapper.build(item, self.net) for item in self._origin_sub_datum.getItems() diff --git a/node/net.py b/node/net.py index b3a4058..b171415 100644 --- a/node/net.py +++ b/node/net.py @@ -5,12 +5,24 @@ import traceback from DAP.Core import logIt from DAP.Crypto import HashFast from CellFrame.Network import Net -from CellFrame.Chain import ChainAtomPtr, Ledger, ChainAddr +from CellFrame.Chain import ChainAtomPtr, Ledger, ChainAddr, Mempool from .consensus import CFEvent, CFBlock from .datums import CFDatum, CFDatumTX from .types import CFNetState, ticker from ..common.types import ChainTypes +from dataclasses import dataclass + + +class NetFee: + def __init__(self, net: 'CFNet'): + self.net = net + self.tx_fee = str(self.net._origin_net.txFee) + self.tx_fee_addr = str(self.net._origin_net.txFeeAddr) + self.validator_avg_fee = str(self.net._origin_net.validatorAverageFee) + self.validator_max_fee = str(self.net._origin_net.validatorMaxFee) + self.validator_min_fee = str(self.net._origin_net.validatorMinFee) + self.native_ticker = self.net._origin_net.nativeTicker class CFNet: @@ -21,6 +33,7 @@ class CFNet: raise RuntimeError(f"No such net: {name}") self.main = CFChain(self, 'main') self.zerochain = CFChain(self, 'zerochain') + self.fee_data = NetFee(self) @property def id(self) -> int: @@ -89,6 +102,9 @@ class CFChain: if datum._origin_datum.isDatumTX(): yield datum.get_sub_datum() + def get_mempool(self) -> 'CFMempool': + return CFMempool(self) + def register_mempool_notification_callback(self, callback, *args, **kwargs): def callback_wrapper(op_code, group, key, value, *other): logIt.message(f"{other=}") @@ -140,3 +156,15 @@ class CFLedger: callback(ledger, tx, *args, net=self.net, **kwargs) self._origin_ledger.txAddNotify(callback_wrapper, (args, kwargs)) + + +class CFMempool: + def __init__(self, chain: CFChain): + self.chain = chain + + def get_datums(self) -> list[CFDatum]: + data = Mempool.list(self.chain.net._origin_net, self.chain._origin_chain) + logIt.message(f"{data.keys()=}") + return [CFDatum(None, datum, net=self.chain.net) for datum in data.values()] + + # def emissionExtract -- GitLab