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);
Enum
An enum is a custom data type that allows a developer to define a set of named values. It is declared using the enum
keyword followed by the name of the enum and the values.
enum ActionChoices {
GoLeft,
GoRight,
GoStraight,
SitStill
}
ActionChoices choice = ActionChoices.GoStraight;
Struct
A struct is a user-defined data type that groups together variables of different data types. It is declared using the struct
keyword, followed by the name of the struct and the variables.
struct Funder {
address addr;
uint amount;
}
Funder funders;
funders.addr = 0x123;
funders.amount = 1000;
Mapping
A mapping is a data structure that maps a key to a value. It is declared using the mapping
keyword, followed by the data type of the key and the data type of the value.
mapping(address => uint) balances;
balances[0x123] = 1000;
Control Structures
Solidity supports most of the control structures from JavaScript, such as if
, else
, while
, do
, for
, break
, continue
, return
, and the ternary operator ?:
. However, the switch
and goto
statements are not supported.
if (x > 10) {
// do something
} else {
// do something else
}
while (i < 10) {
// do something
i++;
}
for (uint i = 0; i < 10; i++) {
// do something
}
return 42;