DEV Community

Cover image for Getting Started with Solidity: The Complete Beginner's Tutorial with Code Samples
Md Danish Ansari
Md Danish Ansari

Posted on

Getting Started with Solidity: The Complete Beginner's Tutorial with Code Samples

Solidity is a programming language used to write smart contracts on Ethereum and other blockchain platforms. As a beginner, learning Solidity can seem daunting at first. But with the right approach, anyone can gain a solid grasp of the fundamentals. This guide will walk you through the key concepts in a detailed, step-by-step manner.

What is Solidity and What Can You Build With It?

Let's start with a high-level overview.

Solidity is an object-oriented, high-level programming language designed for implementing smart contracts. Smart contracts are self-executing programs stored on the blockchain that run as programmed without any risk of downtime, censorship, or third-party interference.

With Solidity, you can build decentralized applications (DApps) and systems that utilize the key benefits of blockchain technology:

  • Trustless execution - Smart contracts will execute exactly as programmed without the need for a trusted third party.

  • Transparency - All transactions are visible on the public ledger.

  • Immutability - Data written to the blockchain cannot be altered or deleted.

  • Security - Decentralized systems are less vulnerable to hacking or manipulation.

Some common uses of Solidity and Ethereum smart contracts include:

  • Digital currencies and payments
  • Financial instruments like loans and insurance
  • Identity and reputation systems
  • Supply chain tracking
  • Voting systems
  • Property deeds and licenses
  • Games and collectibles

Now that you have an idea of what Solidity enables, let's dig into the language itself.

How to Install Solidity for Development

To write Solidity code, you need to install some developer tools:

  1. Solidity Compiler - Compiles Solidity code into bytecode that can be deployed on Ethereum.

  2. Ethereum Client - Runs a local Ethereum node and blockchain for testing. Options include Geth and Ganache.

  3. Development Framework - Enables building, testing and deploying smart contracts. Popular options include Truffle, Hardhat and Remix.

I recommend using Remix to start since it doesn't require installing anything. Remix is a browser-based IDE with built-in Solidity compiler and VM.

For setting up a professional dev environment, go with the Hardhat framework.

Writing Your First Smart Contract

The best way to learn Solidity is by writing code. Let's go through a simple smart contract step-by-step:

  1. Start a new file called HelloWorld.sol

  2. Specify Solidity version. Latest version is 0.8.x:

pragma solidity ^0.8.0; 
Enter fullscreen mode Exit fullscreen mode
  1. Define the contract:
contract HelloWorld {

}
Enter fullscreen mode Exit fullscreen mode
  1. Add a state variable called message:
string public message;
Enter fullscreen mode Exit fullscreen mode
  1. In the constructor, initialize message :
constructor() {
    message = "Hello World!";
}
Enter fullscreen mode Exit fullscreen mode
  1. Full contract code:
//SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

contract HelloWorld {

    string public message;

    constructor() {
        message = "Hello World!";
    }

}
Enter fullscreen mode Exit fullscreen mode

And there you have it - your first Solidity smart contract!

Let's go through some key points:

  • pragma specifies the compiler version
  • contract defines the contract
  • public makes the variable readable
  • constructor is called once when contract is deployed

Now you can compile and deploy this on Remix to see it in action!

Core Data Types

Solidity provides several elementary data types similar to other languages:

  • Boolean - bool for True/False
  • Integers - int for negative/positive numbers
  • Unsigned Integers - uint for only positive numbers
  • Addresses - address to represent Ethereum accounts
  • Strings - string for ASCII text
  • Bytes - bytes for raw byte data

For example:

bool isTrue = true; 
uint myUint = 123;
string myString = "Hello World";
Enter fullscreen mode Exit fullscreen mode

Solidity is statically typed, so you must specify the type on declaration.

Structs and Enums

For more complex data, Solidity provides:

  • Structs - Customizable data types with multiple properties
  • Enums - Data types with a restricted set of options

Here's an example struct representing a User:

struct User {
  uint id;
  string name;
  uint balance;
}
Enter fullscreen mode Exit fullscreen mode

And an enum for user status:

