大家可以回忆一下第一次拥有自己的银行账户的经历,可能很多人已经对第一次开设银行账户的情景很模糊了。我第一次拥有银行卡是在自己收到大学录取通知书时,我清晰地记着邮寄过来的大学录取通知书里面有一张建设银行卡,这张卡一直伴随我至今。所以,我是被动地拥有了自己的第一个银行账户。但就是这张建设银行卡,让我意识到了享受数字金融便利性的重要一环就是要牢记自己的账户和账户密码。同样地,在区块链世界里的数字资产,个人账户也是异常重要的。
我在介绍比特币的文章中并没有详细去聊比特币系统中的账户,这并不代表账户不重要,而是单独介绍比特币账户很难让大家形成一个清晰的认知。在这个意义上,将比特币账户和以太坊账户对比来看就显得非常必要了。
比特币账户
比特币账户采用地模式是基于交易的账本,这种账本里面并没有显示地记录一个账户中有多少余额。如果你想知道比特币系统中自己账户的余额,你需要找到一个全节点,向这个全节点询问,因为有关账户余额信息是存储在全节点的UTXO集合中的。比特币的这种基于交易的账本模式,优势是隐私保护做地比较好,你有多少比特币,甚至你自己都说不清楚,更别说其他人了。不足的地方在于使用体验不太友好,和实际生活相差甚远。
我相信只要是拥有银行卡的人,都一定操作过转账。在中心化的银行系统中,我们进行转账的背后,银行会在维护的数据库中进行两个操作:扣钱和加钱。比如A->B(10 元),那么银行系统会把A账户余额更新为“X=X-10(X为A账户余额)”;同时,银行系统会把B账户余额更新为“Y=Y+10(Y为B账户余额)”。
而在比特币这样一个去中心化的账本系统中,就不是这样的。
假设A->B(10 BTC),那么A是需要说明这10 BTC的来源的,类似于“这7 BTC是C转给我的,另外3 BTC是D转给我的”;但在现实生活中,上述A->B(10元)是不需要说明这10元是怎么来的,只要A的账户里面有10元就可以了。
除此之外,比特币系统中另一个鸡肋的地方在于系统中每笔交易都是单独处理的,这种处理方式没有找零功能。经过A->B(10 BTC)这笔交易,B账户中就有了10 BTC。如果B想要花这笔钱的话,则必须一次性花出去,否则会造成损失。假设B只想花掉3 BTC,这时候剩下的7 BTC就会当作这笔交易的手续费给到矿工,那矿工是相当高兴的。所以,在这种情况下,转账的同时需要进行另一笔交易,就是把剩下的7 BTC又转给自己的另一个比特币账户地址。通过这种方式,比特币系统才实现了找零的效果。
以太坊账户
以太坊采用地是另一种账户模式,那就是基于账户的账本(account-based ledger)。在这种模式下,系统需要显示地记录你的账户上有多少个以太币,这和我们日常使用地银行账户就比较类似了。
那么,假设A->B(10 ETH),这时候A就不用说明10 ETH的来源,而只要A账户中有10个或以上的以太币就行了。同样地,当B想要花掉这些以太币时,也不用一次性花出去,因为没花完的币会继续留在B的账户里面。
实际上,以太坊基于账户模式的账户有两类:外部账户和合约账户。
1、外部账户
外部账户类似于比特币中基于交易的账户模式,它也是由公私钥对儿控制的,有时又把这类账户称为一般账户。
外部账户的状态(后面会聊到以太坊的状态树结构,这里大家只要知道他是一种数据结构就好了)里面含有 balance 和 nonce,而 balance 就是用来显示地记录以太坊账户中的余额信息的,nonce 是用来记录交易次数的。以太坊的外部账户优势在于它天然对于双花攻击有防御作用,这种模式的不足在于它对重放攻击是很难防御的。
比如,A->B(10 ETH)这笔交易已经完成并写进以太坊系统中了,但是A是一个有恶意的节点,A想把刚花出去的10 ETH重新再花一遍;这时候很好办,只要nonce值“+1”就好了,A账户的以太币就会扣掉两遍。而如果B是有恶意的节点,它想重放这笔交易,这时候又该怎么办呢?
在以太坊系统中,每笔交易会同时记录一个交易次数nonce值,这个nonce 值是会和交易本身共同作为内容被A签名写进区块链中的;所以,即便B想要重放这笔交易,但是它没有办法伪造A的签名,也就没办法成功重放这笔交易。
2、合约账户
以太坊系统中另一类账户是合约账户(smart contract account),合约账户中也包含nonce并且一个合约可以调用另一个合约,所以它需要通过 nonce 来记录合约调用的次数。但是合约账户不能发起一个交易,发起交易只能通过外部账户发起。除此之外,合约账户中还包含了code以及相关的状态(storage)。
为什么要设计这样的合约账户模式?
我在《区块链不能只有比特币,至少还需要以太坊》这篇文章中提到过以太坊的重要创新之一就是将区块链技术扩展应用到了合同中,而这种智能合约的实现和合约账户是分不开的。以太坊的创始人是vitalik,当时创建以太坊时只有19岁。他当时想到现实生活中的合同签订,需要保证合约签订的所有干系人是身份稳定的,不能说签订合约的主体今天是这个身份,明天又是另一个身份。所以,合约账户不能发起交易的必要性就在这里了,这样就能够保证合约签订主体不会恶意篡改自己的身份。否则他将要承担无法挽回的损失。
此外,不论是债券、期权、期货还是其他的金融衍生品(financial derivative),在交易这些资产时都是需要强调身份的稳定的。vitalik鉴于历史上已有的各种各样的经验教训,最终决定了以太坊中需要有合约账户。从长远角度来看,合约账户时更加符合现实需要的,这也是以太坊相较于比特币的优势所在。
经过比特币和以太坊的努力,区块链世界出现了极具价值的金融资产。遗憾地是,在比特币和以太坊之后,区块链世界很长时间都没有看到重大创新出现;伴随而来的是,区块链各种乱象丛生,大多数所谓的加密货币都没有跳出比特币和以太坊架设地框架。但各种不同方向的微创新仍然在不断涌现,有些已经被市场广泛接受,昭示着区块链技术的未来依然向好。
区块链世界的机会,或许就蕴藏在其中。