Reputation

Контракт репутации

Разделы

Описание проблемы

Мы используем кол-во GALT заложенных за SPACE-токен (Залог земельного участка) в качестве показателя, который определяет вес голоса Владельца земли или Арендатора земли при голосовании за Делегатов фонда, а так же при других голосованиях.

Залог от одного Земельного участка может быть распределен, как Репутация для одного или нескольких Владельцев земли и Арендаторов земли следующим образом:

  • полное или частичное владение участком;
  • полная или частичная аренда участка;

Введем термин Владелец Репутации - Участник Проекта, который обладает Репутацией путем полного или частичного владения конкретными токенами SPACE или путем полной и частичной аренды конкретных токенов SPACE.

Динамический рассчет этого параметра в каждом вызове приведет к большому потреблению газа и мы достаточно быстро не сможем вписаться в один блок на mainnet Эфира.

Цели контракта

Для решения этой проблемы, мы кешируем кол-во GALT, заложенных за Земельные участки (SPACE-токена) и называем этот показатель Репутация.

Примеры

Пример 0. Пользователь единолично владеет Земельным участком и передает его другому пользователю.

  1. Например пользователь А получил Земельный участок sezu0456 на Аукционе земли за 1000 токенов GALT. Контракт SPACEAuctionRegistry передал 1000 токенов GALT из Аукциона на землю Фонду №3, определенному Аукционом земли и начислил Пользователю А Репутацию в размере 1000 пунктов в Фонде №3.
Фонд Репутация Пользователя А Репутация Пользователя Б
Фонд 0 0 0
Фонд 1 0 0
Фонд 2 0 0
Фонд 3 1000 0
  1. Пользователь А передает Земельный участок sezu0456 Пользователю Б методом transfer() контракта SpaceToken.

  2. Токен sezu0456 переходит Пользователю Б. Репутацию Пользователей А и Б не меняется!

  3. Пользователь Б вызывает метод RevokeTokenHolderStake(), указывая в качестве аргумента sezu0456 и Фонд №1 и забирает свою Репутацию.

Фонд Репутация Пользователя А Репутация Пользователя Б
Фонд 0 0 0
Фонд 1 0 1000
Фонд 2 0 0
Фонд 3 0 0

Пример 1. Пользователь единолично владеет Земельным участком и распределяет репутацию между Фондами.

  1. Например пользователь А получил Земельный участок sezu0456 на Аукционе земли за 1000 токенов GALT. Контракт SPACEAuctionRegistry передал 1000 токенов GALT из Аукциона на землю Фонду №3, определенному Аукционом земли и начислил Пользователю А Репутацию в размере 1000 пунктов в Фонде №3.
Фонд Репутация Пользователя А
Фонд 0 0
Фонд 1 0
Фонд 2 0
Фонд 3 1000
  1. Пользователь А с помощью метода distributeStakeReputation() перераспределяет свою 1000 пунктов Репутации между тремя Фондами.
Фонд Репутация Пользователя А
Фонд 0 200
Фонд 1 500
Фонд 2 0
Фонд 3 300

Пример 2. Пользователь единолично владеет Земельным участком, сдавая часть Репутации в аренду двум другим пользователям.

  1. Пользователь А покупает SPACE-токен sezu0456 с Репутацией 1000 пунктов, выбрав Фонд №3 для первоначального размещения всей Репутации. Пользователь А владеет 100% Репутации SPACE-токена.
Фонд Репутация Пользователя A Репутация Пользователя B Репутация Пользователя C Земельный Участок
Фонд 0 0 0 0 sezu0456
Фонд 1 0 0 0 sezu0456
Фонд 2 0 0 0 sezu0456
Фонд 3 1000 0 0 sezu0456
  1. Пользователь А получает от пользователей В и C плату офф-чейн за то, что он распределит им на какое-то время соответственно 250 и 300 GALT из своей Репутации с привязкой к SPACE-токену sezu0456. Пользователи B и C доверяют пользователю А и понимают, что он в праве в любой момент отозвать у них Репутацию без какой либо компенсации.

  2. Пользователь B c помощью метода setPreferredFund устанавливает Фонд №2, как Фонд по умолчанию для распределения Репутации.

  3. Пользователь А c помощью метода getPreferredFund узнает, что пользователь B предопочитает, чтобы назначаемая ему репутация сразу была распределена в Фонд №2, а пользователь С не указал своих пожеланий по этому поводу.

  4. Пользователь А с помощью метода changeTokenHolderStake назначает пользователю B 250 GALT репутации фонд 2.

