02 ETH-账户
02 ETH-账户
比特币的账户资产,根据 UTXO 中的信息来进行推算(基于交易的模式,不是基于账户的模式)。
好处:隐私保护比较好。(本人有多少个账户信息,可能自己都说不清楚)
缺点:使用上跟日常体验不太一样。每个币要说明来源;同时,每次交易必须把所有币花完。
很多比特币钱包可以自动生成接受余额的地址。每次交易换一个新地址。有利于隐私保护。
以太坊:account-based ledger
相似于银行账户的形式,有显示的余额的概念。不用说明币的来源,所以也不需要交易中的hash指针。
好处:比特币面临的主要挑战就是double spending attack。以太坊的基于账户的方式,对于double spending attack,有天然的防御作用(你想花钱,我把你钱在扣一次就完事了)。
那有没有什么弱点呢?
replay attack,重返攻击(比如:A—>B 10个ETH,B有恶意,B把交易在网上重新广播一遍,A的钱扣了两次。)
double spending attack 与 replay attack 相对称,double spending attack 是花钱的人不诚实,花过的钱想再花一次;replay attack 是收钱的人不诚实,别人已经转过钱,想要再转一边。
比特币中有没有可能出现重放攻击?
不可能。因为是很明显的double spending attack。
以太坊中如何解决重放攻击?
很简单,加一个nonce,记录一下这个账户有史以来一共发布过多少个交易。转账的时候,nonce要成为交易内容的一部分,都是收到发布交易者签名的保护。(因为有签名的保护,所以nonce的值,别人改不了)
系统中的全节点维护账户的状态,不光是维护账户的余额,还要维护nonce的值,nonce一开始都是0。
假设一个账户的nonce=20,执行了nonce=21的交易,全节点会校验签名,同时修改自己的维护的该账户的nonce值,使得nonce=21,如果发生重放攻击,全节点发现自己的nonce=21,说明该交易已经执行过了,就不会再执行一遍了。
以太坊账户:
外部账户(externally owned account):
类似于比特币账户,用公私钥可控制。外部账户有账户余额,还有nonce。(其实nonce 应该叫做 count更好)
合约账户(smart contract account):
合约账户不是通过公私钥对来控制,合约账户除了有balance和nonce(一个合约可以调用另外一个合约,所以同样需要nonce值,记录调用的次数,但是,合约账户不能主动发起一个交易,所有的交易只能由外部账户发起。外部账户调用合约账户,该合约账户发送msg调用另外一个合约,这是可以的)之外,合约账户还具有code 和 storage。
创建合约的时候,会返回一个合约地址,知道合约的地址,就可以调用合约,调用过程中合约状态会发生变化,code不会变,storage会变。
问题:为什么要设计这样一种新的账户模型?不用比特币已有的代码,另做一套?
Vitalik(19岁小孩)。
比特币地址讲究匿名性,建议每交易一次换一个地址;而对于合约来说,要求参与者有比较稳定的身份。
有人建议用智能合约实现金融衍生品(financial derivative),比如:期权、期货等。
如果你有隐私保护的需要,也可以创建不同的账户,进行不同的交易。