Novacoin: beginning of adaptation for NVC protocol.
[electrum-server.git] / backends / bitcoind / storage.py
index 691b400..098d12e 100644 (file)
@@ -22,7 +22,6 @@ class Storage(object):
         self.shared = shared
         self.hash_list = {}
         self.parents = {}
-        self.root_hash = None
 
         self.test_reorgs = test_reorgs
         try:
@@ -34,7 +33,7 @@ class Storage(object):
             traceback.print_exc(file=sys.stdout)
             self.shared.stop()
 
-        self.db_version = 2 # increase this when database needs to be updated
+        self.db_version = 3 # increase this when database needs to be updated
         try:
             self.last_hash, self.height, db_version = ast.literal_eval(self.db_undo.get('height'))
             print_log("Database version", self.db_version)
@@ -43,7 +42,7 @@ class Storage(object):
             #traceback.print_exc(file=sys.stdout)
             print_log('initializing database')
             self.height = 0
-            self.last_hash = '000000000019d6689c085ae165831e934ff763ae46a2a6c172b3f1b60a8ce26f'
+            self.last_hash = '00000a060336cbb72fe969666d337b87198b1add2abaa59cca226820b32933a4'
             db_version = self.db_version
             # write root
             self.put_node('', {})
@@ -55,6 +54,11 @@ class Storage(object):
             return
 
 
+        # compute root hash
+        d = self.get_node('')
+        self.root_hash, v = self.get_node_hash('',d,None)
+        print_log("UTXO tree root hash:", self.root_hash.encode('hex'))
+        print_log("Coins in database:", v)
 
     # convert between bitcoin addresses and 20 bytes keys used for storage. 
     def address_to_key(self, addr):
@@ -64,10 +68,13 @@ class Storage(object):
         return hash_160_to_bc_address(addr)
 
 
-    def get_address_path(self, addr):
+    def get_proof(self, addr):
         key = self.address_to_key(addr)
-        p = self.get_path(key) 
-        p.append(key)
+        i = self.db_utxo.iterator(start=key)
+        k, _ = i.next()
+
+        p = self.get_path(k) 
+        p.append(k)
 
         out = []
         for item in p:
@@ -137,8 +144,7 @@ class Storage(object):
 
 
     def get_address(self, txi):
-        addr = self.db_addr.get(txi)
-        return self.key_to_address(addr) if addr else None
+        return self.db_addr.get(txi)
 
 
     def get_undo_info(self, height):
@@ -485,7 +491,7 @@ class Storage(object):
         self.add_address(key + txo, value, tx_height)
 
         # backlink
-        self.db_addr.put(txo, key)
+        self.db_addr.put(txo, addr)
 
 
 
@@ -500,6 +506,13 @@ class Storage(object):
         self.db_addr.delete(txo)
 
 
+    def get_utxo_value(self, addr, txi):
+        key = self.address_to_key(addr)
+        leaf = key + txi
+        s = self.db_utxo.get(leaf)
+        value = hex_to_int(s[0:8])
+        return value
+
 
     def set_spent(self, addr, txi, txid, index, height, undo):
         key = self.address_to_key(addr)
@@ -528,7 +541,7 @@ class Storage(object):
         leaf = key + txi
 
         # restore backlink
-        self.db_addr.put(txi, key)
+        self.db_addr.put(txi, addr)
 
         v, height = undo.pop(leaf)
         self.add_address(leaf, v, height)