
Welcome to Ethereum
The leading platform for innovative apps and blockchain networks
Pick a wallet
Create accounts & manage assets
Get ETH
The currency of Ethereum
Try apps
Finance, gaming, social
Start building
Create your first app
A new way to use the internet

Crypto without volatility
Stablecoins are currencies that maintain stable value. Their price matches the U.S. dollar or other steady assets.
Learn more




The strongest ecosystem
Activity from all Ethereum networks

Understand Ethereum
Crypto can feel overwhelming. Don't worry, these materials are designed to help you understand Ethereum in just a few minutes.
The internet is changing
Be part of the digital revolution
Legacy
Ethereum

Blockchain's biggest builder community
Ethereum is home to Web3's largest and most vibrant developer ecosystem. Use JavaScript and Python, or learn a smart contract language like Solidity or Vyper to write your own app.
Code examples
1// SPDX-License-Identifier: MIT2pragmasolidity^0.8.1;34// This is a smart contract - a program that can be deployed to the Ethereum blockchain.5contractSimpleWallet{6// An 'address' is comparable to an email address - it's used to identify an account on Ethereum.7addresspayableprivate owner;89// Events allow for logging of activity on the blockchain.10// Software applications can listen for events in order to react to contract state changes.11eventLogDeposit(uint amount,addressindexed sender);12eventLogWithdrawal(uint amount,addressindexed recipient);1314 // When this contract is deployed, set the deploying address as the owner of the contract.15constructor(){16 owner=payable(msg.sender);17}1819// Send ETH from the function caller to the SimpleWallet contract20functiondeposit()publicpayable{21require(msg.value>0,"Must send ETH.");22emitLogDeposit(msg.value, msg.sender);23}2425// Send ETH from the SimpleWallet contract to a chosen recipient26functionwithdraw(uint amount,addresspayable recipient)public{27require(msg.sender== owner,"Only the owner of this wallet can withdraw.");28require(address(this).balance>= amount,"Not enough funds.");29emitLogWithdrawal(amount, recipient);30 recipient.transfer(amount);31}32}
1// SPDX-License-Identifier: MIT2pragmasolidity^0.8.1;34// This is a smart contract - a program that can be deployed to the Ethereum blockchain.5contractSimpleToken{6// An `address` is comparable to an email address - it's used to identify an account on Ethereum.7addresspublic owner;8uint256publicconstant token_supply=1000000000000;910// A `mapping` is essentially a hash table data structure.11// This `mapping` assigns an unsigned integer (the token balance) to an address (the token holder).12mapping(address=>uint)public balances;131415 // When 'SimpleToken' contract is deployed:16 // 1. set the deploying address as the owner of the contract17 // 2. set the token balance of the owner to the total token supply18constructor(){19 owner= msg.sender;20 balances[owner]= token_supply;21}2223// Sends an amount of tokens from any caller to any address.24functiontransfer(address receiver,uint amount)public{25// The sender must have enough tokens to send26require(amount<= balances[msg.sender],"Insufficient balance.");2728// Adjusts token balances of the two addresses29 balances[msg.sender]-= amount;30 balances[receiver]+= amount;31}32}
1const ethers=require("ethers")23// Create a wallet instance from a mnemonic...4const mnemonic=5"announce room limb pattern dry unit scale effort smooth jazz weasel alcohol"6const walletMnemonic= ethers.Wallet.fromMnemonic(mnemonic)78// ...or from a private key9const walletPrivateKey=newethers.Wallet(walletMnemonic.privateKey)1011// ...or create a wallet from a random private key12const randomWallet= ethers.Wallet.createRandom()1314walletMnemonic.address15// '0x71CB05EE1b1F506fF321Da3dac38f25c0c9ce6E1'1617// The internal cryptographic components18walletMnemonic.privateKey19// '0x1da6847600b0ee25e9ad9a52abbd786dd2502fa4005dd5af9310b7cc7a3b25db'20walletMnemonic.publicKey21// '0x04b9e72dfd423bcf95b3801ac93f4392be5ff22143f9980eb78b3a860c...d64'2223const tx={24 to:"0x8ba1f109551bD432803012645Ac136ddd64DBA72",25 value: ethers.utils.parseEther("1.0"),26}2728// Sign a transaction29walletMnemonic.signTransaction(tx)30// { Promise: '0xf865808080948ba1f109551bd432803012645ac136ddd6...dfc' }3132// Connect to the Ethereum network using a provider33const wallet= walletMnemonic.connect(provider)3435// Query the network36wallet.getBalance()37// { Promise: { BigNumber: "42" } }38wallet.getTransactionCount()39// { Promise: 0 }4041// Send ether42wallet.sendTransaction(tx)4344// Content adapted from ethers documentation by Richard Moore45// https://docs.ethers.io/v5/api/signer/#Wallet46// https://github.com/ethers-io/ethers.js/blob/master/docs/v5/api/signer/README.md#methods47// Content is licensed under the Creative Commons License:48// https://choosealicense.com/licenses/cc-by-4.0/
1// SPDX-License-Identifier: MIT2pragmasolidity^0.8.1;34// This is a smart contract - a program that can be deployed to the Ethereum blockchain.5contractSimpleDomainRegistry{67addresspublic owner;8// Hypothetical cost to register a domain name9uintconstantpublic DOMAIN_NAME_COST=1 ether;1011// A `mapping` is essentially a hash table data structure.12// This `mapping` assigns an address (the domain holder) to a string (the domain name).13mapping(string=>address)public domainNames;141516 // When 'SimpleDomainRegistry' contract is deployed,17 // set the deploying address as the owner of the contract.18constructor(){19 owner= msg.sender;20}2122// Registers a domain name (if not already registered)23functionregister(stringmemory domainName)publicpayable{24require(msg.value>= DOMAIN_NAME_COST,"Insufficient amount.");25require(domainNames[domainName]==address(0),"Domain name already registered.");26 domainNames[domainName]= msg.sender;27}2829// Transfers a domain name to another address30functiontransfer(address receiver,stringmemory domainName)public{31require(domainNames[domainName]== msg.sender,"Only the domain name owner can transfer.");32 domainNames[domainName]= receiver;33}3435// Withdraw funds from contract36functionwithdraw()public{37require(msg.sender== owner,"Only the contract owner can withdraw.");38payable(msg.sender).transfer(address(this).balance);39}40}

Built by the community
The ethereum.org website is built and maintained by hundreds of translators, coders, designers, copywriters, and enthusiastic community members each month.
Come ask questions, connect with people around the world and contribute to the website. You will get relevant practical experience and be guided during the process!
Recent posts
The latest blog posts and updates from the community
Events
Ethereum communities host events all around the globe, all year long
This website is open source with hundreds of community contributors. You can propose edits to any of the content on this site.