# 159期【币圈人物】 北大肖臻以太坊的账户 **Published by:** [币同学](https://paragraph.com/@0x4484c3371eb90c8a9092ec8caecb3dfb3038c818/) **Published on:** 2022-04-17 **URL:** https://paragraph.com/@0x4484c3371eb90c8a9092ec8caecb3dfb3038c818/159 ## Content 你好,我是币同学。这是我分享学习的第159天,每天学习进步一点点。 关键词:北大肖臻老师的公开课,关于以太坊的账户。 1.比特币采用的是基于交易的账户模式(transaction-based ledger),没有显示记录每个账户的余额,要知道余额的信息,需要通过UTXO来推算。这种模式的隐私保护比较好,但也会有别扭之处。 第一个像日常使用,A要转给B 10BTC,A要说明这10BTC的来源,比如10BTC中的7BTC和3BTC,都是从哪个交易里获得的,证明币来源的合法性。 日常我们去银行存款的时候,需要说明钱的来源,花钱的时候不用再说明每一笔钱是从哪儿来的。 第二个你在前面交易中收到一笔输出,收到一些币,将来要花的时候,必须要一次性都花出去,不能只花一部分。比如A转给B 10BTC,将来B要转给C 3BTC,那剩下的7BTC要转给回B(比如B的另外一个地址)。很多比特币钱包,可以自动生成接受余额的地址,每次交易换一个新的地址,这也是有利于隐私保护的。 2. 以太坊是基于账户的模型(account-based ledger),这种模型和我们日常的银行账户是比较相似的,系统中要显示着记录---每个账户有多少以太坊。 比如A转给B 10ETH,将来B要转给C 3ETH,不用把剩下的7BTC要转回给自己。这个交易的合法性,只要验证A账户是否有足够多的钱(大于等于10ETH加手续费)即可,转账时不用说明A账户的币,是具体把哪10ETH转给了B,不用说明这些币是来源于哪个交易的。 这样做的好处:可以防止双花攻击(double spending attack),因为每花一次钱,直接从账户的余额中扣掉。 3. 以太坊中发布一个交易时,不需要说明币的余额,账户的余额是系统中全节点的账户所维护保存的。 但是以太坊会遇到重放攻击(repaly attack) A转给B 10ETH,过段时间后,该交易写进区块链,A就以为转账完成了。假设B是有恶意的,B把A转给B 10ETH的交易,又重新发布了一遍。那其他节点看,以为是一次新的转账,就把A的钱扣了两次,这就叫重放攻击。 以太坊如何避免重放攻击?加一个计数器/交易次数(nonce),就是这个账户有史以来,一共发布过多少个交易。转账的时候,交易的次数要成为转账内容的一部分,一起包含进去,都是受到发布交易者签名的保护。 比如上述例子A转给B 10ETH,A已经转给B20次的交易了,那么这次的交易nonce=21,然后把交易的内容及nonce发布到区块链上。因为有签名的保护,nonce值是改不了的。 系统中的节点,不光是要维护各账户的余额,还要维护各账户的nonce值。新创建的账户nonce一开始的时候,都是0。每次账户收到交易时,nonce进行+1。 4. 以太坊有两类账户 第一类账户叫外部账户/普通账户(externally owned accounts),类似于比特币用公钥私钥控制的账户。有账户余额(balance),还有nonce。【实际上,以太坊中nonce的描述是不准确的,它应该叫计数器。】 第二类账户叫合约账户(smart contract account),合约账户不是通过公钥私钥对来控制的,合约账户除了有账户余额(balance),有nonce(一个合约可以调用另外一个合约,所以同样用nonce来计算次数。),但是合约账户不能主动发起一个交易。 所有的交易,只能由外部账户发起。外部账户发起一个交易,如果调用了一个合约账户,该合约账户可以发送一个摘要(message),调用另外一个合约是可以的,但不能自己发起交易。 除此之外,合约账户还有代码(code)以及相关的状态(storage)(包括每个变量的取值)。 合约账户怎么被调用? 创建合约的时候,会返回一个地址,知道该合约地址,就可以调用这个合约。调用的过程中,代码会发生变化。代码(code)是不是变的,相关的状态(storage)就会变。 5. 为什么要设计出基于账户的模型? 比特币的隐私保护比较好,比如找零就会自动换一个新的地址。 但是以太坊支持的是智能合约,对于合约来说,要求参与者有比较稳定的身份。 比如用智能合约,实现一些金融衍生品(financial derivative),比如期权或者期货。 你参与了期货合约,如果盈利了,你换地址了,怎么把钱还给你? 所以以太坊采用的是基于账户的模型,以太坊的账户是希望保持稳定的,不论是外部账户还是合约账户。当然如果你有隐私保护的需求,同样可以根据需要,去创建很多的不同用处的账户。 今天就学习到这里,明天见。 ## Publication Information - [币同学](https://paragraph.com/@0x4484c3371eb90c8a9092ec8caecb3dfb3038c818/): Publication homepage - [All Posts](https://paragraph.com/@0x4484c3371eb90c8a9092ec8caecb3dfb3038c818/): More posts from this publication - [RSS Feed](https://api.paragraph.com/blogs/rss/@0x4484c3371eb90c8a9092ec8caecb3dfb3038c818): Subscribe to updates