美文网首页
第一节 工作量证明

第一节 工作量证明

作者: 半亩房顶 | 来源:发表于2018-07-20 14:51 被阅读13次

    又开新坑,感觉要废了,但是忍不住想学啊,堪堪另安排了一些时间,学起来吧

    主要内容

    大致上总结下第一节的内容

    • 区块的结构(并不完整,仅是基础结构)hash 和 nonce下面会说,工作量证明中会用到
    • 如何创建区块 / 创世区块
    • 如何创建包含创世区块的区块链
    • 如何往区块链中添加区块
    • 如何实现工作量证明(挖矿)

    以上几个点中,感觉较多的就是了解性质的
    主要想说明下工作量证明的具体过程

    type ProofOfWork struct {
        //当前要验证的区块
        Block *Block
        //大数据存储 难度
        target *big.Int
    }
    
    const targetBit = 10
    

    工作量证明的结构如上,一个结构体,包含一个区块的指针以及一个挖矿难度的值,big int类型
    targetBit 是难度的值,值越大则越难挖矿

    //创建新的工作量证明对象
    func NewProofOfWork(block *Block) *ProofOfWork {
    
        //创建一个初始值为1的target 左移256 - targetBit
        target := big.NewInt(1)
        target = target.Lsh(target, 256-targetBit)
    
        return &ProofOfWork{block, target}
    }
    

    这一段是创建工作量证明结构的代码,关键在于生成难度值,设定一个big int,左移256-targetBit位,形成一个数字,如 00010000...000(共256位)

    //挖矿
    func (proofOfWork *ProofOfWork) Run() ([]byte, int64) {
    
        nonce := 0
    
        var hash [32]byte
        var hashInt big.Int
    
        for {
            //将block的属性拼接成字节数组
            dataBytes := proofOfWork.prepareData(nonce)
            //生成hash
            hash = sha256.Sum256(dataBytes)
            //hash转换为int(Hex->Dec)
            hashInt.SetBytes(hash[:])
    
            //判hash有效性 满足条件, 跳出循环
            if proofOfWork.target.Cmp(&hashInt) == 1 {
                break
            }
    
            nonce = nonce + 1
        }
    
        return hash[:], int64(nonce)
    }
    

    这段代码是工作量证明中具体的判别代码,通过不断的自加nonce,将求得的hash与难度值做对比,此时发现获取到了一个比难度值小的hash的时候,即完成工作量证明,跳出循环

    以上,欢迎讨论,欢迎转载

    相关文章

      网友评论

          本文标题:第一节 工作量证明

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