ETH-账户
比特币中用的是基于交易的账本(transaction ledger),这种模式下系统中并没有显示的记录每个账户有多少钱,要想知道有多少钱,只能通过UTXO你的信息来推算。
这种模式的好处是隐私保护比较好,你自己有多少钱你自己可能都不知道,别人就更不知道了。但也带来问题,使用上比较别扭,与日常体验不一样。当你收到币的时候,将来要花的时候,必须要一次性都花出。
例如A→B(10),A转B10个比特币,币的来源是A,B花的时候必须将10个都花出去,不能只花一部分,如果花3个付给C,剩下的7个就会被当成交易费了。所以必须得把剩下的7个币转给自己
B
′
B{}'
B′新地址。
以太坊系统采用的是基于账户的模型(account-based ledger)
以太坊系统对double spending attack有天然的防御作用,但与之相应的会有replay attack(重放攻击)。A向B转账,过一段时间,B将A的交易重新发布,从而导致A账户被扣钱两次。
为了防范重放攻击,给账户交易添加计数器,记录该账户有史以来发布过多少次交易,转账时候转账次数成为交易的一部分,一起包含进去。
然后把这个交易发布到网上去,因为有签名的保护,所以这个nonce计数的值别人是无法修改的。
系统中全节点维护账户余额和该计数器的交易数,从而防止本地篡改余额或进行重放攻击。
以太坊系统中存在两类账户:外部账户和合约账户。
-
外部账户(externally owned account):类似于BTC系统中的账户,谁有公私钥对,谁就对这个账户有控制权。存在账户余额balance和计数器nonce;
-
合约账户(smart contract account):并非通过公私钥对控制。(不能主动发起交易,只能接收到外部账户调用后才能发起交易或调用其他合约账户)其除了balance和nonce之外还有code(代码)、storage(相关状态-存储)。合约之间可以相互调用,nonce记录调用次数。
为什么要设立这样一个新的模型?
参考资料:
https://www.bilibili.com/video/BV1Vt411X7JF?p=15