Една от най-простите, но и най-фундаментални и важни характеристики в дизайна на Safe мрежата е „Възраст на възлите“. По същество „Node Age“ замества системи като “Доказателство за работа” за награждаване на доброто поведение, наказване на лошото и затрудняване на Сибил атаки. То предоставя важна мярка за качеството и текущата надеждност на всеки възел и е темата върху, която ще се съсредоточим тази седмица.
Общ напредък
Заедно с новаторската ни работа върху DBC, в която @davidrusu и други поведоха концепцията за „цифрови пари“ в съвсем нова посока, което я прави византийска отказоустойчива и по този начин подходяща за децентрализирана мрежа, ние сме щастливи да обявим, че Дейвид Русу ще оглави ново подразделение наречено Safe Labs. То ще бъде нашият R&D чадър за най-съвременна криптография, работа в мрежа и други. Изследванията ще бъдат предимно ориентирани към Safe, а не просто към какъвто и да е напредък в областта, но искаме да привлечем експерти от сферата по по-официален и структуриран начин.
@Anselme финализира PR за проверка на SAP при предаване и започна да разглежда византийското поведение при предаване (процеса на преразпределението на данните при разделяне на секция).
Дейвид Русу направи презентация за безконфликтните репликирани типове данни (CRDT) на среща на CompSci в Торонто, като спомена какво е правил в MaidSafe (естествено!). Голям интерес към темата и много потенциални контакти. Ще изнесе още една презентация за CRDT дърветата.
@Bochaco завърши PR за проверка на разрешението от страна на клиента при извършване на операции върху регистри (променяеми данни) и също така работи върху API-то на клиентския интерфейс за разходната книга.
И @Chriso разглежда неуспехите в тестовата мрежа, причинени от временното премахване на функции като “максимален капацитет”.
При вътрешните ни тестове, Metricbeat ни показа, че някои възли стигат до известно огромно използване на паметта след ден и нещо работа. След анализа ни, разбрахме, че изглежда има доста забивания, които се случват там (съсредоточени около почистването на връзките). Тук имаме няколко опции за корекция и затова просто търсим и тестваме, за да видим кое има най-голям смисъл да приложим.
Междувременно @Qi_ma презентира на екипа на тема „Node Age“.
Възраст на възела
Всеки възел в мрежата има адрес, който се определя като негов идентификатор, който всъщност е ключ, който се генерира, когато се присъедини към мрежата. Този „идентификатор на възел“ по същество е много голямо произволно число. Първите му няколко бита (напр. 0101101…) определят в коя секция ще бъде възелът и следователно за какви данни ще се грижи, докато последните осем бита (например 00000101) означават неговата „възраст на възела“ - в този случай 5.
Когато възелът е приет за първи път в мрежата, му се дава „възраст на възел“ равна на 5, така че неговият идентификатор завършва на …00000101 (присъединяващият се възел трябва да продължи да генерира ED25519 ключове, докато не получи такъв с правилен край и правилен префикс, обикновено като вторичен процес).
Колкото по-дълго възелът остава активен участник в мрежата, толкова неговия „Node Age“ ще нараства до крайно малко вероятния максимум от 255. Тук има няколко уловки: (1) неговата „възраст на възел“ ще нараства само ако се окаже надежден при съхраняване на парчета данни и предоставянето им при поискване на определен период от време. (2) Всеки път, когато неговата „възраст на възела“ се увеличава, той трябва да се премести в друга Секция.
Но Safe Network няма понятие за време, така че как можем да проследим от колко време се държи възелът коректно? Отговорът е, че използваме churn събития (промени в членството в секциите) като прокси за времето.
Churn ID - Решаващият фактор
Всяка секция ще съдържа 7 Старейшини (възли за вземане на решения) и 60+ Възрастни (възли за съхранение). Всеки път, когато даден възел излезе офлайн или се присъедини към секцията, което се случва често с Възрастните, Старейшините гласуват за случилото се. Всяко churn събитие има 256-битов идентификатор, който е комбиниран BLS подпис на 5 от 7-те Старейшини. Този „churn идентификатор“ също е ефективно произволно число и не може да бъде предвиден предварително.
Ако новият възел се окаже нефункционален в рамките на първите няколко разделяния, той ще бъде изхвърлен и ще трябва да поиска да се присъедини отново. Няма смисъл да се губят ресурси за мъртво тегло.
От друга страна, ако нашият нов възел изпълнява правилно задълженията си за няколко разделяния, ние искаме да го наградим и да увеличим възрастта му с 1, но не искаме да го проследяваме и записваме кога се е присъединил и т.н. Така че ние използваме churn ID
като вид лотариен билет.
Идентификаторът на churn (запомнете, че е произволно число) предоставя две функции, що се отнася до възлите. Първо, той предоставя начин на възлите да увеличат своята „възраст на възела“ и второ, тъй като не искаме възлите да изграждат репутацията си само в една секция поради риска от злонамерено поведение, „идентификаторът за разделяне“ също решава към коя случайна секция ще се присъедини новоповишеният възел.
Шанс за повишение
Ако идентификаторът на churn ID
е разделен по модул на 2 exp Node Age
(идентификатор на разделяне % 2^age == 0), ще бъдем повишени. Така че за нашата нова възраст на възел 5, ако „идентификационният номер на разделяне“ се дели на 32 – което ще се случва средно веднъж на всеки 32 разделяния – неговата „възраст на възел“ се увеличава до 6 и се премества в нова секция. След това вероятно ще трябва да изчака още 64 разделяния в новата си секция, преди да бъде повишен отново - повишението става експоненциално по-трудно, колкото по-дълго остава онлайн. Това означава, че Старейшините, най-старите 7 възела в секцията, съществуват дълго време и са се доказали в много различни секции, преди да постигнат статута си на гласуващи възли.
Как работи това? При всяко събитие на разделяне, Старейшините разделят „идентификатора на разделяне“ по възраст, като се започне от най-възрастния (255) и се стигне до най-младия (5). Когато една от тези възрасти съвпада с набор от възли в нашата секция, тогава ние го преместваме до възли elder_count/2
, които имат тази „възраст на възела“. Обикновено ще има само един в тази възрастова група, но в случай на излишък ние избираме възлите с идентификатор на възел
, който е най-близък до идентификатора на разделяне
.
Възлите също могат да бъдат понижени за нефункционално поведение (лошо представяне в сравнение с техните връстници). В този случай „възрастта на възлите“ се намалява наполовина, преди да бъдат преместени.
Предимства на Възрастта на възлите
Тази схема има три основни предимства. Първата е устойчивостта на Сибил атаки. За да контролира секция, нападателят ще трябва да контролира поне трима Старейшини. Процесът да станеш Старейшина е дълъг и труден и е невъзможно да се знае в коя Секция ще се озовеш. Когато мрежата е голяма, съотношението 7 старейшини към 60+ възрастни ще направи подобни Сибил атаки изключително трудни. Освен това на нови възли е разрешено да се присъединят към секция само когато е необходимо повече място за съхранение, така че нападателите не могат да наводнят мрежата с нови присъединяващи се възли.
Втората цел е да се избегне ненужната работа. Ако възелът не е надежден, той вероятно ще се провали рано, така че ние го изхвърляме, преди да може да продължи напред.
Третата е общата случайност. Принуждаването на възлите да прескачат от секция в секция, за да спечелят доверие, също има предимството на равномерното разпределение на капацитета.
Поток на преместване
@Qi_ma работи върху внедряването на Node Age, включително потоците на съобщения между Старейшините на секцията, кандидата за повишение и Старейшините в целевата секция. Той направи презентация пред отбора тази седмица. Ето един от неговите слайдове:
Старейшини в секцията първоизточник
- Съгласяват се за събитие за разделяне (промяна на членството) и го подписват (идентификатор на разделянето)
- Проверяват дали има кандидати за преместване
- Изберат най-старите кандидат(и)
- Изчисляват техните секции на местоназначение от техния идентификационен номер на възел, комбиниран с идентификатора на разделяне
- Увеличават възрастта им с 1
- Гласуват за всеки, който ще бъде преместен
- Когато бъдат събрани достатъчно гласове, информират всеки възел кандидат
Кандидат възел
- Получава съобщение от Старейшини
- Потвърждава стартирането на процеса на преместване
- Генерира нов идентификатор с правилни начални битове (секция) и последващи битове (новата му възраст)
- Закача се към новата секция [има правомощия да направи това от оригиналната си секция]
Старейшини в секцията дестинация
- Проверяват актуалността на знанията си за секцията първоизточник
- Актуализират ги, ако не са, и им казват да ги изпратят отново
- Проверяват дали подписите и подробностите за преместване са в ред
- Гласуват за присъединяването на кандидата
- Ако всичко върви добре, кандидатът се присъединява към новата секция
Преводи:
English Russian ; German ; Spanish ; French
- Официален сайт на Safe Network
- Обобщено представяне на Safe Network
- Safe Network Фундаменти
- Карта на проекта
- Подробна информация може да намерите както винаги във форума на международната общност: Safe Network Forum
- Ако имате въпроси може да ги зададете във Facebook групата на българската Safe общност: Redirecting...
- Ако искате да следите последните новини заповядайте във Facebook страницата на Safe Network България: Safe Network България