首页 > 编程语言 >区块链编程(二)

区块链编程(二)

时间:2024-08-09 15:49:24浏览次数:8  
标签:hash pow 编程 block byte 区块 data Block

golang

package blockchain
import ( "bytes" "crypto/sha256" "encoding/binary" "fmt" "log" "math" "math/big" ) // Take the data from the block // create a counter (nonce) which starts at 0 // create a hash of the data plus the counter // check the hash to see if it meets a set of requirements // Requirements: // The First few bytes must contain 0s const Difficulty = 18 type ProofOfWork struct { Block *Block Target *big.Int } func NewProof(b *Block) *ProofOfWork { target := big.NewInt(1) target.Lsh(target, uint(256-Difficulty)) pow := &ProofOfWork{b, target} return pow } func (pow *ProofOfWork) InitData(nonce int) []byte { data := bytes.Join( [][]byte{ pow.Block.PrevHash, pow.Block.Data, ToHex(int64(nonce)), ToHex(int64(Difficulty)), }, []byte{}, ) return data } func (pow *ProofOfWork) Run() (int, []byte) { var intHash big.Int var hash [32]byte nonce := 0 for nonce < math.MaxInt64 { data := pow.InitData(nonce) hash = sha256.Sum256(data) fmt.Printf("\r%x", hash) intHash.SetBytes(hash[:]) if intHash.Cmp(pow.Target) == -1 { break } else { nonce++ } } fmt.Println() return nonce, hash[:] } func (pow *ProofOfWork) Validate() bool { var intHash big.Int data := pow.InitData(pow.Block.Nonce) hash := sha256.Sum256(data) intHash.SetBytes(hash[:]) return intHash.Cmp(pow.Target) == -1 } func ToHex(num int64) []byte { buff := new(bytes.Buffer) err := binary.Write(buff, binary.BigEndian, num) if err != nil { log.Panic(err) } return buff.Bytes() }

 

块的定义

package blockchain

type BlockChain struct {
    Blocks []*Block
}

type Block struct {
    Hash     []byte
    Data     []byte
    PrevHash []byte
    Nonce    int
}

func CreateBlock(data string, prevHash []byte) *Block {
    block := &Block{[]byte{}, []byte(data), prevHash, 0}
    pow := NewProof(block)
    nonce, hash := pow.Run()

    block.Hash = hash[:]
    block.Nonce = nonce

    return block
}

func (chain *BlockChain) AddBlock(data string) {
    prevBlock := chain.Blocks[len(chain.Blocks)-1]
    new := CreateBlock(data, prevBlock.Hash)
    chain.Blocks = append(chain.Blocks, new)
}

func Genesis() *Block {
    return CreateBlock("Genesis", []byte{})
}

func InitBlockChain() *BlockChain {
    return &BlockChain{[]*Block{Genesis()}}
}

 

main 方法

package main

import (
    "fmt"
    "strconv"

    "github.com/tensor-programming/golang-blockchain/blockchain"
)

func main() {
    chain := blockchain.InitBlockChain()

    chain.AddBlock("First Block after Genesis")
    chain.AddBlock("Second Block after Genesis")
    chain.AddBlock("Third Block after Genesis")

    for _, block := range chain.Blocks {

        fmt.Printf("Previous Hash: %x\n", block.PrevHash)
        fmt.Printf("Data in Block: %s\n", block.Data)
        fmt.Printf("Hash: %x\n", block.Hash)

        pow := blockchain.NewProof(block)
        fmt.Printf("PoW: %s\n", strconv.FormatBool(pow.Validate()))
        fmt.Println()

    }
}

 

标签:hash,pow,编程,block,byte,区块,data,Block
From: https://www.cnblogs.com/apenote/p/18350872

