以太坊的账户

以太坊的账户模式

BTC系统是基于交易的账本,这种模式下,系统中没有显式的记录某个人有多少BTC,只能通过UTXO进行推算。这种模式的好处是你有多少钱,你自己都不一定清楚,但实际中,使用起来较为别扭,跟日常体验不太一样呢:A转给B钱的时候,需要说明币的来源。实际中只需要存钱说明来源,花钱则不用。此外,账户中的钱在花的时候,必须一次性全部花出去,多的钱要自己转到一个存钱的找零地址。

以太坊的账户_第1张图片

以太坊系统则采用了基于账户的模型,与现实中银行账户相似。系统中显式的记录每个账户以太币的数量,转账是否合法只需要查看转账者账户中以太币是否足够即可,同时也不需要每次全部转账。同时,这也也天然地防范了双花攻击。

以太坊的账户_第2张图片

重放攻击 

A向B转账,过一段时间,B将A的交易重新广播一次,从而导致A账户被扣钱两次。假设A给B转钱,双花攻击(double spending attack)是A不诚实,重放攻击(replay attack)是B不诚实。

为了防范重放攻击,给账户交易添加计数器记录该账户有史以来发布过多少次交易,转账时候将转账次数计入交易的内容中。 

以太坊的账户_第3张图片

如果此时如果B重放了这个交易,那么当前A的nonce至少是大于等于21,那么显然与下一笔合法交易要比当前nonce+1不再满足了!!
系统中全节点维护账户余额和该计数器的交易数,从而防止本地篡改余额或进行重放攻击。

外部账户合约账户

以太坊系统中存在两类账户:外部账户和合约账户。

外部账户:类似于BTC系统中公私钥对。存在账户余额balance和计数器nonce。

合约账户:不是通过公私钥对控制。(不能主动发起交易,以太坊规定所有的交易只能有外部账户才能发起,一个合约账户在接收到外部账户调用后才能发起交易或调用其他合约账户)其除了balance和nonce之外还有code(代码)、storage(相关状态-存储)。

如何调用一个合约账户?

创建合约账户的时候会返回一个地址,知道这个合约的地址就可以对其调用。调用过程中,代码不变但状态会发生改变。

为什么要做以太坊,更换为基于账户的模型而不是沿袭BTC系统?
比特币中支持每次更换账户,但以太坊是为了支持智能合约,而合约签订双方是需要明确且较少变化的。尤其是对于合约账户来说,需要保持账户的稳定状态。

参考资料

1.北京大学肖臻老师《区块链技术与应用》公开课

2.参考笔记

你可能感兴趣的:(以太坊的账户)