Так, попытаюсь собрать в кучу:
1) Всё операция. Проиграв операции мы можем собрать виртуальное отображение массива
2) Есть структура Id, состоящие из двух частей: случайного числа Site и какого-то возрастающего числа Clock.
3) Есть структура Op, состоящая из трех частей: OpId сделанный из Id, CauseId сделайнный из Id и Value сделанный из чего угодно
4) Каждый участник имеет какой-то случайный Site и Clock который начинается с 1.
5) Каждый участник хранит операции в массивах, где в массиве могут быть только операции одного учатсника (OpId.Site == Site), он-же yarn
6) Когда участник совершает какую-то операцию с массивом, он собирает Op из OpId из своего Site и Clock + 1. В случае если это первая операция с массивом то CasueId == OpId, если это не первая операция с массивом, то CauseId будет равен самому старшему OpId из всех массивов операций (?). Clock становится clock + 1, Op добавляется в хвост своего yarn и рассылается остальным участникам
7) Когда участник получает операцию другого участика, он добавляет её в хвост соотвествующего yarn и по необходимости обновляет виртуальное отображение массива