相关文章

  • Kotlin 面向对象编程 (OOP) 基础:类、对象与继承详解
    什么是面向对象编程(OOP)?OOP代表面向对象编程。过程式编程是编写执行数据操作的过程或方法,而面向对象编程则是创建包含数据和方法的对象。与过程式编程相比,面向对象编程具有以下几个优势:OOP更快且更易于执行OOP为程序提供了清晰的结构OOP有助于保持Kotlin代码的DRY......
  • 《信息学奥赛一本通编程启蒙》3031-3050(Scratch、C、C++、python)
    3031:练7.3买图书(C、C++、python)3031:练7.3买图书(C、C++、python)-CSDN博客3032:练7.4梯形面积(C、C++、python)3032:练7.4梯形面积(C、C++、python)-CSDN博客3033:【例8.1】人民币支付(Scratch、C、C++、python)3033:【例8.1】人民币支付(Scratch、C、C++、python)-CSDN博客3......
  • Delphi编程常用快捷键大全
    快捷键对于提高编程速度有着很重要的影响,本文汇总整理了Delphi常用的快捷键,供大家参考之用:Ctrl+PageUp将光标移至本屏的第一行,屏幕不滚动。Ctrl+PageDown将光标移至本屏的最后一行,屏幕不滚动。Ctrl+↓向下滚动屏幕,光标跟随滚动不出本屏。Ctrl+↑向上滚动屏幕,光标跟随滚动不出本屏......
  • 一个企业级的免费开源商城系统,无需专业编程知识,可视化DIY拖拽装修、包含PC、H5、多端
    前言在电子-商务领域,企业经常面临诸多挑战,如高昂的开发成-本、缺乏灵活性、以及难以满足个性化需求等。现有的商城软件往往功能固定,难以适应快速发展和变化的电商环境。为了解决这些痛点,需要一款灵活、可定制且易于扩展的商城系统,能够快速响应市场变化,满足不同企业的独特需求......
  • AOP -面向切面编程
    AOP-面向切面编程aop是oop(面向对象编程)的补充和完善。oop是一种纵向开发,然而当面对需要一些横向的功能如日志,就会导致大量重复的代码。aop利用横切把一些重复的非核心的代码插入到核心代码周围,不需要重复写很多遍。应用场景:日志记录,在方法的执行前后插入日志功能事务处......
  • 哪种编程语言更适合学习数据结构和算法:C++、Java 还是 Python?
    作为一名工程专业的学生,​​我正在尝试决定使用哪种编程语言来学习数据结构和算法(DSA)。我正在考虑C++,它提供高性能和强大的标准模板库,但对于初学者来说可能很复杂。Java具有强大的语法和内置集合,使DSA概念更容易掌握,尽管我不确定它与C++相比的性能。Python以其简单性和......
  • 函数式编程-Stream流
    一、函数式编程-Stream流1、概述1.1为什么学?能够看懂公司里的代码大数量下处理集合效率高代码可读性高消灭嵌套地狱普通写法与函数式编程写法对比:普通写法//查询未成年作家的评分在70以上的书籍由于洋流影响所以作家和书籍可能出现重复,需要进行去重List<B......
  • 51单片机之模块化编程
    一、模块化编程与传统方式编程的区别传统方式编程:在这种编程方式中,所有的函数通常都被放置在同一个文件main.c中。当项目中使用的模块较多时,这个文件中会包含大量的代码,导致代码难以组织和管理,也影响了编程者的思路。这种方式缺乏清晰的结构划分,使得代码的可读性和可维护性降......
  • Java设计模式和AOP编程
    Java六大设计原则;Java23种设计模式(在此介绍三种设计模式)Java设计模式单例模式应用场景:spring中bean的作用域用的就是单例模式//基本的单例模式————懒汉式publicclassstudent{//3.创建static修饰的成员变量privatestaticstudentstu;//1.设计私......
  • 不需要学编程,自制自己的操作系统!一个0基础自制操作系统的软件!详细教程!
    不需要学编程,自制自己的操作系统!一个0基础自制操作系统的软件!详细教程创建.py文件,内容如下fromtkinterimport*code='\n[org0x7c00]\n\nstart:\n\t\n\tmovbp,0x8000\n\tmovsp,bp\n\n\t\n\tmovax,0x0600\n\tmovbx,0x0700\n\tmovcx,0\n\tmovdx,0x184f\n\tint......