Project

General

Profile

DS ЧаВо

this is a set of notes for Russian development team that works on this task, not useful for system users and developer. Pls return to the distributed store for any information. Thank you.

Где создаются экземпляры Environment?

Каждая нода создает таблицу, в которой сохраняет environment, связывая его с origin контракта (SLOT-контракта).

Где (в каком классе) вызываются onUpdated и прочее?

В коде ноды, возможно, в процессоре, после того, как в леджер внесены все изменения в соответствии с новым статусом

Как слот узнает что его контракт изменился?

Слот подписывается на ContractStorageSubscription и если ему нужны эти ответы, то он подключает там #receiveEvents(true). В этом случае система дернет NContract#onContractStorageSubscriptionEvent соответственно когда новая ревизия tracked contract (subscribed) будет создана. или отревочена.

в каком классе исполняется смартконтракт (слотконтракт)?

Это не вполне корректный вопрос. Часть - в айтем процессоре, часть - в клиент-сервере. Надо уточнить вопрос.

как юзеру получить список всех своих сохраненных контрактов? по ключам? по hashId?

В данный момент никак. Подписка вешается на слот-контракт а не на юзера - система не знает ничего о юзере, она оперирует только контрактами, юзеров как таковых у ноды нет. Сейчас не делаем

что храним в БД постгреса - юзерские контракты или слот-контракты? Или сущность слот-контракта собирается из набора данных из разных таблиц БД?

На данном этапе надо хранить последнюю ревизию слот-контракта и юзерские.

в БД у одного контракта есть множество подписок с expires_at. как считать общее время хранения?

Очевидно, по самой последней. Хранится одна копия контракта, а доступ к ней возможен со всех подписок с неистекшим сроком. Доступ через подписку с истекшим сроком невозможен, мы ее удаляем. Надо особенно отметить, что если слот-контракт истек, при продлении мы создаем новую подписку на тот контент, который есть в теле слот-контракта (последний уцелевший), если в базе и были более новые версии, то они не обязательно сохранились, так что новая подписка начинается с того, что есть в теле слот-контракта. В отличие от случая продления существующей подписки.

что насчет ресинка хранилища? (например добавляем новую ноду в сеть)

Хранилище должно находиться строго в основной базе. Тогда базовые процедуры будут ресинкать слот-контракт и его environment. Дополнительные процедуры синхронизациии добавим в следующих итерациях

может быть balance слота нужно сохранять вместе с таймстампом начала срока хранения?

В принципе можно сдеоать по разному. Например, можно баланс просто вычислять каждый раз из размера хранимого контента и текущего значения expiresAt. Это более простой способ. То есть алгоритм получается такой:

  • рассчитать текущий баланс (фактически, остаток на данный момент)

  • рассчитать новый объем хранения после выполнения операции И/ИЛИ дополнить баланс если есть оплата

  • для нового обхема хранения рассчитать expiresAt. Если он окажется в прошлом, система его штатно грохнет сама.