Arbitrum Rollup supports EVM transactions, and therefore allows you to trustlessly deploy Solidity contracts (as well as Vyper or any other language that compile to EVM). Arbitrum supports almost all Solidity code as expected with a few exceptions that we detail below.
Differences from Solidity on Ethereum
Although Arbitrum supports Solidity code, there are differences in the effects of a few operations, including language features that don't make much sense in the Layer 2 context.
tx.gaspricereturns the user’s ArbGas price bid
blockhash(x)returns Arbitrum blockhash, a value deterministically generated from the state of the inbox. Note that the Arbitrum blockhash is not dependent on the L1 blockhash, and thus should not be assumed to have any economic security (as a randomness seed, say)
block.difficultyreturns the constant 2500000000000000
block.gaslimitreturns the block's ArbGas limit
gasleftreturns the amount of ArbGas remaining
block.numberon a non-Sequencer Arbitrum chain, returns the L1 block number at which the transaction was submitted to the inbox; on a Sequencer Arbitrum chain, returns an "estimate" of the L1 block number at which the Sequencer received the transaction (see Time in Arbitrum)
msg.senderworks the same way it does on Ethereum for normal L2-to-L2 transactions; for L1-to-L2 "retryable ticket" transactions, it will return the L2 address alias of the L1 contract that triggered the message. See retryable ticket address aliasing for more.
block.timestamp. For the semantics of these features in the Arbitrum context, please see Time in Arbitrum.