mirror of
https://github.com/ethereum/go-ethereum.git
synced 2026-05-24 08:49:29 +00:00
Changed python code to new encoding
This commit is contained in:
parent
c489ff0cbb
commit
8e2a08ffde
1 changed files with 36 additions and 30 deletions
66
trie.py
66
trie.py
|
|
@ -12,6 +12,25 @@ class DB():
|
||||||
def put(self,key,value): return self.db.Put(key,value)
|
def put(self,key,value): return self.db.Put(key,value)
|
||||||
def delete(self,key): return self.db.Delete(key)
|
def delete(self,key): return self.db.Delete(key)
|
||||||
|
|
||||||
|
def hexarraykey_to_bin(key):
|
||||||
|
term = 1 if key[-1] == 16 else 0
|
||||||
|
if term: key2 = key[:-1]
|
||||||
|
oddlen = len(key) % 2
|
||||||
|
flags = 2 * term + oddlen
|
||||||
|
if oddlen: key = [flags] + key
|
||||||
|
else: key = [flags,0] + key
|
||||||
|
o = ''
|
||||||
|
for i in range(0,len(key),2):
|
||||||
|
o += chr(16 * key[i] + key[i+1])
|
||||||
|
return o
|
||||||
|
|
||||||
|
def bin_to_hexarraykey(bindata):
|
||||||
|
o = ['0123456789abcdef'.find(x) for x in key[1:].encode('hex')]
|
||||||
|
if o[0] >= 2: o.append(16)
|
||||||
|
if o[0] % 2 == 1: o = o[1:]
|
||||||
|
else: o = o[2:]
|
||||||
|
return o
|
||||||
|
|
||||||
databases = {}
|
databases = {}
|
||||||
|
|
||||||
class Trie():
|
class Trie():
|
||||||
|
|
@ -21,19 +40,6 @@ class Trie():
|
||||||
if dbfile not in databases:
|
if dbfile not in databases:
|
||||||
databases[dbfile] = DB(dbfile)
|
databases[dbfile] = DB(dbfile)
|
||||||
self.db = databases[dbfile]
|
self.db = databases[dbfile]
|
||||||
|
|
||||||
def __encode_key(self,key):
|
|
||||||
term = 1 if key[-1] == 16 else 0
|
|
||||||
oddlen = (len(key) - term) % 2
|
|
||||||
prefix = ('0' if oddlen else '')
|
|
||||||
main = ''.join(['0123456789abcdef'[x] for x in key[:len(key)-term]])
|
|
||||||
return chr(2 * term + oddlen) + (prefix+main).decode('hex')
|
|
||||||
|
|
||||||
def __decode_key(self,key):
|
|
||||||
o = ['0123456789abcdef'.find(x) for x in key[1:].encode('hex')]
|
|
||||||
if key[0] == '\x01' or key[0] == '\x03': o = o[1:]
|
|
||||||
if key[0] == '\x02' or key[0] == '\x03': o.append(16)
|
|
||||||
return o
|
|
||||||
|
|
||||||
def __get_state(self,node,key):
|
def __get_state(self,node,key):
|
||||||
if self.debug: print 'nk',node.encode('hex'),key
|
if self.debug: print 'nk',node.encode('hex'),key
|
||||||
|
|
@ -45,7 +51,7 @@ class Trie():
|
||||||
raise Exception("node not found in database")
|
raise Exception("node not found in database")
|
||||||
elif len(curnode) == 2:
|
elif len(curnode) == 2:
|
||||||
(k2,v2) = curnode
|
(k2,v2) = curnode
|
||||||
k2 = self.__decode_key(k2)
|
k2 = hexarraykey_to_bin(k2)
|
||||||
if len(key) >= len(k2) and k2 == key[:len(k2)]:
|
if len(key) >= len(k2) and k2 == key[:len(k2)]:
|
||||||
return self.__get_state(v2,key[len(k2):])
|
return self.__get_state(v2,key[len(k2):])
|
||||||
else:
|
else:
|
||||||
|
|
@ -69,7 +75,7 @@ class Trie():
|
||||||
return value
|
return value
|
||||||
else:
|
else:
|
||||||
if not node:
|
if not node:
|
||||||
newnode = [ self.__encode_key(key), value ]
|
newnode = [ hexarraykey_to_bin(key), value ]
|
||||||
return self.__put(newnode)
|
return self.__put(newnode)
|
||||||
curnode = rlp.decode(self.db.get(node))
|
curnode = rlp.decode(self.db.get(node))
|
||||||
if self.debug: print 'icn', curnode
|
if self.debug: print 'icn', curnode
|
||||||
|
|
@ -77,9 +83,9 @@ class Trie():
|
||||||
raise Exception("node not found in database")
|
raise Exception("node not found in database")
|
||||||
if len(curnode) == 2:
|
if len(curnode) == 2:
|
||||||
(k2, v2) = curnode
|
(k2, v2) = curnode
|
||||||
k2 = self.__decode_key(k2)
|
k2 = hexarraykey_to_bin(k2)
|
||||||
if key == k2:
|
if key == k2:
|
||||||
newnode = [ self.__encode_key(key), value ]
|
newnode = [ hexarraykey_to_bin(key), value ]
|
||||||
return self.__put(newnode)
|
return self.__put(newnode)
|
||||||
else:
|
else:
|
||||||
i = 0
|
i = 0
|
||||||
|
|
@ -96,7 +102,7 @@ class Trie():
|
||||||
if i == 0:
|
if i == 0:
|
||||||
return newhash3
|
return newhash3
|
||||||
else:
|
else:
|
||||||
newnode4 = [ self.__encode_key(key[:i]), newhash3 ]
|
newnode4 = [ hexarraykey_to_bin(key[:i]), newhash3 ]
|
||||||
return self.__put(newnode4)
|
return self.__put(newnode4)
|
||||||
else:
|
else:
|
||||||
newnode = [ curnode[i] for i in range(17) ]
|
newnode = [ curnode[i] for i in range(17) ]
|
||||||
|
|
@ -114,15 +120,15 @@ class Trie():
|
||||||
if self.debug: print 'dcn', curnode
|
if self.debug: print 'dcn', curnode
|
||||||
if len(curnode) == 2:
|
if len(curnode) == 2:
|
||||||
(k2, v2) = curnode
|
(k2, v2) = curnode
|
||||||
k2 = self.__decode_key(k2)
|
k2 = hexarraykey_to_bin(k2)
|
||||||
if key == k2:
|
if key == k2:
|
||||||
return ''
|
return ''
|
||||||
elif key[:len(k2)] == k2:
|
elif key[:len(k2)] == k2:
|
||||||
newhash = self.__delete_state(v2,key[len(k2):])
|
newhash = self.__delete_state(v2,key[len(k2):])
|
||||||
childnode = rlp.decode(self.db.get(newhash))
|
childnode = rlp.decode(self.db.get(newhash))
|
||||||
if len(childnode) == 2:
|
if len(childnode) == 2:
|
||||||
newkey = k2 + self.__decode_key(childnode[0])
|
newkey = k2 + hexarraykey_to_bin(childnode[0])
|
||||||
newnode = [ self.__encode_key(newkey), childnode[1] ]
|
newnode = [ hexarraykey_to_bin(newkey), childnode[1] ]
|
||||||
else:
|
else:
|
||||||
newnode = [ curnode[0], newhash ]
|
newnode = [ curnode[0], newhash ]
|
||||||
return self.__put(newnode)
|
return self.__put(newnode)
|
||||||
|
|
@ -142,8 +148,8 @@ class Trie():
|
||||||
if len(childnode) == 17:
|
if len(childnode) == 17:
|
||||||
newnode2 = [ key[0], newnode[onlynode] ]
|
newnode2 = [ key[0], newnode[onlynode] ]
|
||||||
elif len(childnode) == 2:
|
elif len(childnode) == 2:
|
||||||
newkey = [onlynode] + self.__decode_key(childnode[0])
|
newkey = [onlynode] + hexarraykey_to_bin(childnode[0])
|
||||||
newnode2 = [ self.__encode_key(newkey), childnode[1] ]
|
newnode2 = [ hexarraykey_to_bin(newkey), childnode[1] ]
|
||||||
else:
|
else:
|
||||||
newnode2 = newnode
|
newnode2 = newnode
|
||||||
return self.__put(newnode2)
|
return self.__put(newnode2)
|
||||||
|
|
@ -154,7 +160,7 @@ class Trie():
|
||||||
if not curnode:
|
if not curnode:
|
||||||
raise Exception("node not found in database")
|
raise Exception("node not found in database")
|
||||||
if len(curnode) == 2:
|
if len(curnode) == 2:
|
||||||
key = self.__decode_key(curnode[0])
|
key = hexarraykey_to_bin(curnode[0])
|
||||||
if key[-1] == 16: return 1
|
if key[-1] == 16: return 1
|
||||||
else: return self.__get_size(curnode[1])
|
else: return self.__get_size(curnode[1])
|
||||||
elif len(curnode) == 17:
|
elif len(curnode) == 17:
|
||||||
|
|
@ -170,15 +176,15 @@ class Trie():
|
||||||
if not curnode:
|
if not curnode:
|
||||||
raise Exception("node not found in database")
|
raise Exception("node not found in database")
|
||||||
if len(curnode) == 2:
|
if len(curnode) == 2:
|
||||||
lkey = self.__decode_key(curnode[0])
|
lkey = hexarraykey_to_bin(curnode[0])
|
||||||
o = {}
|
o = {}
|
||||||
if lkey[-1] == 16:
|
if lkey[-1] == 16:
|
||||||
o[curnode[0]] = curnode[1]
|
o[curnode[0]] = curnode[1]
|
||||||
else:
|
else:
|
||||||
d = self.__to_dict(curnode[1])
|
d = self.__to_dict(curnode[1])
|
||||||
for v in d:
|
for v in d:
|
||||||
subkey = self.__decode_key(v)
|
subkey = hexarraykey_to_bin(v)
|
||||||
totalkey = self.__encode_key(lkey+subkey)
|
totalkey = hexarraykey_to_bin(lkey+subkey)
|
||||||
o[totalkey] = d[v]
|
o[totalkey] = d[v]
|
||||||
return o
|
return o
|
||||||
elif len(curnode) == 17:
|
elif len(curnode) == 17:
|
||||||
|
|
@ -186,8 +192,8 @@ class Trie():
|
||||||
for i in range(16):
|
for i in range(16):
|
||||||
d = self.__to_dict(curnode[i])
|
d = self.__to_dict(curnode[i])
|
||||||
for v in d:
|
for v in d:
|
||||||
subkey = self.__decode_key(v)
|
subkey = hexarraykey_to_bin(v)
|
||||||
totalkey = self.__encode_key([i] + subkey)
|
totalkey = hexarraykey_to_bin([i] + subkey)
|
||||||
o[totalkey] = d[v]
|
o[totalkey] = d[v]
|
||||||
if curnode[16]: o[chr(16)] = curnode[16]
|
if curnode[16]: o[chr(16)] = curnode[16]
|
||||||
return o
|
return o
|
||||||
|
|
@ -198,7 +204,7 @@ class Trie():
|
||||||
d = self.__to_dict(self.root)
|
d = self.__to_dict(self.root)
|
||||||
o = {}
|
o = {}
|
||||||
for v in d:
|
for v in d:
|
||||||
v2 = ''.join(['0123456789abcdef'[x] for x in self.__decode_key(v)[:-1]])
|
v2 = ''.join(['0123456789abcdef'[x] for x in hexarraykey_to_bin(v)[:-1]])
|
||||||
if not as_hex: v2 = v2.decode('hex')
|
if not as_hex: v2 = v2.decode('hex')
|
||||||
o[v2] = d[v]
|
o[v2] = d[v]
|
||||||
return o
|
return o
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue