Accessibility and visibility in Solidity

Jan 29, 2022

Solidity language allows specifying accessibility for contract functions and state variables. That will enable us to set constraints on constructing the smart contract and whether other contracts or addresses can access the data. Contract state variables and functions have a slight difference that we're going to check out. I want to mention that accessibility and visibility are different things in blockchain development context.

Function visibility

Functions in smart contracts can have four accessibility levels.

Public

When a function is defined as public it can be called from any other contract, including a smart contract that contains it or address.

function publicFunction() public {
  publicInt += 1;
}

External

Keyword external means that a function can be called by other contracts or addresses. If we want to call an external function, we can do it using this keyword.

function externalFunction() external {
  externalInt += 1;
}

function callExternalFunction() public {
  this.externalFunction();
}

Internal

Internal functions can be called from the same smart contract or any other inherited from it.

function internalFunction() internal {
  internalInt += 1;
}

Private

Private functions aren't visible and can't be accessed from other smart contracts or addresses. These functions aren't accessible in contracts that inherit a smart contract where this function is defined.

function internalFunction() internal {
  internalInt += 1;
}

Contract state variable visibility

Smart contract state variables can be public, internal and private.

Public

Public state variables can be accessed from any smart contract, including those that hold them or any address. Solidity generates for the public state variable a getter function.

contract Accessibility {
  uint public publicInt;
}

// can get and set from other smart contracts
contract AccessPublic {
  Accessibility accessibility = new Accessibility();

  function accessPublicInt() public view returns(uint) {
    uint publicInt = accessibility.publicInt();
    return publicInt;
  }
}

Internal

Similar to functions, internal state variables can be accessed from a contract that defined them or any other that inherits from a smart contract. Important to note that smart contract state variables are internal by default.

uint internal internalInt;

Private

A private state variable has the same characteristics as functions. It can be accessed only within the same contract, not any other contracts.

uint private privateInt;

Visibility and accessibility

In blockchain development, visibility and accessibility have a different meaning. Everything inside a smart contract can be visible because all transactions are open in a ledger that anyone can see. Private or internal prevents other contracts or addresses from modifying the data. It can be visible from the outside because nothing can be hidden on the blockchain. It means that you can restrict access to a state variable or a function, but it is visible.

TL;DR

Solidity programming language has multiple options to define access levels for smart contract functions and state variables. In blockchain development, visibility and accessibility aren't the same. We can restrict access to the functions or state variables, but it can be viewed from the outside.

Links