Glossary
Smart contract
A smart contract is code deployed at a blockchain address that runs on a virtual machine when invoked by a transaction.
A smart contract is code that lives at a blockchain address and runs
when a transaction invokes it. On EVM chains the code runs in the Ethereum
Virtual Machine. On solana the equivalent is a
program, running in the Solana VM. On sui and
aptos contracts are Move modules. The general idea is the
same: deterministic, on-chain code triggered by signed transactions.
Deployed bytecode vs source
What actually lives at a contract address is bytecode, the
chain-specific machine code the VM executes. Source code (Solidity, Vyper,
Rust, Move, and others) is not stored on-chain by default. To make a
contract auditable, developers verify the source against the deployed
bytecode using a block explorer.
- On EVM chains, explorers such as the ones tx.taxi routes to for
arbitrum one provide a "verify and publish"
workflow. The developer submits Solidity source, compiler settings, and
constructor arguments; the explorer compiles them and confirms that the
resulting bytecode matches the on-chain bytes.
- A verified contract page shows the source, the ABI, the compiler
version, and a "read" / "write" tab for interacting with functions
directly.
- An unverified contract still works on-chain. It just shows raw bytecode
on the explorer, which is far harder to inspect.
Read and write functions
Most contract function calls fall into two categories at the tooling level:
- Read functions (
vieworpurein Solidity) do not change state.
Explorers and wallets can call them locally against a node, with no
signature and no fee. They simply return computed values from current
state.
- Write functions are state-changing. Calling them requires a signed
transaction with a gas fee, and the result is a
transaction receipt that records status,
emitted events, and gas used.
Calls to a contract identify the function by a 4-byte selector
(keccak256("functionName(types)") >> 224 on EVM), followed by ABI-encoded
arguments. The explorer decodes both the input and the emitted events when
the ABI is available, which is why verification matters for
human-readable transaction pages.
The ABI
The ABI (Application Binary Interface) is a JSON schema describing a
contract's functions, events, and types. It lets clients encode calls and
decode responses without seeing the source. When a contract is verified,
the explorer publishes its ABI alongside the source. Tools, indexers, and
front-ends consume the ABI to make calls.
Contract addresses
A contract address is the same format as any other
wallet address on its chain. There is no
on-chain bit that labels an address as a contract; explorers detect it by
checking whether the address has deployed code. EVM contract addresses are
typically rendered using EIP-55 checksum
casing.
The address is determined deterministically at deployment time. On EVM
chains, a CREATE deployment computes the new address as
keccak256(rlp([sender, nonce])) truncated to 20 bytes; CREATE2 uses
keccak256(0xff || sender || salt || keccak256(initcode)).
Common gotchas
- A contract can be self-destructed or upgraded via proxies, so an address
showing one bytecode today may show different bytecode tomorrow. Always
check timestamps when auditing.
- Verifying source on one chain does not propagate to others. The same
bytecode redeployed on optimism must be verified
again on that chain's explorer.
- Reading a function on an unverified contract is still possible if you
know its 4-byte selector, but you lose the readable name and decoded
arguments.