美文网首页区块链大学以太坊区块链研习社
关于nonce你应该知道的一些事情

关于nonce你应该知道的一些事情

作者: freelands | 来源:发表于2018-07-22 13:57 被阅读61次
    about nonce.png

    在以太坊中的每一笔交易都有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的操作要保证原子性,否则可能出现双花的情况

    相关文章

      网友评论

        本文标题:关于nonce你应该知道的一些事情

        本文链接:https://www.haomeiwen.com/subject/thylmftx.html