新建blockchain.go
package main
import (
"github.com/boltdb/bolt"
"log"
"fmt"
)
const dbFile = "blockchain.db"
const blockBucket = "blocks"
type Blockchain struct{
tip []byte //最近的一个区块的hash值
db * bolt.DB
}
func (bc * Blockchain) AddBlock(){
var lasthash []byte
err := bc.db.View(func(tx * bolt.Tx) error{
b:= tx.Bucket([]byte(blockBucket))
lasthash = b.Get([]byte("l"))
return nil
})
if err!=nil{
log.Panic(err)
}
newBlock := NewBlock(lasthash)
bc.db.Update(func(tx *bolt.Tx) error {
b:=tx.Bucket([]byte(blockBucket))
err:= b.Put(newBlock.Hash,newBlock.Serialize())
if err!=nil{
log.Panic(err)
}
err = b.Put([]byte("l"),newBlock.Hash)
if err!=nil{
log.Panic(err)
}
bc.tip = newBlock.Hash
return nil
})
}
func NewBlockchain() * Blockchain{
var tip []byte
db,err := bolt.Open(dbFile,0600,nil)
if err!=nil{
log.Panic(err)
}
err = db.Update(func(tx * bolt.Tx) error{
b:= tx.Bucket([]byte(blockBucket))
if b==nil{
fmt.Println("区块链不存在,创建一个新的区块链")
genesis := NewGensisBlock()
b,err:=tx.CreateBucket([]byte(blockBucket))
if err!=nil{
log.Panic(err)
}
err = b.Put(genesis.Hash,genesis.Serialize())
if err!=nil{
log.Panic(err)
}
err = b.Put([]byte("l"),genesis.Hash)
tip = genesis.Hash
}else{
tip = b.Get([]byte("l"))
}
return nil
})
if err!=nil{
log.Panic(err)
}
bc:=Blockchain{tip,db}
return &bc
}
增加newBlock的方法,根据前一个区块的hash创建区块:
func NewBlock(prevBlockHash []byte) * Block{
block := &Block{
2,
prevBlockHash,
[]byte{},
[]byte{},
int32(time.Now().Unix()),
404454260,
0,
[]*Transation{},
}
pow := NewProofofWork(block)
nonce,hash := pow.Run()
block.Hash = hash
block.Nonce = nonce
return block
}
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
C语言算法速查手册
程晓旭、耿鲁静、张海、王勇 / 2009-10 / 49.00元
《C语言算法速查手册》用C语言编写了科研和工程中最常用的166个算法,这些算法包括复数运算、多项式的计算、矩阵运算、线性代数方程组的求解、非线性方程与方程组的求解、代数插值法、数值积分法、常微分方程(组)初值问题的求解、拟合与逼近、特殊函数、极值问题、随机数产生与统计描述、查找、排序、数学变换与滤波等。同时结合这些算法列举了将近100个应用实例,对其进行验证和分析。 《C语言算法速查手册》适......一起来看看 《C语言算法速查手册》 这本书的介绍吧!