wei, finney, szabo, ether
A literal number can take a suffix of wei
, finney
, szabo
or ether
to convert between the subdenominations of Ether, where Ether currency numbers without a postfix are assumed to be "wei", e.g. 2 ether == 2000 finney
evaluates to true
.
time, seconds, minutes, hours, days, weeks, years
Suffixes of seconds
, minutes
, hours
, days
, weeks
and years after literal numbers can be used to convert between units of time where seconds are the base unit and units are considered naively in the following way:
1 == 1 second
1 minutes == 60 seconds
1 hours == 60 minutes
1 days == 24 hours
1 weeks = 7 days
1 years = 365 days
Take care if you perform calendar calculations using these units, because not every year equals 365 days and not even every day has 24 hours because of leap seconds. Due to the fact that leap seconds cannot be predicted, an exact calendar library has to be updated by an external oracle.
These suffixes cannot be applied to variables. If you want to interpret some input variable in e.g. days, you can do it in the following way:
function f(uint start, uint daysAfter) {
if (now >= start + daysAfter * 1 days) { ... }
}
There are special variables and functions which always exist in the global namespace and are mainly used to provide information about the blockchain.
block, coinbase, difficulty, number, block;number, timestamp, block;timestamp, msg, data, gas, sender, value, now, gas price, origin
block.coinbase
(address
): current block miner's addressblock.difficulty
(uint
): current block difficultyblock.gaslimit
(uint
): current block gaslimitblock.number
(uint
): current block numberblock.blockhash
(function(uint) returns (bytes32)
): hash of the given block - only for 256 most recent blocksblock.timestamp
(uint
): current block timestampmsg.data
(bytes
): complete calldatamsg.gas
(uint
): remaining gasmsg.sender
(address
): sender of the message (current call)msg.sig
(bytes4
): first four bytes of the calldata (i.e. function identifier)msg.value
(uint
): number of wei sent with the messagenow
(uint
): current block timestamp (alias forblock.timestamp
)tx.gasprice
(uint
): gas price of the transactiontx.origin
(address
): sender of the transaction (full call chain)
Note
The values of all members of msg
, including msg.sender
and msg.value
can change for every external function call. This includes calls to library functions.
If you want to implement access restrictions in library functions using msg.sender
, you have to manually supply the value of msg.sender
as an argument.
Note
The block hashes are not available for all blocks for scalability reasons. You can only access the hashes of the most recent 256 blocks, all other values will be zero.
sha3, ripemd160, sha256, ecrecover, addmod, mulmod, cryptography, this, super, selfdestruct, balance, send
addmod(uint x, uint y, uint k) returns (uint)
:compute
(x + y) % k
where the addition is performed with arbitrary precision and does not wrap around at2**256
.mulmod(uint x, uint y, uint k) returns (uint)
:compute
(x * y) % k
where the multiplication is performed with arbitrary precision and does not wrap around at2**256
.sha3(...) returns (bytes32)
:compute the Ethereum-SHA-3 hash of the (tightly packed) arguments
sha256(...) returns (bytes32)
:compute the SHA-256 hash of the (tightly packed) arguments
ripemd160(...) returns (bytes20)
:compute RIPEMD-160 hash of the (tightly packed) arguments
ecrecover(bytes32 data, uint8 v, bytes32 r, bytes32 s) returns (address)
:recover the address associated with the public key from elliptic curve signature
In the above, "tightly packed" means that the arguments are concatenated without padding. This means that the following are all identical:
sha3("ab", "c")
sha3("abc")
sha3(0x616263)
sha3(6382179)
sha3(97, 98, 99)
If padding is needed, explicit type conversions can be used: sha3("\x00\x12")
is the same as sha3(uint16(0x12))
.
It might be that you run into Out-of-Gas for sha256
, ripemd160
or ecrecover
on a private blockchain. The reason for this is that those are implemented as so-called precompiled contracts and these contracts only really exist after they received the first message (although their contract code is hardcoded). Messages to non-existing contracts are more expensive and thus the execution runs into an Out-of-Gas error. A workaround for this problem is to first send e.g. 1 Wei to each of the contracts before you use them in your actual contracts. This is not an issue on the official or test net.
this, selfdestruct
this
(current contract's type):the current contract, explicitly convertible to
address
selfdestruct(address)
:destroy the current contract, sending its funds to the given
address
Furthermore, all functions of the current contract are callable directly including the current function.