Skip to content

Data Types and Data Structures in Solidity

Solidity is an object-oriented, high-level, and compiled programming language. writing smart contractsin addition to Building and Deploying Dapps on totally different blockchains.

Like every other programming language, Solidity additionally has its personal set of options. information sorts And information constructionsHowever with a unique syntax and utility.

This tutorial will talk about a number of the mostly used information sorts and information constructions within the Solidity programming language.

Nature of Solidity information sorts

Solidity is in nature a statically typed, strongly typed language that performs kind checking earlier than the supply code is executed.

As a statically typed languageSolidity requires the programmer to declare the information kind of every variable earlier than compiling the code (compile-time).

whereas Solidity as a strongly typed language Which means that the information kind of a variable can’t be modified or transformed to a different information kind throughout the program.

solidity information sorts

Solidity, like different programming languages, divides its information sorts into two classes: worth kind And reference kind,

worth kind in solidity

Worth kind variable is the one which shops the information immediately A lot Reminiscence allotted to itself.

These sorts are handed by worth, which implies they’re copied any time they’re assigned to a brand new variable or equipped as an argument to a operate and any adjustments made to the brand new copies Additionally adjustments don’t have an effect on the unique information.

pass by value

1.) integer

The integer information kind in Solidity is used to retailer integer values. An integer kind is additional grouped int right here And uint used to declare Put signature on And unsigned Varieties of integers respectively.

I. integer/signed integer

int The key phrase is used to declare unsigned integers. Signed integer is an information kind that may maintain each optimistic and damaging integer values ​​in sensible contracts.


pragma solidity ^ 0.8.13;

contract Signed_Integer_Example
    int yr = 2022; 
    int temperature = -89; 

Second. uint/unsigned int

uint The key phrase is used to declare an unsigned integer. Unsigned integer is an information kind that may solely maintain optimistic integer values ​​in sensible contracts.


pragma solidity ^ 0.8.13;

contract Unsigned_Integer_Example
    uint yr = 2022; 
    uint temperature = -89; 

While you attempt to assign a damaging worth to an unsigned information kind, you’ll get the next TypeError Message:

TypeError: Sort int_const -89 is not implicitly convertible to anticipated kind uint256. Can't implicitly convert signed literal to an unsigned kind.

2.) bytes

Bytes in Solidity are fixed-size byte arrays containing a sequence of bytes. The size of the byte array is outlined in entrance of the bytes bytes1 To bytes32,

This quantity is the same as the variety of characters contained within the byte array variable.


pragma solidity ^ 0.8.13;

contract Bytes_Array_Example
    bytes1 one_character = "a"; 
    bytes2 two_characters = "ab"; 
    bytes3 three_characters = "abc"; 
    bytes4 four_characters = "abcd"; 
    bytes5 five_characters = "abcde"; 
    bytes32 thrity_two_characters = "abcdefghijklmnopqrstuvwxyz123456"; 

While you attempt to specify characters that exceed a sure measurement of bytes, as proven beneath:


pragma solidity ^ 0.8.13;

contract Bytes_Array_Example
    bytes1 one_character = "ab"; 
    bytes1 two_characters = "abc"; 

you’ll get the next TypeError Message:

TypeError: Sort literal_string "abc" shouldn't be implicitly convertible to anticipated kind bytes1. Literal is bigger than the sort.

3.) booleans

Booleans in Solidity are denoted by bool Like key phrases and each different programming language, booleans in Solidity settle for solely two values: true And false,


pragma solidity ^ 0.8.13;

contract Boolean_Example
    bool isEthereumMerge = true; 
    bool currentUserCanMintToken = false; 

    bool isRaining = "true"; 
    bool isAdmin = "false"; 

While you attempt to assign a non-boolean worth to a boolean variable, you’ll get the next TypeError Message:

TypeError: Sort literal_string "true" is not implicitly convertible to the anticipated kind bool.

4.) Handle

Handle is a particular information kind in Solidity, able to receiving and sending Ether. The Handle information kind is designed to retailer Ethereum addresses, which normally begin with 0x price.

The deal with measurement is 20 bytes and consists of 42 characters.

0x0000000000000000000000000000000000000000

Addresses are additionally generated from non-case-sensitive hexadecimal digits. kcak-256 hash Did public key,

While you attempt to specify a string for an Handle information kind, as proven beneath:


pragma solidity ^ 0.8.13;

contract Address_Example
    deal with user_address = 0x0000000000000000000000000000000000000000; 
    deal with user_home_address = "Avenue 2, downtown highway"; 

you’ll get the next TypeError Message:

TypeError: Sort literal_string "Avenue 2, downtown highway" is not implicitly convertible to anticipated kind deal with.

While you attempt to assign a non-hexadecimal quantity to an deal with information kind, as proven beneath with an octal quantity:


pragma solidity ^ 0.8.13;

contract Address_Example
    deal with user_address = 0x0000000000000000000000000000000000000000; 
    deal with phone_address = 080123456789; 

you’ll get the next ParserError Message:

ParserError: Octal numbers not allowed.

The deal with worth kind is additional divided into two:

Celebration deal with deal with payable
examine deal with stability
ship ether
get ether

Professional Tip: While you need your sensible contract to obtain and ship Ether, use deal with payable worth kind. When you don’t need your sensible contract to obtain or switch ether, use plain deal with worth kind.

5.) enum

