Exemplo n.º 1
0
    def processLedgerStatus(self, status: LedgerStatus, frm: str):
        logger.debug("{} received ledger status: {} from {}".format(
            self, status, frm))
        # Nodes might not be using pool txn ledger, might be using simple node
        # registries (old approach)
        ledgerStatus = LedgerStatus(*status) if status else None
        if ledgerStatus.txnSeqNo < 0:
            self.discard(status,
                         reason="Received negative sequence "
                         "number from {}".format(frm),
                         logMethod=logger.warn)
        if not status:
            logger.debug("{} found ledger status to be null from {}".format(
                self, frm))
            return
        ledgerType = getattr(status, f.LEDGER_TYPE.nm)

        # If this is a node's ledger manager and sender of this ledger status
        #  is a client and its pool ledger is same as this node's pool ledger
        # then send the pool ledger status since client wont be receiving the
        # consistency proof:
        statusFromClient = self.getStack(frm) == self.clientstack
        if self.ownedByNode and statusFromClient:
            if ledgerType != 0:
                logger.debug("{} received inappropriate ledger status {} from "
                             "client {}".format(self, status, frm))
                return
            else:
                if self.isLedgerSame(ledgerStatus):
                    ledger = self.ledgers[0]["ledger"]
                    ledgerStatus = LedgerStatus(0, ledger.size,
                                                ledger.root_hash)
                    self.sendTo(ledgerStatus, frm)

        # If a ledger is yet to sync and cannot sync right now,
        # then stash the ledger status to be processed later
        if self.ledgers[ledgerType]["state"] != LedgerState.synced and \
                not self.ledgers[ledgerType]["canSync"]:
            self.stashLedgerStatus(ledgerType, status, frm)
            return

        # If this manager is owned by a node and the node's ledger is ahead of
        # the received ledger status
        if self.ownedByNode and self.isLedgerNew(ledgerStatus):
            consistencyProof = self.getConsistencyProof(ledgerStatus)
            self.sendTo(consistencyProof, frm)

        if not self.isLedgerOld(ledgerStatus) and not statusFromClient:
            # This node's ledger is not older so it will not receive a
            # consistency proof unless the other node processes a transaction
            # post sending this ledger status
            self.recvdConsistencyProofs[ledgerType][frm] = None
            self.ledgerStatusOk[ledgerType].add(frm)
            if len(self.ledgerStatusOk[ledgerType]) == 2 * self.owner.f:
                logger.debug("{} found out from {} that its ledger of type {} "
                             "is latest".format(
                                 self, self.ledgerStatusOk[ledgerType],
                                 ledgerType))
                if self.ledgers[ledgerType]["state"] != LedgerState.synced:
                    self.catchupCompleted(ledgerType)
    def sendDLStatus(self, name):
        size = self.primaryStorage.size
        newSize = randint(1, size)
        while newSize in sentSizes:
            newSize = randint(1, size)
        print("new size {}".format(newSize))
        newRootHash = base64.b64encode(
            self.domainLedger.tree.merkle_tree_hash(0, newSize)).decode()
        ledgerStatus = LedgerStatus(1, newSize, newRootHash)

        print("dl status {}".format(ledgerStatus))
        rid = self.nodestack.getRemote(name).uid
        self.send(ledgerStatus, rid)
        sentSizes.add(newSize)
Exemplo n.º 3
0
 def sendLedgerStatus(self, nodeName: str):
     ledgerStatus = LedgerStatus(0, self.ledger.size, self.ledger.root_hash)
     rid = self.nodestack.getRemote(nodeName).uid
     self.nodestack.send(ledgerStatus, rid)
Exemplo n.º 4
0
 def configLedgerStatus(self):
     return LedgerStatus(2, self.configLedger.size,
                         self.configLedger.root_hash)