Esempio n. 1
0
 def commit_refcount_changes(self, epoch):
     # Save death row nodes
     timeout_epoch = epoch + self.ttl
     try:
         death_row_nodes = rlp.decode(
             self._keyValueStorage.get('deathrow:' + str(timeout_epoch)))
     except BaseException:
         death_row_nodes = []
     for nodekey in self.death_row:
         refcount, val = rlp.decode(
             self._keyValueStorage.get(b'r:' + nodekey))
         if refcount == ZERO_ENCODED:
             new_refcount = utils.encode_int(DEATH_ROW_OFFSET +
                                             timeout_epoch)
             self._keyValueStorage.put(b'r:' + nodekey,
                                       rlp.encode([new_refcount, val]))
     if len(self.death_row) > 0:
         sys.stderr.write('%d nodes marked for pruning during block %d\n' %
                          (len(self.death_row), timeout_epoch))
     death_row_nodes.extend(self.death_row)
     self.death_row = []
     self._keyValueStorage.put('deathrow:' + str(timeout_epoch),
                               rlp.encode(death_row_nodes))
     # Save journal
     try:
         journal = rlp.decode(
             self._keyValueStorage.get('journal:' + str(epoch)))
     except BaseException:
         journal = []
     journal.extend(self.journal)
     self.journal = []
     self._keyValueStorage.put('journal:' + str(epoch), rlp.encode(journal))
Esempio n. 2
0
 def commit_refcount_changes(self, epoch):
     # Save death row nodes
     timeout_epoch = epoch + self.ttl
     try:
         death_row_nodes = rlp.decode(
             self._keyValueStorage.get('deathrow:' + str(timeout_epoch)))
     except BaseException:
         death_row_nodes = []
     for nodekey in self.death_row:
         refcount, val = rlp.decode(
             self._keyValueStorage.get(b'r:' + nodekey))
         if refcount == ZERO_ENCODED:
             new_refcount = utils.encode_int(
                 DEATH_ROW_OFFSET + timeout_epoch)
             self._keyValueStorage.put(
                 b'r:' + nodekey, rlp.encode([new_refcount, val]))
     if len(self.death_row) > 0:
         sys.stderr.write('%d nodes marked for pruning during block %d\n' %
                          (len(self.death_row), timeout_epoch))
     death_row_nodes.extend(self.death_row)
     self.death_row = []
     self._keyValueStorage.put('deathrow:' + str(timeout_epoch),
                               rlp.encode(death_row_nodes))
     # Save journal
     try:
         journal = rlp.decode(
             self._keyValueStorage.get('journal:' + str(epoch)))
     except BaseException:
         journal = []
     journal.extend(self.journal)
     self.journal = []
     self._keyValueStorage.put('journal:' + str(epoch), rlp.encode(journal))
Esempio n. 3
0
 def dec_refcount(self, k):
     # raise Exception("WHY AM I CHANGING A REFCOUNT?!:?")
     node_object = rlp.decode(self._keyValueStorage.get(b'r:' + k))
     refcount = utils.decode_int(node_object[0])
     if self.logging:
         sys.stderr.write('decreasing %s to: %d\n' %
                          (utils.encode_hex(k), refcount - 1))
     assert refcount > 0
     self.journal.append([node_object[0], k])
     new_refcount = utils.encode_int(refcount - 1)
     self._keyValueStorage.put(b'r:' + k,
                               rlp.encode([new_refcount, node_object[1]]))
     if new_refcount == ZERO_ENCODED:
         self.death_row.append(k)
Esempio n. 4
0
 def dec_refcount(self, k):
     # raise Exception("WHY AM I CHANGING A REFCOUNT?!:?")
     node_object = rlp.decode(self._keyValueStorage.get(b'r:' + k))
     refcount = utils.decode_int(node_object[0])
     if self.logging:
         sys.stderr.write('decreasing %s to: %d\n' %
                          (utils.encode_hex(k), refcount - 1))
     if not refcount > 0:
         raise ValueError("node object for key {} has {} number "
                          "of references, expected > 0".format(k, refcount))
     self.journal.append([node_object[0], k])
     new_refcount = utils.encode_int(refcount - 1)
     self._keyValueStorage.put(b'r:' + k,
                               rlp.encode([new_refcount, node_object[1]]))
     if new_refcount == ZERO_ENCODED:
         self.death_row.append(k)
Esempio n. 5
0
 def dec_refcount(self, k):
     # raise Exception("WHY AM I CHANGING A REFCOUNT?!:?")
     node_object = rlp.decode(self._keyValueStorage.get(b'r:' + k))
     refcount = utils.decode_int(node_object[0])
     if self.logging:
         sys.stderr.write('decreasing %s to: %d\n' % (
             utils.encode_hex(k), refcount - 1))
     if not refcount > 0:
         raise ValueError(
             "node object for key {} has {} number "
             "of references, expected > 0"
             .format(k, refcount)
         )
     self.journal.append([node_object[0], k])
     new_refcount = utils.encode_int(refcount - 1)
     self._keyValueStorage.put(
         b'r:' + k, rlp.encode([new_refcount, node_object[1]]))
     if new_refcount == ZERO_ENCODED:
         self.death_row.append(k)
