众所周知,比特币和以太坊在许多方面都有许多不同之处。例如,比特币和以太坊通过两种完全不同的方式跟踪用户有多少代币。比特币的使用是基于非成本交易输出UTXO(Unspent Transaction Outputs)以太坊采用基于账户的模型。
比特币:无交易输出UTXO
比特币交易主要由以前应用的几个部分组成UTXO只有两点:
1.交易输入,即我们将花费的代币;
2、交易输出,即谁将收到我们的代币。
一笔交易必须至少有一个输入和一个输出,即一笔交易的输出成为另一笔交易的输入。这样,代币的历史就可以追溯到它开采的块。
了解这个系统是如何工作的一个很好的类比是想象我们正在用现金购买产品。50美元的钞票。您可能会遇到以下情况之一:
1.产品售价10美元
你可以选择用10美元的钞票支付,这样交易只有一个输入(10美元的钞票)和一个输出(收银员收到10美元的钞票)。
2.产品售价30美元
你仍然可以选择付款,但这次你需要两张不同的钞票(10美元和20美元)。在这种情况下,有多个输入(10美元和20美元)和一个输出(收银员收到30美元)。
3.产品售价45美元
你可以选择用50美元的钞票支付,这样收银员就会给你5美元。这种情况相当于一个输入(50美元钞票)和多个输出(收银员45美元,返还5美元)。
4.产品价格55美元
你付10美元和50美元,也就是60美元。收银员给你5美元。这种情况相当于多个输入(10美元和50美元的钞票)和多个输出(收银员55美元,退5美元)。
正如你所看到的,你给收银员的账单(以及你收到的账单)将在未来用于其他付款。同样,比特币交易的输出也成为未来交易的输入。在它们被使用之前,它们是无成本的,所以它们被称为无成本交易输出(UTXO)。
如果你想知道你有多少现金,你需要把钱包里所有的纸币和硬币的价值加起来。在比特币的情况下,钱包会跟踪用户密钥UTXO。这样他们就知道用户有多少代币了。
以太坊:账户模型
理解以太坊基于账户模型的一个很好的类比是假设一个银行账户。客户账户中有一定数量的资金。如果客户A向客户B转账5美元,假设客户A至少5美元,客户A账户借5美元,客户B账户将贷记5美元。简而言之,这是以太坊账户的工作方式。
此外,还有两种类型的账户:
外部账户(EOA):它们由用户通过私钥控制。
合同账户:这些账户由智能合同代码控制。由于它们不受私钥控制,因此无法启动交易。发送到智能合同的交易可能会导致该合同调用其他合同的函数。
所有帐户都有以下字段:
1.余额:账户拥有的ETH余额;
2、Nonce : 账户产生的确认交易数量。
3.存储:智能合约仅用于永久数据存储(EOA不适用);
4.代码:仅用于智能合约:(EOA没有代码)。
以太坊的所有交易都是由EOA发起的,EOA合同账户可以接收和发送ETH:
1.如果收款账户是EOA,其余额增加;
2.如果接收账户为合同账户,则执行代码。另一方面,这个智能合同可以调用另一个智能合同。ETH发送到另一个智能合约,或者将ETH发送到EOA等等。
合同只在账户调用时运行。它们可以从EOA或者在其他智能合同中调用,但最终,一切都是由于EOA交易。
双花攻击
当同一代币被多次使用时,会发生双花攻击。如果你有一张10美元的钞票,你不能花两次,因为一旦你付钱给别人,它就不会在你的控制之下。但是,如何确保数字货币不会在不同的交易中使用相同的代币呢?
如何解决比特币双花攻击?
当代币在交易中使用时,代币将从UTXO集中删除。类似地,当新交易出现时,它们的输出就被添加到UTXO集合。因此,避免双花攻击就像检查你是否试图花费代币UTXO和谐的一部分一样简单。如果是这样,你可以安全地使用它。否则,它就会被花掉。每个完整的节点维护所有的节点UTXO这使得验证非常快。
重放攻击
双花攻击的概念不适用于以太坊,因为你不能在以太坊跟踪单个代币。以太坊最需要防止的是重放攻击(Replay Attacks)。
如何防止以太坊重放攻击?
想象一下,假设你想买一辆车,你已经向经销商发送了10辆车ETH收到车后,经销商收到ETH,你们都很高兴。在这笔有效的交易中,如果经销商一次又一次地向以太坊网络发送相同的交易,以有效地耗尽您的账户,那么这就是所谓的重放攻击。
以太坊使用Nonce解决这个问题的概念。在密码学中,Nonce在密码通信中只能使用一次的数字 。在以太坊,Nonce它是一个与账户相关的数字,代表从账户发送的交易数量。如果是合同账户,则代表已创建(未调用)的合同数量。
Nonce如何工作
当交易进行时,你的交易将包含一个Nonce值,让它独一无二。如果攻击者试图重放相同的交易,节点将看到你的地址Nonce经销商地址的数量ETH交易已经处理,然后被视为重复交易。
需要注意的是,攻击者只能尝试创建相同数量的交易。如果攻击者想要改变数量,签名将无效,节点将被拒绝。此外,无论你是否会ETH发送到哪个地址,您的下一笔交易将会增加Nonce 。
这种机制不仅可以防止重放攻击,还允许事务按特定顺序执行。如果您发送一系列信息Nonce 是3、4、5的交易,即使先收到Nonce对于4和5的交易,它们也会留在内存池中,直到有Nonce 3的交易已经确认。除非你正在编写代码来发送交易,否则你不必担心。一切都将由你的钱包处理。