比特币是基于交易的账本,这种模式下并没有显式记录账户中有多少钱。
以太坊采用的是基于账户的模式,这种模式和银行账户比较类似,系统中要显示记录账户中有多少以太币,转账的时候只要余额够就可以转账,不用说明币的来源也不用找零,这样可以防御double spending attack。以太坊虽然不用说明币的来源,但是也不能篡改账户余额,因为账户余额在所有全节点的状态数中维护,必须所有全节点认为你的账户余额发生改变,你的账户余额才发生改变。虽然能防御double spending attack,但也可能会受到replay attack(重放攻击),转账的时候收款人是有恶意的,他可能会将这次交易再次发布,导致付款人转了两次。double spending attack 和 replay attack 是相对的,double spending 是花钱的人不诚实,replay attack 是收钱的人不诚实。以太坊解决replay attack的手段是加一个nonce(交易数),交易数代表这个账户建立以来的交易次数,由全节点维护,这个交易数会在交易过程成写进交易信息一起签名保护,如果交易的交易数比全节点中维护的付款人的交易数刚好大1,说明是正常交易,如果交易被重放的话,两者会相等,属于不合法交易。
以太坊中有两类账户,一类是外部账户(externally owned account),外部账户类似于比特币的账户,就是一对公私钥,掌握了私钥就掌握了这个账户。外部账户有两个状态,一个是balance,一个是nonce。第二类账户是合约账户(smart contract account),合约账户不是通过公私钥对控制,除了balance和nonce,还有code,storage。