#区块的定义和操作

#链的定义和操作

#工作量证明

//main.gopackage mainimport "fmt"func main(){fmt.Println("=======================")bc := NewBlockChain()t1 := Transactions{[]byte("111"),[]byte("a send b 1 BTC")}t2 := Transactions{[]byte("222"),[]byte("b send c 1 BTC")}bc.AddBlock(&t1)bc.AddBlock(&t2)fmt.Println()bc.Print()
}
//chain.gopackage mainimport "fmt"type BlockChain struct{blocks []*Block
}func NewBlockChain() *BlockChain{block := NewGenesisBlock()chain := BlockChain{blocks:[]*Block{block},}return &chain
}func (chain *BlockChain) AddBlock(body *Transactions){prevBlockHash := chain.blocks[len(chain.blocks)-1].Hashblock := NewBlock(string(body.Coinbase),string(body.Data),prevBlockHash)chain.blocks = append(chain.blocks,block)
}func (chain *BlockChain) Print(){for _,data := range chain.blocks{fmt.Printf("Version %d\n",data.Version)fmt.Printf("PrevBlockHash %x\n",string(data.PrevBlockHash))fmt.Printf("MerKelRoot %x\n",string(data.MerKelRoot))fmt.Printf("TimeStamp %d\n",data.TimeStamp)fmt.Printf("Bits %d\n",data.Bits)fmt.Printf("Nonce %d\n",data.Nonce)fmt.Printf("Hash %x\n",string(data.Hash))fmt.Printf("Coinbase %s\n",string(data.Coinbase))fmt.Printf("Data %s\n",string(data.Data))fmt.Printf("IsValid %v\n",NewProofWork(data).IsValid())fmt.Println("\r\n")}
}
//block.gopackage mainimport "time"//定义区块头结构体
type BlockHeader struct{//版本//区块版本号,表示本区块遵守的验证规则Version          int64//前一区块的哈希值//SHA256PrevBlockHash        []byte//梅克尔根//该区块中交易的梅克尔树根的哈希值 SHA256MerKelRoot         []byte//时间戳//区块生成时间TimeStamp            int64//难度值//该区块工作量证明的难度目标Bits               int64//随机值//挖矿找到的满足难度目标的随机值Nonce                int64//*当前区块哈希值//实际上,区块不存储哈希值,节点接收区块后独立计算并存储在本地Hash               []byte
}//定义区块体结构体
type Transactions struct{//第一条交易   矿工挖矿奖励Coinbase           []byte//普通交易信息//每笔交易包括(付款方、收款方、金额、手续费等)Data               []byte
}//定义区块结构体
type Block struct{BlockHeaderTransactions
}//创建区块
func NewBlock(coinbase,data string,prevBlockHash []byte) *Block{var block Blockblock.Version = 1block.PrevBlockHash = prevBlockHashblock.MerKelRoot = []byte{}block.TimeStamp = time.Now().Unix()block.Bits = TargetBitsblock.Coinbase = []byte(coinbase)block.Data = []byte(data)pow := NewProofWork(&block)nonce,hash := pow.Run()block.Nonce = nonceblock.Hash = hashreturn &block
}//创建创世块
func NewGenesisBlock() *Block{return NewBlock("Genesis Block","",[]byte{})
}
//pow.gopackage mainimport ("bytes""crypto/sha256""fmt""math""math/big""time"
)const TargetBits = 24//定义工作量证明结构
type ProofOfWork struct{block *Block//目标值target *big.Int
}//创建POW(PROOF OF WORK)的函数
func NewProofWork(block *Block) *ProofOfWork{//0x000000000000...01target := big.NewInt(1)//0x000000100000...00target.Lsh(target,256-uint(block.Bits))return &ProofOfWork{block,target}
}//寻找随机数 计算哈希
func (pow *ProofOfWork)Run()(int64,[]byte){fmt.Println("开始挖矿...")fmt.Printf("target < hash: [    %x]\n",pow.target.Bytes())var nonce int64 = 0var hash [32]bytevar hashInt big.Intfor nonce < math.MaxInt64{data := pow.prepare(nonce)hash = sha256.Sum256(data)hashInt.SetBytes(hash[:])if hashInt.Cmp(pow.target) == -1{fmt.Printf("found nonce // [%x] %d\n",hash,nonce)break}else{nonce++}}//返回找到的随机数nonce和算出的哈希return nonce,hash[:]
}//校验计算结果
func (pow *ProofOfWork)IsValid() bool{data := pow.prepare(pow.block.Nonce)hash := sha256.Sum256(data)var hashInt big.InthashInt.SetBytes(hash[:])if hashInt.Cmp(pow.target) == -1{fmt.Printf("%x",hash[:])return true}else{return false}
}func (pow *ProofOfWork)prepare(nonce int64) []byte{pow.block.TimeStamp = time.Now().Unix()block := pow.blocktmp := [][]byte{Int2Bytes(block.Version),block.PrevBlockHash,block.MerKelRoot,Int2Bytes(block.TimeStamp),Int2Bytes(TargetBits),Int2Bytes(nonce),block.Coinbase,block.Data,}data := bytes.Join(tmp,[]byte{})return data
}
//utils.gopackage mainimport ("bytes""encoding/binary"
)func Int2Bytes(i int64) []byte{var buf bytes.Buffererr := binary.Write(&buf,binary.BigEndian,i)if err != nil{panic(-1)}return buf.Bytes()
}

