使用go语言实现具备以下功能的简易区块链
- 区块与区块链
- 共识机制
- 数据库
- Cli命令行操作
- 交易管理
- 密码学
- 数字签名
- 交易缓存池
- P2P网络管理
由于平时还要进行论文工作,项目不定时更新
2021.1.1实现了区块结构、区块链结构、工作量证明pow,剩下部分陆续更新
1.实现区块结构
package BLC import ( "bytes" "crypto/sha256" "time" ) //实现一个最基本的区块结构 type Block struct { TimeStamp int64 //时间戳,区块产生的时间 Heigth int64//区块高度(索引、号码)代表当前区块的高度 PreBlockHash []byte//前一个区块(父区块)的哈希 Hash []byte//当前区块的哈希 Data []byte//交易数据 } //创建一个新的区块 func NewBlock(height int64,preBlockHash []byte,Data []byte) *Block { var block Block block=Block{Heigth: height,PreBlockHash: preBlockHash,Data: Data,TimeStamp: time.Now().Unix()} block.SetHash() return &block } //计算区块哈希 func (b *Block)SetHash() { //int64转换成字节数组 //高度转换 heightBytes:=IntToHex(b.Heigth) //时间转换 timeStampBytes:=IntToHex(b.TimeStamp) //拼接所有属性进行hash blockBytes:=bytes.Join([][]byte{heightBytes,timeStampBytes,b.PreBlockHash,b.Data},[]byte{}) hash:=sha256.Sum256(blockBytes) b.Hash=hash[:] }
2.实现区块链结构
package BLC type BlockChain struct { Blocks []*Block //存储有序的区块 } //初始化区块链 func CreateBlockChainWithGenesisBlock() *BlockChain { //添加创世区块 genesisBlock:=CreateGenesisBlock("the init of blockchain") return &BlockChain{[]*Block{genesisBlock}} } //添加新的区块到区块链中 func (bc *BlockChain)AddBlock(height int64,data []byte,prevBlockHash []byte){ newBlock := NewBlock(height,prevBlockHash,data) bc.Blocks=append(bc.Blocks,newBlock) }
3.实现工作量证明
package BLC import ( "bytes" "crypto/sha256" "fmt" "math/big" ) //目标难度值,生成的hash前 targetBit 位为0才满足条件 const targetBit =16 //工作量证明 type ProofOfWork struct { Block *Block //对指定的区块进行验证 target *big.Int //大数据存储 } //创建新的pow对象 func NewProofOfWork(block *Block) *ProofOfWork { target:=big.NewInt(1) target=target.Lsh(target,256-targetBit) return &ProofOfWork{block,target} } //开始工作量证明 func (proofOfWork *ProofOfWork)Run() ([]byte,int64) { //数据拼接 var nonce=0 //碰撞次数 var hash [32]byte //生成的hash var hashInt big.Int //存储转换后的hash for { dataBytes:=proofOfWork.prepareData(nonce) hash=sha256.Sum256(dataBytes) hashInt.SetBytes(hash[:]) fmt.Printf("hash:\r%x",hash) //难度比较 if proofOfWork.target.Cmp(&hashInt)==1{ break } nonce++ } fmt.Printf("碰撞次数:%d\n",nonce) return hash[:],int64(nonce) } //准备数据,将区块属性拼接起来,返回字节数组 func (pow *ProofOfWork)prepareData(nonce int) []byte { data:=bytes.Join([][]byte{ pow.Block.PreBlockHash, pow.Block.Data, IntToHex(pow.Block.TimeStamp), IntToHex(pow.Block.Heigth), IntToHex(int64(nonce)), IntToHex(targetBit), },[]byte{}) return data }
4.当前运行结果
标签:
go区块链公链,go比特币区块链
免责声明:本站文章均来自网站采集或用户投稿,网站不提供任何软件下载或自行开发的软件!
如有用户或公司发现本站内容信息存在侵权行为,请邮件告知! 858582#qq.com
狼山资源网 Copyright www.pvsay.com
暂无“使用go实现简易比特币区块链公链功能”评论...
《魔兽世界》大逃杀!60人新游玩模式《强袭风暴》3月21日上线
暴雪近日发布了《魔兽世界》10.2.6 更新内容,新游玩模式《强袭风暴》即将于3月21 日在亚服上线,届时玩家将前往阿拉希高地展开一场 60 人大逃杀对战。
艾泽拉斯的冒险者已经征服了艾泽拉斯的大地及遥远的彼岸。他们在对抗世界上最致命的敌人时展现出过人的手腕,并且成功阻止终结宇宙等级的威胁。当他们在为即将于《魔兽世界》资料片《地心之战》中来袭的萨拉塔斯势力做战斗准备时,他们还需要在熟悉的阿拉希高地面对一个全新的敌人──那就是彼此。在《巨龙崛起》10.2.6 更新的《强袭风暴》中,玩家将会进入一个全新的海盗主题大逃杀式限时活动,其中包含极高的风险和史诗级的奖励。
《强袭风暴》不是普通的战场,作为一个独立于主游戏之外的活动,玩家可以用大逃杀的风格来体验《魔兽世界》,不分职业、不分装备(除了你在赛局中捡到的),光是技巧和战略的强弱之分就能决定出谁才是能坚持到最后的赢家。本次活动将会开放单人和双人模式,玩家在加入海盗主题的预赛大厅区域前,可以从强袭风暴角色画面新增好友。游玩游戏将可以累计名望轨迹,《巨龙崛起》和《魔兽世界:巫妖王之怒 经典版》的玩家都可以获得奖励。