Esempio n. 6
0
 def inc_refcount(self, k, v):
     # raise Exception("WHY AM I CHANGING A REFCOUNT?!:?")
     try:
         node_object = rlp.decode(self._keyValueStorage.get(b'r:' + k))
         refcount = utils.decode_int(node_object[0])
         self.journal.append([node_object[0], k])
         if refcount >= DEATH_ROW_OFFSET:
             refcount = 0
         new_refcount = utils.encode_int(refcount + 1)
         self._keyValueStorage.put(b'r:' + k, rlp.encode([new_refcount, v]))
         if self.logging:
             sys.stderr.write('increasing %s %r to: %d\n' % (
                 utils.encode_hex(k), v, refcount + 1))
     except BaseException:
         self._keyValueStorage.put(b'r:' + k, rlp.encode([ONE_ENCODED, v]))
         self.journal.append([ZERO_ENCODED, k])
         if self.logging:
             sys.stderr.write('increasing %s %r to: %d\n' % (
                 utils.encode_hex(k), v, 1))
Esempio n. 7
0
 def inc_refcount(self, k, v):
     # raise Exception("WHY AM I CHANGING A REFCOUNT?!:?")
     try:
         node_object = rlp.decode(self._keyValueStorage.get(b'r:' + k))
         refcount = utils.decode_int(node_object[0])
         self.journal.append([node_object[0], k])
         if refcount >= DEATH_ROW_OFFSET:
             refcount = 0
         new_refcount = utils.encode_int(refcount + 1)
         self._keyValueStorage.put(b'r:' + k, rlp.encode([new_refcount, v]))
         if self.logging:
             sys.stderr.write('increasing %s %r to: %d\n' %
                              (utils.encode_hex(k), v, refcount + 1))
     except BaseException:
         self._keyValueStorage.put(b'r:' + k, rlp.encode([ONE_ENCODED, v]))
         self.journal.append([ZERO_ENCODED, k])
         if self.logging:
             sys.stderr.write('increasing %s %r to: %d\n' %
                              (utils.encode_hex(k), v, 1))
Esempio n. 8
0
import sys

import rlp
import state.util.utils as utils
from state.db.db import BaseDB
from storage.kv_store import KeyValueStorage

DEATH_ROW_OFFSET = 2**62
ZERO_ENCODED = utils.encode_int(0)
ONE_ENCODED = utils.encode_int(1)


class RefcountDB(BaseDB):

    def __init__(self, keyValueStorage: KeyValueStorage):
        self._keyValueStorage = keyValueStorage
        self.journal = []
        self.death_row = []
        self.ttl = 500
        self.logging = False

    # Increase the reference count associated with a key
    def inc_refcount(self, k, v):
        # raise Exception("WHY AM I CHANGING A REFCOUNT?!:?")
        try:
            node_object = rlp.decode(self._keyValueStorage.get(b'r:' + k))
            refcount = utils.decode_int(node_object[0])
            self.journal.append([node_object[0], k])
            if refcount >= DEATH_ROW_OFFSET:
                refcount = 0
            new_refcount = utils.encode_int(refcount + 1)
Esempio n. 9
0
import sys

import rlp
import state.util.utils as utils
from state.db.db import BaseDB
from storage.kv_store import KeyValueStorage

DEATH_ROW_OFFSET = 2**62
ZERO_ENCODED = utils.encode_int(0)
ONE_ENCODED = utils.encode_int(1)


class RefcountDB(BaseDB):
    def __init__(self, keyValueStorage: KeyValueStorage):
        self._keyValueStorage = keyValueStorage
        self.journal = []
        self.death_row = []
        self.ttl = 500
        self.logging = False

    # Increase the reference count associated with a key
    def inc_refcount(self, k, v):
        # raise Exception("WHY AM I CHANGING A REFCOUNT?!:?")
        try:
            node_object = rlp.decode(self._keyValueStorage.get(b'r:' + k))
            refcount = utils.decode_int(node_object[0])
            self.journal.append([node_object[0], k])
            if refcount >= DEATH_ROW_OFFSET:
                refcount = 0
            new_refcount = utils.encode_int(refcount + 1)
            self._keyValueStorage.put(b'r:' + k, rlp.encode([new_refcount, v]))
Esempio n. 10
0
        raise Exception("nibbles can only be [0,..15]")

    if len(nibbles) % 2:
        raise Exception("nibbles must be of even numbers")

    res = b''
    for i in range(0, len(nibbles), 2):
        res += ascii_chr(16 * nibbles[i] + nibbles[i + 1])
    return res


NIBBLE_TERMINATOR = 16
RECORDING = 1
NONE = 0
VERIFYING = -1
ZERO_ENCODED = encode_int(0)

proving = False


class ProofConstructor:
    def __init__(self):
        self.mode = []
        self.nodes = []
        self.exempt = []

    def push(self, mode, nodes=[]):
        global proving
        proving = True
        self.mode.append(mode)
        self.exempt.append(set())
Esempio n. 11
0
        raise Exception("nibbles can only be [0,..15]")

    if len(nibbles) % 2:
        raise Exception("nibbles must be of even numbers")

    res = b''
    for i in range(0, len(nibbles), 2):
        res += ascii_chr(16 * nibbles[i] + nibbles[i + 1])
    return res


NIBBLE_TERMINATOR = 16
RECORDING = 1
NONE = 0
VERIFYING = -1
ZERO_ENCODED = encode_int(0)

proving = False


class ProofConstructor:

    def __init__(self):
        self.mode = []
        self.nodes = []
        self.exempt = []

    def push(self, mode, nodes=None):
        global proving
        proving = True
        self.mode.append(mode)