6.4 Resolvendo Consenso
6.4.2 Objeto de Consenso Forte
Um objeto de consenso forte reforc¸a a condic¸˜ao de validade requerendo que o valor de consenso seja proposto por processos corretos mesmo na presenc¸a de processos falhos. Esta condic¸˜ao mais restrita resulta num algoritmo mais complexo (por´em, ainda simples se comparado aos trabalhos anteriores [4, 85]). Entretanto, este algoritmo n˜ao compartilha de alguns benef´ıcios do algoritmo apresentado na sec¸˜ao anterior:
• n˜ao uniforme: o algoritmo de consenso forte n˜ao ´e uniforme pois um processo participante precisa saber quais s˜ao os outros para ent˜ao ler suas propostas e decidir um valor proposto por algum processo correto;
• consenso bin´ario: nosso algoritmo resolve apenas consenso bin´ario. Esta limitac¸˜ao ´e tamb´em fruto do fato de que um processo precisa saber se um valor foi proposto por um processo correto antes de decid´ı-lo;
• objeto t-limiar: o algoritmo para consenso forte n˜ao ´e livre de espera pois s˜ao requeridas m− t propostas para garantidamente o algoritmo terminar. Entretanto, o n´umero de processos necess´arios em nosso algoritmo ´e ´otimo: m ≥ 3t + 1 (veja corol´ario 1 na pr´oxima sec¸˜ao).
Algoritmo 12 Objeto de consenso forte (processo pi).
Vari´aveis compartilhadas:
1: ts= ∅ {PEATS}
procedure x.propose(v)
2: ts.out(hPROPOSE, pi, vi)
3: S0← ∅ {conjunto dos processos que propuseram 0}
4: S1← ∅ {conjunto dos processos que propuseram 1}
5: while |S0| < t + 1 ∧ |S1| < t + 1 do
6: for all pj∈P \ (S0∪ S1) do
7: if ts.rdp(hPROPOSE, pj, ?vi) then
8: Sv← Sv∪ {pj} {pj propˆos v}
9: end if
10: end for
11: end while
12: if ts.cas(hDECISION, ?d, ∗i, hDECISION, v, Svi) then
13: d← v {o valor inserido ´e o valor de decis˜ao}
14: end if 15: return d
O algoritmo 12 apresenta o protocolo para consenso bin´ario forte. Este algoritmo funciona da seguinte maneira: inicialmente, um processo pi insere sua proposta no espac¸o de tuplas aumentado
tsatrav´es da inserc¸˜ao da tupla PROPOSE (linha 2). A seguir, pi acessa continuamente ts tentando
ler as propostas (linha 7) at´e que ele encontre algum valor proposto por pelo menos t + 1 processos (lac¸o das linhas 5-11). O racioc´ınio por tr´as da espera por t + 1 propostas iguais ´e que pelo menos um processo correto propˆos um valor que aparece nessa quantidade de propostas, j´a que no m´aximo
tprocessos podem falhar. O primeiro valor que satisfizer esta condic¸˜ao ´e ent˜ao inserido no espac¸o de tupla usando cas. Est´a fase de confirmac¸˜ao ´e importante porque diferentes processos podem coletar t+ 1 propostas para diferentes valores e ´e preciso garantir que uma ´unica decis˜ao seja definida. Todas as invocac¸˜oes posteriores `a operac¸˜ao cas retornaram este valor (linhas 12-14).
Object State T S
Rrdp: execute(rdp(t)) : − invoke(p, rdp(t))
Rout: execute(out(hPROPOSE, p, xi)) : −
invoke(p, out(hPROPOSE, p, xi)) ∧ @y : hPROPOSE, p, yi ∈ T S Rcas: execute(cas(hDECISION, x, ∗i, hDECISION, v, Svi)) : −
invoke(p, cas(hDECISION, x, ∗i, hDECISION, v, Svi))∧
formal(x) ∧ |Sv| ≥ t + 1 ∧ (∀q ∈ Sv, hPROPOSE, q, vi ∈ T S)
Figura 6.3: Pol´ıtica de acesso para o PEATS usado no algoritmo 12.
A pol´ıtica de acesso para o PEATS usado no algoritmo 12 ´e apresentada na figura 6.3. Esta pol´ıtica especifica que qualquer processo pode ler qualquer tupla (regra Rrdp); que cada processo
pode introduzir apenas uma tupla PROPOSE no espac¸o (regra Rout); que o segundo campo do molde
usado na operac¸˜ao cas precisa ser um campo formal (regra Rcas); e que o valor de decis˜ao v deve
aparecer na propostas de pelo menos t + 1 processos. Estas regras simples, que podem facilmente ser implementadas na pr´atica, limitam efetivamente o poder de processos bizantinos, permitindo a existˆencia de um algoritmo bastante simples para a resoluc¸˜ao de consenso forte.
O algoritmo 12 requer apenas m(dlog me + 1) + (1 + (t + 1)dlog me) bits no objeto PEATS5 (m tuplas PROPOSE mais uma tupla DECISION). O algoritmo de consenso com a mesma resistˆencia apresentado em [4] requer (m + 1) 2t+1t sticky bits6.
Teorema 3 O algoritmo 12 implementa um objeto de consenso bin´ario forte t-limiar.
Prova: A partir da pol´ıtica de acesso podemos ver que a ´unica forma de inserir uma tupla DECISION no espac¸o ´e invocando a operac¸˜ao cas. Esta operac¸˜ao pode ser invocada com sucesso apenas uma vez, j´a que uma tupla inserida n˜ao pode ser removida (operac¸˜oes in e inp n˜ao s˜ao permitidas pela pol´ıtica), e duas tuplas de decis˜ao n˜ao podem ser inseridas (o segundo campo do molde usado na operac¸˜ao casprecisa ser formal). Em qualquer execuc¸˜ao do algoritmo, o primeiro processo que executa cas ap´os ter lido t + 1 tuplas PROPOSE com o mesmo valor v insere uma tupla DECISION com v (se sua invocac¸˜ao satisfaz a regra Rcas), fazendo com este se torne o valor de decis˜ao (linhas 13 e 15). A
propriedade de acordo ´e sempre satisfeita j´a que o valor v associado `a tupla DECISION no espac¸o ser´a lido por todos os processos corretos que n˜ao forem bem sucedidos em suas invocac¸˜oes da operac¸˜ao cas, i.e., todos que receberem false como resultado. Seus valores de decis˜ao ser´a v (linhas 12 e 15).
O algoritmo satisfaz tamb´em validade forte j´a que a tupla DECISION s´o pode ser inserida se seu valor v for justificado por t + 1 tuplas PROPOSE contendo este valor presentes no espac¸o (pelo menos uma foi inserida por um processo correto). Esta condic¸˜ao ´e reforc¸ada peloa regra Rcasda pol´ıtica de
acesso.
5Ex., apenas 68 bits s˜ao requeridos para t = 4 e m = 13.
6O algoritmo de [4] exige uma quantidade enorme de mem´oria. Por exemplo, se queremos tolerar t = 4 processos
Em termos de condic¸˜oes de terminac¸˜ao, o algoritmo ´e um protocolo t-limiar. Esta propriedade ´e satisfeita devido ao fato de que um processo s´o decide um valor v se este valor tiver sido proposto por t+ 1 processos. Assumindo m ≥ 3t + 1, podemos mostrar facilmente que se m − t processos corretos (pelo menos 2t + 1) invocam x.propose com algum valor v0∈ {0, 1}, sempre existir´a pelo menos t + 1 tuplas PROPOSE para algum valor (0 ou 1) e um processo ir´a inserir uma tupla de decis˜ao justificada no espac¸o. Dado que a operac¸˜ao cas ´e livre de espera, o algoritmo sempre termina.