def test_verification_overall_checksum(): """ Tamper with the overall checksum and see failures in verify_precompiled_checksums() """ manager = ContractManager(contracts_source_path()) manager.checksum_contracts() manager.verify_precompiled_checksums(contracts_precompiled_path()) original_checksum = manager.overall_checksum # We change the source code overall checksum manager.overall_checksum += '2' # Now the verification should fail with pytest.raises(ContractManagerVerificationError): manager.verify_precompiled_checksums(contracts_precompiled_path()) manager.overall_checksum = None with pytest.raises(ContractManagerVerificationError): manager.verify_precompiled_checksums(contracts_precompiled_path()) manager.overall_checksum = '' with pytest.raises(ContractManagerVerificationError): manager.verify_precompiled_checksums(contracts_precompiled_path()) checksum_fail = list(original_checksum) # Replace the first char with a different one checksum_fail[0] = list(filter(lambda x: x != checksum_fail[0], ['2', 'a']))[0] manager.overall_checksum = "".join(checksum_fail) with pytest.raises(ContractManagerVerificationError): manager.verify_precompiled_checksums(contracts_precompiled_path()) manager.overall_checksum = original_checksum manager.verify_precompiled_checksums(contracts_precompiled_path())
def test_verification_contracts_checksums(): """ Tamper with the contract checksums and see failures in verify_precompiled_checksums() """ manager = ContractManager(contracts_source_path()) manager.checksum_contracts() manager.verify_precompiled_checksums(contracts_precompiled_path()) for contract, checksum in manager.contracts_checksums.items(): manager.contracts_checksums[contract] += '2' with pytest.raises(ContractManagerVerificationError): manager.verify_precompiled_checksums(contracts_precompiled_path()) manager.contracts_checksums[contract] = None with pytest.raises(ContractManagerVerificationError): manager.verify_precompiled_checksums(contracts_precompiled_path()) manager.contracts_checksums[contract] = '' with pytest.raises(ContractManagerVerificationError): manager.verify_precompiled_checksums(contracts_precompiled_path()) checksum_fail = list(checksum) # Replace the first char with a different one checksum_fail[0] = list(filter(lambda x: x != checksum_fail[0], ['2', 'a']))[0] manager.contracts_checksums[contract] = "".join(checksum_fail) with pytest.raises(ContractManagerVerificationError): manager.verify_precompiled_checksums(contracts_precompiled_path()) manager.contracts_checksums[contract] = checksum manager.verify_precompiled_checksums(contracts_precompiled_path())
def __init__( self, web3: Web3, private_key: str, gas_limit: int, gas_price: int=1, wait: int=10, contracts_version: Optional[str]=None, ): self.web3 = web3 self.wait = wait self.owner = private_key_to_address(private_key) self.transaction = {'from': self.owner, 'gas': gas_limit} if gas_price != 0: self.transaction['gasPrice'] = gas_price * denoms.gwei self.contracts_version = contracts_version self.precompiled_path = contracts_precompiled_path(self.contracts_version) self.contract_manager = ContractManager(self.precompiled_path) self.web3.middleware_stack.add( construct_sign_and_send_raw_middleware(private_key), ) # Check that the precompiled data matches the source code # Only for current version, because this is the only one with source code if self.contracts_version in [None, CONTRACTS_VERSION]: contract_manager_source = ContractManager(contracts_source_path()) contract_manager_source.checksum_contracts() contract_manager_source.verify_precompiled_checksums(self.precompiled_path) else: log.info('Skipped checks against the source code because it is not available.')
def test_verification_contracts_checksums(): manager = ContractManager(CONTRACTS_SOURCE_DIRS) manager.checksum_contracts() manager.verify_precompiled_checksums(CONTRACTS_PRECOMPILED_PATH) for contract, checksum in manager.contracts_checksums.items(): manager.contracts_checksums[contract] += '2' with pytest.raises(ContractManagerVerificationError): manager.verify_precompiled_checksums(CONTRACTS_PRECOMPILED_PATH) manager.contracts_checksums[contract] = None with pytest.raises(ContractManagerVerificationError): manager.verify_precompiled_checksums(CONTRACTS_PRECOMPILED_PATH) manager.contracts_checksums[contract] = '' with pytest.raises(ContractManagerVerificationError): manager.verify_precompiled_checksums(CONTRACTS_PRECOMPILED_PATH) checksum_fail = list(checksum) # Replace the first char with a different one checksum_fail[0] = list( filter(lambda x: x != checksum_fail[0], ['2', 'a']))[0] manager.contracts_checksums[contract] = "".join(checksum_fail) with pytest.raises(ContractManagerVerificationError): manager.verify_precompiled_checksums(CONTRACTS_PRECOMPILED_PATH) manager.contracts_checksums[contract] = checksum manager.verify_precompiled_checksums(CONTRACTS_PRECOMPILED_PATH)
def test_verification_overall_checksum(): manager = ContractManager(CONTRACTS_SOURCE_DIRS) manager.checksum_contracts() manager.verify_precompiled_checksums(CONTRACTS_PRECOMPILED_PATH) original_checksum = manager.overall_checksum # We change the source code overall checksum manager.overall_checksum += '2' # Now the verification should fail with pytest.raises(ContractManagerVerificationError): manager.verify_precompiled_checksums(CONTRACTS_PRECOMPILED_PATH) manager.overall_checksum = None with pytest.raises(ContractManagerVerificationError): manager.verify_precompiled_checksums(CONTRACTS_PRECOMPILED_PATH) manager.overall_checksum = '' with pytest.raises(ContractManagerVerificationError): manager.verify_precompiled_checksums(CONTRACTS_PRECOMPILED_PATH) checksum_fail = list(original_checksum) # Replace the first char with a different one checksum_fail[0] = list(filter(lambda x: x != checksum_fail[0], ['2', 'a']))[0] manager.overall_checksum = "".join(checksum_fail) with pytest.raises(ContractManagerVerificationError): manager.verify_precompiled_checksums(CONTRACTS_PRECOMPILED_PATH) manager.overall_checksum = original_checksum manager.verify_precompiled_checksums(CONTRACTS_PRECOMPILED_PATH)
class ContractDeployer: def __init__( self, web3: Web3, private_key: str, gas_limit: int, gas_price: int = 1, wait: int = 10, ): self.web3 = web3 self.private_key = private_key self.wait = wait owner = private_key_to_address(private_key) self.transaction = {'from': owner, 'gas_limit': gas_limit} if gas_price != 0: self.transaction['gasPrice'] = gas_price * denoms.gwei self.contract_manager = ContractManager(CONTRACTS_PRECOMPILED_PATH) # Check that the precompiled data is correct self.contract_manager = ContractManager(CONTRACTS_SOURCE_DIRS) self.contract_manager.checksum_contracts() self.contract_manager.verify_precompiled_checksums( CONTRACTS_PRECOMPILED_PATH) def deploy( self, contract_name: str, args=None, ): if args is None: args = list() contract_interface = self.contract_manager.get_contract( contract_name, ) # Instantiate and deploy contract contract = self.web3.eth.contract( abi=contract_interface['abi'], bytecode=contract_interface['bin'], ) contract = PrivateContract(contract) # Get transaction hash from deployed contract txhash = contract.constructor(*args).transact( self.transaction, private_key=self.private_key, ) # Get tx receipt to get contract address log.debug("Deploying %s txHash=%s" % (contract_name, encode_hex(txhash))) receipt = check_succesful_tx(self.web3, txhash, self.wait) log.info( '{0} address: {1}. Gas used: {2}'.format( contract_name, receipt['contractAddress'], receipt['gasUsed'], ), ) return receipt['contractAddress']
def run(self): from raiden_contracts.contract_manager import ( ContractManager, contracts_precompiled_path, contracts_source_path, ) manager = ContractManager(contracts_source_path()) manager.checksum_contracts() manager.verify_precompiled_checksums(contracts_precompiled_path())
def run(self): from raiden_contracts.contract_manager import ( ContractManager, CONTRACTS_PRECOMPILED_PATH, CONTRACTS_SOURCE_DIRS, ) manager = ContractManager(CONTRACTS_SOURCE_DIRS) manager.checksum_contracts() manager.verify_precompiled_checksums(CONTRACTS_PRECOMPILED_PATH)
class ContractDeployer: def __init__( self, web3: Web3, private_key: str, gas_limit: int, gas_price: int = 1, wait: int = 10, contracts_version: Optional[str] = None, ): self.web3 = web3 self.private_key = private_key self.wait = wait self.owner = private_key_to_address(private_key) self.transaction = {'from': self.owner, 'gas_limit': gas_limit} if gas_price != 0: self.transaction['gasPrice'] = gas_price * denoms.gwei self.contracts_version = contracts_version self.precompiled_path = contracts_precompiled_path( self.contracts_version) self.contract_manager = ContractManager(self.precompiled_path) # Check that the precompiled data is correct self.contract_manager = ContractManager(contracts_source_path()) self.contract_manager.checksum_contracts() self.contract_manager.verify_precompiled_checksums( self.precompiled_path) def deploy( self, contract_name: str, args=None, ): if args is None: args = list() contract_interface = self.contract_manager.get_contract( contract_name, ) # Instantiate and deploy contract contract = self.web3.eth.contract( abi=contract_interface['abi'], bytecode=contract_interface['bin'], ) contract = PrivateContract(contract) # Get transaction hash from deployed contract txhash = self.send_deployment_transaction(contract, args) # Get tx receipt to get contract address log.debug("Deploying %s txHash=%s" % (contract_name, encode_hex(txhash))) receipt = check_succesful_tx(self.web3, txhash, self.wait) log.info( '{0} address: {1}. Gas used: {2}'.format( contract_name, receipt['contractAddress'], receipt['gasUsed'], ), ) return receipt def send_deployment_transaction(self, contract, args): txhash = None while txhash is None: try: txhash = contract.constructor(*args).transact( self.transaction, private_key=self.private_key, ) except ValueError as ex: if ex.args[0]['code'] == -32015: log.info(f'Deployment failed with {ex}. Retrying...') else: raise ex return txhash