Фонд Репутация Пользователя A Репутация Пользователя B Репутация Пользователя C Земельный Участок
Фонд 0 0 0 0 sezu0456
Фонд 1 0 0 0 sezu0456
Фонд 2 0 250 0 sezu0456
Фонд 3 750 0 0 sezu0456
  1. Пользователь А с помощью метода changeTokenHolderStake назначает пользователю C 300 GALT репутации фонд 0.
Фонд Репутация Пользователя A Репутация Пользователя B Репутация Пользователя C Земельный Участок
Фонд 0 0 0 300 sezu0456
Фонд 1 0 0 0 sezu0456
Фонд 2 0 250 0 sezu0456
Фонд 3 450 0 0 sezu0456
  1. Пользоватей А и С устраивает распределение их репутации по фондам, а пользователя B нет. Он решает перенести 100 GALT репутации в фонд 3 и 50 в фонд 1, т.к. считает, что эти фонды смогут лучше использовать его Залоги. Для этого он использует метод distributeStakeReputation.
Фонд Репутация Пользователя A Репутация Пользователя B Репутация Пользователя C Земельный Участок
Фонд 0 0 0 300 sezu0456
Фонд 1 0 50 0 sezu0456
Фонд 2 0 100 0 sezu0456
Фонд 3 450 100 0 sezu0456

Пример 3. Токен SPACE передан на контракт совместной аренды.

Подробнее - см. контракт SmartSpace-Rental.

  1. SPACE-токен sezu0456 имеет Залог 1000 GALT и соответствующую Репутацию в 1000 пунктов и принадлежит контракту совместной аренды А.
  2. 200 пунктов Репутации этого SPACE-токена распределено Арендатору B, остаток контракт А распределил своему Владельцу D.
Фонд Репутация Пользователя A Репутация Пользователя B Репутация Пользователя C Репутация Пользователя D Земельный Участок
Фонд 0 0 0 0 0 sezu0456
Фонд 1 0 200 0 0 sezu0456
Фонд 2 0 0 0 0 sezu0456
Фонд 3 0 0 0 800 sezu0456
  1. В новом Периоде аренды пользователь B арендовал только 170 пунктов Репутации. Контракт Аренды должен забрать у пользователя B 30 пунктов Репутации и назначить их арендатору C. В контракте не реализована сложная логика по рассчетам, в какой Фонд сколько Репутации было распределно пользователем В. Он может лишь отозвать сразу всю Репутацию, а потом назначить ее заново.
  2. Контракт Аренды вызывает метод отзыва revokeTokenHolderStake() и вся Репутация в размере 200 пунктов от пользователя B возвращается владельцу контракта Аренды Пользователю D.
Фонд Репутация Пользователя A Репутация Пользователя B Репутация Пользователя C Репутация Пользователя D Земельный Участок
Фонд 0 0 0 0 0 sezu0456
Фонд 1 0 0 0 0 sezu0456
Фонд 2 0 0 0 0 sezu0456
Фонд 3 0 0 0 1000 sezu0456
  1. Контракт Аренды вызывает метод changeTokenHolderStake() и назначает Репутацию Пользователю B в размере 170 пунктов в Фонд, который участник B установил по умолчанию (Фонд 3) методом setPreferredFund.
