本文整理汇总了Golang中github.com/piotrnar/gocoin/lib/btc.NewBlock函数的典型用法代码示例。如果您正苦于以下问题:Golang NewBlock函数的具体用法?Golang NewBlock怎么用?Golang NewBlock使用的例子?那么恭喜您, 这里精选的函数代码示例或许可以为您提供帮助。
在下文中一共展示了NewBlock函数的15个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的Golang代码示例。
示例1: netBlockReceived
// This function is called from a net conn thread
func netBlockReceived(conn *OneConnection, b []byte) {
bl, e := btc.NewBlock(b)
if e != nil {
conn.DoS("BrokenBlock")
println("NewBlock:", e.Error())
return
}
idx := bl.Hash.BIdx()
MutexRcv.Lock()
if rb, got := ReceivedBlocks[idx]; got {
rb.Cnt++
MutexRcv.Unlock()
common.CountSafe("BlockSameRcvd")
return
}
orb := &OneReceivedBlock{Time: time.Now()}
if bip, ok := conn.GetBlockInProgress[idx]; ok {
orb.TmDownload = orb.Time.Sub(bip.start)
conn.Mutex.Lock()
delete(conn.GetBlockInProgress, idx)
conn.Mutex.Unlock()
} else {
common.CountSafe("UnxpectedBlockRcvd")
}
ReceivedBlocks[idx] = orb
MutexRcv.Unlock()
NetBlocks <- &BlockRcvd{Conn: conn, Block: bl}
}
示例2: headers
func (c *one_net_conn) headers(d []byte) {
var hdr [81]byte
b := bytes.NewReader(d)
cnt, er := btc.ReadVLen(b)
if er != nil {
return
}
if cnt == 0 /*|| LastBlock.node.Height>=10e3*/ {
SetAllHeadersDone(true)
return
}
for i := uint64(0); i < cnt; i++ {
if _, er = b.Read(hdr[:]); er != nil {
return
}
if hdr[80] != 0 {
fmt.Println(LastBlock.node.Height, "Unexpected value of txn_count")
continue
}
bl, er := btc.NewBlock(hdr[:])
if er == nil {
er = chkblock(bl)
if er != nil {
fmt.Println(er.Error())
os.Exit(1)
}
} else {
fmt.Println(LastBlock.node.Height, er.Error())
}
}
//fmt.Println("Height:", LastBlock.node.Height)
}
示例3: ParseTillBlock
func (ch *Chain) ParseTillBlock(end *BlockTreeNode) {
var b []byte
var er error
var trusted bool
prv := time.Now().UnixNano()
for !AbortNow && ch.BlockTreeEnd != end {
cur := time.Now().UnixNano()
if cur-prv >= 10e9 {
fmt.Println("ParseTillBlock ...", ch.BlockTreeEnd.Height, "/", end.Height)
prv = cur
}
nxt := ch.BlockTreeEnd.FindPathTo(end)
if nxt == nil {
break
}
b, trusted, er = ch.Blocks.BlockGet(nxt.BlockHash)
if er != nil {
panic("Db.BlockGet(): " + er.Error())
}
bl, er := btc.NewBlock(b)
if er != nil {
ch.DeleteBranch(nxt)
break
}
er = bl.BuildTxList()
if er != nil {
ch.DeleteBranch(nxt)
break
}
bl.Trusted = trusted
changes, er := ch.ProcessBlockTransactions(bl, nxt.Height, end.Height)
if er != nil {
println("ProcessBlockTransactions", nxt.Height, er.Error())
ch.DeleteBranch(nxt)
break
}
if !trusted {
ch.Blocks.BlockTrusted(bl.Hash.Hash[:])
}
ch.Unspent.CommitBlockTxs(changes, bl.Hash.Hash[:])
ch.BlockTreeEnd = nxt
}
if !AbortNow && ch.BlockTreeEnd != end {
end, _ = ch.BlockTreeRoot.FindFarthestNode()
fmt.Println("ParseTillBlock failed - now go to", end.Height)
ch.MoveToBlock(end)
}
ch.Unspent.Sync()
ch.Save()
}
示例4: GetchBlockForBIP152
func GetchBlockForBIP152(hash *btc.Uint256) (crec *chain.BlckCachRec) {
crec, _, _ = common.BlockChain.Blocks.BlockGetExt(hash)
if crec == nil {
fmt.Println("BlockGetExt failed for", hash.String())
return
}
if crec.Block == nil {
crec.Block, _ = btc.NewBlock(crec.Data)
if crec.Block == nil {
fmt.Println("SendCmpctBlk: btc.NewBlock() failed for", hash.String())
return
}
}
if len(crec.Block.Txs) == 0 {
if crec.Block.BuildTxList() != nil {
fmt.Println("SendCmpctBlk: bl.BuildTxList() failed for", hash.String())
return
}
}
if len(crec.BIP152) != 24 {
crec.BIP152 = make([]byte, 24)
copy(crec.BIP152[:8], crec.Data[48:56]) // set the nonce to 8 middle-bytes of block's merkle_root
sha := sha256.New()
sha.Write(crec.Data[:80])
sha.Write(crec.BIP152[:8])
copy(crec.BIP152[8:24], sha.Sum(nil)[0:16])
}
return
}
示例5: GetAverageFee
func GetAverageFee() float64 {
Last.Mutex.Lock()
end := Last.Block
Last.Mutex.Unlock()
LockCfg()
blocks := CFG.AverageFeeBlocks
UnlockCfg()
if blocks <= 0 {
blocks = 1 // at leats one block
}
AverageFeeMutex.Lock()
defer AverageFeeMutex.Unlock()
if end.Height == averageFeeLastBlock && averageFeeLastCount == blocks {
return AverageFee_SPB // we've already calculated for this block
}
averageFeeLastBlock = end.Height
averageFeeLastCount = blocks
AverageFeeBytes = 0
AverageFeeTotal = 0
for blocks > 0 {
bl, _, e := BlockChain.Blocks.BlockGet(end.BlockHash)
if e != nil {
return 0
}
block, e := btc.NewBlock(bl)
if e != nil {
return 0
}
cbasetx, cbasetxlen := btc.NewTx(bl[block.TxOffset:])
for o := range cbasetx.TxOut {
AverageFeeTotal += cbasetx.TxOut[o].Value
}
AverageFeeTotal -= btc.GetBlockReward(end.Height)
AverageFeeBytes += uint64(len(bl) - block.TxOffset - cbasetxlen) /*do not count block header and conibase tx */
blocks--
end = end.Parent
}
if AverageFeeBytes == 0 {
if AverageFeeTotal != 0 {
panic("Impossible that miner gest a fee with no transactions in the block")
}
AverageFee_SPB = 0
} else {
AverageFee_SPB = float64(AverageFeeTotal) / float64(AverageFeeBytes)
}
return AverageFee_SPB
}
示例6: UndoLastBlock
func (ch *Chain) UndoLastBlock() {
fmt.Println("Undo block", ch.BlockTreeEnd.Height, ch.BlockTreeEnd.BlockHash.String(),
ch.BlockTreeEnd.BlockSize>>10, "KB")
raw, _, _ := ch.Blocks.BlockGet(ch.BlockTreeEnd.BlockHash)
bl, _ := btc.NewBlock(raw)
bl.BuildTxList()
ch.Unspent.UndoBlockTxs(bl, ch.BlockTreeEnd.Parent.BlockHash.Hash[:])
ch.BlockTreeEnd = ch.BlockTreeEnd.Parent
}
示例7: BlocksMiner
func BlocksMiner(bl []byte) (string, int) {
for i, m := range MinerIds {
if MinedBy(bl, m.Tag) {
return m.Name, i
}
}
bt, _ := btc.NewBlock(bl)
cbtx, _ := btc.NewTx(bl[bt.TxOffset:])
adr := btc.NewAddrFromPkScript(cbtx.TxOut[0].Pk_script, Testnet)
if adr != nil {
return adr.String(), -1
}
return "", -1
}
示例8: defrag_db
func defrag_db() {
if (usif.DefragBlocksDB & 1) != 0 {
qdb.SetDefragPercent(1)
fmt.Print("Defragmenting UTXO database")
for {
if !common.BlockChain.Unspent.Idle() {
break
}
fmt.Print(".")
}
fmt.Println("done")
}
if (usif.DefragBlocksDB & 2) != 0 {
fmt.Println("Creating empty database in", common.GocoinHomeDir+"defrag", "...")
os.RemoveAll(common.GocoinHomeDir + "defrag")
defragdb := chain.NewBlockDB(common.GocoinHomeDir + "defrag")
fmt.Println("Defragmenting the database...")
blk := common.BlockChain.BlockTreeRoot
for {
blk = blk.FindPathTo(common.BlockChain.BlockTreeEnd)
if blk == nil {
fmt.Println("Database defragmenting finished successfully")
fmt.Println("To use the new DB, move the two new files to a parent directory and restart the client")
break
}
if (blk.Height & 0xff) == 0 {
fmt.Printf("%d / %d blocks written (%d%%)\r", blk.Height, common.BlockChain.BlockTreeEnd.Height,
100*blk.Height/common.BlockChain.BlockTreeEnd.Height)
}
bl, trusted, er := common.BlockChain.Blocks.BlockGet(blk.BlockHash)
if er != nil {
fmt.Println("FATAL ERROR during BlockGet:", er.Error())
break
}
nbl, er := btc.NewBlock(bl)
if er != nil {
fmt.Println("FATAL ERROR during NewBlock:", er.Error())
break
}
nbl.Trusted = trusted
defragdb.BlockAdd(blk.Height, nbl)
}
defragdb.Sync()
defragdb.Close()
}
}
示例9: ProcessNewHeader
func (c *OneConnection) ProcessNewHeader(hdr []byte) (int, *OneBlockToGet) {
var ok bool
var b2g *OneBlockToGet
bl, _ := btc.NewBlock(hdr)
c.Mutex.Lock()
c.InvStore(MSG_BLOCK, bl.Hash.Hash[:])
c.Mutex.Unlock()
if _, ok = ReceivedBlocks[bl.Hash.BIdx()]; ok {
common.CountSafe("HeaderOld")
//fmt.Println("", i, bl.Hash.String(), "-already received")
return PH_STATUS_OLD, nil
}
if b2g, ok = BlocksToGet[bl.Hash.BIdx()]; ok {
common.CountSafe("HeaderFresh")
//fmt.Println(c.PeerAddr.Ip(), "block", bl.Hash.String(), " not new but get it")
return PH_STATUS_FRESH, b2g
}
common.CountSafe("HeaderNew")
//fmt.Println("", i, bl.Hash.String(), " - NEW!")
common.BlockChain.BlockIndexAccess.Lock()
defer common.BlockChain.BlockIndexAccess.Unlock()
if er, dos, _ := common.BlockChain.PreCheckBlock(bl); er != nil {
common.CountSafe("PreCheckBlockFail")
//println("PreCheckBlock err", dos, er.Error())
if dos {
return PH_STATUS_FATAL, nil
} else {
return PH_STATUS_ERROR, nil
}
}
node := common.BlockChain.AcceptHeader(bl)
b2g = &OneBlockToGet{Started: c.LastMsgTime, Block: bl, BlockTreeNode: node, InProgress: 0}
AddB2G(b2g)
LastCommitedHeader = node
return PH_STATUS_NEW, b2g
}
示例10: block
func (c *one_net_conn) block(d []byte) {
BlocksMutex.Lock()
defer BlocksMutex.Unlock()
h := btc.NewSha2Hash(d[:80])
c.Lock()
c.last_blk_rcvd = time.Now()
c.Unlock()
bip := BlocksInProgress[h.Hash]
if bip == nil || !bip.Conns[c.id] {
COUNTER("UNEX")
//fmt.Println(h.String(), "- already received", bip)
return
}
delete(bip.Conns, c.id)
c.Lock()
c.inprogress--
c.Unlock()
atomic.AddUint64(&DlBytesDownloaded, uint64(len(d)))
blocksize_update(len(d))
bl, er := btc.NewBlock(d)
if er != nil {
fmt.Println(c.peerip, "-", er.Error())
c.setbroken(true)
return
}
bl.BuildTxList()
if !bytes.Equal(btc.GetMerkel(bl.Txs), bl.MerkleRoot()) {
fmt.Println(c.peerip, " - MerkleRoot mismatch at block", bip.Height)
c.setbroken(true)
return
}
BlocksCachedSize += uint(len(d))
BlocksCached[bip.Height] = bl
delete(BlocksToGet, bip.Height)
delete(BlocksInProgress, h.Hash)
//fmt.Println(" got block", height)
}
示例11: GetRawTx
func (ch *Chain) GetRawTx(BlockHeight uint32, txid *btc.Uint256) (data []byte, er error) {
// Find the block with the indicated Height in the main tree
ch.BlockIndexAccess.Lock()
n := ch.BlockTreeEnd
if n.Height < BlockHeight {
println(n.Height, BlockHeight)
ch.BlockIndexAccess.Unlock()
er = errors.New("GetRawTx: block height too big")
return
}
for n.Height > BlockHeight {
n = n.Parent
}
ch.BlockIndexAccess.Unlock()
bd, _, e := ch.Blocks.BlockGet(n.BlockHash)
if e != nil {
er = errors.New("GetRawTx: block not in the database")
return
}
bl, e := btc.NewBlock(bd)
if e != nil {
er = errors.New("GetRawTx: NewBlock failed")
return
}
e = bl.BuildTxList()
if e != nil {
er = errors.New("GetRawTx: BuildTxList failed")
return
}
// Find the transaction we need and store it in the file
for i := range bl.Txs {
if bl.Txs[i].Hash.Equal(txid) {
data = bl.Txs[i].Serialize()
return
}
}
er = errors.New("GetRawTx: BuildTxList failed")
return
}
示例12: GetRawTransaction
func GetRawTransaction(BlockHeight uint32, txid *btc.Uint256, txf io.Writer) bool {
// Find the block with the indicated Height in the main tree
common.BlockChain.BlockIndexAccess.Lock()
n := common.Last.Block
if n.Height < BlockHeight {
println(n.Height, BlockHeight)
common.BlockChain.BlockIndexAccess.Unlock()
panic("This should not happen")
}
for n.Height > BlockHeight {
n = n.Parent
}
common.BlockChain.BlockIndexAccess.Unlock()
bd, _, e := common.BlockChain.Blocks.BlockGet(n.BlockHash)
if e != nil {
println("BlockGet", n.BlockHash.String(), BlockHeight, e.Error())
println("This should not happen - please, report a bug.")
println("You can probably fix it by launching the client with -rescan")
os.Exit(1)
}
bl, e := btc.NewBlock(bd)
if e != nil {
println("NewBlock: ", e.Error())
os.Exit(1)
}
e = bl.BuildTxList()
if e != nil {
println("BuildTxList:", e.Error())
os.Exit(1)
}
// Find the transaction we need and store it in the file
for i := range bl.Txs {
if bl.Txs[i].Hash.Equal(txid) {
txf.Write(bl.Txs[i].Serialize())
return true
}
}
return false
}
示例13: dump_block
func dump_block(s string) {
h := btc.NewUint256FromString(s)
if h == nil {
println("Specify block's hash")
return
}
crec, _, er := common.BlockChain.Blocks.BlockGetExt(btc.NewUint256(h.Hash[:]))
if er != nil {
println(er.Error())
return
}
ioutil.WriteFile(h.String()+".bin", crec.Data, 0700)
if crec.Block == nil {
crec.Block, _ = btc.NewBlock(crec.Data)
}
if crec.Block.OldData == nil {
crec.Block.BuildTxList()
}
ioutil.WriteFile(h.String()+".old", crec.Block.OldData, 0700)
fmt.Println("Block saved")
}
示例14: verify_block
func verify_block(blk []byte, sl one_idx_rec, off int) {
bl, er := btc.NewBlock(blk)
if er != nil {
println("verify_block at off", off, er.Error())
return
}
if !bytes.Equal(bl.Hash.Hash[:], sl.Hash()) {
println("verify_block at off", off, "Header invalid")
return
}
er = bl.BuildTxList()
if er != nil {
println("verify_block at off", off, er.Error())
return
}
merk, _ := btc.GetMerkle(bl.Txs)
if !bytes.Equal(bl.MerkleRoot(), merk) {
println("verify_block at off", off, "Payload invalid")
return
}
}
示例15: do_mining
func do_mining(s string) {
var totbtc, hrs uint64
if s != "" {
hrs, _ = strconv.ParseUint(s, 10, 64)
}
if hrs == 0 {
hrs = uint64(common.CFG.MiningStatHours)
}
fmt.Println("Looking back", hrs, "hours...")
lim := uint32(time.Now().Add(-time.Hour * time.Duration(hrs)).Unix())
common.Last.Mutex.Lock()
bte := common.Last.Block
end := bte
common.Last.Mutex.Unlock()
cnt, diff := 0, float64(0)
tot_blocks, tot_blocks_len := 0, 0
bip100_voting := make(map[string]uint)
bip100x := regexp.MustCompile("/BV{0,1}[0-9]+[M]{0,1}/")
for end.Timestamp() >= lim {
bl, _, e := common.BlockChain.Blocks.BlockGet(end.BlockHash)
if e != nil {
println(cnt, e.Error())
return
}
block, e := btc.NewBlock(bl)
if e != nil {
println("btc.NewBlock failed", e.Error())
return
}
bt, _ := btc.NewBlock(bl)
cbasetx, cbtxlen := btc.NewTx(bl[bt.TxOffset:])
tot_blocks++
tot_blocks_len += len(bl)
diff += btc.GetDifficulty(block.Bits())
common.LockCfg()
if common.CFG.Beeps.MinerID != "" &&
bytes.Contains(bl[bt.TxOffset:bt.TxOffset+cbtxlen], []byte(common.CFG.Beeps.MinerID)) {
block.BuildTxList()
totbtc += block.Txs[0].TxOut[0].Value
cnt++
fmt.Printf("%4d) %6d %s %s %5.2f => %5.2f BTC total, %d txs, %.1f KB\n",
cnt, end.Height, end.BlockHash.String(),
time.Unix(int64(end.Timestamp()), 0).Format("2006-01-02 15:04:05"),
float64(block.Txs[0].TxOut[0].Value)/1e8, float64(totbtc)/1e8,
len(block.Txs), float64(len(bl))/1e3)
}
common.UnlockCfg()
res := bip100x.Find(cbasetx.TxIn[0].ScriptSig)
if res != nil {
bip100_voting[string(res)]++
nimer, _ := common.TxMiner(cbasetx)
fmt.Println(" block", end.Height, "by", nimer, "voting", string(res), " total:", bip100_voting[string(res)])
}
end = end.Parent
}
if tot_blocks == 0 {
fmt.Println("There are no blocks from the last", hrs, "hour(s)")
return
}
diff /= float64(tot_blocks)
common.LockCfg()
if common.CFG.Beeps.MinerID != "" {
fmt.Printf("%.8f BTC mined by %s, in %d blocks for the last %d hours\n",
float64(totbtc)/1e8, common.CFG.Beeps.MinerID, cnt, hrs)
}
common.UnlockCfg()
if cnt > 0 {
fmt.Printf("Projected weekly income : %.0f BTC, estimated hashrate : %s\n",
7*24*float64(totbtc)/float64(hrs)/1e8,
common.HashrateToString(float64(cnt)/float64(6*hrs)*diff*7158278.826667))
}
bph := float64(tot_blocks) / float64(hrs)
fmt.Printf("Total network hashrate : %s @ average diff %.0f (%.2f bph)\n",
common.HashrateToString(bph/6*diff*7158278.826667), diff, bph)
fmt.Printf("Average block size was %.1f KB, next difficulty change in %d blocks\n",
float64(tot_blocks_len/tot_blocks)/1e3, 2016-bte.Height%2016)
}