This page is incomplete. If you’re an expert on the topic, please edit this page and sprinkle it with your wisdom.

Compiling smart contracts

Sam Richards
Last edit: @samajammin, September 22, 2020
Edit page

You need to compile your contract so that your web app and the Ethereum virtual machine (EVM) can understand it.

Prerequisites

You might find it helpful to have read our intro to smart contracts and the Ethereum virtual machine before reading about compilation.

The EVM

For the EVM to be able to run your contract it needs to be in bytecode. Compilation turns this:

1pragma solidity 0.4.24;
2
3contract Greeter {
4
5 function greet() public constant returns (string) {
6 return "Hello";
7 }
8
9}
10

into this

1PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT PUSH2 0x41 JUMPI PUSH1 0x0 CALLDATALOAD PUSH29 0x100000000000000000000000000000000000000000000000000000000 SWAP1 DIV PUSH4 0xFFFFFFFF AND DUP1 PUSH4 0xCFAE3217 EQ PUSH2 0x46 JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x52 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x5B PUSH2 0xD6 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE DUP4 DUP2 DUP2 MLOAD DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x9B JUMPI DUP1 DUP3 ADD MLOAD DUP2 DUP5 ADD MSTORE PUSH1 0x20 DUP2 ADD SWAP1 POP PUSH2 0x80 JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0xC8 JUMPI DUP1 DUP3 SUB DUP1 MLOAD PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP JUMPDEST POP SWAP3 POP POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH1 0x60 PUSH1 0x40 DUP1 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x5 DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x48656C6C6F000000000000000000000000000000000000000000000000000000 DUP2 MSTORE POP SWAP1 POP SWAP1 JUMP STOP LOG1 PUSH6 0x627A7A723058 KECCAK256 SLT 0xec 0xe 0xf5 0xf8 SLT 0xc7 0x2d STATICCALL ADDRESS SHR 0xdb COINBASE 0xb1 BALANCE 0xe8 0xf8 DUP14 0xda 0xad DUP13 LOG1 0x4c 0xb4 0x26 0xc2 DELEGATECALL PUSH7 0x8994D3E002900
2

Web applications

The compiler will also produce the Application Binary Interface (ABI) which you need in order for your application to understand the contract and call the contract's functions.

The ABI is a JSON file that describes the deployed contract and its smart contract functions. This helps bridge the gap between web2 and web3

A Javascript client library will read the ABI in order for you to call on your smart contract in your web app's interface.

Below is the ABI for the ERC-20 token contract. An ERC-20 is a token you can trade on Ethereum.

1[
2 {
3 "constant": true,
4 "inputs": [],
5 "name": "name",
6 "outputs": [
7 {
8 "name": "",
9 "type": "string"
10 }
11 ],
12 "payable": false,
13 "stateMutability": "view",
14 "type": "function"
15 },
16 {
17 "constant": false,
18 "inputs": [
19 {
20 "name": "_spender",
21 "type": "address"
22 },
23 {
24 "name": "_value",
25 "type": "uint256"
26 }
27 ],
28 "name": "approve",
29 "outputs": [
30 {
31 "name": "",
32 "type": "bool"
33 }
34 ],
35 "payable": false,
36 "stateMutability": "nonpayable",
37 "type": "function"
38 },
39 {
40 "constant": true,
41 "inputs": [],
42 "name": "totalSupply",
43 "outputs": [
44 {
45 "name": "",
46 "type": "uint256"
47 }
48 ],
49 "payable": false,
50 "stateMutability": "view",
51 "type": "function"
52 },
53 {
54 "constant": false,
55 "inputs": [
56 {
57 "name": "_from",
58 "type": "address"
59 },
60 {
61 "name": "_to",
62 "type": "address"
63 },
64 {
65 "name": "_value",
66 "type": "uint256"
67 }
68 ],
69 "name": "transferFrom",
70 "outputs": [
71 {
72 "name": "",
73 "type": "bool"
74 }
75 ],
76 "payable": false,
77 "stateMutability": "nonpayable",
78 "type": "function"
79 },
80 {
81 "constant": true,
82 "inputs": [],
83 "name": "decimals",
84 "outputs": [
85 {
86 "name": "",
87 "type": "uint8"
88 }
89 ],
90 "payable": false,
91 "stateMutability": "view",
92 "type": "function"
93 },
94 {
95 "constant": true,
96 "inputs": [
97 {
98 "name": "_owner",
99 "type": "address"
100 }
101 ],
102 "name": "balanceOf",
103 "outputs": [
104 {
105 "name": "balance",
106 "type": "uint256"
107 }
108 ],
109 "payable": false,
110 "stateMutability": "view",
111 "type": "function"
112 },
113 {
114 "constant": true,
115 "inputs": [],
116 "name": "symbol",
117 "outputs": [
118 {
119 "name": "",
120 "type": "string"
121 }
122 ],
123 "payable": false,
124 "stateMutability": "view",
125 "type": "function"
126 },
127 {
128 "constant": false,
129 "inputs": [
130 {
131 "name": "_to",
132 "type": "address"
133 },
134 {
135 "name": "_value",
136 "type": "uint256"
137 }
138 ],
139 "name": "transfer",
140 "outputs": [
141 {
142 "name": "",
143 "type": "bool"
144 }
145 ],
146 "payable": false,
147 "stateMutability": "nonpayable",
148 "type": "function"
149 },
150 {
151 "constant": true,
152 "inputs": [
153 {
154 "name": "_owner",
155 "type": "address"
156 },
157 {
158 "name": "_spender",
159 "type": "address"
160 }
161 ],
162 "name": "allowance",
163 "outputs": [
164 {
165 "name": "",
166 "type": "uint256"
167 }
168 ],
169 "payable": false,
170 "stateMutability": "view",
171 "type": "function"
172 },
173 {
174 "payable": true,
175 "stateMutability": "payable",
176 "type": "fallback"
177 },
178 {
179 "anonymous": false,
180 "inputs": [
181 {
182 "indexed": true,
183 "name": "owner",
184 "type": "address"
185 },
186 {
187 "indexed": true,
188 "name": "spender",
189 "type": "address"
190 },
191 {
192 "indexed": false,
193 "name": "value",
194 "type": "uint256"
195 }
196 ],
197 "name": "Approval",
198 "type": "event"
199 },
200 {
201 "anonymous": false,
202 "inputs": [
203 {
204 "indexed": true,
205 "name": "from",
206 "type": "address"
207 },
208 {
209 "indexed": true,
210 "name": "to",
211 "type": "address"
212 },
213 {
214 "indexed": false,
215 "name": "value",
216 "type": "uint256"
217 }
218 ],
219 "name": "Transfer",
220 "type": "event"
221 }
222]
223

