以太坊中有兩種帳戶,分別為外部擁有帳戶(Externally owned account, EOA)及合約帳戶(Contract address),兩種帳戶都可以接收、持有與發送以太幣與其他代幣;使用已在鏈上公開的智慧合約。其中兩種帳戶不同的地方在於可以免費創建EOA,但若要創建合約帳戶則需支付手續費(根據以太坊上的規定,凡是在鏈上需要用到算力的工作皆需支付費用)。EOA可以發起交易,而合約帳戶僅能回覆那些已經接收的交易。在EOA上僅能接受代幣間的轉移而合約帳戶的功能較多,除了轉移代幣之外甚至還可以在擬定新合約作為交易內容物。
在EOA地址產生的過程中是使用橢圓曲線產生公鑰與私鑰,採用secp256k1曲線,其中公鑰使用uncompressed模式。所產生出來的私鑰不會存在以太坊上,而是存在用戶創建的錢包或資料庫裡面,私鑰獨立於以太坊協議,可以透過錢包去產生與管理,無需依賴區塊鏈與網路。在以太坊上的交易皆需要由密鑰產生數位簽章,而數位簽章僅能夠過密鑰生成;因此任何人只要擁有了密鑰就等於是掌握了帳戶的所有權。公鑰與密鑰必定成雙成對,有一組公鑰就會有一組私鑰。在區塊鏈裡面可以將公鑰理解為信用卡的卡號,密鑰就是信用卡後面的安全碼了。
所謂的合約帳戶與EOA相同的是一樣都是由16進位數兜出來的42個字所組成的,它通常都是在開發者將合約部屬到以太坊上時所產生出來的,裡面包含了自己的EOA與交易流水號(nonce)。看到這邊可能會有人覺得疑惑,什麼是交易流水號哩? 這邊來簡單講一下nonce,因為以太坊上面的交易都是用帳號下去做區分的,一個帳號可能會發比多筆交易,那麼要怎麼判斷要先執行那筆交易呢? 這時nonce就派上用場了! 它就像是流水號的概念一樣,每發起一筆交易nonce值就會+1,透過這個機制來達成為交易排序的目的同時也確保每筆交易只會被執行一次。