// SolveBlock takes a block, target, and number of iterations as input and // tries to find a block that meets the target. This function can take a long // time to complete, and should not be called with a lock. func (m *Miner) SolveBlock(b types.Block, target types.Target) (types.Block, bool) { // Assemble the header. merkleRoot := b.MerkleRoot() header := make([]byte, 80) copy(header, b.ParentID[:]) binary.LittleEndian.PutUint64(header[40:48], uint64(b.Timestamp)) copy(header[48:], merkleRoot[:]) nonce := (*uint64)(unsafe.Pointer(&header[32])) for i := 0; i < iterationsPerAttempt; i++ { id := crypto.HashBytes(header) if bytes.Compare(target[:], id[:]) >= 0 { copy(b.Nonce[:], header[32:40]) return b, true } *nonce++ } return b, false }