Solidity Syntax - Version, Import, Types, Control Structures
Solidity is a contract-oriented programming language used for writing smart contracts on the Ethereum blockchain. In this tutorial, we will discuss the syntax of Solidity.
Version Pragma
Version pragma specifies the version of the compiler that should be used to compile the contract. It is recommended to use the latest version available.
Example:
pragma solidity ^0.5.2;
The above code will compile with a compiler version >= 0.5.2 and < 0.6.0.
Import Files
Import statements allow us to use code from other Solidity files. There are three types of import statements:
- Import all symbols from a file:
import "filename"
- Import all symbols from a file and assign a symbol to the file:
import * as symbolName from "filename";
or
import "filename" as symbolName;
- Import only selected symbols from a file:
import {symbol1 as alias, symbol2} from "filename";
Types
Solidity supports several data types, which include:
Boolean
The bool
type in Solidity can have the values true
or false
.
Operators:
- Logical:
!
(logical negation),&&
(AND),||
(OR) - Comparisons:
==
(equality),!=
(inequality)
Example:
bool x = true;
bool y = false;
Integer
Solidity supports both unsigned and signed integers.
Unsigned: uint8
, uint16
, uint32
, uint64
, uint128
, uint256
.
Signed: int8
, int16
, int32
, int64
, int128
, int256
.
Operators:
- Comparisons:
<=
,<
,==
,!=
,>=
and>
- Bit operators:
&
,|
,^
(bitwise exclusive or) and~
(bitwise negation) - Arithmetic operators:
+
,**, unary **
, unary+
, ``,/
,%
,*
(exponentiation),<<
(left shift) and>>
(right shift)
Example:
uint256 a = 10;
int256 b = -20;
Address
The address
type in Solidity holds an Ethereum address (20-byte value).
The address payable
type is similar to address
but includes additional methods transfer
and send
.
Operators:
- Comparisons:
<=
,<
,==
,!=
,>=
and>
Methods:
balance
:address.balance
returns the balance of the address in Wei.transfer
:address.transfer(amount)
sends the given amount of Wei to the address and throws on failure.send
:address.send(amount) returns (bool)
sends the given amount of Wei to the address and returnsfalse
on failure.call
:address.call(...)
issues a low-levelCALL
and returnsfalse
on failure.delegatecall
:address.delegatecall(...)
issues a low-levelDELEGATECALL
and returnsfalse
on failure.
Example:
address payable x = address(0x1234567890123456789012345678901234567890);
Array
Solidity supports both dynamic and fixed-sized arrays.
Example:
uint[] dynamicSizeArray;
uint[7] fixedSizeArray;
Fixed Byte Arrays
Fixed byte arrays are declared using the syntax bytesI
, where I is an integer between 1 and 32, inclusive. They are used to store binary data of a fixed length. The byte array can be accessed using its index, which starts from 0.
bytes1 myByte;
bytes32 myBytes;
myByte[0] = 0x12;
myBytes[31] = 0xff;
Dynamic Byte Arrays
Dynamic byte arrays are declared using the bytes
keyword. They are used to store binary data of a variable length. The byte array can be accessed using its index, which starts from 0. It is similar to the byte[]
type.
bytes myBytes;
myBytes.push(0x12);
myBytes.push(0xff);