\documentclass[tikz,border=6pt]{standalone}
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage{amsmath}
\usepackage{tikz}
\usetikzlibrary{arrows.meta,positioning,calc}
\definecolor{ink}{HTML}{111827}
\definecolor{blue}{HTML}{2563EB}
\definecolor{orange}{HTML}{D97706}
\definecolor{paper}{HTML}{FFFDF7}
\begin{document}
\begin{tikzpicture}[>=Latex, font=\small, text=ink]
  \fill[paper] (-1.15,-3.25) rectangle (11.45,3.25);

  % PBFT: Request -> Pre-prepare -> Prepare -> Commit -> Reply.
  \node[anchor=east, font=\bfseries] at (-0.1,1.65) {PBFT};
  \foreach \y/\name in {2.35/P,1.85/R1,1.35/R2,0.85/R3} {
    \draw[ink!35] (0.85,\y) -- (10.55,\y);
    \node[anchor=east, font=\scriptsize] at (0.7,\y) {\name};
  }
  \node[draw=ink!35, rounded corners=2pt, fill=paper, font=\scriptsize] (clientIn) at (0.15,2.85) {Client};
  \node[draw=ink!35, rounded corners=2pt, fill=paper, font=\scriptsize] (clientOut) at (10.9,2.85) {Client};
  \foreach \x/\label in {1.2/Request,2.8/Pre-prepare,4.7/Prepare,7.0/Commit,9.45/Reply} {
    \draw[ink!16, dashed] (\x,0.58) -- (\x,2.65);
    \node[font=\scriptsize] at (\x,3.02) {\label};
  }
  \draw[orange!80, line width=0.5pt, ->] (clientIn) -- (1.55,2.35);
  \foreach \yr in {1.85,1.35,0.85} {
    \draw[orange!70, line width=0.42pt, ->] (2.35,2.35) -- (3.35,\yr);
  }
  \foreach \ya in {2.35,1.85,1.35,0.85} {
    \foreach \yb in {2.35,1.85,1.35,0.85} {
      \draw[orange!48, line width=0.22pt, ->] (4.15,\ya) -- (5.35,\yb);
      \draw[orange!48, line width=0.22pt, ->] (6.4,\ya) -- (7.6,\yb);
    }
  }
  \foreach \yr in {2.35,1.85,1.35,0.85} {
    \draw[orange!70, line width=0.42pt, ->] (8.75,\yr) -- (clientOut);
  }

  \draw[ink!18] (-0.75,0.35) -- (11.1,0.35);

  % HotStuff: three vote-producing phases; Decide is broadcast-only.
  \node[anchor=east, font=\bfseries] at (-0.1,-1.35) {HotStuff};
  \foreach \y/\name in {-0.55/Leader,-1.1/R1,-1.65/R2,-2.2/R3} {
    \draw[ink!35] (0.85,\y) -- (10.55,\y);
    \node[anchor=east, font=\scriptsize] at (0.7,\y) {\name};
  }
  \foreach \x/\phase in {1.55/Prepare,4.0/Pre-commit,6.45/Commit} {
    \node[font=\scriptsize, blue] at (\x+0.6,-0.22) {\phase};
    \foreach \yr in {-1.1,-1.65,-2.2} {
      \draw[->, blue!75, line width=0.48pt] (\x,-0.55) -- (\x+0.65,\yr);
      \draw[->, blue!75, line width=0.48pt] (\x+0.72,\yr) -- (\x+1.35,-0.55);
    }
    \node[draw=blue!45, rounded corners=2pt, fill=blue!7, font=\scriptsize] at (\x+1.45,-2.65) {QC};
  }
  \node[font=\scriptsize, blue] at (9.55,-0.22) {Decide};
  \foreach \yr in {-1.1,-1.65,-2.2} {
    \draw[->, blue!75, line width=0.48pt] (8.95,-0.55) -- (9.75,\yr);
  }
  \node[draw=blue!45, rounded corners=2pt, fill=blue!7, font=\scriptsize, align=center] at (10.55,-2.65) {execute / reply\\sin voto posterior};
  \node[font=\footnotesize, align=center] at (5.1,-3.03) {PBFT completa dos mallas entre replicas; HotStuff concentra votos en el lider y transporta QCs};
\end{tikzpicture}
\end{document}