Further reading

β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–„β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–„β–‘β–‘β–‘β–‘ β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–Œβ–’β–ˆβ–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–„β–€β–’β–Œβ–‘β–‘β–‘ β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–Œβ–’β–’β–ˆβ–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–„β–€β–’β–’β–’β–β–‘β–‘β–‘ ░░░░░░░▐▄▀▒▒▀▀▀▀▄▄▄▀▒▒▒▒▒▐░░░ β–‘β–‘β–‘β–‘β–‘β–„β–„β–€β–’β–‘β–’β–’β–’β–’β–’β–’β–’β–’β–’β–ˆβ–’β–’β–„β–ˆβ–’β–β–‘β–‘β–‘ β–‘β–‘β–‘β–„β–€β–’β–’β–’β–‘β–‘β–‘β–’β–’β–’β–‘β–‘β–‘β–’β–’β–’β–€β–ˆβ–ˆβ–€β–’β–Œβ–‘β–‘β–‘ β–‘β–‘β–β–’β–’β–’β–„β–„β–’β–’β–’β–’β–‘β–‘β–‘β–’β–’β–’β–’β–’β–’β–’β–€β–„β–’β–’β–Œβ–‘β–‘ β–‘β–‘β–Œβ–‘β–‘β–Œβ–ˆβ–€β–’β–’β–’β–’β–’β–„β–€β–ˆβ–„β–’β–’β–’β–’β–’β–’β–’β–ˆβ–’β–β–‘β–‘ β–‘β–β–‘β–‘β–‘β–’β–’β–’β–’β–’β–’β–’β–’β–Œβ–ˆβ–ˆβ–€β–’β–’β–‘β–‘β–‘β–’β–’β–’β–€β–„β–Œβ–‘ β–‘β–Œβ–‘β–’β–„β–ˆβ–ˆβ–„β–’β–’β–’β–’β–’β–’β–’β–’β–’β–‘β–‘β–‘β–‘β–‘β–‘β–’β–’β–’β–’β–Œβ–‘ β–€β–’β–€β–β–„β–ˆβ–„β–ˆβ–Œβ–„β–‘β–€β–’β–’β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–’β–’β–’β–β–‘ β–β–’β–’β–β–€β–β–€β–’β–‘β–„β–„β–’β–„β–’β–’β–’β–’β–’β–’β–‘β–’β–‘β–’β–‘β–’β–’β–’β–’β–Œ ▐▒▒▒▀▀▄▄▒▒▒▄▒▒▒▒▒▒▒▒░▒░▒░▒▒▐░ β–‘β–Œβ–’β–’β–’β–’β–’β–’β–€β–€β–€β–’β–’β–’β–’β–’β–’β–‘β–’β–‘β–’β–‘β–’β–‘β–’β–’β–’β–Œβ–‘ ░▐▒▒▒▒▒▒▒▒▒▒▒▒▒▒░▒░▒░▒▒▄▒▒▐░░ β–‘β–‘β–€β–„β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–‘β–’β–‘β–’β–‘β–’β–„β–’β–’β–’β–’β–Œβ–‘β–‘ β–‘β–‘β–‘β–‘β–€β–„β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–„β–„β–„β–€β–’β–’β–’β–’β–„β–€β–‘β–‘β–‘ β–‘β–‘β–‘β–‘β–‘β–‘β–€β–„β–„β–„β–„β–„β–„β–€β–€β–€β–’β–’β–’β–’β–’β–„β–„β–€β–‘β–‘β–‘β–‘β–‘ β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–€β–€β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘

Help us with this page

If you're an expert on the topic and want to contribute, edit this page and sprinkle it with your wisdom.

You'll be credited and you'll be helping the Ethereum community!

Use this flexible documentation template

Questions? Ask us in the #content channel on our Discord server

Edit page