区块链/BlockChain+ProofOfWork相关推荐

  1. 谈谈目前我对区块链(Blockchain)的认识

    从 IBM Bluemix 云平台的过程中,发现了 Blockchain 这个服务,我才知道有这样一种强大火热的技术存在:只前只是知道有比特币,还申请过一个账户也想去挖矿,但后来也是不了了之了,并没有 ...

  2. 世界上最大的超级计算机,科学网—区块链(blockchain)如何能造出世界上最大的超级计算机? - 刘进平的博文...

    区块链(blockchain)如何能造出世界上最大的超级计算机? Technology As our desktop computers, laptops, mobile devices, etc.  ...

  3. 【Python】实现一个简单的区块链系统

    本文章利用 Python 实现一个简单的功能较为完善的区块链系统(包括区块链结构.账户.钱包.转账),采用的共识机制是 POW. 一.区块与区块链结构 Block.py import hashlib ...

  4. 区块链技术介绍----分布式总帐

    区块链(Blockchain)是比特币的底层技术,像一个数据库账本,记载所有的交易记录.这项技术也因其安全.便捷的特性逐渐得到了银行与金融业的关注.         ​区块链(Blockchain)是 ...

  5. 区块链演进的哲学思维

    井底望天 井区首席专栏作者 序:井通的很多哲学思维,不可能在这样的一篇短文全部体现出来, 而是我们这3年来不断进行区块链实践中,获取的点点滴滴的成果.欢迎各位有志的同 行一起参与建设区块链的实践应用, ...

  6. 探秘区块链 - 头条新闻

    区块链行业如今处于发展早期,其优势也日趋显著.作为记录比特币交易的分布式账簿,区块链已经吸引了无数业界大牛的目光,包括前摩根大通(JPMorgan)高管布莱斯·马斯特斯(Blythe Masters) ...

  7. 区块链,数字资产货币开发

    区块链,数字资产货币开发 2019年开局,区块链以一种让人摸不清头脑的姿态跌了一小把,成为第一场"风口",当然是带引号的. "二十年之后,人们还会像今天谈论互联网一样谈论 ...

  8. 从入门到精通聊聊区块链

    区块链(Blockchain),一个熟悉又陌生的关键词.可以简单的理解,区块链是一个不可篡改的去中心化的账本.它是为了解决第三方机构滥用记帐权导致的信任问题而产生的. 如果只想知道区块链是什么,然后来 ...

  9. Linux基金会宣布开发区块链技术的新团队

    2013年的时候,比特币的价格曾达到了顶峰,当时有不少银行都表示对这种底层块环链技术underlying blockchain technology感兴趣.基于此,开发者们可以构建出一个分布式的分总账 ...

最新文章

  1. GitHub上传代码、更新代码、token设置
  2. 通过性能计数器确定.net应用程序是否存在内存溢出
  3. html文档表示表格的标记,【单选题】在HTML文档中用于表示表格的标记对是( )...
  4. STM32用keil5调试程序出现 Error:Flash Download Failed-Cortex-M3解决方案
  5. 4.从单应矩阵中分离得到内参和外参(需要拍摄n=3张标定图片)
  6. 2022.3.25黄花酢浆草
  7. json_decode
  8. ps计算机按键.,计算机一级Photoshop视图操作快捷键
  9. 信号与系统(一) 能量信号和功率信号
  10. ACM_栈的压入、弹出序列
  11. 从其他项目中复制过来的mapper加载不进bean_手把手带你玩转k8s-一键部署springboot项目...
  12. html图片怎么去掉空白,css去除img图片下多余空白区域
  13. 齐岳研发可聚合性基团的小分子稀土配合物Eu(TTA)2phen
  14. C语言程序设计---读书笔记汇总(整理中)
  15. 从流水线角度看MIPS处理器ISA的实现逻辑以及RTOS操作系统仿真
  16. 回归模型评价指标-SST、SSR、SSE、R-square
  17. 文字识别(六)--不定长文字识别CRNN算法详解
  18. 青春励志感悟人生语录
  19. 数据分析从业人员获得更高学位的主要理由
  20. Java学习笔记(七)

热门文章

  1. 修改 IDEA 中 @author 默认值
  2. 妊娠对静息状态大脑活动、白质微结构、神经代谢物浓度和灰质结构的影响
  3. 科目二 车速忽快忽慢
  4. 安百拓西安仓储物流中心正式运营;中外运敦豪广东分公司迁新址 | 美通企业日报...
  5. Windows各版本官方原版系统下载
  6. 微信小程序中通过Basic Auth传递token
  7. JAVA JSP javaweb 火车订票系统(订票系统 火车票预订系统
  8. 自动驾驶汽车如何识别红绿灯?三个角度告诉你答案丨曼孚科技
  9. 从幻想到现实,虚拟人的成长之路
  10. 桌面上计算机图标移动变成复制,电脑桌面图标都变成lnk后缀怎么办