def _apply_msg(ext, msg, code): trace_msg = log_msg.is_active("trace") if trace_msg: log_msg.debug( "MSG APPLY", sender=encode_hex(msg.sender), to=encode_hex(msg.to), gas=msg.gas, value=msg.value, codelen=len(code), data=encode_hex(msg.data.extract_all()) if msg.data.size < 2500 else ("data<%d>" % msg.data.size), pre_storage=ext.log_storage(msg.to), static=msg.static, depth=msg.depth, gas_token_id=msg.gas_token_id, transfer_token_id=msg.transfer_token_id, ) # early exit if msg.sender is disallowed if transfer_failure_by_posw_balance_check(ext, msg): log_msg.warn("SENDER NOT ALLOWED", sender=encode_hex(msg.sender)) return 0, 0, [] # transfer value, quit if not enough snapshot = ext.snapshot() if msg.transfers_value: if not ext.transfer_value(msg.sender, msg.to, msg.transfer_token_id, msg.value): log_msg.debug( "MSG TRANSFER FAILED", have=ext.get_balance(msg.sender, token_id=msg.transfer_token_id), want=msg.value, ) # TODO: Why return success if the transfer failed? return 1, msg.gas, [] # Main loop if msg.code_address in ext.specials: res, gas, dat = ext.specials[msg.code_address](ext, msg) else: res, gas, dat = vm.vm_execute(ext, msg, code) if trace_msg: log_msg.debug( "MSG APPLIED", gas_remained=gas, sender=encode_hex(msg.sender), to=encode_hex(msg.to), data=dat if len(dat) < 2500 else ("data<%d>" % len(dat)), post_storage=ext.log_storage(msg.to), ) if res == 0: log_msg.debug("REVERTING") ext.revert(snapshot) return res, gas, dat
def _apply_msg(ext, msg, code): trace_msg = log_msg.is_active('trace') if trace_msg: log_msg.debug("MSG APPLY", sender=encode_hex(msg.sender), to=encode_hex(msg.to), gas=msg.gas, value=msg.value, codelen=len(code), data=encode_hex( msg.data.extract_all()) if msg.data.size < 2500 else ( "data<%d>" % msg.data.size), pre_storage=ext.log_storage(msg.to), static=msg.static, depth=msg.depth) # transfer value, quit if not enough snapshot = ext.snapshot() if msg.transfers_value: if msg.is_cross_shard: if not ext.deduct_value(msg.sender, msg.value): return 1, msg.gas, [] ext.add_cross_shard_transaction_deposit( quarkchain.core.CrossShardTransactionDeposit( tx_hash=msg.tx_hash, from_address=quarkchain.core.Address(msg.sender, msg.from_full_shard_id), to_address=quarkchain.core.Address(msg.to, msg.to_full_shard_id), value=msg.value, gas_price=ext.tx_gasprice) ) elif not ext.transfer_value(msg.sender, msg.to, msg.value): log_msg.debug('MSG TRANSFER FAILED', have=ext.get_balance(msg.to), want=msg.value) return 1, msg.gas, [] if msg.is_cross_shard: # Cross shard contract call is not supported return 1, msg.gas, [] # Main loop if msg.code_address in ext.specials: res, gas, dat = ext.specials[msg.code_address](ext, msg) else: res, gas, dat = vm.vm_execute(ext, msg, code) if trace_msg: log_msg.debug('MSG APPLIED', gas_remained=gas, sender=encode_hex(msg.sender), to=encode_hex(msg.to), data=dat if len(dat) < 2500 else ("data<%d>" % len(dat)), post_storage=ext.log_storage(msg.to)) if res == 0: log_msg.debug('REVERTING') ext.revert(snapshot) return res, gas, dat
def _apply_msg(ext, msg, code): trace_msg = log_msg.is_active("trace") if trace_msg: log_msg.debug( "MSG APPLY", sender=encode_hex(msg.sender), to=encode_hex(msg.to), gas=msg.gas, value=msg.value, codelen=len(code), data=encode_hex(msg.data.extract_all()) if msg.data.size < 2500 else ("data<%d>" % msg.data.size), pre_storage=ext.log_storage(msg.to), static=msg.static, depth=msg.depth, gas_token_id=msg.gas_token_id, transfer_token_id=msg.transfer_token_id, ) # early exit if msg.sender is disallowed if transfer_failure_by_posw_balance_check(ext, msg): log_msg.warn("SENDER NOT ALLOWED", sender=encode_hex(msg.sender)) return 0, 0, [] # transfer value, quit if not enough snapshot = ext.snapshot() if msg.transfers_value: if not ext.transfer_value(msg.sender, msg.to, msg.transfer_token_id, msg.value): log_msg.debug( "MSG TRANSFER FAILED", have=ext.get_balance(msg.sender, token_id=msg.transfer_token_id), want=msg.value, ) return 0, 0, [] # Main loop special_proc, enable_ts = ext.specials.get(msg.code_address, (None, 0)) if special_proc and ext.block_timestamp > enable_ts: res, gas, dat = special_proc(ext, msg) else: res, gas, dat = vm.vm_execute(ext, msg, code) if trace_msg: log_msg.debug( "MSG APPLIED", gas_remained=gas, sender=encode_hex(msg.sender), to=encode_hex(msg.to), data=dat if len(dat) < 2500 else ("data<%d>" % len(dat)), post_storage=ext.log_storage(msg.to), ) if (res == 1 and code != b"" and msg.transfer_token_id != ext.default_chain_token and not msg.token_id_queried and msg.value != 0): res = 0 if res == 0: log_msg.debug("REVERTING") ext.revert(snapshot) return res, gas, dat
def _apply_msg(ext, msg, code): trace_msg = log_msg.is_active("trace") if trace_msg: log_msg.debug( "MSG APPLY", sender=encode_hex(msg.sender), to=encode_hex(msg.to), gas=msg.gas, value=msg.value, codelen=len(code), data=encode_hex(msg.data.extract_all()) if msg.data.size < 2500 else ("data<%d>" % msg.data.size), pre_storage=ext.log_storage(msg.to), static=msg.static, depth=msg.depth, gas_token_id=msg.gas_token_id, transfer_token_id=msg.transfer_token_id, ) # early exit if msg.sender is disallowed if msg.sender in ext.sender_disallow_list: log_msg.warn("SENDER NOT ALLOWED", sender=encode_hex(msg.sender)) return 0, 0, [] # transfer value, quit if not enough snapshot = ext.snapshot() if msg.transfers_value: if msg.is_cross_shard: if not ext.deduct_value(msg.sender, msg.transfer_token_id, msg.value): return 1, msg.gas, [] ext.add_cross_shard_transaction_deposit( quarkchain.core.CrossShardTransactionDeposit( tx_hash=msg.tx_hash, from_address=quarkchain.core.Address( msg.sender, msg.from_full_shard_key ), to_address=quarkchain.core.Address(msg.to, msg.to_full_shard_key), value=msg.value, gas_price=ext.tx_gasprice, gas_token_id=msg.gas_token_id, transfer_token_id=msg.transfer_token_id, ) ) elif not ext.transfer_value( msg.sender, msg.to, msg.transfer_token_id, msg.value ): log_msg.debug( "MSG TRANSFER FAILED", have=ext.get_balance(msg.sender, token_id=msg.transfer_token_id), want=msg.value, ) return 1, msg.gas, [] if msg.is_cross_shard: # Cross shard contract call is not supported return 1, msg.gas, [] if msg.transfer_token_id != ext.default_state_token: # TODODLL calling smart contract with non QKC transfer_token_id is not supported return 1, msg.gas, [] # Main loop if msg.code_address in ext.specials: res, gas, dat = ext.specials[msg.code_address](ext, msg) else: res, gas, dat = vm.vm_execute(ext, msg, code) if trace_msg: log_msg.debug( "MSG APPLIED", gas_remained=gas, sender=encode_hex(msg.sender), to=encode_hex(msg.to), data=dat if len(dat) < 2500 else ("data<%d>" % len(dat)), post_storage=ext.log_storage(msg.to), ) if res == 0: log_msg.debug("REVERTING") ext.revert(snapshot) return res, gas, dat