Sort proofs
This commit is contained in:
		
							parent
							
								
									fee303cf85
								
							
						
					
					
						commit
						a5cdcb3900
					
				| @ -1,6 +1,5 @@ | ||||
| # standard imports | ||||
| import os | ||||
| import hashlib | ||||
| import logging | ||||
| 
 | ||||
| # local imports | ||||
| @ -13,17 +12,9 @@ class Attachment(Data): | ||||
| 
 | ||||
|     def __init__(self, path='.'): | ||||
|         super(Attachment, self).__init__() | ||||
|         self.contents = [] | ||||
|         self.digests = [] | ||||
|         self.contents = {} | ||||
|         self.path = path | ||||
|         self.attachment_path = os.path.join(self.path, 'attachments') | ||||
|         self.__hasher = self.__basehasher | ||||
| 
 | ||||
| 
 | ||||
|     def __basehasher(self, v): | ||||
|         h = hashlib.sha256() | ||||
|         h.update(v) | ||||
|         return h.digest() | ||||
| 
 | ||||
| 
 | ||||
|     def load(self): | ||||
| @ -32,24 +23,24 @@ class Attachment(Data): | ||||
|             f = open(fp, 'rb') | ||||
|             r = f.read() | ||||
|             f.close() | ||||
|             self.contents.append(fp) | ||||
| 
 | ||||
|             z = self.__hasher(r) | ||||
|             self.digests.append(z) | ||||
|             z = self.hash(r).hex() | ||||
|             self.contents[z] = fp | ||||
| 
 | ||||
|             logg.debug('loaded attachment file {} digest {}'.format(fp, z.hex())) | ||||
|             logg.debug('loaded attachment file {} digest {}'.format(fp, z)) | ||||
| 
 | ||||
| 
 | ||||
|     def start(self): | ||||
|         super(Attachment, self).start() | ||||
| 
 | ||||
|         os.makedirs(self.attachment_path) | ||||
| 
 | ||||
| 
 | ||||
|     def get(self): | ||||
|         def maphex(v): | ||||
|             return v.hex() | ||||
|         return list(map(maphex, self.digests)) | ||||
|     def get(self, k): | ||||
|         return self.contents[k] | ||||
| 
 | ||||
| 
 | ||||
|     def asdict(self): | ||||
|         return self.contents | ||||
| 
 | ||||
| 
 | ||||
|     def __str__(self): | ||||
|  | ||||
							
								
								
									
										12
									
								
								cic/base.py
									
									
									
									
									
								
							
							
						
						
									
										12
									
								
								cic/base.py
									
									
									
									
									
								
							| @ -1,5 +1,6 @@ | ||||
| # standard imports | ||||
| import os | ||||
| import hashlib | ||||
| 
 | ||||
| 
 | ||||
| mod_dir = os.path.dirname(os.path.realpath(__file__)) | ||||
| @ -17,6 +18,17 @@ class Data: | ||||
|         self.dirty = False | ||||
|         self.inited = False | ||||
|         self.__version = self.__default_version | ||||
|         self.__hasher = self.__basehasher | ||||
| 
 | ||||
| 
 | ||||
|     def __basehasher(self, v): | ||||
|         h = hashlib.sha256() | ||||
|         h.update(v) | ||||
|         return h.digest() | ||||
| 
 | ||||
| 
 | ||||
|     def hash(self, v): | ||||
|         return self.__hasher(v) | ||||
| 
 | ||||
| 
 | ||||
|     def load(self): | ||||
|  | ||||
| @ -27,9 +27,9 @@ def execute(config, eargs): | ||||
|     cmd_mod = importlib.import_module(modname) | ||||
| 
 | ||||
|     ct = Token(path=eargs.directory) | ||||
|     cp = Proof(path=eargs.directory) | ||||
|     cm = Meta(path=eargs.directory) | ||||
|     ca = Attachment(path=eargs.directory) | ||||
|     cp = Proof(path=eargs.directory, attachments=ca) | ||||
|     cn = Network(path=eargs.directory) | ||||
| 
 | ||||
|     ct.load() | ||||
| @ -40,4 +40,4 @@ def execute(config, eargs): | ||||
| 
 | ||||
|     ref = cn.reference(eargs.target) | ||||
|     logg.debug('found reference {} for target {}'.format(ref, eargs.target)) | ||||
|     getattr(cmd_mod, 'new')(ref, ca.get(), signer_hint=eargs.signer) | ||||
|     getattr(cmd_mod, 'new')(ref, cp, signer_hint=eargs.signer) | ||||
|  | ||||
| @ -22,11 +22,11 @@ logg = logging.getLogger(__name__) | ||||
| 
 | ||||
| class CICEth: | ||||
| 
 | ||||
|     def __init__(self, chain_spec, resources, proofs, signer=None, rpc=None, nonce_oracle=None, fee_oracle=None): | ||||
|     def __init__(self, chain_spec, resources, proof, signer=None, rpc=None, nonce_oracle=None, fee_oracle=None): | ||||
|         """resources will be modified | ||||
|         """ | ||||
|         self.resources = resources | ||||
|         self.proofs = proofs | ||||
|         self.proof = proof | ||||
|         self.chain_spec = chain_spec | ||||
|         self.signer = signer | ||||
|         self.rpc = rpc | ||||
| @ -170,7 +170,7 @@ class CICEth: | ||||
|         signer_address = self.resources['address_declarator']['key_address'] | ||||
| 
 | ||||