Фонд Репутация Пользователя A Репутация Пользователя B Репутация Пользователя C Репутация Пользователя D Земельный Участок
Фонд 0 0 0 0 0 sezu0456
Фонд 1 0 0 0 0 sezu0456
Фонд 2 0 170 0 0 sezu0456
Фонд 3 0 0 0 830 sezu0456
  1. Контракт Аренды вызывает метод назначения changeTokenHolderStake() и назначает репутацию пользователю С в размере 30 Пунктов в Фонд, который участник С установил по умолчанию (фонд 1) методом setPreferredFund.
Фонд Репутация Пользователя A Репутация Пользователя B Репутация Пользователя C Репутация Пользователя D Земельный Участок
Фонд 0 0 0 0 0 sezu0456
Фонд 1 0 0 30 0 sezu0456
Фонд 2 0 170 0 0 sezu0456
Фонд 3 0 0 0 800 sezu0456

Пример 4. Частичное переназначение репутации с помощью прямого переноса репутации между Фондами (Владельцем токена SPACE является централизованный офф-чейн скрипт с приватным ключем):

  1. Space токен sezu0456 имеет Залог 1000 GALT и соответствующую Репутацию 1000 пунктов и принадлежит скрипту А. 200 пунктов репутации sezu0456 распределено пользователю B методом changeTokenHolderStake(), остаток Репутации остался у скрипта А. Пользователь B в свою очередь распределил свою Репутацию методом distributeStakeReputation() следующим образом по Фондам:
Фонд Репутация Пользовател А (скрипт) Репутация Пользовател B Репутация Пользовател C Земельный Участок
Фонд 0 800 40 0 sezu0456
Фонд 1 0 30 0 sezu0456
Фонд 2 0 130 0 sezu0456
Фонд 4 0 0 0 sezu0456
  1. Скрипт А хочет забрать у пользователя B 30 пунктов Репутации и назначить их пользователю C. Информация о том, в какие Фонды пользователь В распределил свою Репутацию находится в блокчейне Ethereum. Скрипт А читает ее вызовом соответствующего метода <сделать метод>.
  2. Скрипт А на свое усмотрение выбирает Фонд 0 для списания Репутации у пользователя В и вызывает метод changeTokenHolderStake() с параметрами:
    • пользователь для списания: B
    • пользователь для зачисления: C
    • фонд для списания: 0
    • фонд для зачисления: 4
    • сумма: 30 пунктов
Фонд Репутация Пользовател А (скрипт) Репутация Пользовател B Репутация Пользовател C Земельный Участок
Фонд 0 800 10 0 sezu0456
Фонд 1 0 30 0 sezu0456
Фонд 2 0 130 0 sezu0456
Фонд 4 0 0 30 sezu0456

В этому случае скрипт А может сэкономить на газе и на действиях, но обязан более детально просчитать свои действия.

Спецификация

Репутация измеряется в пунктах. Это число, которое соответcвует Залогу в токенах GALT за конкретный Земельный участок, которому соответcвует токен SPACE.

Изменение Репутации приводит к перемещению токенов GALT и Эфиров на балансах Фондов по следующей схеме:

  • при изменении Репутации Пользователя А в пользу Пользователя Б без изменения Фонда - ничего не происходит;
  • при переводе Репутации Пользователя А из Фонда №1 в Фонд №2 в размере 100 пунктов - Фонда №1 передает в Фонд №2 100 токенов GALT и Эфиры по курсу Обратного выкупа, который определяется на каждый Раунд эмиссии Аукциона Эмиссии(см - Контракт - Emission).

Мы предоставляем Владельцу Репутации методы на перераспределение его Репутации. Использовать методы перераспределения могут:

  • пользователь через специально написанный dApp + metamask (за определенный товар или услугу владелец Space токена назначает другому пользователю половину репутации своего токена на две недели), но здесь никто не гарантирует, что владелец не отзовет у тебя репутацию через день
  • офф-чейн скрипт с приватным ключем
  • контракт с любой логикой (мы предоставляем 2 дефолтных), контракт своим кодом должен гарантировать, что репутация не будет отозвана за определенный период
  • сайдчейн (например, когда у токена должно быть 10000 участников, на mainnet все вычисления производить дорого и бессмысленно, проще и дешевле произвести их в своей сети, а в mainnet-е перераспределить лишь репутацию необходимым образом)

