0%

ETH二---账户

以太坊的账户

比特币是基于交易的账本模式,这种模式下,并没有显式地记录每个账户有多少钱,这种模式的好处是,隐私保护得比较好,你有多少钱,可能连你自己都说不清楚,别人就更搞不明白了。

别人转到你账上的钱,你一定要花出去,比如别人转给你10个,你花了3个比特币,你必须把剩余的7个比特币再转回给自己的另外一个账户,要不然这7个比特币全都会被当成tx fee给矿工了

以太坊设计了一个基于账户的交易模型account-based ledger:系统上显式地记录账户上有多少个以太币

上述,也不需要把币转给自己,剩下的ETH放在自己的账户上就可以了,上面的指针也不需要了

这样做的一个好处是什么?

以太坊的这种模式,对double spending attack有天然的防御作用:花钱就扣余额,你要花两次,我就扣两次。

但是,如果有人篡改余额怎么办?

你消费的时候不需要指出你的余额,而是从全节点中维护的一个状态树中的一个状态balance查找(后面会说明),这个balance无法篡改

但是还有一种重放攻击(replay attack),A给B转账,B有恶意,将A给B转账的交易重放了一次,这样不就可以扣除A的两次余额吗?

防止这种攻击的做法其实有多个:可以增加一个nonce(记录A转账(消费)的次数),如果有人想重放这个交易,就会发现,这个交易已经被执行过了,就不会再执行一遍了。

以太坊中有两类账户,一类叫做外部账户

①externally owned account,其中有两个属性balance 和nonce

②smart contract account,有balance nonce、code(代码)以及storage(相关的状态),合约账户不是通过公私钥对来管理的,不是你有这个合约账户的公私钥就有这个账户的控制权,一个合约可以调用另外一个合约(所以它同样需要一个nonce来记录一下合约调用的次数),但是智能合约账户不能主动发起一个交易(所有的交易只能由外部账户发起,外部账户发起了一个交易,如果调用了一个合约账户,这个合约账户可以发送一个message调用一个合约账户)

合约账户怎么被调用?你创建合约的时候,会返回一个地址,知道这个合约的地址就可以调用这个合约,状态(storage)会发生变化,代码不变。

为什么要创建这样一种新的模型?

比特币基于交易的账户的好处:隐私的保护比较好一点,以太坊注重的是智能合约,要求合约参与者要有比较稳定的身份。

现在有人提出的一些智能合约的衍生品:financial derivative,比如说你投钱投给一个合约账户,合约账户的地址变了,你找不到了就比较麻烦,以太坊在创建的时候,考虑到了已有的一些模型的利弊得失,最终没有采用比特币中基于交易的账户模型。