|         r = [] | ||||
|         for proof in self.proofs: | ||||
|         for proof in self.proof.get(): | ||||
|             o = c.add_declaration(contract_address, signer_address, self.token_address, proof, tx_format=self.tx_format) | ||||
|             if self.rpc != None: | ||||
|                 r.append(self.rpc.do(o[1])) | ||||
| @ -198,5 +198,5 @@ class CICEth: | ||||
|             getattr(self, 'process_̈́ ' + task)() | ||||
| 
 | ||||
| 
 | ||||
| def new(resources, proofs, signer_hint=None): | ||||
|     return CICEth(resources, proofs, signer=None) | ||||
| def new(resources, proof, signer_hint=None): | ||||
|     return CICEth(resources, proof, signer=None) | ||||
|  | ||||
							
								
								
									
										48
									
								
								cic/proof.py
									
									
									
									
									
								
							
							
						
						
									
										48
									
								
								cic/proof.py
									
									
									
									
									
								
							| @ -2,6 +2,11 @@ | ||||
| import os | ||||
| import json | ||||
| import logging | ||||
| import tempfile | ||||
| import cbor2 | ||||
| 
 | ||||
| # external imports | ||||
| from hexathon import strip_0x | ||||
| 
 | ||||
| # local imports | ||||
| from .base import * | ||||
| @ -11,12 +16,15 @@ logg = logging.getLogger(__name__) | ||||
| 
 | ||||
| class Proof(Data): | ||||
| 
 | ||||
|     def __init__(self, path='.'): | ||||
|     def __init__(self, path='.', attachments=None): | ||||
|         super(Proof, self).__init__() | ||||
|         self.namespace = 'ge' | ||||
|         self.description = None | ||||
|         self.path = path | ||||
|         self.extra_attachments = attachments | ||||
|         self.attachments = {} | ||||
|         self.proof_path = os.path.join(self.path, 'proof.json') | ||||
|         self.temp_proof_path = tempfile.mkstemp()[1] | ||||
|                  | ||||
| 
 | ||||
|     def load(self): | ||||
| @ -46,6 +54,42 @@ class Proof(Data): | ||||
|         json.dump(o, f) | ||||
|         f.close() | ||||
| 
 | ||||
|      | ||||
| 
 | ||||
|     def asdict(self): | ||||
|         return { | ||||
|             'version': self.version(), | ||||
|             'namespace': self.namespace, | ||||
|             'description': self.description, | ||||
|                 } | ||||
| 
 | ||||
| 
 | ||||
|     def __get_ordered_hashes(self): | ||||
|         ks = list(self.attachments.keys()) | ||||
|         ks.sort() | ||||
| 
 | ||||
|         return ks | ||||
| 
 | ||||
| 
 | ||||
|     def get(self): | ||||
|         v = self.asdict()  | ||||
|         b = cbor2.dumps(v) | ||||
| 
 | ||||
|         f = open(self.temp_proof_path, 'wb') | ||||
|         f.write(b) | ||||
|         f.close() | ||||
| 
 | ||||
|         hsh = self.hash(b).hex() | ||||
|         self.attachments[hsh] = self.temp_proof_path | ||||
| 
 | ||||
|         if self.extra_attachments != None: | ||||
|             a = self.extra_attachments.asdict() | ||||
|             for k in a.keys(): | ||||
|                 self.attachments[k] = a[k] | ||||
| 
 | ||||
|         hshs = self.__get_ordered_hashes() | ||||
|          | ||||
|         return hshs | ||||
| 
 | ||||
| 
 | ||||
|     def __str__(self): | ||||
|         return "description = {}\n".format(self.description) | ||||
|  | ||||
| @ -1,7 +1,7 @@ | ||||
| # standard imports | ||||
| import unittest | ||||
| import logging | ||||
| # standard imports import unittestimport logging | ||||
| import random | ||||
| import os | ||||
| import logging | ||||
| 
 | ||||
| # external imports | ||||
| from chainlib.chain import ChainSpec | ||||
| @ -14,6 +14,11 @@ from funga.eth.keystore.dict import DictKeystore | ||||
| 
 | ||||
| # local imports | ||||
| from cic.ext.eth import CICEth | ||||
| from cic import Proof | ||||
| from cic.attachment import Attachment | ||||
| 
 | ||||
| # test imports | ||||
| from tests.base_cic import test_data_dir | ||||
| 
 | ||||
| logg = logging.getLogger(__name__) | ||||
| 
 | ||||
| @ -40,6 +45,8 @@ class TestCICEthBase(EthTesterCase): | ||||
|                 'key_address': addresses[2], | ||||
|                 }, | ||||
|         } | ||||
|         self.proofs = [] | ||||
|         for i in range(3): | ||||
|             self.proofs.append(random.randbytes(32).hex()) | ||||
|         proof_dir = os.path.join(test_data_dir, 'proof') | ||||
|         attach = Attachment(path=proof_dir) | ||||
|         attach.load() | ||||
|         self.proofs = Proof(proof_dir, attachments=attach) | ||||
|         self.proofs.load() | ||||
|  | ||||
							
								
								
									
										5
									
								
								tests/testdata/proof/proof.json
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										5
									
								
								tests/testdata/proof/proof.json
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @ -0,0 +1,5 @@ | ||||
| { | ||||
| 	"version": 0, | ||||
| 	"namespace": "ge", | ||||
| 	"description": "foo bar baz" | ||||
| } | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user