Enum information sorts, also called enumerations, allow builders to create user-defined information sorts. Consumer-defined information are names assigned to integral fixed values ​​beginning with zero.


pragma solidity ^ 0.8.13;

contract Enum_Example
    enum Standing 
        Sending, 
        Success, 
        Failed 
    

    Standing standing;

    operate sendSomething () public 
        standing = Standing.Sending; 
    

From the above code snippet, we created a Standing The enum holds the state of the motion once we ship one thing. Then we will use the enum to replace the state of the motion to any predefined state Standing enum.

Reference sorts (information constructions) in Solidity

A reference kind variable is one which shops the situation (reminiscence deal with) of its information A lot reminiscence and they don’t share their information immediately.

Adjustments made to the reference information will all the time have an effect on the unique information.

pass by reference

Examples of reference sorts in Solidity embody strings, constructions, arrays, and mappings.

1.) String

string Sort is a sequence of characters. Solidity helps each string literals utilizing single-quotes ' ' and double quotes " ",


pragma solidity ^ 0.8.13;

contract String_Example
        string identify = "John Doe";

2.) Buildings

struct An information kind is a reference information kind that can be utilized to create constructions of different information sorts. A construction can comprise each worth sorts and reference sorts, together with different constructions, however can’t be a construction of its personal.

A construction could be created in Solidity utilizing the beneath syntax:

struct <Struct_Name> 
    <data_type> <variable_name>; 

data_type could possibly be the one string, int, uint, bool, or any Solidity information kind. Buildings could be declared exterior the sensible contract and imported into one other contract.

The use case of a struct could be seen beneath:


pragma solidity ^ 0.8.13;

contract Struct_Example
    
    struct UserProfile 
        string fullName; 
        bool isOnboarded; 
        uint age; 
    

    
    UserProfile _newUserProfile = UserProfile("Ayodele Samuel Adebayo", true, 19);

    
    operate getUserProfile() public view returns (string reminiscence, bool , uint )
        return (_newUserProfile.fullName, _newUserProfile.isOnboarded, _newUserProfile.age); 
    

From above code; Now we have created a construction for person profile which expects fullNameThe isOnboarded standing, and person age, We then use this construction to create a brand new person with a operate that returns details about the created profile.

take away: Utilizing Buildings in Solidity makes our code extra organized, maintainable, reusable and readable.

3.) Tables

An array is a group of variables with the identical information kind. They’re saved in a contiguous reminiscence location, with every array merchandise having a singular index.

Arrays in Solidity could be mounted or dynamic in measurement and every array merchandise could be searched by its distinctive index.

I. dynamic array

A dynamic array could be created in Solidity utilizing the beneath syntax:


pragma solidity ^ 0.8.13;

contract Dynamic_Array_Syntax
    <datatype()> <variable_name> = <(array_items)>

Under is an instance of 1 string dynamic array of names and a uint Dynamic Desk of Numbers:


pragma solidity ^ 0.8.13;

contract Dynamic_Array_Example
    string() arrayOfNames = ("Religion", "Becky", "Steve");
    uint() arrayOfNumbers = (0, 1, 2, 3, 4, 5);

Second. mounted measurement desk

A hard and fast measurement array could be created utilizing the beneath syntax:


pragma solidity ^ 0.8.13;

contract Fixed_Size_Array_Syntax
    <datatype(measurement)> <variable_name> = <(array_items)>

Under is an instance of two mounted sizes string array of names and 1 mounted measurement uint Dynamic Desk of Numbers:


pragma solidity ^ 0.8.13;

contract Fixed_Size_Array_Example
    string(2) arrayOfNames = ("Religion", "Becky");
    uint(1) arrayOfNumbers = (0);

While you attempt to exceed the fixed-size restrict:


pragma solidity ^ 0.8.13;

contract Fixed_Size_Array_Example
    string(2) arrayOfNames = ("Religion", "Becky", "Steve"); 
    uint(1) arrayOfNumbers = (0, 1, 2); 

you’ll get the next TypeError messages, respectively:

TypeError: Sort string(3) reminiscence is not implicitly convertible to anticipated kind string(2) storage ref.
TypeError: Sort uint8(3) reminiscence is not implicitly convertible to anticipated kind uint256(1) storage ref.

4.) Mapping

A mapping in Solidity is a key-value pair information construction that capabilities equally to a dictionary in Python and hashtables or objects in JavaScript.

A mapping could be created in Solidity with the next syntax:


pragma solidity ^ 0.8.13;

contract Mapping_Syntax
        mapping (key => worth) variable_name;

The place key could be any information kind besides reference kind worth Could be each worth kind and reference kind.

Under is an instance of customers mapping their pockets addresses to their balances:


pragma solidity ^ 0.8.13;

contract Mapping_Example
        mapping (deal with => uint) users_balances;

With the above information construction implementation, we will retrieve customers’ crypto stability from the blockchain uint kind utilizing their pockets deal with,

wrapping up

Information sorts and information constructions are the muse of any programming language and are the constructing blocks for growing superior dapps with Solidity.

On this tutorial, now we have gone by way of essentially the most generally used information sorts and information constructions within the Solidity programming language.

What is going to occur subsequent?

Now that you’ve realized about information sorts and information constructions in Solidity:


That is a part of the article hashnode web3 blog, the place a crew of curated writers is bringing you new sources that will help you uncover the universe of Web3. Contact us for extra details about NFTs, The DAO, blockchain and the decentralized future.

Ready to get a best solution for your business?