Introduction to smart contracts

Sam Richards
Last edit: @samajammin, October 1, 2020
See contributors
Edit page

What is a smart contract?

A "smart contract" is simply a program that runs on the Ethereum blockchain. It's a collection of code (its functions) and data (its state) that resides at a specific address on the Ethereum blockchain.

Smart contracts are a type of Ethereum account. This means they have a balance and they can send transactions over the network. However they're not controlled by a user, instead they are deployed to the network and run as programmed. User accounts can then interact with a smart contract by submitting transactions that execute a function defined on the smart contract. Smart contracts can define rules, like a regular contract, and automatically enforce them via the code.

Prerequisites

Make sure you've read up on accounts, transactions and the Ethereum virtual machine before jumping into the world of smart contracts.

A digital vending machine

Perhaps the best metaphor for a smart contract is a vending machine, as described by Nick Szabo. With the right inputs, a certain output is guaranteed.

To get a snack from a vending machine:

1money + snack selection = snack dispensed
2

This logic is programmed into the vending machine.

A smart contract, like a vending machine, has logic programmed into it. Here's a simple example of this vending machine might look like as a smart contract:

1pragma solidity 0.6.11;
2
3contract VendingMachine {
4
5 // Declare state variables of the contract
6 address public owner;
7 mapping (address => uint) public cupcakeBalances;
8
9 // When 'VendingMachine' contract is deployed:
10 // 1. set the deploying address as the owner of the contract
11 // 2. set the deployed smart contract's cupcake balance to 100
12 constructor() public {
13 owner = msg.sender;
14 cupcakeBalances[address(this)] = 100;
15 }
16
17 // Allow the owner to increase the smart contract's cupcake balance
18 function refill(uint amount) public {
19 require(msg.sender == owner, "Only the owner can refill.");
20 cupcakeBalances[address(this)] += amount;
21 }
22
23 // Allow anyone to purchase cupcakes
24 function purchase(uint amount) public payable {
25 require(msg.value >= amount * 1 ether, "You must pay atleast 1 ETH per cupcake");
26 require(cupcakeBalances[address(this)] >= amount, "Not enough cupcakes in stock to complete this purchase");
27 cupcakeBalances[address(this)] -= amount;
28 cupcakeBalances[msg.sender] += amount;
29 }
30}
31
📋 Copy

Like a vending machine removes the need for a vendor employee, smart contracts can replace intermediaries in many industries.

Permissionless

Anyone can write a smart contract and deploy it to the network. You just need to learn how to code in a smart contract language and have enough ETH to deploy your contract. Deploying a smart contract is technically a transaction, so you need to pay your Gas in the same way that you need to pay gas for a simple ETH transfer. Gas costs for contract deployment are far higher however.

Ethereum has developer-friendly languages for writing smart contracts:

  • Solidity
  • Vyper

More on languages

However, they must be compiled before they can be deployed so that Ethereum's virtual machine can interpret and store the contract. More on compilation

Composability

Smart contracts are public on Ethereum and can be thought of as open APIs. That means you can call other smart contracts in your own smart contract to greatly extend what's possible. Contracts can even deploy other contracts.

Learn more about smart contract composability.

Limitations

Smart contracts alone cannot get information about "real-world" events because they can't send HTTP requests. This is by design as relying on external information could jeopardise consensus, which is important for security and decentralization.

There are ways to get around this using oracles.

Smart contract resources

OpenZeppelin Contracts - Library for secure smart contract development.

DappSys - Safe, simple, flexible building-blocks for smart-contracts.

Further reading