code: func ReadBlock(db ethdb.Reader, hash common.Hash, number uint64) *types.Block {
  	header := ReadHeader(db, hash, number)
  	if header == nil {
  		return nil
  	}
  	body := ReadBody(db, hash, number)
  	if body == nil {
  		return nil
  	}
  	return types.NewBlockWithHeader(header).WithBody(body.Transactions, body.Uncles)
  }
docs: // ReadBlock retrieves an entire block corresponding to the hash, assembling it
  // back from the stored header and body. If either the header or body could not
  // be retrieved nil is returned.
  //
  // Note, due to concurrent download of header and block body the header and thus
  // canonical hash can be stored in the database but the body data not (yet).