Dans Ethereum, on trouve deux types de concept : des comptes et des fonctions de transition. Chaque compte comprend le nonce, son solde en Ether, le code du contrat, le stockage du compte. On distingue deux types de comptes :
- les comptes de propriété externes (contrôlés par des clés privées et identifiées par une adresse dérivée de la clé publique correspondante obtenue à l’aide de la fonction cryptographique SHA3) ;
- et les comptes liés à un contrat (identifiés par une adresse dérivée de manière déterministe à partir d'une adresse de compte externe connue et contrôlés par leur code) : ces comptes contiennent l'adresse du contrat, le solde du contrat, le code et l'état de l'exécution du programme. Un compte externe ne contient pas de code, mais on peut envoyer des messages d'un compte externe en créant et en signant une transaction. Chaque fois que le compte de contrat reçoit un message, son code s'active, lui permettant de lire et d'écrire dans le système interne et d'envoyer d'autres messages ou de créer des contrats à son tour.
Ethereum met en œuvre des frais de minage pour les mêmes raisons que Bitcoin. En effet, l’EVM permet d'exécuter des contrats avec des boucles potentiellement infinies ou des opérations coûteuses en termes de calcul. Pour compenser les mineurs pour ces calculs qui prennent beaucoup de temps, les contrats consomment un gaz. Le gaz est une unité interne utilisée dans l'EVM (Le prix du gaz est un prix acheté en Ether (ETH)). À chaque instruction, EVM est affecté le coût en gaz. Lorsqu'un compte appelle un compte, l'appel est accompagné de l'équilibre du compte et des données transférées. Le solde transféré est déposé sur le compte appelé. Lorsque le compte appelé est un compte externe, il se produit un simple transfert de solde. Lorsque le compte appelé est un contrat, après le transfert du solde, le code du contrat appelé est exécuté s’il y a assez de gaz pour exécuter toutes les instructions (chaque instruction consommant du gaz).
Les langages des contrats peuvent être Solidity (qui est similaire à Javascript), Viper ou Serpent (qui est similaire à Python), ou Lem. Ils sont compilés dans le bytecode