enum Status {
  Active,
  Inactive
}
Enter fullscreen mode Exit fullscreen mode

Structs and enums enable you to model complex data in your contracts.

Functions

Functions are reusable code blocks that can modify state and execute logic.

Here's an example function in Solidity:

function setMessage(string memory _newMessage) public {
  message = _newMessage;
}
Enter fullscreen mode Exit fullscreen mode

Things to note:

  • function keyword
  • Visibility like public or private
  • State mutability like pure, view, payable
  • Function parameters and return values

Functions are essential for writing useful smart contracts.

Control Structures

Solidity contains common control structures found in other languages:

  • If/Else - Execute different code based on condition
  • For Loop - Repeat code multiple times
  • While Loop - Repeat code while condition is true
  • Mappings - Key-value store for data storage
  • Events - Emit events to external listeners

For example, a loop to sum integers:

uint sum;
for (uint i = 0; i < 10; i++) {
  sum += i; 
}
Enter fullscreen mode Exit fullscreen mode

Control structures enable complex logic in your contracts.

Arrays

Arrays allow you to store a collection of data of the same type.

For example, an array of uint:

uint[] public numbers;
Enter fullscreen mode Exit fullscreen mode

You can declare a fixed sized array like so:

uint[10] public ids; 
Enter fullscreen mode Exit fullscreen mode

Or a dynamic sized array that can grow:

uint[] public ids;
Enter fullscreen mode Exit fullscreen mode

Some key array methods are:

  • push() - Add to end of array
  • pop() - Remove from end
  • length - Get total length

You can iterate through an array with a for loop:

for (uint i = 0; i < ids.length; i++) {
  // do something with ids[i] 
}
Enter fullscreen mode Exit fullscreen mode

Arrays are useful for storing dynamic collections of data in your contract.

Strings

The string data type allows you to store ASCII text strings. For example:

string public greeting = "Hello World!";
Enter fullscreen mode Exit fullscreen mode

Strings in Solidity are a dynamically-sized array of bytes.

To concatenate two strings:

string public message = string(abi.encodePacked(greeting, "!", name));
Enter fullscreen mode Exit fullscreen mode

Other string methods include:

  • equals() - Compare two strings
  • contains() - Check if string contains substring
  • length - Get string length

Strings enable your contract to manipulate textual data.

Inheritance & Interfaces

Solidity supports inheritance and interfaces like other OOP languages:

  • Inheritance - Contracts can inherit variables and functions from a parent contract
  • Interfaces - Define function signatures that other contracts must implement

For example:

contract Dog is Animal {
  function bark() public {
    emit Sound("Woof"); 
  }
}

interface Pet {
  function sound() external;
}
Enter fullscreen mode Exit fullscreen mode

Advanced code reuse in Solidity works very similarly to other OOP languages.

Install Dependencies with NPM

You can enhance functionality of your contracts by importing external dependencies from NPM:

import "openzeppelin-solidity/contracts/math/SafeMath.sol";
Enter fullscreen mode Exit fullscreen mode

To get started:

  1. Initialize project: npm init
  2. Install packages: npm install <package>
  3. Import dependencies

External libraries can add useful features like security checks, utility methods, governance protocols and more.

Deploying and Interacting with Contracts

Once you've written your smart contract code, you'll want to deploy and interact with it:

  1. Compile - Compile Solidity code into EVM bytecode
  2. Deploy - Deploy bytecode onto the selected blockchain
  3. Interact - Call functions on the deployed contract
  4. Test - Write unit tests in JavaScript to validate functionality

Most development frameworks like Truffle have scripts to help automate these steps.

You'll also want to connect your app or web3 code to call contract functions.

Where to Go From Here

This covers the core concepts for understanding Solidity as a beginner. Where you go next depends on your goals:

  • Build a DApp frontend with web3.js
  • Create NFT collectibles and games
  • Integrate smart contracts with IoT networks
  • Optimize gas costs and security practices
  • Explore DeFi protocols and oracles
  • Integrate with legacy systems as a hybrid blockchain solution

The possibilities are endless! With the basics covered here, you have a solid base for expanding your blockchain programming skills.

Top comments (0)