コード例 #1
0
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
コード例 #2
0
ファイル: messages.py プロジェクト: yoyo52/pyquarkchain
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
コード例 #3
0
ファイル: messages.py プロジェクト: QuarkChain/pyquarkchain
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
コード例 #4
0
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