|
@ -187,24 +187,20 @@ class MerkleCache(object): |
|
|
# Retain the value of depth_higher; in practice this is fine |
|
|
# Retain the value of depth_higher; in practice this is fine |
|
|
start = self._leaf_start(self.length) |
|
|
start = self._leaf_start(self.length) |
|
|
hashes = self.source.hashes(start, length - start) |
|
|
hashes = self.source.hashes(start, length - start) |
|
|
self.level[start >> self.depth_higher] = self._level(hashes) |
|
|
self.level[start >> self.depth_higher:] = self._level(hashes) |
|
|
self.length = length |
|
|
self.length = length |
|
|
|
|
|
|
|
|
def _level_for(self, length): |
|
|
def _level_for(self, length): |
|
|
'''Return a (level_length, final_hash) pair for a truncation |
|
|
'''Return a (level_length, final_hash) pair for a truncation |
|
|
of the hashes to the given length. Length may be an extension, |
|
|
of the hashes to the given length.''' |
|
|
in which case extra hashes are requested from the source.''' |
|
|
if length == self.length: |
|
|
if length > self.length: |
|
|
return self.level |
|
|
hashes = self.source.hashes(self.length, length - self.length) |
|
|
level = self.level[:length >> self.depth_higher] |
|
|
return self.level + self._level(hashes) |
|
|
leaf_start = self._leaf_start(length) |
|
|
if length < self.length: |
|
|
count = min(self._segment_length(), length - leaf_start) |
|
|
level = self.level[:length >> self.depth_higher] |
|
|
hashes = self.source.hashes(leaf_start, count) |
|
|
leaf_start = self._leaf_start(length) |
|
|
level += self._level(hashes) |
|
|
count = min(self._segment_length(), length - leaf_start) |
|
|
return level |
|
|
hashes = self.source.hashes(leaf_start, count) |
|
|
|
|
|
level += self._level(hashes) |
|
|
|
|
|
return level |
|
|
|
|
|
return self.level |
|
|
|
|
|
|
|
|
|
|
|
def branch_and_root(self, length, index): |
|
|
def branch_and_root(self, length, index): |
|
|
'''Return a merkle branch and root. Length is the number of |
|
|
'''Return a merkle branch and root. Length is the number of |
|
|