在以太坊中的每一笔交易都有nonce,我们上一次看到这个词的时候是在简单实现pow共识算法这篇文章中,用来去寻找工作量证明,但是这个nonce在以太坊交易中也是同样的作用么?接下来让我们深入这个问题.
nonce 用于工作量证明
- 旷工在把block记到区块链之前需要提供工作量证明,最先做出来的旷工,记下这个block,当前的比特币和以太坊的共识算法都是这个(以太坊正在准备迁移到pos共识)
- 伪代码
#挖矿 difficulty代表复杂度 表示前difficulty位都为0才算成功
def minerBlock(self,difficulty):
while(self.hash[0:difficulty]!=str(0).zfill(difficulty)):
self.nonce+=1
self.hash = self.calculateHash()
-
可以看到旷工需要提供工作量证明,不停的计算,直到满足特定的条件,nonce在这里表示矿工做了多少次hash运算,difficulty表示计算的难度
-
需要注意的点就是,工作量证明是block级别的,是旷工把区块添加到区块链之前,所做的一些事情
-
比特币 区块 nonce 体现 链接
nonce used for bitcoin block.png
-
以太坊 区块 nonce 体现 链接
nonce used for ethereum block.png
nonce 用于以太坊 transaction
- 在以太坊中nonce 也用在了区块上,和比特币一样,用于工作量证明,但是以太坊在每笔交易的时候也有个nonce(对于外部账户),这是数值是每个账户在发送交易的时候所产生的,无论何时你发送一笔交易这个nonce都会自增1;每个交易里的nonce是为了确保:
每个账户执行交易的时候都是顺序的
或许你已经猜到了这样设计的重要性,很棒;就是为了防止 double-spends(双花),举一个简单的例子:
-
你用正常的GASPRICE执行一笔交易,等待着被某个矿工mined
-
你用更高的GASPRICE执行另外一笔交易,然后这笔交易等待着被另外一个矿工mined,这会让第一笔交易失效
-
这就是为什么以太坊交易中会用到nonce ,这样双花攻击就不会产生,在交易为1的nonce没有被mined之前,nonce为2的交易不会被mined
为什么比特币交易里面没有nonce?
-
比特币是基于UTXO模型(未花费的交易输出)
utxo model.png -
以太坊是基于账户模型
account model.png - 但是怎么去理解呢,我们举一个🌰~~~
比如你要买一瓶饮料12块钱:
-
你口袋里有一张10块的,1张5块的,你把这两张纸币递给老板,老板找你3块钱零钱,这就是基于UTXO的模型,因为你口袋里就只有2张纸币,一张10块,一张5块,所以你不可能出现双花的情况
-
当然你可能会觉得,现在都什么年代了,谁还带现金?二话不说,从钱包掏出你的金卡,拍在桌子上说,刷卡~~~ ,在用pos机的时候,银行会首先会检查你的账户有没有12块,然后有的话扣除12块,交易成功;其实上面有两部操作,第一检查你的余额,第二然后扣除你的钱,如果这两步不是原子操作的话,会产生双花。比如现在你的银行卡余额里只有12块,然后你同时发送两笔刷12块的请求,那么如果没有原子性的保证的话,同一时刻两笔请求都去检查你的账户发现都有12块钱,可以支付,接着两笔交易都会扣除12块,最后你的账户余额是-12,这就是基于账户模型的弊端,因为账户是基于状态的也就是你的balance,所有的围绕balance的操作要保证原子性,否则可能出现双花的情况
网友评论