Терминология

Смотри Глоссарий.

Константы

  • 7 - максимальное кол-во фондов, в которые участник доли может распределить свою репутацию.

Уровни кеширования Репутации

Для упрощения доступа других контрактов к данным о репутации, кеш разделен на несколько уровней детализации от L1 - самый общий до L4 - самый детальный.

L1

  • Сколько репутации имеет конкретный адрес за все токены во всех фондах.
  • Сколько репутации имеет конкретный фонд за все токена ото всех участников долей.

L2

  • Сколько репутации имеет конкретный адрес в конкретном фонде.

L3

  • Сколько репутации конкретного токена имеет конкретный участник доли.
  • Сколько репутации конкретного токена распределено в конкретный фонд.

L4

  • Сколько репутации конкретного токена распределено конкретным участником доли в конкретный фонд.

Интерфейс взаимодействия с контрактом

Mint - Выпуск репутации под Space токен

Право на выпуск Репутации принадлежит контракту SPACEAuctionRegistry. Репутация определяется по результатам конкретного Аукциона Земли по выигрывшей ставке в токенах GALT, которые передаются в Залог Фонду.

Increase - Увеличение репутации SPACE токена

Фактически это метод увеличения Залога за Земельный участок. Любой может увеличить Залог и соответствующую Репутацию токенов SPACE, пополнив Залог на любую сумму от 1 GALT и указав Фонд и адрес Пользователя, на которые она будет распределена, а так же id токена SPACE.

Fine - Списание репутации SPACE токена.

Право на списание Залога SPACE токена и соответствующей Репутации принадлежит только контракту ReputationFine.

ChangeTokenHolderStake - Изменение распределения репутации SPACE токена между Владельцами репутации и Фондами.

Право на изменение Репутации SPACE токена принадлежит владельцу SPACE токена.

Владелец SPACE токена имеет безусловные права перераспределять Репутацию между Владельцами репутации / Фондами.

RevokeTokenHolderStake - Отзыв всей репутации конкретного Владельцами репутации.

Право на отзыв принадлежит владельцу SPACE токена. Владелец SPACE токена может одной транзакцией в свою пользу отозвать Репутацию из всех Фондов конкретного Владельца репутации. Информация о Фондах, в которые Владелец репутации распределит свою Репутацию хранится в блокчейне.

DistributeStakeReputation - Изменение распределения репутации Владельца репутации между Фондами.

Право на изменения Репутации принадлежит Владельцу репутации.

Владелец репутации может перераспределить свою Репутацию между любыми Фондами (макс. до 7 фондов).

PreferredFund - Установить и получить Фонд по умолчанию.

Любой адрес может установить Фонд, куда он хотел бы, чтобы переводилась Репутация по умолчанию. Эту информацию могут использовать владельцы SPACE токенов при принятии решений, к какому Фонду привязывать начисляемую Репутацию.

Кеш репутации по уровням L1, L2, L3, L4

Информация публичная.

Любой адрес может получить информацию о Репутации по всем уровням.

Прочее

  • При смене владельца Space токена репутация не меняется. Новому владельцу необходимо самостоятельно перераспределить репутацию в соотвествии со своими пожеланиями.
  • Любой перевод репутации между фондами так же включает перевод между этими фондами ETH, заложенных за переводимую репутацию. Курс GALT/ETH предоставляется контрактом Emission.

Технические аспекты

TypeScript

  • В боте остается 2 вида репутации - локальная и глобальная. Пределываение на одну глобальную займет времени, но ни на логику ни на интерфейс положительно не повлияет.

Вопросы

  • Может ли пользователь добровольно уменьшить репутацию своего токена и [получить обратно/сжечь] часть репутации?
  • Определить минимальное кол-во GALT для перераспределения.
  • Как изменяется репутация при split/merge?

results matching ""

    No results matching ""